diff --git a/.gitignore b/.gitignore
index 1e78577332eab730f22156280545fc4f0484928f..005f5fbce704c564ffd17f71971fd02faa6a99e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -132,3 +132,7 @@ asapo_tools/pkg
 #
 *.rpm
 
+#version files
+
+common/cpp/include/common/version.h
+common/go/src/asapo_common/version/version_lib.go
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 65114f8c551b076b82f027d86194aecb8166e56c..b1159c604495f220217409423392ef2491c4fd8c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,6 +10,7 @@ ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "GNU")
     SET(BUILD_SHARED_LIBS OFF)
 ENDIF(WIN32)
 
+
 #TODO: Better way then GLOBAL PROPERTY
 IF(WIN32)
     find_package(Threads REQUIRED)
@@ -88,3 +89,4 @@ if(BUILD_DOCS)
     include(doxygen)
 endif()
 
+include(prepare_version)
\ No newline at end of file
diff --git a/CMakeModules/prepare_version.cmake b/CMakeModules/prepare_version.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..f0704fcada9cd6576d8e187d6ddb3cd39f852c2a
--- /dev/null
+++ b/CMakeModules/prepare_version.cmake
@@ -0,0 +1,7 @@
+execute_process(COMMAND git describe --tags --dirty OUTPUT_VARIABLE VERSION)
+string(STRIP ${VERSION} VERSION)
+
+string(TIMESTAMP TIMESTAMP "%H:%M:%S %d.%m.%Y UTC" UTC)
+
+configure_file(${PROJECT_SOURCE_DIR}/common/cpp/include/common/version.h.in ${PROJECT_SOURCE_DIR}/common/cpp/include/common/version.h @ONLY)
+configure_file(${PROJECT_SOURCE_DIR}/common/go/src/asapo_common/version/version_lib.go.in ${PROJECT_SOURCE_DIR}/common/go/src/asapo_common/version/version_lib.go @ONLY)
diff --git a/common/cpp/CMakeLists.txt b/common/cpp/CMakeLists.txt
index 6f1350d101ddf101d72672d30c0a3b7ffa0e2f0b..05ba02232fe27e9483cb7b705636d5ab3418f3de 100644
--- a/common/cpp/CMakeLists.txt
+++ b/common/cpp/CMakeLists.txt
@@ -16,7 +16,8 @@ if(BUILD_MONGODB_CLIENTLIB)
 endif()
 
 install(DIRECTORY ${ASAPO_CXX_COMMON_INCLUDE_DIR}/common
-        DESTINATION ${CMAKE_INSTALL_PREFIX}/include )
+        DESTINATION ${CMAKE_INSTALL_PREFIX}/include
+        PATTERN "*.h.in" EXCLUDE)
 
 install(DIRECTORY ${ASAPO_CXX_COMMON_INCLUDE_DIR}/logger
         DESTINATION ${CMAKE_INSTALL_PREFIX}/include )
diff --git a/common/cpp/include/common/version.h.in b/common/cpp/include/common/version.h.in
new file mode 100644
index 0000000000000000000000000000000000000000..15ecfac7b56a8241c3ac215e6c95aa644e8a904b
--- /dev/null
+++ b/common/cpp/include/common/version.h.in
@@ -0,0 +1,17 @@
+#ifndef ASAPO_VERSION_H
+#define ASAPO_VERSION_H
+
+#include <iostream>
+
+namespace asapo {
+
+const char kVersion[] = "@VERSION@";
+
+inline void PrintVersion(std::string prefix) {
+ std::cout << prefix << ", version " << kVersion << std::endl;
+}
+
+}
+
+
+#endif //ASAPO_VERSION_H
diff --git a/common/go/src/asapo_common/version/version.go b/common/go/src/asapo_common/version/version.go
new file mode 100644
index 0000000000000000000000000000000000000000..25a3835dcd90c8bbe48e0f9429299e6b7909434c
--- /dev/null
+++ b/common/go/src/asapo_common/version/version.go
@@ -0,0 +1,23 @@
+package version
+
+import (
+	"flag"
+	"fmt"
+	"io"
+	"os"
+)
+
+var version
+
+func ShowVersion(w io.Writer, name string) bool {
+	flags := flag.NewFlagSet("version", flag.ExitOnError)
+	flag.Bool("version", false, "Print version information") // to have it in main help
+	flVersion := flags.Bool("version", false, "Print version information")
+	flags.Bool("help", false, "Print usage") // define help flag but ignore it
+	flags.Parse(os.Args[1:])
+	if *flVersion {
+		fmt.Fprintf(w, "%s version %s\n", name, version)
+		return true
+	}
+	return false
+}
diff --git a/common/go/src/asapo_common/version/version_lib.go.in b/common/go/src/asapo_common/version/version_lib.go.in
new file mode 100644
index 0000000000000000000000000000000000000000..2dcfeaeeeccfd566d7bbf1bb69bacead466ab5e1
--- /dev/null
+++ b/common/go/src/asapo_common/version/version_lib.go.in
@@ -0,0 +1,7 @@
+package version
+
+// Default build-time variable for library-import.
+// This file is overridden on build with build-time informations.
+func init(){
+	version   = "@VERSION@"
+}
diff --git a/examples/producer/dummy-data-producer/dummy_data_producer.cpp b/examples/producer/dummy-data-producer/dummy_data_producer.cpp
index aec527a91d55bdb13f0d55e3f02b604e891fed3e..c2936de2f232a6060f194e5d1ba2d043a48dc296 100644
--- a/examples/producer/dummy-data-producer/dummy_data_producer.cpp
+++ b/examples/producer/dummy-data-producer/dummy_data_producer.cpp
@@ -35,6 +35,7 @@ void PrintCommandArguments(const Args& args) {
 
 
 void ProcessCommandArguments(int argc, char* argv[], Args* args) {
+    asapo::PrintVersion("Dummy Data Producer");
     if (argc != 8) {
         std::cout <<
                   "Usage: " << argv[0] <<
diff --git a/examples/worker/getnext_broker/getnext_broker.cpp b/examples/worker/getnext_broker/getnext_broker.cpp
index 51484cf7f6b8cff4b4516c21f2d912423fc263bd..0a08959dc2946e03c5621ee1326873aa9d209c99 100644
--- a/examples/worker/getnext_broker/getnext_broker.cpp
+++ b/examples/worker/getnext_broker/getnext_broker.cpp
@@ -79,6 +79,7 @@ int ReadAllData(const Params& params, uint64_t* duration_ms) {
 }
 
 int main(int argc, char* argv[]) {
+    asapo::PrintVersion("GetNext Broker Example");
     if (argc != 6) {
         std::cout << "Usage: " + std::string{argv[0]} +" <server> <run_name> <nthreads> <token> <timeout ms>" << std::endl;
         exit(EXIT_FAILURE);
diff --git a/examples/worker/process_folder/process_folder.cpp b/examples/worker/process_folder/process_folder.cpp
index 2e8f7da92f92f6410573c31c22a0f9787a074b1f..5adb1bc1fa331ad374f0eed169e0ffc4a29b9645 100644
--- a/examples/worker/process_folder/process_folder.cpp
+++ b/examples/worker/process_folder/process_folder.cpp
@@ -8,6 +8,7 @@
 
 #include "asapo_worker.h"
 
+
 using std::chrono::high_resolution_clock;
 using asapo::Error;
 
@@ -83,6 +84,8 @@ void PrintStatistics(const Statistics& statistics) {
 
 
 int main(int argc, char* argv[]) {
+    asapo::PrintVersion("Process Folder Broker Example");
+
     std::string folder = ProcessCommandArguments(argc, argv);
     auto broker = CreateBroker(folder);
 
diff --git a/producer/api/include/asapo_producer.h b/producer/api/include/asapo_producer.h
index 84309f32bc72456d26342c0d50b7798a9a7a46e9..1d9ea25d79275075942ec2ba0184be24d6335691 100644
--- a/producer/api/include/asapo_producer.h
+++ b/producer/api/include/asapo_producer.h
@@ -2,6 +2,8 @@
 #define ASAPO_ASAPO_PRODUCER_H
 
 #include "common/io_error.h"
+#include "common/version.h"
+
 #include "producer/producer.h"
 
 
diff --git a/producer/event_monitor_producer/src/main_eventmon.cpp b/producer/event_monitor_producer/src/main_eventmon.cpp
index 18d23aa95bc38c0a6935f3e3f55804a10c36179e..3e4d677f7d342ac5a6069454d0ccbdb48c5911ad 100644
--- a/producer/event_monitor_producer/src/main_eventmon.cpp
+++ b/producer/event_monitor_producer/src/main_eventmon.cpp
@@ -15,6 +15,7 @@
 #include "preprocessor/definitions.h"
 
 #include "io/io_factory.h"
+#include "common/version.h"
 
 using asapo::Producer;
 using asapo::EventMonConfigFactory;
@@ -73,6 +74,8 @@ void SignalHandler(int signal) {
 
 
 int main (int argc, char* argv[]) {
+    asapo::PrintVersion("ASAPO Event Monitor");
+
     auto err = ReadConfigFile(argc, argv);
     if (err) {
         std::cerr << "cannot read config file: " << err->Explain() << std::endl;
diff --git a/receiver/src/main.cpp b/receiver/src/main.cpp
index f40dc1e2f606b2c2063398f8cdb06ebf0da7006f..c0e6af486dfbb2eac2a37dd60862002a62a403e0 100644
--- a/receiver/src/main.cpp
+++ b/receiver/src/main.cpp
@@ -5,6 +5,7 @@
 #include "receiver_config.h"
 
 #include "receiver_logger.h"
+#include "common/version.h"
 
 asapo::Error ReadConfigFile(int argc, char* argv[]) {
     if (argc != 2) {
@@ -16,6 +17,7 @@ asapo::Error ReadConfigFile(int argc, char* argv[]) {
 }
 
 int main (int argc, char* argv[]) {
+    asapo::PrintVersion("ASAPO Receiver");
 
     auto err = ReadConfigFile(argc, argv);
     const auto& logger = asapo::GetDefaultReceiverLogger();
diff --git a/worker/api/cpp/include/asapo_worker.h b/worker/api/cpp/include/asapo_worker.h
index d07b021b3fa39687022e3a4514613fa31f538636..f00cdaeaf2b2245249a649fbe1e6d125db6e0fbb 100644
--- a/worker/api/cpp/include/asapo_worker.h
+++ b/worker/api/cpp/include/asapo_worker.h
@@ -2,5 +2,6 @@
 #define ASAPO_ASAPO_WORKER_H
 
 #include "worker/data_broker.h"
+#include "common/version.h"
 
 #endif //ASAPO_ASAPO_WORKER_H