diff --git a/common/cpp/CMakeLists.txt b/common/cpp/CMakeLists.txt
index 1549c800f3fb0c0b0296ce96ea42b6f6725d51e9..9fef72369fe9e54a7a690a3582b413860c83b879 100644
--- a/common/cpp/CMakeLists.txt
+++ b/common/cpp/CMakeLists.txt
@@ -15,6 +15,7 @@ ENDIF(WIN32)
 ################################
 # Library
 ################################
+#add_library(${TARGET_NAME} SHARED STATIC ${SOURCE_FILES})
 add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
 target_include_directories(${TARGET_NAME} PUBLIC include)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/examples/worker/process_folder/CMakeLists.txt b/examples/worker/process_folder/CMakeLists.txt
index 69cf5a904c745a10e2f6dbf79b2f7005a975a6aa..d7719be06f14c67ada8e8a95319f59eeaabd61f2 100644
--- a/examples/worker/process_folder/CMakeLists.txt
+++ b/examples/worker/process_folder/CMakeLists.txt
@@ -5,6 +5,11 @@ set(SOURCE_FILES process_folder.cpp)
 ################################
 # Executable and link
 ################################
+if (CMAKE_BUILD_TYPE STREQUAL "Release")
+set(CMAKE_FIND_STATIC FIRST)
+endif()
 add_executable(${TARGET_NAME} ${SOURCE_FILES})
 target_link_libraries(${TARGET_NAME} common worker-api pthread)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
+#set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-static-libstdc++")
+
diff --git a/examples/worker/process_folder/process_folder.cpp b/examples/worker/process_folder/process_folder.cpp
index b75d18bfcbd95ee2dc5e75e8c7150a3cf5381dfa..6f84a61218c2354af0b04dd130b6168f9e6b463d 100644
--- a/examples/worker/process_folder/process_folder.cpp
+++ b/examples/worker/process_folder/process_folder.cpp
@@ -6,23 +6,27 @@
 #include <chrono>
 #include <iomanip>
 
-
-
 #include "worker/data_broker.h"
 
 using hidra2::WorkerErrorCode;
 using std::chrono::high_resolution_clock;
 
-
-int main(int argc, char* argv[]) {
-
+struct Statistics {
+    std::chrono::milliseconds duration_scan;
+    std::chrono::milliseconds duration_read;
+    int nfiles;
+    double size_gb;
+    double bandwidth;
+};
+std::string ProcessCommandArguments(int argc, char* argv[]){
     if (argc != 2) {
         std::cout << "Usage: " + std::string{argv[0]} +" <path to folder>" << std::endl;
         abort();
     }
+    return argv[1];
+}
 
-    std::string folder{argv[1]};
-
+std::unique_ptr<hidra2::DataBroker> CreateBroker(const std::string& folder){
     hidra2::WorkerErrorCode err;
     auto broker = hidra2::DataBrokerFactory::Create(folder, &err);
     if (err != WorkerErrorCode::OK) {
@@ -30,35 +34,63 @@ int main(int argc, char* argv[]) {
         abort();
     }
 
+    return broker;
+}
+
+void ConnectToBrocker(std::unique_ptr<hidra2::DataBroker>* broker,Statistics* statistics){
+    hidra2::WorkerErrorCode err;
     high_resolution_clock::time_point t1 = high_resolution_clock::now();
-    err = broker->Connect();
+    err = (*broker)->Connect();
     if (err != WorkerErrorCode::OK) {
         std::cout << "Cannot connect to broker" << std::endl;
         abort();
     }
     high_resolution_clock::time_point t2 = high_resolution_clock::now();
-    auto duration_scan = std::chrono::duration_cast<std::chrono::milliseconds>( t2 - t1 ).count();
-
+    statistics->duration_scan = std::chrono::duration_cast<std::chrono::milliseconds>( t2 - t1 );
+}
 
+void ReadAllData(std::unique_ptr<hidra2::DataBroker>* broker,Statistics* statistics){
+    hidra2::WorkerErrorCode err;
     hidra2::FileInfo file_info;
     hidra2::FileData file_data;
+    high_resolution_clock::time_point t1 = high_resolution_clock::now();
 
     int nfiles = 0;
     uint64_t size = 0;
-    while ((err = broker->GetNext(&file_info, &file_data)) == WorkerErrorCode::OK) {
+    while ((err = (*broker)->GetNext(&file_info, &file_data)) == WorkerErrorCode::OK) {
         nfiles++;
         size += file_info.size;
     }
-    high_resolution_clock::time_point t3 = high_resolution_clock::now();
-    auto duration_read = std::chrono::duration_cast<std::chrono::milliseconds>( t3 - t2 ).count();
+    if (err!=WorkerErrorCode::NO_DATA){
+        std::cout << "Read error" << std::endl;
+        abort();
+    }
+
+    high_resolution_clock::time_point t2 = high_resolution_clock::now();
+    statistics->nfiles = nfiles;
+    statistics->size_gb = double(size) / 1024 / 1024 / 1024;
+    statistics->duration_read=std::chrono::duration_cast<std::chrono::milliseconds>( t2 - t1 );
+    statistics->bandwidth = statistics->size_gb/statistics->duration_read.count()*1000;
+}
+
+
+void PrintStatistics(const Statistics& statistics){
+    std::cout << "Processed " << statistics.nfiles << " files" << std::endl;
+    std::cout << "Total size: " << std::setprecision(2) << statistics.size_gb << "GB" << std::endl;
+    std::cout << "Elapsed scan : " << statistics.duration_scan.count() << "ms" << std::endl;
+    std::cout << "Elapsed read : " << statistics.duration_read.count() << "ms" << std::endl;
+    std::cout << "Bandwidth: " << std::setprecision(2) << statistics.bandwidth << "GB/sec" << std::endl;
+}
+
+
+int main(int argc, char* argv[]) {
+    std::string folder = ProcessCommandArguments(argc,argv);
+    auto broker = CreateBroker(folder);
 
-    double size_gb = double(size) / 1024 / 1024 / 1024;
-    double bandwidth = size_gb/duration_read*1000;
-    std::cout << "Processed " << nfiles << " files" << std::endl;
-    std::cout << "Total size: " << std::setprecision(2) << size_gb << "GB" << std::endl;
-    std::cout << "Elapsed scan : " << duration_scan << "ms" << std::endl;
-    std::cout << "Elapsed read : " << duration_read << "ms" << std::endl;
-    std::cout << "Bandwidth: " << std::setprecision(2) << bandwidth << "GB/sec" << std::endl;
+    Statistics statistics;
+    ConnectToBrocker(&broker,&statistics);
+    ReadAllData(&broker,&statistics);
+    PrintStatistics(statistics);
 
     return 0;
 }
diff --git a/worker/api/cpp/CMakeLists.txt b/worker/api/cpp/CMakeLists.txt
index b999d879c9b0dd4a7d8da7d496cd331caf5a157c..bb138ff79884ed7a8e66acc2d3a33eea849b6cda 100644
--- a/worker/api/cpp/CMakeLists.txt
+++ b/worker/api/cpp/CMakeLists.txt
@@ -7,6 +7,8 @@ set(SOURCE_FILES include/worker/data_broker.h src/data_broker.cpp src/folder_dat
 # Library
 ################################
 add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
+#add_library(${TARGET_NAME} SHARED STATIC ${SOURCE_FILES})
+
 target_include_directories(${TARGET_NAME} PUBLIC include)
 target_link_libraries(${TARGET_NAME} common)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)