diff --git a/algo/CMakeLists.txt b/algo/CMakeLists.txt
index a3f98e7075ca28c7c28ef8bc6c4b87121063795f..b7d83336ca0b9830ac92c5ebc693e474bbc23521 100644
--- a/algo/CMakeLists.txt
+++ b/algo/CMakeLists.txt
@@ -1,6 +1,5 @@
 add_subdirectory (data)
-
-
+add_subdirectory (test)
 
 # Create a library libCbmAlgo
 
diff --git a/algo/test/CMakeLists.txt b/algo/test/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..04f7c81c4e90aac3161c342be29e66822fbfe607
--- /dev/null
+++ b/algo/test/CMakeLists.txt
@@ -0,0 +1,73 @@
+Macro(CreateGTestExeAndAddTest _testname _includeDirs _linkDirs _sources _dependencies _testdepend)
+
+  Include_Directories(SYSTEM "${_includeDirs}")
+  Link_Directories(${_linkDirs})
+
+  Add_Executable(${_testname} ${_sources})
+  if(CBM_LOCAL_GTEST)
+    Add_Dependencies(${_testname} GTEST)
+  endif()
+  Target_Link_Libraries(${_testname} ${_dependencies})
+  Gen_Exe_Script(${_testname})
+  string(REPLACE ${PROJECT_SOURCE_DIR}
+         ${PROJECT_BINARY_DIR} new_path ${CMAKE_CURRENT_SOURCE_DIR}
+        )
+  Add_Test(${_testname} ${new_path}/${_testname}.sh)
+  If(NOT ${_testdepend} STREQUAL "")
+    Set_Tests_Properties(${_testname} PROPERTIES DEPENDS ${_testdepend})
+  EndIf()
+EndMacro(CreateGTestExeAndAddTest)
+
+FIND_PACKAGE(Threads REQUIRED)
+
+Set(INCLUDE_DIRECTORIES
+  ${CBMBASE_DIR}
+  ${CBMDATA_DIR}
+  ${CBMDATA_DIR}/base
+  ${CBMDATA_DIR}/global
+  ${CBMDATA_DIR}/sts
+  ${CBMDATA_DIR}/tof
+  ${CBMDATA_DIR}/rich
+  ${CBMDATA_DIR}/much
+  ${CBMDATA_DIR}/psd
+  ${CBMDATA_DIR}/trd
+  ${CMAKE_SOURCE_DIR}/external/ipc/ipc/lib/fles_ipc
+  ${CMAKE_SOURCE_DIR}/algo
+  ${CMAKE_SOURCE_DIR}/algo/trigger
+  ${CMAKE_SOURCE_DIR}/algo/evbuild
+  ${BASE_INCLUDE_DIRECTORIES}
+  ${GTEST_INCLUDE_DIR}
+)
+
+MESSAGE("FAIRROOT_LIBRARY_DIR: ${FAIRROOT_LIBRARY_DIR}")
+Set(LINK_DIRECTORIES
+  ${FAIRROOT_LIBRARY_DIR}
+)
+
+Set(DEPENDENCIES
+  ${GTEST_BOTH_LIBRARIES}
+  ${CMAKE_THREAD_LIBS_INIT}
+  CbmData
+)
+
+if (CMAKE_SYSTEM_NAME MATCHES Linux)
+  set(DEPENDENCIES ${DEPENDENCIES} rt)
+endif()
+
+Set(TimeClusterTriggerSources
+  ${CMAKE_SOURCE_DIR}/algo/trigger/TimeClusterTrigger.cxx
+  _GTestTimeClusterTrigger.cxx 
+)
+
+CreateGTestExeAndAddTest(_GTestTimeClusterTrigger "${INCLUDE_DIRECTORIES}" "${LINK_DIRECTORIES}"
+                         "${TimeClusterTriggerSources}" "${DEPENDENCIES}" "")
+
+Set(EventBuilderSources
+  ${CMAKE_SOURCE_DIR}/algo/evbuild/EventBuilder.cxx
+  _GTestEventBuilder.cxx 
+)
+
+CreateGTestExeAndAddTest(_GTestEventBuilder "${INCLUDE_DIRECTORIES}" "${LINK_DIRECTORIES}"
+                         "${EventBuilderSources}" "${DEPENDENCIES}" "")
+
+
diff --git a/algo/test/_GTestEventBuilder.cxx b/algo/test/_GTestEventBuilder.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..a6a52d53bf952fed372f7b26a2e609fbc87ac08c
--- /dev/null
+++ b/algo/test/_GTestEventBuilder.cxx
@@ -0,0 +1,39 @@
+/* Copyright (C) 2016-2017 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Dominik Smith [committer] */
+
+#include "EventBuilder.h"
+#include "gtest/gtest-spi.h"
+#include "gtest/gtest.h"
+
+TEST(_GTestEventBuilder, CheckEventBuilderAlgorithmSimple)
+{
+  SCOPED_TRACE("CheckEventBuilderAlgorithSimple");
+
+  cbm::algo::EventBuilder evbuild;
+  evbuild.SetTriggerWindow(ECbmModuleId::kSts, -45.0, 45.0);
+
+  CbmDigiTimeslice tsIn;
+  const uint nInput         = 1000;
+  const double inputSpacing = 10.0;
+
+  for (uint i = 0; i < nInput; i++) {
+    tsIn.fData.fSts.fDigis.push_back(CbmStsDigi(268502050, 1, i * inputSpacing, 1.0));
+  }
+
+  std::vector<double> triggerIn;
+  const uint nTrigger         = 99;
+  const double triggerSpacing = 100.0;
+
+  for (uint i = 1; i <= nTrigger; i++) {
+    triggerIn.push_back(i * triggerSpacing);
+  }
+
+  std::vector<CbmDigiEvent> eventsOut = evbuild(tsIn, triggerIn);
+  EXPECT_EQ(eventsOut.size(), nTrigger);
+
+  for (uint i = 0; i < eventsOut.size(); i++) {
+    EXPECT_EQ(eventsOut[i].fData.fSts.fDigis.size(), 9);
+    EXPECT_EQ(eventsOut[i].fTime, triggerIn[i]);
+  }
+}
diff --git a/algo/test/_GTestTimeClusterTrigger.cxx b/algo/test/_GTestTimeClusterTrigger.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..7113b5f4c78042291be0e6226daf94804f89d8e8
--- /dev/null
+++ b/algo/test/_GTestTimeClusterTrigger.cxx
@@ -0,0 +1,33 @@
+/* Copyright (C) 2016-2017 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Dominik Smith [committer] */
+
+#include "TimeClusterTrigger.h"
+
+#include "gtest/gtest-spi.h"
+#include "gtest/gtest.h"
+
+TEST(_GTestTimeClusterTrigger, CheckTriggerAlgorithmSimple)
+{
+  SCOPED_TRACE("CheckTriggerAlgorithSimple");
+
+  cbm::algo::TimeClusterTrigger trigger;
+  std::vector<double> dataIn;
+
+  const uint nInput         = 1000.;
+  const double inputSpacing = 10.0;
+  const double deadTime     = 5.;
+  const double windowSize   = 1000.;
+  const uint nMinNumber     = 100;
+
+  for (uint i = 0; i < nInput; i++) {
+    dataIn.push_back(i * inputSpacing);
+  }
+
+  std::vector<double> dataOut = trigger(dataIn, windowSize, nMinNumber, deadTime);
+  EXPECT_EQ(dataOut.size(), 10);
+
+  for (uint i = 0; i < dataOut.size(); i++) {
+    EXPECT_EQ(dataOut[i], 495. + i * 1000.);
+  }
+}