diff --git a/.gitignore b/.gitignore
index 0074d8f8226cd2d7070bafd7378cfdb5f7b42600..d7e348cdd97756e6f19f2bc17d3539d9d2fd631f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 *.cflags
 *.config
 *.creator
+*.creator.user
 *.cxxflags
 *.files
 *.includes
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9a5baefac94726e63f772dda0afa8a0752814071..e30905717d049ba21ce436dd1d1910f9edfd0497 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,276 +1,51 @@
-cmake_minimum_required(VERSION 2.8.11)
+cmake_minimum_required(VERSION 3.22)
 
-set(proj_name fazia-ecc)
-set(proj_version 2.0)
-if(${CMAKE_VERSION} VERSION_LESS 3.0)
-   project(${proj_name})
-   set(PROJECT_VERSION ${proj_version})
-   set(${proj_name}_VERSION ${proj_version})
-else()
-   cmake_policy(VERSION 3.0)
-   project(${proj_name} VERSION ${proj_version})
-endif()
-
-set(CMAKE_BUILD_TYPE "RelWithDebInfo")
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
-    ${CMAKE_SOURCE_DIR}/cmake
-    ${CMAKE_SOURCE_DIR}/externals/cmake/AddSubproject
+project(merger-stat
+    VERSION 3.0
+    DESCRIPTION "Utility tha make some useful stats from merged data"
+    LANGUAGES CXX C
     )
 
-include(AddSubproject)
-
-# automatically add paths to external libraries to RPATH of all binaries
-set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
-
-# =============================================================================
-# ------------------------------ Build options --------------------------------
-# =============================================================================
-
-option(USE_TAPIRMQ "use TapirMQ-client to push metadata and logs to InfluxDB" ON)
-
-set(LIBARIES_TO_LINK)
-
-# look for KaliVeda with FAZIA libraries and optionally sqlite
-find_package(KaliVeda 1.10 REQUIRED FAZIA)
-include(${KALIVEDA_USE_FILE})
-list(APPEND LIBRARIES_TO_LINK ${KALIVEDA_LIBRARIES})
-
-# look for ROOT
-find_package(ROOT REQUIRED GuiHtml Thread)
-include(SetUpROOTBuild)
-list(APPEND LIBRARIES_TO_LINK ${ROOT_LIBRARIES})
-
-# look for libcurl
-find_package(CURL REQUIRED)
-if(CURL_FOUND)
-   include_directories(${CURL_INCLUDE_DIRS})
-endif()
+#- set path to our cmake modules
+set(CMAKE_MODULE_PATH
+    ${PROJECT_SOURCE_DIR}/cmake
+    ${PROJECT_SOURCE_DIR}/external/CMakeListsUtilities
+    ${PROJECT_SOURCE_DIR}/external/FindPackageAddDependency
+    ${PROJECT_SOURCE_DIR}/external/FindZeroMQ
+    ${CMAKE_MODULE_PATH}
+    )
 
-# to read GANIL MFM merged frame (INDRA-FAZIA)
-#---sources available from: https://gitlab.in2p3.fr/jdfcode/mfmlib.git
-find_package(mfmlib QUIET)
-if(mfmlib_FOUND)
-   set(HAVE_MFMLIB yes)
-   include_directories(${mfmlib_INCLUDE_DIRS})
-   list(APPEND LIBRARIES_TO_LINK ${mfmlib_LIBRARIES})
-endif(mfmlib_FOUND)
+#-- to handle dependencies on other packages
+include(FindPackageAddDependency)
 
-# to read GANIL Mesytec data
-#---sources available from:  https://gitlab.in2p3.fr/mesytec-ganil/mesytec_data
-find_package(mesytec_data REQUIRED)
-if(mesytec_data_FOUND)
-   set(WITH_MESYTEC yes)
-   include_directories(${mesytec_data_INCLUDE_DIRS})
-   list(APPEND LIBRARIES_TO_LINK ${mesytec_data_LIBRARIES})
+include(GNUPackageInstallDirs)
 
-else()
-   message(STATUS "mesytec_data not found...")
-endif()
+include(StandardRpathHandling)
 
+set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
 
-# look for boost
-find_package(Boost COMPONENTS program_options)
-if(Boost_PROGRAM_OPTIONS_FOUND)
-   set(HAVE_BOOST yes)
-   include_directories(${Boost_INCLUDE_DIRS})
-   list(APPEND LIBRARIES_TO_LINK ${Boost_PROGRAM_OPTIONS_LIBRARY})
+find_package_add_dependency(Protobuf REQUIRED)
+if(Protobuf_FOUND)
+    set(HAVE_PROTOBUF yes)
 endif()
 
-include(GNUInstallDirs)
-set(CMAKE_INSTALL_PKGINCDIR ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
-set(CMAKE_INSTALL_PKGLIBDIR ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME})
-set(CMAKE_INSTALL_PKGCONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
-
-#-------------------------------------------------------------------------------------------
-# Build & install analysis tools (former fazia-oscillo branch)
-# look for protobuf
-find_package(Protobuf)
-if(NOT PROTOBUF_FOUND)
-   # we may need pkg-config to find installation
-   find_package(PkgConfig QUIET)
-
-   if(PkgConfig_FOUND)
-      message(STATUS "Looking for protobuf with pkg-config")
-      ## use pkg-config to get hints for protobuf locations
-      pkg_check_modules(PROTOBUF QUIET protobuf)
-      if(PROTOBUF_FOUND)
-         set(CMAKE_LIBRARY_PATH ${PROTOBUF_LIBRARY_DIRS} ${CMAKE_LIBRARY_PATH})
-         set(PROTOBUF_INCLUDE_DIR ${PROTOBUF_INCLUDE_DIRS})
-         set(Protobuf_INCLUDE_DIR ${PROTOBUF_INCLUDE_DIRS})
-         find_package(Protobuf)
-      endif(PROTOBUF_FOUND)
-   endif(PkgConfig_FOUND)
-endif(NOT PROTOBUF_FOUND)
-if(PROTOBUF_FOUND)
-    # protobuf requires C++11 or higher
-    # check if -std=c++11/4/7 flag already in cxx flags
-    string(FIND ${CMAKE_CXX_FLAGS} "-std=c++11" CPP11_FLAGS)
-    string(FIND ${CMAKE_CXX_FLAGS} "-std=c++14" CPP14_FLAGS)
-    string(FIND ${CMAKE_CXX_FLAGS} "-std=c++17" CPP17_FLAGS)
-    if((CPP11_FLAGS GREATER 0) OR (CPP14_FLAGS GREATER 0) OR (CPP17_FLAGS GREATER 0))
-        # nothing to do, one of flags is already present
-    else()
-       include(CheckCXXCompilerFlag)
-       CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
-       if(COMPILER_SUPPORTS_CXX11)
-           set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-       endif()
-    endif()
-endif(PROTOBUF_FOUND)
-
-add_definitions( -DOSCILLO_DATADIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}" )
-
-# look for ZeroMQ
-find_package(ZMQ)
-if(PROTOBUF_FOUND AND ZMQ_FOUND)
-   set(HAVE_PROTOBUF yes)
-   include_directories(${PROTOBUF_INCLUDE_DIRS})
-   message(STATUS "Protobuf include dir = ${PROTOBUF_INCLUDE_DIRS}")
-   include_directories(${CMAKE_BINARY_DIR}/protobuf)
-
-   set(HAVE_ZMQ_H yes)
-   include_directories(${ZMQ_INCLUDE_DIRS})
-   list(APPEND LIBRARIES_TO_LINK ${ZMQ_LIBRARIES})
-   message(STATUS "ZMQ include dir = ${ZMQ_INCLUDE_DIRS}")
-   message(STATUS "ZMQ library     = ${ZMQ_LIBRARIES}")
-
-   # generate protobuf source from event description
-   set(FAZIA_EVENT_PROTO FzEventSet.proto)
-   add_subdirectory(protobuf)
-   get_property(FAZIA_PROTOBUF_LIB GLOBAL PROPERTY FAZIA_PROTOBUF_LIB)
-   list(APPEND LIBRARIES_TO_LINK ${FAZIA_PROTOBUF_LIB})
-
-endif(PROTOBUF_FOUND AND ZMQ_FOUND)
-
-set(LIBRARY_TARGETS)
-if(USE_TAPIRMQ)
-    list(APPEND LIBRARY_TARGETS tapirmq-client)
-    add_subproject(externals/tapirmq-client
-        PATH_TO_LIBS "$ORIGIN/fazia-ecc:$ORIGIN/../lib/fazia-ecc")
-    message(NOTICE "using TapirMQ-client library")
-endif(USE_TAPIRMQ)
-
-
-# generate config.h
-configure_file(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/fzoscillo-config.h)
-install(FILES ${CMAKE_BINARY_DIR}/fzoscillo-config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
-include_directories(${CMAKE_BINARY_DIR})
-add_definitions( -DHAVE_CONFIG_H )
-
-add_definitions( -DPKGBUILDDIR=${PROJECT_BINARY_DIR} -DPKGDATADIR=${CMAKE_INSTALL_FULL_DATADIR} -DPKGHTMLDIR=${CMAKE_INSTALL_FULL_HTMLDIR} )
-
-list(APPEND LIBRARY_TARGETS fazia-ecc-base)
-add_subdirectory(base)
-include_directories(${CMAKE_SOURCE_DIR}/base)
-list(APPEND LIBRARY_TARGETS fazia-ecc-ecc)
-add_subdirectory(ecc)
-install_subproject_targets()
-
-include_directories(${CMAKE_SOURCE_DIR}/ecc)
-list(APPEND LIBRARY_TARGETS fazia-ecc-mon)
-add_subdirectory(monitoring)
-include_directories(${CMAKE_SOURCE_DIR}/monitoring)
-
-add_subdirectory(merger)
-
-list(APPEND LIBRARIES_TO_LINK ${LIBRARY_TARGETS})
-
-add_subdirectory(execs)
-
-set(doc_DATA README INSTALL README.server README.usersguide COPYING)
-install(FILES ${doc_DATA} DESTINATION ${CMAKE_INSTALL_DOCDIR})
-
-install(DIRECTORY etc/ DESTINATION ${CMAKE_INSTALL_SYSCONFDIR})
-# install PHP scripts for webserver database access
-install(DIRECTORY webserver DESTINATION ${CMAKE_INSTALL_SYSCONFDIR})
-
-include(CreateConfigScript)
-create_config_script()
-
-
-if(PROTOBUF_FOUND AND ZMQ_FOUND)
-
-
-   if(DEFINED ENV{SITE})
-           if($ENV{SITE} STREQUAL "CCIN2P3")	#-at IN2P3 Computing Centre, build with support for xrootd
-                   find_package(XROOTD)
-                   if(XROOTD_FOUND)
-                           list(APPEND LIBRARIES_TO_LINK ${XROOTD_LIBRARIES})
-                   endif()
-           endif()
-   endif()
-
-   # configure subdirectories for different executables
-   add_subdirectory(oscillo)
-   add_subdirectory(viewer)
-   if(HAVE_MFMLIB AND WITH_MESYTEC)
-       add_subdirectory(indra-viewer)
-       add_subdirectory(indra-scaler)
-   endif()
-# - obsolete: do not build
-#   add_subdirectory(converter)
-   add_subdirectory(database)
-   add_subdirectory(replay)
-   add_subdirectory(scaler)
-
-endif(PROTOBUF_FOUND AND ZMQ_FOUND)
-
-include(CheckCXXSymbolExists)
-set(CMAKE_REQUIRED_INCLUDES ${KALIVEDA_INCLUDE_DIR})
-CHECK_CXX_SYMBOL_EXISTS(WITH_RSQLITE KVConfig.h GOT_KVSQLITE)
-
-if(GOT_KVSQLITE)
-   message(STATUS "Got KVSQLITE")
-   add_subdirectory(dbviewer)
-else()
-   message(STATUS "No KVSQLITE: dbviewer directory will not be compiled")
+#-- look for ZeroMQ (not obligatory)
+find_package_add_dependency(ZeroMQ QUIET
+    BEFORE_FIND "set(CMAKE_MODULE_PATH  \${CMAKE_CURRENT_LIST_DIR} \${CMAKE_MODULE_PATH})"
+    )
+if(ZeroMQ_FOUND)
+    set(HAVE_ZMQ_H yes)
+    install(
+        FILES ${PROJECT_SOURCE_DIR}/external/FindZeroMQ/FindZeroMQ.cmake
+        DESTINATION ${CMAKE_INSTALL_PKGCONFIGDIR}
+        )
 endif()
 
+find_package(Boost REQUIRED COMPONENTS program_options)
 
-# set RPATH on all executables in order to find private utility libraries
-# libfazia_protobuf_event.so & libfazia_sound.so which will not be installed in a
-# standard library directory but in $PREFIX/bin/fazia-ecc/
-get_property(EXEC_TARGET_LIST GLOBAL PROPERTY EXEC_TARGET_LIST)
-foreach(exec_target ${EXEC_TARGET_LIST})
-    get_target_property(TARGET_RUNPATH ${exec_target} INSTALL_RPATH)
-    list(APPEND TARGET_RUNPATH ${CMAKE_INSTALL_FULL_BINDIR}/${PROJECT_NAME})
-   set_target_properties(${exec_target} PROPERTIES INSTALL_RPATH "${TARGET_RUNPATH}")
-endforeach()
-
-#install user's guides
-install(DIRECTORY doc/ DESTINATION ${CMAKE_INSTALL_HTMLDIR})
-
-#generate & install class reference doc
-add_custom_target(html
-   make -f ${PROJECT_SOURCE_DIR}/make.html ROOTEXEC=${ROOT_EXECUTABLE} srcdir=${PROJECT_SOURCE_DIR} builddir=${PROJECT_BUILD_DIR}
-   COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_BINARY_DIR}/htmldoc ${CMAKE_INSTALL_FULL_HTMLDIR}
-   WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-   )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+find_package(mfmlib REQUIRED)
 
-find_package(Protobuf REQUIRED)
-PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS MergerInfo.proto)
+find_package(ROOT REQUIRED)
 
-add_executable(merger-spy merger-spy.cpp MergerInfo.pb.cc merger_spy.cpp)
-target_include_directories(merger-spy PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
+add_subdirectory(src)
 
-target_link_libraries(merger-spy ${LIBRARIES_TO_LINK})
-install(TARGETS merger-spy DESTINATION ${CMAKE_INSTALL_BINDIR})
-set_property(GLOBAL APPEND PROPERTY EXEC_TARGET_LIST merger-spy)
diff --git a/MergerInfo.proto b/MergerInfo.proto
deleted file mode 100644
index 35cbbd55c8e90703ad8607dbfc60c2279587afa1..0000000000000000000000000000000000000000
--- a/MergerInfo.proto
+++ /dev/null
@@ -1,53 +0,0 @@
-syntax = "proto3";
-
-package myprotobuf;
-
-option optimize_for = SPEED;
-option cc_generic_services = false;
-
-message log{
-
-  enum log_type{
-  fDebug   = 0;
-  fInfo    = 1;
-  fWarning = 2;
-  fError   = 3;
-  }
-
-log_type type = 1;
-string value=2;
-}
-
-message point{
-double x=1;
-double y=2;
-}
-
-message histogram{
-string name = 1;
-string labelx = 2;
-string labely= 3;
-repeated point points = 4;
-}
-
-message rate{
-string name  = 1;
-double value = 2;
-//repeated point points = 2;
-}
-
-message histogram_frame{
-string name = 1;
-repeated histogram histos = 2;
-}
-
-message rate_frame{
-string name = 1;
-repeated rate rates = 2;
-}
-
-message merger_info{
-repeated histogram_frame histo_frames = 1;
-repeated rate_frame rate_frames = 2;
-repeated log logs = 3;
-}
diff --git a/external/CMakeListsUtilities/.gitrepo b/external/cmake/CMakeListsUtilities/.gitrepo
similarity index 100%
rename from external/CMakeListsUtilities/.gitrepo
rename to external/cmake/CMakeListsUtilities/.gitrepo
diff --git a/external/CMakeListsUtilities/CheckProjectIsTopLevel.cmake b/external/cmake/CMakeListsUtilities/CheckProjectIsTopLevel.cmake
similarity index 100%
rename from external/CMakeListsUtilities/CheckProjectIsTopLevel.cmake
rename to external/cmake/CMakeListsUtilities/CheckProjectIsTopLevel.cmake
diff --git a/external/CMakeListsUtilities/GNUPackageInstallDirs.cmake b/external/cmake/CMakeListsUtilities/GNUPackageInstallDirs.cmake
similarity index 100%
rename from external/CMakeListsUtilities/GNUPackageInstallDirs.cmake
rename to external/cmake/CMakeListsUtilities/GNUPackageInstallDirs.cmake
diff --git a/external/CMakeListsUtilities/InstallConfigPackage.cmake b/external/cmake/CMakeListsUtilities/InstallConfigPackage.cmake
similarity index 100%
rename from external/CMakeListsUtilities/InstallConfigPackage.cmake
rename to external/cmake/CMakeListsUtilities/InstallConfigPackage.cmake
diff --git a/external/CMakeListsUtilities/InstallConfigPackageVersion.cmake b/external/cmake/CMakeListsUtilities/InstallConfigPackageVersion.cmake
similarity index 100%
rename from external/CMakeListsUtilities/InstallConfigPackageVersion.cmake
rename to external/cmake/CMakeListsUtilities/InstallConfigPackageVersion.cmake
diff --git a/external/CMakeListsUtilities/README.md b/external/cmake/CMakeListsUtilities/README.md
similarity index 100%
rename from external/CMakeListsUtilities/README.md
rename to external/cmake/CMakeListsUtilities/README.md
diff --git a/external/CMakeListsUtilities/StandardRpathHandling.cmake b/external/cmake/CMakeListsUtilities/StandardRpathHandling.cmake
similarity index 100%
rename from external/CMakeListsUtilities/StandardRpathHandling.cmake
rename to external/cmake/CMakeListsUtilities/StandardRpathHandling.cmake
diff --git a/external/CMakeListsUtilities/projectConfig.cmake.in b/external/cmake/CMakeListsUtilities/projectConfig.cmake.in
similarity index 100%
rename from external/CMakeListsUtilities/projectConfig.cmake.in
rename to external/cmake/CMakeListsUtilities/projectConfig.cmake.in
diff --git a/external/FindPackageAddDependency/.gitrepo b/external/cmake/FindPackageAddDependency/.gitrepo
similarity index 100%
rename from external/FindPackageAddDependency/.gitrepo
rename to external/cmake/FindPackageAddDependency/.gitrepo
diff --git a/external/FindPackageAddDependency/FindPackageAddDependency.cmake b/external/cmake/FindPackageAddDependency/FindPackageAddDependency.cmake
similarity index 100%
rename from external/FindPackageAddDependency/FindPackageAddDependency.cmake
rename to external/cmake/FindPackageAddDependency/FindPackageAddDependency.cmake
diff --git a/external/FindPackageAddDependency/README.md b/external/cmake/FindPackageAddDependency/README.md
similarity index 100%
rename from external/FindPackageAddDependency/README.md
rename to external/cmake/FindPackageAddDependency/README.md
diff --git a/external/FindZeroMQ/.gitrepo b/external/cmake/FindZeroMQ/.gitrepo
similarity index 100%
rename from external/FindZeroMQ/.gitrepo
rename to external/cmake/FindZeroMQ/.gitrepo
diff --git a/external/FindZeroMQ/FindZeroMQ.cmake b/external/cmake/FindZeroMQ/FindZeroMQ.cmake
similarity index 100%
rename from external/FindZeroMQ/FindZeroMQ.cmake
rename to external/cmake/FindZeroMQ/FindZeroMQ.cmake
diff --git a/external/FindZeroMQ/README.md b/external/cmake/FindZeroMQ/README.md
similarity index 100%
rename from external/FindZeroMQ/README.md
rename to external/cmake/FindZeroMQ/README.md
diff --git a/external/FindZeroMQ/zmq_compat.h b/external/cmake/FindZeroMQ/zmq_compat.h
similarity index 100%
rename from external/FindZeroMQ/zmq_compat.h
rename to external/cmake/FindZeroMQ/zmq_compat.h
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c2de7b989105f0bc99ce37d2176f396226209ccf
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,9 @@
+PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS MergerInfo.proto)
+
+add_executable(merger-stat merger-spy.cpp ${PROTO_SRCS} merger_spy.cpp)
+target_link_libraries(merger-stat PRIVATE ROOT::Hist ROOT::Thread Boost::program_options mfmlib::mfm libzmq protobuf::libprotobuf)
+target_include_directories(merger-stat INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src>)
+
+install(TARGETS merger-stat DESTINATION ${CMAKE_INSTALL_BINDIR})
+
+set_property(GLOBAL APPEND PROPERTY EXEC_TARGET_LIST merger-stat)
diff --git a/merger-spy.cpp b/src/merger-spy.cpp
similarity index 89%
rename from merger-spy.cpp
rename to src/merger-spy.cpp
index d2c982403ce1430b4d3b28e75be6ab6a5e4e6966..c9ede89866092cec585513a46ed4ab609ef03749 100644
--- a/merger-spy.cpp
+++ b/src/merger-spy.cpp
@@ -4,37 +4,15 @@
 
 #include "boost/program_options.hpp"
 
-#include "math.h"
 #include "Riostream.h"
-#include "TMath.h"
-#include "TApplication.h"
-#include "KVEnv.h"
-#include "KVString.h"
-#include "MFMFileReader.h"
-
-#include "KVDataRepositoryManager.h"
-#include "KVDataSetManager.h"
-#include "KVMultiDetArray.h"
-#include "KVINDRADetector.h"
-#include "KVNameValueList.h"
-#include "KVINDRA.h"
-
-#include "TRandom3.h"
 
 #include <iostream>
 #include <fstream>
 #include <string>
 #include <sstream>
 
-#include "zmq.hpp"
-#include "MergerInfo.pb.h"
-
 #include "merger_spy.h"
 
-#include "MFMMergeFrame.h"
-#include "MFMFaziaFrame.h"
-#include "MFMMesytecMDPPFrame.h"
-
 namespace po = boost::program_options;
 using namespace std;
 
diff --git a/merger_spy.cpp b/src/merger_spy.cpp
similarity index 100%
rename from merger_spy.cpp
rename to src/merger_spy.cpp
diff --git a/merger_spy.h b/src/merger_spy.h
similarity index 99%
rename from merger_spy.h
rename to src/merger_spy.h
index 42d981c991b32c59cdc408daeb3527a3eebdee68..8941ca40205b9cc2771b510f57a4ceac02a7474a 100644
--- a/merger_spy.h
+++ b/src/merger_spy.h
@@ -5,7 +5,6 @@
 #define __merger_spy_H
 
 
-#include "KVConfig.h"
 #include "TThread.h"
 #include "TDatime.h"
 #include "TH1F.h"