Snap for 6439596 from bcfbb791d09e390fb545c03ca002e570f764d960 to qt-aml-tzdata-release

Change-Id: I824c33e1a17d05964d599898d9e411decad381b9
diff --git a/.conan/build.py b/.conan/build.py
index 2729865..dfba264 100644
--- a/.conan/build.py
+++ b/.conan/build.py
@@ -47,7 +47,7 @@
 
     @property
     def reference(self):
-        """ Read project version from branch create Conan reference
+        """ Read project version from branch create Conan referece
         """
         return os.getenv("CONAN_REFERENCE", "Catch2/{}".format(self._version))
 
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index ea2b7bb..368f41f 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -12,7 +12,7 @@
 <!--
 Describe the what and the why of your pull request. Remember that these two
 are usually a bit different. As an example, if you have made various changes
-to decrease the number of new strings allocated, that's what. The why probably
+to decrease the number of new strings allocated, thats what. The why probably
 was that you have a large set of tests and found that this speeds them up.
 -->
 
diff --git a/CMake/FindGcov.cmake b/CMake/FindGcov.cmake
index 4141711..6ffd6ea 100644
--- a/CMake/FindGcov.cmake
+++ b/CMake/FindGcov.cmake
@@ -19,7 +19,7 @@
 
 get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
 foreach (LANG ${ENABLED_LANGUAGES})
-	# Gcov evaluation is dependent on the used compiler. Check gcov support for
+	# Gcov evaluation is dependend on the used compiler. Check gcov support for
 	# each compiler that is used. If gcov binary was already found for this
 	# compiler, do not try to find it again.
 	if (NOT GCOV_${CMAKE_${LANG}_COMPILER_ID}_BIN)
diff --git a/CMake/Findcodecov.cmake b/CMake/Findcodecov.cmake
index 2c0f2fe..fa135fa 100644
--- a/CMake/Findcodecov.cmake
+++ b/CMake/Findcodecov.cmake
@@ -74,7 +74,7 @@
 
 get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
 foreach (LANG ${ENABLED_LANGUAGES})
-	# Coverage flags are not dependent on language, but the used compiler. So
+	# Coverage flags are not dependend on language, but the used compiler. So
 	# instead of searching flags foreach language, search flags foreach compiler
 	# used.
 	set(COMPILER ${CMAKE_${LANG}_COMPILER_ID})
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e2329c6..ea35d24 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,7 +6,7 @@
   set(NOT_SUBPROJECT ON)
 endif()
 
-project(Catch2 LANGUAGES CXX VERSION 2.7.2)
+project(Catch2 LANGUAGES CXX VERSION 2.7.0)
 
 # Provide path for scripts
 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake")
@@ -205,15 +205,4 @@
         ${PKGCONFIG_INSTALL_DIR}
     )
 
-    # CPack/CMake started taking the package version from project version 3.12
-    # So we need to set the version manually for older CMake versions
-    if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
-        set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
-    endif()
-
-    set(CPACK_PACKAGE_CONTACT "https://github.com/catchorg/Catch2/")
-
-
-    include( CPack )
-
 endif(NOT_SUBPROJECT)
diff --git a/METADATA b/METADATA
index 50e9afa..cf98e4a 100644
--- a/METADATA
+++ b/METADATA
@@ -1,5 +1,9 @@
 name: "catch"
-description: "A modern, C++-native, header-only, test framework for unit-tests, TDD and BDD - using C++11, C++14, C++17 and later (or C++03 on the Catch1.x branch)"
+description:
+    "A modern, C++-native, header-only, test framework for unit-tests, TDD and "
+    "BDD - using C++11, C++14, C++17 and later (or C++03 on the Catch1.x "
+    "branch)"
+
 third_party {
   url {
     type: HOMEPAGE
@@ -9,11 +13,7 @@
     type: GIT
     value: "https://github.com/catchorg/Catch2.git"
   }
-  version: "v2.7.2"
+  version: "v2.7.0"
+  last_upgrade_date { year: 2019 month: 3 day: 7 }
   license_type: NOTICE
-  last_upgrade_date {
-    year: 2019
-    month: 5
-    day: 2
-  }
 }
diff --git a/README.md b/README.md
index 535ac6e..08095f1 100644
--- a/README.md
+++ b/README.md
@@ -5,17 +5,17 @@
 [![Build Status](https://travis-ci.org/catchorg/Catch2.svg?branch=master)](https://travis-ci.org/catchorg/Catch2)
 [![Build status](https://ci.appveyor.com/api/projects/status/github/catchorg/Catch2?svg=true)](https://ci.appveyor.com/project/catchorg/catch2)
 [![codecov](https://codecov.io/gh/catchorg/Catch2/branch/master/graph/badge.svg)](https://codecov.io/gh/catchorg/Catch2)
-[![Try online](https://img.shields.io/badge/try-online-blue.svg)](https://wandbox.org/permlink/rsEsNO9M0flb5NlQ)
+[![Try online](https://img.shields.io/badge/try-online-blue.svg)](https://wandbox.org/permlink/byNJIivVphHo170P)
 [![Join the chat in Discord: https://discord.gg/4CWS9zD](https://img.shields.io/badge/Discord-Chat!-brightgreen.svg)](https://discord.gg/4CWS9zD)
 
 
-<a href="https://github.com/catchorg/Catch2/releases/download/v2.7.2/catch.hpp">The latest version of the single header can be downloaded directly using this link</a>
+<a href="https://github.com/catchorg/Catch2/releases/download/v2.7.0/catch.hpp">The latest version of the single header can be downloaded directly using this link</a>
 
 ## Catch2 is released!
 
 If you've been using an earlier version of Catch, please see the
 Breaking Changes section of [the release notes](https://github.com/catchorg/Catch2/releases/tag/v2.0.1)
-before moving to Catch2. You might also like to read [this blog post](https://levelofindirection.com/blog/catch2-released.html) for more details.
+before moving to Catch2. You might also like to read [this blog post](http://www.levelofindirection.com/journal/2017/11/3/catch2-released.html) for more details.
 
 ## What's the Catch?
 
diff --git a/contrib/CatchAddTests.cmake b/contrib/CatchAddTests.cmake
index ca5ebc1..2220ce3 100644
--- a/contrib/CatchAddTests.cmake
+++ b/contrib/CatchAddTests.cmake
@@ -22,39 +22,6 @@
   set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE)
 endfunction()
 
-macro(_add_catch_test_labels LINE)
-  # convert to list of tags
-  string(REPLACE "][" "]\\;[" tags ${line})
-
-  add_command(
-    set_tests_properties "${prefix}${test}${suffix}"
-      PROPERTIES
-        LABELS "${tags}"
-  )
-endmacro()
-
-macro(_add_catch_test LINE)
-  set(test ${line})
-  # use escape commas to handle properly test cases with commans inside the name
-  string(REPLACE "," "\\," test_name ${test})
-  # ...and add to script
-  add_command(
-    add_test "${prefix}${test}${suffix}"
-      ${TEST_EXECUTOR}
-       "${TEST_EXECUTABLE}"
-       "${test_name}"
-       ${extra_args}
-     )
-
-  add_command(
-    set_tests_properties "${prefix}${test}${suffix}"
-      PROPERTIES
-        WORKING_DIRECTORY "${TEST_WORKING_DIR}"
-        ${properties}
-  )
-  list(APPEND tests "${prefix}${test}${suffix}")
-endmacro()
-
 # Run test executable to get list of available tests
 if(NOT EXISTS "${TEST_EXECUTABLE}")
   message(FATAL_ERROR
@@ -62,7 +29,7 @@
   )
 endif()
 execute_process(
-  COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-tests
+  COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-test-names-only
   OUTPUT_VARIABLE output
   RESULT_VARIABLE result
 )
@@ -80,22 +47,27 @@
 endif()
 
 string(REPLACE "\n" ";" output "${output}")
-set(test)
-set(tags_regex "(\\[([^\\[]*)\\])+$")
 
 # Parse output
 foreach(line ${output})
-  # lines without leading whitespaces are catch output not tests
-  if(${line} MATCHES "^[ \t]+")
-    # strip leading spaces and tabs
-    string(REGEX REPLACE "^[ \t]+" "" line ${line})
-
-    if(${line} MATCHES "${tags_regex}")
-      _add_catch_test_labels(${line})
-    else()
-      _add_catch_test(${line})
-    endif()
-  endif()
+  set(test ${line})
+  # use escape commas to handle properly test cases with commans inside the name
+  string(REPLACE "," "\\," test_name ${test})
+  # ...and add to script
+  add_command(add_test
+    "${prefix}${test}${suffix}"
+    ${TEST_EXECUTOR}
+    "${TEST_EXECUTABLE}"
+    "${test_name}"
+    ${extra_args}
+  )
+  add_command(set_tests_properties
+    "${prefix}${test}${suffix}"
+    PROPERTIES
+    WORKING_DIRECTORY "${TEST_WORKING_DIR}"
+    ${properties}
+  )
+  list(APPEND tests "${prefix}${test}${suffix}")
 endforeach()
 
 # Create a list of all discovered tests, which users may use to e.g. set
diff --git a/contrib/ParseAndAddCatchTests.cmake b/contrib/ParseAndAddCatchTests.cmake
index 925d932..ff4fc66 100644
--- a/contrib/ParseAndAddCatchTests.cmake
+++ b/contrib/ParseAndAddCatchTests.cmake
@@ -44,19 +44,9 @@
 #     set(OptionalCatchTestLauncher ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${NUMPROC})                 #
 # just before calling this ParseAndAddCatchTests function                                          #
 #                                                                                                  #
-# The AdditionalCatchParameters optional variable can be used to pass extra argument to the test   #
-# command. For example, to include successful tests in the output, one can write                   #
-#     set(AdditionalCatchParameters --success)                                                     #
-#                                                                                                  #
-# After the script, the ParseAndAddCatchTests_TESTS property for the target, and for each source   #
-# file in the target is set, and contains the list of the tests extracted from that target, or     #
-# from that file. This is useful, for example to add further labels or properties to the tests.    #
-#                                                                                                  #
 #==================================================================================================#
 
-if (CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.8)
-  message(FATAL_ERROR "ParseAndAddCatchTests requires CMake 2.8.8 or newer")
-endif()
+cmake_minimum_required(VERSION 2.8.8)
 
 option(PARSE_CATCH_TESTS_VERBOSE "Print Catch to CTest parser debug messages" OFF)
 option(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS "Exclude tests with [!hide], [.] or [.foo] tags" OFF)
@@ -64,7 +54,7 @@
 option(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME "Add target name to the test name" ON)
 option(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS "Add test file to CMAKE_CONFIGURE_DEPENDS property" OFF)
 
-function(ParseAndAddCatchTests_PrintDebugMessage)
+function(PrintDebugMessage)
     if(PARSE_CATCH_TESTS_VERBOSE)
             message(STATUS "ParseAndAddCatchTests: ${ARGV}")
     endif()
@@ -75,7 +65,7 @@
 #  - full line comments (i.e. // ... )
 # contents have been read into '${CppCode}'.
 # !keep partial line comments
-function(ParseAndAddCatchTests_RemoveComments CppCode)
+function(RemoveComments CppCode)
   string(ASCII 2 CMakeBeginBlockComment)
   string(ASCII 3 CMakeEndBlockComment)
   string(REGEX REPLACE "/\\*" "${CMakeBeginBlockComment}" ${CppCode} "${${CppCode}}")
@@ -87,29 +77,24 @@
 endfunction()
 
 # Worker function
-function(ParseAndAddCatchTests_ParseFile SourceFile TestTarget)
-    # If SourceFile is an object library, do not scan it (as it is not a file). Exit without giving a warning about a missing file.
-    if(SourceFile MATCHES "\\\$<TARGET_OBJECTS:.+>")
-        ParseAndAddCatchTests_PrintDebugMessage("Detected OBJECT library: ${SourceFile} this will not be scanned for tests.")
-        return()
-    endif()
+function(ParseFile SourceFile TestTarget)
     # According to CMake docs EXISTS behavior is well-defined only for full paths.
     get_filename_component(SourceFile ${SourceFile} ABSOLUTE)
     if(NOT EXISTS ${SourceFile})
         message(WARNING "Cannot find source file: ${SourceFile}")
         return()
     endif()
-    ParseAndAddCatchTests_PrintDebugMessage("parsing ${SourceFile}")
+    PrintDebugMessage("parsing ${SourceFile}")
     file(STRINGS ${SourceFile} Contents NEWLINE_CONSUME)
 
     # Remove block and fullline comments
-    ParseAndAddCatchTests_RemoveComments(Contents)
+    RemoveComments(Contents)
 
     # Find definition of test names
     string(REGEX MATCHALL "[ \t]*(CATCH_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^\)]+\\)+[ \t\n]*{+[ \t]*(//[^\n]*[Tt][Ii][Mm][Ee][Oo][Uu][Tt][ \t]*[0-9]+)*" Tests "${Contents}")
 
     if(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS AND Tests)
-      ParseAndAddCatchTests_PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property")
+      PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property")
       set_property(
         DIRECTORY
         APPEND
@@ -170,6 +155,7 @@
 
         list(APPEND Labels ${Tags})
 
+        list(FIND Labels "!hide" IndexOfHideLabel)
         set(HiddenTagFound OFF)
         foreach(label ${Labels})
             string(REGEX MATCH "^!hide|^\\." result ${label})
@@ -179,34 +165,26 @@
             endif(result)
         endforeach(label)
         if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_LESS "3.9")
-            ParseAndAddCatchTests_PrintDebugMessage("Skipping test \"${CTestName}\" as it has [!hide], [.] or [.foo] label")
+            PrintDebugMessage("Skipping test \"${CTestName}\" as it has [!hide], [.] or [.foo] label")
         else()
-            ParseAndAddCatchTests_PrintDebugMessage("Adding test \"${CTestName}\"")
+            PrintDebugMessage("Adding test \"${CTestName}\"")
             if(Labels)
-                ParseAndAddCatchTests_PrintDebugMessage("Setting labels to ${Labels}")
+                PrintDebugMessage("Setting labels to ${Labels}")
             endif()
 
             # Escape commas in the test spec
             string(REPLACE "," "\\," Name ${Name})
 
             # Add the test and set its properties
-            add_test(NAME "\"${CTestName}\"" COMMAND ${OptionalCatchTestLauncher} $<TARGET_FILE:${TestTarget}> ${Name} ${AdditionalCatchParameters})
+            add_test(NAME "\"${CTestName}\"" COMMAND ${OptionalCatchTestLauncher} ${TestTarget} ${Name} ${AdditionalCatchParameters})
             # Old CMake versions do not document VERSION_GREATER_EQUAL, so we use VERSION_GREATER with 3.8 instead
             if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_GREATER "3.8")
-                ParseAndAddCatchTests_PrintDebugMessage("Setting DISABLED test property")
+                PrintDebugMessage("Setting DISABLED test property")
                 set_tests_properties("\"${CTestName}\"" PROPERTIES DISABLED ON)
             else()
                 set_tests_properties("\"${CTestName}\"" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran"
                                                         LABELS "${Labels}")
             endif()
-            set_property(
-              TARGET ${TestTarget}
-              APPEND
-              PROPERTY ParseAndAddCatchTests_TESTS "\"${CTestName}\"")
-            set_property(
-              SOURCE ${SourceFile}
-              APPEND
-              PROPERTY ParseAndAddCatchTests_TESTS "\"${CTestName}\"")
         endif()
 
 
@@ -215,11 +193,11 @@
 
 # entry point
 function(ParseAndAddCatchTests TestTarget)
-    ParseAndAddCatchTests_PrintDebugMessage("Started parsing ${TestTarget}")
+    PrintDebugMessage("Started parsing ${TestTarget}")
     get_target_property(SourceFiles ${TestTarget} SOURCES)
-    ParseAndAddCatchTests_PrintDebugMessage("Found the following sources: ${SourceFiles}")
+    PrintDebugMessage("Found the following sources: ${SourceFiles}")
     foreach(SourceFile ${SourceFiles})
-        ParseAndAddCatchTests_ParseFile(${SourceFile} ${TestTarget})
+        ParseFile(${SourceFile} ${TestTarget})
     endforeach()
-    ParseAndAddCatchTests_PrintDebugMessage("Finished parsing ${TestTarget}")
+    PrintDebugMessage("Finished parsing ${TestTarget}")
 endfunction()
diff --git a/docs/assertions.md b/docs/assertions.md
index 07d2484..900fd52 100644
--- a/docs/assertions.md
+++ b/docs/assertions.md
@@ -10,7 +10,7 @@
 
 Most test frameworks have a large collection of assertion macros to capture all possible conditional forms (```_EQUALS```, ```_NOTEQUALS```, ```_GREATER_THAN``` etc).
 
-Catch is different. Because it decomposes natural C-style conditional expressions most of these forms are reduced to one or two that you will use all the time. That said there is a rich set of auxiliary macros as well. We'll describe all of these here.
+Catch is different. Because it decomposes natural C-style conditional expressions most of these forms are reduced to one or two that you will use all the time. That said there are a rich set of auxiliary macros as well. We'll describe all of these here.
 
 Most of these macros come in two forms:
 
@@ -61,7 +61,7 @@
 REQUIRE( performComputation() == Approx( 2.1 ) );
 ```
 
-Catch also provides a user-defined literal for `Approx`; `_a`. It resides in
+Catch also provides a UDL for `Approx`; `_a`. It resides in
 the `Catch::literals` namespace and can be used like so:
 ```cpp
 using namespace Catch::literals;
diff --git a/docs/cmake-integration.md b/docs/cmake-integration.md
index 57073c4..246e7f0 100644
--- a/docs/cmake-integration.md
+++ b/docs/cmake-integration.md
@@ -48,7 +48,7 @@
 doing `find_package(Catch2 REQUIRED)`. Otherwise you need to add them
 to your CMake module path.
 
-### `Catch.cmake` and `CatchAddTests.cmake`
+### `Catch.cmake` and `AddCatchTests.cmake`
 
 `Catch.cmake` provides function `catch_discover_tests` to get tests from
 a target. This function works by running the resulting executable with
diff --git a/docs/command-line.md b/docs/command-line.md
index f68c84c..fc63fe8 100644
--- a/docs/command-line.md
+++ b/docs/command-line.md
@@ -27,7 +27,7 @@
 [Override output colouring](#override-output-colouring)<br>
 
 Catch works quite nicely without any command line options at all - but for those times when you want greater control the following options are available.
-Click one of the following links to take you straight to that option - or scroll on to browse the available options.
+Click one of the followings links to take you straight to that option - or scroll on to browse the available options.
 
 <a href="#specifying-which-tests-to-run">               `    <test-spec> ...`</a><br />
 <a href="#usage">                                       `    -h, -?, --help`</a><br />
diff --git a/docs/configuration.md b/docs/configuration.md
index c01d7f5..1c94481 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -89,7 +89,7 @@
 By default, when Catch's stringification machinery has to stringify
 a type that does not specialize `StringMaker`, does not overload `operator<<`,
 is not an enumeration and is not a range, it uses `"{?}"`. This can be
-overridden by defining `CATCH_CONFIG_FALLBACK_STRINGIFIER` to name of a
+overriden by defining `CATCH_CONFIG_FALLBACK_STRINGIFIER` to name of a
 function that should perform the stringification instead.
 
 All types that do not provide `StringMaker` specialization or `operator<<`
diff --git a/docs/contributing.md b/docs/contributing.md
index b95edf8..21bbad1 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -75,34 +75,8 @@
 intentional.
 
 
-## Code constructs to watch out for
 
-This section is a (sadly incomplete) listing of various constructs that
-are problematic and are not always caught by our CI infrastructure.
-
-### Naked exceptions and exceptions-related function
-
-If you are throwing an exception, it should be done via `CATCH_ERROR`
-or `CATCH_RUNTIME_ERROR` in `catch_enforce.h`. These macros will handle
-the differences between compilation with or without exceptions for you.
-However, some platforms (IAR) also have problems with exceptions-related
-functions, such as `std::current_exceptions`. We do not have IAR in our
-CI, but luckily there should not be too many reasons to use these.
-However, if you do, they should be kept behind a
-`CATCH_CONFIG_DISABLE_EXCEPTIONS` macro.
-
-### Unqualified usage of functions from C's stdlib
-
-If you are using a function from C's stdlib, please include the header
-as `<cfoo>` and call the function qualified. The common knowledge that
-there is no difference is wrong, QNX and VxWorks won't compile if you
-include the header as `<cfoo>` and call the function unqualified.
-
-
-----
-
-_This documentation will always be in-progress as new information comes
-up, but we are trying to keep it as up to date as possible._
+ *this document is still in-progress...*
 
 ---
 
diff --git a/docs/event-listeners.md b/docs/event-listeners.md
index 6231100..c6625a2 100644
--- a/docs/event-listeners.md
+++ b/docs/event-listeners.md
@@ -29,13 +29,13 @@
 
     using TestEventListenerBase::TestEventListenerBase; // inherit constructor
 
-    void testCaseStarting( Catch::TestCaseInfo const& testInfo ) override {
+    virtual void testCaseStarting( Catch::TestCaseInfo const& testInfo ) override {
         // Perform some setup before a test case is run
     }
     
-    void testCaseEnded( Catch::TestCaseStats const& testCaseStats ) override {
+    virtual void testCaseEnded( Catch::TestCaseStats const& testCaseStats ) override {
         // Tear-down after a test case is run
-    }
+    }    
 };
 CATCH_REGISTER_LISTENER( MyListener )
 ```
diff --git a/docs/generators.md b/docs/generators.md
index 57fdf44..8ad47e3 100644
--- a/docs/generators.md
+++ b/docs/generators.md
@@ -57,11 +57,11 @@
 * `filter(predicate, GeneratorWrapper<T>&&)` for `FilterGenerator<T, Predicate>`
 * `take(count, GeneratorWrapper<T>&&)` for `TakeGenerator<T>`
 * `repeat(repeats, GeneratorWrapper<T>&&)` for `RepeatGenerator<T>`
-* `map(func, GeneratorWrapper<T>&&)` for `MapGenerator<T, U, Func>` (map `U` to `T`, deduced from `Func`)
+* `map(func, GeneratorWrapper<T>&&)` for `MapGenerator<T, T, Func>` (map `T` to `T`)
 * `map<T>(func, GeneratorWrapper<U>&&)` for `MapGenerator<T, U, Func>` (map `U` to `T`)
 * `chunk(chunk-size, GeneratorWrapper<T>&&)` for `ChunkGenerator<T>`
 * `random(IntegerOrFloat a, IntegerOrFloat b)` for `RandomIntegerGenerator` or `RandomFloatGenerator`
-* `range(start, end)` for `RangeGenerator<T>` with a step size of `1`
+* `range(start, end)` for `RangeGenerator<T>` with a step size of `1` 
 * `range(start, end, step)` for `RangeGenerator<T>` with a custom step size
 
 
@@ -90,11 +90,7 @@
 take(100, random(300, 3000)));`. This is useful e.g. if you know that
 specific inputs are problematic and want to test them separately/first.
 
-**For safety reasons, you cannot use variables inside the `GENERATE` macro.
-This is done because the generator expression _will_ outlive the outside
-scope and thus capturing references is dangerous. If you need to use
-variables inside the generator expression, make sure you thought through
-the lifetime implications and use `GENERATE_COPY` or `GENERATE_REF`.**
+**For safety reasons, you cannot use variables inside the `GENERATE` macro.**
 
 You can also override the inferred type by using `as<type>` as the first
 argument to the macro. This can be useful when dealing with string literals,
@@ -102,7 +98,7 @@
 
 ```cpp
 TEST_CASE("type conversion", "[generators]") {
-    auto str = GENERATE(as<std::string>{}, "a", "bb", "ccc");
+    auto str = GENERATE(as<std::string>{}, "a", "bb", "ccc");`
     REQUIRE(str.size() > 0);
 }
 ```
diff --git a/docs/list-of-examples.md b/docs/list-of-examples.md
index 95e7bda..677dec1 100644
--- a/docs/list-of-examples.md
+++ b/docs/list-of-examples.md
@@ -17,7 +17,6 @@
 - Generators: [Create your own generator](../examples/300-Gen-OwnGenerator.cpp)
 - Generators: [Use map to convert types in GENERATE expression](../examples/301-Gen-MapTypeConversion.cpp)
 - Generators: [Use variables in generator expressions](../examples/310-Gen-VariablesInGenerators.cpp)
-- Generators: [Use custom variable capture in generator expressions](../examples/311-Gen-CustomCapture.cpp)
 
 
 ## Planned
diff --git a/docs/logging.md b/docs/logging.md
index 7b5c6c4..e896a57 100644
--- a/docs/logging.md
+++ b/docs/logging.md
@@ -85,7 +85,7 @@
 
 ## Streaming macros
 
-All these macros allow heterogeneous sequences of values to be streaming using the insertion operator (```<<```) in the same way that std::ostream, std::cout, etc support it.
+All these macros allow heterogenous sequences of values to be streaming using the insertion operator (```<<```) in the same way that std::ostream, std::cout, etc support it.
 
 E.g.:
 ```c++
diff --git a/docs/matchers.md b/docs/matchers.md
index 13c7d0c..adbd4ce 100644
--- a/docs/matchers.md
+++ b/docs/matchers.md
@@ -92,7 +92,7 @@
     IntRange( int begin, int end ) : m_begin( begin ), m_end( end ) {}
 
     // Performs the test for this matcher
-    bool match( int const& i ) const override {
+    virtual bool match( int const& i ) const override {
         return i >= m_begin && i <= m_end;
     }
 
@@ -100,7 +100,7 @@
     // include any provided data (the begin/ end in this case) and
     // be written as if it were stating a fact (in the output it will be
     // preceded by the value under test).
-    virtual std::string describe() const override {
+    virtual std::string describe() const {
         std::ostringstream ss;
         ss << "is between " << m_begin << " and " << m_end;
         return ss.str();
diff --git a/docs/opensource-users.md b/docs/opensource-users.md
index 489bbdc..d71b425 100644
--- a/docs/opensource-users.md
+++ b/docs/opensource-users.md
@@ -17,9 +17,6 @@
 
 ## Libraries & Frameworks
 
-### [ApprovalTests.cpp](https://github.com/approvals/ApprovalTests.cpp)
-C++11 implementation of Approval Tests, for quick, convenient testing of legacy code.
-
 ### [Azmq](https://github.com/zeromq/azmq)
 Boost Asio style bindings for ZeroMQ.
 
@@ -103,9 +100,6 @@
 ### [Newsbeuter](https://github.com/akrennmair/newsbeuter)
 Newsbeuter is an open-source RSS/Atom feed reader for text terminals.
 
-### [raspigcd](https://github.com/pantadeusz/raspigcd)
-Low level CLI app and library for execution of GCODE on Raspberry Pi without any additional microcontrolers (just RPi + Stepsticks).
-
 ### [SpECTRE](https://github.com/sxs-collaboration/spectre)
 SpECTRE is a code for multi-scale, multi-physics problems in astrophysics and gravitational physics.
 
diff --git a/docs/other-macros.md b/docs/other-macros.md
index 345234d..6f5fac7 100644
--- a/docs/other-macros.md
+++ b/docs/other-macros.md
@@ -30,7 +30,7 @@
 
 `CHECK_NOFAIL( expr )` is a variant of `CHECK` that does not fail the test
 case if _expr_ evaluates to `false`. This can be useful for checking some
-assumption, that might be violated without the test necessarily failing.
+assumption, that might be violated without the test neccessarily failing.
 
 Example output:
 ```
@@ -120,7 +120,7 @@
 `ANON_TEST_CASE` is a `TEST_CASE` replacement that will autogenerate
 unique name. The advantage of this is that you do not have to think
 of a name for the test case,`the disadvantage is that the name doesn't
-necessarily remain stable across different links, and thus it might be
+neccessarily remain stable across different links, and thus it might be
 hard to run directly.
 
 Example:
diff --git a/docs/release-notes.md b/docs/release-notes.md
index c5f92d2..34278c3 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -2,8 +2,6 @@
 
 # Release notes
 **Contents**<br>
-[2.7.2](#272)<br>
-[2.7.1](#271)<br>
 [2.7.0](#270)<br>
 [2.6.1](#261)<br>
 [2.6.0](#260)<br>
@@ -23,41 +21,6 @@
 [Older versions](#older-versions)<br>
 [Even Older versions](#even-older-versions)<br>
 
-
-## 2.7.2
-
-### Improvements
-* Added an approximate vector matcher (#1499)
-
-### Fixes
-* Filters will no longer be shown if there were none
-* Fixed compilation error when using Homebrew GCC on OS X (#1588, #1589)
-* Fixed the console reporter not showing messages that start with a newline (#1455, #1470)
-* Modified JUnit reporter's output so that rng seed and filters are reported according to the JUnit schema (#1598)
-* Fixed some obscure warnings and static analysis passes
-
-### Miscellaneous
-* Various improvements to `ParseAndAddCatchTests` (#1559, #1601)
-  * When a target is parsed, it receives `ParseAndAddCatchTests_TESTS` property which summarizes found tests
-  * Fixed problem with tests not being found if the `OptionalCatchTestLauncher` variables is used
-  * Including the script will no longer forcefully modify `CMAKE_MINIMUM_REQUIRED_VERSION`
-  * CMake object libraries are ignored when parsing to avoid needless warnings
-* `CatchAddTests` now adds test's tags to their CTest labels (#1600)
-* Added basic CPack support to our build
-
-## 2.7.1
-
-### Improvements
-* Reporters now print out the filters applied to test cases (#1550, #1585)
-* Added `GENERATE_COPY` and `GENERATE_VAR` macros that can use variables inside the generator expression
-  * Because of the significant danger of lifetime issues, the default `GENERATE` macro still does not allow variables
-* The `map` generator helper now deduces the mapped return type (#1576)
-
-### Fixes
-* Fixed ObjC++ compilation (#1571)
-* Fixed test tag parsing so that `[.foo]` is now parsed as `[.][foo]`.
-* Suppressed warning caused by the Windows headers defining SE codes in different manners (#1575)
-
 ## 2.7.0
 
 ### Improvements
@@ -79,7 +42,7 @@
 * Running tests will no longer open the specified output file twice (#1545)
   * This would cause trouble when the file was not a file, but rather a named pipe
   * Fixes the CLion/Resharper integration with Catch
-* Fixed `-Wunreachable-code` occurring with (old) ccache+cmake+clang combination (#1540)
+* Fixed `-Wunreachable-code` occuring with (old) ccache+cmake+clang combination (#1540)
 * Fixed `-Wdefaulted-function-deleted` warning with Clang 8 (#1537)
 * Catch2's type traits and helpers are now properly namespaced inside `Catch::` (#1548)
 * Fixed std{out,err} redirection for failing test (#1514, #1525)
@@ -761,7 +724,7 @@
   * Usage of `gettimeofday` inside Catch should no longer cause compilation errors.
 * Improved `-Wparentheses` suppression for gcc (#674)
   * When compiled with gcc 4.8 or newer, the suppression is localized to assertions only
-  * Otherwise it is suppressed for the whole TU
+  * Otherwise it is supressed for the whole TU
 * Fixed test spec parser issue (with escapes in multiple names)
 
 ##### Other
@@ -844,7 +807,7 @@
 
 ##### Other:
 * Types with overloaded `&&` operator are no longer evaluated twice when used in an assertion macro.
-* The use of `__COUNTER__` is suppressed when Catch is parsed by CLion
+* The use of `__COUNTER__` is supressed when Catch is parsed by CLion
   * This change is not active when compiling a binary
 * Approval tests can now be run on Windows
 * CMake will now warn if a file is present in the `include` folder but not is not enumerated as part of the project
diff --git a/docs/release-process.md b/docs/release-process.md
index 7fa5f7e..412cf2d 100644
--- a/docs/release-process.md
+++ b/docs/release-process.md
@@ -32,7 +32,7 @@
 
 ### Commit and push update to GitHub
 
-After version number is incremented, single-include header is regenerated and release notes are updated, changes should be committed and pushed to GitHub.
+After version number is incremented, single-include header is regenerated and release notes are updated, changes should be commited and pushed to GitHub.
 
 
 ### Release on GitHub
diff --git a/docs/tutorial.md b/docs/tutorial.md
index e45f967..7c0f814 100644
--- a/docs/tutorial.md
+++ b/docs/tutorial.md
@@ -23,7 +23,7 @@
 
 ## Where to put it?
 
-Catch2 is header only. All you need to do is drop the file somewhere reachable from your project - either in some central location you can set your header search path to find, or directly into your project tree itself! This is a particularly good option for other Open-Source projects that want to use Catch for their test suite. See [this blog entry for more on that](https://levelofindirection.com/blog/unit-testing-in-cpp-and-objective-c-just-got-ridiculously-easier-still.html).
+Catch2 is header only. All you need to do is drop the file somewhere reachable from your project - either in some central location you can set your header search path to find, or directly into your project tree itself! This is a particularly good option for other Open-Source projects that want to use Catch for their test suite. See [this blog entry for more on that](http://www.levelofindirection.com/journal/2011/5/27/unit-testing-in-c-and-objective-c-just-got-ridiculously-easi.html).
 
 The rest of this tutorial will assume that the Catch2 single-include header (or the include folder) is available unqualified - but you may need to prefix it with a folder name if necessary.
 
@@ -103,7 +103,7 @@
 
 ### What did we do here?
 
-Although this was a simple test it's been enough to demonstrate a few things about how Catch is used. Let's take a moment to consider those before we move on.
+Although this was a simple test it's been enough to demonstrate a few things about how Catch is used. Let's take moment to consider those before we move on.
 
 1. All we did was ```#define``` one identifier and ```#include``` one header and we got everything - even an implementation of ```main()``` that will [respond to command line arguments](command-line.md#top). You can only use that ```#define``` in one implementation file, for (hopefully) obvious reasons. Once you have more than one file with unit tests in you'll just ```#include "catch.hpp"``` and go. Usually it's a good idea to have a dedicated implementation file that just has ```#define CATCH_CONFIG_MAIN``` and ```#include "catch.hpp"```. You can also provide your own implementation of main and drive Catch yourself (see [Supplying-your-own-main()](own-main.md#top)).
 2. We introduce test cases with the ```TEST_CASE``` macro. This macro takes one or two arguments - a free form test name and, optionally, one or more tags (for more see <a href="#test-cases-and-sections">Test cases and Sections</a>, ). The test name must be unique. You can run sets of tests by specifying a wildcarded test name or a tag expression. See the [command line docs](command-line.md#top) for more information on running tests.
@@ -159,7 +159,7 @@
 
 So far so good - this is already an improvement on the setup/teardown approach because now we see our setup code inline and use the stack.
 
-The power of sections really shows, however, when we need to execute a sequence of checked operations. Continuing the vector example, we might want to verify that attempting to reserve a capacity smaller than the current capacity of the vector changes nothing. We can do that, naturally, like so:
+The power of sections really shows, however, when we need to execute a sequence of, checked, operations. Continuing the vector example, we might want to verify that attempting to reserve a capacity smaller than the current capacity of the vector changes nothing. We can do that, naturally, like so:
 
 ```c++
     SECTION( "reserving bigger changes capacity but not size" ) {
diff --git a/examples/210-Evt-EventListeners.cpp b/examples/210-Evt-EventListeners.cpp
index 2d5fdb2..fde51c7 100644
--- a/examples/210-Evt-EventListeners.cpp
+++ b/examples/210-Evt-EventListeners.cpp
@@ -305,7 +305,7 @@
     ~MyListener();
 
     // The whole test run starting
-    void testRunStarting( Catch::TestRunInfo const& testRunInfo ) override {
+    virtual void testRunStarting( Catch::TestRunInfo const& testRunInfo ) override {
         std::cout
             << std::boolalpha
             << "\nEvent: testRunStarting:\n";
@@ -313,7 +313,7 @@
     }
 
     // The whole test run ending
-    void testRunEnded( Catch::TestRunStats const& testRunStats ) override {
+    virtual void testRunEnded( Catch::TestRunStats const& testRunStats ) override {
         std::cout
             << dashed_line
             << "\nEvent: testRunEnded:\n";
@@ -321,7 +321,7 @@
     }
 
     // A test is being skipped (because it is "hidden")
-    void skipTest( Catch::TestCaseInfo const& testInfo ) override {
+    virtual void skipTest( Catch::TestCaseInfo const& testInfo ) override {
         std::cout
             << dashed_line
             << "\nEvent: skipTest:\n";
@@ -329,7 +329,7 @@
     }
 
     // Test cases starting
-    void testCaseStarting( Catch::TestCaseInfo const& testInfo ) override {
+    virtual void testCaseStarting( Catch::TestCaseInfo const& testInfo ) override {
         std::cout
             << dashed_line
             << "\nEvent: testCaseStarting:\n";
@@ -337,30 +337,30 @@
     }
 
     // Test cases ending
-    void testCaseEnded( Catch::TestCaseStats const& testCaseStats ) override {
+    virtual void testCaseEnded( Catch::TestCaseStats const& testCaseStats ) override {
         std::cout << "\nEvent: testCaseEnded:\n";
         print( std::cout, 1, "testCaseStats", testCaseStats );
     }
 
     // Sections starting
-    void sectionStarting( Catch::SectionInfo const& sectionInfo ) override {
+    virtual void sectionStarting( Catch::SectionInfo const& sectionInfo ) override {
         std::cout << "\nEvent: sectionStarting:\n";
         print( std::cout, 1, "- sectionInfo", sectionInfo );
     }
 
     // Sections ending
-    void sectionEnded( Catch::SectionStats const& sectionStats ) override {
+    virtual void sectionEnded( Catch::SectionStats const& sectionStats ) override {
         std::cout << "\nEvent: sectionEnded:\n";
         print( std::cout, 1, "- sectionStats", sectionStats );
     }
 
     // Assertions before/ after
-    void assertionStarting( Catch::AssertionInfo const& assertionInfo ) override {
+    virtual void assertionStarting( Catch::AssertionInfo const& assertionInfo ) override {
         std::cout << "\nEvent: assertionStarting:\n";
         print( std::cout, 1, "- assertionInfo", assertionInfo );
     }
 
-    bool assertionEnded( Catch::AssertionStats const& assertionStats ) override {
+    virtual bool assertionEnded( Catch::AssertionStats const& assertionStats ) override {
         std::cout << "\nEvent: assertionEnded:\n";
         print( std::cout, 1, "- assertionStats", assertionStats );
         return true;
diff --git a/examples/310-Gen-VariablesInGenerators.cpp b/examples/310-Gen-VariablesInGenerators.cpp
index 422815d..96840bb 100644
--- a/examples/310-Gen-VariablesInGenerators.cpp
+++ b/examples/310-Gen-VariablesInGenerators.cpp
@@ -8,6 +8,41 @@
 
 #include <catch2/catch.hpp>
 
+#include <random>
+
+// Lets start by implementing a parametrizable double generator
+class RandomDoubleGenerator : public Catch::Generators::IGenerator<double> {
+    std::minstd_rand m_rand;
+    std::uniform_real_distribution<> m_dist;
+    double current_number;
+public:
+
+    RandomDoubleGenerator(double low, double high):
+        m_rand(std::random_device{}()),
+        m_dist(low, high)
+    {
+        static_cast<void>(next());
+    }
+
+    double const& get() const override;
+    bool next() override {
+        current_number = m_dist(m_rand);
+        return true;
+    }
+};
+
+// Avoids -Wweak-vtables
+double const& RandomDoubleGenerator::get() const {
+    return current_number;
+}
+
+
+// Also provide a nice shortcut for creating the generator
+Catch::Generators::GeneratorWrapper<double> random(double low, double high) {
+    return Catch::Generators::GeneratorWrapper<double>(std::unique_ptr<Catch::Generators::IGenerator<double>>(new RandomDoubleGenerator(low, high)));
+}
+
+
 TEST_CASE("Generate random doubles across different ranges",
           "[generator][example][advanced]") {
     // Workaround for old libstdc++
@@ -20,12 +55,16 @@
     }));
 
     // This will not compile (intentionally), because it accesses a variable
-    // auto number = GENERATE(take(50, random(std::get<0>(r), std::get<1>(r))));
-
-   // GENERATE_COPY copies all variables mentioned inside the expression
-   // thus this will work.
-    auto number = GENERATE_COPY(take(50, random(std::get<0>(r), std::get<1>(r))));
-
+    // auto number = GENERATE(take(50, random(r.first, r.second)));
+    
+    // We have to manually register the generators instead
+    // Notice that we are using value capture in the lambda, to avoid lifetime issues
+    auto number = Catch::Generators::generate( CATCH_INTERNAL_LINEINFO,
+        [=]{
+            using namespace Catch::Generators;
+            return makeGenerators(take(50, random(std::get<0>(r), std::get<1>(r))));
+        }
+    );
     REQUIRE(std::abs(number) > 0);
 }
 
diff --git a/examples/311-Gen-CustomCapture.cpp b/examples/311-Gen-CustomCapture.cpp
deleted file mode 100644
index da6d686..0000000
--- a/examples/311-Gen-CustomCapture.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-// 311-Gen-CustomCapture.cpp
-// Shows how to provide custom capture list to the generator expression
-
-// Note that using variables inside generators is dangerous and should
-// be done only if you know what you are doing, because the generators
-// _WILL_ outlive the variables. Also, even if you know what you are
-// doing, you should probably use GENERATE_COPY or GENERATE_REF macros
-// instead. However, if your use case requires having a
-// per-variable custom capture list, this example shows how to achieve
-// that.
-
-#include <catch2/catch.hpp>
-
-TEST_CASE("Generate random doubles across different ranges",
-          "[generator][example][advanced]") {
-    // Workaround for old libstdc++
-    using record = std::tuple<double, double>;
-    // Set up 3 ranges to generate numbers from
-    auto r1 = GENERATE(table<double, double>({
-        record{3, 4},
-        record{-4, -3},
-        record{10, 1000}
-    }));
-
-    auto r2(r1);
-    
-    // This will take r1 by reference and r2 by value.
-    // Note that there are no advantages for doing so in this example,
-    // it is done only for expository purposes.
-    auto number = Catch::Generators::generate( CATCH_INTERNAL_LINEINFO,
-        [&r1, r2]{
-            using namespace Catch::Generators;
-            return makeGenerators(take(50, random(std::get<0>(r1), std::get<1>(r2))));
-        }
-    );
-
-    REQUIRE(std::abs(number) > 0);
-}
-
-// Compiling and running this file will result in 150 successful assertions
-
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 65dc5f5..dff5c74 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -47,7 +47,6 @@
     300-Gen-OwnGenerator.cpp
     301-Gen-MapTypeConversion.cpp
     310-Gen-VariablesInGenerators.cpp
-    311-Gen-CustomCapture.cpp
 )
 
 # main-s for reporter-specific test sources:
diff --git a/include/catch.hpp b/include/catch.hpp
index 5667def..e15588f 100644
--- a/include/catch.hpp
+++ b/include/catch.hpp
@@ -11,7 +11,7 @@
 
 #define CATCH_VERSION_MAJOR 2
 #define CATCH_VERSION_MINOR 7
-#define CATCH_VERSION_PATCH 2
+#define CATCH_VERSION_PATCH 0
 
 #ifdef __clang__
 #    pragma clang system_header
diff --git a/include/external/clara.hpp b/include/external/clara.hpp
index c7348bf..20c6da7 100644
--- a/include/external/clara.hpp
+++ b/include/external/clara.hpp
@@ -111,9 +111,6 @@
 			m_suffix = false;
 			auto width = m_column.m_width - indent();
 			m_end = m_pos;
-			if (line()[m_pos] == '\n') {
-				++m_end;
-			}
 			while (m_end < line().size() && line()[m_end] != '\n')
 				++m_end;
 
diff --git a/include/internal/catch_approx.cpp b/include/internal/catch_approx.cpp
index da7e402..a7d7111 100644
--- a/include/internal/catch_approx.cpp
+++ b/include/internal/catch_approx.cpp
@@ -55,18 +55,18 @@
         return marginComparison(m_value, other, m_margin) || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(m_value)));
     }
 
-    void Approx::setMargin(double newMargin) {
-        CATCH_ENFORCE(newMargin >= 0,
-            "Invalid Approx::margin: " << newMargin << '.'
+    void Approx::setMargin(double margin) {
+        CATCH_ENFORCE(margin >= 0,
+            "Invalid Approx::margin: " << margin << '.'
             << " Approx::Margin has to be non-negative.");
-        m_margin = newMargin;
+        m_margin = margin;
     }
 
-    void Approx::setEpsilon(double newEpsilon) {
-        CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0,
-            "Invalid Approx::epsilon: " << newEpsilon << '.'
+    void Approx::setEpsilon(double epsilon) {
+        CATCH_ENFORCE(epsilon >= 0 && epsilon <= 1.0,
+            "Invalid Approx::epsilon: " << epsilon << '.'
             << " Approx::epsilon has to be in [0, 1]");
-        m_epsilon = newEpsilon;
+        m_epsilon = epsilon;
     }
 
 } // end namespace Detail
diff --git a/include/internal/catch_config.cpp b/include/internal/catch_config.cpp
index d9ee918..e8ad2a8 100644
--- a/include/internal/catch_config.cpp
+++ b/include/internal/catch_config.cpp
@@ -16,7 +16,10 @@
         m_stream( openStream() )
     {
         TestSpecParser parser(ITagAliasRegistry::get());
-        if (!data.testsOrTags.empty()) {
+        if (data.testsOrTags.empty()) {
+            parser.parse("~[.]"); // All not hidden tests
+        }
+        else {
             m_hasTestFilters = true;
             for( auto const& testOrTags : data.testsOrTags )
                 parser.parse( testOrTags );
diff --git a/include/internal/catch_config.hpp b/include/internal/catch_config.hpp
index a985023..7bafc9c 100644
--- a/include/internal/catch_config.hpp
+++ b/include/internal/catch_config.hpp
@@ -82,10 +82,10 @@
         std::string getProcessName() const;
         std::string const& getReporterName() const;
 
-        std::vector<std::string> const& getTestsOrTags() const override;
+        std::vector<std::string> const& getTestsOrTags() const;
         std::vector<std::string> const& getSectionsToRun() const override;
 
-        TestSpec const& testSpec() const override;
+        virtual TestSpec const& testSpec() const override;
         bool hasTestFilters() const override;
 
         bool showHelp() const;
diff --git a/include/internal/catch_console_colour.cpp b/include/internal/catch_console_colour.cpp
index 0a13a1b..07072db 100644
--- a/include/internal/catch_console_colour.cpp
+++ b/include/internal/catch_console_colour.cpp
@@ -69,7 +69,7 @@
             originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
         }
 
-        void use( Colour::Code _colourCode ) override {
+        virtual void use( Colour::Code _colourCode ) override {
             switch( _colourCode ) {
                 case Colour::None:      return setTextAttribute( originalForegroundAttributes );
                 case Colour::White:     return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
@@ -132,7 +132,7 @@
     // https://github.com/philsquared/Catch/pull/131
     class PosixColourImpl : public IColourImpl {
     public:
-        void use( Colour::Code _colourCode ) override {
+        virtual void use( Colour::Code _colourCode ) override {
             switch( _colourCode ) {
                 case Colour::None:
                 case Colour::White:     return setColour( "[0m" );
diff --git a/include/internal/catch_context.cpp b/include/internal/catch_context.cpp
index 52fca30..e116f28 100644
--- a/include/internal/catch_context.cpp
+++ b/include/internal/catch_context.cpp
@@ -13,27 +13,27 @@
     class Context : public IMutableContext, NonCopyable {
 
     public: // IContext
-        IResultCapture* getResultCapture() override {
+        virtual IResultCapture* getResultCapture() override {
             return m_resultCapture;
         }
-        IRunner* getRunner() override {
+        virtual IRunner* getRunner() override {
             return m_runner;
         }
 
-        IConfigPtr const& getConfig() const override {
+        virtual IConfigPtr const& getConfig() const override {
             return m_config;
         }
 
-        ~Context() override;
+        virtual ~Context() override;
 
     public: // IMutableContext
-        void setResultCapture( IResultCapture* resultCapture ) override {
+        virtual void setResultCapture( IResultCapture* resultCapture ) override {
             m_resultCapture = resultCapture;
         }
-        void setRunner( IRunner* runner ) override {
+        virtual void setRunner( IRunner* runner ) override {
             m_runner = runner;
         }
-        void setConfig( IConfigPtr const& config ) override {
+        virtual void setConfig( IConfigPtr const& config ) override {
             m_config = config;
         }
 
diff --git a/include/internal/catch_debugger.cpp b/include/internal/catch_debugger.cpp
index f04900a..71dc650 100644
--- a/include/internal/catch_debugger.cpp
+++ b/include/internal/catch_debugger.cpp
@@ -18,23 +18,19 @@
 #  include <stdbool.h>
 #  include <sys/types.h>
 #  include <unistd.h>
+#  include <sys/sysctl.h>
 #  include <cstddef>
 #  include <ostream>
 
-#ifdef __apple_build_version__
-    // These headers will only compile with AppleClang (XCode)
-    // For other compilers (Clang, GCC, ... ) we need to exclude them
-#  include <sys/sysctl.h>
-#endif
+namespace Catch {
 
-    namespace Catch {
-        #ifdef __apple_build_version__
         // The following function is taken directly from the following technical note:
-        // https://developer.apple.com/library/archive/qa/qa1361/_index.html
+        // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html
 
         // Returns true if the current process is being debugged (either
         // running under the debugger or has a debugger attached post facto).
         bool isDebuggerActive(){
+
             int                 mib[4];
             struct kinfo_proc   info;
             std::size_t         size;
@@ -64,12 +60,6 @@
 
             return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
         }
-        #else
-        bool isDebuggerActive() {
-            // We need to find another way to determine this for non-appleclang compilers on macOS
-            return false;
-        }
-        #endif
     } // namespace Catch
 
 #elif defined(CATCH_PLATFORM_LINUX)
diff --git a/include/internal/catch_exception_translator_registry.h b/include/internal/catch_exception_translator_registry.h
index bb07c13..da2f4f1 100644
--- a/include/internal/catch_exception_translator_registry.h
+++ b/include/internal/catch_exception_translator_registry.h
@@ -19,7 +19,7 @@
     public:
         ~ExceptionTranslatorRegistry();
         virtual void registerTranslator( const IExceptionTranslator* translator );
-        std::string translateActiveException() const override;
+        virtual std::string translateActiveException() const override;
         std::string tryTranslators() const;
 
     private:
diff --git a/include/internal/catch_fatal_condition.cpp b/include/internal/catch_fatal_condition.cpp
index cea271f..24e16d3 100644
--- a/include/internal/catch_fatal_condition.cpp
+++ b/include/internal/catch_fatal_condition.cpp
@@ -37,10 +37,10 @@
     // Windows can easily distinguish between SO and SigSegV,
     // but SigInt, SigTerm, etc are handled differently.
     static SignalDefs signalDefs[] = {
-        { static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION),  "SIGILL - Illegal instruction signal" },
-        { static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), "SIGSEGV - Stack overflow" },
-        { static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION), "SIGSEGV - Segmentation violation signal" },
-        { static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), "Divide by zero error" },
+        { EXCEPTION_ILLEGAL_INSTRUCTION,  "SIGILL - Illegal instruction signal" },
+        { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" },
+        { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" },
+        { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" },
     };
 
     LONG CALLBACK FatalConditionHandler::handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {
diff --git a/include/internal/catch_generators.hpp b/include/internal/catch_generators.hpp
index 8f06b8c..40e434e 100644
--- a/include/internal/catch_generators.hpp
+++ b/include/internal/catch_generators.hpp
@@ -201,10 +201,7 @@
 } // namespace Catch
 
 #define GENERATE( ... ) \
-    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
-#define GENERATE_COPY( ... ) \
-    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
-#define GENERATE_REF( ... ) \
-    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
+    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, []{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
+
 
 #endif // TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED
diff --git a/include/internal/catch_generators_generic.hpp b/include/internal/catch_generators_generic.hpp
index 2903ba6..2226dbc 100644
--- a/include/internal/catch_generators_generic.hpp
+++ b/include/internal/catch_generators_generic.hpp
@@ -169,28 +169,16 @@
         }
     };
 
-#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703
-    // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is
-    // replaced with std::invoke_result here. Also *_t format is preferred over
-    // typename *::type format.
-    template <typename Func, typename U>
-    using MapFunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U>>>;
-#else
-    template <typename Func, typename U>
-    using MapFunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U)>::type>::type>::type;
-#endif
-
-    template <typename Func, typename U, typename T = MapFunctionReturnType<Func, U>>
+    template <typename T, typename U, typename Func>
     GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
         return GeneratorWrapper<T>(
             pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))
         );
     }
-
-    template <typename T, typename U, typename Func>
-    GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
+    template <typename T, typename Func>
+    GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<T>&& generator) {
         return GeneratorWrapper<T>(
-            pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))
+            pf::make_unique<MapGenerator<T, T, Func>>(std::forward<Func>(function), std::move(generator))
         );
     }
 
diff --git a/include/internal/catch_interfaces_config.h b/include/internal/catch_interfaces_config.h
index 341bb74..f509c7e 100644
--- a/include/internal/catch_interfaces_config.h
+++ b/include/internal/catch_interfaces_config.h
@@ -69,7 +69,6 @@
         virtual ShowDurations::OrNot showDurations() const = 0;
         virtual TestSpec const& testSpec() const = 0;
         virtual bool hasTestFilters() const = 0;
-        virtual std::vector<std::string> const& getTestsOrTags() const = 0;
         virtual RunTests::InWhatOrder runOrder() const = 0;
         virtual unsigned int rngSeed() const = 0;
         virtual int benchmarkResolutionMultiple() const = 0;
diff --git a/include/internal/catch_matchers_generic.hpp b/include/internal/catch_matchers_generic.hpp
index 7d57c9d..7c4f9f1 100644
--- a/include/internal/catch_matchers_generic.hpp
+++ b/include/internal/catch_matchers_generic.hpp
@@ -45,7 +45,7 @@
 
     // The following functions create the actual matcher objects.
     // The user has to explicitly specify type to the function, because
-    // inferring std::function<bool(T const&)> is hard (but possible) and
+    // infering std::function<bool(T const&)> is hard (but possible) and
     // requires a lot of TMP.
     template<typename T>
     Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate, std::string const& description = "") {
diff --git a/include/internal/catch_matchers_vector.h b/include/internal/catch_matchers_vector.h
index 2dc8a71..1e29cc9 100644
--- a/include/internal/catch_matchers_vector.h
+++ b/include/internal/catch_matchers_vector.h
@@ -9,7 +9,6 @@
 #define TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED
 
 #include "catch_matchers.h"
-#include "catch_approx.h"
 
 #include <algorithm>
 
@@ -17,6 +16,28 @@
 namespace Matchers {
 
     namespace Vector {
+        namespace Detail {
+            template <typename InputIterator, typename T>
+            size_t count(InputIterator first, InputIterator last, T const& item) {
+                size_t cnt = 0;
+                for (; first != last; ++first) {
+                    if (*first == item) {
+                        ++cnt;
+                    }
+                }
+                return cnt;
+            }
+            template <typename InputIterator, typename T>
+            bool contains(InputIterator first, InputIterator last, T const& item) {
+                for (; first != last; ++first) {
+                    if (*first == item) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+        }
+
         template<typename T>
         struct ContainsElementMatcher : MatcherBase<std::vector<T>> {
 
@@ -92,42 +113,6 @@
         };
 
         template<typename T>
-        struct ApproxMatcher : MatcherBase<std::vector<T>> {
-
-            ApproxMatcher(std::vector<T> const& comparator) : m_comparator( comparator ) {}
-
-            bool match(std::vector<T> const &v) const override {
-                if (m_comparator.size() != v.size())
-                    return false;
-                for (std::size_t i = 0; i < v.size(); ++i)
-                    if (m_comparator[i] != approx(v[i]))
-                        return false;
-                return true;
-            }
-            std::string describe() const override {
-                return "is approx: " + ::Catch::Detail::stringify( m_comparator );
-            }
-            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
-            ApproxMatcher& epsilon( T const& newEpsilon ) {
-                approx.epsilon(newEpsilon);
-                return *this;
-            }
-            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
-            ApproxMatcher& margin( T const& newMargin ) {
-                approx.margin(newMargin);
-                return *this;
-            }
-            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
-            ApproxMatcher& scale( T const& newScale ) {
-                approx.scale(newScale);
-                return *this;
-            }
-
-            std::vector<T> const& m_comparator;
-            mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom();
-        };
-
-        template<typename T>
         struct UnorderedEqualsMatcher : MatcherBase<std::vector<T>> {
             UnorderedEqualsMatcher(std::vector<T> const& target) : m_target(target) {}
             bool match(std::vector<T> const& vec) const override {
@@ -136,7 +121,28 @@
                 if (m_target.size() != vec.size()) {
                     return false;
                 }
-                return std::is_permutation(m_target.begin(), m_target.end(), vec.begin());
+                auto lfirst = m_target.begin(), llast = m_target.end();
+                auto rfirst = vec.begin(), rlast = vec.end();
+                // Cut common prefix to optimize checking of permuted parts
+                while (lfirst != llast && *lfirst == *rfirst) {
+                    ++lfirst; ++rfirst;
+                }
+                if (lfirst == llast) {
+                    return true;
+                }
+
+                for (auto mid = lfirst; mid != llast; ++mid) {
+                    // Skip already counted items
+                    if (Detail::contains(lfirst, mid, *mid)) {
+                        continue;
+                    }
+                    size_t num_vec = Detail::count(rfirst, rlast, *mid);
+                    if (num_vec == 0 || Detail::count(lfirst, llast, *mid) != num_vec) {
+                        return false;
+                    }
+                }
+
+                return true;
             }
 
             std::string describe() const override {
@@ -167,11 +173,6 @@
     }
 
     template<typename T>
-    Vector::ApproxMatcher<T> Approx( std::vector<T> const& comparator ) {
-        return Vector::ApproxMatcher<T>( comparator );
-    }
-
-    template<typename T>
     Vector::UnorderedEqualsMatcher<T> UnorderedEquals(std::vector<T> const& target) {
         return Vector::UnorderedEqualsMatcher<T>(target);
     }
diff --git a/include/internal/catch_objc.hpp b/include/internal/catch_objc.hpp
index f927e0d..39cbb1f 100644
--- a/include/internal/catch_objc.hpp
+++ b/include/internal/catch_objc.hpp
@@ -116,7 +116,7 @@
                     arcSafeRelease( m_substr );
                 }
 
-                bool match( NSString* const& str ) const override {
+                bool match( NSString* arg ) const override {
                     return false;
                 }
 
@@ -126,7 +126,7 @@
             struct Equals : StringHolder {
                 Equals( NSString* substr ) : StringHolder( substr ){}
 
-                bool match( NSString* const& str ) const override {
+                bool match( NSString* str ) const override {
                     return  (str != nil || m_substr == nil ) &&
                             [str isEqualToString:m_substr];
                 }
@@ -139,7 +139,7 @@
             struct Contains : StringHolder {
                 Contains( NSString* substr ) : StringHolder( substr ){}
 
-                bool match( NSString* const& str ) const override {
+                bool match( NSString* str ) const {
                     return  (str != nil || m_substr == nil ) &&
                             [str rangeOfString:m_substr].location != NSNotFound;
                 }
@@ -152,7 +152,7 @@
             struct StartsWith : StringHolder {
                 StartsWith( NSString* substr ) : StringHolder( substr ){}
 
-                bool match( NSString* const& str ) const override {
+                bool match( NSString* str ) const override {
                     return  (str != nil || m_substr == nil ) &&
                             [str rangeOfString:m_substr].location == 0;
                 }
@@ -164,7 +164,7 @@
             struct EndsWith : StringHolder {
                 EndsWith( NSString* substr ) : StringHolder( substr ){}
 
-                bool match( NSString* const& str ) const override {
+                bool match( NSString* str ) const override {
                     return  (str != nil || m_substr == nil ) &&
                             [str rangeOfString:m_substr].location == [str length] - [m_substr length];
                 }
diff --git a/include/internal/catch_output_redirect.cpp b/include/internal/catch_output_redirect.cpp
index 1308bfe..a0a9aff 100644
--- a/include/internal/catch_output_redirect.cpp
+++ b/include/internal/catch_output_redirect.cpp
@@ -71,7 +71,7 @@
             if (strerror_s(buffer, errno)) {
                 CATCH_RUNTIME_ERROR("Could not translate errno to a string");
             }
-            CATCH_RUNTIME_ERROR("Could not open the temp file: '" << m_buffer << "' because: " << buffer);
+            CATCH_RUNTIME_ERROR("Coul dnot open the temp file: '" << m_buffer << "' because: " << buffer);
         }
     }
 #else
diff --git a/include/internal/catch_reporter_registrars.hpp b/include/internal/catch_reporter_registrars.hpp
index 660f554..943fba6 100644
--- a/include/internal/catch_reporter_registrars.hpp
+++ b/include/internal/catch_reporter_registrars.hpp
@@ -18,11 +18,11 @@
 
         class ReporterFactory : public IReporterFactory {
 
-            IStreamingReporterPtr create( ReporterConfig const& config ) const override {
+            virtual IStreamingReporterPtr create( ReporterConfig const& config ) const override {
                 return std::unique_ptr<T>( new T( config ) );
             }
 
-            std::string getDescription() const override {
+            virtual std::string getDescription() const override {
                 return T::getDescription();
             }
         };
@@ -39,10 +39,10 @@
 
         class ListenerFactory : public IReporterFactory {
 
-            IStreamingReporterPtr create( ReporterConfig const& config ) const override {
+            virtual IStreamingReporterPtr create( ReporterConfig const& config ) const override {
                 return std::unique_ptr<T>( new T( config ) );
             }
-            std::string getDescription() const override {
+            virtual std::string getDescription() const override {
                 return std::string();
             }
         };
diff --git a/include/internal/catch_session.cpp b/include/internal/catch_session.cpp
index 38b74ef..a5907e9 100644
--- a/include/internal/catch_session.cpp
+++ b/include/internal/catch_session.cpp
@@ -72,10 +72,7 @@
 
             auto const& allTestCases = getAllTestCasesSorted(*config);
             for (auto const& testCase : allTestCases) {
-                bool matching = (!testSpec.hasFilters() && !testCase.isHidden()) ||
-                                 (testSpec.hasFilters() && matchTest(testCase, testSpec, *config));
-
-                if (!context.aborting() && matching)
+                if (!context.aborting() && matchTest(testCase, testSpec, *config))
                     totals += context.runTest(testCase);
                 else
                     context.reporter().skipTest(testCase);
diff --git a/include/internal/catch_test_case_info.cpp b/include/internal/catch_test_case_info.cpp
index 4baa9d4..536462d 100644
--- a/include/internal/catch_test_case_info.cpp
+++ b/include/internal/catch_test_case_info.cpp
@@ -43,7 +43,7 @@
         void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) {
             CATCH_ENFORCE( !isReservedTag(tag),
                           "Tag name: [" << tag << "] is not allowed.\n"
-                          << "Tag names starting with non alphanumeric characters are reserved\n"
+                          << "Tag names starting with non alpha-numeric characters are reserved\n"
                           << _lineInfo );
         }
     }
@@ -75,12 +75,6 @@
                     else if( prop == TestCaseInfo::None )
                         enforceNotReservedTag( tag, _lineInfo );
 
-                    // Merged hide tags like `[.approvals]` should be added as
-                    // `[.][approvals]`. The `[.]` is added at later point, so
-                    // we only strip the prefix
-                    if (startsWith(tag, '.') && tag.size() > 1) {
-                        tag.erase(0, 1);
-                    }
                     tags.push_back( tag );
                     tag.clear();
                     inTag = false;
diff --git a/include/internal/catch_test_case_registry_impl.cpp b/include/internal/catch_test_case_registry_impl.cpp
index a85d0ed..a6b7f57 100644
--- a/include/internal/catch_test_case_registry_impl.cpp
+++ b/include/internal/catch_test_case_registry_impl.cpp
@@ -54,12 +54,9 @@
     std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) {
         std::vector<TestCase> filtered;
         filtered.reserve( testCases.size() );
-        for (auto const& testCase : testCases) {
-            if ((!testSpec.hasFilters() && !testCase.isHidden()) ||
-                (testSpec.hasFilters() && matchTest(testCase, testSpec, config))) {
-                filtered.push_back(testCase);
-            }
-        }
+        for( auto const& testCase : testCases )
+            if( matchTest( testCase, testSpec, config ) )
+                filtered.push_back( testCase );
         return filtered;
     }
     std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) {
diff --git a/include/internal/catch_test_case_tracker.cpp b/include/internal/catch_test_case_tracker.cpp
index 1ef830d..210f273 100644
--- a/include/internal/catch_test_case_tracker.cpp
+++ b/include/internal/catch_test_case_tracker.cpp
@@ -32,6 +32,11 @@
     ITracker::~ITracker() = default;
 
 
+    TrackerContext& TrackerContext::instance() {
+        static TrackerContext s_instance;
+        return s_instance;
+    }
+
     ITracker& TrackerContext::startRun() {
         m_rootTracker = std::make_shared<SectionTracker>( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, nullptr );
         m_currentTracker = nullptr;
diff --git a/include/internal/catch_test_case_tracker.h b/include/internal/catch_test_case_tracker.h
index 97b63b8..1727600 100644
--- a/include/internal/catch_test_case_tracker.h
+++ b/include/internal/catch_test_case_tracker.h
@@ -71,6 +71,8 @@
 
     public:
 
+        static TrackerContext& instance();
+
         ITracker& startRun();
         void endRun();
 
diff --git a/include/internal/catch_test_spec.h b/include/internal/catch_test_spec.h
index d256518..baf8b01 100644
--- a/include/internal/catch_test_spec.h
+++ b/include/internal/catch_test_spec.h
@@ -33,7 +33,7 @@
         public:
             NamePattern( std::string const& name );
             virtual ~NamePattern();
-            bool matches( TestCaseInfo const& testCase ) const override;
+            virtual bool matches( TestCaseInfo const& testCase ) const override;
         private:
             WildcardPattern m_wildcardPattern;
         };
@@ -42,7 +42,7 @@
         public:
             TagPattern( std::string const& tag );
             virtual ~TagPattern();
-            bool matches( TestCaseInfo const& testCase ) const override;
+            virtual bool matches( TestCaseInfo const& testCase ) const override;
         private:
             std::string m_tag;
         };
@@ -51,7 +51,7 @@
         public:
             ExcludedPattern( PatternPtr const& underlyingPattern );
             virtual ~ExcludedPattern();
-            bool matches( TestCaseInfo const& testCase ) const override;
+            virtual bool matches( TestCaseInfo const& testCase ) const override;
         private:
             PatternPtr m_underlyingPattern;
         };
diff --git a/include/internal/catch_version.cpp b/include/internal/catch_version.cpp
index 5f4917c..a1d08b2 100644
--- a/include/internal/catch_version.cpp
+++ b/include/internal/catch_version.cpp
@@ -37,7 +37,7 @@
     }
 
     Version const& libraryVersion() {
-        static Version version( 2, 7, 2, "", 0 );
+        static Version version( 2, 7, 0, "", 0 );
         return version;
     }
 
diff --git a/include/reporters/catch_reporter_bases.cpp b/include/reporters/catch_reporter_bases.cpp
index fcbafef..ce3553e 100644
--- a/include/reporters/catch_reporter_bases.cpp
+++ b/include/reporters/catch_reporter_bases.cpp
@@ -41,20 +41,6 @@
         return std::string(buffer);
     }
 
-    std::string serializeFilters( std::vector<std::string> const& container ) {
-        ReusableStringStream oss;
-        bool first = true;
-        for (auto&& filter : container)
-        {
-            if (!first)
-                oss << ' ';
-            else
-                first = false;
-
-            oss << filter;
-        }
-        return oss.str();
-    }
 
     TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config)
         :StreamingReporterBase(_config) {}
diff --git a/include/reporters/catch_reporter_bases.hpp b/include/reporters/catch_reporter_bases.hpp
index a9b0640..4a27db6 100644
--- a/include/reporters/catch_reporter_bases.hpp
+++ b/include/reporters/catch_reporter_bases.hpp
@@ -25,8 +25,6 @@
     // Returns double formatted as %.3f (format expected on output)
     std::string getFormattedDuration( double duration );
 
-    std::string serializeFilters( std::vector<std::string> const& container );
-
     template<typename DerivedT>
     struct StreamingReporterBase : IStreamingReporter {
 
@@ -54,7 +52,6 @@
         void testRunStarting(TestRunInfo const& _testRunInfo) override {
             currentTestRunInfo = _testRunInfo;
         }
-
         void testGroupStarting(GroupInfo const& _groupInfo) override {
             currentGroupInfo = _groupInfo;
         }
diff --git a/include/reporters/catch_reporter_console.cpp b/include/reporters/catch_reporter_console.cpp
index 53b977e..76dc9ec 100644
--- a/include/reporters/catch_reporter_console.cpp
+++ b/include/reporters/catch_reporter_console.cpp
@@ -441,10 +441,6 @@
     stream << std::endl;
     StreamingReporterBase::testRunEnded(_testRunStats);
 }
-void ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) {
-    StreamingReporterBase::testRunStarting(_testInfo);
-    printTestFilters();
-}
 
 void ConsoleReporter::lazyPrint() {
 
@@ -626,11 +622,6 @@
     stream << getLineOfChars<'-'>() << '\n';
 }
 
-void ConsoleReporter::printTestFilters() {
-    if (m_config->testSpec().hasFilters())
-        stream << Colour(Colour::BrightYellow) << "Filters: " << serializeFilters( m_config->getTestsOrTags() ) << '\n';
-}
-
 CATCH_REGISTER_REPORTER("console", ConsoleReporter)
 
 } // end namespace Catch
diff --git a/include/reporters/catch_reporter_console.h b/include/reporters/catch_reporter_console.h
index effa58d..10cea49 100644
--- a/include/reporters/catch_reporter_console.h
+++ b/include/reporters/catch_reporter_console.h
@@ -46,7 +46,7 @@
         void testCaseEnded(TestCaseStats const& _testCaseStats) override;
         void testGroupEnded(TestGroupStats const& _testGroupStats) override;
         void testRunEnded(TestRunStats const& _testRunStats) override;
-        void testRunStarting(TestRunInfo const& _testRunInfo) override;
+
     private:
 
         void lazyPrint();
@@ -69,7 +69,6 @@
 
         void printTotalsDivider(Totals const& totals);
         void printSummaryDivider();
-        void printTestFilters();
 
     private:
         bool m_headerPrinted = false;
diff --git a/include/reporters/catch_reporter_junit.cpp b/include/reporters/catch_reporter_junit.cpp
index e837586..7e97ee3 100644
--- a/include/reporters/catch_reporter_junit.cpp
+++ b/include/reporters/catch_reporter_junit.cpp
@@ -76,6 +76,13 @@
     void JunitReporter::testRunStarting( TestRunInfo const& runInfo )  {
         CumulativeReporterBase::testRunStarting( runInfo );
         xml.startElement( "testsuites" );
+        if( m_config->rngSeed() != 0 ) {
+            xml.startElement( "properties" );
+            xml.scopedElement( "property" )
+                .writeAttribute( "name", "random-seed" )
+                .writeAttribute( "value", m_config->rngSeed() );
+            xml.endElement();
+        }
     }
 
     void JunitReporter::testGroupStarting( GroupInfo const& groupInfo ) {
@@ -114,7 +121,6 @@
 
     void JunitReporter::writeGroup( TestGroupNode const& groupNode, double suiteTime ) {
         XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" );
-
         TestGroupStats const& stats = groupNode.value;
         xml.writeAttribute( "name", stats.groupInfo.name );
         xml.writeAttribute( "errors", unexpectedExceptions );
@@ -127,21 +133,6 @@
             xml.writeAttribute( "time", suiteTime );
         xml.writeAttribute( "timestamp", getCurrentTimestamp() );
 
-        // Write properties if there are any
-        if (m_config->hasTestFilters() || m_config->rngSeed() != 0) {
-            auto properties = xml.scopedElement("properties");
-            if (m_config->hasTestFilters()) {
-                xml.scopedElement("property")
-                    .writeAttribute("name", "filters")
-                    .writeAttribute("value", serializeFilters(m_config->getTestsOrTags()));
-            }
-            if (m_config->rngSeed() != 0) {
-                xml.scopedElement("property")
-                    .writeAttribute("name", "random-seed")
-                    .writeAttribute("value", m_config->rngSeed());
-            }
-        }
-
         // Write test cases
         for( auto const& child : groupNode.children )
             writeTestCase( *child );
diff --git a/include/reporters/catch_reporter_xml.cpp b/include/reporters/catch_reporter_xml.cpp
index c7572d1..902014c 100644
--- a/include/reporters/catch_reporter_xml.cpp
+++ b/include/reporters/catch_reporter_xml.cpp
@@ -55,8 +55,6 @@
         m_xml.startElement( "Catch" );
         if( !m_config->name().empty() )
             m_xml.writeAttribute( "name", m_config->name() );
-        if (m_config->testSpec().hasFilters())
-            m_xml.writeAttribute( "filters", serializeFilters( m_config->getTestsOrTags() ) );
         if( m_config->rngSeed() != 0 )
             m_xml.scopedElement( "Randomness" )
                 .writeAttribute( "seed", m_config->rngSeed() );
diff --git a/projects/CMakeLists.txt b/projects/CMakeLists.txt
index 3fbd9b4..b3caa82 100644
--- a/projects/CMakeLists.txt
+++ b/projects/CMakeLists.txt
@@ -19,7 +19,7 @@
         ${SELF_TEST_DIR}/IntrospectiveTests/CmdLine.tests.cpp
         ${SELF_TEST_DIR}/IntrospectiveTests/GeneratorsImpl.tests.cpp
         ${SELF_TEST_DIR}/IntrospectiveTests/PartTracker.tests.cpp
-        ${SELF_TEST_DIR}/IntrospectiveTests/Tag.tests.cpp
+        ${SELF_TEST_DIR}/IntrospectiveTests/TagAlias.tests.cpp
         ${SELF_TEST_DIR}/IntrospectiveTests/String.tests.cpp
         ${SELF_TEST_DIR}/IntrospectiveTests/Xml.tests.cpp
         ${SELF_TEST_DIR}/UsageTests/Approx.tests.cpp
@@ -322,9 +322,6 @@
 
 # configure unit tests via CTest
 add_test(NAME RunTests COMMAND $<TARGET_FILE:SelfTest>)
-set_tests_properties(RunTests PROPERTIES
-    FAIL_REGULAR_EXPRESSION "Filters:"
-)
 
 add_test(NAME ListTests COMMAND $<TARGET_FILE:SelfTest> --list-tests --verbosity high)
 set_tests_properties(ListTests PROPERTIES 
diff --git a/projects/SelfTest/Baselines/compact.sw.approved.txt b/projects/SelfTest/Baselines/compact.sw.approved.txt
index 6fedbb9..2fcdd86 100644
--- a/projects/SelfTest/Baselines/compact.sw.approved.txt
+++ b/projects/SelfTest/Baselines/compact.sw.approved.txt
@@ -14,9 +14,6 @@
 Compilation.tests.cpp:<line number>: passed: std::memcmp(sarr, "456", sizeof(sarr)) == 0 for: 0 == 0 with 2 messages: 'uarr := "123"' and 'sarr := "456"'
 Compilation.tests.cpp:<line number>: passed:
 Compilation.tests.cpp:<line number>: passed: h1 == h2 for: [1403 helper] == [1403 helper]
-Message.tests.cpp:<line number>: warning: '
-This info message starts with a linebreak' with 1 message: '
-This warning message starts with a linebreak'
 This would not be caught previously
 Nor would this
 Tricky.tests.cpp:<line number>: failed: explicitly with 1 message: '1514'
@@ -326,9 +323,9 @@
 Matchers.tests.cpp:<line number>: passed: testStringForMatching(), Equals("this string contains 'ABC' as a substring", Catch::CaseSensitive::No) for: "this string contains 'abc' as a substring" equals: "this string contains 'abc' as a substring" (case insensitive)
 Matchers.tests.cpp:<line number>: failed: testStringForMatching(), Equals("this string contains 'ABC' as a substring") for: "this string contains 'abc' as a substring" equals: "this string contains 'ABC' as a substring"
 Matchers.tests.cpp:<line number>: failed: testStringForMatching(), Equals("something else", Catch::CaseSensitive::No) for: "this string contains 'abc' as a substring" equals: "something else" (case insensitive)
-ToStringGeneral.tests.cpp:<line number>: passed: ::Catch::Detail::stringify(WhatException{}) == "This exception has overridden what() method" for: "This exception has overridden what() method"
+ToStringGeneral.tests.cpp:<line number>: passed: ::Catch::Detail::stringify(WhatException{}) == "This exception has overriden what() method" for: "This exception has overriden what() method"
 ==
-"This exception has overridden what() method"
+"This exception has overriden what() method"
 ToStringGeneral.tests.cpp:<line number>: passed: ::Catch::Detail::stringify(OperatorException{}) == "OperatorException" for: "OperatorException" == "OperatorException"
 ToStringGeneral.tests.cpp:<line number>: passed: ::Catch::Detail::stringify(StringMakerException{}) == "StringMakerException" for: "StringMakerException"
 ==
@@ -419,9 +416,6 @@
 Generators.tests.cpp:<line number>: passed: i.size() == 1 for: 1 == 1
 Generators.tests.cpp:<line number>: passed: i.size() == 1 for: 1 == 1
 Generators.tests.cpp:<line number>: passed: i.size() == 1 for: 1 == 1
-Generators.tests.cpp:<line number>: passed: i.size() == 1 for: 1 == 1
-Generators.tests.cpp:<line number>: passed: i.size() == 1 for: 1 == 1
-Generators.tests.cpp:<line number>: passed: i.size() == 1 for: 1 == 1
 Generators.tests.cpp:<line number>: passed: j > 0 for: 1 > 0
 Generators.tests.cpp:<line number>: passed: j > 0 for: 2 > 0
 Generators.tests.cpp:<line number>: passed: j > 0 for: 3 > 0
@@ -501,12 +495,6 @@
 GeneratorsImpl.tests.cpp:<line number>: passed: gen.next() for: true
 GeneratorsImpl.tests.cpp:<line number>: passed: gen.get() == 6.0 for: 6.0 == 6.0
 GeneratorsImpl.tests.cpp:<line number>: passed: !(gen.next()) for: !false
-GeneratorsImpl.tests.cpp:<line number>: passed: gen.get() == 2.0 for: 2.0 == 2.0
-GeneratorsImpl.tests.cpp:<line number>: passed: gen.next() for: true
-GeneratorsImpl.tests.cpp:<line number>: passed: gen.get() == 4.0 for: 4.0 == 4.0
-GeneratorsImpl.tests.cpp:<line number>: passed: gen.next() for: true
-GeneratorsImpl.tests.cpp:<line number>: passed: gen.get() == 6.0 for: 6.0 == 6.0
-GeneratorsImpl.tests.cpp:<line number>: passed: !(gen.next()) for: !false
 GeneratorsImpl.tests.cpp:<line number>: passed: gen.get() == 3 for: 3 == 3
 GeneratorsImpl.tests.cpp:<line number>: passed: !(gen.next()) for: !false
 GeneratorsImpl.tests.cpp:<line number>: passed: gen.get() == 1 for: 1 == 1
@@ -640,22 +628,6 @@
 Matchers.tests.cpp:<line number>: failed: testStringForMatching(), !Contains("substring") for: "this string contains 'abc' as a substring" not contains: "substring"
 Exception.tests.cpp:<line number>: passed: thisThrows(), "expected exception" for: "expected exception" equals: "expected exception"
 Exception.tests.cpp:<line number>: failed: thisThrows(), "should fail" for: "expected exception" equals: "should fail"
-Generators.tests.cpp:<line number>: passed: values > -6 for: 3 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 4 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 5 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 6 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: -5 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: -4 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 90 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 91 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 92 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 93 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 94 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 95 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 96 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 97 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 98 > -6
-Generators.tests.cpp:<line number>: passed: values > -6 for: 99 > -6
 Misc.tests.cpp:<line number>: warning: 'This one ran'
 Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'custom exception'
 Tricky.tests.cpp:<line number>: passed: True for: {?}
@@ -1023,22 +995,22 @@
 	$a = 20;
 }
 "
-Tag.tests.cpp:<line number>: passed: what, Contains( "[@zzz]" ) for: "error: tag alias, '[@zzz]' already registered.
+TagAlias.tests.cpp:<line number>: passed: what, Contains( "[@zzz]" ) for: "error: tag alias, '[@zzz]' already registered.
 	First seen at: file:2
 	Redefined at: file:10" contains: "[@zzz]"
-Tag.tests.cpp:<line number>: passed: what, Contains( "file" ) for: "error: tag alias, '[@zzz]' already registered.
+TagAlias.tests.cpp:<line number>: passed: what, Contains( "file" ) for: "error: tag alias, '[@zzz]' already registered.
 	First seen at: file:2
 	Redefined at: file:10" contains: "file"
-Tag.tests.cpp:<line number>: passed: what, Contains( "2" ) for: "error: tag alias, '[@zzz]' already registered.
+TagAlias.tests.cpp:<line number>: passed: what, Contains( "2" ) for: "error: tag alias, '[@zzz]' already registered.
 	First seen at: file:2
 	Redefined at: file:10" contains: "2"
-Tag.tests.cpp:<line number>: passed: what, Contains( "10" ) for: "error: tag alias, '[@zzz]' already registered.
+TagAlias.tests.cpp:<line number>: passed: what, Contains( "10" ) for: "error: tag alias, '[@zzz]' already registered.
 	First seen at: file:2
 	Redefined at: file:10" contains: "10"
-Tag.tests.cpp:<line number>: passed: registry.add( "[no ampersat]", "", Catch::SourceLineInfo( "file", 3 ) )
-Tag.tests.cpp:<line number>: passed: registry.add( "[the @ is not at the start]", "", Catch::SourceLineInfo( "file", 3 ) )
-Tag.tests.cpp:<line number>: passed: registry.add( "@no square bracket at start]", "", Catch::SourceLineInfo( "file", 3 ) )
-Tag.tests.cpp:<line number>: passed: registry.add( "[@no square bracket at end", "", Catch::SourceLineInfo( "file", 3 ) )
+TagAlias.tests.cpp:<line number>: passed: registry.add( "[no ampersat]", "", Catch::SourceLineInfo( "file", 3 ) )
+TagAlias.tests.cpp:<line number>: passed: registry.add( "[the @ is not at the start]", "", Catch::SourceLineInfo( "file", 3 ) )
+TagAlias.tests.cpp:<line number>: passed: registry.add( "@no square bracket at start]", "", Catch::SourceLineInfo( "file", 3 ) )
+TagAlias.tests.cpp:<line number>: passed: registry.add( "[@no square bracket at end", "", Catch::SourceLineInfo( "file", 3 ) )
 Misc.tests.cpp:<line number>: passed: v.size() == 5 for: 5 == 5
 Misc.tests.cpp:<line number>: passed: v.capacity() >= 5 for: 5 >= 5
 Misc.tests.cpp:<line number>: passed: v.size() == 10 for: 10 == 10
@@ -1189,15 +1161,6 @@
 Approx.tests.cpp:<line number>: passed: approx( d ) == 1.24 for: Approx( 1.23 ) == 1.24
 Approx.tests.cpp:<line number>: passed: approx( d ) != 1.25 for: Approx( 1.23 ) != 1.25
 VariadicMacros.tests.cpp:<line number>: passed: with 1 message: 'no assertions'
-Matchers.tests.cpp:<line number>: passed: empty, Approx(empty) for: {  } is approx: {  }
-Matchers.tests.cpp:<line number>: passed: v1, Approx(v1) for: { 1.0, 2.0, 3.0 } is approx: { 1.0, 2.0, 3.0 }
-Matchers.tests.cpp:<line number>: passed: v1, !Approx(temp) for: { 1.0, 2.0, 3.0 } not is approx: { 1.0, 2.0, 3.0, 4.0 }
-Matchers.tests.cpp:<line number>: passed: v1, !Approx(v2) for: { 1.0, 2.0, 3.0 } not is approx: { 1.5, 2.5, 3.5 }
-Matchers.tests.cpp:<line number>: passed: v1, Approx(v2).margin(0.5) for: { 1.0, 2.0, 3.0 } is approx: { 1.5, 2.5, 3.5 }
-Matchers.tests.cpp:<line number>: passed: v1, Approx(v2).epsilon(0.5) for: { 1.0, 2.0, 3.0 } is approx: { 1.5, 2.5, 3.5 }
-Matchers.tests.cpp:<line number>: passed: v1, Approx(v2).epsilon(0.1).scale(500) for: { 1.0, 2.0, 3.0 } is approx: { 1.5, 2.5, 3.5 }
-Matchers.tests.cpp:<line number>: failed: empty, Approx(t1) for: {  } is approx: { 1.0, 2.0 }
-Matchers.tests.cpp:<line number>: failed: v1, Approx(v2) for: { 2.0, 4.0, 6.0 } is approx: { 1.0, 3.0, 5.0 }
 Matchers.tests.cpp:<line number>: passed: v, VectorContains(1) for: { 1, 2, 3 } Contains: 1
 Matchers.tests.cpp:<line number>: passed: v, VectorContains(2) for: { 1, 2, 3 } Contains: 2
 Matchers.tests.cpp:<line number>: passed: v, Contains(v2) for: { 1, 2, 3 } Contains: { 1, 2 }
@@ -1390,7 +1353,6 @@
 String.tests.cpp:<line number>: passed: s == "didn|'t" for: "didn|'t" == "didn|'t"
 Misc.tests.cpp:<line number>: failed: false with 1 message: '3'
 Message.tests.cpp:<line number>: failed: false with 2 messages: 'hi' and 'i := 7'
-Tag.tests.cpp:<line number>: passed: testcase.tags, Catch::VectorContains(std::string("magic-tag")) && Catch::VectorContains(std::string(".")) for: { ".", "magic-tag" } ( Contains: "magic-tag" and Contains: "." )
 Message.tests.cpp:<line number>: failed: false with 4 messages: 'Count 1 to 3...' and '1' and '2' and '3'
 Message.tests.cpp:<line number>: failed: false with 4 messages: 'Count 4 to 6...' and '4' and '5' and '6'
 ToStringGeneral.tests.cpp:<line number>: passed: Catch::Detail::stringify( emptyMap ) == "{  }" for: "{  }" == "{  }"
@@ -1514,5 +1476,5 @@
 Misc.tests.cpp:<line number>: passed: v.capacity() >= 5 for: 5 >= 5
 Misc.tests.cpp:<line number>: passed:
 Misc.tests.cpp:<line number>: passed:
-Failed 79 test cases, failed 141 assertions.
+Failed 77 test cases, failed 138 assertions.
 
diff --git a/projects/SelfTest/Baselines/console.std.approved.txt b/projects/SelfTest/Baselines/console.std.approved.txt
index e5a1d5d..3c50437 100644
--- a/projects/SelfTest/Baselines/console.std.approved.txt
+++ b/projects/SelfTest/Baselines/console.std.approved.txt
@@ -1,4 +1,5 @@
-Filters: ~[!nonportable]~[!benchmark]~[approvals]
+This would not be caught previously
+Nor would this
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 <exe-name> is a <version> host application.
@@ -7,18 +8,6 @@
 Randomness seeded to: 1
 
 -------------------------------------------------------------------------------
-#1455 - INFO and WARN can start with a linebreak
--------------------------------------------------------------------------------
-Message.tests.cpp:<line number>
-...............................................................................
-
-Message.tests.cpp:<line number>: warning:
-
-This warning message starts with a linebreak
-
-This would not be caught previously
-Nor would this
--------------------------------------------------------------------------------
 #1514: stderr/stdout is not captured in tests aborted by an exception
 -------------------------------------------------------------------------------
 Tricky.tests.cpp:<line number>
@@ -862,30 +851,6 @@
   3.14
 
 -------------------------------------------------------------------------------
-Vector Approx matcher -- failing
-  Empty and non empty vectors are not approx equal
--------------------------------------------------------------------------------
-Matchers.tests.cpp:<line number>
-...............................................................................
-
-Matchers.tests.cpp:<line number>: FAILED:
-  CHECK_THAT( empty, Approx(t1) )
-with expansion:
-  {  } is approx: { 1.0, 2.0 }
-
--------------------------------------------------------------------------------
-Vector Approx matcher -- failing
-  Just different vectors
--------------------------------------------------------------------------------
-Matchers.tests.cpp:<line number>
-...............................................................................
-
-Matchers.tests.cpp:<line number>: FAILED:
-  CHECK_THAT( v1, Approx(v2) )
-with expansion:
-  { 2.0, 4.0, 6.0 } is approx: { 1.0, 3.0, 5.0 }
-
--------------------------------------------------------------------------------
 Vector matchers that fail
   Contains (element)
 -------------------------------------------------------------------------------
@@ -1299,6 +1264,6 @@
   Why would you throw a std::string?
 
 ===============================================================================
-test cases:  260 |  193 passed |  63 failed |  4 failed as expected
-assertions: 1428 | 1283 passed | 124 failed | 21 failed as expected
+test cases:  255 |  189 passed |  62 failed |  4 failed as expected
+assertions: 1393 | 1250 passed | 122 failed | 21 failed as expected
 
diff --git a/projects/SelfTest/Baselines/console.sw.approved.txt b/projects/SelfTest/Baselines/console.sw.approved.txt
index 9def37d..5b54ace 100644
--- a/projects/SelfTest/Baselines/console.sw.approved.txt
+++ b/projects/SelfTest/Baselines/console.sw.approved.txt
@@ -1,4 +1,3 @@
-Filters: ~[!nonportable]~[!benchmark]~[approvals]
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 <exe-name> is a <version> host application.
@@ -134,21 +133,6 @@
 with expansion:
   [1403 helper] == [1403 helper]
 
--------------------------------------------------------------------------------
-#1455 - INFO and WARN can start with a linebreak
--------------------------------------------------------------------------------
-Message.tests.cpp:<line number>
-...............................................................................
-
-Message.tests.cpp:<line number>: warning:
-
-This info message starts with a linebreak
-
-This warning message starts with a linebreak
-
-
-No assertions in test case '#1455 - INFO and WARN can start with a linebreak'
-
 This would not be caught previously
 Nor would this
 -------------------------------------------------------------------------------
@@ -2406,11 +2390,11 @@
 ...............................................................................
 
 ToStringGeneral.tests.cpp:<line number>: PASSED:
-  REQUIRE( ::Catch::Detail::stringify(WhatException{}) == "This exception has overridden what() method" )
+  REQUIRE( ::Catch::Detail::stringify(WhatException{}) == "This exception has overriden what() method" )
 with expansion:
-  "This exception has overridden what() method"
+  "This exception has overriden what() method"
   ==
-  "This exception has overridden what() method"
+  "This exception has overriden what() method"
 
 ToStringGeneral.tests.cpp:<line number>: PASSED:
   REQUIRE( ::Catch::Detail::stringify(OperatorException{}) == "OperatorException" )
@@ -3063,45 +3047,6 @@
 
 -------------------------------------------------------------------------------
 Generators -- adapters
-  Transforming elements
-  Different deduced type
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( i.size() == 1 )
-with expansion:
-  1 == 1
-
--------------------------------------------------------------------------------
-Generators -- adapters
-  Transforming elements
-  Different deduced type
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( i.size() == 1 )
-with expansion:
-  1 == 1
-
--------------------------------------------------------------------------------
-Generators -- adapters
-  Transforming elements
-  Different deduced type
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( i.size() == 1 )
-with expansion:
-  1 == 1
-
--------------------------------------------------------------------------------
-Generators -- adapters
   Repeating a generator
 -------------------------------------------------------------------------------
 Generators.tests.cpp:<line number>
@@ -3730,44 +3675,7 @@
 
 -------------------------------------------------------------------------------
 Generators internals
-  Map with explicit return type
--------------------------------------------------------------------------------
-GeneratorsImpl.tests.cpp:<line number>
-...............................................................................
-
-GeneratorsImpl.tests.cpp:<line number>: PASSED:
-  REQUIRE( gen.get() == 2.0 )
-with expansion:
-  2.0 == 2.0
-
-GeneratorsImpl.tests.cpp:<line number>: PASSED:
-  REQUIRE( gen.next() )
-with expansion:
-  true
-
-GeneratorsImpl.tests.cpp:<line number>: PASSED:
-  REQUIRE( gen.get() == 4.0 )
-with expansion:
-  4.0 == 4.0
-
-GeneratorsImpl.tests.cpp:<line number>: PASSED:
-  REQUIRE( gen.next() )
-with expansion:
-  true
-
-GeneratorsImpl.tests.cpp:<line number>: PASSED:
-  REQUIRE( gen.get() == 6.0 )
-with expansion:
-  6.0 == 6.0
-
-GeneratorsImpl.tests.cpp:<line number>: PASSED:
-  REQUIRE_FALSE( gen.next() )
-with expansion:
-  !false
-
--------------------------------------------------------------------------------
-Generators internals
-  Map with deduced return type
+  Map
 -------------------------------------------------------------------------------
 GeneratorsImpl.tests.cpp:<line number>
 ...............................................................................
@@ -4714,182 +4622,6 @@
   "expected exception" equals: "should fail"
 
 -------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  3 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  4 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  5 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  6 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  -5 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  -4 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  90 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  91 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  92 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  93 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  94 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  95 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  96 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  97 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  98 > -6
-
--------------------------------------------------------------------------------
-Nested generators and captured variables
--------------------------------------------------------------------------------
-Generators.tests.cpp:<line number>
-...............................................................................
-
-Generators.tests.cpp:<line number>: PASSED:
-  REQUIRE( values > -6 )
-with expansion:
-  99 > -6
-
--------------------------------------------------------------------------------
 Nice descriptive name
 -------------------------------------------------------------------------------
 Misc.tests.cpp:<line number>
@@ -7507,31 +7239,31 @@
 Tag alias can be registered against tag patterns
   The same tag alias can only be registered once
 -------------------------------------------------------------------------------
-Tag.tests.cpp:<line number>
+TagAlias.tests.cpp:<line number>
 ...............................................................................
 
-Tag.tests.cpp:<line number>: PASSED:
+TagAlias.tests.cpp:<line number>: PASSED:
   CHECK_THAT( what, Contains( "[@zzz]" ) )
 with expansion:
   "error: tag alias, '[@zzz]' already registered.
   	First seen at: file:2
   	Redefined at: file:10" contains: "[@zzz]"
 
-Tag.tests.cpp:<line number>: PASSED:
+TagAlias.tests.cpp:<line number>: PASSED:
   CHECK_THAT( what, Contains( "file" ) )
 with expansion:
   "error: tag alias, '[@zzz]' already registered.
   	First seen at: file:2
   	Redefined at: file:10" contains: "file"
 
-Tag.tests.cpp:<line number>: PASSED:
+TagAlias.tests.cpp:<line number>: PASSED:
   CHECK_THAT( what, Contains( "2" ) )
 with expansion:
   "error: tag alias, '[@zzz]' already registered.
   	First seen at: file:2
   	Redefined at: file:10" contains: "2"
 
-Tag.tests.cpp:<line number>: PASSED:
+TagAlias.tests.cpp:<line number>: PASSED:
   CHECK_THAT( what, Contains( "10" ) )
 with expansion:
   "error: tag alias, '[@zzz]' already registered.
@@ -7542,19 +7274,19 @@
 Tag alias can be registered against tag patterns
   Tag aliases must be of the form [@name]
 -------------------------------------------------------------------------------
-Tag.tests.cpp:<line number>
+TagAlias.tests.cpp:<line number>
 ...............................................................................
 
-Tag.tests.cpp:<line number>: PASSED:
+TagAlias.tests.cpp:<line number>: PASSED:
   CHECK_THROWS( registry.add( "[no ampersat]", "", Catch::SourceLineInfo( "file", 3 ) ) )
 
-Tag.tests.cpp:<line number>: PASSED:
+TagAlias.tests.cpp:<line number>: PASSED:
   CHECK_THROWS( registry.add( "[the @ is not at the start]", "", Catch::SourceLineInfo( "file", 3 ) ) )
 
-Tag.tests.cpp:<line number>: PASSED:
+TagAlias.tests.cpp:<line number>: PASSED:
   CHECK_THROWS( registry.add( "@no square bracket at start]", "", Catch::SourceLineInfo( "file", 3 ) ) )
 
-Tag.tests.cpp:<line number>: PASSED:
+TagAlias.tests.cpp:<line number>: PASSED:
   CHECK_THROWS( registry.add( "[@no square bracket at end", "", Catch::SourceLineInfo( "file", 3 ) ) )
 
 -------------------------------------------------------------------------------
@@ -8721,96 +8453,6 @@
   no assertions
 
 -------------------------------------------------------------------------------
-Vector Approx matcher
-  Empty vector is roughly equal to an empty vector
--------------------------------------------------------------------------------
-Matchers.tests.cpp:<line number>
-...............................................................................
-
-Matchers.tests.cpp:<line number>: PASSED:
-  REQUIRE_THAT( empty, Approx(empty) )
-with expansion:
-  {  } is approx: {  }
-
--------------------------------------------------------------------------------
-Vector Approx matcher
-  Vectors with elements
-  A vector is approx equal to itself
--------------------------------------------------------------------------------
-Matchers.tests.cpp:<line number>
-...............................................................................
-
-Matchers.tests.cpp:<line number>: PASSED:
-  REQUIRE_THAT( v1, Approx(v1) )
-with expansion:
-  { 1.0, 2.0, 3.0 } is approx: { 1.0, 2.0, 3.0 }
-
--------------------------------------------------------------------------------
-Vector Approx matcher
-  Vectors with elements
-  Different length
--------------------------------------------------------------------------------
-Matchers.tests.cpp:<line number>
-...............................................................................
-
-Matchers.tests.cpp:<line number>: PASSED:
-  REQUIRE_THAT( v1, !Approx(temp) )
-with expansion:
-  { 1.0, 2.0, 3.0 } not is approx: { 1.0, 2.0, 3.0, 4.0 }
-
--------------------------------------------------------------------------------
-Vector Approx matcher
-  Vectors with elements
-  Same length, different elements
--------------------------------------------------------------------------------
-Matchers.tests.cpp:<line number>
-...............................................................................
-
-Matchers.tests.cpp:<line number>: PASSED:
-  REQUIRE_THAT( v1, !Approx(v2) )
-with expansion:
-  { 1.0, 2.0, 3.0 } not is approx: { 1.5, 2.5, 3.5 }
-
-Matchers.tests.cpp:<line number>: PASSED:
-  REQUIRE_THAT( v1, Approx(v2).margin(0.5) )
-with expansion:
-  { 1.0, 2.0, 3.0 } is approx: { 1.5, 2.5, 3.5 }
-
-Matchers.tests.cpp:<line number>: PASSED:
-  REQUIRE_THAT( v1, Approx(v2).epsilon(0.5) )
-with expansion:
-  { 1.0, 2.0, 3.0 } is approx: { 1.5, 2.5, 3.5 }
-
-Matchers.tests.cpp:<line number>: PASSED:
-  REQUIRE_THAT( v1, Approx(v2).epsilon(0.1).scale(500) )
-with expansion:
-  { 1.0, 2.0, 3.0 } is approx: { 1.5, 2.5, 3.5 }
-
--------------------------------------------------------------------------------
-Vector Approx matcher -- failing
-  Empty and non empty vectors are not approx equal
--------------------------------------------------------------------------------
-Matchers.tests.cpp:<line number>
-...............................................................................
-
-Matchers.tests.cpp:<line number>: FAILED:
-  CHECK_THAT( empty, Approx(t1) )
-with expansion:
-  {  } is approx: { 1.0, 2.0 }
-
--------------------------------------------------------------------------------
-Vector Approx matcher -- failing
-  Just different vectors
--------------------------------------------------------------------------------
-Matchers.tests.cpp:<line number>
-...............................................................................
-
-Matchers.tests.cpp:<line number>: FAILED:
-  CHECK_THAT( v1, Approx(v2) )
-with expansion:
-  { 2.0, 4.0, 6.0 } is approx: { 1.0, 3.0, 5.0 }
-
--------------------------------------------------------------------------------
 Vector matchers
   Contains (element)
 -------------------------------------------------------------------------------
@@ -10367,17 +10009,6 @@
   i := 7
 
 -------------------------------------------------------------------------------
-shortened hide tags are split apart
--------------------------------------------------------------------------------
-Tag.tests.cpp:<line number>
-...............................................................................
-
-Tag.tests.cpp:<line number>: PASSED:
-  REQUIRE_THAT( testcase.tags, Catch::VectorContains(std::string("magic-tag")) && Catch::VectorContains(std::string(".")) )
-with expansion:
-  { ".", "magic-tag" } ( Contains: "magic-tag" and Contains: "." )
-
--------------------------------------------------------------------------------
 stacks unscoped info in loops
 -------------------------------------------------------------------------------
 Message.tests.cpp:<line number>
@@ -11218,6 +10849,6 @@
 Misc.tests.cpp:<line number>: PASSED:
 
 ===============================================================================
-test cases:  260 |  177 passed |  79 failed |  4 failed as expected
-assertions: 1445 | 1283 passed | 141 failed | 21 failed as expected
+test cases:  255 |  174 passed |  77 failed |  4 failed as expected
+assertions: 1409 | 1250 passed | 138 failed | 21 failed as expected
 
diff --git a/projects/SelfTest/Baselines/console.swa4.approved.txt b/projects/SelfTest/Baselines/console.swa4.approved.txt
index bfa6675..2efd761 100644
--- a/projects/SelfTest/Baselines/console.swa4.approved.txt
+++ b/projects/SelfTest/Baselines/console.swa4.approved.txt
@@ -1,4 +1,3 @@
-Filters: ~[!nonportable]~[!benchmark]~[approvals]
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 <exe-name> is a <version> host application.
@@ -134,21 +133,6 @@
 with expansion:
   [1403 helper] == [1403 helper]
 
--------------------------------------------------------------------------------
-#1455 - INFO and WARN can start with a linebreak
--------------------------------------------------------------------------------
-Message.tests.cpp:<line number>
-...............................................................................
-
-Message.tests.cpp:<line number>: warning:
-
-This info message starts with a linebreak
-
-This warning message starts with a linebreak
-
-
-No assertions in test case '#1455 - INFO and WARN can start with a linebreak'
-
 This would not be caught previously
 Nor would this
 -------------------------------------------------------------------------------
@@ -351,7 +335,12 @@
 Condition.tests.cpp:<line number>: FAILED:
   CHECK( true != true )
 
+Condition.tests.cpp:<line number>: FAILED:
+  CHECK( !true )
+with expansion:
+  false
+
 ===============================================================================
-test cases: 18 | 13 passed | 3 failed | 2 failed as expected
+test cases: 17 | 13 passed | 2 failed | 2 failed as expected
 assertions: 40 | 33 passed | 4 failed | 3 failed as expected
 
diff --git a/projects/SelfTest/Baselines/junit.sw.approved.txt b/projects/SelfTest/Baselines/junit.sw.approved.txt
index af4ebe0..25c4823 100644
--- a/projects/SelfTest/Baselines/junit.sw.approved.txt
+++ b/projects/SelfTest/Baselines/junit.sw.approved.txt
@@ -1,11 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<testsuitesloose text artifact
->
-  <testsuite name="<exe-name>" errors="17" failures="125" tests="1446" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
-    <properties>
-      <property name="filters" value="~[!nonportable]~[!benchmark]~[approvals]"/>
-      <property name="random-seed" value="1"/>
-    </properties>
+<testsuites>
+  <properties>
+    <property name="random-seed" value="1"/>
+  </properties>
+loose text artifact
+  <testsuite name="<exe-name>" errors="17" failures="122" tests="1410" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
     <testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="#1027" time="{duration}"/>
@@ -14,7 +13,6 @@
     <testcase classname="<exe-name>.global" name="#1238" time="{duration}"/>
     <testcase classname="<exe-name>.(Fixture_1245&lt;int, int>)" name="#1245" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="#1403" time="{duration}"/>
-    <testcase classname="<exe-name>.global" name="#1455 - INFO and WARN can start with a linebreak" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="#1514: stderr/stdout is not captured in tests aborted by an exception" time="{duration}">
       <failure type="FAIL">
 1514
@@ -362,7 +360,6 @@
     <testcase classname="<exe-name>.global" name="Generators -- adapters/Shortening a range" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Generators -- adapters/Transforming elements/Same type" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Generators -- adapters/Transforming elements/Different type" time="{duration}"/>
-    <testcase classname="<exe-name>.global" name="Generators -- adapters/Transforming elements/Different deduced type" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Generators -- adapters/Repeating a generator" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Generators -- adapters/Chunking a generator into sized pieces/Number of elements in source is divisible by chunk size" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Generators -- adapters/Chunking a generator into sized pieces/Number of elements in source is not divisible by chunk size" time="{duration}"/>
@@ -376,8 +373,7 @@
     <testcase classname="<exe-name>.global" name="Generators internals/Filter generator" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Generators internals/Take generator/Take less" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Generators internals/Take generator/Take more" time="{duration}"/>
-    <testcase classname="<exe-name>.global" name="Generators internals/Map with explicit return type" time="{duration}"/>
-    <testcase classname="<exe-name>.global" name="Generators internals/Map with deduced return type" time="{duration}"/>
+    <testcase classname="<exe-name>.global" name="Generators internals/Map" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Generators internals/Repeat/Singular repeat" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Generators internals/Repeat/Actual repeat" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Generators internals/Range/Positive auto step/Integer" time="{duration}"/>
@@ -456,7 +452,6 @@
 Exception.tests.cpp:<line number>
       </failure>
     </testcase>
-    <testcase classname="<exe-name>.global" name="Nested generators and captured variables" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Nice descriptive name" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Non-std exceptions can be translated" time="{duration}">
       <error type="TEST_CASE">
@@ -741,20 +736,6 @@
     </testcase>
     <testcase classname="<exe-name>.global" name="Use a custom approx" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Variadic macros/Section with one argument" time="{duration}"/>
-    <testcase classname="<exe-name>.global" name="Vector Approx matcher/Empty vector is roughly equal to an empty vector" time="{duration}"/>
-    <testcase classname="<exe-name>.global" name="Vector Approx matcher/Vectors with elements/A vector is approx equal to itself" time="{duration}"/>
-    <testcase classname="<exe-name>.global" name="Vector Approx matcher/Vectors with elements/Different length" time="{duration}"/>
-    <testcase classname="<exe-name>.global" name="Vector Approx matcher/Vectors with elements/Same length, different elements" time="{duration}"/>
-    <testcase classname="<exe-name>.global" name="Vector Approx matcher -- failing/Empty and non empty vectors are not approx equal" time="{duration}">
-      <failure message="{  } is approx: { 1.0, 2.0 }" type="CHECK_THAT">
-Matchers.tests.cpp:<line number>
-      </failure>
-    </testcase>
-    <testcase classname="<exe-name>.global" name="Vector Approx matcher -- failing/Just different vectors" time="{duration}">
-      <failure message="{ 2.0, 4.0, 6.0 } is approx: { 1.0, 3.0, 5.0 }" type="CHECK_THAT">
-Matchers.tests.cpp:<line number>
-      </failure>
-    </testcase>
     <testcase classname="<exe-name>.global" name="Vector matchers/Contains (element)" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Vector matchers/Contains (vector)" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="Vector matchers/Contains (element), composed" time="{duration}"/>
@@ -997,7 +978,6 @@
 Message.tests.cpp:<line number>
       </failure>
     </testcase>
-    <testcase classname="<exe-name>.global" name="shortened hide tags are split apart" time="{duration}"/>
     <testcase classname="<exe-name>.global" name="stacks unscoped info in loops" time="{duration}">
       <failure message="false" type="CHECK">
 Count 1 to 3...
diff --git a/projects/SelfTest/Baselines/xml.sw.approved.txt b/projects/SelfTest/Baselines/xml.sw.approved.txt
index d053b40..637689a 100644
--- a/projects/SelfTest/Baselines/xml.sw.approved.txt
+++ b/projects/SelfTest/Baselines/xml.sw.approved.txt
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<Catch name="<exe-name>" filters="~[!nonportable]~[!benchmark]~[approvals]">
+<Catch name="<exe-name>">
   <Randomness seed="1"/>
   <Group name="<exe-name>">
     <TestCase name="# A test name that starts with a #" filename="projects/<exe-name>/UsageTests/Misc.tests.cpp" >
@@ -142,17 +142,6 @@
       </Expression>
       <OverallResult success="true"/>
     </TestCase>
-    <TestCase name="#1455 - INFO and WARN can start with a linebreak" tags="[.][messages]" filename="projects/<exe-name>/UsageTests/Message.tests.cpp" >
-      <Info>
-
-This info message starts with a linebreak
-      </Info>
-      <Warning>
-
-This warning message starts with a linebreak
-      </Warning>
-      <OverallResult success="false"/>
-    </TestCase>
     <TestCase name="#1514: stderr/stdout is not captured in tests aborted by an exception" tags="[.][output-capture][regression]" filename="projects/<exe-name>/UsageTests/Tricky.tests.cpp" >
       <Failure filename="projects/<exe-name>/UsageTests/Tricky.tests.cpp" >
         1514
@@ -2899,12 +2888,12 @@
     <TestCase name="Exception as a value (e.g. in REQUIRE_THROWS_MATCHES) can be stringified" tags="[exception][toString]" filename="projects/<exe-name>/UsageTests/ToStringGeneral.tests.cpp" >
       <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/ToStringGeneral.tests.cpp" >
         <Original>
-          ::Catch::Detail::stringify(WhatException{}) == "This exception has overridden what() method"
+          ::Catch::Detail::stringify(WhatException{}) == "This exception has overriden what() method"
         </Original>
         <Expanded>
-          "This exception has overridden what() method"
+          "This exception has overriden what() method"
 ==
-"This exception has overridden what() method"
+"This exception has overriden what() method"
         </Expanded>
       </Expression>
       <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/ToStringGeneral.tests.cpp" >
@@ -2927,7 +2916,7 @@
       </Expression>
       <OverallResult success="true"/>
     </TestCase>
-    <TestCase name="Exception matchers that fail" tags="[!throws][.][exceptions][failing][matchers]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
+    <TestCase name="Exception matchers that fail" tags="[!throws][.][.failing][exceptions][matchers]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
       <Section name="No exception" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
         <Expression success="false" type="CHECK_THROWS_MATCHES" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
           <Original>
@@ -3747,48 +3736,6 @@
         </Section>
         <OverallResults successes="1" failures="0" expectedFailures="0"/>
       </Section>
-      <Section name="Transforming elements" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Section name="Different deduced type" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-          <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-            <Original>
-              i.size() == 1
-            </Original>
-            <Expanded>
-              1 == 1
-            </Expanded>
-          </Expression>
-          <OverallResults successes="1" failures="0" expectedFailures="0"/>
-        </Section>
-        <OverallResults successes="1" failures="0" expectedFailures="0"/>
-      </Section>
-      <Section name="Transforming elements" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Section name="Different deduced type" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-          <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-            <Original>
-              i.size() == 1
-            </Original>
-            <Expanded>
-              1 == 1
-            </Expanded>
-          </Expression>
-          <OverallResults successes="1" failures="0" expectedFailures="0"/>
-        </Section>
-        <OverallResults successes="1" failures="0" expectedFailures="0"/>
-      </Section>
-      <Section name="Transforming elements" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Section name="Different deduced type" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-          <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-            <Original>
-              i.size() == 1
-            </Original>
-            <Expanded>
-              1 == 1
-            </Expanded>
-          </Expression>
-          <OverallResults successes="1" failures="0" expectedFailures="0"/>
-        </Section>
-        <OverallResults successes="1" failures="0" expectedFailures="0"/>
-      </Section>
       <Section name="Repeating a generator" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
           <Original>
@@ -4514,58 +4461,7 @@
         </Section>
         <OverallResults successes="2" failures="0" expectedFailures="0"/>
       </Section>
-      <Section name="Map with explicit return type" filename="projects/<exe-name>/IntrospectiveTests/GeneratorsImpl.tests.cpp" >
-        <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/GeneratorsImpl.tests.cpp" >
-          <Original>
-            gen.get() == 2.0
-          </Original>
-          <Expanded>
-            2.0 == 2.0
-          </Expanded>
-        </Expression>
-        <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/GeneratorsImpl.tests.cpp" >
-          <Original>
-            gen.next()
-          </Original>
-          <Expanded>
-            true
-          </Expanded>
-        </Expression>
-        <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/GeneratorsImpl.tests.cpp" >
-          <Original>
-            gen.get() == 4.0
-          </Original>
-          <Expanded>
-            4.0 == 4.0
-          </Expanded>
-        </Expression>
-        <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/GeneratorsImpl.tests.cpp" >
-          <Original>
-            gen.next()
-          </Original>
-          <Expanded>
-            true
-          </Expanded>
-        </Expression>
-        <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/GeneratorsImpl.tests.cpp" >
-          <Original>
-            gen.get() == 6.0
-          </Original>
-          <Expanded>
-            6.0 == 6.0
-          </Expanded>
-        </Expression>
-        <Expression success="true" type="REQUIRE_FALSE" filename="projects/<exe-name>/IntrospectiveTests/GeneratorsImpl.tests.cpp" >
-          <Original>
-            !(gen.next())
-          </Original>
-          <Expanded>
-            !false
-          </Expanded>
-        </Expression>
-        <OverallResults successes="6" failures="0" expectedFailures="0"/>
-      </Section>
-      <Section name="Map with deduced return type" filename="projects/<exe-name>/IntrospectiveTests/GeneratorsImpl.tests.cpp" >
+      <Section name="Map" filename="projects/<exe-name>/IntrospectiveTests/GeneratorsImpl.tests.cpp" >
         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/GeneratorsImpl.tests.cpp" >
           <Original>
             gen.get() == 2.0
@@ -5872,7 +5768,7 @@
       </Expression>
       <OverallResult success="true"/>
     </TestCase>
-    <TestCase name="Matchers can be composed with both &amp;&amp; and || - failing" tags="[.][failing][matchers][operator&amp;&amp;][operators][operator||]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
+    <TestCase name="Matchers can be composed with both &amp;&amp; and || - failing" tags="[.][.failing][matchers][operator&amp;&amp;][operators][operator||]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
       <Expression success="false" type="CHECK_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
         <Original>
           testStringForMatching(), (Contains("string") || Contains("different")) &amp;&amp; Contains("random")
@@ -5894,7 +5790,7 @@
       </Expression>
       <OverallResult success="true"/>
     </TestCase>
-    <TestCase name="Matchers can be negated (Not) with the ! operator - failing" tags="[.][failing][matchers][not][operators]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
+    <TestCase name="Matchers can be negated (Not) with the ! operator - failing" tags="[.][.failing][matchers][not][operators]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
       <Expression success="false" type="CHECK_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
         <Original>
           testStringForMatching(), !Contains("substring")
@@ -5924,137 +5820,6 @@
       </Expression>
       <OverallResult success="false"/>
     </TestCase>
-    <TestCase name="Nested generators and captured variables" tags="[generators]" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          3 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          4 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          5 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          6 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          -5 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          -4 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          90 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          91 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          92 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          93 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          94 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          95 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          96 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          97 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          98 > -6
-        </Expanded>
-      </Expression>
-      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" >
-        <Original>
-          values > -6
-        </Original>
-        <Expanded>
-          99 > -6
-        </Expanded>
-      </Expression>
-      <OverallResult success="true"/>
-    </TestCase>
     <TestCase name="Nice descriptive name" tags="[.][tag1][tag2][tag3]" filename="projects/<exe-name>/UsageTests/Misc.tests.cpp" >
       <Warning>
         This one ran
@@ -8347,7 +8112,7 @@
       </Expression>
       <OverallResult success="false"/>
     </TestCase>
-    <TestCase name="Regex string matcher" tags="[.][failing][matchers]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
+    <TestCase name="Regex string matcher" tags="[.][.failing][matchers]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
       <Expression success="false" type="CHECK_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
         <Original>
           testStringForMatching(), Matches("this STRING contains 'abc' as a substring")
@@ -9328,9 +9093,9 @@
       </Expression>
       <OverallResult success="false"/>
     </TestCase>
-    <TestCase name="Tag alias can be registered against tag patterns" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
-      <Section name="The same tag alias can only be registered once" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
-        <Expression success="true" type="CHECK_THAT" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
+    <TestCase name="Tag alias can be registered against tag patterns" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
+      <Section name="The same tag alias can only be registered once" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
+        <Expression success="true" type="CHECK_THAT" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
           <Original>
             what, Contains( "[@zzz]" )
           </Original>
@@ -9340,7 +9105,7 @@
 	Redefined at: file:10" contains: "[@zzz]"
           </Expanded>
         </Expression>
-        <Expression success="true" type="CHECK_THAT" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
+        <Expression success="true" type="CHECK_THAT" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
           <Original>
             what, Contains( "file" )
           </Original>
@@ -9350,7 +9115,7 @@
 	Redefined at: file:10" contains: "file"
           </Expanded>
         </Expression>
-        <Expression success="true" type="CHECK_THAT" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
+        <Expression success="true" type="CHECK_THAT" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
           <Original>
             what, Contains( "2" )
           </Original>
@@ -9360,7 +9125,7 @@
 	Redefined at: file:10" contains: "2"
           </Expanded>
         </Expression>
-        <Expression success="true" type="CHECK_THAT" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
+        <Expression success="true" type="CHECK_THAT" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
           <Original>
             what, Contains( "10" )
           </Original>
@@ -9372,8 +9137,8 @@
         </Expression>
         <OverallResults successes="4" failures="0" expectedFailures="0"/>
       </Section>
-      <Section name="Tag aliases must be of the form [@name]" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
-        <Expression success="true" type="CHECK_THROWS" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
+      <Section name="Tag aliases must be of the form [@name]" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
+        <Expression success="true" type="CHECK_THROWS" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
           <Original>
             registry.add( "[no ampersat]", "", Catch::SourceLineInfo( "file", 3 ) )
           </Original>
@@ -9381,7 +9146,7 @@
             registry.add( "[no ampersat]", "", Catch::SourceLineInfo( "file", 3 ) )
           </Expanded>
         </Expression>
-        <Expression success="true" type="CHECK_THROWS" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
+        <Expression success="true" type="CHECK_THROWS" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
           <Original>
             registry.add( "[the @ is not at the start]", "", Catch::SourceLineInfo( "file", 3 ) )
           </Original>
@@ -9389,7 +9154,7 @@
             registry.add( "[the @ is not at the start]", "", Catch::SourceLineInfo( "file", 3 ) )
           </Expanded>
         </Expression>
-        <Expression success="true" type="CHECK_THROWS" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
+        <Expression success="true" type="CHECK_THROWS" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
           <Original>
             registry.add( "@no square bracket at start]", "", Catch::SourceLineInfo( "file", 3 ) )
           </Original>
@@ -9397,7 +9162,7 @@
             registry.add( "@no square bracket at start]", "", Catch::SourceLineInfo( "file", 3 ) )
           </Expanded>
         </Expression>
-        <Expression success="true" type="CHECK_THROWS" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
+        <Expression success="true" type="CHECK_THROWS" filename="projects/<exe-name>/IntrospectiveTests/TagAlias.tests.cpp" >
           <Original>
             registry.add( "[@no square bracket at end", "", Catch::SourceLineInfo( "file", 3 ) )
           </Original>
@@ -10713,111 +10478,6 @@
       </Section>
       <OverallResult success="true"/>
     </TestCase>
-    <TestCase name="Vector Approx matcher" tags="[approx][matchers][vector]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-      <Section name="Empty vector is roughly equal to an empty vector" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-        <Expression success="true" type="REQUIRE_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-          <Original>
-            empty, Approx(empty)
-          </Original>
-          <Expanded>
-            {  } is approx: {  }
-          </Expanded>
-        </Expression>
-        <OverallResults successes="1" failures="0" expectedFailures="0"/>
-      </Section>
-      <Section name="Vectors with elements" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-        <Section name="A vector is approx equal to itself" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-          <Expression success="true" type="REQUIRE_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-            <Original>
-              v1, Approx(v1)
-            </Original>
-            <Expanded>
-              { 1.0, 2.0, 3.0 } is approx: { 1.0, 2.0, 3.0 }
-            </Expanded>
-          </Expression>
-          <OverallResults successes="1" failures="0" expectedFailures="0"/>
-        </Section>
-        <OverallResults successes="1" failures="0" expectedFailures="0"/>
-      </Section>
-      <Section name="Vectors with elements" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-        <Section name="Different length" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-          <Expression success="true" type="REQUIRE_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-            <Original>
-              v1, !Approx(temp)
-            </Original>
-            <Expanded>
-              { 1.0, 2.0, 3.0 } not is approx: { 1.0, 2.0, 3.0, 4.0 }
-            </Expanded>
-          </Expression>
-          <OverallResults successes="1" failures="0" expectedFailures="0"/>
-        </Section>
-        <OverallResults successes="1" failures="0" expectedFailures="0"/>
-      </Section>
-      <Section name="Vectors with elements" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-        <Section name="Same length, different elements" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-          <Expression success="true" type="REQUIRE_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-            <Original>
-              v1, !Approx(v2)
-            </Original>
-            <Expanded>
-              { 1.0, 2.0, 3.0 } not is approx: { 1.5, 2.5, 3.5 }
-            </Expanded>
-          </Expression>
-          <Expression success="true" type="REQUIRE_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-            <Original>
-              v1, Approx(v2).margin(0.5)
-            </Original>
-            <Expanded>
-              { 1.0, 2.0, 3.0 } is approx: { 1.5, 2.5, 3.5 }
-            </Expanded>
-          </Expression>
-          <Expression success="true" type="REQUIRE_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-            <Original>
-              v1, Approx(v2).epsilon(0.5)
-            </Original>
-            <Expanded>
-              { 1.0, 2.0, 3.0 } is approx: { 1.5, 2.5, 3.5 }
-            </Expanded>
-          </Expression>
-          <Expression success="true" type="REQUIRE_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-            <Original>
-              v1, Approx(v2).epsilon(0.1).scale(500)
-            </Original>
-            <Expanded>
-              { 1.0, 2.0, 3.0 } is approx: { 1.5, 2.5, 3.5 }
-            </Expanded>
-          </Expression>
-          <OverallResults successes="4" failures="0" expectedFailures="0"/>
-        </Section>
-        <OverallResults successes="4" failures="0" expectedFailures="0"/>
-      </Section>
-      <OverallResult success="true"/>
-    </TestCase>
-    <TestCase name="Vector Approx matcher -- failing" tags="[.][approx][failing][matchers][vector]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-      <Section name="Empty and non empty vectors are not approx equal" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-        <Expression success="false" type="CHECK_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-          <Original>
-            empty, Approx(t1)
-          </Original>
-          <Expanded>
-            {  } is approx: { 1.0, 2.0 }
-          </Expanded>
-        </Expression>
-        <OverallResults successes="0" failures="1" expectedFailures="0"/>
-      </Section>
-      <Section name="Just different vectors" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-        <Expression success="false" type="CHECK_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
-          <Original>
-            v1, Approx(v2)
-          </Original>
-          <Expanded>
-            { 2.0, 4.0, 6.0 } is approx: { 1.0, 3.0, 5.0 }
-          </Expanded>
-        </Expression>
-        <OverallResults successes="0" failures="1" expectedFailures="0"/>
-      </Section>
-      <OverallResult success="false"/>
-    </TestCase>
     <TestCase name="Vector matchers" tags="[matchers][vector]" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
       <Section name="Contains (element)" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
         <Expression success="true" type="CHECK_THAT" filename="projects/<exe-name>/UsageTests/Matchers.tests.cpp" >
@@ -12599,17 +12259,6 @@
       </Expression>
       <OverallResult success="false"/>
     </TestCase>
-    <TestCase name="shortened hide tags are split apart" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
-      <Expression success="true" type="REQUIRE_THAT" filename="projects/<exe-name>/IntrospectiveTests/Tag.tests.cpp" >
-        <Original>
-          testcase.tags, Catch::VectorContains(std::string("magic-tag")) &amp;&amp; Catch::VectorContains(std::string("."))
-        </Original>
-        <Expanded>
-          { ".", "magic-tag" } ( Contains: "magic-tag" and Contains: "." )
-        </Expanded>
-      </Expression>
-      <OverallResult success="true"/>
-    </TestCase>
     <TestCase name="stacks unscoped info in loops" tags="[.][failing][info][unscoped]" filename="projects/<exe-name>/UsageTests/Message.tests.cpp" >
       <Info>
         Count 1 to 3...
@@ -13504,7 +13153,7 @@
       </Section>
       <OverallResult success="true"/>
     </TestCase>
-    <OverallResults successes="1283" failures="142" expectedFailures="21"/>
+    <OverallResults successes="1250" failures="139" expectedFailures="21"/>
   </Group>
-  <OverallResults successes="1283" failures="141" expectedFailures="21"/>
+  <OverallResults successes="1250" failures="138" expectedFailures="21"/>
 </Catch>
diff --git a/projects/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp b/projects/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp
index dbc1d95..de8b0ff 100644
--- a/projects/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp
+++ b/projects/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp
@@ -68,7 +68,7 @@
             REQUIRE_FALSE(gen.next());
         }
     }
-    SECTION("Map with explicit return type") {
+    SECTION("Map") {
         auto gen = map<double>([] (int i) {return 2.0 * i; }, values({ 1, 2, 3 }));
         REQUIRE(gen.get() == 2.0);
         REQUIRE(gen.next());
@@ -77,15 +77,6 @@
         REQUIRE(gen.get() == 6.0);
         REQUIRE_FALSE(gen.next());
     }
-    SECTION("Map with deduced return type") {
-        auto gen = map([] (int i) {return 2.0 * i; }, values({ 1, 2, 3 }));
-        REQUIRE(gen.get() == 2.0);
-        REQUIRE(gen.next());
-        REQUIRE(gen.get() == 4.0);
-        REQUIRE(gen.next());
-        REQUIRE(gen.get() == 6.0);
-        REQUIRE_FALSE(gen.next());
-    }
     SECTION("Repeat") {
         SECTION("Singular repeat") {
             auto gen = repeat(1, value(3));
@@ -216,45 +207,3 @@
     }
 
 }
-
-
-// todo: uncopyable type used in a generator
-//  idea: uncopyable tag type for a stupid generator
-
-namespace {
-struct non_copyable {
-    non_copyable() = default;
-    non_copyable(non_copyable const&) = delete;
-    non_copyable& operator=(non_copyable const&) = delete;
-    int value = -1;
-};
-
-// This class shows how to implement a simple generator for Catch tests
-class TestGen : public Catch::Generators::IGenerator<int> {
-    int current_number;
-public:
-
-    TestGen(non_copyable const& nc):
-        current_number(nc.value) {}
-
-    int const& get() const override;
-    bool next() override {
-        return false;
-    }
-};
-
-// Avoids -Wweak-vtables
-int const& TestGen::get() const {
-    return current_number;
-}
-
-}
-
-TEST_CASE("GENERATE capture macros", "[generators][internals][.approvals]") {
-    auto value = GENERATE(take(10, random(0, 10)));
-
-    non_copyable nc; nc.value = value;
-    // neither `GENERATE_COPY` nor plain `GENERATE` would compile here
-    auto value2 = GENERATE_REF(Catch::Generators::GeneratorWrapper<int>(std::unique_ptr<Catch::Generators::IGenerator<int>>(new TestGen(nc))));
-    REQUIRE(value == value2);
-}
diff --git a/projects/SelfTest/IntrospectiveTests/PartTracker.tests.cpp b/projects/SelfTest/IntrospectiveTests/PartTracker.tests.cpp
index 9742326..9372b1c 100644
--- a/projects/SelfTest/IntrospectiveTests/PartTracker.tests.cpp
+++ b/projects/SelfTest/IntrospectiveTests/PartTracker.tests.cpp
@@ -8,6 +8,21 @@
 #include "internal/catch_suppress_warnings.h"
 #include "internal/catch_test_case_tracker.h"
 
+
+namespace Catch
+{
+    class LocalContext {
+
+    public:
+        TrackerContext& operator()() const {
+            return TrackerContext::instance();
+        }
+    };
+
+} // namespace Catch
+
+// -------------------
+
 #include "catch.hpp"
 
 using namespace Catch;
diff --git a/projects/SelfTest/IntrospectiveTests/Tag.tests.cpp b/projects/SelfTest/IntrospectiveTests/TagAlias.tests.cpp
similarity index 85%
rename from projects/SelfTest/IntrospectiveTests/Tag.tests.cpp
rename to projects/SelfTest/IntrospectiveTests/TagAlias.tests.cpp
index f3890b1..5428589 100644
--- a/projects/SelfTest/IntrospectiveTests/Tag.tests.cpp
+++ b/projects/SelfTest/IntrospectiveTests/TagAlias.tests.cpp
@@ -43,8 +43,3 @@
 
 #endif
 }
-
-TEST_CASE("shortened hide tags are split apart") {
-    auto testcase = Catch::makeTestCase(nullptr, "", {"fake test name", "[.magic-tag]"}, CATCH_INTERNAL_LINEINFO);
-    REQUIRE_THAT(testcase.tags, Catch::VectorContains(std::string("magic-tag")) && Catch::VectorContains(std::string(".")));
-}
diff --git a/projects/SelfTest/UsageTests/Generators.tests.cpp b/projects/SelfTest/UsageTests/Generators.tests.cpp
index f5e3f6a..0cf1ce6 100644
--- a/projects/SelfTest/UsageTests/Generators.tests.cpp
+++ b/projects/SelfTest/UsageTests/Generators.tests.cpp
@@ -144,11 +144,6 @@
             auto i = GENERATE(map<std::string>([] (int val) { return std::to_string(val); }, values({ 1, 2, 3 })));
             REQUIRE(i.size() == 1);
         }
-        SECTION("Different deduced type") {
-            // This takes a generator that returns ints and maps them into strings
-            auto i = GENERATE(map([] (int val) { return std::to_string(val); }, values({ 1, 2, 3 })));
-            REQUIRE(i.size() == 1);
-        }
     }
     SECTION("Repeating a generator") {
         // This will return values [1, 2, 3, 1, 2, 3]
@@ -188,21 +183,3 @@
         static_cast<void>(val); // Silence VS 2015 unused variable warning
     }
 }
-
-
-TEST_CASE("Nested generators and captured variables", "[generators]") {
-    // Workaround for old libstdc++
-    using record = std::tuple<int, int>;
-    // Set up 3 ranges to generate numbers from
-    auto extent = GENERATE(table<int, int>({
-        record{3, 7},
-        record{-5, -3},
-        record{90, 100}
-    }));
-
-    auto from = std::get<0>(extent);
-    auto to = std::get<1>(extent);
-
-    auto values = GENERATE_COPY(range(from, to));
-    REQUIRE(values > -6);
-}
diff --git a/projects/SelfTest/UsageTests/Matchers.tests.cpp b/projects/SelfTest/UsageTests/Matchers.tests.cpp
index b0b5d58..dc4b701 100644
--- a/projects/SelfTest/UsageTests/Matchers.tests.cpp
+++ b/projects/SelfTest/UsageTests/Matchers.tests.cpp
@@ -215,16 +215,6 @@
             v2.push_back(1);
             v2.push_back(2);
 
-            std::vector<double> v3;
-            v3.push_back(1);
-            v3.push_back(2);
-            v3.push_back(3);
-
-            std::vector<double> v4;
-            v4.push_back(1 + 1e-8);
-            v4.push_back(2 + 1e-8);
-            v4.push_back(3 + 1e-8);
-
             std::vector<int> empty;
 
             SECTION("Contains (element)") {
@@ -277,16 +267,6 @@
             v2.push_back(1);
             v2.push_back(2);
 
-            std::vector<double> v3;
-            v3.push_back(1);
-            v3.push_back(2);
-            v3.push_back(3);
-
-            std::vector<double> v4;
-            v4.push_back(1.1);
-            v4.push_back(2.1);
-            v4.push_back(3.1);
-
             std::vector<int> empty;
 
             SECTION("Contains (element)") {
@@ -460,44 +440,6 @@
             REQUIRE_THAT("foo", Predicate<const char*>([] (const char* const&) { return true; }));
         }
 
-        TEST_CASE("Vector Approx matcher", "[matchers][approx][vector]") {
-            using Catch::Matchers::Approx;
-            SECTION("Empty vector is roughly equal to an empty vector") {
-                std::vector<double> empty;
-                REQUIRE_THAT(empty, Approx(empty));
-            }
-            SECTION("Vectors with elements") {
-                std::vector<double> v1({1., 2., 3.});
-                SECTION("A vector is approx equal to itself") {
-                    REQUIRE_THAT(v1, Approx(v1));
-                }
-                std::vector<double> v2({1.5, 2.5, 3.5});
-                SECTION("Different length") {
-                    auto temp(v1);
-                    temp.push_back(4);
-                    REQUIRE_THAT(v1, !Approx(temp));
-                }
-                SECTION("Same length, different elements") {
-                    REQUIRE_THAT(v1, !Approx(v2));
-                    REQUIRE_THAT(v1, Approx(v2).margin(0.5));
-                    REQUIRE_THAT(v1, Approx(v2).epsilon(0.5));
-                    REQUIRE_THAT(v1, Approx(v2).epsilon(0.1).scale(500));
-                }
-            }
-        }
-
-        TEST_CASE("Vector Approx matcher -- failing", "[matchers][approx][vector][.failing]") {
-            using Catch::Matchers::Approx;
-            SECTION("Empty and non empty vectors are not approx equal") {
-                std::vector<double> empty, t1({1, 2});
-                CHECK_THAT(empty, Approx(t1));
-            }
-            SECTION("Just different vectors") {
-                std::vector<double> v1({2., 4., 6.}), v2({1., 3., 5.});
-                CHECK_THAT(v1, Approx(v2));
-            }
-        }
-
 } } // namespace MatchersTests
 
 #endif // CATCH_CONFIG_DISABLE_MATCHERS
diff --git a/projects/SelfTest/UsageTests/Message.tests.cpp b/projects/SelfTest/UsageTests/Message.tests.cpp
index ccb7ac2..c955822 100644
--- a/projects/SelfTest/UsageTests/Message.tests.cpp
+++ b/projects/SelfTest/UsageTests/Message.tests.cpp
@@ -14,13 +14,6 @@
     WARN( "this is a " << "warning" );    // This should always output the message but then continue
 }
 
-TEST_CASE( "#1455 - INFO and WARN can start with a linebreak", "[messages][.]" ) {
-    // Previously these would be hidden from the console reporter output,
-    // because it would fail at properly reflowing the text
-    INFO( "\nThis info message starts with a linebreak" );
-    WARN( "\nThis warning message starts with a linebreak" );
-}
-
 TEST_CASE( "SUCCEED counts as a test pass", "[messages]" ) {
     SUCCEED( "this is a " << "success" );
 }
@@ -227,9 +220,9 @@
 
 template <typename T1, typename T2>
 struct helper_1436 {
-    helper_1436(T1 t1_, T2 t2_):
-        t1{ t1_ },
-        t2{ t2_ }
+    helper_1436(T1 t1, T2 t2):
+        t1{ t1 },
+        t2{ t2 }
     {}
     T1 t1;
     T2 t2;
diff --git a/projects/SelfTest/UsageTests/ToStringGeneral.tests.cpp b/projects/SelfTest/UsageTests/ToStringGeneral.tests.cpp
index 09ac304..acddf22 100644
--- a/projects/SelfTest/UsageTests/ToStringGeneral.tests.cpp
+++ b/projects/SelfTest/UsageTests/ToStringGeneral.tests.cpp
@@ -132,7 +132,7 @@
 
 struct WhatException : std::exception {
     char const* what() const noexcept override {
-        return "This exception has overridden what() method";
+        return "This exception has overriden what() method";
     }
     ~WhatException() override;
 };
@@ -170,7 +170,7 @@
 
 
 TEST_CASE("Exception as a value (e.g. in REQUIRE_THROWS_MATCHES) can be stringified", "[toString][exception]") {
-    REQUIRE(::Catch::Detail::stringify(WhatException{}) == "This exception has overridden what() method");
+    REQUIRE(::Catch::Detail::stringify(WhatException{}) == "This exception has overriden what() method");
     REQUIRE(::Catch::Detail::stringify(OperatorException{}) == "OperatorException");
     REQUIRE(::Catch::Detail::stringify(StringMakerException{}) == "StringMakerException");
 }
diff --git a/projects/XCode/OCTest/OCTest/CatchOCTestCase.mm b/projects/XCode/OCTest/OCTest/CatchOCTestCase.mm
index e285138..9bd1fa0 100644
--- a/projects/XCode/OCTest/OCTest/CatchOCTestCase.mm
+++ b/projects/XCode/OCTest/OCTest/CatchOCTestCase.mm
@@ -70,7 +70,7 @@
 {
     using namespace Catch::Matchers;
 
-    REQUIRE_THAT( @"This is a string", Equals( @"This isn't a string" ) );
+    REQUIRE_THAT( @"This is a string", Equals( @"This isnt a string" ) );
     REQUIRE_THAT( @"This is a string", Contains( @"is a" ) );
     REQUIRE_THAT( @"This is a string", StartsWith( @"This" ) );
     REQUIRE_THAT( @"This is a string", EndsWith( @"string" ) );
diff --git a/single_include/catch2/catch.hpp b/single_include/catch2/catch.hpp
index df14c35..1850fff 100644
--- a/single_include/catch2/catch.hpp
+++ b/single_include/catch2/catch.hpp
@@ -1,6 +1,6 @@
 /*
- *  Catch v2.7.2
- *  Generated: 2019-04-22 23:13:14.687465
+ *  Catch v2.7.0
+ *  Generated: 2019-03-07 21:34:30.252164
  *  ----------------------------------------------------------
  *  This file has been merged from multiple headers. Please don't edit it directly
  *  Copyright (c) 2019 Two Blue Cubes Ltd. All rights reserved.
@@ -15,7 +15,7 @@
 
 #define CATCH_VERSION_MAJOR 2
 #define CATCH_VERSION_MINOR 7
-#define CATCH_VERSION_PATCH 2
+#define CATCH_VERSION_PATCH 0
 
 #ifdef __clang__
 #    pragma clang system_header
@@ -3113,7 +3113,7 @@
 
     // The following functions create the actual matcher objects.
     // The user has to explicitly specify type to the function, because
-    // inferring std::function<bool(T const&)> is hard (but possible) and
+    // infering std::function<bool(T const&)> is hard (but possible) and
     // requires a lot of TMP.
     template<typename T>
     Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate, std::string const& description = "") {
@@ -3201,6 +3201,28 @@
 namespace Matchers {
 
     namespace Vector {
+        namespace Detail {
+            template <typename InputIterator, typename T>
+            size_t count(InputIterator first, InputIterator last, T const& item) {
+                size_t cnt = 0;
+                for (; first != last; ++first) {
+                    if (*first == item) {
+                        ++cnt;
+                    }
+                }
+                return cnt;
+            }
+            template <typename InputIterator, typename T>
+            bool contains(InputIterator first, InputIterator last, T const& item) {
+                for (; first != last; ++first) {
+                    if (*first == item) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+        }
+
         template<typename T>
         struct ContainsElementMatcher : MatcherBase<std::vector<T>> {
 
@@ -3276,42 +3298,6 @@
         };
 
         template<typename T>
-        struct ApproxMatcher : MatcherBase<std::vector<T>> {
-
-            ApproxMatcher(std::vector<T> const& comparator) : m_comparator( comparator ) {}
-
-            bool match(std::vector<T> const &v) const override {
-                if (m_comparator.size() != v.size())
-                    return false;
-                for (std::size_t i = 0; i < v.size(); ++i)
-                    if (m_comparator[i] != approx(v[i]))
-                        return false;
-                return true;
-            }
-            std::string describe() const override {
-                return "is approx: " + ::Catch::Detail::stringify( m_comparator );
-            }
-            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
-            ApproxMatcher& epsilon( T const& newEpsilon ) {
-                approx.epsilon(newEpsilon);
-                return *this;
-            }
-            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
-            ApproxMatcher& margin( T const& newMargin ) {
-                approx.margin(newMargin);
-                return *this;
-            }
-            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
-            ApproxMatcher& scale( T const& newScale ) {
-                approx.scale(newScale);
-                return *this;
-            }
-
-            std::vector<T> const& m_comparator;
-            mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom();
-        };
-
-        template<typename T>
         struct UnorderedEqualsMatcher : MatcherBase<std::vector<T>> {
             UnorderedEqualsMatcher(std::vector<T> const& target) : m_target(target) {}
             bool match(std::vector<T> const& vec) const override {
@@ -3320,7 +3306,28 @@
                 if (m_target.size() != vec.size()) {
                     return false;
                 }
-                return std::is_permutation(m_target.begin(), m_target.end(), vec.begin());
+                auto lfirst = m_target.begin(), llast = m_target.end();
+                auto rfirst = vec.begin(), rlast = vec.end();
+                // Cut common prefix to optimize checking of permuted parts
+                while (lfirst != llast && *lfirst == *rfirst) {
+                    ++lfirst; ++rfirst;
+                }
+                if (lfirst == llast) {
+                    return true;
+                }
+
+                for (auto mid = lfirst; mid != llast; ++mid) {
+                    // Skip already counted items
+                    if (Detail::contains(lfirst, mid, *mid)) {
+                        continue;
+                    }
+                    size_t num_vec = Detail::count(rfirst, rlast, *mid);
+                    if (num_vec == 0 || Detail::count(lfirst, llast, *mid) != num_vec) {
+                        return false;
+                    }
+                }
+
+                return true;
             }
 
             std::string describe() const override {
@@ -3351,11 +3358,6 @@
     }
 
     template<typename T>
-    Vector::ApproxMatcher<T> Approx( std::vector<T> const& comparator ) {
-        return Vector::ApproxMatcher<T>( comparator );
-    }
-
-    template<typename T>
     Vector::UnorderedEqualsMatcher<T> UnorderedEquals(std::vector<T> const& target) {
         return Vector::UnorderedEqualsMatcher<T>(target);
     }
@@ -3684,11 +3686,7 @@
 } // namespace Catch
 
 #define GENERATE( ... ) \
-    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
-#define GENERATE_COPY( ... ) \
-    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
-#define GENERATE_REF( ... ) \
-    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
+    Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, []{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
 
 // end catch_generators.hpp
 // start catch_generators_generic.hpp
@@ -3851,28 +3849,16 @@
         }
     };
 
-#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703
-    // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is
-    // replaced with std::invoke_result here. Also *_t format is preferred over
-    // typename *::type format.
-    template <typename Func, typename U>
-    using MapFunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U>>>;
-#else
-    template <typename Func, typename U>
-    using MapFunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U)>::type>::type>::type;
-#endif
-
-    template <typename Func, typename U, typename T = MapFunctionReturnType<Func, U>>
+    template <typename T, typename U, typename Func>
     GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
         return GeneratorWrapper<T>(
             pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))
         );
     }
-
-    template <typename T, typename U, typename Func>
-    GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
+    template <typename T, typename Func>
+    GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<T>&& generator) {
         return GeneratorWrapper<T>(
-            pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))
+            pf::make_unique<MapGenerator<T, T, Func>>(std::forward<Func>(function), std::move(generator))
         );
     }
 
@@ -4036,7 +4022,6 @@
         virtual ShowDurations::OrNot showDurations() const = 0;
         virtual TestSpec const& testSpec() const = 0;
         virtual bool hasTestFilters() const = 0;
-        virtual std::vector<std::string> const& getTestsOrTags() const = 0;
         virtual RunTests::InWhatOrder runOrder() const = 0;
         virtual unsigned int rngSeed() const = 0;
         virtual int benchmarkResolutionMultiple() const = 0;
@@ -4367,7 +4352,7 @@
                     arcSafeRelease( m_substr );
                 }
 
-                bool match( NSString* const& str ) const override {
+                bool match( NSString* arg ) const override {
                     return false;
                 }
 
@@ -4377,7 +4362,7 @@
             struct Equals : StringHolder {
                 Equals( NSString* substr ) : StringHolder( substr ){}
 
-                bool match( NSString* const& str ) const override {
+                bool match( NSString* str ) const override {
                     return  (str != nil || m_substr == nil ) &&
                             [str isEqualToString:m_substr];
                 }
@@ -4390,7 +4375,7 @@
             struct Contains : StringHolder {
                 Contains( NSString* substr ) : StringHolder( substr ){}
 
-                bool match( NSString* const& str ) const override {
+                bool match( NSString* str ) const {
                     return  (str != nil || m_substr == nil ) &&
                             [str rangeOfString:m_substr].location != NSNotFound;
                 }
@@ -4403,7 +4388,7 @@
             struct StartsWith : StringHolder {
                 StartsWith( NSString* substr ) : StringHolder( substr ){}
 
-                bool match( NSString* const& str ) const override {
+                bool match( NSString* str ) const override {
                     return  (str != nil || m_substr == nil ) &&
                             [str rangeOfString:m_substr].location == 0;
                 }
@@ -4415,7 +4400,7 @@
             struct EndsWith : StringHolder {
                 EndsWith( NSString* substr ) : StringHolder( substr ){}
 
-                bool match( NSString* const& str ) const override {
+                bool match( NSString* str ) const override {
                     return  (str != nil || m_substr == nil ) &&
                             [str rangeOfString:m_substr].location == [str length] - [m_substr length];
                 }
@@ -4533,7 +4518,7 @@
         public:
             NamePattern( std::string const& name );
             virtual ~NamePattern();
-            bool matches( TestCaseInfo const& testCase ) const override;
+            virtual bool matches( TestCaseInfo const& testCase ) const override;
         private:
             WildcardPattern m_wildcardPattern;
         };
@@ -4542,7 +4527,7 @@
         public:
             TagPattern( std::string const& tag );
             virtual ~TagPattern();
-            bool matches( TestCaseInfo const& testCase ) const override;
+            virtual bool matches( TestCaseInfo const& testCase ) const override;
         private:
             std::string m_tag;
         };
@@ -4551,7 +4536,7 @@
         public:
             ExcludedPattern( PatternPtr const& underlyingPattern );
             virtual ~ExcludedPattern();
-            bool matches( TestCaseInfo const& testCase ) const override;
+            virtual bool matches( TestCaseInfo const& testCase ) const override;
         private:
             PatternPtr m_underlyingPattern;
         };
@@ -4723,10 +4708,10 @@
         std::string getProcessName() const;
         std::string const& getReporterName() const;
 
-        std::vector<std::string> const& getTestsOrTags() const override;
+        std::vector<std::string> const& getTestsOrTags() const;
         std::vector<std::string> const& getSectionsToRun() const override;
 
-        TestSpec const& testSpec() const override;
+        virtual TestSpec const& testSpec() const override;
         bool hasTestFilters() const override;
 
         bool showHelp() const;
@@ -5097,8 +5082,6 @@
     // Returns double formatted as %.3f (format expected on output)
     std::string getFormattedDuration( double duration );
 
-    std::string serializeFilters( std::vector<std::string> const& container );
-
     template<typename DerivedT>
     struct StreamingReporterBase : IStreamingReporter {
 
@@ -5126,7 +5109,6 @@
         void testRunStarting(TestRunInfo const& _testRunInfo) override {
             currentTestRunInfo = _testRunInfo;
         }
-
         void testGroupStarting(GroupInfo const& _groupInfo) override {
             currentGroupInfo = _groupInfo;
         }
@@ -5417,11 +5399,11 @@
 
         class ReporterFactory : public IReporterFactory {
 
-            IStreamingReporterPtr create( ReporterConfig const& config ) const override {
+            virtual IStreamingReporterPtr create( ReporterConfig const& config ) const override {
                 return std::unique_ptr<T>( new T( config ) );
             }
 
-            std::string getDescription() const override {
+            virtual std::string getDescription() const override {
                 return T::getDescription();
             }
         };
@@ -5438,10 +5420,10 @@
 
         class ListenerFactory : public IReporterFactory {
 
-            IStreamingReporterPtr create( ReporterConfig const& config ) const override {
+            virtual IStreamingReporterPtr create( ReporterConfig const& config ) const override {
                 return std::unique_ptr<T>( new T( config ) );
             }
-            std::string getDescription() const override {
+            virtual std::string getDescription() const override {
                 return std::string();
             }
         };
@@ -5539,7 +5521,7 @@
         void testCaseEnded(TestCaseStats const& _testCaseStats) override;
         void testGroupEnded(TestGroupStats const& _testGroupStats) override;
         void testRunEnded(TestRunStats const& _testRunStats) override;
-        void testRunStarting(TestRunInfo const& _testRunInfo) override;
+
     private:
 
         void lazyPrint();
@@ -5561,7 +5543,6 @@
 
         void printTotalsDivider(Totals const& totals);
         void printSummaryDivider();
-        void printTestFilters();
 
     private:
         bool m_headerPrinted = false;
@@ -5842,6 +5823,8 @@
 
     public:
 
+        static TrackerContext& instance();
+
         ITracker& startRun();
         void endRun();
 
@@ -5987,18 +5970,18 @@
         return marginComparison(m_value, other, m_margin) || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(m_value)));
     }
 
-    void Approx::setMargin(double newMargin) {
-        CATCH_ENFORCE(newMargin >= 0,
-            "Invalid Approx::margin: " << newMargin << '.'
+    void Approx::setMargin(double margin) {
+        CATCH_ENFORCE(margin >= 0,
+            "Invalid Approx::margin: " << margin << '.'
             << " Approx::Margin has to be non-negative.");
-        m_margin = newMargin;
+        m_margin = margin;
     }
 
-    void Approx::setEpsilon(double newEpsilon) {
-        CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0,
-            "Invalid Approx::epsilon: " << newEpsilon << '.'
+    void Approx::setEpsilon(double epsilon) {
+        CATCH_ENFORCE(epsilon >= 0 && epsilon <= 1.0,
+            "Invalid Approx::epsilon: " << epsilon << '.'
             << " Approx::epsilon has to be in [0, 1]");
-        m_epsilon = newEpsilon;
+        m_epsilon = epsilon;
     }
 
 } // end namespace Detail
@@ -6634,9 +6617,6 @@
 			m_suffix = false;
 			auto width = m_column.m_width - indent();
 			m_end = m_pos;
-			if (line()[m_pos] == '\n') {
-				++m_end;
-			}
 			while (m_end < line().size() && line()[m_end] != '\n')
 				++m_end;
 
@@ -8041,7 +8021,10 @@
         m_stream( openStream() )
     {
         TestSpecParser parser(ITagAliasRegistry::get());
-        if (!data.testsOrTags.empty()) {
+        if (data.testsOrTags.empty()) {
+            parser.parse("~[.]"); // All not hidden tests
+        }
+        else {
             m_hasTestFilters = true;
             for( auto const& testOrTags : data.testsOrTags )
                 parser.parse( testOrTags );
@@ -8159,7 +8142,7 @@
             originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
         }
 
-        void use( Colour::Code _colourCode ) override {
+        virtual void use( Colour::Code _colourCode ) override {
             switch( _colourCode ) {
                 case Colour::None:      return setTextAttribute( originalForegroundAttributes );
                 case Colour::White:     return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
@@ -8222,7 +8205,7 @@
     // https://github.com/philsquared/Catch/pull/131
     class PosixColourImpl : public IColourImpl {
     public:
-        void use( Colour::Code _colourCode ) override {
+        virtual void use( Colour::Code _colourCode ) override {
             switch( _colourCode ) {
                 case Colour::None:
                 case Colour::White:     return setColour( "[0m" );
@@ -8333,27 +8316,27 @@
     class Context : public IMutableContext, NonCopyable {
 
     public: // IContext
-        IResultCapture* getResultCapture() override {
+        virtual IResultCapture* getResultCapture() override {
             return m_resultCapture;
         }
-        IRunner* getRunner() override {
+        virtual IRunner* getRunner() override {
             return m_runner;
         }
 
-        IConfigPtr const& getConfig() const override {
+        virtual IConfigPtr const& getConfig() const override {
             return m_config;
         }
 
-        ~Context() override;
+        virtual ~Context() override;
 
     public: // IMutableContext
-        void setResultCapture( IResultCapture* resultCapture ) override {
+        virtual void setResultCapture( IResultCapture* resultCapture ) override {
             m_resultCapture = resultCapture;
         }
-        void setRunner( IRunner* runner ) override {
+        virtual void setRunner( IRunner* runner ) override {
             m_runner = runner;
         }
-        void setConfig( IConfigPtr const& config ) override {
+        virtual void setConfig( IConfigPtr const& config ) override {
             m_config = config;
         }
 
@@ -8419,23 +8402,19 @@
 #  include <stdbool.h>
 #  include <sys/types.h>
 #  include <unistd.h>
+#  include <sys/sysctl.h>
 #  include <cstddef>
 #  include <ostream>
 
-#ifdef __apple_build_version__
-    // These headers will only compile with AppleClang (XCode)
-    // For other compilers (Clang, GCC, ... ) we need to exclude them
-#  include <sys/sysctl.h>
-#endif
+namespace Catch {
 
-    namespace Catch {
-        #ifdef __apple_build_version__
         // The following function is taken directly from the following technical note:
-        // https://developer.apple.com/library/archive/qa/qa1361/_index.html
+        // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html
 
         // Returns true if the current process is being debugged (either
         // running under the debugger or has a debugger attached post facto).
         bool isDebuggerActive(){
+
             int                 mib[4];
             struct kinfo_proc   info;
             std::size_t         size;
@@ -8465,12 +8444,6 @@
 
             return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
         }
-        #else
-        bool isDebuggerActive() {
-            // We need to find another way to determine this for non-appleclang compilers on macOS
-            return false;
-        }
-        #endif
     } // namespace Catch
 
 #elif defined(CATCH_PLATFORM_LINUX)
@@ -8575,7 +8548,7 @@
     public:
         ~ExceptionTranslatorRegistry();
         virtual void registerTranslator( const IExceptionTranslator* translator );
-        std::string translateActiveException() const override;
+        virtual std::string translateActiveException() const override;
         std::string tryTranslators() const;
 
     private:
@@ -8687,10 +8660,10 @@
     // Windows can easily distinguish between SO and SigSegV,
     // but SigInt, SigTerm, etc are handled differently.
     static SignalDefs signalDefs[] = {
-        { static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION),  "SIGILL - Illegal instruction signal" },
-        { static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), "SIGSEGV - Stack overflow" },
-        { static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION), "SIGSEGV - Segmentation violation signal" },
-        { static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), "Divide by zero error" },
+        { EXCEPTION_ILLEGAL_INSTRUCTION,  "SIGILL - Illegal instruction signal" },
+        { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" },
+        { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" },
+        { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" },
     };
 
     LONG CALLBACK FatalConditionHandler::handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {
@@ -9848,7 +9821,7 @@
             if (strerror_s(buffer, errno)) {
                 CATCH_RUNTIME_ERROR("Could not translate errno to a string");
             }
-            CATCH_RUNTIME_ERROR("Could not open the temp file: '" << m_buffer << "' because: " << buffer);
+            CATCH_RUNTIME_ERROR("Coul dnot open the temp file: '" << m_buffer << "' because: " << buffer);
         }
     }
 #else
@@ -10926,10 +10899,7 @@
 
             auto const& allTestCases = getAllTestCasesSorted(*config);
             for (auto const& testCase : allTestCases) {
-                bool matching = (!testSpec.hasFilters() && !testCase.isHidden()) ||
-                                 (testSpec.hasFilters() && matchTest(testCase, testSpec, *config));
-
-                if (!context.aborting() && matching)
+                if (!context.aborting() && matchTest(testCase, testSpec, *config))
                     totals += context.runTest(testCase);
                 else
                     context.reporter().skipTest(testCase);
@@ -11655,7 +11625,7 @@
         void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) {
             CATCH_ENFORCE( !isReservedTag(tag),
                           "Tag name: [" << tag << "] is not allowed.\n"
-                          << "Tag names starting with non alphanumeric characters are reserved\n"
+                          << "Tag names starting with non alpha-numeric characters are reserved\n"
                           << _lineInfo );
         }
     }
@@ -11687,12 +11657,6 @@
                     else if( prop == TestCaseInfo::None )
                         enforceNotReservedTag( tag, _lineInfo );
 
-                    // Merged hide tags like `[.approvals]` should be added as
-                    // `[.][approvals]`. The `[.]` is added at later point, so
-                    // we only strip the prefix
-                    if (startsWith(tag, '.') && tag.size() > 1) {
-                        tag.erase(0, 1);
-                    }
                     tags.push_back( tag );
                     tag.clear();
                     inTag = false;
@@ -11837,12 +11801,9 @@
     std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) {
         std::vector<TestCase> filtered;
         filtered.reserve( testCases.size() );
-        for (auto const& testCase : testCases) {
-            if ((!testSpec.hasFilters() && !testCase.isHidden()) ||
-                (testSpec.hasFilters() && matchTest(testCase, testSpec, config))) {
-                filtered.push_back(testCase);
-            }
-        }
+        for( auto const& testCase : testCases )
+            if( matchTest( testCase, testSpec, config ) )
+                filtered.push_back( testCase );
         return filtered;
     }
     std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) {
@@ -11918,6 +11879,11 @@
 
     ITracker::~ITracker() = default;
 
+    TrackerContext& TrackerContext::instance() {
+        static TrackerContext s_instance;
+        return s_instance;
+    }
+
     ITracker& TrackerContext::startRun() {
         m_rootTracker = std::make_shared<SectionTracker>( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, nullptr );
         m_currentTracker = nullptr;
@@ -12699,7 +12665,7 @@
     }
 
     Version const& libraryVersion() {
-        static Version version( 2, 7, 2, "", 0 );
+        static Version version( 2, 7, 0, "", 0 );
         return version;
     }
 
@@ -13056,21 +13022,6 @@
         return std::string(buffer);
     }
 
-    std::string serializeFilters( std::vector<std::string> const& container ) {
-        ReusableStringStream oss;
-        bool first = true;
-        for (auto&& filter : container)
-        {
-            if (!first)
-                oss << ' ';
-            else
-                first = false;
-
-            oss << filter;
-        }
-        return oss.str();
-    }
-
     TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config)
         :StreamingReporterBase(_config) {}
 
@@ -13795,10 +13746,6 @@
     stream << std::endl;
     StreamingReporterBase::testRunEnded(_testRunStats);
 }
-void ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) {
-    StreamingReporterBase::testRunStarting(_testInfo);
-    printTestFilters();
-}
 
 void ConsoleReporter::lazyPrint() {
 
@@ -13980,11 +13927,6 @@
     stream << getLineOfChars<'-'>() << '\n';
 }
 
-void ConsoleReporter::printTestFilters() {
-    if (m_config->testSpec().hasFilters())
-        stream << Colour(Colour::BrightYellow) << "Filters: " << serializeFilters( m_config->getTestsOrTags() ) << '\n';
-}
-
 CATCH_REGISTER_REPORTER("console", ConsoleReporter)
 
 } // end namespace Catch
@@ -14058,6 +14000,13 @@
     void JunitReporter::testRunStarting( TestRunInfo const& runInfo )  {
         CumulativeReporterBase::testRunStarting( runInfo );
         xml.startElement( "testsuites" );
+        if( m_config->rngSeed() != 0 ) {
+            xml.startElement( "properties" );
+            xml.scopedElement( "property" )
+                .writeAttribute( "name", "random-seed" )
+                .writeAttribute( "value", m_config->rngSeed() );
+            xml.endElement();
+        }
     }
 
     void JunitReporter::testGroupStarting( GroupInfo const& groupInfo ) {
@@ -14096,7 +14045,6 @@
 
     void JunitReporter::writeGroup( TestGroupNode const& groupNode, double suiteTime ) {
         XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" );
-
         TestGroupStats const& stats = groupNode.value;
         xml.writeAttribute( "name", stats.groupInfo.name );
         xml.writeAttribute( "errors", unexpectedExceptions );
@@ -14109,21 +14057,6 @@
             xml.writeAttribute( "time", suiteTime );
         xml.writeAttribute( "timestamp", getCurrentTimestamp() );
 
-        // Write properties if there are any
-        if (m_config->hasTestFilters() || m_config->rngSeed() != 0) {
-            auto properties = xml.scopedElement("properties");
-            if (m_config->hasTestFilters()) {
-                xml.scopedElement("property")
-                    .writeAttribute("name", "filters")
-                    .writeAttribute("value", serializeFilters(m_config->getTestsOrTags()));
-            }
-            if (m_config->rngSeed() != 0) {
-                xml.scopedElement("property")
-                    .writeAttribute("name", "random-seed")
-                    .writeAttribute("value", m_config->rngSeed());
-            }
-        }
-
         // Write test cases
         for( auto const& child : groupNode.children )
             writeTestCase( *child );
@@ -14424,8 +14357,6 @@
         m_xml.startElement( "Catch" );
         if( !m_config->name().empty() )
             m_xml.writeAttribute( "name", m_config->name() );
-        if (m_config->testSpec().hasFilters())
-            m_xml.writeAttribute( "filters", serializeFilters( m_config->getTestsOrTags() ) );
         if( m_config->rngSeed() != 0 )
             m_xml.scopedElement( "Randomness" )
                 .writeAttribute( "seed", m_config->rngSeed() );
diff --git a/third_party/clara.hpp b/third_party/clara.hpp
index 9f4f1b2..6be5a98 100644
--- a/third_party/clara.hpp
+++ b/third_party/clara.hpp
@@ -110,9 +110,6 @@
                 m_suffix = false;
                 auto width = m_column.m_width-indent();
                 m_end = m_pos;
-                if (line()[m_pos] == '\n') {
-                    ++m_end;
-                }
                 while( m_end < line().size() && line()[m_end] != '\n' )
                     ++m_end;