diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5b9b94a43c0a936f9f596bb14c378e1686adb544..cd8add4cdbe7af205fca28f010ffe3bae2e72504 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,36 +3,42 @@ project(Uebung5)
 
 set(CMAKE_CXX_STANDARD 14)
 
-add_executable(Uebung5 src/main.cpp
-        src/filter2.h
+add_executable(Uebung5
+        src/main.cpp
+        src/filter2.hpp
         src/filter2.cpp
-        src/filter.h
+        src/filter.hpp
         src/filter.cpp
 )
 
-# Fetch Catch2
+# Fetch GoogleTest
 Include(FetchContent)
 FetchContent_Declare(
-        Catch2
-        GIT_REPOSITORY https://github.com/catchorg/Catch2.git
-        GIT_TAG        v3.4.0
+        googletest
+        GIT_REPOSITORY https://github.com/google/googletest.git
+        GIT_TAG        v1.15.2
 )
-FetchContent_MakeAvailable(Catch2)
+set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
+FetchContent_MakeAvailable(googletest)
+
 enable_testing()
 
 add_executable(test_filter2
-        src/filter2.h
+        src/filter2.hpp
         src/filter2.cpp
         src/filter2.test.cpp
 )
 add_executable(test_filter
-        src/filter.h
+        src/filter.hpp
         src/filter.cpp
         src/filter.test.cpp
 )
-target_link_libraries(test_filter2 PRIVATE Catch2::Catch2WithMain)
-target_link_libraries(test_filter PRIVATE Catch2::Catch2WithMain)
+target_link_libraries(test_filter2 PRIVATE GTest::gtest_main)
+target_link_libraries(test_filter PRIVATE GTest::gtest_main)
 target_include_directories(test_filter2 PRIVATE src/)
 target_include_directories(test_filter PRIVATE src/)
-add_test(test_filter2 env CTEST_OUTPUT_ON_FAILURE=1 ./test_filter2)
-add_test(test_filter env CTEST_OUTPUT_ON_FAILURE=1 ./test_filter)
+
+include(GoogleTest)
+gtest_discover_tests(test_filter)
+gtest_discover_tests(test_filter2)
+
diff --git a/src/filter.cpp b/src/filter.cpp
index 300ac6b5952de8f48b7d3a50da3beb4c671ac6c8..82fc9662b899cb87d6bd0921cf7bdff71b98c00d 100644
--- a/src/filter.cpp
+++ b/src/filter.cpp
@@ -1 +1 @@
-#include "filter.h"
+#include "filter.hpp"
diff --git a/src/filter.h b/src/filter.hpp
similarity index 100%
rename from src/filter.h
rename to src/filter.hpp
diff --git a/src/filter.test.cpp b/src/filter.test.cpp
index 65fde6287ef0b4bb9c82afd4f980e26c4ae63857..f1ad18a54b8d2fd2937f5bf3b56b94e322756879 100644
--- a/src/filter.test.cpp
+++ b/src/filter.test.cpp
@@ -1,21 +1,18 @@
-#include "filter.h"
+#include "filter.hpp"
+#include <gtest/gtest.h>
 
-#include <catch2/catch_test_macros.hpp>
-#include <catch2/matchers/catch_matchers_floating_point.hpp>
-
-TEST_CASE("static_gain") {
+TEST(filter, static_gain) {
     Filter filter{0.0, 0.0, 10.0, 0.0, 0.0};
 
     const double us[]{1.0, 2.0, -1.0, 0.0, 5.0};
 
     for (const auto u : us) {
         const double y = filter.step(u);
-
-        CHECK(y == 10.0 * u);
+        EXPECT_EQ(y, 10.0 * u);
     }
 }
 
-TEST_CASE("static_delay_zero_initialized") {
+TEST(filter, static_delay_zero_initialized) {
     Filter filter{0.0, 0.0, 0.0, 0.0, 10.0};
 
     const double us[]{1.0, 2.0, -1.0, 0.0, 5.0, 0.0, 0.0};
@@ -23,12 +20,11 @@ TEST_CASE("static_delay_zero_initialized") {
 
     for (size_t i = 0; i < 7; ++i) {
         const double y = filter.step(us[i]);
-
-        CHECK(y == 10.0 * us_delayed[i]);
+        EXPECT_EQ(y, 10.0 * us_delayed[i]);
     }
 }
 
-TEST_CASE("static_delay_initialized") {
+TEST(filter, static_delay_initialized) {
     Filter filter{0.0, 0.0, 0.0, 0.0, 10.0};
     filter.initialize(10.0);
 
@@ -37,12 +33,11 @@ TEST_CASE("static_delay_initialized") {
 
     for (size_t i = 0; i < 7; ++i) {
         const double y = filter.step(us[i]);
-
-        CHECK(y == 10.0 * us_delayed[i]);
+        EXPECT_NEAR(y, 10.0 * us_delayed[i], 1e-12);
     }
 }
 
-TEST_CASE("zero_initialized") {
+TEST(filter, zero_initialized) {
     const double a1 = 4.0;
     const double a0 = 3.0;
     const double b2 = 2.0;
@@ -56,15 +51,12 @@ TEST_CASE("zero_initialized") {
 
     for (size_t i = 2; i < 7; ++i) {
         const double y = filter.step(us[i]);
-
-        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] +
-                b0 * us[i - 2];
-
-        CHECK_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] + b0 * us[i - 2];
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 }
 
-TEST_CASE("initialized") {
+TEST(filter, initialized) {
     const double a1 = 4.0;
     const double a0 = 3.0;
     const double b2 = 2.0;
@@ -78,22 +70,19 @@ TEST_CASE("initialized") {
     Filter filter{a1, a0, b2, b1, b0};
     const double y0 = filter.initialize(u0);
 
-    REQUIRE(y0 == y0c);
+    EXPECT_EQ(y0, y0c);
 
     const double us[]{u0, u0, 1.0, 2.0, -1.0, 0.0, 5.0};
     double ys[7]{y0c, y0c, 0.0};
 
     for (size_t i = 2; i < 7; ++i) {
         const double y = filter.step(us[i]);
-
-        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] +
-                b0 * us[i - 2];
-
-        CHECK_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] + b0 * us[i - 2];
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 }
 
-TEST_CASE("reinitialized") {
+TEST(filter, reinitialized) {
     const double a1 = 4.0;
     const double a0 = 3.0;
     const double b2 = 2.0;
@@ -107,34 +96,28 @@ TEST_CASE("reinitialized") {
     Filter filter{a1, a0, b2, b1, b0};
     const double y0 = filter.initialize(u0);
 
-    REQUIRE(y0 == y0c);
+    EXPECT_EQ(y0, y0c);
 
     const double us[]{u0, u0, 1.0, 2.0, -1.0, 0.0, 5.0};
     double ys[7]{y0c, y0c, 0.0};
 
     for (size_t i = 2; i < 7; ++i) {
         const double y = filter.step(us[i]);
-
-        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] +
-                b0 * us[i - 2];
-
-        CHECK_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] + b0 * us[i - 2];
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 
     const double y0r = filter.initialize(u0);
-    REQUIRE(y0r == y0c);
+    EXPECT_EQ(y0r, y0c);
 
     for (size_t i = 2; i < 7; ++i) {
         const double y = filter.step(us[i]);
-
-        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] +
-                b0 * us[i - 2];
-
-        CHECK_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] + b0 * us[i - 2];
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 }
 
-TEST_CASE("pt1") {
+TEST(filter, pt1) {
     Filter filter = Filter::From_continuous_first_order(10.0, 0.01);
 
     const double u = 1.0;
@@ -161,12 +144,11 @@ TEST_CASE("pt1") {
 
     for (size_t i = 0; i < N; ++i) {
         const double y = filter.step(u);
-
-        REQUIRE_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 }
 
-TEST_CASE("pt2") {
+TEST(filter, pt2) {
     Filter filter = Filter::From_continuous_second_order(20.0, 100.0, 0.01);
 
     const double u = 1.0;
@@ -193,14 +175,12 @@ TEST_CASE("pt2") {
 
     for (size_t i = 0; i < N; ++i) {
         const double y = filter.step(u);
-
-        REQUIRE_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 }
 
-TEST_CASE("pt1 * pt1") {
+TEST(filter, pt1_times_pt1) {
     Filter pt1 = Filter::From_continuous_first_order(10.0, 0.01);
-
     Filter filter = pt1 * pt1;
 
     const double u = 1.0;
@@ -227,15 +207,13 @@ TEST_CASE("pt1 * pt1") {
 
     for (size_t i = 0; i < N; ++i) {
         const double y = filter.step(u);
-
-        REQUIRE_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-6));
+        EXPECT_NEAR(y, ys[i], 1e-6);
     }
 }
 
-TEST_CASE("pt1 * pt2") {
+TEST(filter, pt1_times_pt2) {
     Filter pt1 = Filter::From_continuous_first_order(10.0, 0.01);
     Filter pt2 = Filter::From_continuous_second_order(40.0, 400.0, 0.01);
-
     Filter filter = pt1 * pt2;
 
     const double u = 1.0;
@@ -263,11 +241,11 @@ TEST_CASE("pt1 * pt2") {
     for (size_t i = 0; i < N; ++i) {
         const double y = filter.step(u);
 
-        REQUIRE_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-6));
+        EXPECT_NEAR(y, ys[i], 1e-6);
     }
 }
 
-TEST_CASE("pt2 * pt2 * pt2") {
+TEST(filter,pt2_three_times) {
     Filter pt2a = Filter::From_continuous_second_order(20.0, 100.0, 0.01);
     Filter pt2b = Filter::From_continuous_second_order(40.0, 400.0, 0.01);
     Filter pt2c = Filter::From_continuous_second_order(5.0, 100.0, 0.01);
@@ -298,7 +276,6 @@ TEST_CASE("pt2 * pt2 * pt2") {
 
     for (size_t i = 0; i < N; ++i) {
         const double y = filter.step(u);
-
-        REQUIRE_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-6));
+        EXPECT_NEAR(y, ys[i], 1e-6);
     }
 }
diff --git a/src/filter2.cpp b/src/filter2.cpp
index fc6c6dc40e7b4162e642b608956505386b7c5402..32010e4a8ca4cc19f336aca57f728184088394ee 100644
--- a/src/filter2.cpp
+++ b/src/filter2.cpp
@@ -1 +1 @@
-#include "filter2.h"
+#include "filter2.hpp"
diff --git a/src/filter2.h b/src/filter2.hpp
similarity index 100%
rename from src/filter2.h
rename to src/filter2.hpp
diff --git a/src/filter2.test.cpp b/src/filter2.test.cpp
index d7480a2eeff4b70b21ccddd24c4d3ff285045e6d..8c95ab2075af687d2b51f5758e922a6cfc8edf7a 100644
--- a/src/filter2.test.cpp
+++ b/src/filter2.test.cpp
@@ -1,9 +1,8 @@
-#include "filter2.h"
+#include "filter2.hpp"
 
-#include <catch2/catch_test_macros.hpp>
-#include <catch2/matchers/catch_matchers_floating_point.hpp>
+#include <gtest/gtest.h>
 
-TEST_CASE("static_gain") {
+TEST(filter2,static_gain) {
     Filter2 filter{0.0, 0.0, 10.0, 0.0, 0.0};
 
     const double us[]{1.0, 2.0, -1.0, 0.0, 5.0};
@@ -11,11 +10,11 @@ TEST_CASE("static_gain") {
     for (const auto u : us) {
         const double y = filter.step(u);
 
-        CHECK(y == 10.0 * u);
+        EXPECT_EQ(y, 10.0 * u);
     }
 }
 
-TEST_CASE("static_delay_zero_initialized") {
+TEST(filter2,static_delay_zero_initialized) {
     Filter2 filter{0.0, 0.0, 0.0, 0.0, 10.0};
 
     const double us[]{1.0, 2.0, -1.0, 0.0, 5.0, 0.0, 0.0};
@@ -24,11 +23,11 @@ TEST_CASE("static_delay_zero_initialized") {
     for (size_t i = 0; i < 7; ++i) {
         const double y = filter.step(us[i]);
 
-        CHECK(y == 10.0 * us_delayed[i]);
+        EXPECT_EQ(y , 10.0 * us_delayed[i]);
     }
 }
 
-TEST_CASE("static_delay_initialized") {
+TEST(filter2,static_delay_initialized) {
     Filter2 filter{0.0, 0.0, 0.0, 0.0, 10.0};
     filter.initialize(10.0);
 
@@ -38,11 +37,11 @@ TEST_CASE("static_delay_initialized") {
     for (size_t i = 0; i < 7; ++i) {
         const double y = filter.step(us[i]);
 
-        CHECK(y == 10.0 * us_delayed[i]);
+        EXPECT_EQ(y , 10.0 * us_delayed[i]);
     }
 }
 
-TEST_CASE("zero_initialized") {
+TEST(filter2,zero_initialized) {
     const double a1 = 4.0;
     const double a0 = 3.0;
     const double b2 = 2.0;
@@ -57,14 +56,13 @@ TEST_CASE("zero_initialized") {
     for (size_t i = 2; i < 7; ++i) {
         const double y = filter.step(us[i]);
 
-        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] +
-                b0 * us[i - 2];
+        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] + b0 * us[i - 2];
 
-        CHECK_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 }
 
-TEST_CASE("initialized") {
+TEST(filter2,initialized) {
     const double a1 = 4.0;
     const double a0 = 3.0;
     const double b2 = 2.0;
@@ -78,7 +76,7 @@ TEST_CASE("initialized") {
     Filter2 filter{a1, a0, b2, b1, b0};
     const double y0 = filter.initialize(u0);
 
-    REQUIRE(y0 == y0c);
+    EXPECT_EQ(y0 , y0c);
 
     const double us[]{u0, u0, 1.0, 2.0, -1.0, 0.0, 5.0};
     double ys[7]{y0c, y0c, 0.0};
@@ -86,14 +84,13 @@ TEST_CASE("initialized") {
     for (size_t i = 2; i < 7; ++i) {
         const double y = filter.step(us[i]);
 
-        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] +
-                b0 * us[i - 2];
+        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] + b0 * us[i - 2];
 
-        CHECK_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 }
 
-TEST_CASE("reinitialized") {
+TEST(filter2,reinitialized) {
     const double a1 = 4.0;
     const double a0 = 3.0;
     const double b2 = 2.0;
@@ -107,7 +104,7 @@ TEST_CASE("reinitialized") {
     Filter2 filter{a1, a0, b2, b1, b0};
     const double y0 = filter.initialize(u0);
 
-    REQUIRE(y0 == y0c);
+    EXPECT_EQ(y0 , y0c);
 
     const double us[]{u0, u0, 1.0, 2.0, -1.0, 0.0, 5.0};
     double ys[7]{y0c, y0c, 0.0};
@@ -115,26 +112,24 @@ TEST_CASE("reinitialized") {
     for (size_t i = 2; i < 7; ++i) {
         const double y = filter.step(us[i]);
 
-        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] +
-                b0 * us[i - 2];
+        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] + b0 * us[i - 2];
 
-        CHECK_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 
     const double y0r = filter.initialize(u0);
-    REQUIRE(y0r == y0c);
+    EXPECT_EQ(y0r , y0c);
 
     for (size_t i = 2; i < 7; ++i) {
         const double y = filter.step(us[i]);
 
-        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] +
-                b0 * us[i - 2];
+        ys[i] = -a1 * ys[i - 1] - a0 * ys[i - 2] + b2 * us[i] + b1 * us[i - 1] + b0 * us[i - 2];
 
-        CHECK_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 }
 
-TEST_CASE("pt1") {
+TEST(filter2,pt1) {
     Filter2 filter = Filter2::From_continuous_first_order(10.0, 0.01);
 
     const double u = 1.0;
@@ -162,11 +157,11 @@ TEST_CASE("pt1") {
     for (size_t i = 0; i < N; ++i) {
         const double y = filter.step(u);
 
-        REQUIRE_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 }
 
-TEST_CASE("pt2") {
+TEST(filter2,pt2) {
     Filter2 filter = Filter2::From_continuous_second_order(20.0, 100.0, 0.01);
 
     const double u = 1.0;
@@ -194,6 +189,6 @@ TEST_CASE("pt2") {
     for (size_t i = 0; i < N; ++i) {
         const double y = filter.step(u);
 
-        REQUIRE_THAT(y, Catch::Matchers::WithinAbs(ys[i], 1e-12));
+        EXPECT_NEAR(y, ys[i], 1e-12);
     }
 }
diff --git a/src/main.cpp b/src/main.cpp
index bcea4799d833f4e00eb978c9758a1e7eaa15fd41..6bd8d28ad82ed7c1a575975dc82f1678821a352d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,6 +1,6 @@
 #include <iostream>
 
-#include "filter2.h"
+#include "filter2.hpp"
 
 int main() {
     Filter2 filter{0.0, 0.0, 0.5, 0.5, 0.0};