Merge pull request #255 from johannesmoene/fix-python-print

Fix python print
diff --git a/.gitignore b/.gitignore
index 569f38d..fb5f1be 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,10 +15,7 @@
 projects/VS2010/TestCatch/TestCatch/TestCatch.vcxproj.filters
 projects/VisualStudio/TestCatch/UpgradeLog.XML
 UpgradeLog.XML
-projects/XCode4/iOSTest/Build/Intermediates/PrecompiledHeaders
-projects/XCode4/iOSTest/Build/Products/Debug-iphonesimulator/iOSTest.app.dSYM/Contents/Resources/DWARF
-projects/XCode4/iOSTest/Build
-projects/XCode4/CatchSelfTest/DerivedData
-projects/XCode4/OCTest/DerivedData
+Resources/DWARF
+projects/XCode/iOSTest/Build
 *.pyc
-projects/XCode4/iOSTest/DerivedData
+DerivedData
diff --git a/README.md b/README.md
index d12d676..3916e0a 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,10 @@
 ![catch logo](catch-logo-small.png)
 
-*v1.0 build 30 (master branch)*
+*v1.0 build 39 (master branch)*
 
 Build status (on Travis CI) [![Build Status](https://travis-ci.org/philsquared/Catch.png)](https://travis-ci.org/philsquared/Catch)
 
-# New release with significant changes
-
-[Please see this page for details - including some breaking changes](docs/whats-changed.md)
+[Please see this page if you are updating from a version before 1.0](docs/whats-changed.md)
 
 ## What's the Catch?
 
diff --git a/docs/build-systems.md b/docs/build-systems.md
index a0aed10..1cb93c8 100644
--- a/docs/build-systems.md
+++ b/docs/build-systems.md
@@ -8,6 +8,7 @@
 cmake_minimum_required(VERSION 2.8.8)
 project(catch_builder CXX)
 include(ExternalProject)
+find_package(Git REQUIRED)
 
 ExternalProject_Add(
     catch
@@ -33,4 +34,4 @@
 add_subdirectory(${EXT_PROJECTS_DIR}/catch)
 include_directories(${CATCH_INCLUDE_DIR} ${COMMON_INCLUDES})
 enable_testing(true)  # Enables unit-testing.
-```
\ No newline at end of file
+```
diff --git a/docs/command-line.md b/docs/command-line.md
index 915286c..af0c538 100644
--- a/docs/command-line.md
+++ b/docs/command-line.md
@@ -126,6 +126,8 @@
 
 These can be a nuisance in certain debugging environments that may break when exceptions are thrown (while this is usually optional for handled exceptions, it can be useful to have enabled if you are trying to track down something unexpected).
 
+Sometimes exceptions are expected outside of one of the assertions that tests for them (perhaps thrown and caught within the code-under-test). The whole test case can be skipped when using ```-e``` by marking it with the ```[!throws]``` tag.
+
 When running with this option any throw checking assertions are skipped so as not to contribute additional noise. Be careful if this affects the behaviour of subsequent tests.
 
 <a id="warnings"></a>
diff --git a/docs/whats-changed.md b/docs/whats-changed.md
index 750fe41..40b95a6 100644
--- a/docs/whats-changed.md
+++ b/docs/whats-changed.md
@@ -1,6 +1,6 @@
-## What's new in Catch
+## What's new in Catch for 1.0
 
-This page has been added following quite a large (hopefully the last such) merge from the integration branch. Please read this summary through so you know what to expect (and whether any changes - breaking in some cases - will affect you).
+After a long "developer preview" state Catch turned 1.0 in mid-2013. Just prior to this a large number of changes, some of them breaking, where merged from the integration branch and now form part of the 1.0 code-base. If this might affect you please read this summary through so you know what to expect.
 
 * Calling Catch from your own ```main()``` has changed - please review [the updated docs](own-main.md)
 * The command line has changed. The biggest change is that test case names and tags should now only be supplied as primary arguments - in fact the ```-t``` option has been repurposed to mean "list tags". There are [updated docs for this too](command-line.md)
diff --git a/include/catch.hpp b/include/catch.hpp
index cb8a19c..91d392b 100644
--- a/include/catch.hpp
+++ b/include/catch.hpp
@@ -19,6 +19,9 @@
 
 #ifdef CATCH_CONFIG_MAIN
 #  define CATCH_CONFIG_RUNNER
+#endif
+
+#ifdef CATCH_CONFIG_RUNNER
 #  ifndef CLARA_CONFIG_MAIN
 #    define CLARA_CONFIG_MAIN_NOT_DEFINED
 #    define CLARA_CONFIG_MAIN
diff --git a/include/catch_runner.hpp b/include/catch_runner.hpp
index 57e5aa9..98f160a 100644
--- a/include/catch_runner.hpp
+++ b/include/catch_runner.hpp
@@ -50,29 +50,29 @@
             }
             return totals;
         }
-
-        Totals runTestsForGroup( RunContext& context, const TestCaseFilters& filterGroup ) {
+        Totals runTestsForGroup( RunContext& context, TestCaseFilters const& filterGroup ) {
             Totals totals;
-            std::vector<TestCase>::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin();
-            std::vector<TestCase>::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end();
+
+            std::vector<TestCase> testCases;
+            getRegistryHub().getTestCaseRegistry().getFilteredTests( filterGroup, *m_config, testCases );
+
             int testsRunForGroup = 0;
-            for(; it != itEnd; ++it ) {
-                if( filterGroup.shouldInclude( *it ) ) {
-                    testsRunForGroup++;
-                    if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) {
+            for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end();
+                    it != itEnd;
+                    ++it ) {
+                testsRunForGroup++;
+                if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) {
 
-                        if( context.aborting() )
-                            break;
+                    if( context.aborting() )
+                        break;
 
-                        totals += context.runTest( *it );
-                        m_testsAlreadyRun.insert( *it );
-                    }
+                    totals += context.runTest( *it );
+                    m_testsAlreadyRun.insert( *it );
                 }
             }
             if( testsRunForGroup == 0 && !filterGroup.getName().empty() )
                 m_reporter->noMatchingTestCases( filterGroup.getName() );
             return totals;
-
         }
 
     private:
@@ -132,7 +132,7 @@
             std::cout << "\nCatch v"    << libraryVersion.majorVersion << "."
                                         << libraryVersion.minorVersion << " build "
                                         << libraryVersion.buildNumber;
-            if( libraryVersion.branchName != "master" )
+            if( libraryVersion.branchName != std::string( "master" ) )
                 std::cout << " (" << libraryVersion.branchName << " branch)";
             std::cout << "\n";
 
diff --git a/include/internal/clara.h b/include/external/clara.h
similarity index 79%
rename from include/internal/clara.h
rename to include/external/clara.h
index a8b5057..d8e83ac 100644
--- a/include/internal/clara.h
+++ b/include/external/clara.h
@@ -251,6 +251,10 @@
         template<typename ConfigT>
         struct IArgFunction {
             virtual ~IArgFunction() {}
+#  ifdef CATCH_CPP11_OR_GREATER
+            IArgFunction()                      = default;
+            IArgFunction( IArgFunction const& ) = default;
+#  endif
             virtual void set( ConfigT& config, std::string const& value ) const = 0;
             virtual void setFlag( ConfigT& config ) const = 0;
             virtual bool takesArg() const = 0;
@@ -278,6 +282,10 @@
                 functionObj->setFlag( config );
             }
             bool takesArg() const { return functionObj->takesArg(); }
+
+            bool isSet() const {
+                return functionObj != NULL;
+            }
         private:
             IArgFunction<ConfigT>* functionObj;
         };
@@ -373,26 +381,6 @@
             void (*function)( C&, T );
         };
 
-        template<typename C, typename M>
-        BoundArgFunction<C> makeBoundField( M C::* _member ) {
-            return BoundArgFunction<C>( new BoundDataMember<C,M>( _member ) );
-        }
-        template<typename C, typename M>
-        BoundArgFunction<C> makeBoundField( void (C::*_member)( M ) ) {
-            return BoundArgFunction<C>( new BoundUnaryMethod<C,M>( _member ) );
-        }
-        template<typename C>
-        BoundArgFunction<C> makeBoundField( void (C::*_member)() ) {
-            return BoundArgFunction<C>( new BoundNullaryMethod<C>( _member ) );
-        }
-        template<typename C>
-        BoundArgFunction<C> makeBoundField( void (*_function)( C& ) ) {
-            return BoundArgFunction<C>( new BoundUnaryFunction<C>( _function ) );
-        }
-        template<typename C, typename T>
-        BoundArgFunction<C> makeBoundField( void (*_function)( C&, T ) ) {
-            return BoundArgFunction<C>( new BoundBinaryFunction<C, T>( _function ) );
-        }
     } // namespace Detail
 
     struct Parser {
@@ -440,33 +428,52 @@
     };
 
     template<typename ConfigT>
+    struct CommonArgProperties {
+        CommonArgProperties() {}
+        CommonArgProperties( Detail::BoundArgFunction<ConfigT> const& _boundField ) : boundField( _boundField ) {}
+
+        Detail::BoundArgFunction<ConfigT> boundField;
+        std::string description;
+        std::string detail;
+        std::string placeholder; // Only value if boundField takes an arg
+
+        bool takesArg() const {
+            return !placeholder.empty();
+        }
+        void validate() const {
+            if( !boundField.isSet() )
+                throw std::logic_error( "option not bound" );
+        }
+    };
+    struct OptionArgProperties {
+        std::vector<std::string> shortNames;
+        std::string longName;
+
+        bool hasShortName( std::string const& shortName ) const {
+            return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end();
+        }
+        bool hasLongName( std::string const& _longName ) const {
+            return _longName == longName;
+        }
+    };
+    struct PositionalArgProperties {
+        PositionalArgProperties() : position( -1 ) {}
+        int position; // -1 means non-positional (floating)
+
+        bool isFixedPositional() const {
+            return position != -1;
+        }
+    };
+
+    template<typename ConfigT>
     class CommandLine {
 
-        struct Arg {
-            Arg() : position( -1 ) {}
-            Arg( Detail::BoundArgFunction<ConfigT> const& _boundField ) : boundField( _boundField ), position( -1 ) {}
+        struct Arg : CommonArgProperties<ConfigT>, OptionArgProperties, PositionalArgProperties {
+            Arg() {}
+            Arg( Detail::BoundArgFunction<ConfigT> const& _boundField ) : CommonArgProperties<ConfigT>( _boundField ) {}
 
-            bool hasShortName( std::string const& shortName ) const {
-                for(    std::vector<std::string>::const_iterator
-                            it = shortNames.begin(), itEnd = shortNames.end();
-                        it != itEnd;
-                        ++it )
-                    if( *it == shortName )
-                        return true;
-                return false;
-            }
-            bool hasLongName( std::string const& _longName ) const {
-                return _longName == longName;
-            }
-            bool takesArg() const {
-                return !placeholder.empty();
-            }
-            bool isFixedPositional() const {
-                return position != -1;
-            }
-            bool isAnyPositional() const {
-                return position == -1 && shortNames.empty() && longName.empty();
-            }
+            using CommonArgProperties<ConfigT>::placeholder; // !TBD
+
             std::string dbgName() const {
                 if( !longName.empty() )
                     return "--" + longName;
@@ -474,10 +481,6 @@
                     return "-" + shortNames[0];
                 return "positional args";
             }
-            void validate() const {
-                if( boundField.takesArg() && !takesArg() )
-                    throw std::logic_error( "command line argument '" + dbgName() + "' must specify a placeholder" );
-            }
             std::string commands() const {
                 std::ostringstream oss;
                 bool first = true;
@@ -498,13 +501,6 @@
                     oss << " <" << placeholder << ">";
                 return oss.str();
             }
-
-            Detail::BoundArgFunction<ConfigT> boundField;
-            std::vector<std::string> shortNames;
-            std::string longName;
-            std::string description;
-            std::string placeholder;
-            int position;
         };
 
         // NOTE: std::auto_ptr is deprecated in c++11/c++0x
@@ -514,95 +510,97 @@
         typedef std::auto_ptr<Arg> ArgAutoPtr;
 #endif
 
+        friend void addOptName( Arg& arg, std::string const& optName )
+        {
+            if( optName.empty() )
+                return;
+            if( Detail::startsWith( optName, "--" ) ) {
+                if( !arg.longName.empty() )
+                    throw std::logic_error( "Only one long opt may be specified. '"
+                        + arg.longName
+                        + "' already specified, now attempting to add '"
+                        + optName + "'" );
+                arg.longName = optName.substr( 2 );
+            }
+            else if( Detail::startsWith( optName, "-" ) )
+                arg.shortNames.push_back( optName.substr( 1 ) );
+            else
+                throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" );
+        }
+        friend void setPositionalArg( Arg& arg, int position )
+        {
+            arg.position = position;
+        }
+
+
         class ArgBuilder {
         public:
-            ArgBuilder( CommandLine* cl )
-            :   m_cl( cl )
-            {}
+            ArgBuilder( Arg* arg ) : m_arg( arg ) {}
 
-
-            ArgBuilder( ArgBuilder& other )
-            :   m_cl( other.m_cl ),
-                m_arg( other.m_arg )
-            {
-                other.m_cl = NULL;
+            // Bind a non-boolean data member (requires placeholder string)
+            template<typename C, typename M>
+            void bind( M C::* field, std::string const& placeholder ) {
+                m_arg->boundField = new Detail::BoundDataMember<C,M>( field );
+                m_arg->placeholder = placeholder;
             }
-            // !TBD: Need to include workarounds to be able to declare this
-            // destructor as able to throw exceptions
-            ~ArgBuilder() /* noexcept(false) */ {
-                if( m_cl && !std::uncaught_exception() ) {
-                    m_arg.validate();
-                    if( m_arg.isFixedPositional() ) {
-                        m_cl->m_positionalArgs.insert( std::make_pair( m_arg.position, m_arg ) );
-                        if( m_arg.position > m_cl->m_highestSpecifiedArgPosition )
-                            m_cl->m_highestSpecifiedArgPosition = m_arg.position;
-                    }
-                    else if( m_arg.isAnyPositional() ) {
-                        if( m_cl->m_arg.get() )
-                            throw std::logic_error( "Only one unpositional argument can be added" );
-                        m_cl->m_arg = ArgAutoPtr( new Arg( m_arg ) );
-                    }
-                    else
-                        m_cl->m_options.push_back( m_arg );
-                }
+            // Bind a boolean data member (no placeholder required)
+            template<typename C>
+            void bind( bool C::* field ) {
+                m_arg->boundField = new Detail::BoundDataMember<C,bool>( field );
             }
 
-            template<typename F>
-            void into( F f )
-            {
-                m_arg.boundField = Detail::makeBoundField( f );
+            // Bind a method taking a single, non-boolean argument (requires a placeholder string)
+            template<typename C, typename M>
+            void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) {
+                m_arg->boundField = new Detail::BoundUnaryMethod<C,M>( unaryMethod );
+                m_arg->placeholder = placeholder;
             }
 
-            friend void addOptName( ArgBuilder& builder, std::string const& optName )
-            {
-                if( optName.empty() )
-                    return;
-                if( Detail::startsWith( optName, "--" ) ) {
-                    if( !builder.m_arg.longName.empty() )
-                        throw std::logic_error( "Only one long opt may be specified. '"
-                            + builder.m_arg.longName
-                            + "' already specified, now attempting to add '"
-                            + optName + "'" );
-                    builder.m_arg.longName = optName.substr( 2 );
-                }
-                else if( Detail::startsWith( optName, "-" ) )
-                    builder.m_arg.shortNames.push_back( optName.substr( 1 ) );
-                else
-                    throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" );
-            }
-            friend void setPositionalArg( ArgBuilder& builder, int position )
-            {
-                builder.m_arg.position = position;
+            // Bind a method taking a single, boolean argument (no placeholder string required)
+            template<typename C>
+            void bind( void (C::* unaryMethod)( bool ) ) {
+                m_arg->boundField = new Detail::BoundUnaryMethod<C,bool>( unaryMethod );
             }
 
+            // Bind a method that takes no arguments (will be called if opt is present)
+            template<typename C>
+            void bind( void (C::* nullaryMethod)() ) {
+                m_arg->boundField = new Detail::BoundNullaryMethod<C>( nullaryMethod );
+            }
 
-            // Can only supply placeholder after [str] - if it takes an arg
-            ArgBuilder& placeholder( std::string const& placeholder ) {
-                m_arg.placeholder = placeholder;
-                return *this;
+            // Bind a free function taking a single argument - the object to operate on (no placeholder string required)
+            template<typename C>
+            void bind( void (* unaryFunction)( C& ) ) {
+                m_arg->boundField = new Detail::BoundUnaryFunction<C>( unaryFunction );
+            }
+
+            // Bind a free function taking a single argument - the object to operate on (requires a placeholder string)
+            template<typename C, typename T>
+            void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) {
+                m_arg->boundField = new Detail::BoundBinaryFunction<C, T>( binaryFunction );
+                m_arg->placeholder = placeholder;
             }
 
             ArgBuilder& describe( std::string const& description ) {
-                m_arg.description = description;
+                m_arg->description = description;
                 return *this;
             }
-            ArgBuilder& detail( std::string const& ) {
-//                m_arg.description = description;
-// !TBD
+            ArgBuilder& detail( std::string const& detail ) {
+                m_arg->detail = detail;
                 return *this;
             }
 
-        private:
-            CommandLine* m_cl;
-            Arg m_arg;
+        protected:
+            Arg* m_arg;
         };
+
         class OptBuilder : public ArgBuilder {
         public:
-            OptBuilder( CommandLine* cl ) : ArgBuilder( cl ) {}
+            OptBuilder( Arg* arg ) : ArgBuilder( arg ) {}
             OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {}
 
             OptBuilder& operator[]( std::string const& optName ) {
-                addOptName( *this, optName );
+                addOptName( *ArgBuilder::m_arg, optName );
                 return *this;
             }
         };
@@ -621,8 +619,8 @@
             m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ),
             m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens )
         {
-            if( other.m_arg.get() )
-                m_arg = ArgAutoPtr( new Arg( *other.m_arg ) );
+            if( other.m_floatingArg.get() )
+                m_floatingArg = ArgAutoPtr( new Arg( *other.m_floatingArg ) );
         }
 
         CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) {
@@ -632,26 +630,37 @@
 
 
         OptBuilder operator[]( std::string const& optName ) {
-            OptBuilder builder( this );
-            addOptName( builder, optName );
+            m_options.push_back( Arg() );
+            addOptName( m_options.back(), optName );
+            OptBuilder builder( &m_options.back() );
             return builder;
         }
 
         ArgBuilder operator[]( int position ) {
-            ArgBuilder builder( this );
-            setPositionalArg( builder, position );
+            m_positionalArgs.insert( std::make_pair( position, Arg() ) );
+            if( position > m_highestSpecifiedArgPosition )
+                m_highestSpecifiedArgPosition = position;
+            setPositionalArg( m_positionalArgs[position], position );
+            ArgBuilder builder( &m_positionalArgs[position] );
             return builder;
         }
 
         // Invoke this with the _ instance
         ArgBuilder operator[]( UnpositionalTag ) {
-            ArgBuilder builder( this );
+            if( m_floatingArg.get() )
+                throw std::logic_error( "Only one unpositional argument can be added" );
+            m_floatingArg = ArgAutoPtr( new Arg() );
+            ArgBuilder builder( m_floatingArg.get() );
             return builder;
         }
 
-        template<typename F>
-        void bindProcessName( F f ) {
-            m_boundProcessName = Detail::makeBoundField( f );
+        template<typename C, typename M>
+        void bindProcessName( M C::* field ) {
+            m_boundProcessName = new Detail::BoundDataMember<C,M>( field );
+        }
+        template<typename C, typename M>
+        void bindProcessName( void (C::*_unaryMethod)( M ) ) {
+            m_boundProcessName = new Detail::BoundUnaryMethod<C,M>( _unaryMethod );
         }
 
         void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const {
@@ -664,9 +673,8 @@
                 Detail::Text usage( it->commands(), Detail::TextAttributes()
                                                         .setWidth( maxWidth+indent )
                                                         .setIndent( indent ) );
-                // !TBD handle longer usage strings
                 Detail::Text desc( it->description, Detail::TextAttributes()
-                                                        .setWidth( width - maxWidth -3 ) );
+                                                        .setWidth( width - maxWidth - 3 ) );
 
                 for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) {
                     std::string usageCol = i < usage.size() ? usage[i] : "";
@@ -692,16 +700,16 @@
                 typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( i );
                 if( it != m_positionalArgs.end() )
                     os << "<" << it->second.placeholder << ">";
-                else if( m_arg.get() )
-                    os << "<" << m_arg->placeholder << ">";
+                else if( m_floatingArg.get() )
+                    os << "<" << m_floatingArg->placeholder << ">";
                 else
                     throw std::logic_error( "non consecutive positional arguments with no floating args" );
             }
             // !TBD No indication of mandatory args
-            if( m_arg.get() ) {
+            if( m_floatingArg.get() ) {
                 if( m_highestSpecifiedArgPosition > 1 )
                     os << " ";
-                os << "[<" << m_arg->placeholder << "> ...]";
+                os << "[<" << m_floatingArg->placeholder << "> ...]";
             }
         }
         std::string argSynopsis() const {
@@ -711,6 +719,7 @@
         }
 
         void usage( std::ostream& os, std::string const& procName ) const {
+            validate();
             os << "usage:\n  " << procName << " ";
             argSynopsis( os );
             if( !m_options.empty() ) {
@@ -725,7 +734,7 @@
             return oss.str();
         }
 
-        ConfigT parseInto( int argc, char const * const * argv ) const {
+        ConfigT parse( int argc, char const * const * argv ) const {
             ConfigT config;
             parseInto( argc, argv, config );
             return config;
@@ -744,9 +753,7 @@
         }
 
         std::vector<Parser::Token> populate( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
-            if( m_options.empty() && m_positionalArgs.empty() )
-                throw std::logic_error( "No options or arguments specified" );
-
+            validate();
             std::vector<Parser::Token> unusedTokens = populateOptions( tokens, config );
             unusedTokens = populateFixedArgs( unusedTokens, config );
             unusedTokens = populateFloatingArgs( unusedTokens, config );
@@ -817,24 +824,35 @@
             return unusedTokens;
         }
         std::vector<Parser::Token> populateFloatingArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
-            if( !m_arg.get() )
+            if( !m_floatingArg.get() )
                 return tokens;
             std::vector<Parser::Token> unusedTokens;
             for( std::size_t i = 0; i < tokens.size(); ++i ) {
                 Parser::Token const& token = tokens[i];
                 if( token.type == Parser::Token::Positional )
-                    m_arg->boundField.set( config, token.data );
+                    m_floatingArg->boundField.set( config, token.data );
                 else
                     unusedTokens.push_back( token );
             }
             return unusedTokens;
         }
 
+        void validate() const
+        {
+            if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() )
+                throw std::logic_error( "No options or arguments specified" );
+
+            for( typename std::vector<Arg>::const_iterator  it = m_options.begin(),
+                                                            itEnd = m_options.end();
+                    it != itEnd; ++it )
+                it->validate();
+        }
+
     private:
         Detail::BoundArgFunction<ConfigT> m_boundProcessName;
         std::vector<Arg> m_options;
         std::map<int, Arg> m_positionalArgs;
-        ArgAutoPtr m_arg;
+        ArgAutoPtr m_floatingArg;
         int m_highestSpecifiedArgPosition;
         bool m_throwOnUnrecognisedTokens;
     };
diff --git a/include/internal/tbc_text_format.h b/include/external/tbc_text_format.h
similarity index 100%
rename from include/internal/tbc_text_format.h
rename to include/external/tbc_text_format.h
diff --git a/include/internal/catch_assertionresult.h b/include/internal/catch_assertionresult.h
index 7cfe4d8..adcc021 100644
--- a/include/internal/catch_assertionresult.h
+++ b/include/internal/catch_assertionresult.h
@@ -41,6 +41,12 @@
         AssertionResult();
         AssertionResult( AssertionInfo const& info, AssertionResultData const& data );
         ~AssertionResult();
+#  ifdef CATCH_CPP11_OR_GREATER
+         AssertionResult( AssertionResult const& )              = default;
+         AssertionResult( AssertionResult && )                  = default;
+         AssertionResult& operator = ( AssertionResult const& ) = default;
+         AssertionResult& operator = ( AssertionResult && )     = default;
+#  endif
 
         bool isOk() const;
         bool succeeded() const;
diff --git a/include/internal/catch_capture.hpp b/include/internal/catch_capture.hpp
index 5055cdd..4dda29d 100644
--- a/include/internal/catch_capture.hpp
+++ b/include/internal/catch_capture.hpp
@@ -61,12 +61,10 @@
 
 } // end namespace Catch
 
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_ASSERTIONINFO_NAME INTERNAL_CATCH_UNIQUE_NAME( __assertionInfo )
 
 ///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_ACCEPT_EXPR( evaluatedExpr, resultDisposition, originalExpr ) \
-    if( Catch::ResultAction::Value internal_catch_action = Catch::getResultCapture().acceptExpression( evaluatedExpr, INTERNAL_CATCH_ASSERTIONINFO_NAME )  ) { \
+    if( Catch::ResultAction::Value internal_catch_action = Catch::getResultCapture().acceptExpression( evaluatedExpr, __assertionInfo )  ) { \
         if( internal_catch_action & Catch::ResultAction::Debug ) CATCH_BREAK_INTO_DEBUGGER(); \
         if( internal_catch_action & Catch::ResultAction::Abort ) throw Catch::TestFailureException(); \
         if( !Catch::shouldContinueOnFailure( resultDisposition ) ) throw Catch::TestFailureException(); \
@@ -74,20 +72,16 @@
     }
 
 ///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_ACCEPT_INFO( expr, macroName, resultDisposition ) \
-    Catch::AssertionInfo INTERNAL_CATCH_ASSERTIONINFO_NAME( macroName, CATCH_INTERNAL_LINEINFO, expr, resultDisposition );
-
-///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \
     do { \
-        INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+        Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
         try { \
             INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionDecomposer()->*expr ).endExpression( resultDisposition ), resultDisposition, expr ); \
         } catch( Catch::TestFailureException& ) { \
             throw; \
         } catch( ... ) { \
             INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException(), \
-                resultDisposition | Catch::ResultDisposition::ContinueOnFailure, expr ); \
+                Catch::ResultDisposition::Normal, expr ); \
         } \
     } while( Catch::isTrue( false ) )
 
@@ -104,7 +98,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \
     do { \
-        INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+        Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
         try { \
             expr; \
             INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::Ok ), resultDisposition, false ); \
@@ -132,14 +126,14 @@
 ///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_THROWS( expr, exceptionType, resultDisposition, macroName ) \
     do { \
-        INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+        Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
         INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \
     } while( Catch::isTrue( false ) )
 
 ///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \
     do { \
-        INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+        Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
         INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \
         catch( ... ) { \
             INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException() ), \
@@ -152,13 +146,13 @@
 #ifdef CATCH_CONFIG_VARIADIC_MACROS
     #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \
         do { \
-            INTERNAL_CATCH_ACCEPT_INFO( "", macroName, resultDisposition ); \
+            Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \
             INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( messageType ) << __VA_ARGS__ +::Catch::StreamEndStop(), resultDisposition, true ) \
         } while( Catch::isTrue( false ) )
 #else
     #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \
         do { \
-            INTERNAL_CATCH_ACCEPT_INFO( "", macroName, resultDisposition ); \
+            Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \
             INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( messageType ) << log, resultDisposition, true ) \
         } while( Catch::isTrue( false ) )
 #endif
@@ -171,7 +165,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \
     do { \
-        INTERNAL_CATCH_ACCEPT_INFO( #arg " " #matcher, macroName, resultDisposition ); \
+        Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, #arg " " #matcher, resultDisposition ); \
         try { \
             INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::expressionResultBuilderFromMatcher( ::Catch::Matchers::matcher, arg, #matcher ) ), resultDisposition, false ); \
         } catch( Catch::TestFailureException& ) { \
diff --git a/include/internal/catch_clara.h b/include/internal/catch_clara.h
index e1f0c25..bfe2f4b 100644
--- a/include/internal/catch_clara.h
+++ b/include/internal/catch_clara.h
@@ -19,7 +19,7 @@
 
 // Declare Clara inside the Catch namespace
 #define STITCH_CLARA_OPEN_NAMESPACE namespace Catch {
-#include "clara.h"
+#include "../external/clara.h"
 #undef STITCH_CLARA_OPEN_NAMESPACE
 
 
diff --git a/include/internal/catch_commandline.hpp b/include/internal/catch_commandline.hpp
index 126c861..85a0cab 100644
--- a/include/internal/catch_commandline.hpp
+++ b/include/internal/catch_commandline.hpp
@@ -62,57 +62,52 @@
 
         cli["-?"]["-h"]["--help"]
             .describe( "display usage information" )
-            .into( &ConfigData::showHelp );
+            .bind( &ConfigData::showHelp );
 
         cli["-l"]["--list-tests"]
             .describe( "list all/matching test cases" )
-            .into( &ConfigData::listTests );
+            .bind( &ConfigData::listTests );
 
         cli["-t"]["--list-tags"]
             .describe( "list all/matching tags" )
-            .into( &ConfigData::listTags );
+            .bind( &ConfigData::listTags );
 
         cli["-s"]["--success"]
             .describe( "include successful tests in output" )
-            .into( &ConfigData::showSuccessfulTests );
+            .bind( &ConfigData::showSuccessfulTests );
 
         cli["-b"]["--break"]
             .describe( "break into debugger on failure" )
-            .into( &ConfigData::shouldDebugBreak );
+            .bind( &ConfigData::shouldDebugBreak );
 
         cli["-e"]["--nothrow"]
             .describe( "skip exception tests" )
-            .into( &ConfigData::noThrow );
+            .bind( &ConfigData::noThrow );
 
         cli["-o"]["--out"]
-            .placeholder( "filename" )
             .describe( "output filename" )
-            .into( &ConfigData::outputFilename );
+            .bind( &ConfigData::outputFilename, "filename" );
 
         cli["-r"]["--reporter"]
 //            .placeholder( "name[:filename]" )
-            .placeholder( "name" )
             .describe( "reporter to use (defaults to console)" )
-            .into( &ConfigData::reporterName );
+            .bind( &ConfigData::reporterName, "name" );
 
         cli["-n"]["--name"]
-            .placeholder( "name" )
             .describe( "suite name" )
-            .into( &ConfigData::name );
+            .bind( &ConfigData::name, "name" );
 
         cli["-a"]["--abort"]
             .describe( "abort at first failure" )
-            .into( &abortAfterFirst );
+            .bind( &abortAfterFirst );
 
         cli["-x"]["--abortx"]
-            .placeholder( "number of failures" )
             .describe( "abort after x failures" )
-            .into( &abortAfterX );
+            .bind( &abortAfterX, "no. failures" );
 
         cli["-w"]["--warn"]
-            .placeholder( "warning name" )
             .describe( "enable warnings" )
-            .into( &addWarning );
+            .bind( &addWarning, "warning name" );
 
 // - needs updating if reinstated
 //        cli.into( &setVerbosity )
@@ -122,28 +117,25 @@
 //            .placeholder( "level" );
 
         cli[_]
-            .placeholder( "test name, pattern or tags" )
             .describe( "which test or tests to use" )
-            .into( &addTestOrTags );
+            .bind( &addTestOrTags, "test name, pattern or tags" );
 
         cli["-d"]["--durations"]
-            .placeholder( "yes/no" )
             .describe( "show test durations" )
-            .into( &setShowDurations );
+            .bind( &setShowDurations, "yes/no" );
 
         cli["-f"]["--input-file"]
-            .placeholder( "filename" )
             .describe( "load test names to run from a file" )
-            .into( &loadTestNamesFromFile );
+            .bind( &loadTestNamesFromFile, "filename" );
 
         // Less common commands which don't have a short form
         cli["--list-test-names-only"]
             .describe( "list all/matching test cases names only" )
-            .into( &ConfigData::listTestNamesOnly );
+            .bind( &ConfigData::listTestNamesOnly );
 
         cli["--list-reporters"]
             .describe( "list all reporters" )
-            .into( &ConfigData::listReporters );
+            .bind( &ConfigData::listReporters );
 
         return cli;
     }
diff --git a/include/internal/catch_common.h b/include/internal/catch_common.h
index a823bd6..7fb88ae 100644
--- a/include/internal/catch_common.h
+++ b/include/internal/catch_common.h
@@ -78,6 +78,11 @@
         SourceLineInfo();
         SourceLineInfo( char const* _file, std::size_t _line );
         SourceLineInfo( SourceLineInfo const& other );
+#  ifdef CATCH_CPP11_OR_GREATER
+        SourceLineInfo( SourceLineInfo && )                  = default;
+        SourceLineInfo& operator = ( SourceLineInfo const& ) = default;
+        SourceLineInfo& operator = ( SourceLineInfo && )     = default;
+#  endif
         bool empty() const;
         bool operator == ( SourceLineInfo const& other ) const;
 
diff --git a/include/internal/catch_compiler_capabilities.h b/include/internal/catch_compiler_capabilities.h
index 6b8b89b..0baa2b5 100644
--- a/include/internal/catch_compiler_capabilities.h
+++ b/include/internal/catch_compiler_capabilities.h
@@ -96,5 +96,28 @@
 
 #endif
 
+////////////////////////////////////////////////////////////////////////////////
+// C++ language feature support
+
+// detect language version:
+#if (__cplusplus == 201103L)
+#  define CATCH_CPP11
+#  define CATCH_CPP11_OR_GREATER
+#elif (__cplusplus >= 201103L)
+#  define CATCH_CPP11_OR_GREATER
+#endif
+
+// noexcept support:
+#ifdef CATCH_CPP11_OR_GREATER
+#  if (__has_feature(cxx_noexcept))
+#    define CATCH_NOEXCEPT noexcept
+#    define CATCH_NOEXCEPT_IS(x) noexcept(x)
+#  endif
+#endif
+#ifndef CATCH_NO_EXCEPT
+#  define CATCH_NOEXCEPT throw()
+#  define CATCH_NOEXCEPT_IS(x)
+#endif
+
 #endif // TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
 
diff --git a/include/internal/catch_console_colour.hpp b/include/internal/catch_console_colour.hpp
index 3fc2e38..3ea8178 100644
--- a/include/internal/catch_console_colour.hpp
+++ b/include/internal/catch_console_colour.hpp
@@ -58,7 +58,7 @@
         static void use( Code _colourCode );
 
     private:
-        static Detail::IColourImpl* impl;
+        static Detail::IColourImpl* impl();
     };
 
 } // end namespace Catch
diff --git a/include/internal/catch_console_colour_impl.hpp b/include/internal/catch_console_colour_impl.hpp
index b20762f..c159dc9 100644
--- a/include/internal/catch_console_colour_impl.hpp
+++ b/include/internal/catch_console_colour_impl.hpp
@@ -73,7 +73,10 @@
         return true;
     }
 
-    Win32ColourImpl platformColourImpl;
+    static Detail::IColourImpl* platformColourInstance() {
+        static Win32ColourImpl s_instance;
+        return &s_instance;
+    }
 
 } // end anon namespace
 } // end namespace Catch
@@ -120,7 +123,10 @@
         return isatty(STDOUT_FILENO);
     }
 
-    PosixColourImpl platformColourImpl;
+    static Detail::IColourImpl* platformColourInstance() {
+        static PosixColourImpl s_instance;
+        return &s_instance;
+    }
 
 } // end anon namespace
 } // end namespace Catch
@@ -132,21 +138,28 @@
     namespace {
         struct NoColourImpl : Detail::IColourImpl {
             void use( Colour::Code ) {}
+
+            static IColourImpl* instance() {
+                static NoColourImpl s_instance;
+                return &s_instance;
+            }
         };
-        NoColourImpl noColourImpl;
-        static const bool shouldUseColour = shouldUseColourForPlatform() &&
-                                            !isDebuggerActive();
+        static bool shouldUseColour() {
+            return shouldUseColourForPlatform() && !isDebuggerActive();
+        }
     }
 
     Colour::Colour( Code _colourCode ){ use( _colourCode ); }
     Colour::~Colour(){ use( None ); }
     void Colour::use( Code _colourCode ) {
-        impl->use( _colourCode );
+        impl()->use( _colourCode );
     }
 
-    Detail::IColourImpl* Colour::impl = shouldUseColour
-            ? static_cast<Detail::IColourImpl*>( &platformColourImpl )
-            : static_cast<Detail::IColourImpl*>( &noColourImpl );
+    Detail::IColourImpl* Colour::impl() {
+        return shouldUseColour()
+            ? platformColourInstance()
+            : NoColourImpl::instance();
+    }
 
 } // end namespace Catch
 
diff --git a/include/internal/catch_expression_lhs.hpp b/include/internal/catch_expression_lhs.hpp
index 271e8dc..81753fb 100644
--- a/include/internal/catch_expression_lhs.hpp
+++ b/include/internal/catch_expression_lhs.hpp
@@ -14,14 +14,21 @@
 
 namespace Catch {
 
-// Wraps the LHS of an expression and captures the operator and RHS (if any) - wrapping them all
-// in an ExpressionResultBuilder object
+// Wraps the LHS of an expression and captures the operator and RHS (if any) -
+// wrapping them all in an ExpressionResultBuilder object
 template<typename T>
 class ExpressionLhs {
-    void operator = ( ExpressionLhs const& );
+    ExpressionLhs& operator = ( ExpressionLhs const& );
+#  ifdef CATCH_CPP11_OR_GREATER
+    ExpressionLhs& operator = ( ExpressionLhs && ) = delete;
+#  endif
 
 public:
     ExpressionLhs( T lhs ) : m_lhs( lhs ) {}
+#  ifdef CATCH_CPP11_OR_GREATER
+    ExpressionLhs( ExpressionLhs const& ) = default;
+    ExpressionLhs( ExpressionLhs && )     = default;
+#  endif
 
     template<typename RhsT>
     ExpressionResultBuilder& operator == ( RhsT const& rhs ) {
diff --git a/include/internal/catch_impl.hpp b/include/internal/catch_impl.hpp
index e19c159..3f836e4 100644
--- a/include/internal/catch_impl.hpp
+++ b/include/internal/catch_impl.hpp
@@ -42,7 +42,7 @@
 namespace Catch {
     NonCopyable::~NonCopyable() {}
     IShared::~IShared() {}
-    StreamBufBase::~StreamBufBase() throw() {}
+    StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {}
     IContext::~IContext() {}
     IResultCapture::~IResultCapture() {}
     ITestCase::~ITestCase() {}
diff --git a/include/internal/catch_interfaces_config.h b/include/internal/catch_interfaces_config.h
index 79cfa97..0c7c3b2 100644
--- a/include/internal/catch_interfaces_config.h
+++ b/include/internal/catch_interfaces_config.h
@@ -10,6 +10,7 @@
 
 #include <iostream>
 #include <string>
+#include <vector>
 
 #include "catch_ptr.hpp"
 
@@ -32,6 +33,8 @@
         Never
     }; };
 
+    class TestCaseFilters;
+
     struct IConfig : IShared {
 
         virtual ~IConfig();
@@ -44,6 +47,7 @@
         virtual bool warnAboutMissingAssertions() const = 0;
         virtual int abortAfter() const = 0;
         virtual ShowDurations::OrNot showDurations() const = 0;
+        virtual std::vector<TestCaseFilters> const& filters() const = 0;
     };
 }
 
diff --git a/include/internal/catch_interfaces_reporter.h b/include/internal/catch_interfaces_reporter.h
index eafaaa3..872b65c 100644
--- a/include/internal/catch_interfaces_reporter.h
+++ b/include/internal/catch_interfaces_reporter.h
@@ -101,6 +101,13 @@
         }
         virtual ~AssertionStats();
 
+#  ifdef CATCH_CPP11_OR_GREATER
+        AssertionStats( AssertionStats const& )              = default;
+        AssertionStats( AssertionStats && )                  = default;
+        AssertionStats& operator = ( AssertionStats const& ) = default;
+        AssertionStats& operator = ( AssertionStats && )     = default;
+#  endif
+
         AssertionResult assertionResult;
         std::vector<MessageInfo> infoMessages;
         Totals totals;
@@ -117,6 +124,12 @@
             missingAssertions( _missingAssertions )
         {}
         virtual ~SectionStats();
+#  ifdef CATCH_CPP11_OR_GREATER
+        SectionStats( SectionStats const& )              = default;
+        SectionStats( SectionStats && )                  = default;
+        SectionStats& operator = ( SectionStats const& ) = default;
+        SectionStats& operator = ( SectionStats && )     = default;
+#  endif
 
         SectionInfo sectionInfo;
         Counts assertions;
@@ -138,6 +151,13 @@
         {}
         virtual ~TestCaseStats();
 
+#  ifdef CATCH_CPP11_OR_GREATER
+        TestCaseStats( TestCaseStats const& )              = default;
+        TestCaseStats( TestCaseStats && )                  = default;
+        TestCaseStats& operator = ( TestCaseStats const& ) = default;
+        TestCaseStats& operator = ( TestCaseStats && )     = default;
+#  endif
+
         TestCaseInfo testInfo;
         Totals totals;
         std::string stdOut;
@@ -159,6 +179,13 @@
         {}
         virtual ~TestGroupStats();
 
+#  ifdef CATCH_CPP11_OR_GREATER
+        TestGroupStats( TestGroupStats const& )              = default;
+        TestGroupStats( TestGroupStats && )                  = default;
+        TestGroupStats& operator = ( TestGroupStats const& ) = default;
+        TestGroupStats& operator = ( TestGroupStats && )     = default;
+#  endif
+
         GroupInfo groupInfo;
         Totals totals;
         bool aborting;
@@ -172,12 +199,20 @@
             totals( _totals ),
             aborting( _aborting )
         {}
+        virtual ~TestRunStats();
+
+#  ifndef CATCH_CPP11_OR_GREATER
         TestRunStats( TestRunStats const& _other )
         :   runInfo( _other.runInfo ),
             totals( _other.totals ),
             aborting( _other.aborting )
         {}
-        virtual ~TestRunStats();
+#  else
+        TestRunStats( TestRunStats const& )              = default;
+        TestRunStats( TestRunStats && )                  = default;
+        TestRunStats& operator = ( TestRunStats const& ) = default;
+        TestRunStats& operator = ( TestRunStats && )     = default;
+#  endif
 
         TestRunInfo runInfo;
         Totals totals;
diff --git a/include/internal/catch_interfaces_testcase.h b/include/internal/catch_interfaces_testcase.h
index 03ef94e..47f1520 100644
--- a/include/internal/catch_interfaces_testcase.h
+++ b/include/internal/catch_interfaces_testcase.h
@@ -23,11 +23,14 @@
     };
 
     class TestCase;
+    struct IConfig;
 
     struct ITestCaseRegistry {
         virtual ~ITestCaseRegistry();
         virtual std::vector<TestCase> const& getAllTests() const = 0;
-        virtual std::vector<TestCase> getMatchingTestCases( std::string const& rawTestSpec ) const = 0;
+        virtual void getFilteredTests( TestCaseFilters const& filters, IConfig const& config, std::vector<TestCase>& matchingTestCases ) const = 0;
+        virtual void getFilteredTests( IConfig const& config, std::vector<TestCase>& matchingTestCases ) const = 0;
+
     };
 }
 
diff --git a/include/internal/catch_list.hpp b/include/internal/catch_list.hpp
index 1ee3d1f..76a963f 100644
--- a/include/internal/catch_list.hpp
+++ b/include/internal/catch_list.hpp
@@ -17,14 +17,6 @@
 #include <algorithm>
 
 namespace Catch {
-    inline bool matchesFilters( std::vector<TestCaseFilters> const& filters, TestCase const& testCase ) {
-        std::vector<TestCaseFilters>::const_iterator it = filters.begin();
-        std::vector<TestCaseFilters>::const_iterator itEnd = filters.end();
-        for(; it != itEnd; ++it )
-            if( !it->shouldInclude( testCase ) )
-                return false;
-        return true;
-    }
 
     inline std::size_t listTests( Config const& config ) {
         if( config.filters().empty() )
@@ -37,22 +29,22 @@
         nameAttr.setInitialIndent( 2 ).setIndent( 4 );
         tagsAttr.setIndent( 6 );
 
-        std::vector<TestCase> const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests();
-        for( std::vector<TestCase>::const_iterator it = allTests.begin(), itEnd = allTests.end();
+        std::vector<TestCase> matchedTestCases;
+        getRegistryHub().getTestCaseRegistry().getFilteredTests( config, matchedTestCases );
+        for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
                 it != itEnd;
-                ++it )
-            if( matchesFilters( config.filters(), *it ) ) {
-                matchedTests++;
-                TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
-                Colour::Code colour = testCaseInfo.isHidden
-                    ? Colour::SecondaryText
-                    : Colour::None;
-                Colour colourGuard( colour );
+                ++it ) {
+            matchedTests++;
+            TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
+            Colour::Code colour = testCaseInfo.isHidden
+                ? Colour::SecondaryText
+                : Colour::None;
+            Colour colourGuard( colour );
 
-                std::cout << Text( testCaseInfo.name, nameAttr ) << std::endl;
-                if( !testCaseInfo.tags.empty() )
-                    std::cout << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
-            }
+            std::cout << Text( testCaseInfo.name, nameAttr ) << std::endl;
+            if( !testCaseInfo.tags.empty() )
+                std::cout << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
+        }
 
         if( config.filters().empty() )
             std::cout << pluralise( matchedTests, "test case" ) << "\n" << std::endl;
@@ -63,15 +55,15 @@
 
     inline std::size_t listTestsNamesOnly( Config const& config ) {
         std::size_t matchedTests = 0;
-        std::vector<TestCase> const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests();
-        for( std::vector<TestCase>::const_iterator it = allTests.begin(), itEnd = allTests.end();
+        std::vector<TestCase> matchedTestCases;
+        getRegistryHub().getTestCaseRegistry().getFilteredTests( config, matchedTestCases );
+        for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
                 it != itEnd;
-                ++it )
-            if( matchesFilters( config.filters(), *it ) ) {
-                matchedTests++;
-                TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
-                std::cout << testCaseInfo.name << std::endl;
-            }
+                ++it ) {
+            matchedTests++;
+            TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
+            std::cout << testCaseInfo.name << std::endl;
+        }
         return matchedTests;
     }
 
@@ -83,23 +75,21 @@
 
         std::map<std::string, int> tagCounts;
 
-        std::vector<TestCase> const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests();
-        for( std::vector<TestCase>::const_iterator  it = allTests.begin(),
-                                                    itEnd = allTests.end();
+        std::vector<TestCase> matchedTestCases;
+        getRegistryHub().getTestCaseRegistry().getFilteredTests( config, matchedTestCases );
+        for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
                 it != itEnd;
                 ++it ) {
-            if( matchesFilters( config.filters(), *it ) ) {
-                for( std::set<std::string>::const_iterator  tagIt = it->getTestCaseInfo().tags.begin(),
-                                                            tagItEnd = it->getTestCaseInfo().tags.end();
-                        tagIt != tagItEnd;
-                        ++tagIt ) {
-                    std::string tagName = *tagIt;
-                    std::map<std::string, int>::iterator countIt = tagCounts.find( tagName );
-                    if( countIt == tagCounts.end() )
-                        tagCounts.insert( std::make_pair( tagName, 1 ) );
-                    else
-                        countIt->second++;
-                }
+            for( std::set<std::string>::const_iterator  tagIt = it->getTestCaseInfo().tags.begin(),
+                                                        tagItEnd = it->getTestCaseInfo().tags.end();
+                    tagIt != tagItEnd;
+                    ++tagIt ) {
+                std::string tagName = *tagIt;
+                std::map<std::string, int>::iterator countIt = tagCounts.find( tagName );
+                if( countIt == tagCounts.end() )
+                    tagCounts.insert( std::make_pair( tagName, 1 ) );
+                else
+                    countIt->second++;
             }
         }
 
diff --git a/include/internal/catch_notimplemented_exception.h b/include/internal/catch_notimplemented_exception.h
index e543bda..84b1cf3 100644
--- a/include/internal/catch_notimplemented_exception.h
+++ b/include/internal/catch_notimplemented_exception.h
@@ -18,9 +18,9 @@
     public:
         NotImplementedException( SourceLineInfo const& lineInfo );
 
-        virtual ~NotImplementedException() throw() {}
+        virtual ~NotImplementedException() CATCH_NOEXCEPT {}
 
-        virtual const char* what() const throw();
+        virtual const char* what() const CATCH_NOEXCEPT;
 
     private:
         std::string m_what;
diff --git a/include/internal/catch_notimplemented_exception.hpp b/include/internal/catch_notimplemented_exception.hpp
index 4683dcc..4d263f1 100644
--- a/include/internal/catch_notimplemented_exception.hpp
+++ b/include/internal/catch_notimplemented_exception.hpp
@@ -21,7 +21,7 @@
         m_what = oss.str();
     }
 
-    const char* NotImplementedException::what() const throw() {
+    const char* NotImplementedException::what() const CATCH_NOEXCEPT {
         return m_what.c_str();
     }
 
diff --git a/include/internal/catch_runner_impl.hpp b/include/internal/catch_runner_impl.hpp
index 4b34f1e..9794bc5 100644
--- a/include/internal/catch_runner_impl.hpp
+++ b/include/internal/catch_runner_impl.hpp
@@ -88,23 +88,6 @@
             m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) );
         }
 
-        Totals runMatching( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) {
-
-            std::vector<TestCase> matchingTests = getRegistryHub().getTestCaseRegistry().getMatchingTestCases( testSpec );
-
-            Totals totals;
-
-            testGroupStarting( testSpec, groupIndex, groupsCount );
-
-            std::vector<TestCase>::const_iterator it = matchingTests.begin();
-            std::vector<TestCase>::const_iterator itEnd = matchingTests.end();
-            for(; it != itEnd; ++it )
-                totals += runTest( *it );
-
-            testGroupEnded( testSpec, totals, groupIndex, groupsCount );
-            return totals;
-        }
-
         Totals runTest( TestCase const& testCase ) {
             Totals prevTotals = m_totals;
 
@@ -288,8 +271,8 @@
             }
             // If sections ended prematurely due to an exception we stored their
             // infos here so we can tear them down outside the unwind process.
-            for( std::vector<UnfinishedSections>::const_iterator it = m_unfinishedSections.begin(),
-                        itEnd = m_unfinishedSections.end();
+            for( std::vector<UnfinishedSections>::const_reverse_iterator it = m_unfinishedSections.rbegin(),
+                        itEnd = m_unfinishedSections.rend();
                     it != itEnd;
                     ++it )
                 sectionEnded( it->info, it->prevAssertions, it->durationInSeconds );
diff --git a/include/internal/catch_section.h b/include/internal/catch_section.h
index c1a81f6..39211ed 100644
--- a/include/internal/catch_section.h
+++ b/include/internal/catch_section.h
@@ -22,6 +22,12 @@
                     std::string const& name,
                     std::string const& description = "" );
         ~Section();
+#  ifdef CATCH_CPP11_OR_GREATER
+        Section( Section const& )              = default;
+        Section( Section && )                  = default;
+        Section& operator = ( Section const& ) = default;
+        Section& operator = ( Section && )     = default;
+#  endif
 
         // This indicates whether the section should be executed or not
         operator bool();
diff --git a/include/internal/catch_stream.hpp b/include/internal/catch_stream.hpp
index 784ef86..adfacbf 100644
--- a/include/internal/catch_stream.hpp
+++ b/include/internal/catch_stream.hpp
@@ -28,7 +28,7 @@
             setp( data, data + sizeof(data) );
         }
 
-        ~StreamBufImpl() throw() {
+        ~StreamBufImpl() CATCH_NOEXCEPT {
             sync();
         }
 
diff --git a/include/internal/catch_streambuf.h b/include/internal/catch_streambuf.h
index 6a601db..4f5e238 100644
--- a/include/internal/catch_streambuf.h
+++ b/include/internal/catch_streambuf.h
@@ -8,13 +8,15 @@
 #ifndef TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED
 #define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED
 
+#include "catch_compiler_capabilities.h"
+
 #include <streambuf>
 
 namespace Catch {
 
     class StreamBufBase : public std::streambuf {
     public:
-        virtual ~StreamBufBase() throw();
+        virtual ~StreamBufBase() CATCH_NOEXCEPT;
     };
 }
 
diff --git a/include/internal/catch_test_case_info.h b/include/internal/catch_test_case_info.h
index 2977d94..aa9dc86 100644
--- a/include/internal/catch_test_case_info.h
+++ b/include/internal/catch_test_case_info.h
@@ -40,6 +40,7 @@
         std::string tagsAsString;
         SourceLineInfo lineInfo;
         bool isHidden;
+        bool throws;
     };
 
     class TestCase : protected TestCaseInfo {
@@ -55,6 +56,7 @@
         TestCaseInfo const& getTestCaseInfo() const;
 
         bool isHidden() const;
+        bool throws() const;
         bool hasTag( std::string const& tag ) const;
         bool matchesTags( std::string const& tagPattern ) const;
         std::set<std::string> const& getTags() const;
diff --git a/include/internal/catch_test_case_info.hpp b/include/internal/catch_test_case_info.hpp
index 75cd932..84bf6a3 100644
--- a/include/internal/catch_test_case_info.hpp
+++ b/include/internal/catch_test_case_info.hpp
@@ -15,6 +15,16 @@
 
 namespace Catch {
 
+    inline bool isSpecialTag( std::string const& tag ) {
+        return  tag == "." ||
+                tag == "hide" ||
+                tag == "!hide" ||
+                tag == "!throws";
+    }
+    inline bool isReservedTag( std::string const& tag ) {
+        return !isSpecialTag( tag ) && tag.size() > 0 && !isalnum( tag[0] );
+    }
+
     TestCase makeTestCase(  ITestCase* _testCase,
                             std::string const& _className,
                             std::string const& _name,
@@ -25,6 +35,23 @@
         bool isHidden( startsWith( _name, "./" ) ); // Legacy support
         std::set<std::string> tags;
         TagExtracter( tags ).parse( desc );
+        for( std::set<std::string>::const_iterator it = tags.begin(), itEnd = tags.end();
+                it != itEnd;
+                ++it )
+            if( isReservedTag( *it ) ) {
+                {
+                    Colour colourGuard( Colour::Red );
+                    std::cerr
+                        << "Tag name [" << *it << "] not allowed.\n"
+                        << "Tag names starting with non alpha-numeric characters are reserved\n";
+                }
+                {
+                    Colour colourGuard( Colour::FileName );
+                    std::cerr << _lineInfo << std::endl;
+                }
+                exit(1);
+            }
+
         if( tags.find( "hide" ) != tags.end() || tags.find( "." ) != tags.end() )
             isHidden = true;
 
@@ -47,11 +74,15 @@
         description( _description ),
         tags( _tags ),
         lineInfo( _lineInfo ),
-        isHidden( _isHidden )
+        isHidden( _isHidden ),
+        throws( false )
     {
         std::ostringstream oss;
-        for( std::set<std::string>::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it )
+        for( std::set<std::string>::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it ) {
             oss << "[" << *it << "]";
+            if( *it == "!throws" )
+                throws = true;
+        }
         tagsAsString = oss.str();
     }
 
@@ -62,7 +93,8 @@
         tags( other.tags ),
         tagsAsString( other.tagsAsString ),
         lineInfo( other.lineInfo ),
-        isHidden( other.isHidden )
+        isHidden( other.isHidden ),
+        throws( other.throws )
     {}
 
     TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {}
@@ -85,6 +117,9 @@
     bool TestCase::isHidden() const {
         return TestCaseInfo::isHidden;
     }
+    bool TestCase::throws() const {
+        return TestCaseInfo::throws;
+    }
 
     bool TestCase::hasTag( std::string const& tag ) const {
         return tags.find( toLower( tag ) ) != tags.end();
diff --git a/include/internal/catch_test_case_registry_impl.hpp b/include/internal/catch_test_case_registry_impl.hpp
index af1ee29..25f210e 100644
--- a/include/internal/catch_test_case_registry_impl.hpp
+++ b/include/internal/catch_test_case_registry_impl.hpp
@@ -41,9 +41,12 @@
             }
             else {
                 TestCase const& prev = *m_functions.find( testCase );
-                std::cerr   << "error: TEST_CASE( \"" << name << "\" ) already defined.\n"
-                            << "\tFirst seen at " << prev.getTestCaseInfo().lineInfo << "\n"
-                            << "\tRedefined at " << testCase.getTestCaseInfo().lineInfo << std::endl;
+                {
+                    Colour colourGuard( Colour::Red );
+                    std::cerr   << "error: TEST_CASE( \"" << name << "\" ) already defined.\n"
+                                << "\tFirst seen at " << prev.getTestCaseInfo().lineInfo << "\n"
+                                << "\tRedefined at " << testCase.getTestCaseInfo().lineInfo << std::endl;
+                }
                 exit(1);
             }
         }
@@ -56,32 +59,24 @@
             return m_nonHiddenFunctions;
         }
 
-        // !TBD deprecated
-        virtual std::vector<TestCase> getMatchingTestCases( std::string const& rawTestSpec ) const {
-            std::vector<TestCase> matchingTests;
-            getMatchingTestCases( rawTestSpec, matchingTests );
-            return matchingTests;
-        }
-
-        // !TBD deprecated
-        virtual void getMatchingTestCases( std::string const& rawTestSpec, std::vector<TestCase>& matchingTestsOut ) const {
-            TestCaseFilter filter( rawTestSpec );
-
-            std::vector<TestCase>::const_iterator it = m_functionsInOrder.begin();
-            std::vector<TestCase>::const_iterator itEnd = m_functionsInOrder.end();
-            for(; it != itEnd; ++it ) {
-                if( filter.shouldInclude( *it ) ) {
-                    matchingTestsOut.push_back( *it );
-                }
+        virtual void getFilteredTests( TestCaseFilters const& filters, IConfig const& config, std::vector<TestCase>& matchingTestCases ) const {
+            for( std::vector<TestCase>::const_iterator  it = m_functionsInOrder.begin(),
+                                                        itEnd = m_functionsInOrder.end();
+                    it != itEnd;
+                    ++it ) {
+                if( filters.shouldInclude( *it ) && ( config.allowThrows() || !it->throws() ) )
+                    matchingTestCases.push_back( *it );
             }
         }
-        virtual void getMatchingTestCases( TestCaseFilters const& filters, std::vector<TestCase>& matchingTestsOut ) const {
-            std::vector<TestCase>::const_iterator it = m_functionsInOrder.begin();
-            std::vector<TestCase>::const_iterator itEnd = m_functionsInOrder.end();
-            // !TBD: replace with algorithm
-            for(; it != itEnd; ++it )
-                if( filters.shouldInclude( *it ) )
-                    matchingTestsOut.push_back( *it );
+        virtual void getFilteredTests( IConfig const& config, std::vector<TestCase>& matchingTestCases ) const {
+            if( config.filters().empty() )
+                return getFilteredTests( TestCaseFilters( "empty" ), config, matchingTestCases );
+
+            for( std::vector<TestCaseFilters>::const_iterator   it = config.filters().begin(),
+                                                                itEnd = config.filters().end();
+                    it != itEnd;
+                    ++it )
+                getFilteredTests( *it, config, matchingTestCases );
         }
 
     private:
diff --git a/include/internal/catch_test_case_tracker.hpp b/include/internal/catch_test_case_tracker.hpp
index ebb4fb8..2165e1c 100644
--- a/include/internal/catch_test_case_tracker.hpp
+++ b/include/internal/catch_test_case_tracker.hpp
@@ -33,13 +33,18 @@
 
         RunState runState() const { return m_runState; }
 
-        void addChild( std::string const& childName ) {
+        TrackedSection* findChild( std::string const& childName ) {
+            TrackedSections::iterator it = m_children.find( childName );
+            return it != m_children.end()
+                ? &it->second
+                : NULL;
+        }
+        TrackedSection* acquireChild( std::string const& childName ) {
+            if( TrackedSection* child = findChild( childName ) )
+                return child;
             m_children.insert( std::make_pair( childName, TrackedSection( childName, this ) ) );
+            return findChild( childName );
         }
-        TrackedSection* getChild( std::string const& childName ) {
-            return &m_children.find( childName )->second;
-        }
-
         void enter() {
             if( m_runState == NotStarted )
                 m_runState = Executing;
@@ -78,21 +83,13 @@
         {}
 
         bool enterSection( std::string const& name ) {
-            if( m_completedASectionThisRun )
+            TrackedSection* child = m_currentSection->acquireChild( name );
+            if( m_completedASectionThisRun || child->runState() == TrackedSection::Completed )
                 return false;
-            if( m_currentSection->runState() == TrackedSection::Executing ) {
-                m_currentSection->addChild( name );
-                return false;
-            }
-            else {
-                TrackedSection* child = m_currentSection->getChild( name );
-                if( child->runState() != TrackedSection::Completed ) {
-                    m_currentSection = child;
-                    m_currentSection->enter();
-                    return true;
-                }
-                return false;
-            }
+
+            m_currentSection = child;
+            m_currentSection->enter();
+            return true;
         }
         void leaveSection() {
             m_currentSection->leave();
@@ -110,9 +107,7 @@
 
         class Guard {
         public:
-            Guard( TestCaseTracker& tracker )
-            : m_tracker( tracker )
-            {
+            Guard( TestCaseTracker& tracker ) : m_tracker( tracker ) {
                 m_tracker.enterTestCase();
             }
             ~Guard() {
diff --git a/include/internal/catch_text.h b/include/internal/catch_text.h
index 4657f74..b66751f 100644
--- a/include/internal/catch_text.h
+++ b/include/internal/catch_text.h
@@ -13,7 +13,7 @@
 #define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH
 
 #define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch
-#include "tbc_text_format.h"
+#include "../external/tbc_text_format.h"
 #undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
 
 namespace Catch {
diff --git a/include/internal/catch_version.h b/include/internal/catch_version.h
index bca0f8b..ca2feef 100644
--- a/include/internal/catch_version.h
+++ b/include/internal/catch_version.h
@@ -15,17 +15,17 @@
         Version(    unsigned int _majorVersion,
                     unsigned int _minorVersion,
                     unsigned int _buildNumber,
-                    std::string const& _branchName )
+                    char const* const _branchName )
         :   majorVersion( _majorVersion ),
             minorVersion( _minorVersion ),
             buildNumber( _buildNumber ),
             branchName( _branchName )
         {}
 
-        const unsigned int majorVersion;
-        const unsigned int minorVersion;
-        const unsigned int buildNumber;
-        const std::string branchName;
+        unsigned int const majorVersion;
+        unsigned int const minorVersion;
+        unsigned int const buildNumber;
+        char const* const branchName;
 
     private:
         void operator=( Version const& );
diff --git a/include/internal/catch_version.hpp b/include/internal/catch_version.hpp
index 85181d6..652e7f4 100644
--- a/include/internal/catch_version.hpp
+++ b/include/internal/catch_version.hpp
@@ -13,7 +13,7 @@
 namespace Catch {
 
     // These numbers are maintained by a script
-    Version libraryVersion( 1, 0, 30, "master" );
+    Version libraryVersion( 1, 0, 39, "master" );
 }
 
 #endif // TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
diff --git a/include/internal/catch_xmlwriter.hpp b/include/internal/catch_xmlwriter.hpp
index 5593022..3b19b94 100644
--- a/include/internal/catch_xmlwriter.hpp
+++ b/include/internal/catch_xmlwriter.hpp
@@ -66,11 +66,18 @@
                 endElement();
         }
 
+#  ifndef CATCH_CPP11_OR_GREATER
         XmlWriter& operator = ( XmlWriter const& other ) {
             XmlWriter temp( other );
             swap( temp );
             return *this;
         }
+#  else
+        XmlWriter( XmlWriter const& )              = default;
+        XmlWriter( XmlWriter && )                  = default;
+        XmlWriter& operator = ( XmlWriter const& ) = default;
+        XmlWriter& operator = ( XmlWriter && )     = default;
+#  endif
 
         void swap( XmlWriter& other ) {
             std::swap( m_tagIsOpen, other.m_tagIsOpen );
diff --git a/include/reporters/catch_reporter_console.hpp b/include/reporters/catch_reporter_console.hpp
index 60ada64..71ca890 100644
--- a/include/reporters/catch_reporter_console.hpp
+++ b/include/reporters/catch_reporter_console.hpp
@@ -262,7 +262,7 @@
                     << " is a Catch v"  << libraryVersion.majorVersion << "."
                     << libraryVersion.minorVersion << " b"
                     << libraryVersion.buildNumber;
-            if( libraryVersion.branchName != "master" )
+            if( libraryVersion.branchName != std::string( "master" ) )
                 stream << " (" << libraryVersion.branchName << ")";
             stream  << " host application.\n"
                     << "Run with -? for options\n\n";
diff --git a/projects/SelfTest/Baselines/console.std.approved.txt b/projects/SelfTest/Baselines/console.std.approved.txt
index e1df155..74b5ae1 100644
--- a/projects/SelfTest/Baselines/console.std.approved.txt
+++ b/projects/SelfTest/Baselines/console.std.approved.txt
@@ -332,6 +332,30 @@
   expected exception
 
 -------------------------------------------------------------------------------
+When unchecked exceptions are thrown during a REQUIRE the test should abort
+fail
+-------------------------------------------------------------------------------
+ExceptionTests.cpp:<line number>
+...............................................................................
+
+ExceptionTests.cpp:<line number>: FAILED:
+  REQUIRE( thisThrows() == 0 )
+due to unexpected exception with message:
+  expected exception
+
+-------------------------------------------------------------------------------
+When unchecked exceptions are thrown during a CHECK the test should abort and
+fail
+-------------------------------------------------------------------------------
+ExceptionTests.cpp:<line number>
+...............................................................................
+
+ExceptionTests.cpp:<line number>: FAILED:
+  CHECK( thisThrows() == 0 )
+due to unexpected exception with message:
+  expected exception
+
+-------------------------------------------------------------------------------
 Unexpected custom exceptions can be translated
 -------------------------------------------------------------------------------
 ExceptionTests.cpp:<line number>
@@ -678,26 +702,6 @@
 explicitly with message:
   to infinity and beyond
 
--------------------------------------------------------------------------------
-A couple of nested sections followed by a failure
--------------------------------------------------------------------------------
-MiscTests.cpp:<line number>
-...............................................................................
-
-MiscTests.cpp:<line number>: FAILED:
-explicitly with message:
-  to infinity and beyond
-
--------------------------------------------------------------------------------
-A couple of nested sections followed by a failure
--------------------------------------------------------------------------------
-MiscTests.cpp:<line number>
-...............................................................................
-
-MiscTests.cpp:<line number>: FAILED:
-explicitly with message:
-  to infinity and beyond
-
 hello
 hello
 -------------------------------------------------------------------------------
@@ -750,5 +754,5 @@
   "first" == "second"
 
 ===============================================================================
-122 test cases - 36 failed (658 assertions - 91 failed)
+125 test cases - 38 failed (627 assertions - 91 failed)
 
diff --git a/projects/SelfTest/Baselines/console.sw.approved.txt b/projects/SelfTest/Baselines/console.sw.approved.txt
index 353d36e..3a85adf 100644
--- a/projects/SelfTest/Baselines/console.sw.approved.txt
+++ b/projects/SelfTest/Baselines/console.sw.approved.txt
@@ -1111,6 +1111,30 @@
   expected exception
 
 -------------------------------------------------------------------------------
+When unchecked exceptions are thrown during a REQUIRE the test should abort
+fail
+-------------------------------------------------------------------------------
+ExceptionTests.cpp:<line number>
+...............................................................................
+
+ExceptionTests.cpp:<line number>: FAILED:
+  REQUIRE( thisThrows() == 0 )
+due to unexpected exception with message:
+  expected exception
+
+-------------------------------------------------------------------------------
+When unchecked exceptions are thrown during a CHECK the test should abort and
+fail
+-------------------------------------------------------------------------------
+ExceptionTests.cpp:<line number>
+...............................................................................
+
+ExceptionTests.cpp:<line number>: FAILED:
+  CHECK( thisThrows() == 0 )
+due to unexpected exception with message:
+  expected exception
+
+-------------------------------------------------------------------------------
 When unchecked exceptions are thrown, but caught, they do not affect the test
 -------------------------------------------------------------------------------
 ExceptionTests.cpp:<line number>
@@ -2839,25 +2863,6 @@
 -------------------------------------------------------------------------------
 nested SECTION tests
   s1
--------------------------------------------------------------------------------
-MiscTests.cpp:<line number>
-...............................................................................
-
-MiscTests.cpp:<line number>:
-PASSED:
-  REQUIRE( a != b )
-with expansion:
-  1 != 2
-
-MiscTests.cpp:<line number>:
-PASSED:
-  REQUIRE( b != a )
-with expansion:
-  2 != 1
-
--------------------------------------------------------------------------------
-nested SECTION tests
-  s1
   s2
 -------------------------------------------------------------------------------
 MiscTests.cpp:<line number>
@@ -2883,34 +2888,6 @@
   1 == 2
 
 -------------------------------------------------------------------------------
-more nested SECTION tests
-  s1
-  s3
--------------------------------------------------------------------------------
-MiscTests.cpp:<line number>
-...............................................................................
-
-MiscTests.cpp:<line number>:
-PASSED:
-  REQUIRE( a != b )
-with expansion:
-  1 != 2
-
--------------------------------------------------------------------------------
-more nested SECTION tests
-  s1
-  s4
--------------------------------------------------------------------------------
-MiscTests.cpp:<line number>
-...............................................................................
-
-MiscTests.cpp:<line number>:
-PASSED:
-  REQUIRE( a < b )
-with expansion:
-  1 < 2
-
--------------------------------------------------------------------------------
 even more nested SECTION tests
   c
   d (leaf)
@@ -3386,24 +3363,6 @@
 
 -------------------------------------------------------------------------------
 vectors can be sized and resized
--------------------------------------------------------------------------------
-MiscTests.cpp:<line number>
-...............................................................................
-
-MiscTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.size() == 5 )
-with expansion:
-  5 == 5
-
-MiscTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.capacity() >= 5 )
-with expansion:
-  5 >= 5
-
--------------------------------------------------------------------------------
-vectors can be sized and resized
   resizing bigger changes size and capacity
 -------------------------------------------------------------------------------
 MiscTests.cpp:<line number>
@@ -3460,43 +3419,6 @@
 
 -------------------------------------------------------------------------------
 vectors can be sized and resized
--------------------------------------------------------------------------------
-MiscTests.cpp:<line number>
-...............................................................................
-
-MiscTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.size() == 5 )
-with expansion:
-  5 == 5
-
-MiscTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.capacity() >= 5 )
-with expansion:
-  5 >= 5
-
--------------------------------------------------------------------------------
-vectors can be sized and resized
-  resizing smaller changes size but not capacity
--------------------------------------------------------------------------------
-MiscTests.cpp:<line number>
-...............................................................................
-
-MiscTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.size() == 0 )
-with expansion:
-  0 == 0
-
-MiscTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.capacity() >= 5 )
-with expansion:
-  5 >= 5
-
--------------------------------------------------------------------------------
-vectors can be sized and resized
   resizing smaller changes size but not capacity
   We can use the 'swap trick' to reset the capacity
 -------------------------------------------------------------------------------
@@ -3585,26 +3507,6 @@
 
 -------------------------------------------------------------------------------
 A couple of nested sections followed by a failure
--------------------------------------------------------------------------------
-MiscTests.cpp:<line number>
-...............................................................................
-
-MiscTests.cpp:<line number>: FAILED:
-explicitly with message:
-  to infinity and beyond
-
--------------------------------------------------------------------------------
-A couple of nested sections followed by a failure
--------------------------------------------------------------------------------
-MiscTests.cpp:<line number>
-...............................................................................
-
-MiscTests.cpp:<line number>: FAILED:
-explicitly with message:
-  to infinity and beyond
-
--------------------------------------------------------------------------------
-A couple of nested sections followed by a failure
   Outer
   Inner
 -------------------------------------------------------------------------------
@@ -3627,6 +3529,15 @@
   to infinity and beyond
 
 -------------------------------------------------------------------------------
+not allowed
+-------------------------------------------------------------------------------
+MiscTests.cpp:<line number>
+...............................................................................
+
+MiscTests.cpp:<line number>:
+PASSED:
+
+-------------------------------------------------------------------------------
 Process can be configured on command line
   default - no arguments
 -------------------------------------------------------------------------------
@@ -3926,8 +3837,7 @@
   REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ) Contains( "greater than zero" ) )
 with expansion:
   "Value after -x or --abortAfter must be greater than zero
-  - while parsing: (-x, --abortx <number of failures>)" contains: "greater than
-  zero"
+  - while parsing: (-x, --abortx <no. failures>)" contains: "greater than zero"
 
 -------------------------------------------------------------------------------
 Process can be configured on command line
@@ -3942,7 +3852,7 @@
   REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ) Contains( "-x" ) )
 with expansion:
   "Unable to convert oops to destination type
-  - while parsing: (-x, --abortx <number of failures>)" contains: "-x"
+  - while parsing: (-x, --abortx <no. failures>)" contains: "-x"
 
 -------------------------------------------------------------------------------
 Process can be configured on command line
@@ -6237,43 +6147,6 @@
 
 -------------------------------------------------------------------------------
 Assertions then sections
--------------------------------------------------------------------------------
-TrickyTests.cpp:<line number>
-...............................................................................
-
-TrickyTests.cpp:<line number>:
-PASSED:
-  REQUIRE( Catch::isTrue( true ) )
-with expansion:
-  true
-
--------------------------------------------------------------------------------
-Assertions then sections
-  A section
--------------------------------------------------------------------------------
-TrickyTests.cpp:<line number>
-...............................................................................
-
-TrickyTests.cpp:<line number>:
-PASSED:
-  REQUIRE( Catch::isTrue( true ) )
-with expansion:
-  true
-
--------------------------------------------------------------------------------
-Assertions then sections
--------------------------------------------------------------------------------
-TrickyTests.cpp:<line number>
-...............................................................................
-
-TrickyTests.cpp:<line number>:
-PASSED:
-  REQUIRE( Catch::isTrue( true ) )
-with expansion:
-  true
-
--------------------------------------------------------------------------------
-Assertions then sections
   A section
 -------------------------------------------------------------------------------
 TrickyTests.cpp:<line number>
@@ -6484,21 +6357,6 @@
      Given: This stuff exists
       When: I do this
       Then: it should do this
--------------------------------------------------------------------------------
-BDDTests.cpp:<line number>
-...............................................................................
-
-BDDTests.cpp:<line number>:
-PASSED:
-  REQUIRE( itDoesThis() )
-with expansion:
-  true
-
--------------------------------------------------------------------------------
-Scenario: Do that thing with the thing
-     Given: This stuff exists
-      When: I do this
-      Then: it should do this
        And: do that
 -------------------------------------------------------------------------------
 BDDTests.cpp:<line number>
@@ -6526,100 +6384,6 @@
 -------------------------------------------------------------------------------
 Scenario: Vector resizing affects size and capacity
      Given: an empty vector
--------------------------------------------------------------------------------
-BDDTests.cpp:<line number>
-...............................................................................
-
-BDDTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.size() == 0 )
-with expansion:
-  0 == 0
-
--------------------------------------------------------------------------------
-Scenario: Vector resizing affects size and capacity
-     Given: an empty vector
--------------------------------------------------------------------------------
-BDDTests.cpp:<line number>
-...............................................................................
-
-BDDTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.size() == 0 )
-with expansion:
-  0 == 0
-
--------------------------------------------------------------------------------
-Scenario: Vector resizing affects size and capacity
-     Given: an empty vector
-      When: it is made larger
-      Then: the size and capacity go up
--------------------------------------------------------------------------------
-BDDTests.cpp:<line number>
-...............................................................................
-
-BDDTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.size() == 10 )
-with expansion:
-  10 == 10
-
-BDDTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.capacity() >= 10 )
-with expansion:
-  10 >= 10
-
--------------------------------------------------------------------------------
-Scenario: Vector resizing affects size and capacity
-     Given: an empty vector
--------------------------------------------------------------------------------
-BDDTests.cpp:<line number>
-...............................................................................
-
-BDDTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.size() == 0 )
-with expansion:
-  0 == 0
-
--------------------------------------------------------------------------------
-Scenario: Vector resizing affects size and capacity
-     Given: an empty vector
-      When: it is made larger
-      Then: the size and capacity go up
--------------------------------------------------------------------------------
-BDDTests.cpp:<line number>
-...............................................................................
-
-BDDTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.size() == 10 )
-with expansion:
-  10 == 10
-
-BDDTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.capacity() >= 10 )
-with expansion:
-  10 >= 10
-
--------------------------------------------------------------------------------
-Scenario: Vector resizing affects size and capacity
-     Given: an empty vector
--------------------------------------------------------------------------------
-BDDTests.cpp:<line number>
-...............................................................................
-
-BDDTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.size() == 0 )
-with expansion:
-  0 == 0
-
--------------------------------------------------------------------------------
-Scenario: Vector resizing affects size and capacity
-     Given: an empty vector
       When: it is made larger
       Then: the size and capacity go up
 -------------------------------------------------------------------------------
@@ -6677,19 +6441,6 @@
 -------------------------------------------------------------------------------
 Scenario: Vector resizing affects size and capacity
      Given: an empty vector
--------------------------------------------------------------------------------
-BDDTests.cpp:<line number>
-...............................................................................
-
-BDDTests.cpp:<line number>:
-PASSED:
-  REQUIRE( v.size() == 0 )
-with expansion:
-  0 == 0
-
--------------------------------------------------------------------------------
-Scenario: Vector resizing affects size and capacity
-     Given: an empty vector
       When: we reserve more space
       Then: The capacity is increased but the size remains the same
 -------------------------------------------------------------------------------
@@ -6740,18 +6491,6 @@
 
 -------------------------------------------------------------------------------
 section tracking
--------------------------------------------------------------------------------
-SectionTrackerTests.cpp:<line number>
-...............................................................................
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
-  CHECK_FALSE( testCaseTracker.isCompleted() )
-with expansion:
-  !false
-
--------------------------------------------------------------------------------
-section tracking
   test case with no sections
 -------------------------------------------------------------------------------
 SectionTrackerTests.cpp:<line number>
@@ -6790,34 +6529,28 @@
 
 SectionTrackerTests.cpp:<line number>:
 PASSED:
-  CHECK_FALSE( testCaseTracker.enterSection( section1Name ) )
-with expansion:
-  !false
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
-  CHECK_FALSE( testCaseTracker.isCompleted() )
-with expansion:
-  !false
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
-  CHECK_FALSE( testCaseTracker.isCompleted() )
-with expansion:
-  !false
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
   CHECK( testCaseTracker.enterSection( section1Name ) )
 with expansion:
   true
 
 SectionTrackerTests.cpp:<line number>:
 PASSED:
+  CHECK_FALSE( testCaseTracker.isCompleted() )
+with expansion:
+  !false
+
+SectionTrackerTests.cpp:<line number>:
+PASSED:
   CHECK( testCaseTracker.isCompleted() )
 with expansion:
   true
 
+SectionTrackerTests.cpp:<line number>:
+PASSED:
+  CHECK_FALSE( testCaseTracker.enterSection( section1Name ) )
+with expansion:
+  !false
+
 -------------------------------------------------------------------------------
 section tracking
 -------------------------------------------------------------------------------
@@ -6839,24 +6572,6 @@
 
 SectionTrackerTests.cpp:<line number>:
 PASSED:
-  CHECK_FALSE( testCaseTracker.enterSection( section1Name ) )
-with expansion:
-  !false
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
-  CHECK_FALSE( testCaseTracker.enterSection( section2Name ) )
-with expansion:
-  !false
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
-  CHECK_FALSE( testCaseTracker.isCompleted() )
-with expansion:
-  !false
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
   CHECK( testCaseTracker.enterSection( section1Name ) )
 with expansion:
   true
@@ -6912,36 +6627,6 @@
 
 SectionTrackerTests.cpp:<line number>:
 PASSED:
-  CHECK_FALSE( testCaseTracker.enterSection( section1Name ) )
-with expansion:
-  !false
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
-  CHECK_FALSE( testCaseTracker.isCompleted() )
-with expansion:
-  !false
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
-  CHECK( testCaseTracker.enterSection( section1Name ) )
-with expansion:
-  true
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
-  CHECK_FALSE( testCaseTracker.enterSection( section2Name ) )
-with expansion:
-  !false
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
-  CHECK_FALSE( testCaseTracker.isCompleted() )
-with expansion:
-  !false
-
-SectionTrackerTests.cpp:<line number>:
-PASSED:
   CHECK( testCaseTracker.enterSection( section1Name ) )
 with expansion:
   true
@@ -6954,10 +6639,16 @@
 
 SectionTrackerTests.cpp:<line number>:
 PASSED:
+  CHECK_FALSE( testCaseTracker.isCompleted() )
+with expansion:
+  !false
+
+SectionTrackerTests.cpp:<line number>:
+PASSED:
   CHECK( testCaseTracker.isCompleted() )
 with expansion:
   true
 
 ===============================================================================
-122 test cases - 51 failed (677 assertions - 110 failed)
+125 test cases - 53 failed (646 assertions - 110 failed)
 
diff --git a/projects/SelfTest/Baselines/junit.sw.approved.txt b/projects/SelfTest/Baselines/junit.sw.approved.txt
index 406bda6..5b36c2b 100644
--- a/projects/SelfTest/Baselines/junit.sw.approved.txt
+++ b/projects/SelfTest/Baselines/junit.sw.approved.txt
@@ -1,5 +1,5 @@
 <testsuites>
-  <testsuite name="~_" errors="10" failures="100" tests="677" hostname="tbd" time="{duration}" timestamp="tbd">
+  <testsuite name="~_" errors="12" failures="98" tests="646" hostname="tbd" time="{duration}" timestamp="tbd">
     <testcase classname="global" name="Some simple comparisons between doubles" time="{duration}"/>
     <testcase classname="global" name="Approximate comparisons with different epsilons" time="{duration}"/>
     <testcase classname="global" name="Approximate comparisons with floats" time="{duration}"/>
@@ -210,6 +210,18 @@
 ExceptionTests.cpp:<line number>
       </error>
     </testcase>
+    <testcase classname="global" name="When unchecked exceptions are thrown during a REQUIRE the test should abort fail" time="{duration}">
+      <error message="thisThrows() == 0" type="REQUIRE">
+expected exception
+ExceptionTests.cpp:<line number>
+      </error>
+    </testcase>
+    <testcase classname="global" name="When unchecked exceptions are thrown during a CHECK the test should abort and fail" time="{duration}">
+      <error message="thisThrows() == 0" type="CHECK">
+expected exception
+ExceptionTests.cpp:<line number>
+      </error>
+    </testcase>
     <testcase classname="global" name="Unexpected custom exceptions can be translated" time="{duration}">
       <error type="TEST_CASE">
 custom exception
@@ -311,13 +323,11 @@
     <testcase classname="random SECTION tests" name="s2" time="{duration}"/>
     <testcase classname="nested SECTION tests" name="s1" time="{duration}"/>
     <testcase classname="nested SECTION tests" name="s1/s2" time="{duration}"/>
-    <testcase classname="more nested SECTION tests" name="s1/s2" time="{duration}">
+    <testcase classname="more nested SECTION tests" name="s2/s1" time="{duration}">
       <failure message="1 == 2" type="REQUIRE">
 MiscTests.cpp:<line number>
       </failure>
     </testcase>
-    <testcase classname="more nested SECTION tests" name="s1/s3" time="{duration}"/>
-    <testcase classname="more nested SECTION tests" name="s1/s4" time="{duration}"/>
     <testcase classname="looped SECTION tests" name="s1" time="{duration}">
       <failure message="0 > 1" type="CHECK">
 MiscTests.cpp:<line number>
@@ -421,16 +431,9 @@
 to infinity and beyond
 MiscTests.cpp:<line number>
       </failure>
-      <failure type="FAIL">
-to infinity and beyond
-MiscTests.cpp:<line number>
-      </failure>
-      <failure type="FAIL">
-to infinity and beyond
-MiscTests.cpp:<line number>
-      </failure>
     </testcase>
     <testcase classname="A couple of nested sections followed by a failure" name="Outer/Inner" time="{duration}"/>
+    <testcase classname="global" name="not allowed" time="{duration}"/>
     <testcase classname="Process can be configured on command line" name="default - no arguments" time="{duration}"/>
     <testcase classname="Process can be configured on command line" name="test lists/1 test" time="{duration}"/>
     <testcase classname="Process can be configured on command line" name="test lists/Specify one test case exclusion using exclude:" time="{duration}"/>
diff --git a/projects/SelfTest/Baselines/xml.sw.approved.txt b/projects/SelfTest/Baselines/xml.sw.approved.txt
index 58fef78..4aec98f 100644
--- a/projects/SelfTest/Baselines/xml.sw.approved.txt
+++ b/projects/SelfTest/Baselines/xml.sw.approved.txt
@@ -1426,6 +1426,34 @@
       </Expression>
       <OverallResult success="false"/>
     </TestCase>
+    <TestCase name="When unchecked exceptions are thrown during a REQUIRE the test should abort fail">
+      <Expression success="false" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/ExceptionTests.cpp" >
+        <Original>
+          thisThrows() == 0
+        </Original>
+        <Expanded>
+          thisThrows() == 0
+        </Expanded>
+        <Exception filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/ExceptionTests.cpp" >
+          expected exception
+        </Exception>
+      </Expression>
+      <OverallResult success="false"/>
+    </TestCase>
+    <TestCase name="When unchecked exceptions are thrown during a CHECK the test should abort and fail">
+      <Expression success="false" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/ExceptionTests.cpp" >
+        <Original>
+          thisThrows() == 0
+        </Original>
+        <Expanded>
+          thisThrows() == 0
+        </Expanded>
+        <Exception filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/ExceptionTests.cpp" >
+          expected exception
+        </Exception>
+      </Expression>
+      <OverallResult success="false"/>
+    </TestCase>
     <TestCase name="When unchecked exceptions are thrown, but caught, they do not affect the test">
       <OverallResult success="true"/>
     </TestCase>
@@ -2946,25 +2974,6 @@
             2 != 1
           </Expanded>
         </Expression>
-        <OverallResults successes="2" failures="0"/>
-      </Section>
-      <Section name="s1" description="doesn't equal">
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
-          <Original>
-            a != b
-          </Original>
-          <Expanded>
-            1 != 2
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
-          <Original>
-            b != a
-          </Original>
-          <Expanded>
-            2 != 1
-          </Expanded>
-        </Expression>
         <Section name="s2" description="not equal">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
             <Original>
@@ -2982,9 +2991,6 @@
     </TestCase>
     <TestCase name="more nested SECTION tests">
       <Section name="s1" description="doesn't equal">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="s1" description="doesn't equal">
         <Section name="s2" description="equal">
           <Expression success="false" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
             <Original>
@@ -2998,41 +3004,10 @@
         </Section>
         <OverallResults successes="0" failures="1"/>
       </Section>
-      <Section name="s1" description="doesn't equal">
-        <Section name="s3" description="not equal">
-          <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
-            <Original>
-              a != b
-            </Original>
-            <Expanded>
-              1 != 2
-            </Expanded>
-          </Expression>
-          <OverallResults successes="1" failures="0"/>
-        </Section>
-        <OverallResults successes="1" failures="0"/>
-      </Section>
-      <Section name="s1" description="doesn't equal">
-        <Section name="s4" description="less than">
-          <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
-            <Original>
-              a &lt; b
-            </Original>
-            <Expanded>
-              1 &lt; 2
-            </Expanded>
-          </Expression>
-          <OverallResults successes="1" failures="0"/>
-        </Section>
-        <OverallResults successes="1" failures="0"/>
-      </Section>
       <OverallResult success="false"/>
     </TestCase>
     <TestCase name="even more nested SECTION tests">
       <Section name="c">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="c">
         <Section name="d (leaf)">
           <OverallResults successes="0" failures="1"/>
         </Section>
@@ -3486,22 +3461,6 @@
           5 >= 5
         </Expanded>
       </Expression>
-      <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
-        <Original>
-          v.size() == 5
-        </Original>
-        <Expanded>
-          5 == 5
-        </Expanded>
-      </Expression>
-      <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
-        <Original>
-          v.capacity() >= 5
-        </Original>
-        <Expanded>
-          5 >= 5
-        </Expanded>
-      </Expression>
       <Section name="resizing bigger changes size and capacity">
         <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
           <Original>
@@ -3554,41 +3513,6 @@
             5 >= 5
           </Expanded>
         </Expression>
-        <OverallResults successes="2" failures="0"/>
-      </Section>
-      <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
-        <Original>
-          v.size() == 5
-        </Original>
-        <Expanded>
-          5 == 5
-        </Expanded>
-      </Expression>
-      <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
-        <Original>
-          v.capacity() >= 5
-        </Original>
-        <Expanded>
-          5 >= 5
-        </Expanded>
-      </Expression>
-      <Section name="resizing smaller changes size but not capacity">
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
-          <Original>
-            v.size() == 0
-          </Original>
-          <Expanded>
-            0 == 0
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
-          <Original>
-            v.capacity() >= 5
-          </Original>
-          <Expanded>
-            5 >= 5
-          </Expanded>
-        </Expression>
         <Section name="We can use the 'swap trick' to reset the capacity">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/MiscTests.cpp" >
             <Original>
@@ -3675,15 +3599,6 @@
       <OverallResult success="true"/>
     </TestCase>
     <TestCase name="A couple of nested sections followed by a failure">
-      <Failure>
-        to infinity and beyond
-      </Failure>
-      <Section name="Outer">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Failure>
-        to infinity and beyond
-      </Failure>
       <Section name="Outer">
         <Section name="Inner">
           <OverallResults successes="1" failures="0"/>
@@ -3695,6 +3610,9 @@
       </Failure>
       <OverallResult success="false"/>
     </TestCase>
+    <TestCase name="not allowed">
+      <OverallResult success="true"/>
+    </TestCase>
     <TestCase name="Process can be configured on command line">
       <Section name="default - no arguments">
         <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TestMain.cpp" >
@@ -3740,9 +3658,6 @@
         <OverallResults successes="5" failures="0"/>
       </Section>
       <Section name="test lists">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="test lists">
         <Section name="1 test" description="Specify one test case using">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TestMain.cpp" >
             <Original>
@@ -3903,9 +3818,6 @@
         <OverallResults successes="5" failures="0"/>
       </Section>
       <Section name="reporter">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="reporter">
         <Section name="-r/console">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TestMain.cpp" >
             <Original>
@@ -3972,9 +3884,6 @@
         <OverallResults successes="2" failures="0"/>
       </Section>
       <Section name="debugger">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="debugger">
         <Section name="-b">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TestMain.cpp" >
             <Original>
@@ -4019,9 +3928,6 @@
         <OverallResults successes="2" failures="0"/>
       </Section>
       <Section name="abort">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="abort">
         <Section name="-a aborts after first failure">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TestMain.cpp" >
             <Original>
@@ -4073,7 +3979,7 @@
             </Original>
             <Expanded>
               &quot;Value after -x or --abortAfter must be greater than zero
-- while parsing: (-x, --abortx &lt;number of failures>)&quot; contains: &quot;greater than zero&quot;
+- while parsing: (-x, --abortx &lt;no. failures>)&quot; contains: &quot;greater than zero&quot;
             </Expanded>
           </Expression>
           <OverallResults successes="1" failures="0"/>
@@ -4088,7 +3994,7 @@
             </Original>
             <Expanded>
               &quot;Unable to convert oops to destination type
-- while parsing: (-x, --abortx &lt;number of failures>)&quot; contains: &quot;-x&quot;
+- while parsing: (-x, --abortx &lt;no. failures>)&quot; contains: &quot;-x&quot;
             </Expanded>
           </Expression>
           <OverallResults successes="1" failures="0"/>
@@ -4096,9 +4002,6 @@
         <OverallResults successes="1" failures="0"/>
       </Section>
       <Section name="nothrow">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="nothrow">
         <Section name="-e">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TestMain.cpp" >
             <Original>
@@ -4143,9 +4046,6 @@
         <OverallResults successes="2" failures="0"/>
       </Section>
       <Section name="output filename">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="output filename">
         <Section name="-o filename">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TestMain.cpp" >
             <Original>
@@ -4190,9 +4090,6 @@
         <OverallResults successes="2" failures="0"/>
       </Section>
       <Section name="combinations">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="combinations">
         <Section name="Single character flags can be combined">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TestMain.cpp" >
             <Original>
@@ -4758,9 +4655,6 @@
     </TestCase>
     <TestCase name="Long strings can be wrapped">
       <Section name="plain string">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="plain string">
         <Section name="No wrapping">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TestMain.cpp" >
             <Original>
@@ -5087,9 +4981,6 @@
         <OverallResults successes="1" failures="0"/>
       </Section>
       <Section name="With newlines">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="With newlines">
         <Section name="No wrapping">
           <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TestMain.cpp" >
             <Original>
@@ -6531,33 +6422,6 @@
           true
         </Expanded>
       </Expression>
-      <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TrickyTests.cpp" >
-        <Original>
-          Catch::isTrue( true )
-        </Original>
-        <Expanded>
-          true
-        </Expanded>
-      </Expression>
-      <Section name="A section">
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TrickyTests.cpp" >
-          <Original>
-            Catch::isTrue( true )
-          </Original>
-          <Expanded>
-            true
-          </Expanded>
-        </Expression>
-        <OverallResults successes="1" failures="0"/>
-      </Section>
-      <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TrickyTests.cpp" >
-        <Original>
-          Catch::isTrue( true )
-        </Original>
-        <Expanded>
-          true
-        </Expanded>
-      </Expression>
       <Section name="A section">
         <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/TrickyTests.cpp" >
           <Original>
@@ -6692,32 +6556,6 @@
     </TestCase>
     <TestCase name="Scenario: Do that thing with the thing">
       <Section name="Given: This stuff exists">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="Given: This stuff exists">
-        <Section name="When: I do this">
-          <OverallResults successes="0" failures="0"/>
-        </Section>
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="Given: This stuff exists">
-        <Section name="When: I do this">
-          <Section name="Then: it should do this">
-            <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
-              <Original>
-                itDoesThis()
-              </Original>
-              <Expanded>
-                true
-              </Expanded>
-            </Expression>
-            <OverallResults successes="1" failures="0"/>
-          </Section>
-          <OverallResults successes="1" failures="0"/>
-        </Section>
-        <OverallResults successes="1" failures="0"/>
-      </Section>
-      <Section name="Given: This stuff exists">
         <Section name="When: I do this">
           <Section name="Then: it should do this">
             <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
@@ -6757,100 +6595,6 @@
             0 == 0
           </Expanded>
         </Expression>
-        <OverallResults successes="1" failures="0"/>
-      </Section>
-      <Section name="Given: an empty vector">
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
-          <Original>
-            v.size() == 0
-          </Original>
-          <Expanded>
-            0 == 0
-          </Expanded>
-        </Expression>
-        <Section name="When: it is made larger">
-          <OverallResults successes="0" failures="0"/>
-        </Section>
-        <OverallResults successes="1" failures="0"/>
-      </Section>
-      <Section name="Given: an empty vector">
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
-          <Original>
-            v.size() == 0
-          </Original>
-          <Expanded>
-            0 == 0
-          </Expanded>
-        </Expression>
-        <Section name="When: it is made larger">
-          <Section name="Then: the size and capacity go up">
-            <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
-              <Original>
-                v.size() == 10
-              </Original>
-              <Expanded>
-                10 == 10
-              </Expanded>
-            </Expression>
-            <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
-              <Original>
-                v.capacity() >= 10
-              </Original>
-              <Expanded>
-                10 >= 10
-              </Expanded>
-            </Expression>
-            <OverallResults successes="2" failures="0"/>
-          </Section>
-          <OverallResults successes="2" failures="0"/>
-        </Section>
-        <OverallResults successes="3" failures="0"/>
-      </Section>
-      <Section name="Given: an empty vector">
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
-          <Original>
-            v.size() == 0
-          </Original>
-          <Expanded>
-            0 == 0
-          </Expanded>
-        </Expression>
-        <Section name="When: it is made larger">
-          <Section name="Then: the size and capacity go up">
-            <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
-              <Original>
-                v.size() == 10
-              </Original>
-              <Expanded>
-                10 == 10
-              </Expanded>
-            </Expression>
-            <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
-              <Original>
-                v.capacity() >= 10
-              </Original>
-              <Expanded>
-                10 >= 10
-              </Expanded>
-            </Expression>
-            <Section name="And when: it is made smaller again">
-              <OverallResults successes="0" failures="0"/>
-            </Section>
-            <OverallResults successes="2" failures="0"/>
-          </Section>
-          <OverallResults successes="2" failures="0"/>
-        </Section>
-        <OverallResults successes="3" failures="0"/>
-      </Section>
-      <Section name="Given: an empty vector">
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
-          <Original>
-            v.size() == 0
-          </Original>
-          <Expanded>
-            0 == 0
-          </Expanded>
-        </Expression>
         <Section name="When: it is made larger">
           <Section name="Then: the size and capacity go up">
             <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
@@ -6907,20 +6651,6 @@
           </Expanded>
         </Expression>
         <Section name="When: we reserve more space">
-          <OverallResults successes="0" failures="0"/>
-        </Section>
-        <OverallResults successes="1" failures="0"/>
-      </Section>
-      <Section name="Given: an empty vector">
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
-          <Original>
-            v.size() == 0
-          </Original>
-          <Expanded>
-            0 == 0
-          </Expanded>
-        </Expression>
-        <Section name="When: we reserve more space">
           <Section name="Then: The capacity is increased but the size remains the same">
             <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/BDDTests.cpp" >
               <Original>
@@ -6948,15 +6678,6 @@
     </TestCase>
     <TestCase name="Scenario: This is a really long scenario name to see how the list command deals with wrapping">
       <Section name="Given: A section name that is so long that it cannot fit in a single console width">
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="Given: A section name that is so long that it cannot fit in a single console width">
-        <Section name="When: The test headers are printed as part of the normal running of the scenario">
-          <OverallResults successes="0" failures="0"/>
-        </Section>
-        <OverallResults successes="0" failures="0"/>
-      </Section>
-      <Section name="Given: A section name that is so long that it cannot fit in a single console width">
         <Section name="When: The test headers are printed as part of the normal running of the scenario">
           <Section name="Then: The, deliberately very long and overly verbose (you see what I did there?) section names must wrap, along with an indent">
             <OverallResults successes="1" failures="0"/>
@@ -6976,14 +6697,6 @@
           !false
         </Expanded>
       </Expression>
-      <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-        <Original>
-          !testCaseTracker.isCompleted()
-        </Original>
-        <Expanded>
-          !false
-        </Expanded>
-      </Expression>
       <Section name="test case with no sections">
         <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
           <Original>
@@ -7014,30 +6727,6 @@
       <Section name="test case with one section">
         <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
           <Original>
-            !testCaseTracker.enterSection( section1Name )
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
-            !testCaseTracker.isCompleted()
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
-            !testCaseTracker.isCompleted()
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
             testCaseTracker.enterSection( section1Name )
           </Original>
           <Expanded>
@@ -7046,13 +6735,29 @@
         </Expression>
         <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
           <Original>
+            !testCaseTracker.isCompleted()
+          </Original>
+          <Expanded>
+            !false
+          </Expanded>
+        </Expression>
+        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
+          <Original>
             testCaseTracker.isCompleted()
           </Original>
           <Expanded>
             true
           </Expanded>
         </Expression>
-        <OverallResults successes="5" failures="0"/>
+        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
+          <Original>
+            !testCaseTracker.enterSection( section1Name )
+          </Original>
+          <Expanded>
+            !false
+          </Expanded>
+        </Expression>
+        <OverallResults successes="4" failures="0"/>
       </Section>
       <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
         <Original>
@@ -7065,30 +6770,6 @@
       <Section name="test case with two consecutive sections">
         <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
           <Original>
-            !testCaseTracker.enterSection( section1Name )
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
-            !testCaseTracker.enterSection( section2Name )
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
-            !testCaseTracker.isCompleted()
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
             testCaseTracker.enterSection( section1Name )
           </Original>
           <Expanded>
@@ -7135,7 +6816,7 @@
             true
           </Expanded>
         </Expression>
-        <OverallResults successes="9" failures="0"/>
+        <OverallResults successes="6" failures="0"/>
       </Section>
       <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
         <Original>
@@ -7148,46 +6829,6 @@
       <Section name="test case with one section within another">
         <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
           <Original>
-            !testCaseTracker.enterSection( section1Name )
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
-            !testCaseTracker.isCompleted()
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
-            testCaseTracker.enterSection( section1Name )
-          </Original>
-          <Expanded>
-            true
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
-            !testCaseTracker.enterSection( section2Name )
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
-            !testCaseTracker.isCompleted()
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
-          <Original>
             testCaseTracker.enterSection( section1Name )
           </Original>
           <Expanded>
@@ -7204,17 +6845,25 @@
         </Expression>
         <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
           <Original>
+            !testCaseTracker.isCompleted()
+          </Original>
+          <Expanded>
+            !false
+          </Expanded>
+        </Expression>
+        <Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/SelfTest/SectionTrackerTests.cpp" >
+          <Original>
             testCaseTracker.isCompleted()
           </Original>
           <Expanded>
             true
           </Expanded>
         </Expression>
-        <OverallResults successes="8" failures="0"/>
+        <OverallResults successes="4" failures="0"/>
       </Section>
       <OverallResult success="true"/>
     </TestCase>
-    <OverallResults successes="567" failures="110"/>
+    <OverallResults successes="536" failures="110"/>
   </Group>
-  <OverallResults successes="567" failures="110"/>
+  <OverallResults successes="536" failures="110"/>
 </Catch>
diff --git a/projects/SelfTest/ExceptionTests.cpp b/projects/SelfTest/ExceptionTests.cpp
index 2dac0c1..9a325c5 100644
--- a/projects/SelfTest/ExceptionTests.cpp
+++ b/projects/SelfTest/ExceptionTests.cpp
@@ -66,6 +66,18 @@
     CHECK( thisThrows() == 0 );
 }
 
+TEST_CASE( "When unchecked exceptions are thrown during a REQUIRE the test should abort fail", "[.][failing]" )
+{
+    REQUIRE( thisThrows() == 0 );
+    FAIL( "This should never happen" );
+}
+
+TEST_CASE( "When unchecked exceptions are thrown during a CHECK the test should abort and fail", "[.][failing]" )
+{
+    CHECK( thisThrows() == 0 );
+    FAIL( "This should never happen" );
+}
+
 TEST_CASE( "When unchecked exceptions are thrown, but caught, they do not affect the test", "" )
 {
     try
diff --git a/projects/SelfTest/MiscTests.cpp b/projects/SelfTest/MiscTests.cpp
index efcd458..7c028ff 100644
--- a/projects/SelfTest/MiscTests.cpp
+++ b/projects/SelfTest/MiscTests.cpp
@@ -333,3 +333,9 @@
 
     FAIL("to infinity and beyond");
 }
+
+TEST_CASE("not allowed", "[!throws]")
+{
+    // This test case should not be included if you run with -e on the command line
+    SUCCEED();
+}
diff --git a/projects/SelfTest/SectionTrackerTests.cpp b/projects/SelfTest/SectionTrackerTests.cpp
index eaf3d2a..df0f8ab 100644
--- a/projects/SelfTest/SectionTrackerTests.cpp
+++ b/projects/SelfTest/SectionTrackerTests.cpp
@@ -38,13 +38,14 @@
         {
             TestCaseTracker::Guard guard( testCaseTracker );
 
-            // Enter section? - no, not yet
-            CHECK_FALSE( testCaseTracker.enterSection( section1Name ) );
+            // Enter section? - yes
+            CHECK( testCaseTracker.enterSection( section1Name ) );
             CHECK_FALSE( testCaseTracker.isCompleted() );
+            testCaseTracker.leaveSection();
 
-            // Leave test case - incomplete (still need to visit section)
+            // Leave test case - now complete
         }
-        CHECK_FALSE( testCaseTracker.isCompleted() );
+        CHECK( testCaseTracker.isCompleted() );
 
         // ...
 
@@ -52,13 +53,9 @@
         {
             TestCaseTracker::Guard guard( testCaseTracker );
 
-            // Enter section? - yes
-            CHECK( testCaseTracker.enterSection( section1Name ) );
-
-            // Leave section and test case - now complete
-            testCaseTracker.leaveSection();
+            // Enter section? - no - now complete
+            CHECK_FALSE( testCaseTracker.enterSection( section1Name ) );
         }
-        CHECK( testCaseTracker.isCompleted() );
     }
 
     SECTION( "test case with two consecutive sections" ) {
@@ -67,27 +64,11 @@
         {
             TestCaseTracker::Guard guard( testCaseTracker );
 
-            // Enter section 1? - no, not yet
-            CHECK_FALSE( testCaseTracker.enterSection( section1Name ) );
-
-            // Enter section 2? - no, not yet
-            CHECK_FALSE( testCaseTracker.enterSection( section2Name ) );
-
-            // Leave test case - incomplete (still need to visit sections)
-        }
-        CHECK_FALSE( testCaseTracker.isCompleted() );
-
-        // ...
-
-        // Enter test case again
-        {
-            TestCaseTracker::Guard guard( testCaseTracker );
-
             // Enter section 1? - yes
             CHECK( testCaseTracker.enterSection( section1Name ) );
             testCaseTracker.leaveSection();
 
-            // Enter section 2? - no, not yet
+            // Enter section 2? - no - we just exected section 1
             CHECK_FALSE( testCaseTracker.enterSection( section2Name ) );
 
             // Leave test case - incomplete (still need to visit section 2)
@@ -103,7 +84,7 @@
             // Enter section 1? - no, already done now
             CHECK_FALSE( testCaseTracker.enterSection( section1Name ) );
 
-            // Enter section 2? - yes - finally
+            // Enter section 2? - yes
             CHECK( testCaseTracker.enterSection( section2Name ) );
             testCaseTracker.leaveSection();
 
@@ -114,19 +95,6 @@
 
     SECTION( "test case with one section within another" ) {
 
-        // Enter test case
-        {
-            TestCaseTracker::Guard guard( testCaseTracker );
-
-            // Enter section 1? - no, not yet
-            CHECK_FALSE( testCaseTracker.enterSection( section1Name ) );
-
-            // Leave test case - incomplete (still need to visit sections)
-        }
-        CHECK_FALSE( testCaseTracker.isCompleted() );
-
-        // ...
-
         // Enter test case again
         {
             TestCaseTracker::Guard guard( testCaseTracker );
@@ -134,26 +102,11 @@
             // Enter section 1? - yes
             CHECK( testCaseTracker.enterSection( section1Name ) );
 
-            // Enter section 2? - no, not yet
-            CHECK_FALSE( testCaseTracker.enterSection( section2Name ) );
-
-            testCaseTracker.leaveSection(); // section 1 - incomplete (section 2)
-
-            // Leave test case - incomplete
-        }
-        CHECK_FALSE( testCaseTracker.isCompleted() );
-
-        // ...
-
-        // Enter test case again
-        {
-            TestCaseTracker::Guard guard( testCaseTracker );
-
-            // Enter section 1? - yes - so we can execute section 2
-            CHECK( testCaseTracker.enterSection( section1Name ) );
-
-            // Enter section 2? - yes - finally
+            // Enter section 2? - yes
             CHECK( testCaseTracker.enterSection( section2Name ) );
+
+            CHECK_FALSE( testCaseTracker.isCompleted() );
+
             testCaseTracker.leaveSection(); // section 2
             testCaseTracker.leaveSection(); // section 1
 
diff --git a/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.pbxproj b/projects/XCode/CatchSelfTest/CatchSelfTest.xcodeproj/project.pbxproj
similarity index 98%
rename from projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.pbxproj
rename to projects/XCode/CatchSelfTest/CatchSelfTest.xcodeproj/project.pbxproj
index 03225a7..e4a77c0 100644
--- a/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.pbxproj
+++ b/projects/XCode/CatchSelfTest/CatchSelfTest.xcodeproj/project.pbxproj
@@ -66,7 +66,6 @@
 		263FD06017AF8DF200988A20 /* catch_timer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_timer.hpp; sourceTree = "<group>"; };
 		263FD06117AF8DF200988A20 /* catch_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_timer.h; sourceTree = "<group>"; };
 		266B06B616F3A60A004ED264 /* VariadicMacrosTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VariadicMacrosTests.cpp; path = ../../../SelfTest/VariadicMacrosTests.cpp; sourceTree = "<group>"; };
-		266E9AD117230ACF0061DAB2 /* catch_text.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_text.hpp; sourceTree = "<group>"; };
 		266ECD73170F3C620030D735 /* BDDTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BDDTests.cpp; path = ../../../SelfTest/BDDTests.cpp; sourceTree = "<group>"; };
 		266ECD8C1713614B0030D735 /* catch_legacy_reporter_adapter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_legacy_reporter_adapter.hpp; sourceTree = "<group>"; };
 		266ECD8D1713614B0030D735 /* catch_legacy_reporter_adapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_legacy_reporter_adapter.h; sourceTree = "<group>"; };
@@ -76,12 +75,12 @@
 		26847E5C16BBACB60043B9C1 /* catch_message.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_message.hpp; sourceTree = "<group>"; };
 		26847E5D16BBADB40043B9C1 /* catch_message.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_message.cpp; path = ../../../SelfTest/SurrogateCpps/catch_message.cpp; sourceTree = "<group>"; };
 		268F47B018A93F7800D8C14F /* catch_clara.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_clara.h; sourceTree = "<group>"; };
-		268F47B118A944DB00D8C14F /* tbc_text_format.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = tbc_text_format.h; path = ../../../../include/internal/tbc_text_format.h; sourceTree = "<group>"; };
+		26926E8318D7777D004E10F2 /* clara.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = clara.h; path = ../../../../include/external/clara.h; sourceTree = "<group>"; };
+		26926E8418D77809004E10F2 /* tbc_text_format.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tbc_text_format.h; path = ../../../../include/external/tbc_text_format.h; sourceTree = "<group>"; };
 		26948284179A9AB900ED166E /* SectionTrackerTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SectionTrackerTests.cpp; path = ../../../SelfTest/SectionTrackerTests.cpp; sourceTree = "<group>"; };
 		26948287179EF7F900ED166E /* catch_test_case_tracker.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_test_case_tracker.hpp; sourceTree = "<group>"; };
 		2694A1FB16A0000E004816E3 /* catch_text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = catch_text.cpp; sourceTree = "<group>"; };
 		26AEAF1617BEA18E009E32C9 /* catch_platform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_platform.h; sourceTree = "<group>"; };
-		26C5F3EC17514B970056FB3C /* clara.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = clara.h; path = ../../../../include/internal/clara.h; sourceTree = "<group>"; };
 		26DACF2F17206D3400A21326 /* catch_text.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_text.h; sourceTree = "<group>"; };
 		4A084F1C15DACEEA0027E631 /* catch_test_case_info.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_test_case_info.hpp; sourceTree = "<group>"; };
 		4A084F1D15DAD15F0027E631 /* catch_test_spec.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = catch_test_spec.h; sourceTree = "<group>"; };
@@ -199,8 +198,8 @@
 		26C5F3EB17514B670056FB3C /* External */ = {
 			isa = PBXGroup;
 			children = (
-				26C5F3EC17514B970056FB3C /* clara.h */,
-				268F47B118A944DB00D8C14F /* tbc_text_format.h */,
+				26926E8418D77809004E10F2 /* tbc_text_format.h */,
+				26926E8318D7777D004E10F2 /* clara.h */,
 			);
 			name = External;
 			sourceTree = "<group>";
@@ -326,7 +325,6 @@
 				4A6D0C5F149B3E3D00DB3EAA /* catch_section.hpp */,
 				261488FA184C81130041FBEB /* catch_test_spec.hpp */,
 				263FD06017AF8DF200988A20 /* catch_timer.hpp */,
-				266E9AD117230ACF0061DAB2 /* catch_text.hpp */,
 				4A4B0F9C15CEFA8300AE2392 /* catch_impl.hpp */,
 				4A4B0F9715CE6CFB00AE2392 /* catch_registry_hub.hpp */,
 				4A6D0C50149B3E3D00DB3EAA /* catch_generators_impl.hpp */,
diff --git a/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/projects/XCode/CatchSelfTest/CatchSelfTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
rename to projects/XCode/CatchSelfTest/CatchSelfTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/projects/XCode/CatchSelfTest/CatchSelfTest.xcodeproj/project.xcworkspace/xcshareddata/CatchSelfTest.xccheckout b/projects/XCode/CatchSelfTest/CatchSelfTest.xcodeproj/project.xcworkspace/xcshareddata/CatchSelfTest.xccheckout
new file mode 100644
index 0000000..149325a
--- /dev/null
+++ b/projects/XCode/CatchSelfTest/CatchSelfTest.xcodeproj/project.xcworkspace/xcshareddata/CatchSelfTest.xccheckout
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDESourceControlProjectFavoriteDictionaryKey</key>
+	<false/>
+	<key>IDESourceControlProjectIdentifier</key>
+	<string>034502BF-F920-4DB6-82F5-71E61E50118C</string>
+	<key>IDESourceControlProjectName</key>
+	<string>CatchSelfTest</string>
+	<key>IDESourceControlProjectOriginsDictionary</key>
+	<dict>
+		<key>01DD8CA9-7DC3-46BC-B998-EFF40EA3485F</key>
+		<string>ssh://github.com/philsquared/Catch.git</string>
+	</dict>
+	<key>IDESourceControlProjectPath</key>
+	<string>projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.xcworkspace</string>
+	<key>IDESourceControlProjectRelativeInstallPathDictionary</key>
+	<dict>
+		<key>01DD8CA9-7DC3-46BC-B998-EFF40EA3485F</key>
+		<string>../../../../..</string>
+	</dict>
+	<key>IDESourceControlProjectURL</key>
+	<string>ssh://github.com/philsquared/Catch.git</string>
+	<key>IDESourceControlProjectVersion</key>
+	<integer>110</integer>
+	<key>IDESourceControlProjectWCCIdentifier</key>
+	<string>01DD8CA9-7DC3-46BC-B998-EFF40EA3485F</string>
+	<key>IDESourceControlProjectWCConfigurations</key>
+	<array>
+		<dict>
+			<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
+			<string>public.vcs.git</string>
+			<key>IDESourceControlWCCIdentifierKey</key>
+			<string>01DD8CA9-7DC3-46BC-B998-EFF40EA3485F</string>
+			<key>IDESourceControlWCCName</key>
+			<string>Catch</string>
+		</dict>
+	</array>
+</dict>
+</plist>
diff --git a/projects/XCode4/CatchSelfTest/CatchSelfTest/CatchSelfTest.1 b/projects/XCode/CatchSelfTest/CatchSelfTest/CatchSelfTest.1
similarity index 100%
rename from projects/XCode4/CatchSelfTest/CatchSelfTest/CatchSelfTest.1
rename to projects/XCode/CatchSelfTest/CatchSelfTest/CatchSelfTest.1
diff --git a/projects/XCode4/CatchSelfTest/CatchSelfTest/catch_text.cpp b/projects/XCode/CatchSelfTest/CatchSelfTest/catch_text.cpp
similarity index 100%
rename from projects/XCode4/CatchSelfTest/CatchSelfTest/catch_text.cpp
rename to projects/XCode/CatchSelfTest/CatchSelfTest/catch_text.cpp
diff --git a/projects/XCode4/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.pbxproj b/projects/XCode/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.pbxproj
similarity index 100%
rename from projects/XCode4/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.pbxproj
rename to projects/XCode/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.pbxproj
diff --git a/projects/XCode4/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/projects/XCode/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from projects/XCode4/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.xcworkspace/contents.xcworkspacedata
rename to projects/XCode/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/projects/XCode/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.xcworkspace/xcshareddata/CatchSelfTestSingle.xccheckout b/projects/XCode/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.xcworkspace/xcshareddata/CatchSelfTestSingle.xccheckout
new file mode 100644
index 0000000..fd24e72
--- /dev/null
+++ b/projects/XCode/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.xcworkspace/xcshareddata/CatchSelfTestSingle.xccheckout
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDESourceControlProjectFavoriteDictionaryKey</key>
+	<false/>
+	<key>IDESourceControlProjectIdentifier</key>
+	<string>3A514CAE-B659-4429-93A3-39F9C0349EC4</string>
+	<key>IDESourceControlProjectName</key>
+	<string>CatchSelfTestSingle</string>
+	<key>IDESourceControlProjectOriginsDictionary</key>
+	<dict>
+		<key>01DD8CA9-7DC3-46BC-B998-EFF40EA3485F</key>
+		<string>ssh://github.com/philsquared/Catch.git</string>
+	</dict>
+	<key>IDESourceControlProjectPath</key>
+	<string>projects/XCode4/CatchSelfTest/CatchSelfTestSingle.xcodeproj/project.xcworkspace</string>
+	<key>IDESourceControlProjectRelativeInstallPathDictionary</key>
+	<dict>
+		<key>01DD8CA9-7DC3-46BC-B998-EFF40EA3485F</key>
+		<string>../../../../..</string>
+	</dict>
+	<key>IDESourceControlProjectURL</key>
+	<string>ssh://github.com/philsquared/Catch.git</string>
+	<key>IDESourceControlProjectVersion</key>
+	<integer>110</integer>
+	<key>IDESourceControlProjectWCCIdentifier</key>
+	<string>01DD8CA9-7DC3-46BC-B998-EFF40EA3485F</string>
+	<key>IDESourceControlProjectWCConfigurations</key>
+	<array>
+		<dict>
+			<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
+			<string>public.vcs.git</string>
+			<key>IDESourceControlWCCIdentifierKey</key>
+			<string>01DD8CA9-7DC3-46BC-B998-EFF40EA3485F</string>
+			<key>IDESourceControlWCCName</key>
+			<string>Catch</string>
+		</dict>
+	</array>
+</dict>
+</plist>
diff --git a/projects/XCode4/CatchSelfTest/CatchSelfTestSingle/dummy.txt b/projects/XCode/CatchSelfTest/CatchSelfTestSingle/dummy.txt
similarity index 100%
rename from projects/XCode4/CatchSelfTest/CatchSelfTestSingle/dummy.txt
rename to projects/XCode/CatchSelfTest/CatchSelfTestSingle/dummy.txt
diff --git a/projects/XCode4/OCTest/OCTest.xcodeproj/project.pbxproj b/projects/XCode/OCTest/OCTest.xcodeproj/project.pbxproj
similarity index 100%
rename from projects/XCode4/OCTest/OCTest.xcodeproj/project.pbxproj
rename to projects/XCode/OCTest/OCTest.xcodeproj/project.pbxproj
diff --git a/projects/XCode4/OCTest/OCTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/projects/XCode/OCTest/OCTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from projects/XCode4/OCTest/OCTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
rename to projects/XCode/OCTest/OCTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/projects/XCode/OCTest/OCTest.xcodeproj/project.xcworkspace/xcshareddata/OCTest.xccheckout b/projects/XCode/OCTest/OCTest.xcodeproj/project.xcworkspace/xcshareddata/OCTest.xccheckout
new file mode 100644
index 0000000..2480364
--- /dev/null
+++ b/projects/XCode/OCTest/OCTest.xcodeproj/project.xcworkspace/xcshareddata/OCTest.xccheckout
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDESourceControlProjectFavoriteDictionaryKey</key>
+	<false/>
+	<key>IDESourceControlProjectIdentifier</key>
+	<string>2F99C19E-ADF6-4D99-86C7-7A7830677E7D</string>
+	<key>IDESourceControlProjectName</key>
+	<string>OCTest</string>
+	<key>IDESourceControlProjectOriginsDictionary</key>
+	<dict>
+		<key>DE66138E-2FC7-4C1B-9901-82CBF6694223</key>
+		<string>ssh://github.com/philsquared/Catch.git</string>
+	</dict>
+	<key>IDESourceControlProjectPath</key>
+	<string>projects/XCode4/OCTest/OCTest.xcodeproj/project.xcworkspace</string>
+	<key>IDESourceControlProjectRelativeInstallPathDictionary</key>
+	<dict>
+		<key>DE66138E-2FC7-4C1B-9901-82CBF6694223</key>
+		<string>../../../../..</string>
+	</dict>
+	<key>IDESourceControlProjectURL</key>
+	<string>ssh://github.com/philsquared/Catch.git</string>
+	<key>IDESourceControlProjectVersion</key>
+	<integer>110</integer>
+	<key>IDESourceControlProjectWCCIdentifier</key>
+	<string>DE66138E-2FC7-4C1B-9901-82CBF6694223</string>
+	<key>IDESourceControlProjectWCConfigurations</key>
+	<array>
+		<dict>
+			<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
+			<string>public.vcs.git</string>
+			<key>IDESourceControlWCCIdentifierKey</key>
+			<string>DE66138E-2FC7-4C1B-9901-82CBF6694223</string>
+			<key>IDESourceControlWCCName</key>
+			<string>Catch</string>
+		</dict>
+	</array>
+</dict>
+</plist>
diff --git a/projects/XCode4/OCTest/OCTest/CatchOCTestCase.h b/projects/XCode/OCTest/OCTest/CatchOCTestCase.h
similarity index 100%
rename from projects/XCode4/OCTest/OCTest/CatchOCTestCase.h
rename to projects/XCode/OCTest/OCTest/CatchOCTestCase.h
diff --git a/projects/XCode4/OCTest/OCTest/CatchOCTestCase.mm b/projects/XCode/OCTest/OCTest/CatchOCTestCase.mm
similarity index 100%
rename from projects/XCode4/OCTest/OCTest/CatchOCTestCase.mm
rename to projects/XCode/OCTest/OCTest/CatchOCTestCase.mm
diff --git a/projects/XCode4/OCTest/OCTest/Main.mm b/projects/XCode/OCTest/OCTest/Main.mm
similarity index 100%
rename from projects/XCode4/OCTest/OCTest/Main.mm
rename to projects/XCode/OCTest/OCTest/Main.mm
diff --git a/projects/XCode4/OCTest/OCTest/OCTest.1 b/projects/XCode/OCTest/OCTest/OCTest.1
similarity index 100%
rename from projects/XCode4/OCTest/OCTest/OCTest.1
rename to projects/XCode/OCTest/OCTest/OCTest.1
diff --git a/projects/XCode4/OCTest/OCTest/OCTest.mm b/projects/XCode/OCTest/OCTest/OCTest.mm
similarity index 100%
rename from projects/XCode4/OCTest/OCTest/OCTest.mm
rename to projects/XCode/OCTest/OCTest/OCTest.mm
diff --git a/projects/XCode4/OCTest/OCTest/TestObj.h b/projects/XCode/OCTest/OCTest/TestObj.h
similarity index 100%
rename from projects/XCode4/OCTest/OCTest/TestObj.h
rename to projects/XCode/OCTest/OCTest/TestObj.h
diff --git a/projects/XCode4/OCTest/OCTest/TestObj.m b/projects/XCode/OCTest/OCTest/TestObj.m
similarity index 100%
rename from projects/XCode4/OCTest/OCTest/TestObj.m
rename to projects/XCode/OCTest/OCTest/TestObj.m
diff --git a/projects/XCode4/iOSTest/iOSTest.xcodeproj/project.pbxproj b/projects/XCode/iOSTest/iOSTest.xcodeproj/project.pbxproj
similarity index 100%
rename from projects/XCode4/iOSTest/iOSTest.xcodeproj/project.pbxproj
rename to projects/XCode/iOSTest/iOSTest.xcodeproj/project.pbxproj
diff --git a/projects/XCode4/iOSTest/iOSTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/projects/XCode/iOSTest/iOSTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from projects/XCode4/iOSTest/iOSTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
rename to projects/XCode/iOSTest/iOSTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/projects/XCode4/iOSTest/iOSTest/OCTest.mm b/projects/XCode/iOSTest/iOSTest/OCTest.mm
similarity index 100%
rename from projects/XCode4/iOSTest/iOSTest/OCTest.mm
rename to projects/XCode/iOSTest/iOSTest/OCTest.mm
diff --git a/projects/XCode4/iOSTest/iOSTest/TestObj.h b/projects/XCode/iOSTest/iOSTest/TestObj.h
similarity index 100%
rename from projects/XCode4/iOSTest/iOSTest/TestObj.h
rename to projects/XCode/iOSTest/iOSTest/TestObj.h
diff --git a/projects/XCode4/iOSTest/iOSTest/TestObj.m b/projects/XCode/iOSTest/iOSTest/TestObj.m
similarity index 100%
rename from projects/XCode4/iOSTest/iOSTest/TestObj.m
rename to projects/XCode/iOSTest/iOSTest/TestObj.m
diff --git a/projects/XCode4/iOSTest/iOSTest/en.lproj/InfoPlist.strings b/projects/XCode/iOSTest/iOSTest/en.lproj/InfoPlist.strings
similarity index 100%
rename from projects/XCode4/iOSTest/iOSTest/en.lproj/InfoPlist.strings
rename to projects/XCode/iOSTest/iOSTest/en.lproj/InfoPlist.strings
diff --git a/projects/XCode4/iOSTest/iOSTest/iOSTest-Info.plist b/projects/XCode/iOSTest/iOSTest/iOSTest-Info.plist
similarity index 100%
rename from projects/XCode4/iOSTest/iOSTest/iOSTest-Info.plist
rename to projects/XCode/iOSTest/iOSTest/iOSTest-Info.plist
diff --git a/projects/XCode4/iOSTest/iOSTest/iOSTest-Prefix.pch b/projects/XCode/iOSTest/iOSTest/iOSTest-Prefix.pch
similarity index 100%
rename from projects/XCode4/iOSTest/iOSTest/iOSTest-Prefix.pch
rename to projects/XCode/iOSTest/iOSTest/iOSTest-Prefix.pch
diff --git a/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/xcuserdata/Phil.xcuserdatad/xcschemes/xcschememanagement.plist b/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/xcuserdata/Phil.xcuserdatad/xcschemes/xcschememanagement.plist
deleted file mode 100644
index c66f61d..0000000
--- a/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/xcuserdata/Phil.xcuserdatad/xcschemes/xcschememanagement.plist
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>SchemeUserState</key>
-	<dict>
-		<key>CatchSelfTest.xcscheme</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>0</integer>
-		</dict>
-	</dict>
-	<key>SuppressBuildableAutocreation</key>
-	<dict>
-		<key>4A6D0C1F149B3D3B00DB3EAA</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-	</dict>
-</dict>
-</plist>
diff --git a/projects/runners/iTchRunner/internal/iTchRunnerMainView.h b/projects/runners/iTchRunner/internal/iTchRunnerMainView.h
index f63fbb0..ee78004 100644
--- a/projects/runners/iTchRunner/internal/iTchRunnerMainView.h
+++ b/projects/runners/iTchRunner/internal/iTchRunnerMainView.h
@@ -37,18 +37,18 @@
     {
         // Initialization code
         self.backgroundColor = [UIColor blackColor];
-        
+
         appName = [[UITextField alloc] initWithFrame: CGRectMake( 0, 50, 320, 50 )];
         [self addSubview: appName];
         arcSafeRelease( appName );
         appName.textColor = [[UIColor alloc] initWithRed:0.35 green:0.35 blue:1 alpha:1];
         arcSafeRelease( appName.textColor );
-        appName.textAlignment = UITextAlignmentCenter; // or NSTextAlignmentCenter
-        
+        appName.textAlignment = NSTextAlignmentCenter;
+
         appName.text = [NSString stringWithFormat:@"CATCH tests"];
 //        [self performSelector: @selector(showAlert) withObject:nil afterDelay:0.1];
         [self performSelectorOnMainThread:@selector(showAlert) withObject:nil waitUntilDone:NO];
-        
+
     }
     return self;
 }
diff --git a/scripts/approvalTests.py b/scripts/approvalTests.py
index 5db26d7..329c99b 100644
--- a/scripts/approvalTests.py
+++ b/scripts/approvalTests.py
@@ -19,7 +19,7 @@
 if len(sys.argv) == 2:
 	cmdPath = sys.argv[1]
 else:
-	cmdPath = os.path.join( catchPath, 'projects/XCode4/CatchSelfTest/DerivedData/CatchSelfTest/Build/Products/Debug/CatchSelfTest' )
+	cmdPath = os.path.join( catchPath, 'projects/XCode/CatchSelfTest/DerivedData/CatchSelfTest/Build/Products/Debug/CatchSelfTest' )
 
 overallResult = 0
 
diff --git a/single_include/catch.hpp b/single_include/catch.hpp
index 20b2502..57cbca0 100644
--- a/single_include/catch.hpp
+++ b/single_include/catch.hpp
@@ -1,6 +1,6 @@
 /*
- *  CATCH v1.0 build 30 (master branch)
- *  Generated: 2014-03-07 06:56:50.010459
+ *  CATCH v1.0 build 39 (master branch)
+ *  Generated: 2014-04-21 18:50:19.658444
  *  ----------------------------------------------------------
  *  This file has been merged from multiple headers. Please don't edit it directly
  *  Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.
@@ -23,6 +23,9 @@
 
 #ifdef CATCH_CONFIG_MAIN
 #  define CATCH_CONFIG_RUNNER
+#endif
+
+#ifdef CATCH_CONFIG_RUNNER
 #  ifndef CLARA_CONFIG_MAIN
 #    define CLARA_CONFIG_MAIN_NOT_DEFINED
 #    define CLARA_CONFIG_MAIN
@@ -136,6 +139,29 @@
 
 #endif
 
+////////////////////////////////////////////////////////////////////////////////
+// C++ language feature support
+
+// detect language version:
+#if (__cplusplus == 201103L)
+#  define CATCH_CPP11
+#  define CATCH_CPP11_OR_GREATER
+#elif (__cplusplus >= 201103L)
+#  define CATCH_CPP11_OR_GREATER
+#endif
+
+// noexcept support:
+#ifdef CATCH_CPP11_OR_GREATER
+#  if (__has_feature(cxx_noexcept))
+#    define CATCH_NOEXCEPT noexcept
+#    define CATCH_NOEXCEPT_IS(x) noexcept(x)
+#  endif
+#endif
+#ifndef CATCH_NO_EXCEPT
+#  define CATCH_NOEXCEPT throw()
+#  define CATCH_NOEXCEPT_IS(x)
+#endif
+
 namespace Catch {
 
     class NonCopyable {
@@ -193,6 +219,11 @@
         SourceLineInfo();
         SourceLineInfo( char const* _file, std::size_t _line );
         SourceLineInfo( SourceLineInfo const& other );
+#  ifdef CATCH_CPP11_OR_GREATER
+        SourceLineInfo( SourceLineInfo && )                  = default;
+        SourceLineInfo& operator = ( SourceLineInfo const& ) = default;
+        SourceLineInfo& operator = ( SourceLineInfo && )     = default;
+#  endif
         bool empty() const;
         bool operator == ( SourceLineInfo const& other ) const;
 
@@ -234,9 +265,9 @@
     public:
         NotImplementedException( SourceLineInfo const& lineInfo );
 
-        virtual ~NotImplementedException() throw() {}
+        virtual ~NotImplementedException() CATCH_NOEXCEPT {}
 
-        virtual const char* what() const throw();
+        virtual const char* what() const CATCH_NOEXCEPT;
 
     private:
         std::string m_what;
@@ -417,11 +448,14 @@
     };
 
     class TestCase;
+    struct IConfig;
 
     struct ITestCaseRegistry {
         virtual ~ITestCaseRegistry();
         virtual std::vector<TestCase> const& getAllTests() const = 0;
-        virtual std::vector<TestCase> getMatchingTestCases( std::string const& rawTestSpec ) const = 0;
+        virtual void getFilteredTests( TestCaseFilters const& filters, IConfig const& config, std::vector<TestCase>& matchingTestCases ) const = 0;
+        virtual void getFilteredTests( IConfig const& config, std::vector<TestCase>& matchingTestCases ) const = 0;
+
     };
 }
 
@@ -976,6 +1010,12 @@
         AssertionResult();
         AssertionResult( AssertionInfo const& info, AssertionResultData const& data );
         ~AssertionResult();
+#  ifdef CATCH_CPP11_OR_GREATER
+         AssertionResult( AssertionResult const& )              = default;
+         AssertionResult( AssertionResult && )                  = default;
+         AssertionResult& operator = ( AssertionResult const& ) = default;
+         AssertionResult& operator = ( AssertionResult && )     = default;
+#  endif
 
         bool isOk() const;
         bool succeeded() const;
@@ -1214,14 +1254,21 @@
 
 namespace Catch {
 
-// Wraps the LHS of an expression and captures the operator and RHS (if any) - wrapping them all
-// in an ExpressionResultBuilder object
+// Wraps the LHS of an expression and captures the operator and RHS (if any) -
+// wrapping them all in an ExpressionResultBuilder object
 template<typename T>
 class ExpressionLhs {
-    void operator = ( ExpressionLhs const& );
+    ExpressionLhs& operator = ( ExpressionLhs const& );
+#  ifdef CATCH_CPP11_OR_GREATER
+    ExpressionLhs& operator = ( ExpressionLhs && ) = delete;
+#  endif
 
 public:
     ExpressionLhs( T lhs ) : m_lhs( lhs ) {}
+#  ifdef CATCH_CPP11_OR_GREATER
+    ExpressionLhs( ExpressionLhs const& ) = default;
+    ExpressionLhs( ExpressionLhs && )     = default;
+#  endif
 
     template<typename RhsT>
     ExpressionResultBuilder& operator == ( RhsT const& rhs ) {
@@ -1494,6 +1541,7 @@
 
 #include <iostream>
 #include <string>
+#include <vector>
 
 namespace Catch {
 
@@ -1514,6 +1562,8 @@
         Never
     }; };
 
+    class TestCaseFilters;
+
     struct IConfig : IShared {
 
         virtual ~IConfig();
@@ -1526,6 +1576,7 @@
         virtual bool warnAboutMissingAssertions() const = 0;
         virtual int abortAfter() const = 0;
         virtual ShowDurations::OrNot showDurations() const = 0;
+        virtual std::vector<TestCaseFilters> const& filters() const = 0;
     };
 }
 
@@ -1571,11 +1622,8 @@
 } // end namespace Catch
 
 ///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_ASSERTIONINFO_NAME INTERNAL_CATCH_UNIQUE_NAME( __assertionInfo )
-
-///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_ACCEPT_EXPR( evaluatedExpr, resultDisposition, originalExpr ) \
-    if( Catch::ResultAction::Value internal_catch_action = Catch::getResultCapture().acceptExpression( evaluatedExpr, INTERNAL_CATCH_ASSERTIONINFO_NAME )  ) { \
+    if( Catch::ResultAction::Value internal_catch_action = Catch::getResultCapture().acceptExpression( evaluatedExpr, __assertionInfo )  ) { \
         if( internal_catch_action & Catch::ResultAction::Debug ) CATCH_BREAK_INTO_DEBUGGER(); \
         if( internal_catch_action & Catch::ResultAction::Abort ) throw Catch::TestFailureException(); \
         if( !Catch::shouldContinueOnFailure( resultDisposition ) ) throw Catch::TestFailureException(); \
@@ -1583,20 +1631,16 @@
     }
 
 ///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_ACCEPT_INFO( expr, macroName, resultDisposition ) \
-    Catch::AssertionInfo INTERNAL_CATCH_ASSERTIONINFO_NAME( macroName, CATCH_INTERNAL_LINEINFO, expr, resultDisposition );
-
-///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \
     do { \
-        INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+        Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
         try { \
             INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionDecomposer()->*expr ).endExpression( resultDisposition ), resultDisposition, expr ); \
         } catch( Catch::TestFailureException& ) { \
             throw; \
         } catch( ... ) { \
             INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException(), \
-                resultDisposition | Catch::ResultDisposition::ContinueOnFailure, expr ); \
+                Catch::ResultDisposition::Normal, expr ); \
         } \
     } while( Catch::isTrue( false ) )
 
@@ -1613,7 +1657,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \
     do { \
-        INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+        Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
         try { \
             expr; \
             INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::Ok ), resultDisposition, false ); \
@@ -1641,14 +1685,14 @@
 ///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_THROWS( expr, exceptionType, resultDisposition, macroName ) \
     do { \
-        INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+        Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
         INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \
     } while( Catch::isTrue( false ) )
 
 ///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \
     do { \
-        INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+        Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
         INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \
         catch( ... ) { \
             INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException() ), \
@@ -1660,13 +1704,13 @@
 #ifdef CATCH_CONFIG_VARIADIC_MACROS
     #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \
         do { \
-            INTERNAL_CATCH_ACCEPT_INFO( "", macroName, resultDisposition ); \
+            Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \
             INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( messageType ) << __VA_ARGS__ +::Catch::StreamEndStop(), resultDisposition, true ) \
         } while( Catch::isTrue( false ) )
 #else
     #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \
         do { \
-            INTERNAL_CATCH_ACCEPT_INFO( "", macroName, resultDisposition ); \
+            Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \
             INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( messageType ) << log, resultDisposition, true ) \
         } while( Catch::isTrue( false ) )
 #endif
@@ -1678,7 +1722,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \
     do { \
-        INTERNAL_CATCH_ACCEPT_INFO( #arg " " #matcher, macroName, resultDisposition ); \
+        Catch::AssertionInfo __assertionInfo( macroName, CATCH_INTERNAL_LINEINFO, #arg " " #matcher, resultDisposition ); \
         try { \
             INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::expressionResultBuilderFromMatcher( ::Catch::Matchers::matcher, arg, #matcher ) ), resultDisposition, false ); \
         } catch( Catch::TestFailureException& ) { \
@@ -1807,6 +1851,12 @@
                     std::string const& name,
                     std::string const& description = "" );
         ~Section();
+#  ifdef CATCH_CPP11_OR_GREATER
+        Section( Section const& )              = default;
+        Section( Section && )                  = default;
+        Section& operator = ( Section const& ) = default;
+        Section& operator = ( Section && )     = default;
+#  endif
 
         // This indicates whether the section should be executed or not
         operator bool();
@@ -2408,6 +2458,7 @@
         std::string tagsAsString;
         SourceLineInfo lineInfo;
         bool isHidden;
+        bool throws;
     };
 
     class TestCase : protected TestCaseInfo {
@@ -2423,6 +2474,7 @@
         TestCaseInfo const& getTestCaseInfo() const;
 
         bool isHidden() const;
+        bool throws() const;
         bool hasTag( std::string const& tag ) const;
         bool matchesTags( std::string const& tagPattern ) const;
         std::set<std::string> const& getTags() const;
@@ -3022,7 +3074,7 @@
 
 // Declare Clara inside the Catch namespace
 #define STITCH_CLARA_OPEN_NAMESPACE namespace Catch {
-// #included from: clara.h
+// #included from: ../external/clara.h
 
 // Only use header guard if we are not using an outer namespace
 #if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE)
@@ -3260,6 +3312,10 @@
         template<typename ConfigT>
         struct IArgFunction {
             virtual ~IArgFunction() {}
+#  ifdef CATCH_CPP11_OR_GREATER
+            IArgFunction()                      = default;
+            IArgFunction( IArgFunction const& ) = default;
+#  endif
             virtual void set( ConfigT& config, std::string const& value ) const = 0;
             virtual void setFlag( ConfigT& config ) const = 0;
             virtual bool takesArg() const = 0;
@@ -3287,6 +3343,10 @@
                 functionObj->setFlag( config );
             }
             bool takesArg() const { return functionObj->takesArg(); }
+
+            bool isSet() const {
+                return functionObj != NULL;
+            }
         private:
             IArgFunction<ConfigT>* functionObj;
         };
@@ -3381,26 +3441,6 @@
             void (*function)( C&, T );
         };
 
-        template<typename C, typename M>
-        BoundArgFunction<C> makeBoundField( M C::* _member ) {
-            return BoundArgFunction<C>( new BoundDataMember<C,M>( _member ) );
-        }
-        template<typename C, typename M>
-        BoundArgFunction<C> makeBoundField( void (C::*_member)( M ) ) {
-            return BoundArgFunction<C>( new BoundUnaryMethod<C,M>( _member ) );
-        }
-        template<typename C>
-        BoundArgFunction<C> makeBoundField( void (C::*_member)() ) {
-            return BoundArgFunction<C>( new BoundNullaryMethod<C>( _member ) );
-        }
-        template<typename C>
-        BoundArgFunction<C> makeBoundField( void (*_function)( C& ) ) {
-            return BoundArgFunction<C>( new BoundUnaryFunction<C>( _function ) );
-        }
-        template<typename C, typename T>
-        BoundArgFunction<C> makeBoundField( void (*_function)( C&, T ) ) {
-            return BoundArgFunction<C>( new BoundBinaryFunction<C, T>( _function ) );
-        }
     } // namespace Detail
 
     struct Parser {
@@ -3448,33 +3488,52 @@
     };
 
     template<typename ConfigT>
+    struct CommonArgProperties {
+        CommonArgProperties() {}
+        CommonArgProperties( Detail::BoundArgFunction<ConfigT> const& _boundField ) : boundField( _boundField ) {}
+
+        Detail::BoundArgFunction<ConfigT> boundField;
+        std::string description;
+        std::string detail;
+        std::string placeholder; // Only value if boundField takes an arg
+
+        bool takesArg() const {
+            return !placeholder.empty();
+        }
+        void validate() const {
+            if( !boundField.isSet() )
+                throw std::logic_error( "option not bound" );
+        }
+    };
+    struct OptionArgProperties {
+        std::vector<std::string> shortNames;
+        std::string longName;
+
+        bool hasShortName( std::string const& shortName ) const {
+            return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end();
+        }
+        bool hasLongName( std::string const& _longName ) const {
+            return _longName == longName;
+        }
+    };
+    struct PositionalArgProperties {
+        PositionalArgProperties() : position( -1 ) {}
+        int position; // -1 means non-positional (floating)
+
+        bool isFixedPositional() const {
+            return position != -1;
+        }
+    };
+
+    template<typename ConfigT>
     class CommandLine {
 
-        struct Arg {
-            Arg() : position( -1 ) {}
-            Arg( Detail::BoundArgFunction<ConfigT> const& _boundField ) : boundField( _boundField ), position( -1 ) {}
+        struct Arg : CommonArgProperties<ConfigT>, OptionArgProperties, PositionalArgProperties {
+            Arg() {}
+            Arg( Detail::BoundArgFunction<ConfigT> const& _boundField ) : CommonArgProperties<ConfigT>( _boundField ) {}
 
-            bool hasShortName( std::string const& shortName ) const {
-                for(    std::vector<std::string>::const_iterator
-                            it = shortNames.begin(), itEnd = shortNames.end();
-                        it != itEnd;
-                        ++it )
-                    if( *it == shortName )
-                        return true;
-                return false;
-            }
-            bool hasLongName( std::string const& _longName ) const {
-                return _longName == longName;
-            }
-            bool takesArg() const {
-                return !placeholder.empty();
-            }
-            bool isFixedPositional() const {
-                return position != -1;
-            }
-            bool isAnyPositional() const {
-                return position == -1 && shortNames.empty() && longName.empty();
-            }
+            using CommonArgProperties<ConfigT>::placeholder; // !TBD
+
             std::string dbgName() const {
                 if( !longName.empty() )
                     return "--" + longName;
@@ -3482,10 +3541,6 @@
                     return "-" + shortNames[0];
                 return "positional args";
             }
-            void validate() const {
-                if( boundField.takesArg() && !takesArg() )
-                    throw std::logic_error( "command line argument '" + dbgName() + "' must specify a placeholder" );
-            }
             std::string commands() const {
                 std::ostringstream oss;
                 bool first = true;
@@ -3506,13 +3561,6 @@
                     oss << " <" << placeholder << ">";
                 return oss.str();
             }
-
-            Detail::BoundArgFunction<ConfigT> boundField;
-            std::vector<std::string> shortNames;
-            std::string longName;
-            std::string description;
-            std::string placeholder;
-            int position;
         };
 
         // NOTE: std::auto_ptr is deprecated in c++11/c++0x
@@ -3522,93 +3570,96 @@
         typedef std::auto_ptr<Arg> ArgAutoPtr;
 #endif
 
+        friend void addOptName( Arg& arg, std::string const& optName )
+        {
+            if( optName.empty() )
+                return;
+            if( Detail::startsWith( optName, "--" ) ) {
+                if( !arg.longName.empty() )
+                    throw std::logic_error( "Only one long opt may be specified. '"
+                        + arg.longName
+                        + "' already specified, now attempting to add '"
+                        + optName + "'" );
+                arg.longName = optName.substr( 2 );
+            }
+            else if( Detail::startsWith( optName, "-" ) )
+                arg.shortNames.push_back( optName.substr( 1 ) );
+            else
+                throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" );
+        }
+        friend void setPositionalArg( Arg& arg, int position )
+        {
+            arg.position = position;
+        }
+
         class ArgBuilder {
         public:
-            ArgBuilder( CommandLine* cl )
-            :   m_cl( cl )
-            {}
+            ArgBuilder( Arg* arg ) : m_arg( arg ) {}
 
-            ArgBuilder( ArgBuilder& other )
-            :   m_cl( other.m_cl ),
-                m_arg( other.m_arg )
-            {
-                other.m_cl = NULL;
+            // Bind a non-boolean data member (requires placeholder string)
+            template<typename C, typename M>
+            void bind( M C::* field, std::string const& placeholder ) {
+                m_arg->boundField = new Detail::BoundDataMember<C,M>( field );
+                m_arg->placeholder = placeholder;
             }
-            // !TBD: Need to include workarounds to be able to declare this
-            // destructor as able to throw exceptions
-            ~ArgBuilder() /* noexcept(false) */ {
-                if( m_cl && !std::uncaught_exception() ) {
-                    m_arg.validate();
-                    if( m_arg.isFixedPositional() ) {
-                        m_cl->m_positionalArgs.insert( std::make_pair( m_arg.position, m_arg ) );
-                        if( m_arg.position > m_cl->m_highestSpecifiedArgPosition )
-                            m_cl->m_highestSpecifiedArgPosition = m_arg.position;
-                    }
-                    else if( m_arg.isAnyPositional() ) {
-                        if( m_cl->m_arg.get() )
-                            throw std::logic_error( "Only one unpositional argument can be added" );
-                        m_cl->m_arg = ArgAutoPtr( new Arg( m_arg ) );
-                    }
-                    else
-                        m_cl->m_options.push_back( m_arg );
-                }
+            // Bind a boolean data member (no placeholder required)
+            template<typename C>
+            void bind( bool C::* field ) {
+                m_arg->boundField = new Detail::BoundDataMember<C,bool>( field );
             }
 
-            template<typename F>
-            void into( F f )
-            {
-                m_arg.boundField = Detail::makeBoundField( f );
+            // Bind a method taking a single, non-boolean argument (requires a placeholder string)
+            template<typename C, typename M>
+            void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) {
+                m_arg->boundField = new Detail::BoundUnaryMethod<C,M>( unaryMethod );
+                m_arg->placeholder = placeholder;
             }
 
-            friend void addOptName( ArgBuilder& builder, std::string const& optName )
-            {
-                if( optName.empty() )
-                    return;
-                if( Detail::startsWith( optName, "--" ) ) {
-                    if( !builder.m_arg.longName.empty() )
-                        throw std::logic_error( "Only one long opt may be specified. '"
-                            + builder.m_arg.longName
-                            + "' already specified, now attempting to add '"
-                            + optName + "'" );
-                    builder.m_arg.longName = optName.substr( 2 );
-                }
-                else if( Detail::startsWith( optName, "-" ) )
-                    builder.m_arg.shortNames.push_back( optName.substr( 1 ) );
-                else
-                    throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" );
-            }
-            friend void setPositionalArg( ArgBuilder& builder, int position )
-            {
-                builder.m_arg.position = position;
+            // Bind a method taking a single, boolean argument (no placeholder string required)
+            template<typename C>
+            void bind( void (C::* unaryMethod)( bool ) ) {
+                m_arg->boundField = new Detail::BoundUnaryMethod<C,bool>( unaryMethod );
             }
 
-            // Can only supply placeholder after [str] - if it takes an arg
-            ArgBuilder& placeholder( std::string const& placeholder ) {
-                m_arg.placeholder = placeholder;
-                return *this;
+            // Bind a method that takes no arguments (will be called if opt is present)
+            template<typename C>
+            void bind( void (C::* nullaryMethod)() ) {
+                m_arg->boundField = new Detail::BoundNullaryMethod<C>( nullaryMethod );
+            }
+
+            // Bind a free function taking a single argument - the object to operate on (no placeholder string required)
+            template<typename C>
+            void bind( void (* unaryFunction)( C& ) ) {
+                m_arg->boundField = new Detail::BoundUnaryFunction<C>( unaryFunction );
+            }
+
+            // Bind a free function taking a single argument - the object to operate on (requires a placeholder string)
+            template<typename C, typename T>
+            void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) {
+                m_arg->boundField = new Detail::BoundBinaryFunction<C, T>( binaryFunction );
+                m_arg->placeholder = placeholder;
             }
 
             ArgBuilder& describe( std::string const& description ) {
-                m_arg.description = description;
+                m_arg->description = description;
                 return *this;
             }
-            ArgBuilder& detail( std::string const& ) {
-//                m_arg.description = description;
-// !TBD
+            ArgBuilder& detail( std::string const& detail ) {
+                m_arg->detail = detail;
                 return *this;
             }
 
-        private:
-            CommandLine* m_cl;
-            Arg m_arg;
+        protected:
+            Arg* m_arg;
         };
+
         class OptBuilder : public ArgBuilder {
         public:
-            OptBuilder( CommandLine* cl ) : ArgBuilder( cl ) {}
+            OptBuilder( Arg* arg ) : ArgBuilder( arg ) {}
             OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {}
 
             OptBuilder& operator[]( std::string const& optName ) {
-                addOptName( *this, optName );
+                addOptName( *ArgBuilder::m_arg, optName );
                 return *this;
             }
         };
@@ -3627,8 +3678,8 @@
             m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ),
             m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens )
         {
-            if( other.m_arg.get() )
-                m_arg = ArgAutoPtr( new Arg( *other.m_arg ) );
+            if( other.m_floatingArg.get() )
+                m_floatingArg = ArgAutoPtr( new Arg( *other.m_floatingArg ) );
         }
 
         CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) {
@@ -3637,26 +3688,37 @@
         }
 
         OptBuilder operator[]( std::string const& optName ) {
-            OptBuilder builder( this );
-            addOptName( builder, optName );
+            m_options.push_back( Arg() );
+            addOptName( m_options.back(), optName );
+            OptBuilder builder( &m_options.back() );
             return builder;
         }
 
         ArgBuilder operator[]( int position ) {
-            ArgBuilder builder( this );
-            setPositionalArg( builder, position );
+            m_positionalArgs.insert( std::make_pair( position, Arg() ) );
+            if( position > m_highestSpecifiedArgPosition )
+                m_highestSpecifiedArgPosition = position;
+            setPositionalArg( m_positionalArgs[position], position );
+            ArgBuilder builder( &m_positionalArgs[position] );
             return builder;
         }
 
         // Invoke this with the _ instance
         ArgBuilder operator[]( UnpositionalTag ) {
-            ArgBuilder builder( this );
+            if( m_floatingArg.get() )
+                throw std::logic_error( "Only one unpositional argument can be added" );
+            m_floatingArg = ArgAutoPtr( new Arg() );
+            ArgBuilder builder( m_floatingArg.get() );
             return builder;
         }
 
-        template<typename F>
-        void bindProcessName( F f ) {
-            m_boundProcessName = Detail::makeBoundField( f );
+        template<typename C, typename M>
+        void bindProcessName( M C::* field ) {
+            m_boundProcessName = new Detail::BoundDataMember<C,M>( field );
+        }
+        template<typename C, typename M>
+        void bindProcessName( void (C::*_unaryMethod)( M ) ) {
+            m_boundProcessName = new Detail::BoundUnaryMethod<C,M>( _unaryMethod );
         }
 
         void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const {
@@ -3669,9 +3731,8 @@
                 Detail::Text usage( it->commands(), Detail::TextAttributes()
                                                         .setWidth( maxWidth+indent )
                                                         .setIndent( indent ) );
-                // !TBD handle longer usage strings
                 Detail::Text desc( it->description, Detail::TextAttributes()
-                                                        .setWidth( width - maxWidth -3 ) );
+                                                        .setWidth( width - maxWidth - 3 ) );
 
                 for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) {
                     std::string usageCol = i < usage.size() ? usage[i] : "";
@@ -3697,16 +3758,16 @@
                 typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( i );
                 if( it != m_positionalArgs.end() )
                     os << "<" << it->second.placeholder << ">";
-                else if( m_arg.get() )
-                    os << "<" << m_arg->placeholder << ">";
+                else if( m_floatingArg.get() )
+                    os << "<" << m_floatingArg->placeholder << ">";
                 else
                     throw std::logic_error( "non consecutive positional arguments with no floating args" );
             }
             // !TBD No indication of mandatory args
-            if( m_arg.get() ) {
+            if( m_floatingArg.get() ) {
                 if( m_highestSpecifiedArgPosition > 1 )
                     os << " ";
-                os << "[<" << m_arg->placeholder << "> ...]";
+                os << "[<" << m_floatingArg->placeholder << "> ...]";
             }
         }
         std::string argSynopsis() const {
@@ -3716,6 +3777,7 @@
         }
 
         void usage( std::ostream& os, std::string const& procName ) const {
+            validate();
             os << "usage:\n  " << procName << " ";
             argSynopsis( os );
             if( !m_options.empty() ) {
@@ -3730,7 +3792,7 @@
             return oss.str();
         }
 
-        ConfigT parseInto( int argc, char const * const * argv ) const {
+        ConfigT parse( int argc, char const * const * argv ) const {
             ConfigT config;
             parseInto( argc, argv, config );
             return config;
@@ -3749,9 +3811,7 @@
         }
 
         std::vector<Parser::Token> populate( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
-            if( m_options.empty() && m_positionalArgs.empty() )
-                throw std::logic_error( "No options or arguments specified" );
-
+            validate();
             std::vector<Parser::Token> unusedTokens = populateOptions( tokens, config );
             unusedTokens = populateFixedArgs( unusedTokens, config );
             unusedTokens = populateFloatingArgs( unusedTokens, config );
@@ -3822,24 +3882,35 @@
             return unusedTokens;
         }
         std::vector<Parser::Token> populateFloatingArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
-            if( !m_arg.get() )
+            if( !m_floatingArg.get() )
                 return tokens;
             std::vector<Parser::Token> unusedTokens;
             for( std::size_t i = 0; i < tokens.size(); ++i ) {
                 Parser::Token const& token = tokens[i];
                 if( token.type == Parser::Token::Positional )
-                    m_arg->boundField.set( config, token.data );
+                    m_floatingArg->boundField.set( config, token.data );
                 else
                     unusedTokens.push_back( token );
             }
             return unusedTokens;
         }
 
+        void validate() const
+        {
+            if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() )
+                throw std::logic_error( "No options or arguments specified" );
+
+            for( typename std::vector<Arg>::const_iterator  it = m_options.begin(),
+                                                            itEnd = m_options.end();
+                    it != itEnd; ++it )
+                it->validate();
+        }
+
     private:
         Detail::BoundArgFunction<ConfigT> m_boundProcessName;
         std::vector<Arg> m_options;
         std::map<int, Arg> m_positionalArgs;
-        ArgAutoPtr m_arg;
+        ArgAutoPtr m_floatingArg;
         int m_highestSpecifiedArgPosition;
         bool m_throwOnUnrecognisedTokens;
     };
@@ -3909,57 +3980,52 @@
 
         cli["-?"]["-h"]["--help"]
             .describe( "display usage information" )
-            .into( &ConfigData::showHelp );
+            .bind( &ConfigData::showHelp );
 
         cli["-l"]["--list-tests"]
             .describe( "list all/matching test cases" )
-            .into( &ConfigData::listTests );
+            .bind( &ConfigData::listTests );
 
         cli["-t"]["--list-tags"]
             .describe( "list all/matching tags" )
-            .into( &ConfigData::listTags );
+            .bind( &ConfigData::listTags );
 
         cli["-s"]["--success"]
             .describe( "include successful tests in output" )
-            .into( &ConfigData::showSuccessfulTests );
+            .bind( &ConfigData::showSuccessfulTests );
 
         cli["-b"]["--break"]
             .describe( "break into debugger on failure" )
-            .into( &ConfigData::shouldDebugBreak );
+            .bind( &ConfigData::shouldDebugBreak );
 
         cli["-e"]["--nothrow"]
             .describe( "skip exception tests" )
-            .into( &ConfigData::noThrow );
+            .bind( &ConfigData::noThrow );
 
         cli["-o"]["--out"]
-            .placeholder( "filename" )
             .describe( "output filename" )
-            .into( &ConfigData::outputFilename );
+            .bind( &ConfigData::outputFilename, "filename" );
 
         cli["-r"]["--reporter"]
 //            .placeholder( "name[:filename]" )
-            .placeholder( "name" )
             .describe( "reporter to use (defaults to console)" )
-            .into( &ConfigData::reporterName );
+            .bind( &ConfigData::reporterName, "name" );
 
         cli["-n"]["--name"]
-            .placeholder( "name" )
             .describe( "suite name" )
-            .into( &ConfigData::name );
+            .bind( &ConfigData::name, "name" );
 
         cli["-a"]["--abort"]
             .describe( "abort at first failure" )
-            .into( &abortAfterFirst );
+            .bind( &abortAfterFirst );
 
         cli["-x"]["--abortx"]
-            .placeholder( "number of failures" )
             .describe( "abort after x failures" )
-            .into( &abortAfterX );
+            .bind( &abortAfterX, "no. failures" );
 
         cli["-w"]["--warn"]
-            .placeholder( "warning name" )
             .describe( "enable warnings" )
-            .into( &addWarning );
+            .bind( &addWarning, "warning name" );
 
 // - needs updating if reinstated
 //        cli.into( &setVerbosity )
@@ -3969,28 +4035,25 @@
 //            .placeholder( "level" );
 
         cli[_]
-            .placeholder( "test name, pattern or tags" )
             .describe( "which test or tests to use" )
-            .into( &addTestOrTags );
+            .bind( &addTestOrTags, "test name, pattern or tags" );
 
         cli["-d"]["--durations"]
-            .placeholder( "yes/no" )
             .describe( "show test durations" )
-            .into( &setShowDurations );
+            .bind( &setShowDurations, "yes/no" );
 
         cli["-f"]["--input-file"]
-            .placeholder( "filename" )
             .describe( "load test names to run from a file" )
-            .into( &loadTestNamesFromFile );
+            .bind( &loadTestNamesFromFile, "filename" );
 
         // Less common commands which don't have a short form
         cli["--list-test-names-only"]
             .describe( "list all/matching test cases names only" )
-            .into( &ConfigData::listTestNamesOnly );
+            .bind( &ConfigData::listTestNamesOnly );
 
         cli["--list-reporters"]
             .describe( "list all reporters" )
-            .into( &ConfigData::listReporters );
+            .bind( &ConfigData::listReporters );
 
         return cli;
     }
@@ -4006,7 +4069,7 @@
 #define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH
 
 #define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch
-// #included from: tbc_text_format.h
+// #included from: ../external/tbc_text_format.h
 // Only use header guard if we are not using an outer namespace
 #ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
 # ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED
@@ -4211,7 +4274,7 @@
         static void use( Code _colourCode );
 
     private:
-        static Detail::IColourImpl* impl;
+        static Detail::IColourImpl* impl();
     };
 
 } // end namespace Catch
@@ -4367,6 +4430,13 @@
         }
         virtual ~AssertionStats();
 
+#  ifdef CATCH_CPP11_OR_GREATER
+        AssertionStats( AssertionStats const& )              = default;
+        AssertionStats( AssertionStats && )                  = default;
+        AssertionStats& operator = ( AssertionStats const& ) = default;
+        AssertionStats& operator = ( AssertionStats && )     = default;
+#  endif
+
         AssertionResult assertionResult;
         std::vector<MessageInfo> infoMessages;
         Totals totals;
@@ -4383,6 +4453,12 @@
             missingAssertions( _missingAssertions )
         {}
         virtual ~SectionStats();
+#  ifdef CATCH_CPP11_OR_GREATER
+        SectionStats( SectionStats const& )              = default;
+        SectionStats( SectionStats && )                  = default;
+        SectionStats& operator = ( SectionStats const& ) = default;
+        SectionStats& operator = ( SectionStats && )     = default;
+#  endif
 
         SectionInfo sectionInfo;
         Counts assertions;
@@ -4404,6 +4480,13 @@
         {}
         virtual ~TestCaseStats();
 
+#  ifdef CATCH_CPP11_OR_GREATER
+        TestCaseStats( TestCaseStats const& )              = default;
+        TestCaseStats( TestCaseStats && )                  = default;
+        TestCaseStats& operator = ( TestCaseStats const& ) = default;
+        TestCaseStats& operator = ( TestCaseStats && )     = default;
+#  endif
+
         TestCaseInfo testInfo;
         Totals totals;
         std::string stdOut;
@@ -4425,6 +4508,13 @@
         {}
         virtual ~TestGroupStats();
 
+#  ifdef CATCH_CPP11_OR_GREATER
+        TestGroupStats( TestGroupStats const& )              = default;
+        TestGroupStats( TestGroupStats && )                  = default;
+        TestGroupStats& operator = ( TestGroupStats const& ) = default;
+        TestGroupStats& operator = ( TestGroupStats && )     = default;
+#  endif
+
         GroupInfo groupInfo;
         Totals totals;
         bool aborting;
@@ -4438,12 +4528,20 @@
             totals( _totals ),
             aborting( _aborting )
         {}
+        virtual ~TestRunStats();
+
+#  ifndef CATCH_CPP11_OR_GREATER
         TestRunStats( TestRunStats const& _other )
         :   runInfo( _other.runInfo ),
             totals( _other.totals ),
             aborting( _other.aborting )
         {}
-        virtual ~TestRunStats();
+#  else
+        TestRunStats( TestRunStats const& )              = default;
+        TestRunStats( TestRunStats && )                  = default;
+        TestRunStats& operator = ( TestRunStats const& ) = default;
+        TestRunStats& operator = ( TestRunStats && )     = default;
+#  endif
 
         TestRunInfo runInfo;
         Totals totals;
@@ -4495,14 +4593,6 @@
 #include <algorithm>
 
 namespace Catch {
-    inline bool matchesFilters( std::vector<TestCaseFilters> const& filters, TestCase const& testCase ) {
-        std::vector<TestCaseFilters>::const_iterator it = filters.begin();
-        std::vector<TestCaseFilters>::const_iterator itEnd = filters.end();
-        for(; it != itEnd; ++it )
-            if( !it->shouldInclude( testCase ) )
-                return false;
-        return true;
-    }
 
     inline std::size_t listTests( Config const& config ) {
         if( config.filters().empty() )
@@ -4515,22 +4605,22 @@
         nameAttr.setInitialIndent( 2 ).setIndent( 4 );
         tagsAttr.setIndent( 6 );
 
-        std::vector<TestCase> const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests();
-        for( std::vector<TestCase>::const_iterator it = allTests.begin(), itEnd = allTests.end();
+        std::vector<TestCase> matchedTestCases;
+        getRegistryHub().getTestCaseRegistry().getFilteredTests( config, matchedTestCases );
+        for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
                 it != itEnd;
-                ++it )
-            if( matchesFilters( config.filters(), *it ) ) {
-                matchedTests++;
-                TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
-                Colour::Code colour = testCaseInfo.isHidden
-                    ? Colour::SecondaryText
-                    : Colour::None;
-                Colour colourGuard( colour );
+                ++it ) {
+            matchedTests++;
+            TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
+            Colour::Code colour = testCaseInfo.isHidden
+                ? Colour::SecondaryText
+                : Colour::None;
+            Colour colourGuard( colour );
 
-                std::cout << Text( testCaseInfo.name, nameAttr ) << std::endl;
-                if( !testCaseInfo.tags.empty() )
-                    std::cout << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
-            }
+            std::cout << Text( testCaseInfo.name, nameAttr ) << std::endl;
+            if( !testCaseInfo.tags.empty() )
+                std::cout << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
+        }
 
         if( config.filters().empty() )
             std::cout << pluralise( matchedTests, "test case" ) << "\n" << std::endl;
@@ -4541,15 +4631,15 @@
 
     inline std::size_t listTestsNamesOnly( Config const& config ) {
         std::size_t matchedTests = 0;
-        std::vector<TestCase> const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests();
-        for( std::vector<TestCase>::const_iterator it = allTests.begin(), itEnd = allTests.end();
+        std::vector<TestCase> matchedTestCases;
+        getRegistryHub().getTestCaseRegistry().getFilteredTests( config, matchedTestCases );
+        for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
                 it != itEnd;
-                ++it )
-            if( matchesFilters( config.filters(), *it ) ) {
-                matchedTests++;
-                TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
-                std::cout << testCaseInfo.name << std::endl;
-            }
+                ++it ) {
+            matchedTests++;
+            TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
+            std::cout << testCaseInfo.name << std::endl;
+        }
         return matchedTests;
     }
 
@@ -4561,23 +4651,21 @@
 
         std::map<std::string, int> tagCounts;
 
-        std::vector<TestCase> const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests();
-        for( std::vector<TestCase>::const_iterator  it = allTests.begin(),
-                                                    itEnd = allTests.end();
+        std::vector<TestCase> matchedTestCases;
+        getRegistryHub().getTestCaseRegistry().getFilteredTests( config, matchedTestCases );
+        for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
                 it != itEnd;
                 ++it ) {
-            if( matchesFilters( config.filters(), *it ) ) {
-                for( std::set<std::string>::const_iterator  tagIt = it->getTestCaseInfo().tags.begin(),
-                                                            tagItEnd = it->getTestCaseInfo().tags.end();
-                        tagIt != tagItEnd;
-                        ++tagIt ) {
-                    std::string tagName = *tagIt;
-                    std::map<std::string, int>::iterator countIt = tagCounts.find( tagName );
-                    if( countIt == tagCounts.end() )
-                        tagCounts.insert( std::make_pair( tagName, 1 ) );
-                    else
-                        countIt->second++;
-                }
+            for( std::set<std::string>::const_iterator  tagIt = it->getTestCaseInfo().tags.begin(),
+                                                        tagItEnd = it->getTestCaseInfo().tags.end();
+                    tagIt != tagItEnd;
+                    ++tagIt ) {
+                std::string tagName = *tagIt;
+                std::map<std::string, int>::iterator countIt = tagCounts.find( tagName );
+                if( countIt == tagCounts.end() )
+                    tagCounts.insert( std::make_pair( tagName, 1 ) );
+                else
+                    countIt->second++;
             }
         }
 
@@ -4666,13 +4754,18 @@
 
         RunState runState() const { return m_runState; }
 
-        void addChild( std::string const& childName ) {
+        TrackedSection* findChild( std::string const& childName ) {
+            TrackedSections::iterator it = m_children.find( childName );
+            return it != m_children.end()
+                ? &it->second
+                : NULL;
+        }
+        TrackedSection* acquireChild( std::string const& childName ) {
+            if( TrackedSection* child = findChild( childName ) )
+                return child;
             m_children.insert( std::make_pair( childName, TrackedSection( childName, this ) ) );
+            return findChild( childName );
         }
-        TrackedSection* getChild( std::string const& childName ) {
-            return &m_children.find( childName )->second;
-        }
-
         void enter() {
             if( m_runState == NotStarted )
                 m_runState = Executing;
@@ -4711,21 +4804,13 @@
         {}
 
         bool enterSection( std::string const& name ) {
-            if( m_completedASectionThisRun )
+            TrackedSection* child = m_currentSection->acquireChild( name );
+            if( m_completedASectionThisRun || child->runState() == TrackedSection::Completed )
                 return false;
-            if( m_currentSection->runState() == TrackedSection::Executing ) {
-                m_currentSection->addChild( name );
-                return false;
-            }
-            else {
-                TrackedSection* child = m_currentSection->getChild( name );
-                if( child->runState() != TrackedSection::Completed ) {
-                    m_currentSection = child;
-                    m_currentSection->enter();
-                    return true;
-                }
-                return false;
-            }
+
+            m_currentSection = child;
+            m_currentSection->enter();
+            return true;
         }
         void leaveSection() {
             m_currentSection->leave();
@@ -4743,9 +4828,7 @@
 
         class Guard {
         public:
-            Guard( TestCaseTracker& tracker )
-            : m_tracker( tracker )
-            {
+            Guard( TestCaseTracker& tracker ) : m_tracker( tracker ) {
                 m_tracker.enterTestCase();
             }
             ~Guard() {
@@ -4846,23 +4929,6 @@
             m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) );
         }
 
-        Totals runMatching( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) {
-
-            std::vector<TestCase> matchingTests = getRegistryHub().getTestCaseRegistry().getMatchingTestCases( testSpec );
-
-            Totals totals;
-
-            testGroupStarting( testSpec, groupIndex, groupsCount );
-
-            std::vector<TestCase>::const_iterator it = matchingTests.begin();
-            std::vector<TestCase>::const_iterator itEnd = matchingTests.end();
-            for(; it != itEnd; ++it )
-                totals += runTest( *it );
-
-            testGroupEnded( testSpec, totals, groupIndex, groupsCount );
-            return totals;
-        }
-
         Totals runTest( TestCase const& testCase ) {
             Totals prevTotals = m_totals;
 
@@ -5046,8 +5112,8 @@
             }
             // If sections ended prematurely due to an exception we stored their
             // infos here so we can tear them down outside the unwind process.
-            for( std::vector<UnfinishedSections>::const_iterator it = m_unfinishedSections.begin(),
-                        itEnd = m_unfinishedSections.end();
+            for( std::vector<UnfinishedSections>::const_reverse_iterator it = m_unfinishedSections.rbegin(),
+                        itEnd = m_unfinishedSections.rend();
                     it != itEnd;
                     ++it )
                 sectionEnded( it->info, it->prevAssertions, it->durationInSeconds );
@@ -5101,17 +5167,17 @@
         Version(    unsigned int _majorVersion,
                     unsigned int _minorVersion,
                     unsigned int _buildNumber,
-                    std::string const& _branchName )
+                    char const* const _branchName )
         :   majorVersion( _majorVersion ),
             minorVersion( _minorVersion ),
             buildNumber( _buildNumber ),
             branchName( _branchName )
         {}
 
-        const unsigned int majorVersion;
-        const unsigned int minorVersion;
-        const unsigned int buildNumber;
-        const std::string branchName;
+        unsigned int const majorVersion;
+        unsigned int const minorVersion;
+        unsigned int const buildNumber;
+        char const* const branchName;
 
     private:
         void operator=( Version const& );
@@ -5155,29 +5221,29 @@
             }
             return totals;
         }
-
-        Totals runTestsForGroup( RunContext& context, const TestCaseFilters& filterGroup ) {
+        Totals runTestsForGroup( RunContext& context, TestCaseFilters const& filterGroup ) {
             Totals totals;
-            std::vector<TestCase>::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin();
-            std::vector<TestCase>::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end();
+
+            std::vector<TestCase> testCases;
+            getRegistryHub().getTestCaseRegistry().getFilteredTests( filterGroup, *m_config, testCases );
+
             int testsRunForGroup = 0;
-            for(; it != itEnd; ++it ) {
-                if( filterGroup.shouldInclude( *it ) ) {
-                    testsRunForGroup++;
-                    if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) {
+            for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end();
+                    it != itEnd;
+                    ++it ) {
+                testsRunForGroup++;
+                if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) {
 
-                        if( context.aborting() )
-                            break;
+                    if( context.aborting() )
+                        break;
 
-                        totals += context.runTest( *it );
-                        m_testsAlreadyRun.insert( *it );
-                    }
+                    totals += context.runTest( *it );
+                    m_testsAlreadyRun.insert( *it );
                 }
             }
             if( testsRunForGroup == 0 && !filterGroup.getName().empty() )
                 m_reporter->noMatchingTestCases( filterGroup.getName() );
             return totals;
-
         }
 
     private:
@@ -5237,7 +5303,7 @@
             std::cout << "\nCatch v"    << libraryVersion.majorVersion << "."
                                         << libraryVersion.minorVersion << " build "
                                         << libraryVersion.buildNumber;
-            if( libraryVersion.branchName != "master" )
+            if( libraryVersion.branchName != std::string( "master" ) )
                 std::cout << " (" << libraryVersion.branchName << " branch)";
             std::cout << "\n";
 
@@ -5360,9 +5426,12 @@
             }
             else {
                 TestCase const& prev = *m_functions.find( testCase );
-                std::cerr   << "error: TEST_CASE( \"" << name << "\" ) already defined.\n"
-                            << "\tFirst seen at " << prev.getTestCaseInfo().lineInfo << "\n"
-                            << "\tRedefined at " << testCase.getTestCaseInfo().lineInfo << std::endl;
+                {
+                    Colour colourGuard( Colour::Red );
+                    std::cerr   << "error: TEST_CASE( \"" << name << "\" ) already defined.\n"
+                                << "\tFirst seen at " << prev.getTestCaseInfo().lineInfo << "\n"
+                                << "\tRedefined at " << testCase.getTestCaseInfo().lineInfo << std::endl;
+                }
                 exit(1);
             }
         }
@@ -5375,32 +5444,24 @@
             return m_nonHiddenFunctions;
         }
 
-        // !TBD deprecated
-        virtual std::vector<TestCase> getMatchingTestCases( std::string const& rawTestSpec ) const {
-            std::vector<TestCase> matchingTests;
-            getMatchingTestCases( rawTestSpec, matchingTests );
-            return matchingTests;
-        }
-
-        // !TBD deprecated
-        virtual void getMatchingTestCases( std::string const& rawTestSpec, std::vector<TestCase>& matchingTestsOut ) const {
-            TestCaseFilter filter( rawTestSpec );
-
-            std::vector<TestCase>::const_iterator it = m_functionsInOrder.begin();
-            std::vector<TestCase>::const_iterator itEnd = m_functionsInOrder.end();
-            for(; it != itEnd; ++it ) {
-                if( filter.shouldInclude( *it ) ) {
-                    matchingTestsOut.push_back( *it );
-                }
+        virtual void getFilteredTests( TestCaseFilters const& filters, IConfig const& config, std::vector<TestCase>& matchingTestCases ) const {
+            for( std::vector<TestCase>::const_iterator  it = m_functionsInOrder.begin(),
+                                                        itEnd = m_functionsInOrder.end();
+                    it != itEnd;
+                    ++it ) {
+                if( filters.shouldInclude( *it ) && ( config.allowThrows() || !it->throws() ) )
+                    matchingTestCases.push_back( *it );
             }
         }
-        virtual void getMatchingTestCases( TestCaseFilters const& filters, std::vector<TestCase>& matchingTestsOut ) const {
-            std::vector<TestCase>::const_iterator it = m_functionsInOrder.begin();
-            std::vector<TestCase>::const_iterator itEnd = m_functionsInOrder.end();
-            // !TBD: replace with algorithm
-            for(; it != itEnd; ++it )
-                if( filters.shouldInclude( *it ) )
-                    matchingTestsOut.push_back( *it );
+        virtual void getFilteredTests( IConfig const& config, std::vector<TestCase>& matchingTestCases ) const {
+            if( config.filters().empty() )
+                return getFilteredTests( TestCaseFilters( "empty" ), config, matchingTestCases );
+
+            for( std::vector<TestCaseFilters>::const_iterator   it = config.filters().begin(),
+                                                                itEnd = config.filters().end();
+                    it != itEnd;
+                    ++it )
+                getFilteredTests( *it, config, matchingTestCases );
         }
 
     private:
@@ -5645,7 +5706,7 @@
         m_what = oss.str();
     }
 
-    const char* NotImplementedException::what() const throw() {
+    const char* NotImplementedException::what() const CATCH_NOEXCEPT {
         return m_what.c_str();
     }
 
@@ -5666,7 +5727,7 @@
 
     class StreamBufBase : public std::streambuf {
     public:
-        virtual ~StreamBufBase() throw();
+        virtual ~StreamBufBase() CATCH_NOEXCEPT;
     };
 }
 
@@ -5685,7 +5746,7 @@
             setp( data, data + sizeof(data) );
         }
 
-        ~StreamBufImpl() throw() {
+        ~StreamBufImpl() CATCH_NOEXCEPT {
             sync();
         }
 
@@ -5899,7 +5960,10 @@
         return true;
     }
 
-    Win32ColourImpl platformColourImpl;
+    static Detail::IColourImpl* platformColourInstance() {
+        static Win32ColourImpl s_instance;
+        return &s_instance;
+    }
 
 } // end anon namespace
 } // end namespace Catch
@@ -5946,7 +6010,10 @@
         return isatty(STDOUT_FILENO);
     }
 
-    PosixColourImpl platformColourImpl;
+    static Detail::IColourImpl* platformColourInstance() {
+        static PosixColourImpl s_instance;
+        return &s_instance;
+    }
 
 } // end anon namespace
 } // end namespace Catch
@@ -5958,21 +6025,28 @@
     namespace {
         struct NoColourImpl : Detail::IColourImpl {
             void use( Colour::Code ) {}
+
+            static IColourImpl* instance() {
+                static NoColourImpl s_instance;
+                return &s_instance;
+            }
         };
-        NoColourImpl noColourImpl;
-        static const bool shouldUseColour = shouldUseColourForPlatform() &&
-                                            !isDebuggerActive();
+        static bool shouldUseColour() {
+            return shouldUseColourForPlatform() && !isDebuggerActive();
+        }
     }
 
     Colour::Colour( Code _colourCode ){ use( _colourCode ); }
     Colour::~Colour(){ use( None ); }
     void Colour::use( Code _colourCode ) {
-        impl->use( _colourCode );
+        impl()->use( _colourCode );
     }
 
-    Detail::IColourImpl* Colour::impl = shouldUseColour
-            ? static_cast<Detail::IColourImpl*>( &platformColourImpl )
-            : static_cast<Detail::IColourImpl*>( &noColourImpl );
+    Detail::IColourImpl* Colour::impl() {
+        return shouldUseColour()
+            ? platformColourInstance()
+            : NoColourImpl::instance();
+    }
 
 } // end namespace Catch
 
@@ -6223,6 +6297,16 @@
 
 namespace Catch {
 
+    inline bool isSpecialTag( std::string const& tag ) {
+        return  tag == "." ||
+                tag == "hide" ||
+                tag == "!hide" ||
+                tag == "!throws";
+    }
+    inline bool isReservedTag( std::string const& tag ) {
+        return !isSpecialTag( tag ) && tag.size() > 0 && !isalnum( tag[0] );
+    }
+
     TestCase makeTestCase(  ITestCase* _testCase,
                             std::string const& _className,
                             std::string const& _name,
@@ -6233,6 +6317,23 @@
         bool isHidden( startsWith( _name, "./" ) ); // Legacy support
         std::set<std::string> tags;
         TagExtracter( tags ).parse( desc );
+        for( std::set<std::string>::const_iterator it = tags.begin(), itEnd = tags.end();
+                it != itEnd;
+                ++it )
+            if( isReservedTag( *it ) ) {
+                {
+                    Colour colourGuard( Colour::Red );
+                    std::cerr
+                        << "Tag name [" << *it << "] not allowed.\n"
+                        << "Tag names starting with non alpha-numeric characters are reserved\n";
+                }
+                {
+                    Colour colourGuard( Colour::FileName );
+                    std::cerr << _lineInfo << std::endl;
+                }
+                exit(1);
+            }
+
         if( tags.find( "hide" ) != tags.end() || tags.find( "." ) != tags.end() )
             isHidden = true;
 
@@ -6255,11 +6356,15 @@
         description( _description ),
         tags( _tags ),
         lineInfo( _lineInfo ),
-        isHidden( _isHidden )
+        isHidden( _isHidden ),
+        throws( false )
     {
         std::ostringstream oss;
-        for( std::set<std::string>::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it )
+        for( std::set<std::string>::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it ) {
             oss << "[" << *it << "]";
+            if( *it == "!throws" )
+                throws = true;
+        }
         tagsAsString = oss.str();
     }
 
@@ -6270,7 +6375,8 @@
         tags( other.tags ),
         tagsAsString( other.tagsAsString ),
         lineInfo( other.lineInfo ),
-        isHidden( other.isHidden )
+        isHidden( other.isHidden ),
+        throws( other.throws )
     {}
 
     TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {}
@@ -6293,6 +6399,9 @@
     bool TestCase::isHidden() const {
         return TestCaseInfo::isHidden;
     }
+    bool TestCase::throws() const {
+        return TestCaseInfo::throws;
+    }
 
     bool TestCase::hasTag( std::string const& tag ) const {
         return tags.find( toLower( tag ) ) != tags.end();
@@ -6588,7 +6697,7 @@
 namespace Catch {
 
     // These numbers are maintained by a script
-    Version libraryVersion( 1, 0, 30, "master" );
+    Version libraryVersion( 1, 0, 39, "master" );
 }
 
 // #included from: catch_message.hpp
@@ -7306,11 +7415,18 @@
                 endElement();
         }
 
+#  ifndef CATCH_CPP11_OR_GREATER
         XmlWriter& operator = ( XmlWriter const& other ) {
             XmlWriter temp( other );
             swap( temp );
             return *this;
         }
+#  else
+        XmlWriter( XmlWriter const& )              = default;
+        XmlWriter( XmlWriter && )                  = default;
+        XmlWriter& operator = ( XmlWriter const& ) = default;
+        XmlWriter& operator = ( XmlWriter && )     = default;
+#  endif
 
         void swap( XmlWriter& other ) {
             std::swap( m_tagIsOpen, other.m_tagIsOpen );
@@ -8046,7 +8162,7 @@
                     << " is a Catch v"  << libraryVersion.majorVersion << "."
                     << libraryVersion.minorVersion << " b"
                     << libraryVersion.buildNumber;
-            if( libraryVersion.branchName != "master" )
+            if( libraryVersion.branchName != std::string( "master" ) )
                 stream << " (" << libraryVersion.branchName << ")";
             stream  << " host application.\n"
                     << "Run with -? for options\n\n";
@@ -8195,7 +8311,7 @@
 namespace Catch {
     NonCopyable::~NonCopyable() {}
     IShared::~IShared() {}
-    StreamBufBase::~StreamBufBase() throw() {}
+    StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {}
     IContext::~IContext() {}
     IResultCapture::~IResultCapture() {}
     ITestCase::~ITestCase() {}