diff --git a/src/fsfw/version.h b/src/fsfw/version.h
index 47860865..4ed748d1 100644
--- a/src/fsfw/version.h
+++ b/src/fsfw/version.h
@@ -1,7 +1,13 @@
 #ifndef FSFW_SRC_FSFW_VERSION_H_
 #define FSFW_SRC_FSFW_VERSION_H_
 
+#include "fsfw/FSFW.h"
+
+#if FSFW_CPP_OSTREAM_ENABLED == 1
+#include <iostream>
+#endif
 #include <cstdint>
+#include <cstdio>
 
 namespace fsfw {
 
@@ -28,6 +34,28 @@ class Version {
   friend bool operator<=(const Version& v1, const Version& v2) { return ((v1 == v2) or (v1 < v2)); }
 
   friend bool operator>=(const Version& v1, const Version& v2) { return ((v1 == v2) or (v1 > v2)); }
+
+#if FSFW_CPP_OSTREAM_ENABLED == 1
+  /**
+   * Print format to given ostream using format "major.minor.revision"
+   * @param os
+   * @param v
+   * @return
+   */
+  friend std::ostream& operator<<(std::ostream& os, const Version& v) {
+    os << v.major << "." << v.minor << "." << v.revision;
+    return os;
+  }
+#endif
+
+  /**
+   * Get version as format "major.minor.revision"
+   * @param str
+   * @param maxLen
+   */
+  void getVersion(char* str, size_t maxLen) const {
+    snprintf(str, maxLen, "%d.%d.%d", major, minor, revision);
+  }
 };
 
 extern const fsfw::Version FSFW_VERSION;
diff --git a/tests/src/fsfw_tests/unit/CMakeLists.txt b/tests/src/fsfw_tests/unit/CMakeLists.txt
index a83e2f7f..a8d31d88 100644
--- a/tests/src/fsfw_tests/unit/CMakeLists.txt
+++ b/tests/src/fsfw_tests/unit/CMakeLists.txt
@@ -2,14 +2,13 @@ target_sources(${FSFW_TEST_TGT} PRIVATE
     CatchDefinitions.cpp
     CatchFactory.cpp
     printChar.cpp
+    version.cpp
 )
 
-# if(FSFW_CUSTOM_UNITTEST_RUNNER)
-    target_sources(${FSFW_TEST_TGT} PRIVATE
-        CatchRunner.cpp
-        CatchSetup.cpp
-    )
-# endif()
+target_sources(${FSFW_TEST_TGT} PRIVATE
+    CatchRunner.cpp
+    CatchSetup.cpp
+)
 
 add_subdirectory(testcfg)
 add_subdirectory(action)
diff --git a/tests/src/fsfw_tests/unit/version.cpp b/tests/src/fsfw_tests/unit/version.cpp
new file mode 100644
index 00000000..6fcff215
--- /dev/null
+++ b/tests/src/fsfw_tests/unit/version.cpp
@@ -0,0 +1,55 @@
+
+#include "fsfw/version.h"
+
+#include <catch2/catch_test_macros.hpp>
+
+#include "fsfw/serviceinterface.h"
+#include "fsfw_tests/unit/CatchDefinitions.h"
+
+TEST_CASE("Version API Tests", "[TestVersionAPI]") {
+  // Check that major version is non-zero
+  REQUIRE(fsfw::FSFW_VERSION.major > 0);
+  uint32_t fsfwMajor = fsfw::FSFW_VERSION.major;
+  REQUIRE(fsfw::Version(255, 0, 0) > fsfw::FSFW_VERSION);
+  REQUIRE(fsfw::Version(255, 0, 0) >= fsfw::FSFW_VERSION);
+  REQUIRE(fsfw::Version(0, 0, 0) < fsfw::FSFW_VERSION);
+  REQUIRE(fsfw::Version(0, 0, 0) <= fsfw::FSFW_VERSION);
+  fsfw::Version v1 = fsfw::Version(1, 1, 1);
+  fsfw::Version v2 = fsfw::Version(1, 1, 1);
+  v1.revision -= 1;
+  REQUIRE(v1 != v2);
+  REQUIRE(v1 < v2);
+  REQUIRE(v1 <= v2);
+  v1.revision += 1;
+  v1.minor -= 1;
+  REQUIRE(v1 != v2);
+  REQUIRE(v1 < v2);
+  REQUIRE(v1 <= v2);
+  v1.minor += 1;
+  v1.major -= 1;
+  REQUIRE(v1 != v2);
+  REQUIRE(v1 < v2);
+  REQUIRE(v1 <= v2);
+  v1.major += 1;
+  REQUIRE(v1 == v2);
+  v1.major += 1;
+  REQUIRE(v1 != v2);
+  REQUIRE(v1 > v2);
+  REQUIRE(v1 >= v2);
+  v1.major -= 1;
+  v1.minor += 1;
+  REQUIRE(v1 != v2);
+  REQUIRE(v1 > v2);
+  REQUIRE(v1 >= v2);
+  v1.minor -= 1;
+  v1.revision += 1;
+  REQUIRE(v1 != v2);
+  REQUIRE(v1 > v2);
+  REQUIRE(v1 >= v2);
+  v1.revision -= 1;
+  REQUIRE(v1 == v2);
+  sif::info << "v" << fsfw::FSFW_VERSION << std::endl;
+  char verString[10] = {};
+  fsfw::FSFW_VERSION.getVersion(verString, sizeof(verString));
+  sif::info << "v" << verString << std::endl;
+}