diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..afa59c0
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,31 @@
+# https://clang.llvm.org/docs/ClangFormatStyleOptions.html
+Language: Cpp
+BasedOnStyle: LLVM
+AccessModifierOffset: -4
+BreakBeforeBraces: Allman
+BreakBeforeTernaryOperators: true
+ColumnLimit: 100
+EmptyLineBeforeAccessModifier: Never
+FixNamespaceComments: false
+IncludeBlocks: Regroup
+IncludeCategories:
+  - Regex: "^<[a-z]*>"
+    Priority: 1
+  - Regex: "^<.*/.*>"
+    Priority: 2
+  - Regex: '^<.*\.hpp>'
+    Priority: 3
+  - Regex: '^<.*\.h>'
+    Priority: 4
+  - Regex: ".*"
+    Priority: 5
+IndentCaseLabels: true
+IndentPPDirectives: BeforeHash
+IndentWidth: 4
+InsertNewlineAtEOF: true
+NamespaceIndentation: All
+PointerAlignment: Left
+ReferenceAlignment: Left
+SortIncludes: CaseInsensitive
+SpaceBeforeCaseColon: true
+SpaceBeforeParens: ControlStatements
diff --git a/.clang-tidy b/.clang-tidy
new file mode 100644
index 0000000..3927b91
--- /dev/null
+++ b/.clang-tidy
@@ -0,0 +1,30 @@
+---
+# Enable all by default, then disable some that have either too many warnings
+# at the moment or ones that don't make sense for our codebase
+Checks: clang-diagnostic-*
+    clang-analyzer-*
+    cppcoreguidelines-*
+    modernize-*
+    hicpp-*
+    -hicpp-special-member-functions
+    -modernize-pass-by-value
+    -cppcoreguidelines-pro-bounds-constant-array-index
+    -modernize-use-trailing-return-type
+    -cppcoreguidelines-avoid-non-const-global-variables
+    -hicpp-signed-bitwise
+    -hicpp-vararg
+    -hicpp-braces-around-statements
+    -hicpp-no-array-decay
+    -cppcoreguidelines-pro-bounds-pointer-arithmetic
+    -cppcoreguidelines-non-private-member-variables-in-classes
+    -cppcoreguidelines-avoid-magic-numbers
+    -cppcoreguidelines-pro-type-vararg
+    -modernize-avoid-c-arrays
+    -cppcoreguidelines-avoid-c-arrays
+    -cppcoreguidelines-pro-bounds-array-to-pointer-decay
+    -cppcoreguidelines-narrowing-conversions
+    -clang-analyzer-deadcode.DeadStores
+WarningsAsErrors: '*'
+HeaderFilterRegex: ''
+AnalyzeTemporaryDtors: false
+...
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..c4e98c0
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,37 @@
+# Sources
+*.c     text diff=cpp
+*.cc    text diff=cpp
+*.cxx   text diff=cpp
+*.cpp   text diff=cpp
+*.cpi   text diff=cpp
+*.c++   text diff=cpp
+*.hpp   text diff=cpp
+*.h     text diff=cpp
+*.h++   text diff=cpp
+*.hh    text diff=cpp
+
+# Compiled Object files
+*.slo   binary
+*.lo    binary
+*.o     binary
+*.obj   binary
+
+# Precompiled Headers
+*.gch   binary
+*.pch   binary
+
+# Compiled Dynamic libraries
+*.so    binary
+*.dylib binary
+*.dll   binary
+
+# Compiled Static libraries
+*.lai   binary
+*.la    binary
+*.a     binary
+*.lib   binary
+
+# Executables
+*.exe   binary
+*.out   binary
+*.app   binary
diff --git a/.gitignore b/.gitignore
index cad4563..f28f810 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,4 +35,5 @@
 # VS and Output
 .vs
 Debug/
-*.vcxproj.user
\ No newline at end of file
+*.vcxproj.user
+build/
\ No newline at end of file
diff --git a/AdventOfCode2024/AdventOfCode2024.cpp b/AdventOfCode2024.cpp
similarity index 92%
rename from AdventOfCode2024/AdventOfCode2024.cpp
rename to AdventOfCode2024.cpp
index 010d4a1..3600603 100644
--- a/AdventOfCode2024/AdventOfCode2024.cpp
+++ b/AdventOfCode2024.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,11 +13,11 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "Program.h"
+#include <aoc/Program.h>
 
 int main()
 {
     Program program;
     program.run();
     return 0;
-}
\ No newline at end of file
+}
diff --git a/AdventOfCode2024/.editorconfig b/AdventOfCode2024/.editorconfig
deleted file mode 100644
index c031793..0000000
--- a/AdventOfCode2024/.editorconfig
+++ /dev/null
@@ -1,82 +0,0 @@
-# Visual Studio generated .editorconfig file with C++ settings.
-root = true
-
-[*.{c++,cc,cpp,cppm,cxx,h,h++,hh,hpp,hxx,inl,ipp,ixx,tlh,tli}]
-
-# Visual C++ Code Style settings
-
-cpp_generate_documentation_comments = xml
-
-# Visual C++ Formatting settings
-
-cpp_indent_braces = false
-cpp_indent_multi_line_relative_to = innermost_parenthesis
-cpp_indent_within_parentheses = indent
-cpp_indent_preserve_within_parentheses = true
-cpp_indent_case_contents = true
-cpp_indent_case_labels = true
-cpp_indent_case_contents_when_block = false
-cpp_indent_lambda_braces_when_parameter = true
-cpp_indent_goto_labels = one_left
-cpp_indent_preprocessor = leftmost_column
-cpp_indent_access_specifiers = false
-cpp_indent_namespace_contents = true
-cpp_indent_preserve_comments = false
-cpp_new_line_before_open_brace_namespace = ignore
-cpp_new_line_before_open_brace_type = ignore
-cpp_new_line_before_open_brace_function = ignore
-cpp_new_line_before_open_brace_block = ignore
-cpp_new_line_before_open_brace_lambda = ignore
-cpp_new_line_scope_braces_on_separate_lines = false
-cpp_new_line_close_brace_same_line_empty_type = false
-cpp_new_line_close_brace_same_line_empty_function = false
-cpp_new_line_before_catch = true
-cpp_new_line_before_else = true
-cpp_new_line_before_while_in_do_while = false
-cpp_space_before_function_open_parenthesis = remove
-cpp_space_within_parameter_list_parentheses = false
-cpp_space_between_empty_parameter_list_parentheses = false
-cpp_space_after_keywords_in_control_flow_statements = true
-cpp_space_within_control_flow_statement_parentheses = false
-cpp_space_before_lambda_open_parenthesis = false
-cpp_space_within_cast_parentheses = false
-cpp_space_after_cast_close_parenthesis = false
-cpp_space_within_expression_parentheses = false
-cpp_space_before_block_open_brace = true
-cpp_space_between_empty_braces = false
-cpp_space_before_initializer_list_open_brace = false
-cpp_space_within_initializer_list_braces = true
-cpp_space_preserve_in_initializer_list = true
-cpp_space_before_open_square_bracket = false
-cpp_space_within_square_brackets = false
-cpp_space_before_empty_square_brackets = false
-cpp_space_between_empty_square_brackets = false
-cpp_space_group_square_brackets = true
-cpp_space_within_lambda_brackets = false
-cpp_space_between_empty_lambda_brackets = false
-cpp_space_before_comma = false
-cpp_space_after_comma = true
-cpp_space_remove_around_member_operators = true
-cpp_space_before_inheritance_colon = true
-cpp_space_before_constructor_colon = true
-cpp_space_remove_before_semicolon = true
-cpp_space_after_semicolon = true
-cpp_space_remove_around_unary_operator = true
-cpp_space_around_binary_operator = insert
-cpp_space_around_assignment_operator = insert
-cpp_space_pointer_reference_alignment = left
-cpp_space_around_ternary_operator = insert
-cpp_use_unreal_engine_macro_formatting = true
-cpp_wrap_preserve_blocks = one_liners
-
-# Visual C++ Inlcude Cleanup settings
-
-cpp_include_cleanup_add_missing_error_tag_type = suggestion
-cpp_include_cleanup_remove_unused_error_tag_type = dimmed
-cpp_include_cleanup_optimize_unused_error_tag_type = suggestion
-cpp_include_cleanup_sort_after_edits = false
-cpp_sort_includes_error_tag_type = none
-cpp_sort_includes_priority_case_sensitive = false
-cpp_sort_includes_priority_style = quoted
-cpp_includes_style = default
-cpp_includes_use_forward_slash = true
diff --git a/AdventOfCode2024/AdventOfCode2024.sln b/AdventOfCode2024/AdventOfCode2024.sln
deleted file mode 100644
index ff8d565..0000000
--- a/AdventOfCode2024/AdventOfCode2024.sln
+++ /dev/null
@@ -1,41 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.7.34221.43
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AdventOfCode2024", "AdventOfCode2024.vcxproj", "{0DEDB176-15A1-48C2-B710-5F17538C5DEC}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests", "UnitTests\UnitTests.vcxproj", "{15C7DA0D-C4D8-420B-AC10-D213AD22B9FA}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|x64 = Debug|x64
-		Debug|x86 = Debug|x86
-		Release|x64 = Release|x64
-		Release|x86 = Release|x86
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{0DEDB176-15A1-48C2-B710-5F17538C5DEC}.Debug|x64.ActiveCfg = Debug|x64
-		{0DEDB176-15A1-48C2-B710-5F17538C5DEC}.Debug|x64.Build.0 = Debug|x64
-		{0DEDB176-15A1-48C2-B710-5F17538C5DEC}.Debug|x86.ActiveCfg = Debug|Win32
-		{0DEDB176-15A1-48C2-B710-5F17538C5DEC}.Debug|x86.Build.0 = Debug|Win32
-		{0DEDB176-15A1-48C2-B710-5F17538C5DEC}.Release|x64.ActiveCfg = Release|x64
-		{0DEDB176-15A1-48C2-B710-5F17538C5DEC}.Release|x64.Build.0 = Release|x64
-		{0DEDB176-15A1-48C2-B710-5F17538C5DEC}.Release|x86.ActiveCfg = Release|Win32
-		{0DEDB176-15A1-48C2-B710-5F17538C5DEC}.Release|x86.Build.0 = Release|Win32
-		{15C7DA0D-C4D8-420B-AC10-D213AD22B9FA}.Debug|x64.ActiveCfg = Debug|x64
-		{15C7DA0D-C4D8-420B-AC10-D213AD22B9FA}.Debug|x64.Build.0 = Debug|x64
-		{15C7DA0D-C4D8-420B-AC10-D213AD22B9FA}.Debug|x86.ActiveCfg = Debug|Win32
-		{15C7DA0D-C4D8-420B-AC10-D213AD22B9FA}.Debug|x86.Build.0 = Debug|Win32
-		{15C7DA0D-C4D8-420B-AC10-D213AD22B9FA}.Release|x64.ActiveCfg = Release|x64
-		{15C7DA0D-C4D8-420B-AC10-D213AD22B9FA}.Release|x64.Build.0 = Release|x64
-		{15C7DA0D-C4D8-420B-AC10-D213AD22B9FA}.Release|x86.ActiveCfg = Release|Win32
-		{15C7DA0D-C4D8-420B-AC10-D213AD22B9FA}.Release|x86.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-		SolutionGuid = {09BCF972-2454-4BE3-9637-D49111238A7F}
-	EndGlobalSection
-EndGlobal
diff --git a/AdventOfCode2024/AdventOfCode2024.vcxproj b/AdventOfCode2024/AdventOfCode2024.vcxproj
deleted file mode 100644
index 35bfe34..0000000
--- a/AdventOfCode2024/AdventOfCode2024.vcxproj
+++ /dev/null
@@ -1,182 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <VCProjectVersion>17.0</VCProjectVersion>
-    <Keyword>Win32Proj</Keyword>
-    <ProjectGuid>{0dedb176-15a1-48c2-b710-5f17538c5dec}</ProjectGuid>
-    <RootNamespace>AdventOfCode2024</RootNamespace>
-    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v143</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v143</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v143</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v143</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <SDLCheck>true</SDLCheck>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <ConformanceMode>true</ConformanceMode>
-    </ClCompile>
-    <Link>
-      <SubSystem>Console</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <SDLCheck>true</SDLCheck>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <ConformanceMode>true</ConformanceMode>
-    </ClCompile>
-    <Link>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <SDLCheck>true</SDLCheck>
-      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <ConformanceMode>true</ConformanceMode>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-    </ClCompile>
-    <Link>
-      <SubSystem>Console</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <SDLCheck>true</SDLCheck>
-      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <ConformanceMode>true</ConformanceMode>
-    </ClCompile>
-    <Link>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="AdventOfCode2024.cpp" />
-    <ClCompile Include="CeresSearch.cpp" />
-    <ClCompile Include="GuardGallivant.cpp" />
-    <ClCompile Include="HistorianHysteria.cpp" />
-    <ClCompile Include="LinesSolver.cpp" />
-    <ClCompile Include="MullDataState.cpp" />
-    <ClCompile Include="MullToggleCloseState.cpp" />
-    <ClCompile Include="MullDoOpenState.cpp" />
-    <ClCompile Include="MullEntryState.cpp" />
-    <ClCompile Include="MullData.cpp" />
-    <ClCompile Include="MullFactorState.cpp" />
-    <ClCompile Include="MullItOver.cpp" />
-    <ClCompile Include="MullStates.cpp" />
-    <ClCompile Include="MullCharState.cpp" />
-    <ClCompile Include="Point2.cpp" />
-    <ClCompile Include="PrintQueue.cpp" />
-    <ClCompile Include="Program.cpp" />
-    <ClCompile Include="RedNosedReports.cpp" />
-    <ClCompile Include="Solver.cpp" />
-    <ClCompile Include="SolverEngine.cpp" />
-    <ClCompile Include="StringState.cpp" />
-    <ClCompile Include="StringStateMachine.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="CeresSearch.h" />
-    <ClInclude Include="GuardGallivant.h" />
-    <ClInclude Include="HistorianHysteria.h" />
-    <ClInclude Include="LinesSolver.h" />
-    <ClInclude Include="MullDataState.h" />
-    <ClInclude Include="MullToggleCloseState.h" />
-    <ClInclude Include="MullDoOpenState.h" />
-    <ClInclude Include="MullEntryState.h" />
-    <ClInclude Include="MullData.h" />
-    <ClInclude Include="MullFactorState.h" />
-    <ClInclude Include="MullItOver.h" />
-    <ClInclude Include="MullStates.h" />
-    <ClInclude Include="MullCharState.h" />
-    <ClInclude Include="Point2.h" />
-    <ClInclude Include="PrintQueue.h" />
-    <ClInclude Include="Program.h" />
-    <ClInclude Include="RedNosedReportData.h" />
-    <ClInclude Include="RedNosedReports.h" />
-    <ClInclude Include="Slope.h" />
-    <ClInclude Include="Solver.h" />
-    <ClInclude Include="SolverEngine.h" />
-    <ClInclude Include="StringState.h" />
-    <ClInclude Include="StringStateMachine.h" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/AdventOfCode2024/AdventOfCode2024.vcxproj.filters b/AdventOfCode2024/AdventOfCode2024.vcxproj.filters
deleted file mode 100644
index feac5aa..0000000
--- a/AdventOfCode2024/AdventOfCode2024.vcxproj.filters
+++ /dev/null
@@ -1,156 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="AdventOfCode2024.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Solver.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="SolverEngine.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Program.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="HistorianHysteria.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="RedNosedReports.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="MullItOver.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="StringStateMachine.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="StringState.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="MullEntryState.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="MullData.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="MullCharState.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="MullFactorState.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="MullDoOpenState.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="MullToggleCloseState.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="MullDataState.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="MullStates.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Point2.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CeresSearch.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="LinesSolver.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="PrintQueue.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="GuardGallivant.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="SolverEngine.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Solver.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Program.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="HistorianHysteria.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="RedNosedReports.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MullItOver.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="StringStateMachine.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="StringState.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MullEntryState.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MullData.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MullCharState.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MullFactorState.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MullDoOpenState.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MullToggleCloseState.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="RedNosedReportData.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Slope.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MullStates.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MullDataState.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Point2.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CeresSearch.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="LinesSolver.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="PrintQueue.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="GuardGallivant.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/AdventOfCode2024/StringState.cpp b/AdventOfCode2024/StringState.cpp
deleted file mode 100644
index 8c5d227..0000000
--- a/AdventOfCode2024/StringState.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "StringState.h"
diff --git a/AdventOfCode2024/UnitTests/UnitTests.cpp b/AdventOfCode2024/UnitTests/UnitTests.cpp
deleted file mode 100644
index d65336a..0000000
--- a/AdventOfCode2024/UnitTests/UnitTests.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-// Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
-//
-// This program is free software: you can redistribute it and/or modify it under
-// the terms of the GNU General Public License as published by the Free Software
-// Foundation, either version 3 of the License, or (at your option) any later
-// version.
-//
-// This program is distributed in the hope that it will be useful, but WITHOUT
-// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-// FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License along with
-// this program.  If not, see <http://www.gnu.org/licenses/>.
-
-#include "pch.h"
-#include "CppUnitTest.h"
-
-#include "Part1TestContext.h"
-#include "Part2TestContext.h"
-#include "../Solver.h"
-#include "../SolverEngine.h"
-
-#include "../HistorianHysteria.h"
-
-using namespace Microsoft::VisualStudio::CppUnitTestFramework;
-
-namespace UnitTests
-{
-    TEST_CLASS(HistorianHysteriaTests)
-    {
-    public:
-        TEST_METHOD(FullData1)
-        {
-            runTest(*std::make_unique<HistorianHysteria>(), 2176849, part1TestContext_);
-        }
-
-        TEST_METHOD(FullData2)
-        {
-            runTest(*std::make_unique<HistorianHysteria>(), 23384288, part2TestContext_);
-        }
-
-        TEST_METHOD(ExampleData1)
-        {
-            runTest(*std::make_unique<HistorianHysteria>(), 11, part1ExampleTestContext_);
-        }
-
-        TEST_METHOD(ExampleData2)
-        {
-            runTest(*std::make_unique<HistorianHysteria>(), 31, part2ExampleTestContext_);
-        }
-
-    private:
-        Part1TestContext part1TestContext_{ getInputPaths() };
-        Part2TestContext part2TestContext_{ getInputPaths() };
-        Part1TestContext part1ExampleTestContext_{ getExampleInputPaths() };
-        Part2TestContext part2ExampleTestContext_{ getExampleInputPaths() };
-
-        void runTest(Solver& solver, const long long int expected, const TestContext& context)
-        {
-            SolverEngine solverEngine{ context.getInputPaths() };
-            solverEngine.run(solver);
-            assertAreEqual(expected, context.getResult(solver));
-        }
-
-        std::vector<std::string> getInputPaths() const
-        {
-            return std::vector<std::string>{ "../../data", "../../../../data" };
-        }
-
-        std::vector<std::string> getExampleInputPaths() const
-        {
-            return std::vector<std::string>{ "../../data/examples", "../../../../data/examples" };
-        }
-
-        void assertAreEqual(const long long int expected, const long long int actual) const
-        {
-            std::wstring message = L"Expected: <" + std::to_wstring(expected) + L"> Actual: <" + std::to_wstring(actual) + L">";
-            Assert::IsTrue(expected == actual, message.c_str());
-        }
-    };
-}
diff --git a/AdventOfCode2024/UnitTests/UnitTests.vcxproj b/AdventOfCode2024/UnitTests/UnitTests.vcxproj
deleted file mode 100644
index c5dd3f5..0000000
--- a/AdventOfCode2024/UnitTests/UnitTests.vcxproj
+++ /dev/null
@@ -1,187 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <VCProjectVersion>17.0</VCProjectVersion>
-    <ProjectGuid>{15C7DA0D-C4D8-420B-AC10-D213AD22B9FA}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>UnitTests</RootNamespace>
-    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
-    <ProjectSubType>NativeUnitTestProject</ProjectSubType>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v143</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-    <UseOfMfc>false</UseOfMfc>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v143</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-    <UseOfMfc>false</UseOfMfc>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v143</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-    <UseOfMfc>false</UseOfMfc>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v143</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-    <UseOfMfc>false</UseOfMfc>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>..;$(IncludePath)</IncludePath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <UseFullPaths>true</UseFullPaths>
-      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
-      <LanguageStandard>stdcpp17</LanguageStandard>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;$(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>Solver.obj;SolverEngine.obj;HistorianHysteria.obj;RedNosedReports.obj;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <UseFullPaths>true</UseFullPaths>
-      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <UseFullPaths>true</UseFullPaths>
-      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <UseFullPaths>true</UseFullPaths>
-      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="Part1TestContext.cpp" />
-    <ClCompile Include="Part2TestContext.cpp" />
-    <ClCompile Include="pch.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
-    </ClCompile>
-    <ClCompile Include="TestContext.cpp" />
-    <ClCompile Include="UnitTests.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="Part1TestContext.h" />
-    <ClInclude Include="Part2TestContext.h" />
-    <ClInclude Include="pch.h" />
-    <ClInclude Include="TestContext.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\AdventOfCode2024.vcxproj">
-      <Project>{0dedb176-15a1-48c2-b710-5f17538c5dec}</Project>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/AdventOfCode2024/UnitTests/UnitTests.vcxproj.filters b/AdventOfCode2024/UnitTests/UnitTests.vcxproj.filters
deleted file mode 100644
index dc63046..0000000
--- a/AdventOfCode2024/UnitTests/UnitTests.vcxproj.filters
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="UnitTests.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="pch.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="TestContext.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Part1TestContext.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Part2TestContext.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="pch.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="TestContext.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Part1TestContext.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Part2TestContext.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/AdventOfCode2024/UnitTests/pch.cpp b/AdventOfCode2024/UnitTests/pch.cpp
deleted file mode 100644
index 64b7eef..0000000
--- a/AdventOfCode2024/UnitTests/pch.cpp
+++ /dev/null
@@ -1,5 +0,0 @@
-// pch.cpp: source file corresponding to the pre-compiled header
-
-#include "pch.h"
-
-// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.
diff --git a/AdventOfCode2024/UnitTests/pch.h b/AdventOfCode2024/UnitTests/pch.h
deleted file mode 100644
index 9d715b0..0000000
--- a/AdventOfCode2024/UnitTests/pch.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// pch.h: This is a precompiled header file.
-// Files listed below are compiled only once, improving build performance for future builds.
-// This also affects IntelliSense performance, including code completion and many code browsing features.
-// However, files listed here are ALL re-compiled if any one of them is updated between builds.
-// Do not add files here that you will be updating frequently as this negates the performance advantage.
-
-#ifndef PCH_H
-#define PCH_H
-
-// add headers that you want to pre-compile here
-
-#endif //PCH_H
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..0b8e7ae
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,57 @@
+cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
+Include(FetchContent)
+
+set(CMAKE_CXX_STANDARD 23) # latest c++
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+
+# prepare out unit test framework
+FetchContent_Declare(
+  Catch2
+  GIT_REPOSITORY https://github.com/catchorg/Catch2.git
+  GIT_TAG        v3.4.0 # or a later release
+)
+FetchContent_MakeAvailable(Catch2)
+
+# Versioning
+project ("AdventOfCode2024" VERSION 0.0.1 DESCRIPTION "" LANGUAGES CXX)
+# ---
+
+# Grab source files
+file(GLOB_RECURSE AdventOfCode2024Sources
+	"include/*.h"
+	"include/*.hpp"
+	"src/*.c"
+	"src/*.cpp"
+)
+file(GLOB_RECURSE AdventOfCode2024Tests
+	"tests/include/*.h"
+	"tests/include/*.hpp"
+	"tests/src/*.c"
+	"tests/src/*.cpp"
+)
+
+# Project setup
+set(output_target AdventOfCode2024)
+
+# This is split in 2 because catch2 generates its own main() functions
+# and we don't want to recompile everything twice, so we reuse the lib object.
+#            lib
+#          /     \
+# main exe         catch2
+
+# Library to contain logic/code
+add_library(${output_target}-lib ${AdventOfCode2024Sources})
+target_include_directories(${output_target}-lib PUBLIC "include")
+
+# Executable that links to the lib containing the code
+add_executable(${output_target} "AdventOfCode2024.cpp")
+target_link_libraries(${output_target} PRIVATE ${output_target}-lib)
+
+# Catch2 linked with the lib.
+add_executable(${output_target}-tests ${AdventOfCode2024Tests})
+target_include_directories(${output_target}-tests PRIVATE "tests/include")
+target_link_libraries(${output_target}-tests PRIVATE
+	${output_target}-lib
+	Catch2::Catch2WithMain
+)
diff --git a/README.md b/README.md
index a67202d..f5113f2 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 Solver for Advent of Code 2024 puzzles. <https://adventofcode.com/2024/>
 
-This is a single command line application for the puzzles written in [C++17](https://en.cppreference.com/w/cpp/17) with [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) (v143).
+This is a single command line application for the puzzles written in [C++23](https://en.cppreference.com/w/cpp/23) with CMake.
 
 ## Puzzle Input
 
@@ -44,6 +44,10 @@ For this puzzle I added a class for [points in two-dimensional space](AdventOfCo
 
 My implementation uses an ordering matrix (a two-dimensional boolean array) to track which page combinations are ordered, and then queries that matrix for each ordered combination of pages in a single line. The same matrix can then also be used for a custom sort function for part 2.
 
+## Thanks
+
+* [Alexander Brouwer](https://github.com/Bromvlieg) for getting the project set up with CMake.
+
 ## License
 
 Copyright (C) 2024 Stefan Müller
diff --git a/AdventOfCode2024/CeresSearch.h b/include/aoc/CeresSearch.h
similarity index 100%
rename from AdventOfCode2024/CeresSearch.h
rename to include/aoc/CeresSearch.h
diff --git a/AdventOfCode2024/GuardGallivant.h b/include/aoc/GuardGallivant.h
similarity index 100%
rename from AdventOfCode2024/GuardGallivant.h
rename to include/aoc/GuardGallivant.h
diff --git a/AdventOfCode2024/HistorianHysteria.h b/include/aoc/HistorianHysteria.h
similarity index 90%
rename from AdventOfCode2024/HistorianHysteria.h
rename to include/aoc/HistorianHysteria.h
index 218743e..5c17e9a 100644
--- a/AdventOfCode2024/HistorianHysteria.h
+++ b/include/aoc/HistorianHysteria.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -17,10 +17,10 @@
 
 #include <set>
 
-#include "Solver.h"
+#include <aoc/Solver.h>
 
-class HistorianHysteria :
-    public Solver
+class HistorianHysteria
+    : public Solver
 {
 public:
     virtual std::string getPuzzleName() const override;
diff --git a/AdventOfCode2024/LinesSolver.h b/include/aoc/LinesSolver.h
similarity index 100%
rename from AdventOfCode2024/LinesSolver.h
rename to include/aoc/LinesSolver.h
diff --git a/AdventOfCode2024/MullCharState.h b/include/aoc/MullCharState.h
similarity index 90%
rename from AdventOfCode2024/MullCharState.h
rename to include/aoc/MullCharState.h
index 47372e2..9e30ca6 100644
--- a/AdventOfCode2024/MullCharState.h
+++ b/include/aoc/MullCharState.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,10 +15,10 @@
 
 #pragma once
 
-#include "StringState.h"
+#include <aoc/StringState.h>
 
-class MullCharState :
-    public StringState
+class MullCharState
+    : public StringState
 {
 public:
     MullCharState(const char expected);
diff --git a/AdventOfCode2024/MullData.h b/include/aoc/MullData.h
similarity index 96%
rename from AdventOfCode2024/MullData.h
rename to include/aoc/MullData.h
index 0931b0b..4cdad06 100644
--- a/AdventOfCode2024/MullData.h
+++ b/include/aoc/MullData.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
diff --git a/AdventOfCode2024/MullDataState.h b/include/aoc/MullDataState.h
similarity index 85%
rename from AdventOfCode2024/MullDataState.h
rename to include/aoc/MullDataState.h
index 2b014e9..7b6d782 100644
--- a/AdventOfCode2024/MullDataState.h
+++ b/include/aoc/MullDataState.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,11 +15,11 @@
 
 #pragma once
 
-#include "MullData.h"
-#include "StringState.h"
+#include <aoc/MullData.h>
+#include <aoc/StringState.h>
 
-class MullDataState :
-    public StringState
+class MullDataState
+    : public StringState
 {
 public:
     void setData(MullData& data);
diff --git a/AdventOfCode2024/MullDoOpenState.h b/include/aoc/MullDoOpenState.h
similarity index 90%
rename from AdventOfCode2024/MullDoOpenState.h
rename to include/aoc/MullDoOpenState.h
index c07dc33..e4d448b 100644
--- a/AdventOfCode2024/MullDoOpenState.h
+++ b/include/aoc/MullDoOpenState.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,10 +15,10 @@
 
 #pragma once
 
-#include "MullDataState.h"
+#include <aoc/MullDataState.h>
 
-class MullDoOpenState :
-    public MullDataState
+class MullDoOpenState
+    : public MullDataState
 {
 public:
     void enter(StringStateMachine* stateMachine) override {};
diff --git a/AdventOfCode2024/MullEntryState.h b/include/aoc/MullEntryState.h
similarity index 90%
rename from AdventOfCode2024/MullEntryState.h
rename to include/aoc/MullEntryState.h
index 9e505cc..f6382d4 100644
--- a/AdventOfCode2024/MullEntryState.h
+++ b/include/aoc/MullEntryState.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,10 +15,10 @@
 
 #pragma once
 
-#include "StringState.h"
+#include <aoc/StringState.h>
 
-class MullEntryState :
-    public StringState
+class MullEntryState
+    : public StringState
 {
 public:
     void enter(StringStateMachine* stateMachine) override;
diff --git a/AdventOfCode2024/MullFactorState.h b/include/aoc/MullFactorState.h
similarity index 90%
rename from AdventOfCode2024/MullFactorState.h
rename to include/aoc/MullFactorState.h
index e30c9d1..790fb99 100644
--- a/AdventOfCode2024/MullFactorState.h
+++ b/include/aoc/MullFactorState.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,10 +15,10 @@
 
 #pragma once
 
-#include "MullDataState.h"
+#include <aoc/MullDataState.h>
 
-class MullFactorState :
-    public MullDataState
+class MullFactorState
+    : public MullDataState
 {
 public:
     MullFactorState(const char expected, const int index);
diff --git a/AdventOfCode2024/MullItOver.h b/include/aoc/MullItOver.h
similarity index 86%
rename from AdventOfCode2024/MullItOver.h
rename to include/aoc/MullItOver.h
index fff410a..9ef289e 100644
--- a/AdventOfCode2024/MullItOver.h
+++ b/include/aoc/MullItOver.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,12 +15,12 @@
 
 #pragma once
 
-#include "MullData.h"
-#include "MullStates.h"
-#include "Solver.h"
+#include <aoc/MullData.h>
+#include <aoc/MullStates.h>
+#include <aoc/Solver.h>
 
-class MullItOver :
-    public Solver
+class MullItOver
+    : public Solver
 {
 public:
     MullItOver();
diff --git a/AdventOfCode2024/MullStates.h b/include/aoc/MullStates.h
similarity index 86%
rename from AdventOfCode2024/MullStates.h
rename to include/aoc/MullStates.h
index 952ebe1..5c3c26e 100644
--- a/AdventOfCode2024/MullStates.h
+++ b/include/aoc/MullStates.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,11 +15,11 @@
 
 #pragma once
 
-#include "MullCharState.h"
-#include "MullDoOpenState.h"
-#include "MullEntryState.h"
-#include "MullFactorState.h"
-#include "MullToggleCloseState.h"
+#include <aoc/MullCharState.h>
+#include <aoc/MullDoOpenState.h>
+#include <aoc/MullEntryState.h>
+#include <aoc/MullFactorState.h>
+#include <aoc/MullToggleCloseState.h>
 
 class MullStates
 {
diff --git a/AdventOfCode2024/MullToggleCloseState.h b/include/aoc/MullToggleCloseState.h
similarity index 89%
rename from AdventOfCode2024/MullToggleCloseState.h
rename to include/aoc/MullToggleCloseState.h
index 76f0615..401c5b3 100644
--- a/AdventOfCode2024/MullToggleCloseState.h
+++ b/include/aoc/MullToggleCloseState.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,10 +15,10 @@
 
 #pragma once
 
-#include "MullDataState.h"
+#include <aoc/MullDataState.h>
 
-class MullToggleCloseState :
-    public MullDataState
+class MullToggleCloseState
+    : public MullDataState
 {
 public:
     MullToggleCloseState(const bool isEnabler);
diff --git a/AdventOfCode2024/Point2.h b/include/aoc/Point2.h
similarity index 100%
rename from AdventOfCode2024/Point2.h
rename to include/aoc/Point2.h
diff --git a/AdventOfCode2024/PrintQueue.h b/include/aoc/PrintQueue.h
similarity index 100%
rename from AdventOfCode2024/PrintQueue.h
rename to include/aoc/PrintQueue.h
diff --git a/AdventOfCode2024/Program.h b/include/aoc/Program.h
similarity index 95%
rename from AdventOfCode2024/Program.h
rename to include/aoc/Program.h
index 0d969f7..cd3708f 100644
--- a/AdventOfCode2024/Program.h
+++ b/include/aoc/Program.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
diff --git a/AdventOfCode2024/RedNosedReportData.h b/include/aoc/RedNosedReportData.h
similarity index 94%
rename from AdventOfCode2024/RedNosedReportData.h
rename to include/aoc/RedNosedReportData.h
index 1da4240..3a6cffc 100644
--- a/AdventOfCode2024/RedNosedReportData.h
+++ b/include/aoc/RedNosedReportData.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -17,7 +17,7 @@
 
 #include<vector>
 
-#include "Slope.h"
+#include <aoc/Slope.h>
 
 class RedNosedReportData
 {
diff --git a/AdventOfCode2024/RedNosedReports.h b/include/aoc/RedNosedReports.h
similarity index 86%
rename from AdventOfCode2024/RedNosedReports.h
rename to include/aoc/RedNosedReports.h
index 3386c7f..b1f1763 100644
--- a/AdventOfCode2024/RedNosedReports.h
+++ b/include/aoc/RedNosedReports.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,12 +15,12 @@
 
 #pragma once
 
-#include "Slope.h"
-#include "Solver.h"
-#include "RedNosedReportData.h"
+#include <aoc/Slope.h>
+#include <aoc/Solver.h>
+#include <aoc/RedNosedReportData.h>
 
-class RedNosedReports :
-    public Solver
+class RedNosedReports
+    : public Solver
 {
 public:
     std::string getPuzzleName() const override;
diff --git a/AdventOfCode2024/Slope.h b/include/aoc/Slope.h
similarity index 95%
rename from AdventOfCode2024/Slope.h
rename to include/aoc/Slope.h
index 3aef8e4..045a042 100644
--- a/AdventOfCode2024/Slope.h
+++ b/include/aoc/Slope.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
diff --git a/AdventOfCode2024/Solver.h b/include/aoc/Solver.h
similarity index 89%
rename from AdventOfCode2024/Solver.h
rename to include/aoc/Solver.h
index 9e7254c..78dc3d6 100644
--- a/AdventOfCode2024/Solver.h
+++ b/include/aoc/Solver.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -21,10 +21,10 @@ class Solver
 {
 public:
     Solver();
-    virtual ~Solver() {};
+    virtual ~Solver(){};
     virtual std::string getPuzzleName() const = 0;
     virtual std::string getInputFileName() const = 0;
-    virtual void processDataLine(const std::string& line) = 0;
+    virtual void processDataLine(const std::string &line) = 0;
     virtual void finish() = 0;
     long long int getResultPart1() const;
     long long int getResultPart2() const;
diff --git a/AdventOfCode2024/SolverEngine.h b/include/aoc/SolverEngine.h
similarity index 94%
rename from AdventOfCode2024/SolverEngine.h
rename to include/aoc/SolverEngine.h
index b3a1eaf..ffd751b 100644
--- a/AdventOfCode2024/SolverEngine.h
+++ b/include/aoc/SolverEngine.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -20,13 +20,14 @@
 #include <memory>
 #include <vector>
 
-#include "Solver.h"
+#include <aoc/Solver.h>
 
 class SolverEngine
 {
 public:
     SolverEngine(const std::vector<std::string>& inputPaths);
     void run(Solver& solver);
+
 private:
     std::vector<std::string> inputPaths_;
     std::filesystem::path tryGetValidFullInputFilePath(const std::string& inputFileName);
diff --git a/AdventOfCode2024/StringState.h b/include/aoc/StringState.h
similarity index 93%
rename from AdventOfCode2024/StringState.h
rename to include/aoc/StringState.h
index 4c88cd3..2f0c9cc 100644
--- a/AdventOfCode2024/StringState.h
+++ b/include/aoc/StringState.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -17,7 +17,7 @@
 
 #include <vector>
 
-#include "StringStateMachine.h"
+#include <aoc/StringStateMachine.h>
 
 class StringStateMachine;
 
diff --git a/AdventOfCode2024/StringStateMachine.h b/include/aoc/StringStateMachine.h
similarity index 94%
rename from AdventOfCode2024/StringStateMachine.h
rename to include/aoc/StringStateMachine.h
index b3ddfdd..1324fc0 100644
--- a/AdventOfCode2024/StringStateMachine.h
+++ b/include/aoc/StringStateMachine.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -17,7 +17,7 @@
 
 #include <string>
 
-#include "StringState.h"
+#include <aoc/StringState.h>
 
 class StringState;
 
diff --git a/AdventOfCode2024/CeresSearch.cpp b/src/CeresSearch.cpp
similarity index 98%
rename from AdventOfCode2024/CeresSearch.cpp
rename to src/CeresSearch.cpp
index 538dc12..7cbd49d 100644
--- a/AdventOfCode2024/CeresSearch.cpp
+++ b/src/CeresSearch.cpp
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "CeresSearch.h"
+#include <aoc/CeresSearch.h>
 
 std::string CeresSearch::getPuzzleName() const
 {
diff --git a/AdventOfCode2024/GuardGallivant.cpp b/src/GuardGallivant.cpp
similarity index 98%
rename from AdventOfCode2024/GuardGallivant.cpp
rename to src/GuardGallivant.cpp
index 55b3f9c..34115c0 100644
--- a/AdventOfCode2024/GuardGallivant.cpp
+++ b/src/GuardGallivant.cpp
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "GuardGallivant.h"
+#include <aoc/GuardGallivant.h>
 
 std::string GuardGallivant::getPuzzleName() const
 {
diff --git a/AdventOfCode2024/HistorianHysteria.cpp b/src/HistorianHysteria.cpp
similarity index 96%
rename from AdventOfCode2024/HistorianHysteria.cpp
rename to src/HistorianHysteria.cpp
index 774e334..60d1251 100644
--- a/AdventOfCode2024/HistorianHysteria.cpp
+++ b/src/HistorianHysteria.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,7 +15,7 @@
 
 #include <iostream>
 
-#include "HistorianHysteria.h"
+#include <aoc/HistorianHysteria.h>
 
 std::string HistorianHysteria::getPuzzleName() const
 {
diff --git a/AdventOfCode2024/LinesSolver.cpp b/src/LinesSolver.cpp
similarity index 97%
rename from AdventOfCode2024/LinesSolver.cpp
rename to src/LinesSolver.cpp
index 4664b2c..62d2351 100644
--- a/AdventOfCode2024/LinesSolver.cpp
+++ b/src/LinesSolver.cpp
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "LinesSolver.h"
+#include <aoc/LinesSolver.h>
 
 void LinesSolver::processDataLine(const std::string& line)
 {
diff --git a/AdventOfCode2024/MullCharState.cpp b/src/MullCharState.cpp
similarity index 94%
rename from AdventOfCode2024/MullCharState.cpp
rename to src/MullCharState.cpp
index b1fa759..9bc86af 100644
--- a/AdventOfCode2024/MullCharState.cpp
+++ b/src/MullCharState.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "MullCharState.h"
+#include <aoc/MullCharState.h>
 
 MullCharState::MullCharState(const char expected)
     : expected_{ expected }, successState_{}, failState_{} {}
diff --git a/AdventOfCode2024/MullData.cpp b/src/MullData.cpp
similarity index 95%
rename from AdventOfCode2024/MullData.cpp
rename to src/MullData.cpp
index f5ac367..de04f94 100644
--- a/AdventOfCode2024/MullData.cpp
+++ b/src/MullData.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "MullData.h"
+#include <aoc/MullData.h>
 
 MullData::MullData()
     : isEnabled_{ true }, factor1_{ 0 }, factor2_{ 0 }, part1_{ 0 }, part2_{ 0 } {};
diff --git a/AdventOfCode2024/MullDataState.cpp b/src/MullDataState.cpp
similarity index 91%
rename from AdventOfCode2024/MullDataState.cpp
rename to src/MullDataState.cpp
index 57a9ca7..488d789 100644
--- a/AdventOfCode2024/MullDataState.cpp
+++ b/src/MullDataState.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "MullDataState.h"
+#include <aoc/MullDataState.h>
 
 void MullDataState::setData(MullData& data)
 {
diff --git a/AdventOfCode2024/MullDoOpenState.cpp b/src/MullDoOpenState.cpp
similarity index 94%
rename from AdventOfCode2024/MullDoOpenState.cpp
rename to src/MullDoOpenState.cpp
index 048b759..8c12477 100644
--- a/AdventOfCode2024/MullDoOpenState.cpp
+++ b/src/MullDoOpenState.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "MullDoOpenState.h"
+#include <aoc/MullDoOpenState.h>
 
 void MullDoOpenState::next(StringStateMachine* stateMachine)
 {
diff --git a/AdventOfCode2024/MullEntryState.cpp b/src/MullEntryState.cpp
similarity index 94%
rename from AdventOfCode2024/MullEntryState.cpp
rename to src/MullEntryState.cpp
index 5d22315..3d42946 100644
--- a/AdventOfCode2024/MullEntryState.cpp
+++ b/src/MullEntryState.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "MullEntryState.h"
+#include <aoc/MullEntryState.h>
 
 void MullEntryState::enter(StringStateMachine* stateMachine)
 {
diff --git a/AdventOfCode2024/MullFactorState.cpp b/src/MullFactorState.cpp
similarity index 96%
rename from AdventOfCode2024/MullFactorState.cpp
rename to src/MullFactorState.cpp
index 3725049..5d63478 100644
--- a/AdventOfCode2024/MullFactorState.cpp
+++ b/src/MullFactorState.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "MullFactorState.h"
+#include <aoc/MullFactorState.h>
 
 MullFactorState::MullFactorState(const char expected, const int index)
     : expected_{ expected }, index_{ index }, successState_{}, failState_{} {}
diff --git a/AdventOfCode2024/MullItOver.cpp b/src/MullItOver.cpp
similarity index 92%
rename from AdventOfCode2024/MullItOver.cpp
rename to src/MullItOver.cpp
index a269aa8..a71cb83 100644
--- a/AdventOfCode2024/MullItOver.cpp
+++ b/src/MullItOver.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,8 +13,8 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "MullItOver.h"
-#include "StringStateMachine.h"
+#include <aoc/MullItOver.h>
+#include <aoc/StringStateMachine.h>
 
 MullItOver::MullItOver()
     : Solver{}, data_{}, states_ {
diff --git a/AdventOfCode2024/MullStates.cpp b/src/MullStates.cpp
similarity index 96%
rename from AdventOfCode2024/MullStates.cpp
rename to src/MullStates.cpp
index 4d81379..180c09f 100644
--- a/AdventOfCode2024/MullStates.cpp
+++ b/src/MullStates.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "MullStates.h"
+#include <aoc/MullStates.h>
 
 MullStates::MullStates(MullData& data)
 {
diff --git a/AdventOfCode2024/MullToggleCloseState.cpp b/src/MullToggleCloseState.cpp
similarity index 93%
rename from AdventOfCode2024/MullToggleCloseState.cpp
rename to src/MullToggleCloseState.cpp
index 5084c47..404814b 100644
--- a/AdventOfCode2024/MullToggleCloseState.cpp
+++ b/src/MullToggleCloseState.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "MullToggleCloseState.h"
+#include <aoc/MullToggleCloseState.h>
 
 MullToggleCloseState::MullToggleCloseState(const bool isEnabler)
     : isEnabler_{ isEnabler }, successState_{} {}
diff --git a/AdventOfCode2024/Point2.cpp b/src/Point2.cpp
similarity index 98%
rename from AdventOfCode2024/Point2.cpp
rename to src/Point2.cpp
index e632533..a33e0e1 100644
--- a/AdventOfCode2024/Point2.cpp
+++ b/src/Point2.cpp
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "Point2.h"
+#include <aoc/Point2.h>
 
 const Point2 Point2::left{ -1, 0 };
 const Point2 Point2::right{ 1, 0 };
diff --git a/AdventOfCode2024/PrintQueue.cpp b/src/PrintQueue.cpp
similarity index 99%
rename from AdventOfCode2024/PrintQueue.cpp
rename to src/PrintQueue.cpp
index 262fca6..8e6de66 100644
--- a/AdventOfCode2024/PrintQueue.cpp
+++ b/src/PrintQueue.cpp
@@ -17,7 +17,7 @@
 #include <sstream>
 #include <vector>
 
-#include "PrintQueue.h"
+#include <aoc/PrintQueue.h>
 
 PrintQueue::PrintQueue()
     : Solver{}, pageNoMapIndex_{ 0 }, isProcessingOrderingRules_{ true }, orderingRules_{}
diff --git a/AdventOfCode2024/Program.cpp b/src/Program.cpp
similarity index 78%
rename from AdventOfCode2024/Program.cpp
rename to src/Program.cpp
index d0abe52..ec34b34 100644
--- a/AdventOfCode2024/Program.cpp
+++ b/src/Program.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -16,16 +16,16 @@
 #include <iostream>
 #include <memory>
 
-#include "Program.h"
-#include "SolverEngine.h"
+#include <aoc/Program.h>
+#include <aoc/SolverEngine.h>
 
 // Solver implementations in day order.
-#include "HistorianHysteria.h"
-#include "RedNosedReports.h"
-#include "MullItOver.h"
-#include "CeresSearch.h"
-#include "PrintQueue.h"
-#include "GuardGallivant.h"
+#include <aoc/HistorianHysteria.h>
+#include <aoc/RedNosedReports.h>
+#include <aoc/MullItOver.h>
+#include <aoc/CeresSearch.h>
+#include <aoc/PrintQueue.h>
+#include <aoc/GuardGallivant.h>
 
 void Program::run()
 {
@@ -46,5 +46,5 @@ void Program::runSolvers()
 
 std::vector<std::string> Program::getInputPaths() const
 {
-    return std::vector<std::string>{ "data", "../../data" };
+    return std::vector<std::string>{ "data", "../../../data", "../../../../data" };
 }
diff --git a/AdventOfCode2024/RedNosedReports.cpp b/src/RedNosedReports.cpp
similarity index 98%
rename from AdventOfCode2024/RedNosedReports.cpp
rename to src/RedNosedReports.cpp
index 157f082..b71cb08 100644
--- a/AdventOfCode2024/RedNosedReports.cpp
+++ b/src/RedNosedReports.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -17,7 +17,7 @@
 #include <sstream>
 #include <vector>
 
-#include "RedNosedReports.h"
+#include <aoc/RedNosedReports.h>
 
 std::string RedNosedReports::getPuzzleName() const
 {
diff --git a/AdventOfCode2024/Solver.cpp b/src/Solver.cpp
similarity index 93%
rename from AdventOfCode2024/Solver.cpp
rename to src/Solver.cpp
index b788f5e..96f361e 100644
--- a/AdventOfCode2024/Solver.cpp
+++ b/src/Solver.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "Solver.h"
+#include <aoc/Solver.h>
 
 Solver::Solver()
     : part1{ 0 }, part2{ 0 } {}
diff --git a/AdventOfCode2024/SolverEngine.cpp b/src/SolverEngine.cpp
similarity index 97%
rename from AdventOfCode2024/SolverEngine.cpp
rename to src/SolverEngine.cpp
index 72314d8..da30b26 100644
--- a/AdventOfCode2024/SolverEngine.cpp
+++ b/src/SolverEngine.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -16,7 +16,7 @@
 #include <fstream>
 #include <iostream>
 
-#include "SolverEngine.h"
+#include <aoc/SolverEngine.h>
 
 SolverEngine::SolverEngine(const std::vector<std::string>& inputPaths)
     : inputPaths_{ inputPaths } {}
diff --git a/AdventOfCode2024/StringStateMachine.cpp b/src/StringStateMachine.cpp
similarity index 94%
rename from AdventOfCode2024/StringStateMachine.cpp
rename to src/StringStateMachine.cpp
index 4235df4..9db2dee 100644
--- a/AdventOfCode2024/StringStateMachine.cpp
+++ b/src/StringStateMachine.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,7 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "StringStateMachine.h"
+#include <aoc/StringStateMachine.h>
 
 StringStateMachine::StringStateMachine(const std::string& line, StringState& entryState)
 {
diff --git a/AdventOfCode2024/UnitTests/Part1TestContext.h b/tests/include/aocTests/Part1TestContext.h
similarity index 87%
rename from AdventOfCode2024/UnitTests/Part1TestContext.h
rename to tests/include/aocTests/Part1TestContext.h
index a10f634..a3de57e 100644
--- a/AdventOfCode2024/UnitTests/Part1TestContext.h
+++ b/tests/include/aocTests/Part1TestContext.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,10 +15,10 @@
 
 #pragma once
 
-#include "TestContext.h"
+#include <aocTests/TestContext.h>
 
-class Part1TestContext :
-    public TestContext
+class Part1TestContext
+    : public TestContext
 {
 public:
     Part1TestContext(std::vector<std::string> inputPaths);
diff --git a/AdventOfCode2024/UnitTests/Part2TestContext.h b/tests/include/aocTests/Part2TestContext.h
similarity index 87%
rename from AdventOfCode2024/UnitTests/Part2TestContext.h
rename to tests/include/aocTests/Part2TestContext.h
index d157fbe..a7bf364 100644
--- a/AdventOfCode2024/UnitTests/Part2TestContext.h
+++ b/tests/include/aocTests/Part2TestContext.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -15,10 +15,10 @@
 
 #pragma once
 
-#include "TestContext.h"
+#include <aocTests/TestContext.h>
 
-class Part2TestContext :
-    public TestContext
+class Part2TestContext
+    : public TestContext
 {
 public:
     Part2TestContext(std::vector<std::string> inputPaths);
diff --git a/AdventOfCode2024/UnitTests/TestContext.h b/tests/include/aocTests/TestContext.h
similarity index 94%
rename from AdventOfCode2024/UnitTests/TestContext.h
rename to tests/include/aocTests/TestContext.h
index d8255cb..a515dd7 100644
--- a/AdventOfCode2024/UnitTests/TestContext.h
+++ b/tests/include/aocTests/TestContext.h
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -18,7 +18,7 @@
 #include <string>
 #include <vector>
 
-#include <Solver.h>
+#include <aoc/Solver.h>
 
 class TestContext
 {
diff --git a/AdventOfCode2024/UnitTests/Part1TestContext.cpp b/tests/src/Part1TestContext.cpp
similarity index 91%
rename from AdventOfCode2024/UnitTests/Part1TestContext.cpp
rename to tests/src/Part1TestContext.cpp
index 7601f3c..8739144 100644
--- a/AdventOfCode2024/UnitTests/Part1TestContext.cpp
+++ b/tests/src/Part1TestContext.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,8 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "pch.h"
-#include "Part1TestContext.h"
+#include <aocTests/Part1TestContext.h>
 
 Part1TestContext::Part1TestContext(std::vector<std::string> inputPaths)
     : TestContext{ inputPaths } {}
diff --git a/AdventOfCode2024/UnitTests/Part2TestContext.cpp b/tests/src/Part2TestContext.cpp
similarity index 91%
rename from AdventOfCode2024/UnitTests/Part2TestContext.cpp
rename to tests/src/Part2TestContext.cpp
index a3b3b63..455dab4 100644
--- a/AdventOfCode2024/UnitTests/Part2TestContext.cpp
+++ b/tests/src/Part2TestContext.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,8 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "pch.h"
-#include "Part2TestContext.h"
+#include <aocTests/Part2TestContext.h>
 
 Part2TestContext::Part2TestContext(std::vector<std::string> inputPaths)
     : TestContext{ inputPaths } {}
diff --git a/tests/src/TestCases.cpp b/tests/src/TestCases.cpp
new file mode 100644
index 0000000..4debf88
--- /dev/null
+++ b/tests/src/TestCases.cpp
@@ -0,0 +1,70 @@
+// Solutions to the Advent Of Code 2024.
+// Copyright (C) 2024  Stefan Müller
+//
+// This program is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation, either version 3 of the License, or (at your option) any later
+// version.
+//
+// This program is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along with
+// this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#include <aocTests/Part1TestContext.h>
+#include <aocTests/Part2TestContext.h>
+
+#include <aoc/Solver.h>
+#include <aoc/SolverEngine.h>
+#include <aoc/HistorianHysteria.h>
+
+#include <catch2/catch_test_macros.hpp>
+
+#define REQUIRE_MESSAGE(cond, msg) if (!(cond)) { INFO(msg); REQUIRE(cond); }
+
+class HistorianHysteriaTests
+{
+public:
+    Part1TestContext part1TestContext_{ getInputPaths() };
+    Part2TestContext part2TestContext_{ getInputPaths() };
+    Part1TestContext part1ExampleTestContext_{ getExampleInputPaths() };
+    Part2TestContext part2ExampleTestContext_{ getExampleInputPaths() };
+
+    void runTest(Solver &solver, const long long int expected, const TestContext &context)
+    {
+        SolverEngine solverEngine{context.getInputPaths()};
+        solverEngine.run(solver);
+
+        REQUIRE(expected == context.getResult(solver));
+    }
+
+private:
+    std::vector<std::string> getInputPaths() const
+    {
+        return std::vector<std::string>{ "data", "../../../data", "../../../../data" };
+    }
+
+    std::vector<std::string> getExampleInputPaths() const
+    {
+        return std::vector<std::string>{ "data/examples", "../../../data/examples", "../../../../data/examples" };
+    }
+};
+
+TEST_CASE( "[HistorianHysteriaTests]" )
+{
+    HistorianHysteriaTests tests;
+    SECTION( "FullData1" ) {
+        tests.runTest(*std::make_unique<HistorianHysteria>(), 2176849, tests.part1TestContext_);
+    }
+    SECTION( "FullData2" ) {
+        tests.runTest(*std::make_unique<HistorianHysteria>(), 23384288, tests.part2TestContext_);
+    }
+    SECTION( "ExampleData1" ) {
+        tests.runTest(*std::make_unique<HistorianHysteria>(), 11, tests.part1ExampleTestContext_);
+    }
+    SECTION( "ExampleData2" ) {
+        tests.runTest(*std::make_unique<HistorianHysteria>(), 31, tests.part2ExampleTestContext_);
+    }
+}
diff --git a/AdventOfCode2024/UnitTests/TestContext.cpp b/tests/src/TestContext.cpp
similarity index 91%
rename from AdventOfCode2024/UnitTests/TestContext.cpp
rename to tests/src/TestContext.cpp
index 3abd629..0d89ae6 100644
--- a/AdventOfCode2024/UnitTests/TestContext.cpp
+++ b/tests/src/TestContext.cpp
@@ -1,5 +1,5 @@
 // Solutions to the Advent Of Code 2024.
-// Copyright (C) 2024  Stefan M�ller
+// Copyright (C) 2024  Stefan Müller
 //
 // This program is free software: you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free Software
@@ -13,8 +13,7 @@
 // You should have received a copy of the GNU General Public License along with
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include "pch.h"
-#include "TestContext.h"
+#include <aocTests/TestContext.h>
 
 TestContext::TestContext(std::vector<std::string> inputPaths)
     : inputPaths_{ inputPaths } {}