You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pe...@apache.org on 2022/03/15 04:56:05 UTC

[celix] 03/03: Improve the modular structure of cmake project, update conanfile accordingly.

This is an automated email from the ASF dual-hosted git repository.

pengzheng pushed a commit to branch feature/conan_support
in repository https://gitbox.apache.org/repos/asf/celix.git

commit fe5dc9ba205e63a17c85bd84cd2883e7737ee97f
Author: PengZheng <ho...@gmail.com>
AuthorDate: Tue Mar 15 12:55:18 2022 +0800

    Improve the modular structure of cmake project, update conanfile accordingly.
    
    Replace the broken automatic dependency deduction in celix_subproject with automatic error detection. Use celix_subproject systematically to reflect the current modular structure, and thus allowing more to be opted out. Essential and non-essential usages are carefully differentiated: e.g., PUBSUB_PSA_WS uses HTTP_ADMIN essentially, while all bundles use log_helper non-essentially. Now it's possible to turn off all bundles.
    
    Minor cmake style improvements, including: replacing add_dependencies with add_celix_bundle_dependencies; use ${CMAKE_INSTALL_INCLUDEDIR} instead of fixed `include`; replacing $<INSTALL_INTERFACE:> with INCLUDES DESTINATION.
    
    conanfile.py is also updated according to the current project structure. The default options reflect a reasonably minimal and functionally stable configuration: framework without etcd, log_admin, http_admin, pubsub_pas_ws with no need of external discovery mechanism, rsa with preconfigured discovery.
---
 CMakeLists.txt                                     |  36 +-
 bundles/cxx_remote_services/CMakeLists.txt         |  13 +-
 .../cxx_remote_services/admin/gtest/CMakeLists.txt |   2 +-
 .../discovery_configured/gtest/CMakeLists.txt      |   2 +-
 .../cxx_remote_services/integration/CMakeLists.txt |  81 +-
 bundles/cxx_remote_services/rsa_spi/CMakeLists.txt |   6 +-
 bundles/deployment_admin/CMakeLists.txt            |  25 +-
 bundles/device_access/CMakeLists.txt               |   4 +-
 bundles/device_access/device_access/CMakeLists.txt |   8 +-
 bundles/device_access/example/CMakeLists.txt       |   2 +-
 bundles/http_admin/CMakeLists.txt                  |   2 +-
 bundles/http_admin/civetweb/CMakeLists.txt         |  10 +-
 bundles/http_admin/http_admin_api/CMakeLists.txt   |   6 +-
 bundles/logging/CMakeLists.txt                     |  19 +-
 bundles/logging/log_admin/gtest/CMakeLists.txt     |   2 +-
 bundles/logging/log_helper/CMakeLists.txt          |  12 +-
 bundles/logging/log_service_api/CMakeLists.txt     |  10 +-
 bundles/logging/log_writers/CMakeLists.txt         |   2 +-
 .../log_writers/syslog_writer/CMakeLists.txt       |   2 +-
 .../log_writers/syslog_writer/gtest/CMakeLists.txt |   3 +-
 bundles/pubsub/CMakeLists.txt                      |  31 +-
 bundles/pubsub/examples/CMakeLists.txt             | 663 +++++++-------
 bundles/pubsub/integration/CMakeLists.txt          | 994 +++++++++++----------
 bundles/pubsub/pubsub_admin_tcp/CMakeLists.txt     |  49 +-
 bundles/pubsub/pubsub_admin_udp_mc/CMakeLists.txt  |  45 +-
 .../pubsub/pubsub_admin_websocket/CMakeLists.txt   |  47 +-
 bundles/pubsub/pubsub_admin_zmq/CMakeLists.txt     |  65 +-
 bundles/pubsub/pubsub_api/CMakeLists.txt           |   7 +-
 bundles/pubsub/pubsub_discovery/CMakeLists.txt     |  41 +-
 .../pubsub_serializer_avrobin/gtest/CMakeLists.txt |   2 +-
 .../pubsub/pubsub_serializer_json/CMakeLists.txt   |   2 +-
 .../pubsub_serializer_json/gtest/CMakeLists.txt    |   2 +-
 bundles/pubsub/pubsub_spi/CMakeLists.txt           |   8 +-
 bundles/pubsub/pubsub_utils/CMakeLists.txt         |   6 +-
 bundles/pubsub/pubsub_utils/gtest/CMakeLists.txt   |   3 +-
 bundles/remote_services/CMakeLists.txt             |  17 +-
 .../deprecated_rsa_spi/CMakeLists.txt              |   6 +-
 .../discovery_configured/CMakeLists.txt            |  43 +-
 .../remote_services/discovery_etcd/CMakeLists.txt  |  57 +-
 .../examples/interceptors/CMakeLists.txt           |   2 +-
 .../remote_service_admin_dfi/CMakeLists.txt        |  66 +-
 .../remote_service_admin_dfi/gtest/CMakeLists.txt  |   8 +-
 .../remote_services_api/CMakeLists.txt             |   6 +-
 .../topology_manager/CMakeLists.txt                |  11 +-
 .../topology_manager/tms_tst/CMakeLists.txt        |   2 +-
 bundles/shell/remote_shell/CMakeLists.txt          |  32 +-
 bundles/shell/shell/CMakeLists.txt                 |  36 +-
 bundles/shell/shell/gtest/CMakeLists.txt           |   4 +-
 bundles/shell/shell_bonjour/CMakeLists.txt         |   6 +-
 bundles/shell/shell_tui/CMakeLists.txt             |   4 +-
 bundles/shell/shell_wui/CMakeLists.txt             |   2 -
 cmake/CelixConfig.cmake                            |  32 +-
 cmake/celix_project/CelixProject.cmake             |  29 +-
 cmake/cmake_celix/BundlePackaging.cmake            |   5 +-
 cmake/cmake_celix/ContainerPackaging.cmake         |   3 +-
 conanfile.py                                       | 111 ++-
 examples/celix-examples/CMakeLists.txt             |   2 +-
 libs/dependency_manager/CMakeLists.txt             |   5 +-
 libs/dfi/CMakeLists.txt                            |   5 +-
 libs/etcdlib/CMakeLists.txt                        | 103 +--
 libs/framework/CMakeLists.txt                      |   8 +-
 libs/launcher/CMakeLists.txt                       |  11 +-
 libs/promises/CMakeLists.txt                       |   6 +-
 libs/pushstreams/CMakeLists.txt                    |   8 +-
 libs/utils/CMakeLists.txt                          |   8 +-
 misc/experimental/CMakeLists.txt                   |   2 +-
 66 files changed, 1452 insertions(+), 1400 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 599ba2c..f9db6bc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -27,6 +27,34 @@ project (Celix C CXX)
 include(cmake/celix_project/CelixProject.cmake)
 include(cmake/cmake_celix/UseCelix.cmake)
 
+#find required packages
+find_package(ZLIB REQUIRED) #framework
+find_package(UUID REQUIRED) #framework
+find_package(CURL REQUIRED) #framework, etcdlib
+find_package(LIBZIP REQUIRED) #framework, etcdlib
+find_package(Jansson REQUIRED) #etcdlib, dfi
+find_package(FFI REQUIRED) #dfi
+
+if (NOT TARGET ZLIB::ZLIB)
+    #Note more recent zlib will create ZLIB::ZLIB target
+    message("Note ZLIB::ZLIB target not created by find_package(ZLIB). Creating ZLIB::ZLIB Target.")
+    add_library(ZLIB::ZLIB SHARED IMPORTED)
+    set_target_properties(ZLIB::ZLIB PROPERTIES
+            IMPORTED_LOCATION "${ZLIB_LIBRARIES}"
+            INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIRS}"
+            )
+endif ()
+
+if (NOT TARGET CURL::libcurl)
+    #Note more recent curl will create CURL::libcurl target
+    message("Note CURL::libcurl target not created by find_package(CURL). Creating CURL::libcurl Target.")
+    add_library(CURL::libcurl SHARED IMPORTED)
+    set_target_properties(CURL::libcurl PROPERTIES
+            IMPORTED_LOCATION "${CURL_LIBRARIES}"
+            INTERFACE_INCLUDE_DIRECTORIES "${CURL_INCLUDE_DIRS}"
+            )
+endif ()
+
 # see https://public.kitware.com/Bug/view.php?id=15696
 IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} EQUAL 3.3 AND ${CMAKE_GENERATOR} STREQUAL "Unix Makefiles")
     message( FATAL_ERROR "Building Celix using CMake 3.3 and makefiles is not supported due to a bug in the Makefile Generator (see Bug 15696). Please change the used CMake version - both, CMake 3.2 and CMake 3.4 are working fine. Or use a different generator (e.g. Ninja)." )
@@ -120,9 +148,11 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug")
 endif()
 
 # Set version for the framework package/release
-set(CELIX_MAJOR "2")
-set(CELIX_MINOR "2")
-set(CELIX_MICRO "1")
+if (NOT DEFINED CELIX_MAJOR)
+    set(CELIX_MAJOR "2")
+    set(CELIX_MINOR "2")
+    set(CELIX_MICRO "1")
+endif ()
 
 # Default bundle version
 set(DEFAULT_VERSION 1.0.0)
diff --git a/bundles/cxx_remote_services/CMakeLists.txt b/bundles/cxx_remote_services/CMakeLists.txt
index 1fde6fd..c083cd3 100644
--- a/bundles/cxx_remote_services/CMakeLists.txt
+++ b/bundles/cxx_remote_services/CMakeLists.txt
@@ -15,21 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 
-celix_subproject(REMOTE_SERVICE_ADMIN "Option to enable building the C++17 Remote Service Admin Service bundles" OFF)
-if (REMOTE_SERVICE_ADMIN AND CELIX_CXX)
+celix_subproject(CXX_REMOTE_SERVICE_ADMIN "Option to enable building the C++17 Remote Service Admin Service bundles" ON)
+if (CXX_REMOTE_SERVICE_ADMIN)
     message(STATUS  "The C++ Remote Service Admin is still experimental; The API, SPI and implementation is not stable and will change")
 
     add_subdirectory(rsa_spi)
     add_subdirectory(admin)
     add_subdirectory(discovery_configured)
-
-    find_package(ZMQ)
-    find_package(CZMQ)
-    if (ZMQ_FOUND AND CZMQ_FOUND)
-        add_subdirectory(integration)
-    else ()
-        message(STATUS "C++ RSA integration test will not be build, because they require zmq and czmq")
-    endif ()
+    add_subdirectory(integration)
 
     #NOTE the topology manager is not yet used. The discovery and RSA need to be refactor for this
     #add_subdirectory(topology_manager)
diff --git a/bundles/cxx_remote_services/admin/gtest/CMakeLists.txt b/bundles/cxx_remote_services/admin/gtest/CMakeLists.txt
index 0fe109d..8664001 100644
--- a/bundles/cxx_remote_services/admin/gtest/CMakeLists.txt
+++ b/bundles/cxx_remote_services/admin/gtest/CMakeLists.txt
@@ -20,7 +20,7 @@ add_executable(test_cxx_remote_service_admin
 )
 target_link_libraries(test_cxx_remote_service_admin PRIVATE Celix::framework GTest::gtest GTest::gtest_main Celix::rsa_spi)
 
-add_dependencies(test_cxx_remote_service_admin RemoteServiceAdmin_bundle)
+add_celix_bundle_dependencies(test_cxx_remote_service_admin RemoteServiceAdmin)
 
 celix_get_bundle_file(RemoteServiceAdmin REMOTE_SERVICE_ADMIN_BUNDLE_LOCATION)
 target_compile_definitions(test_cxx_remote_service_admin PRIVATE REMOTE_SERVICE_ADMIN_BUNDLE_LOCATION="${REMOTE_SERVICE_ADMIN_BUNDLE_LOCATION}")
diff --git a/bundles/cxx_remote_services/discovery_configured/gtest/CMakeLists.txt b/bundles/cxx_remote_services/discovery_configured/gtest/CMakeLists.txt
index 710440b..d4a35f3 100644
--- a/bundles/cxx_remote_services/discovery_configured/gtest/CMakeLists.txt
+++ b/bundles/cxx_remote_services/discovery_configured/gtest/CMakeLists.txt
@@ -21,7 +21,7 @@ add_executable(test_cxx_rsa_configured_discovery
 
 target_link_libraries(test_cxx_rsa_configured_discovery PRIVATE Celix::framework GTest::gtest GTest::gtest_main Celix::rsa_spi RsaConfiguredDiscovery_api)
 
-add_dependencies(test_cxx_rsa_configured_discovery RsaConfiguredDiscovery_bundle)
+add_celix_bundle_dependencies(test_cxx_rsa_configured_discovery RsaConfiguredDiscovery)
 celix_get_bundle_file(RsaConfiguredDiscovery RSA_CONFIGURED_DISCOVERY_BUNDLE_LOCATION)
 target_compile_definitions(test_cxx_rsa_configured_discovery PRIVATE RSA_CONFIGURED_DISCOVERY_BUNDLE_LOCATION="${RSA_CONFIGURED_DISCOVERY_BUNDLE_LOCATION}")
 target_compile_definitions(test_cxx_rsa_configured_discovery PRIVATE RSA_CONFIGURED_DISCOVERY_DISCOVERY_FILE="${CMAKE_CURRENT_SOURCE_DIR}/resources/endpoint_discovery.json")
diff --git a/bundles/cxx_remote_services/integration/CMakeLists.txt b/bundles/cxx_remote_services/integration/CMakeLists.txt
index f896ed6..4b8e97b 100644
--- a/bundles/cxx_remote_services/integration/CMakeLists.txt
+++ b/bundles/cxx_remote_services/integration/CMakeLists.txt
@@ -15,42 +15,46 @@
 # specific language governing permissions and limitations
 # under the License.
 
-add_celix_bundle(TestExportImportRemoteServiceFactory
-        SOURCES src/TestExportImportRemoteServiceFactory.cc
-)
-target_link_libraries(TestExportImportRemoteServiceFactory PRIVATE Celix::rsa_spi Celix::pubsub_api Celix::Promises Celix::PushStreams Celix::log_helper)
-target_include_directories(TestExportImportRemoteServiceFactory PRIVATE include)
-celix_bundle_files(TestExportImportRemoteServiceFactory
-        resources/Calculator$add$Invoke.descriptor
-        resources/Calculator$result$Event.descriptor
-        resources/Calculator$add$Return.descriptor
-        DESTINATION "META-INF/descriptors"
-)
+celix_subproject(CXX_RSA_INTEGRATION "Option to build the C++17 Remote Service Admin Service integration" ON DEPS SHELL SHELL_TUI PUBSUB PROMISES PUSHSTREAMS PUBSUB_PSA_ZMQ PUBSUB_DISCOVERY_ETCD)
+if (CXX_RSA_INTEGRATION)
+    find_package(ZMQ REQUIRED)
+    find_package(CZMQ REQUIRED)
+    add_celix_bundle(TestExportImportRemoteServiceFactory
+            SOURCES src/TestExportImportRemoteServiceFactory.cc
+            )
+    target_link_libraries(TestExportImportRemoteServiceFactory PRIVATE Celix::rsa_spi Celix::pubsub_api Celix::Promises Celix::PushStreams Celix::log_helper)
+    target_include_directories(TestExportImportRemoteServiceFactory PRIVATE include)
+    celix_bundle_files(TestExportImportRemoteServiceFactory
+            resources/Calculator$add$Invoke.descriptor
+            resources/Calculator$result$Event.descriptor
+            resources/Calculator$add$Return.descriptor
+            DESTINATION "META-INF/descriptors"
+            )
 
-add_celix_bundle(CalculatorProvider
-        SOURCES src/CalculatorProvider.cc
-)
-target_link_libraries(CalculatorProvider PRIVATE Celix::Promises Celix::PushStreams)
-target_include_directories(CalculatorProvider PRIVATE include)
+    add_celix_bundle(CalculatorProvider
+            SOURCES src/CalculatorProvider.cc
+            )
+    target_link_libraries(CalculatorProvider PRIVATE Celix::Promises Celix::PushStreams)
+    target_include_directories(CalculatorProvider PRIVATE include)
 
-add_celix_bundle(CalculatorConsumer
-        SOURCES src/CalculatorConsumer.cc
-)
-celix_bundle_files(CalculatorConsumer ${CMAKE_CURRENT_SOURCE_DIR}/resources/endpoint_discovery.json DESTINATION "META-INF/discovery") # add configured discovery as resource in the bundle.
-target_link_libraries(CalculatorConsumer PRIVATE Celix::Promises Celix::PushStreams Celix::shell_api Celix::RsaConfiguredDiscovery_api)
-target_include_directories(CalculatorConsumer PRIVATE include)
+    add_celix_bundle(CalculatorConsumer
+            SOURCES src/CalculatorConsumer.cc
+            )
+    celix_bundle_files(CalculatorConsumer ${CMAKE_CURRENT_SOURCE_DIR}/resources/endpoint_discovery.json DESTINATION "META-INF/discovery") # add configured discovery as resource in the bundle.
+    target_link_libraries(CalculatorConsumer PRIVATE Celix::Promises Celix::PushStreams Celix::shell_api Celix::RsaConfiguredDiscovery_api)
+    target_include_directories(CalculatorConsumer PRIVATE include)
 
-if (ENABLE_TESTING)
-    add_subdirectory(gtest)
-endif()
+    if (ENABLE_TESTING)
+        add_subdirectory(gtest)
+    endif()
 
-################# Integration examples ##################################
+    ################# Integration examples ##################################
 
-add_celix_container(RemoteCalculatorProvider
-        GROUP rsa
-        PROPERTIES
+    add_celix_container(RemoteCalculatorProvider
+            GROUP rsa
+            PROPERTIES
             CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-        BUNDLES
+            BUNDLES
             Celix::ShellCxx
             Celix::shell_tui
 
@@ -66,14 +70,14 @@ add_celix_container(RemoteCalculatorProvider
             TestExportImportRemoteServiceFactory #needed to be able to create a ExportedService for ICalculator
 
             CalculatorProvider
-)
-target_link_libraries(RemoteCalculatorProvider PRIVATE ZMQ::lib CZMQ::lib)
+            )
+    target_link_libraries(RemoteCalculatorProvider PRIVATE ZMQ::lib CZMQ::lib)
 
-add_celix_container(RemoteCalculatorConsumer
-        GROUP rsa
-        PROPERTIES
+    add_celix_container(RemoteCalculatorConsumer
+            GROUP rsa
+            PROPERTIES
             CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-        BUNDLES
+            BUNDLES
             Celix::ShellCxx
             Celix::shell_tui
 
@@ -90,5 +94,6 @@ add_celix_container(RemoteCalculatorConsumer
             TestExportImportRemoteServiceFactory #needed to be able to create a ExportedService for ICalculator
 
             CalculatorConsumer
-)
-target_link_libraries(RemoteCalculatorConsumer PRIVATE ZMQ::lib CZMQ::lib)
+            )
+    target_link_libraries(RemoteCalculatorConsumer PRIVATE ZMQ::lib CZMQ::lib)
+endif()
\ No newline at end of file
diff --git a/bundles/cxx_remote_services/rsa_spi/CMakeLists.txt b/bundles/cxx_remote_services/rsa_spi/CMakeLists.txt
index 968af6d..c56dc6b 100644
--- a/bundles/cxx_remote_services/rsa_spi/CMakeLists.txt
+++ b/bundles/cxx_remote_services/rsa_spi/CMakeLists.txt
@@ -18,11 +18,11 @@
 add_library(rsa_spi INTERFACE)
 target_include_directories(rsa_spi INTERFACE
     $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-    $<INSTALL_INTERFACE:include/celix/rsa>
 )
 
-install(TARGETS rsa_spi EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT rsa)
-install(DIRECTORY include/ DESTINATION include/celix/rsa COMPONENT rsa)
+install(TARGETS rsa_spi EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT rsa
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/rsa)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/rsa COMPONENT rsa)
 
 #Setup target aliases to match external usage
 add_library(Celix::rsa_spi ALIAS rsa_spi)
diff --git a/bundles/deployment_admin/CMakeLists.txt b/bundles/deployment_admin/CMakeLists.txt
index ba7cdec..fde8f2b 100644
--- a/bundles/deployment_admin/CMakeLists.txt
+++ b/bundles/deployment_admin/CMakeLists.txt
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-celix_subproject(DEPLOYMENT_ADMIN "Option to enable building the Deployment Admin Service bundles" ON DEPS framework launcher shell_tui log_writer)
+celix_subproject(DEPLOYMENT_ADMIN "Option to enable building the Deployment Admin Service bundles" ON)
 if (DEPLOYMENT_ADMIN)
     message(WARNING "Celix::deployment_admin is considered unstable, because develop of this bundle has been dormant for a while")
 
@@ -26,7 +26,6 @@ if (DEPLOYMENT_ADMIN)
     add_library(deployment_admin_api INTERFACE)
     target_include_directories(deployment_admin_api INTERFACE 
 	    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
-	    $<INSTALL_INTERFACE:include/celix/deployment_admin>
     )
 
     add_celix_bundle(deployment_admin
@@ -49,20 +48,22 @@ if (DEPLOYMENT_ADMIN)
     target_compile_definitions(deployment_admin PRIVATE -DUSE_FILE32API)
     target_link_libraries(deployment_admin PRIVATE CURL::libcurl UUID::lib ZLIB::ZLIB deployment_admin_api)
 
-    install(TARGETS deployment_admin_api EXPORT celix COMPONENT deployment_admin)
-    install(DIRECTORY api/ DESTINATION include/celix/deployment_admin COMPONENT deployment_admin)
+    install(TARGETS deployment_admin_api EXPORT celix COMPONENT deployment_admin
+            INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/deployment_admin)
+    install(DIRECTORY api/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/deployment_admin COMPONENT deployment_admin)
     install_celix_bundle(deployment_admin EXPORT celix COMPONENT deployment_admin)
 
     #Setup target aliases to match external usage
     add_library(Celix::deployment_admin_api ALIAS deployment_admin_api)
     add_library(Celix::deployment_admin ALIAS deployment_admin)
 
-    add_celix_container(deployment-admin
-        BUNDLES Celix::deployment_admin Celix::shell Celix::shell_tui Celix::log_admin
-        PROPERTIES
-    		"deployment_admin_url=http://localhost:8080"
-    		"deployment_admin_identification=celix"
-    		"org.osgi.framework.storage.clean=onFirstInit"
-    )
-
+    if (BUILD_SHELL AND BUILD_SHELL_TUI AND BUILD_LOG_SERVICE)
+        add_celix_container(deployment-admin
+                BUNDLES Celix::deployment_admin Celix::shell Celix::shell_tui Celix::log_admin
+                PROPERTIES
+                "deployment_admin_url=http://localhost:8080"
+                "deployment_admin_identification=celix"
+                "org.osgi.framework.storage.clean=onFirstInit"
+                )
+    endif ()
 endif (DEPLOYMENT_ADMIN)
diff --git a/bundles/device_access/CMakeLists.txt b/bundles/device_access/CMakeLists.txt
index ee22363..aafa768 100644
--- a/bundles/device_access/CMakeLists.txt
+++ b/bundles/device_access/CMakeLists.txt
@@ -15,11 +15,11 @@
 # specific language governing permissions and limitations
 # under the License.
 
-celix_subproject(DEVICE_ACCESS "Option to enable building the Device Access Service bundles" ON DEPS LAUNCHER LOG_SERVICE SHELL shell_tui)
+celix_subproject(DEVICE_ACCESS "Option to enable building the Device Access Service bundles" ON)
 if(DEVICE_ACCESS)
     message(WARNING "DEVICE_ACCESS is considered unstable, because develop of these bundles has been dormant for a while")
 
     add_subdirectory(device_access)
-    add_subdirectory(driver_locator)   
+    add_subdirectory(driver_locator)
     add_subdirectory(example)
 endif(DEVICE_ACCESS)
diff --git a/bundles/device_access/device_access/CMakeLists.txt b/bundles/device_access/device_access/CMakeLists.txt
index b3e6686..abf9881 100644
--- a/bundles/device_access/device_access/CMakeLists.txt
+++ b/bundles/device_access/device_access/CMakeLists.txt
@@ -17,9 +17,8 @@
 
 
 add_library(device_access_api INTERFACE)
-target_include_directories(device_access_api INTERFACE 
+target_include_directories(device_access_api INTERFACE
     $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-    $<INSTALL_INTERFACE:include/celix/device_access>
 )
 
 add_celix_bundle(device_manager
@@ -39,8 +38,9 @@ target_link_libraries(device_manager PRIVATE Celix::log_helper)
 target_include_directories(device_manager PRIVATE src)
 target_link_libraries(device_manager PRIVATE device_access_api)
 
-install(TARGETS device_access_api EXPORT celix COMPONENT device_access)
-install(DIRECTORY include/ DESTINATION include/celix/device_access COMPONENT device_access)
+install(TARGETS device_access_api EXPORT celix COMPONENT device_access
+		INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/device_access)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/device_access COMPONENT device_access)
 install_celix_bundle(device_manager EXPORT celix COMPONENT device_access)
 
 #Setup target aliases to match external usage
diff --git a/bundles/device_access/example/CMakeLists.txt b/bundles/device_access/example/CMakeLists.txt
index ea8974b..d1acdbe 100644
--- a/bundles/device_access/example/CMakeLists.txt
+++ b/bundles/device_access/example/CMakeLists.txt
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-celix_subproject(DEVICE_ACCESS_EXAMPLE "Option to enable building the Device Access example bundles" OFF DEPS LAUNCHER LOG_SERVICE shell_pt shell_tui)
+celix_subproject(DEVICE_ACCESS_EXAMPLE "Option to enable building the Device Access example bundles" OFF DEPS SHELL SHELL_TUI)
 if(DEVICE_ACCESS_EXAMPLE)
 	add_subdirectory(base_driver)
 	add_subdirectory(consuming_driver)
diff --git a/bundles/http_admin/CMakeLists.txt b/bundles/http_admin/CMakeLists.txt
index a0c7b0d..d7720d4 100644
--- a/bundles/http_admin/CMakeLists.txt
+++ b/bundles/http_admin/CMakeLists.txt
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-celix_subproject(HTTP_ADMIN "Service to use a HTTP server with websocket support" ON DEPS UTILS)
+celix_subproject(HTTP_ADMIN "Service to use a HTTP server with websocket support" ON)
 if (HTTP_ADMIN)
 
     add_subdirectory(http_admin_api)
diff --git a/bundles/http_admin/civetweb/CMakeLists.txt b/bundles/http_admin/civetweb/CMakeLists.txt
index ff2e5fd..c6ef078 100644
--- a/bundles/http_admin/civetweb/CMakeLists.txt
+++ b/bundles/http_admin/civetweb/CMakeLists.txt
@@ -15,7 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-find_package(CURL REQUIRED)
 
 #Create shared library
 add_library(civetweb_shared SHARED
@@ -23,9 +22,7 @@ add_library(civetweb_shared SHARED
         )
 target_include_directories(civetweb_shared PUBLIC
         $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-        $<INSTALL_INTERFACE:include/celix/http_admin>
         )
-target_link_libraries(civetweb_shared PUBLIC CURL::libcurl)
 add_library(Celix::civetweb_shared ALIAS civetweb_shared)
 
 #Create static library
@@ -35,13 +32,12 @@ add_library(civetweb_static STATIC
 
 target_include_directories(civetweb_static PUBLIC
         $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-        $<INSTALL_INTERFACE:include/celix/http_admin>
 )
-target_link_libraries(civetweb_static PUBLIC CURL::libcurl)
 
 target_compile_options(civetweb_shared PRIVATE -w -DUSE_WEBSOCKET)
 target_compile_options(civetweb_static PRIVATE -w -DUSE_WEBSOCKET)
 
-install(TARGETS civetweb_shared EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT http_admin)
-install(DIRECTORY include/ DESTINATION include/celix/http_admin)
+install(TARGETS civetweb_shared civetweb_static EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT http_admin
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/http_admin)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/http_admin)
 
diff --git a/bundles/http_admin/http_admin_api/CMakeLists.txt b/bundles/http_admin/http_admin_api/CMakeLists.txt
index 0a9b367..567a0d8 100644
--- a/bundles/http_admin/http_admin_api/CMakeLists.txt
+++ b/bundles/http_admin/http_admin_api/CMakeLists.txt
@@ -20,13 +20,13 @@ add_library(http_admin_api INTERFACE)
 
 target_include_directories(http_admin_api INTERFACE
     $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-    $<INSTALL_INTERFACE:include/celix/http_admin>
 )
 target_link_libraries(http_admin_api INTERFACE civetweb_shared)
 
 #install api
-install(TARGETS http_admin_api EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT http_admin)
-install(DIRECTORY include/ DESTINATION include/celix/http_admin COMPONENT http_admin)
+install(TARGETS http_admin_api EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT http_admin
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/http_admin)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/http_admin COMPONENT http_admin)
 
 #Setup target aliases to match external usage
 add_library(Celix::http_admin_api ALIAS http_admin_api)
diff --git a/bundles/logging/CMakeLists.txt b/bundles/logging/CMakeLists.txt
index afcdbaa..1d3604b 100644
--- a/bundles/logging/CMakeLists.txt
+++ b/bundles/logging/CMakeLists.txt
@@ -17,14 +17,17 @@
 
 
 add_subdirectory(log_service_api)
+add_subdirectory(log_helper)
 
-#Version 2 API (deprecated)
-if (CELIX_INSTALL_DEPRECATED_API)
-    add_subdirectory(log_service_v2)
-endif ()
+celix_subproject(LOG_SERVICE "Option to enable building the Log Service bundles" ON)
+if (LOG_SERVICE)
+    #Version 2 API (deprecated)
+    if (CELIX_INSTALL_DEPRECATED_API)
+        add_subdirectory(log_service_v2)
+    endif ()
 
-#Version 3 API
-add_subdirectory(log_helper)
-add_subdirectory(log_admin)
-add_subdirectory(log_writers)
+    #Version 3 API
+    add_subdirectory(log_admin)
+    add_subdirectory(log_writers)
+endif ()
 
diff --git a/bundles/logging/log_admin/gtest/CMakeLists.txt b/bundles/logging/log_admin/gtest/CMakeLists.txt
index 9f7c795..d8d407d 100644
--- a/bundles/logging/log_admin/gtest/CMakeLists.txt
+++ b/bundles/logging/log_admin/gtest/CMakeLists.txt
@@ -21,7 +21,7 @@ add_executable(test_log_admin
 )
 target_link_libraries(test_log_admin PRIVATE Celix::log_service_api Celix::shell_api GTest::gtest GTest::gtest_main)
 
-add_dependencies(test_log_admin log_admin_bundle)
+add_celix_bundle_dependencies(test_log_admin Celix::log_admin)
 target_compile_definitions(test_log_admin PRIVATE -DLOG_ADMIN_BUNDLE=\"$<TARGET_PROPERTY:log_admin,BUNDLE_FILE>\")
 
 
diff --git a/bundles/logging/log_helper/CMakeLists.txt b/bundles/logging/log_helper/CMakeLists.txt
index 6e60f8d..9eab168 100644
--- a/bundles/logging/log_helper/CMakeLists.txt
+++ b/bundles/logging/log_helper/CMakeLists.txt
@@ -25,20 +25,20 @@ add_library(log_helper STATIC ${SOURCES})
 set_target_properties(log_helper PROPERTIES OUTPUT_NAME "celix_log_utils")
 target_include_directories(log_helper PUBLIC
 	$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-	$<INSTALL_INTERFACE:include/celix/log_helper>
 )
-target_link_libraries(log_helper PUBLIC Celix::utils Celix::log_service_api)
-install(TARGETS log_helper EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT logging)
-install(DIRECTORY include/ DESTINATION include/celix/log_helper COMPONENT logging)
+target_link_libraries(log_helper PUBLIC Celix::log_service_api Celix::framework PRIVATE Celix::utils)
 
 if (CELIX_INSTALL_DEPRECATED_API)
 	target_include_directories(log_helper PUBLIC
 		$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include_v1>
-		$<INSTALL_INTERFACE:include/celix/log_helper>
 	)
-	install(DIRECTORY include_v1/ DESTINATION include/celix/log_helper)
+	install(DIRECTORY include_v1/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/log_helper)
 endif ()
 
+install(TARGETS log_helper EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT logging
+		INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/log_helper)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/log_helper COMPONENT logging)
+
 add_library(Celix::log_helper ALIAS log_helper)
 
 if (ENABLE_TESTING)
diff --git a/bundles/logging/log_service_api/CMakeLists.txt b/bundles/logging/log_service_api/CMakeLists.txt
index 772115b..c1828ef 100644
--- a/bundles/logging/log_service_api/CMakeLists.txt
+++ b/bundles/logging/log_service_api/CMakeLists.txt
@@ -18,18 +18,18 @@
 add_library(log_service_api INTERFACE)
 target_include_directories(log_service_api INTERFACE
 	$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-	$<INSTALL_INTERFACE:include/celix/log_service>
 )
 target_link_libraries(log_service_api INTERFACE Celix::utils Celix::framework)
-install(TARGETS log_service_api EXPORT celix)
-install(DIRECTORY include/ DESTINATION include/celix/log_service)
 
 if (CELIX_INSTALL_DEPRECATED_API)
 	target_include_directories(log_service_api INTERFACE
 		$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include_v2>
-		$<INSTALL_INTERFACE:include/celix/log_service>
 	)
-	install(DIRECTORY include_v2/ DESTINATION include/celix/log_service)
+	install(DIRECTORY include_v2/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/log_service)
 endif ()
 
+install(TARGETS log_service_api EXPORT celix
+		INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/log_service)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/log_service)
+
 add_library(Celix::log_service_api ALIAS log_service_api)
diff --git a/bundles/logging/log_writers/CMakeLists.txt b/bundles/logging/log_writers/CMakeLists.txt
index 68062ca..31a6119 100644
--- a/bundles/logging/log_writers/CMakeLists.txt
+++ b/bundles/logging/log_writers/CMakeLists.txt
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-celix_subproject(SYSLOG_WRITER "Option to enable building the SysLog Writer bundle" ON DEPS FRAMEWORK)
+celix_subproject(SYSLOG_WRITER "Option to enable building the SysLog Writer bundle" ON)
 if (SYSLOG_WRITER)
     add_subdirectory(syslog_writer)
 endif ()
diff --git a/bundles/logging/log_writers/syslog_writer/CMakeLists.txt b/bundles/logging/log_writers/syslog_writer/CMakeLists.txt
index e0678dd..63e1174 100644
--- a/bundles/logging/log_writers/syslog_writer/CMakeLists.txt
+++ b/bundles/logging/log_writers/syslog_writer/CMakeLists.txt
@@ -24,7 +24,7 @@ add_celix_bundle(syslog_writer
 		SOURCES
 		src/celix_syslog_writer_activator.c
 )
-target_link_libraries(syslog_writer PRIVATE Celix::log_helper)
+target_link_libraries(syslog_writer PRIVATE Celix::log_helper Celix::log_service_api)
 install_celix_bundle(syslog_writer EXPORT celix COMPONENT logging)
 
 #Setup target aliases to match external usage
diff --git a/bundles/logging/log_writers/syslog_writer/gtest/CMakeLists.txt b/bundles/logging/log_writers/syslog_writer/gtest/CMakeLists.txt
index 1e87228..f9df777 100644
--- a/bundles/logging/log_writers/syslog_writer/gtest/CMakeLists.txt
+++ b/bundles/logging/log_writers/syslog_writer/gtest/CMakeLists.txt
@@ -20,8 +20,7 @@ add_executable(test_syslog_writer
         src/SyslogWriterTestSuite.cc
 )
 target_link_libraries(test_syslog_writer PRIVATE Celix::log_helper GTest::gtest GTest::gtest_main)
-
-add_dependencies(test_syslog_writer log_admin_bundle syslog_writer_bundle)
+add_celix_bundle_dependencies(test_syslog_writer Celix::log_admin Celix::syslog_writer)
 target_compile_definitions(test_syslog_writer PRIVATE -DLOG_ADMIN_BUNDLE=\"$<TARGET_PROPERTY:log_admin,BUNDLE_FILE>\")
 target_compile_definitions(test_syslog_writer PRIVATE -DSYSLOG_WRITER_BUNDLE=\"$<TARGET_PROPERTY:syslog_writer,BUNDLE_FILE>\")
 
diff --git a/bundles/pubsub/CMakeLists.txt b/bundles/pubsub/CMakeLists.txt
index 39275c5..bf8fe5f 100644
--- a/bundles/pubsub/CMakeLists.txt
+++ b/bundles/pubsub/CMakeLists.txt
@@ -15,44 +15,23 @@
 # specific language governing permissions and limitations
 # under the License.
 
-celix_subproject(PUBSUB "Option to build the pubsub bundles" ON DEPS FRAMEWORK)
+celix_subproject(PUBSUB "Option to build the pubsub bundles" ON)
 if (PUBSUB)
-
-    option(BUILD_PUBSUB_PSA_ZMQ "Build ZeroMQ PubSub Admin (LGPL License)" ON)
-    if (BUILD_PUBSUB_PSA_ZMQ)
-        option(BUILD_ZMQ_SECURITY "Build with security for ZeroMQ." OFF)
-        add_subdirectory(pubsub_admin_zmq)
-    endif (BUILD_PUBSUB_PSA_ZMQ)
-
-    option(BUILD_PUBSUB_PSA_TCP "Build TCP PubSub Admin" ON)
-    if (BUILD_PUBSUB_PSA_TCP)
-        add_subdirectory(pubsub_admin_tcp)
-    endif (BUILD_PUBSUB_PSA_TCP)
-
-    option(BUILD_PUBSUB_PSA_UDP_MC "Build UDP MC PubSub Admin" ON)
-    if (BUILD_PUBSUB_PSA_UDP_MC)
-        add_subdirectory(pubsub_admin_udp_mc)
-    endif (BUILD_PUBSUB_PSA_UDP_MC)
-
-    option(BUILD_PUBSUB_PSA_WS "Build WebSocket PubSub Admin" ON)
-    if (BUILD_PUBSUB_PSA_WS)
-        add_subdirectory(pubsub_admin_websocket)
-    endif (BUILD_PUBSUB_PSA_WS)
-
     add_subdirectory(pubsub_api)
     add_subdirectory(pubsub_utils)
     add_subdirectory(pubsub_spi)
     add_subdirectory(pubsub_topology_manager)
+    add_subdirectory(pubsub_admin_zmq)
+    add_subdirectory(pubsub_admin_tcp)
+    add_subdirectory(pubsub_admin_udp_mc)
+    add_subdirectory(pubsub_admin_websocket)
     add_subdirectory(pubsub_discovery)
     add_subdirectory(pubsub_serializer_json)
     add_subdirectory(pubsub_serializer_avrobin)
     add_subdirectory(pubsub_protocol)
     add_subdirectory(keygen)
-
     add_subdirectory(examples)
-
     if (ENABLE_TESTING)
          add_subdirectory(integration)
     endif()
-
 endif(PUBSUB)
diff --git a/bundles/pubsub/examples/CMakeLists.txt b/bundles/pubsub/examples/CMakeLists.txt
index a34a28b..7b7e2ea 100644
--- a/bundles/pubsub/examples/CMakeLists.txt
+++ b/bundles/pubsub/examples/CMakeLists.txt
@@ -15,93 +15,95 @@
 # specific language governing permissions and limitations
 # under the License.
 
-add_subdirectory(pubsub)
+celix_subproject(PUBSUB_EXAMPLES "Option to build the pubsub examples" ON DEPS LOG_SERVICE SHELL SHELL_TUI PUBSUB_DISCOVERY_ETCD)
+if (PUBSUB_EXAMPLES)
+    add_subdirectory(pubsub)
 
-find_program(ETCD_CMD NAMES etcd)
-find_program(XTERM_CMD NAMES xterm)
+    find_program(ETCD_CMD NAMES etcd)
+    find_program(XTERM_CMD NAMES xterm)
 
-find_package(Jansson REQUIRED)
+    find_package(Jansson REQUIRED)
 
-set(PUBSUB_CONTAINER_LIBS Jansson Celix::dfi)
+    set(PUBSUB_CONTAINER_LIBS Jansson Celix::dfi)
 
-# UDP Multicast
-if (BUILD_PUBSUB_PSA_UDP_MC)
-    add_celix_container(pubsub_publisher_udp_mc
-        GROUP pubsub
-        BUNDLES
-            Celix::log_admin
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_udp_multicast
-            celix_pubsub_poi_publisher
-            celix_pubsub_poi_publisher2
-        PROPERTIES
-            PSA_UDPMC_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_publisher_udp_mc PRIVATE ${PUBSUB_CONTAINER_LIBS})
+    # UDP Multicast
+    if (BUILD_PUBSUB_PSA_UDP_MC)
+        add_celix_container(pubsub_publisher_udp_mc
+                GROUP pubsub
+                BUNDLES
+                Celix::log_admin
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_discovery_etcd
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_udp_multicast
+                celix_pubsub_poi_publisher
+                celix_pubsub_poi_publisher2
+                PROPERTIES
+                PSA_UDPMC_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                )
+        target_link_libraries(pubsub_publisher_udp_mc PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    add_celix_container(pubsub_subscriber_udp_mc
-        GROUP pubsub
-        BUNDLES
-            Celix::log_admin
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_udp_multicast
-            celix_pubsub_poi_subscriber
-        PROPERTIES
-            PSA_UDPMC_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_subscriber_udp_mc PRIVATE ${PUBSUB_CONTAINER_LIBS})
+        add_celix_container(pubsub_subscriber_udp_mc
+                GROUP pubsub
+                BUNDLES
+                Celix::log_admin
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_discovery_etcd
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_udp_multicast
+                celix_pubsub_poi_subscriber
+                PROPERTIES
+                PSA_UDPMC_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                )
+        target_link_libraries(pubsub_subscriber_udp_mc PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    add_celix_container(pubsub_subscriber2_udp_mc
-        GROUP pubsub
-        BUNDLES
-            Celix::log_admin
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_udp_multicast
-            celix_pubsub_poi_subscriber
-        PROPERTIES
-            PSA_UDPMC_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_subscriber2_udp_mc PRIVATE ${PUBSUB_CONTAINER_LIBS})
+        add_celix_container(pubsub_subscriber2_udp_mc
+                GROUP pubsub
+                BUNDLES
+                Celix::log_admin
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_discovery_etcd
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_udp_multicast
+                celix_pubsub_poi_subscriber
+                PROPERTIES
+                PSA_UDPMC_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                )
+        target_link_libraries(pubsub_subscriber2_udp_mc PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    if (ETCD_CMD AND XTERM_CMD)
-        # Runtime starting a publish and subscriber for udp mc
-        add_celix_runtime(pubsub_rt_upd_mc
-            NAME udp_mc
-            GROUP pubsub
-            CONTAINERS
-                pubsub_publisher_udp_mc
-                pubsub_subscriber_udp_mc
-                pubsub_subscriber2_udp_mc
-            COMMANDS
-                etcd
-            USE_TERM
-        )
-    endif ()
-endif()
+        if (ETCD_CMD AND XTERM_CMD)
+            # Runtime starting a publish and subscriber for udp mc
+            add_celix_runtime(pubsub_rt_upd_mc
+                    NAME udp_mc
+                    GROUP pubsub
+                    CONTAINERS
+                    pubsub_publisher_udp_mc
+                    pubsub_subscriber_udp_mc
+                    pubsub_subscriber2_udp_mc
+                    COMMANDS
+                    etcd
+                    USE_TERM
+                    )
+        endif ()
+    endif()
 
-if (BUILD_PUBSUB_PSA_TCP)
-    # TCP
-    add_celix_container(pubsub_publisher_tcp
-            GROUP pubsub
-            BUNDLES
+    if (BUILD_PUBSUB_PSA_TCP)
+        # TCP
+        add_celix_container(pubsub_publisher_tcp
+                GROUP pubsub
+                BUNDLES
                 Celix::log_admin
                 Celix::shell
                 Celix::shell_tui
@@ -112,16 +114,16 @@ if (BUILD_PUBSUB_PSA_TCP)
                 Celix::celix_pubsub_protocol_wire_v2
                 celix_pubsub_poi_publisher
                 celix_pubsub_poi_publisher2
-            PROPERTIES
+                PROPERTIES
                 PSA_TCP_VERBOSE=true
                 PUBSUB_ETCD_DISCOVERY_VERBOSE=true
                 PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_publisher_tcp PRIVATE ${PUBSUB_CONTAINER_LIBS})
+                )
+        target_link_libraries(pubsub_publisher_tcp PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    add_celix_container(pubsub_subscriber_tcp
-            GROUP pubsub
-            BUNDLES
+        add_celix_container(pubsub_subscriber_tcp
+                GROUP pubsub
+                BUNDLES
                 Celix::log_admin
                 Celix::shell
                 Celix::shell_tui
@@ -131,16 +133,16 @@ if (BUILD_PUBSUB_PSA_TCP)
                 Celix::celix_pubsub_admin_tcp
                 Celix::celix_pubsub_protocol_wire_v2
                 celix_pubsub_poi_subscriber
-            PROPERTIES
+                PROPERTIES
                 PSA_TCP_VERBOSE=true
                 PUBSUB_ETCD_DISCOVERY_VERBOSE=true
                 PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_subscriber_tcp PRIVATE ${PUBSUB_CONTAINER_LIBS})
+                )
+        target_link_libraries(pubsub_subscriber_tcp PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    add_celix_container(pubsub_subscriber2_tcp
-            GROUP pubsub
-            BUNDLES
+        add_celix_container(pubsub_subscriber2_tcp
+                GROUP pubsub
+                BUNDLES
                 Celix::log_admin
                 Celix::shell
                 Celix::shell_tui
@@ -150,281 +152,282 @@ if (BUILD_PUBSUB_PSA_TCP)
                 Celix::celix_pubsub_admin_tcp
                 Celix::celix_pubsub_protocol_wire_v2
                 celix_pubsub_poi_subscriber
-            PROPERTIES
+                PROPERTIES
                 PSA_TCP_VERBOSE=true
                 PUBSUB_ETCD_DISCOVERY_VERBOSE=true
                 PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_subscriber2_tcp PRIVATE ${PUBSUB_CONTAINER_LIBS})
+                )
+        target_link_libraries(pubsub_subscriber2_tcp PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    if (ETCD_CMD AND XTERM_CMD)
-        # Runtime starting a publish and subscriber for tcp
-        add_celix_runtime(pubsub_rt_tcp
-                NAME tcp
-                GROUP pubsub
-                CONTAINERS
+        if (ETCD_CMD AND XTERM_CMD)
+            # Runtime starting a publish and subscriber for tcp
+            add_celix_runtime(pubsub_rt_tcp
+                    NAME tcp
+                    GROUP pubsub
+                    CONTAINERS
                     pubsub_publisher_tcp
                     pubsub_subscriber_tcp
                     pubsub_subscriber2_tcp
-                COMMANDS
+                    COMMANDS
                     etcd
-                USE_TERM
-        )
-    endif ()
-endif()
+                    USE_TERM
+                    )
+        endif ()
+    endif()
+
+    if (BUILD_PUBSUB_PSA_ZMQ)
+        find_package(ZMQ REQUIRED)
+        find_package(CZMQ REQUIRED)
+
+        set(PUBSUB_CONTAINER_LIBS ${PUBSUB_CONTAINER_LIBS} ZMQ::lib CZMQ::lib ${OPTIONAL_OPENSSL_LIB})
 
-if (BUILD_PUBSUB_PSA_ZMQ)
-    find_package(ZMQ REQUIRED)
-    find_package(CZMQ REQUIRED)
+        if (BUILD_PUBSUB_PSA_TCP AND BUILD_PUBSUB_PSA_UDP_MC)
+            # Dynamic ZMQ / UDP / TCP admin
+            add_celix_container(pubsub_publisher
+                    GROUP "pubsub"
+                    BUNDLES
+                    Celix::shell
+                    Celix::shell_tui
+                    Celix::celix_pubsub_serializer_json
+                    Celix::celix_pubsub_discovery_etcd
+                    Celix::celix_pubsub_topology_manager
+                    Celix::celix_pubsub_admin_zmq
+                    Celix::celix_pubsub_admin_udp_multicast
+                    Celix::celix_pubsub_admin_tcp
+                    Celix::celix_pubsub_protocol_wire_v1
+                    celix_pubsub_poi_publisher
+                    celix_pubsub_poi_publisher2
+                    )
+            target_link_libraries(pubsub_publisher PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    set(PUBSUB_CONTAINER_LIBS ${PUBSUB_CONTAINER_LIBS} ZMQ::lib CZMQ::lib ${OPTIONAL_OPENSSL_LIB})
+            add_celix_container(pubsub_subscriber
+                    GROUP "pubsub"
+                    BUNDLES
+                    Celix::shell
+                    Celix::shell_tui
+                    Celix::celix_pubsub_serializer_json
+                    Celix::celix_pubsub_discovery_etcd
+                    Celix::celix_pubsub_topology_manager
+                    Celix::celix_pubsub_admin_zmq
+                    Celix::celix_pubsub_admin_udp_multicast
+                    Celix::celix_pubsub_admin_tcp
+                    Celix::celix_pubsub_protocol_wire_v1
+                    celix_pubsub_poi_subscriber
+                    )
+            target_link_libraries(pubsub_subscriber PRIVATE ${PUBSUB_CONTAINER_LIBS})
+        endif()
 
-    if (BUILD_PUBSUB_PSA_TCP AND BUILD_PUBSUB_PSA_UDP_MC)
-        # Dynamic ZMQ / UDP / TCP admin
-        add_celix_container(pubsub_publisher
-            GROUP "pubsub"
-            BUNDLES
+        # ZMQ
+        add_celix_container(pubsub_zmq
+                GROUP "pubsub"
+                BUNDLES
                 Celix::shell
                 Celix::shell_tui
                 Celix::celix_pubsub_serializer_json
                 Celix::celix_pubsub_discovery_etcd
                 Celix::celix_pubsub_topology_manager
                 Celix::celix_pubsub_admin_zmq
-                Celix::celix_pubsub_admin_udp_multicast
-                Celix::celix_pubsub_admin_tcp
+                celix_pubsub_poi_publisher
+                celix_pubsub_poi_subscriber
+                PROPERTIES
+                PSA_ZMQ_ZEROCOPY_ENABLED=true
+                )
+        target_link_libraries(pubsub_zmq PRIVATE ${PUBSUB_CONTAINER_LIBS})
+
+        add_celix_container(pubsub_publisher_zmq
+                GROUP "pubsub"
+                BUNDLES
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
                 Celix::celix_pubsub_protocol_wire_v1
+                Celix::celix_pubsub_discovery_etcd
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_zmq
                 celix_pubsub_poi_publisher
                 celix_pubsub_poi_publisher2
-        )
-        target_link_libraries(pubsub_publisher PRIVATE ${PUBSUB_CONTAINER_LIBS})
+                celix_pubsub_interceptors_example
+                PROPERTIES
+                PSA_ZMQ_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                PSA_ZMQ_ZEROCOPY_ENABLED=false
+                )
+        target_link_libraries(pubsub_publisher_zmq PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-        add_celix_container(pubsub_subscriber
-            GROUP "pubsub"
-            BUNDLES
+        add_celix_container(pubsub_subscriber_zmq
+                GROUP "pubsub"
+                BUNDLES
                 Celix::shell
                 Celix::shell_tui
                 Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_protocol_wire_v1
                 Celix::celix_pubsub_discovery_etcd
                 Celix::celix_pubsub_topology_manager
                 Celix::celix_pubsub_admin_zmq
-                Celix::celix_pubsub_admin_udp_multicast
-                Celix::celix_pubsub_admin_tcp
-                Celix::celix_pubsub_protocol_wire_v1
                 celix_pubsub_poi_subscriber
-        )
-        target_link_libraries(pubsub_subscriber PRIVATE ${PUBSUB_CONTAINER_LIBS})
-    endif()
-
-    # ZMQ
-    add_celix_container(pubsub_zmq
-        GROUP "pubsub"
-        BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_zmq
-            celix_pubsub_poi_publisher
-            celix_pubsub_poi_subscriber
-        PROPERTIES
-            PSA_ZMQ_ZEROCOPY_ENABLED=true
-    )
-    target_link_libraries(pubsub_zmq PRIVATE ${PUBSUB_CONTAINER_LIBS})
-
-    add_celix_container(pubsub_publisher_zmq
-        GROUP "pubsub"
-        BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_protocol_wire_v1
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_zmq
-            celix_pubsub_poi_publisher
-            celix_pubsub_poi_publisher2
-            celix_pubsub_interceptors_example
-        PROPERTIES
-            PSA_ZMQ_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-            PSA_ZMQ_ZEROCOPY_ENABLED=false
-    )
-    target_link_libraries(pubsub_publisher_zmq PRIVATE ${PUBSUB_CONTAINER_LIBS})
-
-    add_celix_container(pubsub_subscriber_zmq
-        GROUP "pubsub"
-        BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_protocol_wire_v1
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_zmq
-            celix_pubsub_poi_subscriber
-            celix_pubsub_interceptors_example
-        PROPERTIES
-            PSA_ZMQ_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_subscriber_zmq PRIVATE ${PUBSUB_CONTAINER_LIBS})
+                celix_pubsub_interceptors_example
+                PROPERTIES
+                PSA_ZMQ_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                )
+        target_link_libraries(pubsub_subscriber_zmq PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    add_celix_container(pubsub_subscriber2_zmq
-        GROUP "pubsub"
-        BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_zmq
-            celix_pubsub_poi_subscriber
-        PROPERTIES
-            PSA_ZMQ_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_subscriber2_zmq PRIVATE ${PUBSUB_CONTAINER_LIBS})
+        add_celix_container(pubsub_subscriber2_zmq
+                GROUP "pubsub"
+                BUNDLES
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_discovery_etcd
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_zmq
+                celix_pubsub_poi_subscriber
+                PROPERTIES
+                PSA_ZMQ_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                )
+        target_link_libraries(pubsub_subscriber2_zmq PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    if (ETCD_CMD AND XTERM_CMD)
-        # Runtime starting two bundles using both zmq and upd mc pubsub
-        add_celix_runtime(pubsub_rt_zmq_udpmc_combi
-            NAME combi
-            GROUP pubsub
-            CONTAINERS
-                pubsub_publisher_zmq
-                pubsub_subscriber_zmq
-                pubsub_subscriber_zmq
-            COMMANDS
-                etcd
-            USE_TERM
-        )
+        if (ETCD_CMD AND XTERM_CMD)
+            # Runtime starting two bundles using both zmq and upd mc pubsub
+            add_celix_runtime(pubsub_rt_zmq_udpmc_combi
+                    NAME combi
+                    GROUP pubsub
+                    CONTAINERS
+                    pubsub_publisher_zmq
+                    pubsub_subscriber_zmq
+                    pubsub_subscriber_zmq
+                    COMMANDS
+                    etcd
+                    USE_TERM
+                    )
 
-        # Runtime starting a publish and 2 subscribers for zmq
-        add_celix_runtime(pubsub_rt_zmq
-            NAME zmq
-            GROUP pubsub
-            CONTAINERS
-                pubsub_publisher_zmq
-                pubsub_subscriber_zmq
-                pubsub_subscriber2_zmq
-            COMMANDS
-                etcd
-            USE_TERM
-        )
-    endif ()
-endif()
+            # Runtime starting a publish and 2 subscribers for zmq
+            add_celix_runtime(pubsub_rt_zmq
+                    NAME zmq
+                    GROUP pubsub
+                    CONTAINERS
+                    pubsub_publisher_zmq
+                    pubsub_subscriber_zmq
+                    pubsub_subscriber2_zmq
+                    COMMANDS
+                    etcd
+                    USE_TERM
+                    )
+        endif ()
+    endif()
 
-if (BUILD_PUBSUB_PSA_NANOMSG)
-    set(PUBSUB_CONTAINER_LIBS NANOMSG::lib ${PUBSUB_CONTAINER_LIBS})
+    if (BUILD_PUBSUB_PSA_NANOMSG)
+        set(PUBSUB_CONTAINER_LIBS NANOMSG::lib ${PUBSUB_CONTAINER_LIBS})
 
-    add_celix_container(pubsub_publisher1_nanomsg
-        GROUP "pubsub"
-        BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_nanomsg
-            celix_pubsub_poi_publisher
-        PROPERTIES
-            PSA_NANOMSG_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_publisher1_nanomsg PRIVATE ${PUBSUB_CONTAINER_LIBS})
+        add_celix_container(pubsub_publisher1_nanomsg
+                GROUP "pubsub"
+                BUNDLES
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_discovery_etcd
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_nanomsg
+                celix_pubsub_poi_publisher
+                PROPERTIES
+                PSA_NANOMSG_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                )
+        target_link_libraries(pubsub_publisher1_nanomsg PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    add_celix_container(pubsub_publisher2_nanomsg
-        GROUP "pubsub"
-        BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_nanomsg
-            celix_pubsub_poi_publisher
-        PROPERTIES
-            PSA_NANOMSG_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_publisher2_nanomsg PRIVATE ${PUBSUB_CONTAINER_LIBS})
+        add_celix_container(pubsub_publisher2_nanomsg
+                GROUP "pubsub"
+                BUNDLES
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_discovery_etcd
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_nanomsg
+                celix_pubsub_poi_publisher
+                PROPERTIES
+                PSA_NANOMSG_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                )
+        target_link_libraries(pubsub_publisher2_nanomsg PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    add_celix_container(pubsub_subscriber1_nanomsg
-        GROUP "pubsub"
-        BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_nanomsg
-            celix_pubsub_poi_subscriber
-        PROPERTIES
-            PSA_NANOMSG_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_subscriber1_nanomsg PRIVATE ${PUBSUB_CONTAINER_LIBS})
+        add_celix_container(pubsub_subscriber1_nanomsg
+                GROUP "pubsub"
+                BUNDLES
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_discovery_etcd
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_nanomsg
+                celix_pubsub_poi_subscriber
+                PROPERTIES
+                PSA_NANOMSG_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                )
+        target_link_libraries(pubsub_subscriber1_nanomsg PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    add_celix_container(pubsub_subscriber2_nanomsg
-        GROUP "pubsub"
-        BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_discovery_etcd
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_nanomsg
-            celix_pubsub_poi_subscriber
-        PROPERTIES
-            PSA_NANOMSG_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-    )
-    target_link_libraries(pubsub_subscriber2_nanomsg PRIVATE ${PUBSUB_CONTAINER_LIBS})
+        add_celix_container(pubsub_subscriber2_nanomsg
+                GROUP "pubsub"
+                BUNDLES
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_discovery_etcd
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_nanomsg
+                celix_pubsub_poi_subscriber
+                PROPERTIES
+                PSA_NANOMSG_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                )
+        target_link_libraries(pubsub_subscriber2_nanomsg PRIVATE ${PUBSUB_CONTAINER_LIBS})
 
-    if (ETCD_CMD AND XTERM_CMD)
-        # Runtime starting a publisher and 2 subscribers for nanomsg
-        add_celix_runtime(pubsub_rt_nanomsg
-            NAME nanomsg
-            GROUP pubsub
-            CONTAINERS
-                pubsub_publisher1_nanomsg
-                pubsub_publisher2_nanomsg
-                pubsub_subscriber1_nanomsg
-                pubsub_subscriber2_nanomsg
-            COMMANDS
-                etcd
-            USE_TERM
-        )
-    endif ()
+        if (ETCD_CMD AND XTERM_CMD)
+            # Runtime starting a publisher and 2 subscribers for nanomsg
+            add_celix_runtime(pubsub_rt_nanomsg
+                    NAME nanomsg
+                    GROUP pubsub
+                    CONTAINERS
+                    pubsub_publisher1_nanomsg
+                    pubsub_publisher2_nanomsg
+                    pubsub_subscriber1_nanomsg
+                    pubsub_subscriber2_nanomsg
+                    COMMANDS
+                    etcd
+                    USE_TERM
+                    )
+        endif ()
 
-endif()
+    endif()
 
-if (BUILD_PUBSUB_PSA_WS)
-    add_celix_container(pubsub_websocket_example
-        GROUP pubsub
-        BUNDLES
-            Celix::log_admin
-            Celix::shell
-            Celix::shell_tui
-            Celix::http_admin
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_websocket
-            celix_pubsub_websocket_example
-        PROPERTIES
-            PSA_TCP_VERBOSE=true
-            PUBSUB_ETCD_DISCOVERY_VERBOSE=true
-            PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
-            CELIX_HTTP_ADMIN_LISTENING_PORTS=7660
-            CELIX_HTTP_ADMIN_NUM_THREADS=5
-    )
-    target_link_libraries(pubsub_websocket_example PRIVATE ${PUBSUB_CONTAINER_LIBS})
-endif()
+    if (BUILD_PUBSUB_PSA_WS)
+        add_celix_container(pubsub_websocket_example
+                GROUP pubsub
+                BUNDLES
+                Celix::log_admin
+                Celix::shell
+                Celix::shell_tui
+                Celix::http_admin
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_websocket
+                celix_pubsub_websocket_example
+                PROPERTIES
+                PSA_TCP_VERBOSE=true
+                PUBSUB_ETCD_DISCOVERY_VERBOSE=true
+                PUBSUB_TOPOLOGY_MANAGER_VERBOSE=true
+                CELIX_HTTP_ADMIN_LISTENING_PORTS=7660
+                CELIX_HTTP_ADMIN_NUM_THREADS=5
+                )
+        target_link_libraries(pubsub_websocket_example PRIVATE ${PUBSUB_CONTAINER_LIBS})
+    endif()
+endif ()
diff --git a/bundles/pubsub/integration/CMakeLists.txt b/bundles/pubsub/integration/CMakeLists.txt
index cc675e1..58dc701 100644
--- a/bundles/pubsub/integration/CMakeLists.txt
+++ b/bundles/pubsub/integration/CMakeLists.txt
@@ -15,400 +15,401 @@
 # specific language governing permissions and limitations
 # under the License.
 
-find_package(Jansson REQUIRED)
-
-add_celix_bundle(pubsub_endpoint_sut
-        #"Vanilla" bundle which is under test
-        SOURCES
-        gtest/sut_endpoint_activator.c
-        VERSION 1.0.0
-        )
-target_include_directories(pubsub_endpoint_sut PRIVATE gtest)
-target_link_libraries(pubsub_endpoint_sut PRIVATE Celix::pubsub_api)
-celix_bundle_files(pubsub_endpoint_sut
-        meta_data/msg.descriptor
-        DESTINATION "META-INF/descriptors"
-        )
-celix_bundle_files(pubsub_endpoint_sut
-        meta_data/ping2.properties
-        DESTINATION "META-INF/topics/pub"
-        )
-
-add_celix_bundle(pubsub_endpoint_tst
-        #Test bundle containing cpputests and uses celix_test_runner launcher instead of the celix launcher
-        SOURCES
-        gtest/tst_endpoint_activator.c
-        VERSION 1.0.0
-        )
-target_link_libraries(pubsub_endpoint_tst PRIVATE Celix::framework Celix::pubsub_api)
-celix_bundle_files(pubsub_endpoint_tst
-        meta_data/msg.descriptor
-        DESTINATION "META-INF/descriptors"
-        )
-celix_bundle_files(pubsub_endpoint_tst
-        meta_data/pong3.properties
-        DESTINATION "META-INF/topics/sub"
-        )
-
-
-add_celix_bundle(pubsub_loopback
-        #"Vanilla" bundle which is under test
-        SOURCES
-        gtest/loopback_activator.c
-        VERSION 1.0.0
-        )
-target_include_directories(pubsub_loopback PRIVATE gtest)
-target_link_libraries(pubsub_loopback PRIVATE Celix::pubsub_api)
-celix_bundle_files(pubsub_loopback
-        meta_data/msg.descriptor
-        DESTINATION "META-INF/descriptors"
-        )
-celix_bundle_files(pubsub_loopback
-        meta_data/ping3.properties
-        DESTINATION "META-INF/topics/pub"
-        )
-celix_bundle_files(pubsub_loopback
-        meta_data/pong2.properties
-        DESTINATION "META-INF/topics/sub"
-        )
-
-add_celix_bundle(pubsub_sut
-    #"Vanilla" bundle which is under test
-    SOURCES
-        gtest/sut_activator.c
-    VERSION 1.0.0
-)
-target_include_directories(pubsub_sut PRIVATE gtest)
-target_link_libraries(pubsub_sut PRIVATE Celix::pubsub_api)
-celix_bundle_files(pubsub_sut
-    meta_data/msg.descriptor
-    DESTINATION "META-INF/descriptors"
-)
-celix_bundle_files(pubsub_sut
-    meta_data/ping.properties
-    DESTINATION "META-INF/topics/pub"
-)
-
-add_celix_bundle(pubsub_tst
-    #Test bundle containing cpputests and uses celix_test_runner launcher instead of the celix launcher
-    SOURCES
-        gtest/tst_activator.c
-    VERSION 1.0.0
-)
-target_link_libraries(pubsub_tst PRIVATE Celix::framework Celix::pubsub_api)
-celix_bundle_files(pubsub_tst
-    meta_data/msg.descriptor
-    DESTINATION "META-INF/descriptors"
-)
-celix_bundle_files(pubsub_tst
-    meta_data/ping.properties
-    DESTINATION "META-INF/topics/sub"
-)
-
-add_celix_bundle(pubsub_deadlock_sut
-    #"Vanilla" bundle which is used to trigger a publisher added call
-    SOURCES
-    gtest/sut_activator.c
-    VERSION 1.0.0
-)
-celix_bundle_files(pubsub_deadlock_sut
-    meta_data/msg.descriptor
-    DESTINATION "META-INF/descriptors"
-)
-celix_bundle_files(pubsub_deadlock_sut
-    meta_data/deadlock.scope.properties
-    DESTINATION "META-INF/topics/pub"
-)
-celix_bundle_files(pubsub_deadlock_sut
-    meta_data/deadlock.scope2.properties
-    DESTINATION "META-INF/topics/pub"
-)
-target_link_libraries(pubsub_deadlock_sut PRIVATE Celix::pubsub_api)
-
-celix_get_bundle_file(pubsub_deadlock_sut DEADLOCK_SUT_BUNDLE_FILE)
-
-add_celix_bundle(pubsub_serializer
-        #serializer bundle
-        SOURCES
-        gtest/serializer_activator.cc
-        VERSION 1.0.0
-        )
-target_include_directories(pubsub_serializer PRIVATE gtest)
-target_link_libraries(pubsub_serializer PRIVATE Celix::pubsub_api Celix::pubsub_spi)
-
-if (BUILD_PUBSUB_PSA_UDP_MC)
-    add_celix_container(pubsub_udpmc_tests
-            USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-            LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
-            DIR ${CMAKE_CURRENT_BINARY_DIR}
-            PROPERTIES
+celix_subproject(PUBSUB_INTEGRATION "Option to build the pubsub integration" ON DEPS SHELL SHELL_TUI)
+if (PUBSUB_INTEGRATION)
+    find_package(Jansson REQUIRED)
+
+    add_celix_bundle(pubsub_endpoint_sut
+            #"Vanilla" bundle which is under test
+            SOURCES
+            gtest/sut_endpoint_activator.c
+            VERSION 1.0.0
+            )
+    target_include_directories(pubsub_endpoint_sut PRIVATE gtest)
+    target_link_libraries(pubsub_endpoint_sut PRIVATE Celix::pubsub_api)
+    celix_bundle_files(pubsub_endpoint_sut
+            meta_data/msg.descriptor
+            DESTINATION "META-INF/descriptors"
+            )
+    celix_bundle_files(pubsub_endpoint_sut
+            meta_data/ping2.properties
+            DESTINATION "META-INF/topics/pub"
+            )
+
+    add_celix_bundle(pubsub_endpoint_tst
+            #Test bundle containing cpputests and uses celix_test_runner launcher instead of the celix launcher
+            SOURCES
+            gtest/tst_endpoint_activator.c
+            VERSION 1.0.0
+            )
+    target_link_libraries(pubsub_endpoint_tst PRIVATE Celix::framework Celix::pubsub_api)
+    celix_bundle_files(pubsub_endpoint_tst
+            meta_data/msg.descriptor
+            DESTINATION "META-INF/descriptors"
+            )
+    celix_bundle_files(pubsub_endpoint_tst
+            meta_data/pong3.properties
+            DESTINATION "META-INF/topics/sub"
+            )
+
+
+    add_celix_bundle(pubsub_loopback
+            #"Vanilla" bundle which is under test
+            SOURCES
+            gtest/loopback_activator.c
+            VERSION 1.0.0
+            )
+    target_include_directories(pubsub_loopback PRIVATE gtest)
+    target_link_libraries(pubsub_loopback PRIVATE Celix::pubsub_api)
+    celix_bundle_files(pubsub_loopback
+            meta_data/msg.descriptor
+            DESTINATION "META-INF/descriptors"
+            )
+    celix_bundle_files(pubsub_loopback
+            meta_data/ping3.properties
+            DESTINATION "META-INF/topics/pub"
+            )
+    celix_bundle_files(pubsub_loopback
+            meta_data/pong2.properties
+            DESTINATION "META-INF/topics/sub"
+            )
+
+    add_celix_bundle(pubsub_sut
+            #"Vanilla" bundle which is under test
+            SOURCES
+            gtest/sut_activator.c
+            VERSION 1.0.0
+            )
+    target_include_directories(pubsub_sut PRIVATE gtest)
+    target_link_libraries(pubsub_sut PRIVATE Celix::pubsub_api)
+    celix_bundle_files(pubsub_sut
+            meta_data/msg.descriptor
+            DESTINATION "META-INF/descriptors"
+            )
+    celix_bundle_files(pubsub_sut
+            meta_data/ping.properties
+            DESTINATION "META-INF/topics/pub"
+            )
+
+    add_celix_bundle(pubsub_tst
+            #Test bundle containing cpputests and uses celix_test_runner launcher instead of the celix launcher
+            SOURCES
+            gtest/tst_activator.c
+            VERSION 1.0.0
+            )
+    target_link_libraries(pubsub_tst PRIVATE Celix::framework Celix::pubsub_api)
+    celix_bundle_files(pubsub_tst
+            meta_data/msg.descriptor
+            DESTINATION "META-INF/descriptors"
+            )
+    celix_bundle_files(pubsub_tst
+            meta_data/ping.properties
+            DESTINATION "META-INF/topics/sub"
+            )
+
+    add_celix_bundle(pubsub_deadlock_sut
+            #"Vanilla" bundle which is used to trigger a publisher added call
+            SOURCES
+            gtest/sut_activator.c
+            VERSION 1.0.0
+            )
+    celix_bundle_files(pubsub_deadlock_sut
+            meta_data/msg.descriptor
+            DESTINATION "META-INF/descriptors"
+            )
+    celix_bundle_files(pubsub_deadlock_sut
+            meta_data/deadlock.scope.properties
+            DESTINATION "META-INF/topics/pub"
+            )
+    celix_bundle_files(pubsub_deadlock_sut
+            meta_data/deadlock.scope2.properties
+            DESTINATION "META-INF/topics/pub"
+            )
+    target_link_libraries(pubsub_deadlock_sut PRIVATE Celix::pubsub_api)
+
+    celix_get_bundle_file(pubsub_deadlock_sut DEADLOCK_SUT_BUNDLE_FILE)
+
+    add_celix_bundle(pubsub_serializer
+            #serializer bundle
+            SOURCES
+            gtest/serializer_activator.cc
+            VERSION 1.0.0
+            )
+    target_include_directories(pubsub_serializer PRIVATE gtest)
+    target_link_libraries(pubsub_serializer PRIVATE Celix::pubsub_api Celix::pubsub_spi)
+
+    if (BUILD_PUBSUB_PSA_UDP_MC)
+        add_celix_container(pubsub_udpmc_tests
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
                 LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
                 CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            BUNDLES
+                BUNDLES
                 Celix::celix_pubsub_serializer_json
                 Celix::celix_pubsub_topology_manager
                 Celix::celix_pubsub_admin_udp_multicast
                 pubsub_sut
                 pubsub_tst
-    )
-    target_link_libraries(pubsub_udpmc_tests PRIVATE Celix::pubsub_api Jansson Celix::dfi GTest::gtest GTest::gtest_main)
-    target_include_directories(pubsub_udpmc_tests SYSTEM PRIVATE gtest)
-
-    add_celix_container(pstm_deadlock_udpmc_test
-            USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-            LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/pstm_deadlock_test/test_runner.cc
-            DIR ${CMAKE_CURRENT_BINARY_DIR}
-            PROPERTIES
-            LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
-            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            BUNDLES
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_protocol_wire_v2
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_udp_multicast
-            Celix::shell
-            Celix::shell_tui
-            )
-    target_compile_definitions(pstm_deadlock_udpmc_test PRIVATE -DDEADLOCK_SUT_BUNDLE_FILE=\"${DEADLOCK_SUT_BUNDLE_FILE}\")
-    target_link_libraries(pstm_deadlock_udpmc_test PRIVATE Celix::pubsub_api Jansson Celix::dfi GTest::gtest GTest::gtest_main)
-    target_include_directories(pstm_deadlock_udpmc_test SYSTEM PRIVATE pstm_deadlock_udpmc_test)
-
-    #Note we do not link to bundles, as result (to ensure a bundle zip file is created) an dependency on the bundle is needed.
-    add_dependencies(pstm_deadlock_udpmc_test pubsub_deadlock_sut_bundle)
-
-    #Framework "bundle" has no cache dir. Default as "cache dir" the cwd is used.
-    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/msg.descriptor ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_udpmc_gtest/META-INF/descriptors/msg.descriptor COPYONLY)
-    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/deadlock.scope.properties ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_udpmc_gtest/META-INF/topics/pub/deadlock.properties COPYONLY)
-
-    add_test(NAME pstm_deadlock_udpmc_test COMMAND pstm_deadlock_udpmc_test WORKING_DIRECTORY $<TARGET_PROPERTY:pstm_deadlock_udpmc_test,CONTAINER_LOC>)
-    setup_target_for_coverage(pstm_deadlock_udpmc_test SCAN_DIR ..)
-
-    #TODO fix issues with UDPMC and reanble test again
-    #add_test(NAME pubsub_udpmc_tests COMMAND pubsub_udpmc_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_udpmc_tests,CONTAINER_LOC>)
-    #setup_target_for_coverage(pubsub_udpmc_tests SCAN_DIR ..)
-endif()
-
-if (BUILD_PUBSUB_PSA_TCP)
-    # TCP v2 tests
-
-    add_celix_container(pubsub_tcp_v2_wire_v1_tests
-            USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-            LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
-            DIR ${CMAKE_CURRENT_BINARY_DIR}
-            PROPERTIES
-            LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
-            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_protocol_wire_v1
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_tcp
-            pubsub_sut
-            pubsub_tst
-            pubsub_serializer
-            )
-    target_link_libraries(pubsub_tcp_v2_wire_v1_tests PRIVATE Celix::pubsub_api Celix::dfi GTest::gtest GTest::gtest_main)
-    target_include_directories(pubsub_tcp_v2_wire_v1_tests SYSTEM PRIVATE gtest)
-    add_test(NAME pubsub_tcp_v2_wire_v1_tests COMMAND pubsub_tcp_v2_wire_v1_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_tcp_v2_wire_v1_tests,CONTAINER_LOC>)
-    setup_target_for_coverage(pubsub_tcp_v2_wire_v1_tests SCAN_DIR ..)
-
-    add_celix_container(pubsub_tcp_v2_wire_v2_tests
-            USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-            LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
-            DIR ${CMAKE_CURRENT_BINARY_DIR}
-            PROPERTIES
-            LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
-            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_protocol_wire_v2
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_tcp
-            pubsub_sut
-            pubsub_tst
-            pubsub_serializer
-            )
-    target_link_libraries(pubsub_tcp_v2_wire_v2_tests PRIVATE Celix::pubsub_api Celix::dfi GTest::gtest GTest::gtest_main)
-    target_include_directories(pubsub_tcp_v2_wire_v2_tests SYSTEM PRIVATE gtest)
-    add_test(NAME pubsub_tcp_v2_wire_v2_tests COMMAND pubsub_tcp_v2_wire_v2_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_tcp_v2_wire_v2_tests,CONTAINER_LOC>)
-    setup_target_for_coverage(pubsub_tcp_v2_wire_v2_tests SCAN_DIR ..)
-
-    add_celix_container(pubsub_tcp_v2_wire_v2_with_no_scope_tests
-            USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-            LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
-            DIR ${CMAKE_CURRENT_BINARY_DIR}
-            PROPERTIES
-            LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
-            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            CELIX_PUBSUB_TEST_USE_NEGATIVE_SCOPE_FILTER=false
-            BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_protocol_wire_v2
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_tcp
-            pubsub_sut
-            pubsub_tst
-            pubsub_serializer
-            )
-    target_link_libraries(pubsub_tcp_v2_wire_v2_with_no_scope_tests PRIVATE Celix::pubsub_api Celix::dfi GTest::gtest GTest::gtest_main)
-    target_include_directories(pubsub_tcp_v2_wire_v2_with_no_scope_tests SYSTEM PRIVATE gtest)
-    add_test(NAME pubsub_tcp_v2_wire_v2_with_no_scope_tests COMMAND pubsub_tcp_v2_wire_v2_with_no_scope_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_tcp_v2_wire_v2_with_no_scope_tests,CONTAINER_LOC>)
-    setup_target_for_coverage(pubsub_tcp_v2_wire_v2_with_no_scope_tests SCAN_DIR ..)
-
-    add_celix_container(pubsub_tcp_v2_endpoint_tests
-            USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-            LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubEndpointIntegrationTestSuite.cc
-            DIR ${CMAKE_CURRENT_BINARY_DIR}
-            PROPERTIES
-            LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
-            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            BUNDLES
-            Celix::shell
-            Celix::shell_tui
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_protocol_wire_v2
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_tcp
-            pubsub_endpoint_tst
-            pubsub_endpoint_sut
-            pubsub_loopback
-            pubsub_serializer
-            )
-    target_link_libraries(pubsub_tcp_v2_endpoint_tests PRIVATE Celix::pubsub_api Celix::dfi GTest::gtest GTest::gtest_main)
-    target_include_directories(pubsub_tcp_v2_endpoint_tests SYSTEM PRIVATE gtest)
-
-    add_celix_container(pstm_deadlock_tcp_v2_test
-            USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-            LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/pstm_deadlock_test/test_runner.cc
-            DIR ${CMAKE_CURRENT_BINARY_DIR}
-            PROPERTIES
-            LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
-            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            BUNDLES
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_protocol_wire_v2
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_tcp
-            Celix::shell
-            Celix::shell_tui
-            pubsub_serializer
-            )
-    target_compile_definitions(pstm_deadlock_tcp_v2_test PRIVATE -DDEADLOCK_SUT_BUNDLE_FILE=\"${DEADLOCK_SUT_BUNDLE_FILE}\")
-    target_link_libraries(pstm_deadlock_tcp_v2_test PRIVATE Celix::pubsub_api GTest::gtest GTest::gtest_main Celix::dfi)
-    target_include_directories(pstm_deadlock_tcp_v2_test SYSTEM PRIVATE pstm_deadlock_tcp_v2_test)
+                )
+        target_link_libraries(pubsub_udpmc_tests PRIVATE Celix::pubsub_api Jansson Celix::dfi GTest::gtest GTest::gtest_main)
+        target_include_directories(pubsub_udpmc_tests SYSTEM PRIVATE gtest)
+
+        add_celix_container(pstm_deadlock_udpmc_test
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/pstm_deadlock_test/test_runner.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
+                LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
+                CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
+                BUNDLES
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_protocol_wire_v2
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_udp_multicast
+                Celix::shell
+                Celix::shell_tui
+                )
+        target_compile_definitions(pstm_deadlock_udpmc_test PRIVATE -DDEADLOCK_SUT_BUNDLE_FILE=\"${DEADLOCK_SUT_BUNDLE_FILE}\")
+        target_link_libraries(pstm_deadlock_udpmc_test PRIVATE Celix::pubsub_api Jansson Celix::dfi GTest::gtest GTest::gtest_main)
+        target_include_directories(pstm_deadlock_udpmc_test SYSTEM PRIVATE pstm_deadlock_udpmc_test)
 
-    #Note we do not link to bundles, as result (to ensure a bundle zip file is created) an dependency on the bundle is needed.
-    add_dependencies(pstm_deadlock_tcp_v2_test pubsub_deadlock_sut_bundle)
+        add_celix_bundle_dependencies(pstm_deadlock_udpmc_test pubsub_deadlock_sut)
 
-    #Framework "bundle" has no cache dir. Default as "cache dir" the cwd is used.
-    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/msg.descriptor ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_tcp_gtest/META-INF/descriptors/msg.descriptor COPYONLY)
-    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/deadlock.scope.properties ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_tcp_gtest/META-INF/topics/pub/deadlock.properties COPYONLY)
+        #Framework "bundle" has no cache dir. Default as "cache dir" the cwd is used.
+        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/msg.descriptor ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_udpmc_gtest/META-INF/descriptors/msg.descriptor COPYONLY)
+        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/deadlock.scope.properties ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_udpmc_gtest/META-INF/topics/pub/deadlock.properties COPYONLY)
 
-    add_test(NAME pstm_deadlock_tcp_v2_test COMMAND pstm_deadlock_tcp_v2_test WORKING_DIRECTORY $<TARGET_PROPERTY:pstm_deadlock_tcp_v2_test,CONTAINER_LOC>)
-    setup_target_for_coverage(pstm_deadlock_tcp_v2_test SCAN_DIR ..)
+        add_test(NAME pstm_deadlock_udpmc_test COMMAND pstm_deadlock_udpmc_test WORKING_DIRECTORY $<TARGET_PROPERTY:pstm_deadlock_udpmc_test,CONTAINER_LOC>)
+        setup_target_for_coverage(pstm_deadlock_udpmc_test SCAN_DIR ..)
 
-    #TCP Endpoint test is disabled because the test is not stable when running on Travis
-    if (ENABLE_PUBSUB_PSA_TCP_ENDPOINT_TEST)
-        add_test(NAME pubsub_tcp_v2_endpoint_tests COMMAND pubsub_tcp_v2_endpoint_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_tcp_v2_endpoint_tests,CONTAINER_LOC>)
-        setup_target_for_coverage(pubsub_tcp_v2_endpoint_tests SCAN_DIR ..)
+        #TODO fix issues with UDPMC and reanble test again
+        #add_test(NAME pubsub_udpmc_tests COMMAND pubsub_udpmc_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_udpmc_tests,CONTAINER_LOC>)
+        #setup_target_for_coverage(pubsub_udpmc_tests SCAN_DIR ..)
     endif()
-endif()
-
-if (BUILD_PUBSUB_PSA_WS)
-    add_celix_container(pubsub_websocket_v2_tests
-        USE_CONFIG
-        LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
-        DIR ${CMAKE_CURRENT_BINARY_DIR}
-        PROPERTIES
-            LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
-            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            CELIX_HTTP_ADMIN_LISTENING_PORTS=58080
-        BUNDLES
-            Celix::celix_pubsub_serializer_json
-            Celix::http_admin
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_websocket
-            pubsub_sut
-            pubsub_tst
-            pubsub_serializer
-    )
-    target_link_libraries(pubsub_websocket_v2_tests PRIVATE Celix::pubsub_api Jansson civetweb_shared GTest::gtest GTest::gtest_main)
-    target_include_directories(pubsub_websocket_v2_tests SYSTEM PRIVATE gtest)
-    add_test(NAME pubsub_websocket_v2_tests COMMAND pubsub_websocket_v2_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_websocket_v2_tests,CONTAINER_LOC>)
-    setup_target_for_coverage(pubsub_websocket_v2_tests SCAN_DIR ..)
-
-    add_celix_container(pstm_deadlock_websocket_v2_test
-        USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-        LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/pstm_deadlock_test/test_runner.cc
-        DIR ${CMAKE_CURRENT_BINARY_DIR}
-        PROPERTIES
-            LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
-            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            CELIX_HTTP_ADMIN_LISTENING_PORTS=58080
-        BUNDLES
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_websocket
-            Celix::shell
-            Celix::shell_tui
-            pubsub_serializer
-    )
-    target_compile_definitions(pstm_deadlock_websocket_v2_test PRIVATE -DDEADLOCK_SUT_BUNDLE_FILE=\"${DEADLOCK_SUT_BUNDLE_FILE}\")
-    target_link_libraries(pstm_deadlock_websocket_v2_test PRIVATE Celix::pubsub_api GTest::gtest GTest::gtest_main Jansson Celix::dfi civetweb_shared)
-    target_include_directories(pstm_deadlock_websocket_v2_test SYSTEM PRIVATE pstm_deadlock_websocket_v2_test)
-
-    #Note we do not link to bundles, as result (to ensure a bundle zip file is created) an dependency on the bundle is needed.
-    add_dependencies(pstm_deadlock_websocket_v2_test pubsub_deadlock_sut_bundle)
-
-    #Framework "bundle" has no cache dir. Default as "cache dir" the cwd is used.
-    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/msg.descriptor ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_websocket_v2_test/META-INF/descriptors/msg.descriptor COPYONLY)
-    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/deadlock.scope.properties ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_websocket_v2_test/META-INF/topics/pub/deadlock.properties COPYONLY)
-
-    add_test(NAME pstm_deadlock_websocket_v2_test COMMAND pstm_deadlock_websocket_v2_test WORKING_DIRECTORY $<TARGET_PROPERTY:pstm_deadlock_websocket_v2_test,CONTAINER_LOC>)
-    setup_target_for_coverage(pstm_deadlock_websocket_v2_test SCAN_DIR ..)
-endif()
-
-if (BUILD_PUBSUB_PSA_ZMQ)
-    find_package(ZMQ REQUIRED)
-    find_package(CZMQ REQUIRED)
-
-    add_celix_container(pubsub_zmq_v2_tests
-            USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-            LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
-            DIR ${CMAKE_CURRENT_BINARY_DIR}
-            PROPERTIES
+
+    if (BUILD_PUBSUB_PSA_TCP)
+        # TCP v2 tests
+
+        add_celix_container(pubsub_tcp_v2_wire_v1_tests
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
                 LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
                 CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            BUNDLES
+                BUNDLES
+                Celix::shell
+                Celix::shell_tui
                 Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_protocol_wire_v1
                 Celix::celix_pubsub_topology_manager
-                Celix::celix_pubsub_admin_zmq
+                Celix::celix_pubsub_admin_tcp
+                pubsub_sut
+                pubsub_tst
+                pubsub_serializer
+                )
+        target_link_libraries(pubsub_tcp_v2_wire_v1_tests PRIVATE Celix::pubsub_api Celix::dfi GTest::gtest GTest::gtest_main)
+        target_include_directories(pubsub_tcp_v2_wire_v1_tests SYSTEM PRIVATE gtest)
+        add_test(NAME pubsub_tcp_v2_wire_v1_tests COMMAND pubsub_tcp_v2_wire_v1_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_tcp_v2_wire_v1_tests,CONTAINER_LOC>)
+        setup_target_for_coverage(pubsub_tcp_v2_wire_v1_tests SCAN_DIR ..)
+
+        add_celix_container(pubsub_tcp_v2_wire_v2_tests
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
+                LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
+                CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
+                BUNDLES
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
                 Celix::celix_pubsub_protocol_wire_v2
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_tcp
                 pubsub_sut
                 pubsub_tst
                 pubsub_serializer
-            )
+                )
+        target_link_libraries(pubsub_tcp_v2_wire_v2_tests PRIVATE Celix::pubsub_api Celix::dfi GTest::gtest GTest::gtest_main)
+        target_include_directories(pubsub_tcp_v2_wire_v2_tests SYSTEM PRIVATE gtest)
+        add_test(NAME pubsub_tcp_v2_wire_v2_tests COMMAND pubsub_tcp_v2_wire_v2_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_tcp_v2_wire_v2_tests,CONTAINER_LOC>)
+        setup_target_for_coverage(pubsub_tcp_v2_wire_v2_tests SCAN_DIR ..)
+
+        add_celix_container(pubsub_tcp_v2_wire_v2_with_no_scope_tests
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
+                LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
+                CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
+                CELIX_PUBSUB_TEST_USE_NEGATIVE_SCOPE_FILTER=false
+                BUNDLES
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_protocol_wire_v2
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_tcp
+                pubsub_sut
+                pubsub_tst
+                pubsub_serializer
+                )
+        target_link_libraries(pubsub_tcp_v2_wire_v2_with_no_scope_tests PRIVATE Celix::pubsub_api Celix::dfi GTest::gtest GTest::gtest_main)
+        target_include_directories(pubsub_tcp_v2_wire_v2_with_no_scope_tests SYSTEM PRIVATE gtest)
+        add_test(NAME pubsub_tcp_v2_wire_v2_with_no_scope_tests COMMAND pubsub_tcp_v2_wire_v2_with_no_scope_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_tcp_v2_wire_v2_with_no_scope_tests,CONTAINER_LOC>)
+        setup_target_for_coverage(pubsub_tcp_v2_wire_v2_with_no_scope_tests SCAN_DIR ..)
+
+        add_celix_container(pubsub_tcp_v2_endpoint_tests
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubEndpointIntegrationTestSuite.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
+                LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
+                CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
+                BUNDLES
+                Celix::shell
+                Celix::shell_tui
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_protocol_wire_v2
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_tcp
+                pubsub_endpoint_tst
+                pubsub_endpoint_sut
+                pubsub_loopback
+                pubsub_serializer
+                )
+        target_link_libraries(pubsub_tcp_v2_endpoint_tests PRIVATE Celix::pubsub_api Celix::dfi GTest::gtest GTest::gtest_main)
+        target_include_directories(pubsub_tcp_v2_endpoint_tests SYSTEM PRIVATE gtest)
+
+        add_celix_container(pstm_deadlock_tcp_v2_test
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/pstm_deadlock_test/test_runner.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
+                LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
+                CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
+                BUNDLES
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_protocol_wire_v2
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_tcp
+                Celix::shell
+                Celix::shell_tui
+                pubsub_serializer
+                )
+        target_compile_definitions(pstm_deadlock_tcp_v2_test PRIVATE -DDEADLOCK_SUT_BUNDLE_FILE=\"${DEADLOCK_SUT_BUNDLE_FILE}\")
+        target_link_libraries(pstm_deadlock_tcp_v2_test PRIVATE Celix::pubsub_api GTest::gtest GTest::gtest_main Celix::dfi)
+        target_include_directories(pstm_deadlock_tcp_v2_test SYSTEM PRIVATE pstm_deadlock_tcp_v2_test)
+
+        #Note we do not link to bundles, as result (to ensure a bundle zip file is created) an dependency on the bundle is needed.
+        add_celix_bundle_dependencies(pstm_deadlock_tcp_v2_test pubsub_deadlock_sut)
+
+        #Framework "bundle" has no cache dir. Default as "cache dir" the cwd is used.
+        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/msg.descriptor ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_tcp_gtest/META-INF/descriptors/msg.descriptor COPYONLY)
+        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/deadlock.scope.properties ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_tcp_gtest/META-INF/topics/pub/deadlock.properties COPYONLY)
+
+        add_test(NAME pstm_deadlock_tcp_v2_test COMMAND pstm_deadlock_tcp_v2_test WORKING_DIRECTORY $<TARGET_PROPERTY:pstm_deadlock_tcp_v2_test,CONTAINER_LOC>)
+        setup_target_for_coverage(pstm_deadlock_tcp_v2_test SCAN_DIR ..)
+
+        #TCP Endpoint test is disabled because the test is not stable when running on Travis
+        if (ENABLE_PUBSUB_PSA_TCP_ENDPOINT_TEST)
+            add_test(NAME pubsub_tcp_v2_endpoint_tests COMMAND pubsub_tcp_v2_endpoint_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_tcp_v2_endpoint_tests,CONTAINER_LOC>)
+            setup_target_for_coverage(pubsub_tcp_v2_endpoint_tests SCAN_DIR ..)
+        endif()
+    endif()
 
-    target_link_libraries(pubsub_zmq_v2_tests PRIVATE Celix::pubsub_api Celix::dfi ZMQ::lib CZMQ::lib GTest::gtest GTest::gtest_main)
-    target_include_directories(pubsub_zmq_v2_tests SYSTEM PRIVATE gtest)
-    add_test(NAME pubsub_zmq_v2_tests COMMAND pubsub_zmq_v2_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_zmq_v2_tests,CONTAINER_LOC>)
-    setup_target_for_coverage(pubsub_zmq_v2_tests SCAN_DIR ..)
+    if (BUILD_PUBSUB_PSA_WS)
+        add_celix_container(pubsub_websocket_v2_tests
+                USE_CONFIG
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
+                LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
+                CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
+                CELIX_HTTP_ADMIN_LISTENING_PORTS=58080
+                BUNDLES
+                Celix::celix_pubsub_serializer_json
+                Celix::http_admin
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_websocket
+                pubsub_sut
+                pubsub_tst
+                pubsub_serializer
+                )
+        target_link_libraries(pubsub_websocket_v2_tests PRIVATE Celix::pubsub_api Jansson civetweb_shared GTest::gtest GTest::gtest_main)
+        target_include_directories(pubsub_websocket_v2_tests SYSTEM PRIVATE gtest)
+        add_test(NAME pubsub_websocket_v2_tests COMMAND pubsub_websocket_v2_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_websocket_v2_tests,CONTAINER_LOC>)
+        setup_target_for_coverage(pubsub_websocket_v2_tests SCAN_DIR ..)
+
+        add_celix_container(pstm_deadlock_websocket_v2_test
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/pstm_deadlock_test/test_runner.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
+                LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
+                CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
+                CELIX_HTTP_ADMIN_LISTENING_PORTS=58080
+                BUNDLES
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_websocket
+                Celix::shell
+                Celix::shell_tui
+                pubsub_serializer
+                )
+        target_compile_definitions(pstm_deadlock_websocket_v2_test PRIVATE -DDEADLOCK_SUT_BUNDLE_FILE=\"${DEADLOCK_SUT_BUNDLE_FILE}\")
+        target_link_libraries(pstm_deadlock_websocket_v2_test PRIVATE Celix::pubsub_api GTest::gtest GTest::gtest_main Jansson Celix::dfi civetweb_shared)
+        target_include_directories(pstm_deadlock_websocket_v2_test SYSTEM PRIVATE pstm_deadlock_websocket_v2_test)
+
+        #Note we do not link to bundles, as result (to ensure a bundle zip file is created) an dependency on the bundle is needed.
+        add_celix_bundle_dependencies(pstm_deadlock_websocket_v2_test pubsub_deadlock_sut)
+
+        #Framework "bundle" has no cache dir. Default as "cache dir" the cwd is used.
+        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/msg.descriptor ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_websocket_v2_test/META-INF/descriptors/msg.descriptor COPYONLY)
+        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/deadlock.scope.properties ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_websocket_v2_test/META-INF/topics/pub/deadlock.properties COPYONLY)
+
+        add_test(NAME pstm_deadlock_websocket_v2_test COMMAND pstm_deadlock_websocket_v2_test WORKING_DIRECTORY $<TARGET_PROPERTY:pstm_deadlock_websocket_v2_test,CONTAINER_LOC>)
+        setup_target_for_coverage(pstm_deadlock_websocket_v2_test SCAN_DIR ..)
+    endif()
+
+    if (BUILD_PUBSUB_PSA_ZMQ)
+        find_package(ZMQ REQUIRED)
+        find_package(CZMQ REQUIRED)
 
-    add_celix_container(pubsub_zmq_v2_zerocopy_tests
-            USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-            LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
-            DIR ${CMAKE_CURRENT_BINARY_DIR}
-            PROPERTIES
+        add_celix_container(pubsub_zmq_v2_tests
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
+                LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
+                CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
+                BUNDLES
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_zmq
+                Celix::celix_pubsub_protocol_wire_v2
+                pubsub_sut
+                pubsub_tst
+                pubsub_serializer
+                )
+
+        target_link_libraries(pubsub_zmq_v2_tests PRIVATE Celix::pubsub_api Celix::dfi ZMQ::lib CZMQ::lib GTest::gtest GTest::gtest_main)
+        target_include_directories(pubsub_zmq_v2_tests SYSTEM PRIVATE gtest)
+        add_test(NAME pubsub_zmq_v2_tests COMMAND pubsub_zmq_v2_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_zmq_v2_tests,CONTAINER_LOC>)
+        setup_target_for_coverage(pubsub_zmq_v2_tests SCAN_DIR ..)
+
+        add_celix_container(pubsub_zmq_v2_zerocopy_tests
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/gtest/PubSubIntegrationTestSuite.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
                 LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
                 PSA_ZMQ_ZEROCOPY_ENABLED=true
                 CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            BUNDLES
+                BUNDLES
                 Celix::celix_pubsub_serializer_json
                 Celix::celix_pubsub_topology_manager
                 Celix::celix_pubsub_admin_zmq
@@ -418,139 +419,140 @@ if (BUILD_PUBSUB_PSA_ZMQ)
                 pubsub_sut
                 pubsub_tst
                 pubsub_serializer
-            )
+                )
 
-    target_link_libraries(pubsub_zmq_v2_zerocopy_tests PRIVATE Celix::pubsub_api Celix::dfi ZMQ::lib CZMQ::lib GTest::gtest GTest::gtest_main)
-    target_include_directories(pubsub_zmq_v2_zerocopy_tests SYSTEM PRIVATE gtest)
-
-    add_test(NAME pubsub_zmq_v2_zerocopy_tests COMMAND pubsub_zmq_v2_zerocopy_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_zmq_v2_zerocopy_tests,CONTAINER_LOC>)
-    setup_target_for_coverage(pubsub_zmq_v2_zerocopy_tests SCAN_DIR ..)
-
-    add_celix_container(pstm_deadlock_zmq_v2_test
-            USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
-            LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/pstm_deadlock_test/test_runner.cc
-            DIR ${CMAKE_CURRENT_BINARY_DIR}
-            PROPERTIES
-            LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
-            CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
-            BUNDLES
-            Celix::celix_pubsub_serializer_json
-            Celix::celix_pubsub_topology_manager
-            Celix::celix_pubsub_admin_zmq
-            Celix::celix_pubsub_protocol_wire_v2
-            )
+        target_link_libraries(pubsub_zmq_v2_zerocopy_tests PRIVATE Celix::pubsub_api Celix::dfi ZMQ::lib CZMQ::lib GTest::gtest GTest::gtest_main)
+        target_include_directories(pubsub_zmq_v2_zerocopy_tests SYSTEM PRIVATE gtest)
 
-    target_compile_definitions(pstm_deadlock_zmq_v2_test PRIVATE -DDEADLOCK_SUT_BUNDLE_FILE=\"${DEADLOCK_SUT_BUNDLE_FILE}\")
-    target_link_libraries(pstm_deadlock_zmq_v2_test PRIVATE Celix::pubsub_api GTest::gtest GTest::gtest_main Celix::dfi ZMQ::lib CZMQ::lib)
-    target_include_directories(pstm_deadlock_zmq_v2_test SYSTEM PRIVATE pstm_deadlock_zmq_v2_test)
-
-    #Note we do not link to bundles, as result (to ensure a bundle zip file is created) an dependency on the bundle is needed.
-    add_dependencies(pstm_deadlock_zmq_v2_test pubsub_deadlock_sut_bundle)
-
-    #Framework "bundle" has no cache dir. Default as "cache dir" the cwd is used.
-    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/msg.descriptor ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_zmq_v2_test/META-INF/descriptors/msg.descriptor COPYONLY)
-    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/deadlock.scope.properties ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_zmq_v2_test/META-INF/topics/pub/deadlock.properties COPYONLY)
-
-    add_test(NAME pstm_deadlock_zmq_v2_test COMMAND pstm_deadlock_zmq_v2_test WORKING_DIRECTORY $<TARGET_PROPERTY:pstm_deadlock_zmq_v2_test,CONTAINER_LOC>)
-    setup_target_for_coverage(pstm_deadlock_zmq_v2_test SCAN_DIR ..)
-endif ()
-
-if (BUILD_PUBSUB_PSA_ZMQ)
-    #Test suite to test if component with same topic and different scope combinations work
-    add_executable(test_pubsub_topic_and_scope_integration
-            gtest/PubSubTopicAndScopeIntegrationTestSuite.cc
-    )
-    target_link_libraries(test_pubsub_topic_and_scope_integration PRIVATE Celix::framework Celix::pubsub_api GTest::gtest GTest::gtest_main)
-    add_test(NAME test_pubsub_topic_and_scope_integration COMMAND test_pubsub_topic_and_scope_integration)
-    setup_target_for_coverage(test_pubsub_topic_and_scope_integration SCAN_DIR ..)
-
-    #configure topology manager and pubsub zmq, json serializer and wire protocol v2 bundles
-    celix_get_bundle_file(Celix::celix_pubsub_serializer_json PUBSUB_JSON_BUNDLE_FILE)
-    celix_get_bundle_file(Celix::celix_pubsub_topology_manager PUBSUB_TOPMAN_BUNDLE_FILE)
-    celix_get_bundle_file(Celix::celix_pubsub_admin_zmq PUBSUB_ZMQ_BUNDLE_FILE)
-    celix_get_bundle_file(Celix::celix_pubsub_protocol_wire_v2 PUBSUB_WIRE_BUNDLE_FILE)
-    add_dependencies(test_pubsub_topic_and_scope_integration
-            celix_pubsub_serializer_json_bundle
-            celix_pubsub_topology_manager_bundle
-            celix_pubsub_admin_zmq_bundle
-            celix_pubsub_protocol_wire_v2_bundle
-    )
-    target_compile_definitions(test_pubsub_topic_and_scope_integration PRIVATE
-            PUBSUB_JSON_BUNDLE_FILE="${PUBSUB_JSON_BUNDLE_FILE}"
-            PUBSUB_TOPMAN_BUNDLE_FILE="${PUBSUB_TOPMAN_BUNDLE_FILE}"
-            PUBSUB_ZMQ_BUNDLE_FILE="${PUBSUB_ZMQ_BUNDLE_FILE}"
-            PUBSUB_WIRE_BUNDLE_FILE="${PUBSUB_WIRE_BUNDLE_FILE}"
-    )
-endif ()
-
-#[[
-Add a integration test with use interceptors for a configurable PSA and wire protocol
-
-ARGV0 is test target name
-ARGV1 is PSA target name
-ARGV2 is wire protocol target name
-ARGV3 is option boolean whether http admin bundle should be used
-
-]]
-function(add_celix_interceptors_test_for_psa_and_wire)
-    set(TEST_TARGET_NAME ${ARGV0})
-    set(PSA ${ARGV1})
-    set(WIRE ${ARGV2})
-    set(USE_HTTP_ADMIN ${ARGV3})
-
-    #Test suite to test if pusbub interceptors
-    add_executable(${TEST_TARGET_NAME}
-        gtest/PubSubInterceptorTestSuite.cc
-    )
-    target_link_libraries(${TEST_TARGET_NAME} PRIVATE Celix::framework Celix::pubsub_api GTest::gtest GTest::gtest_main Celix::pubsub_spi)
-    target_include_directories(${TEST_TARGET_NAME} PRIVATE gtest)
-    add_test(NAME ${TEST_TARGET_NAME} COMMAND ${TEST_TARGET_NAME})
-    setup_target_for_coverage(${TEST_TARGET_NAME} SCAN_DIR ..)
-
-    #configure topology manager and pubsub admin, json serializer and wire protocol bundles
-    celix_get_bundle_file(Celix::celix_pubsub_serializer_json PUBSUB_JSON_BUNDLE_FILE)
-    celix_get_bundle_file(Celix::celix_pubsub_topology_manager PUBSUB_TOPMAN_BUNDLE_FILE)
-    celix_get_bundle_file(${PSA} PUBSUB_PSA_BUNDLE_FILE)
-    celix_get_bundle_file(${WIRE} PUBSUB_WIRE_BUNDLE_FILE)
-
-    celix_get_bundle_file(pubsub_sut PUBSUB_PUBLISHER_BUNDLE_FILE)
-    celix_get_bundle_file(pubsub_tst PUBSUB_SUBSCRIBER_BUNDLE_FILE)
-    add_celix_bundle_dependencies(${TEST_TARGET_NAME} Celix::celix_pubsub_serializer_json Celix::celix_pubsub_topology_manager ${PSA} ${WIRE} pubsub_sut pubsub_tst)
-    target_compile_definitions(${TEST_TARGET_NAME} PRIVATE
-            PUBSUB_JSON_BUNDLE_FILE="${PUBSUB_JSON_BUNDLE_FILE}"
-            PUBSUB_TOPMAN_BUNDLE_FILE="${PUBSUB_TOPMAN_BUNDLE_FILE}"
-            PUBSUB_PSA_BUNDLE_FILE="${PUBSUB_PSA_BUNDLE_FILE}"
-            PUBSUB_WIRE_BUNDLE_FILE="${PUBSUB_WIRE_BUNDLE_FILE}"
-            PUBSUB_PUBLISHER_BUNDLE_FILE="${PUBSUB_PUBLISHER_BUNDLE_FILE}"
-            PUBSUB_SUBSCRIBER_BUNDLE_FILE="${PUBSUB_SUBSCRIBER_BUNDLE_FILE}"
-    )
-
-    #if PSA websocket is enabled add http_admin bundle
-    if (USE_HTTP_ADMIN)
-        target_link_libraries(${TEST_TARGET_NAME} PRIVATE Celix::http_admin_api)
-        celix_get_bundle_file(Celix::http_admin HTTP_ADMIN_BUNDLE_FILE)
-        add_celix_bundle_dependencies(${TEST_TARGET_NAME} Celix::http_admin)
-        target_compile_definitions(${TEST_TARGET_NAME} PRIVATE HTTP_ADMIN_BUNDLE_FILE="${HTTP_ADMIN_BUNDLE_FILE}")
-    endif ()
+        add_test(NAME pubsub_zmq_v2_zerocopy_tests COMMAND pubsub_zmq_v2_zerocopy_tests WORKING_DIRECTORY $<TARGET_PROPERTY:pubsub_zmq_v2_zerocopy_tests,CONTAINER_LOC>)
+        setup_target_for_coverage(pubsub_zmq_v2_zerocopy_tests SCAN_DIR ..)
+
+        add_celix_container(pstm_deadlock_zmq_v2_test
+                USE_CONFIG #ensures that a config.properties will be created with the launch bundles.
+                LAUNCHER_SRC ${CMAKE_CURRENT_LIST_DIR}/pstm_deadlock_test/test_runner.cc
+                DIR ${CMAKE_CURRENT_BINARY_DIR}
+                PROPERTIES
+                LOGHELPER_STDOUT_FALLBACK_INCLUDE_DEBUG=true
+                CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=trace
+                BUNDLES
+                Celix::celix_pubsub_serializer_json
+                Celix::celix_pubsub_topology_manager
+                Celix::celix_pubsub_admin_zmq
+                Celix::celix_pubsub_protocol_wire_v2
+                )
+
+        target_compile_definitions(pstm_deadlock_zmq_v2_test PRIVATE -DDEADLOCK_SUT_BUNDLE_FILE=\"${DEADLOCK_SUT_BUNDLE_FILE}\")
+        target_link_libraries(pstm_deadlock_zmq_v2_test PRIVATE Celix::pubsub_api GTest::gtest GTest::gtest_main Celix::dfi ZMQ::lib CZMQ::lib)
+        target_include_directories(pstm_deadlock_zmq_v2_test SYSTEM PRIVATE pstm_deadlock_zmq_v2_test)
+
+        #Note we do not link to bundles, as result (to ensure a bundle zip file is created) an dependency on the bundle is needed.
+        add_celix_bundle_dependencies(pstm_deadlock_zmq_v2_test pubsub_deadlock_sut)
+
+        #Framework "bundle" has no cache dir. Default as "cache dir" the cwd is used.
+        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/msg.descriptor ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_zmq_v2_test/META-INF/descriptors/msg.descriptor COPYONLY)
+        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/meta_data/deadlock.scope.properties ${CMAKE_CURRENT_BINARY_DIR}/pstm_deadlock_zmq_v2_test/META-INF/topics/pub/deadlock.properties COPYONLY)
 
-    #Linking against zmq if present
-    if (TARGET ZMQ::lib AND TARGET CZMQ::lib)
-        target_link_libraries(${TEST_TARGET_NAME} PRIVATE ZMQ::lib CZMQ::lib)
+        add_test(NAME pstm_deadlock_zmq_v2_test COMMAND pstm_deadlock_zmq_v2_test WORKING_DIRECTORY $<TARGET_PROPERTY:pstm_deadlock_zmq_v2_test,CONTAINER_LOC>)
+        setup_target_for_coverage(pstm_deadlock_zmq_v2_test SCAN_DIR ..)
     endif ()
-endfunction()
 
+    if (BUILD_PUBSUB_PSA_ZMQ)
+        #Test suite to test if component with same topic and different scope combinations work
+        add_executable(test_pubsub_topic_and_scope_integration
+                gtest/PubSubTopicAndScopeIntegrationTestSuite.cc
+                )
+        target_link_libraries(test_pubsub_topic_and_scope_integration PRIVATE Celix::framework Celix::pubsub_api GTest::gtest GTest::gtest_main)
+        add_test(NAME test_pubsub_topic_and_scope_integration COMMAND test_pubsub_topic_and_scope_integration)
+        setup_target_for_coverage(test_pubsub_topic_and_scope_integration SCAN_DIR ..)
+
+        #configure topology manager and pubsub zmq, json serializer and wire protocol v2 bundles
+        celix_get_bundle_file(Celix::celix_pubsub_serializer_json PUBSUB_JSON_BUNDLE_FILE)
+        celix_get_bundle_file(Celix::celix_pubsub_topology_manager PUBSUB_TOPMAN_BUNDLE_FILE)
+        celix_get_bundle_file(Celix::celix_pubsub_admin_zmq PUBSUB_ZMQ_BUNDLE_FILE)
+        celix_get_bundle_file(Celix::celix_pubsub_protocol_wire_v2 PUBSUB_WIRE_BUNDLE_FILE)
+        add_celix_bundle_dependencies(test_pubsub_topic_and_scope_integration
+                celix_pubsub_serializer_json
+                celix_pubsub_topology_manager
+                celix_pubsub_admin_zmq
+                celix_pubsub_protocol_wire_v2
+                )
+        target_compile_definitions(test_pubsub_topic_and_scope_integration PRIVATE
+                PUBSUB_JSON_BUNDLE_FILE="${PUBSUB_JSON_BUNDLE_FILE}"
+                PUBSUB_TOPMAN_BUNDLE_FILE="${PUBSUB_TOPMAN_BUNDLE_FILE}"
+                PUBSUB_ZMQ_BUNDLE_FILE="${PUBSUB_ZMQ_BUNDLE_FILE}"
+                PUBSUB_WIRE_BUNDLE_FILE="${PUBSUB_WIRE_BUNDLE_FILE}"
+                )
+    endif ()
 
-if (BUILD_PUBSUB_PSA_WS)
-    add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_ws_and_wire_v1_integration Celix::celix_pubsub_admin_websocket Celix::celix_pubsub_protocol_wire_v1 true)
-    add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_ws_and_wire_v2_integration Celix::celix_pubsub_admin_websocket Celix::celix_pubsub_protocol_wire_v2 true)
-endif ()
+    #[[
+    Add a integration test with use interceptors for a configurable PSA and wire protocol
+
+    ARGV0 is test target name
+    ARGV1 is PSA target name
+    ARGV2 is wire protocol target name
+    ARGV3 is option boolean whether http admin bundle should be used
+
+    ]]
+    function(add_celix_interceptors_test_for_psa_and_wire)
+        set(TEST_TARGET_NAME ${ARGV0})
+        set(PSA ${ARGV1})
+        set(WIRE ${ARGV2})
+        set(USE_HTTP_ADMIN ${ARGV3})
+
+        #Test suite to test if pusbub interceptors
+        add_executable(${TEST_TARGET_NAME}
+                gtest/PubSubInterceptorTestSuite.cc
+                )
+        target_link_libraries(${TEST_TARGET_NAME} PRIVATE Celix::framework Celix::pubsub_api GTest::gtest GTest::gtest_main Celix::pubsub_spi)
+        target_include_directories(${TEST_TARGET_NAME} PRIVATE gtest)
+        add_test(NAME ${TEST_TARGET_NAME} COMMAND ${TEST_TARGET_NAME})
+        setup_target_for_coverage(${TEST_TARGET_NAME} SCAN_DIR ..)
+
+        #configure topology manager and pubsub admin, json serializer and wire protocol bundles
+        celix_get_bundle_file(Celix::celix_pubsub_serializer_json PUBSUB_JSON_BUNDLE_FILE)
+        celix_get_bundle_file(Celix::celix_pubsub_topology_manager PUBSUB_TOPMAN_BUNDLE_FILE)
+        celix_get_bundle_file(${PSA} PUBSUB_PSA_BUNDLE_FILE)
+        celix_get_bundle_file(${WIRE} PUBSUB_WIRE_BUNDLE_FILE)
+
+        celix_get_bundle_file(pubsub_sut PUBSUB_PUBLISHER_BUNDLE_FILE)
+        celix_get_bundle_file(pubsub_tst PUBSUB_SUBSCRIBER_BUNDLE_FILE)
+        add_celix_bundle_dependencies(${TEST_TARGET_NAME} Celix::celix_pubsub_serializer_json Celix::celix_pubsub_topology_manager ${PSA} ${WIRE} pubsub_sut pubsub_tst)
+        target_compile_definitions(${TEST_TARGET_NAME} PRIVATE
+                PUBSUB_JSON_BUNDLE_FILE="${PUBSUB_JSON_BUNDLE_FILE}"
+                PUBSUB_TOPMAN_BUNDLE_FILE="${PUBSUB_TOPMAN_BUNDLE_FILE}"
+                PUBSUB_PSA_BUNDLE_FILE="${PUBSUB_PSA_BUNDLE_FILE}"
+                PUBSUB_WIRE_BUNDLE_FILE="${PUBSUB_WIRE_BUNDLE_FILE}"
+                PUBSUB_PUBLISHER_BUNDLE_FILE="${PUBSUB_PUBLISHER_BUNDLE_FILE}"
+                PUBSUB_SUBSCRIBER_BUNDLE_FILE="${PUBSUB_SUBSCRIBER_BUNDLE_FILE}"
+                )
+
+        #if PSA websocket is enabled add http_admin bundle
+        if (USE_HTTP_ADMIN)
+            target_link_libraries(${TEST_TARGET_NAME} PRIVATE Celix::http_admin_api)
+            celix_get_bundle_file(Celix::http_admin HTTP_ADMIN_BUNDLE_FILE)
+            add_celix_bundle_dependencies(${TEST_TARGET_NAME} Celix::http_admin)
+            target_compile_definitions(${TEST_TARGET_NAME} PRIVATE HTTP_ADMIN_BUNDLE_FILE="${HTTP_ADMIN_BUNDLE_FILE}")
+        endif ()
+
+        #Linking against zmq if present
+        if (TARGET ZMQ::lib AND TARGET CZMQ::lib)
+            target_link_libraries(${TEST_TARGET_NAME} PRIVATE ZMQ::lib CZMQ::lib)
+        endif ()
+    endfunction()
+
+
+    if (BUILD_PUBSUB_PSA_WS)
+        add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_ws_and_wire_v1_integration Celix::celix_pubsub_admin_websocket Celix::celix_pubsub_protocol_wire_v1 true)
+        add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_ws_and_wire_v2_integration Celix::celix_pubsub_admin_websocket Celix::celix_pubsub_protocol_wire_v2 true)
+    endif ()
 
-if (BUILD_PUBSUB_PSA_TCP)
-    add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_tcp_and_wire_v1_integration Celix::celix_pubsub_admin_tcp Celix::celix_pubsub_protocol_wire_v1)
-    add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_tcp_and_wire_v2_integration Celix::celix_pubsub_admin_tcp Celix::celix_pubsub_protocol_wire_v2)
-endif ()
+    if (BUILD_PUBSUB_PSA_TCP)
+        add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_tcp_and_wire_v1_integration Celix::celix_pubsub_admin_tcp Celix::celix_pubsub_protocol_wire_v1)
+        add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_tcp_and_wire_v2_integration Celix::celix_pubsub_admin_tcp Celix::celix_pubsub_protocol_wire_v2)
+    endif ()
 
-if (BUILD_PUBSUB_PSA_ZMQ)
-    add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_zmq_and_wire_v1_integration Celix::celix_pubsub_admin_zmq Celix::celix_pubsub_protocol_wire_v1)
-    add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_zmq_and_wire_v2_integration Celix::celix_pubsub_admin_zmq Celix::celix_pubsub_protocol_wire_v2)
+    if (BUILD_PUBSUB_PSA_ZMQ)
+        add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_zmq_and_wire_v1_integration Celix::celix_pubsub_admin_zmq Celix::celix_pubsub_protocol_wire_v1)
+        add_celix_interceptors_test_for_psa_and_wire(test_pubsub_interceptors_zmq_and_wire_v2_integration Celix::celix_pubsub_admin_zmq Celix::celix_pubsub_protocol_wire_v2)
+    endif ()
 endif ()
\ No newline at end of file
diff --git a/bundles/pubsub/pubsub_admin_tcp/CMakeLists.txt b/bundles/pubsub/pubsub_admin_tcp/CMakeLists.txt
index c3e032c..9acfbbc 100644
--- a/bundles/pubsub/pubsub_admin_tcp/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_admin_tcp/CMakeLists.txt
@@ -15,29 +15,32 @@
 # specific language governing permissions and limitations
 # under the License.
 
-find_package(UUID REQUIRED)
+celix_subproject(PUBSUB_PSA_TCP "Build TCP PubSub Admin" ON)
+if (PUBSUB_PSA_TCP)
+    find_package(UUID REQUIRED)
 
-add_celix_bundle(celix_pubsub_admin_tcp
-    BUNDLE_SYMBOLICNAME "apache_celix_pubsub_admin_tcp"
-    VERSION "2.0.0"
-    GROUP "Celix/PubSub"
-    SOURCES
-        src/psa_activator.c
-        src/pubsub_tcp_admin.c
-        src/pubsub_tcp_topic_sender.c
-        src/pubsub_tcp_topic_receiver.c
-        src/pubsub_tcp_handler.c
-        src/pubsub_tcp_common.c
-)
+    add_celix_bundle(celix_pubsub_admin_tcp
+            BUNDLE_SYMBOLICNAME "apache_celix_pubsub_admin_tcp"
+            VERSION "2.0.0"
+            GROUP "Celix/PubSub"
+            SOURCES
+            src/psa_activator.c
+            src/pubsub_tcp_admin.c
+            src/pubsub_tcp_topic_sender.c
+            src/pubsub_tcp_topic_receiver.c
+            src/pubsub_tcp_handler.c
+            src/pubsub_tcp_common.c
+            )
 
-target_link_libraries(celix_pubsub_admin_tcp PRIVATE Celix::pubsub_spi Celix::pubsub_utils)
-target_link_libraries(celix_pubsub_admin_tcp PRIVATE Celix::framework Celix::log_helper)
-target_link_libraries(celix_pubsub_admin_tcp PRIVATE Celix::shell_api)
-target_include_directories(celix_pubsub_admin_tcp PRIVATE src)
-# cmake find package UUID set the wrong include dir for OSX
-if (NOT APPLE)
-    target_link_libraries(celix_pubsub_admin_tcp PRIVATE UUID::lib)
-endif()
+    target_link_libraries(celix_pubsub_admin_tcp PRIVATE Celix::pubsub_spi Celix::pubsub_utils)
+    target_link_libraries(celix_pubsub_admin_tcp PRIVATE Celix::framework Celix::log_helper)
+    target_link_libraries(celix_pubsub_admin_tcp PRIVATE Celix::shell_api)
+    target_include_directories(celix_pubsub_admin_tcp PRIVATE src)
+    # cmake find package UUID set the wrong include dir for OSX, does Conan solve this?
+    if (NOT APPLE)
+        target_link_libraries(celix_pubsub_admin_tcp PRIVATE UUID::lib)
+    endif()
 
-install_celix_bundle(celix_pubsub_admin_tcp EXPORT celix COMPONENT pubsub)
-add_library(Celix::celix_pubsub_admin_tcp ALIAS celix_pubsub_admin_tcp)
+    install_celix_bundle(celix_pubsub_admin_tcp EXPORT celix COMPONENT pubsub)
+    add_library(Celix::celix_pubsub_admin_tcp ALIAS celix_pubsub_admin_tcp)
+endif (PUBSUB_PSA_TCP)
diff --git a/bundles/pubsub/pubsub_admin_udp_mc/CMakeLists.txt b/bundles/pubsub/pubsub_admin_udp_mc/CMakeLists.txt
index 4cf8fef..1e5148d 100644
--- a/bundles/pubsub/pubsub_admin_udp_mc/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_admin_udp_mc/CMakeLists.txt
@@ -15,28 +15,31 @@
 # specific language governing permissions and limitations
 # under the License.
 
-find_package(Jansson REQUIRED)
+celix_subproject(PUBSUB_PSA_UDP_MC "Build UDP MC PubSub Admin" ON)
+if (PUBSUB_PSA_UDP_MC)
+    find_package(Jansson REQUIRED)
 
-add_celix_bundle(celix_pubsub_admin_udp_multicast
-    BUNDLE_SYMBOLICNAME "apache_celix_pubsub_admin_udp_multicast"
-    VERSION "1.0.0"
-    GROUP "Celix/PubSub"
-    SOURCES
-        src/psa_activator.c
-        src/pubsub_udpmc_admin.c
-        src/pubsub_udpmc_topic_sender.c
-        src/pubsub_udpmc_topic_receiver.c
-        src/pubsub_udpmc_common.c
-        src/large_udp.c
-)
-target_include_directories(celix_pubsub_admin_udp_multicast PRIVATE
-        src
-)
-set_target_properties(celix_pubsub_admin_udp_multicast PROPERTIES INSTALL_RPATH "$ORIGIN")
-target_link_libraries(celix_pubsub_admin_udp_multicast PRIVATE Celix::framework Celix::dfi Celix::log_helper Celix::utils Celix::shell_api)
-target_link_libraries(celix_pubsub_admin_udp_multicast PRIVATE Celix::pubsub_spi Celix::pubsub_utils )
-install_celix_bundle(celix_pubsub_admin_udp_multicast EXPORT celix COMPONENT pubsub)
+    add_celix_bundle(celix_pubsub_admin_udp_multicast
+            BUNDLE_SYMBOLICNAME "apache_celix_pubsub_admin_udp_multicast"
+            VERSION "1.0.0"
+            GROUP "Celix/PubSub"
+            SOURCES
+            src/psa_activator.c
+            src/pubsub_udpmc_admin.c
+            src/pubsub_udpmc_topic_sender.c
+            src/pubsub_udpmc_topic_receiver.c
+            src/pubsub_udpmc_common.c
+            src/large_udp.c
+            )
+    target_include_directories(celix_pubsub_admin_udp_multicast PRIVATE
+            src
+            )
+    set_target_properties(celix_pubsub_admin_udp_multicast PROPERTIES INSTALL_RPATH "$ORIGIN")
+    target_link_libraries(celix_pubsub_admin_udp_multicast PRIVATE Celix::framework Celix::dfi Celix::log_helper Celix::utils Celix::shell_api)
+    target_link_libraries(celix_pubsub_admin_udp_multicast PRIVATE Celix::pubsub_spi Celix::pubsub_utils )
+    install_celix_bundle(celix_pubsub_admin_udp_multicast EXPORT celix COMPONENT pubsub)
 
-add_library(Celix::celix_pubsub_admin_udp_multicast ALIAS celix_pubsub_admin_udp_multicast)
+    add_library(Celix::celix_pubsub_admin_udp_multicast ALIAS celix_pubsub_admin_udp_multicast)
+endif (PUBSUB_PSA_UDP_MC)
 
 
diff --git a/bundles/pubsub/pubsub_admin_websocket/CMakeLists.txt b/bundles/pubsub/pubsub_admin_websocket/CMakeLists.txt
index 625e24d..15ad395 100644
--- a/bundles/pubsub/pubsub_admin_websocket/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_admin_websocket/CMakeLists.txt
@@ -15,28 +15,31 @@
 # specific language governing permissions and limitations
 # under the License.
 
-find_package(Jansson REQUIRED)
-find_package(UUID REQUIRED)
+celix_subproject(PUBSUB_PSA_WS "Build WebSocket PubSub Admin" ON DEPS HTTP_ADMIN)
+if (PUBSUB_PSA_WS)
+    find_package(Jansson REQUIRED)
+    find_package(UUID REQUIRED)
 
-add_celix_bundle(celix_pubsub_admin_websocket
-    BUNDLE_SYMBOLICNAME "apache_celix_pubsub_admin_websocket"
-    VERSION "2.0.0"
-    GROUP "Celix/PubSub"
-    SOURCES
-        src/psa_activator.c
-        src/pubsub_websocket_admin.c
-        src/pubsub_websocket_topic_sender.c
-        src/pubsub_websocket_topic_receiver.c
-        src/pubsub_websocket_common.c
-)
+    add_celix_bundle(celix_pubsub_admin_websocket
+            BUNDLE_SYMBOLICNAME "apache_celix_pubsub_admin_websocket"
+            VERSION "2.0.0"
+            GROUP "Celix/PubSub"
+            SOURCES
+            src/psa_activator.c
+            src/pubsub_websocket_admin.c
+            src/pubsub_websocket_topic_sender.c
+            src/pubsub_websocket_topic_receiver.c
+            src/pubsub_websocket_common.c
+            )
 
-target_link_libraries(celix_pubsub_admin_websocket PRIVATE
-        Celix::framework Celix::log_helper Celix::utils
-        Celix::http_admin_api
-)
-target_link_libraries(celix_pubsub_admin_websocket PRIVATE Celix::pubsub_spi Celix::pubsub_utils)
-target_link_libraries(celix_pubsub_admin_websocket PRIVATE Celix::shell_api)
-target_include_directories(celix_pubsub_admin_websocket PRIVATE src)
+    target_link_libraries(celix_pubsub_admin_websocket PRIVATE
+            Celix::framework Celix::log_helper Celix::utils
+            Celix::http_admin_api
+            )
+    target_link_libraries(celix_pubsub_admin_websocket PRIVATE Celix::pubsub_spi Celix::pubsub_utils)
+    target_link_libraries(celix_pubsub_admin_websocket PRIVATE Celix::shell_api)
+    target_include_directories(celix_pubsub_admin_websocket PRIVATE src)
 
-install_celix_bundle(celix_pubsub_admin_websocket EXPORT celix COMPONENT pubsub)
-add_library(Celix::celix_pubsub_admin_websocket ALIAS celix_pubsub_admin_websocket)
+    install_celix_bundle(celix_pubsub_admin_websocket EXPORT celix COMPONENT pubsub)
+    add_library(Celix::celix_pubsub_admin_websocket ALIAS celix_pubsub_admin_websocket)
+endif (PUBSUB_PSA_WS)
diff --git a/bundles/pubsub/pubsub_admin_zmq/CMakeLists.txt b/bundles/pubsub/pubsub_admin_zmq/CMakeLists.txt
index e8bbbf2..daf590e 100644
--- a/bundles/pubsub/pubsub_admin_zmq/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_admin_zmq/CMakeLists.txt
@@ -15,38 +15,43 @@
 # specific language governing permissions and limitations
 # under the License.
 
-find_package(ZMQ REQUIRED)
-find_package(CZMQ REQUIRED)
-find_package(UUID REQUIRED)
+celix_subproject(PUBSUB_PSA_ZMQ "Build ZeroMQ PubSub Admin (LGPL License)" ON)
+if (PUBSUB_PSA_ZMQ)
+    find_package(ZMQ REQUIRED)
+    find_package(CZMQ REQUIRED)
+    find_package(UUID REQUIRED)
 
-set(OPTIONAL_OPENSSL_LIB )
-if (BUILD_ZMQ_SECURITY)
-    add_definitions(-DBUILD_WITH_ZMQ_SECURITY=1)
+    set(OPTIONAL_OPENSSL_LIB )
+    # FIXME: ZMQ_SECURITY doesn't compile now
+    option(BUILD_ZMQ_SECURITY "Build with security for ZeroMQ." OFF)
+    if (BUILD_ZMQ_SECURITY)
+        add_definitions(-DBUILD_WITH_ZMQ_SECURITY=1)
 
-    find_package(OpenSSL 1.1.0 REQUIRED)
-    include_directories("${OPENSSL_INCLUDE_DIR}")
-    set(OPTIONAL_OPENSSL_LIB OpenSSL::SSL)
+        find_package(OpenSSL 1.1.0 REQUIRED)
+        include_directories("${OPENSSL_INCLUDE_DIR}")
+        set(OPTIONAL_OPENSSL_LIB OpenSSL::SSL)
 
-    set (ZMQ_CRYPTO_C "src/zmq_crypto.c")
-endif()
+        set (ZMQ_CRYPTO_C "src/zmq_crypto.c")
+    endif()
 
-add_celix_bundle(celix_pubsub_admin_zmq
-    BUNDLE_SYMBOLICNAME "apache_celix_pubsub_admin_zmq"
-    VERSION "2.0.0"
-    GROUP "Celix/PubSub"
-    SOURCES
-        src/psa_activator.c
-        src/pubsub_zmq_admin.c
-        src/pubsub_zmq_topic_sender.c
-        src/pubsub_zmq_topic_receiver.c
-        ${ZMQ_CRYPTO_C}
-)
+    add_celix_bundle(celix_pubsub_admin_zmq
+            BUNDLE_SYMBOLICNAME "apache_celix_pubsub_admin_zmq"
+            VERSION "2.0.0"
+            GROUP "Celix/PubSub"
+            SOURCES
+            src/psa_activator.c
+            src/pubsub_zmq_admin.c
+            src/pubsub_zmq_topic_sender.c
+            src/pubsub_zmq_topic_receiver.c
+            ${ZMQ_CRYPTO_C}
+            )
 
-target_link_libraries(celix_pubsub_admin_zmq PRIVATE
-        Celix::framework Celix::dfi Celix::log_helper Celix::utils
-        ZMQ::lib CZMQ::lib ${OPTIONAL_OPENSSL_LIB})
-target_link_libraries(celix_pubsub_admin_zmq PRIVATE Celix::shell_api)
-target_link_libraries(celix_pubsub_admin_zmq PRIVATE Celix::pubsub_spi Celix::pubsub_utils )
-target_include_directories(celix_pubsub_admin_zmq PRIVATE src)
-install_celix_bundle(celix_pubsub_admin_zmq EXPORT celix COMPONENT pubsub)
-add_library(Celix::celix_pubsub_admin_zmq ALIAS celix_pubsub_admin_zmq)
+    target_link_libraries(celix_pubsub_admin_zmq PRIVATE
+            Celix::framework Celix::dfi Celix::log_helper Celix::utils
+            ZMQ::lib CZMQ::lib ${OPTIONAL_OPENSSL_LIB})
+    target_link_libraries(celix_pubsub_admin_zmq PRIVATE Celix::shell_api)
+    target_link_libraries(celix_pubsub_admin_zmq PRIVATE Celix::pubsub_spi Celix::pubsub_utils)
+    target_include_directories(celix_pubsub_admin_zmq PRIVATE src)
+    install_celix_bundle(celix_pubsub_admin_zmq EXPORT celix COMPONENT pubsub)
+    add_library(Celix::celix_pubsub_admin_zmq ALIAS celix_pubsub_admin_zmq)
+endif (PUBSUB_PSA_ZMQ)
diff --git a/bundles/pubsub/pubsub_api/CMakeLists.txt b/bundles/pubsub/pubsub_api/CMakeLists.txt
index 336ba5e..3269e25 100644
--- a/bundles/pubsub/pubsub_api/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_api/CMakeLists.txt
@@ -20,13 +20,12 @@ add_library(pubsub_api INTERFACE)
 
 target_include_directories(pubsub_api INTERFACE
     $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-    $<INSTALL_INTERFACE:include/celix/pubsub>
-    $<INSTALL_INTERFACE:include/celix>
 )
 
 #install api
-install(TARGETS pubsub_api EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT pubsub)
-install(DIRECTORY include/ DESTINATION include/celix/pubsub COMPONENT pubsub)
+install(TARGETS pubsub_api EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT pubsub
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/pubsub)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/pubsub COMPONENT pubsub)
 
 #Setup target aliases to match external usage
 add_library(Celix::pubsub_api ALIAS pubsub_api)
diff --git a/bundles/pubsub/pubsub_discovery/CMakeLists.txt b/bundles/pubsub/pubsub_discovery/CMakeLists.txt
index 8dab81c..fafa1bb 100644
--- a/bundles/pubsub/pubsub_discovery/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_discovery/CMakeLists.txt
@@ -15,25 +15,28 @@
 # specific language governing permissions and limitations
 # under the License.
 
-find_package(CURL REQUIRED)
-find_package(Jansson REQUIRED)
+celix_subproject(PUBSUB_DISCOVERY_ETCD "Option to enable building the PubSub Discovery (ETCD) bundle" ON DEPS CELIX_ETCDLIB)
+if (PUBSUB_DISCOVERY_ETCD)
+    find_package(CURL REQUIRED)
+    find_package(Jansson REQUIRED)
 
-add_celix_bundle(celix_pubsub_discovery_etcd
-    BUNDLE_SYMBOLICNAME "apache_celix_pubsub_discovery_etcd"
-    VERSION "1.1.0"
-    GROUP "Celix/PubSub"
-    SOURCES
-        src/psd_activator.c
-        src/pubsub_discovery_impl.c
-)
-target_include_directories(celix_pubsub_discovery_etcd PRIVATE src)
-target_link_libraries(celix_pubsub_discovery_etcd PRIVATE
-    Celix::framework Celix::etcdlib_static
-    Celix::shell_api Celix::log_helper
-    CURL::libcurl Jansson
-)
-target_link_libraries(celix_pubsub_discovery_etcd PRIVATE Celix::pubsub_spi Celix::pubsub_utils )
+    add_celix_bundle(celix_pubsub_discovery_etcd
+            BUNDLE_SYMBOLICNAME "apache_celix_pubsub_discovery_etcd"
+            VERSION "1.1.0"
+            GROUP "Celix/PubSub"
+            SOURCES
+            src/psd_activator.c
+            src/pubsub_discovery_impl.c
+            )
+    target_include_directories(celix_pubsub_discovery_etcd PRIVATE src)
+    target_link_libraries(celix_pubsub_discovery_etcd PRIVATE
+            Celix::framework Celix::etcdlib_static
+            Celix::shell_api Celix::log_helper
+            CURL::libcurl Jansson
+            )
+    target_link_libraries(celix_pubsub_discovery_etcd PRIVATE Celix::pubsub_spi Celix::pubsub_utils)
 
-install_celix_bundle(celix_pubsub_discovery_etcd EXPORT celix COMPONENT pubsub)
+    install_celix_bundle(celix_pubsub_discovery_etcd EXPORT celix COMPONENT pubsub)
 
-add_library(Celix::celix_pubsub_discovery_etcd ALIAS celix_pubsub_discovery_etcd)
+    add_library(Celix::celix_pubsub_discovery_etcd ALIAS celix_pubsub_discovery_etcd)
+endif ()
diff --git a/bundles/pubsub/pubsub_serializer_avrobin/gtest/CMakeLists.txt b/bundles/pubsub/pubsub_serializer_avrobin/gtest/CMakeLists.txt
index 8f764d4..bb6cf73 100644
--- a/bundles/pubsub/pubsub_serializer_avrobin/gtest/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_serializer_avrobin/gtest/CMakeLists.txt
@@ -26,7 +26,7 @@ add_executable(test_pubsub_serializer_avrobin
 )
 target_link_libraries(test_pubsub_serializer_avrobin PRIVATE Celix::framework Celix::dfi Celix::pubsub_utils GTest::gtest GTest::gtest_main Celix::pubsub_spi)
 
-add_dependencies(test_pubsub_serializer_avrobin celix_pubsub_serializer_avrobin_bundle pubsub_avrobin_serialization_descriptor_bundle)
+add_celix_bundle_dependencies(test_pubsub_serializer_avrobin celix_pubsub_serializer_avrobin pubsub_avrobin_serialization_descriptor)
 target_compile_definitions(test_pubsub_serializer_avrobin PRIVATE -DSERIALIZATION_BUNDLE=\"$<TARGET_PROPERTY:celix_pubsub_serializer_avrobin,BUNDLE_FILE>\")
 target_compile_definitions(test_pubsub_serializer_avrobin PRIVATE -DDESCRIPTOR_BUNDLE=\"$<TARGET_PROPERTY:pubsub_avrobin_serialization_descriptor,BUNDLE_FILE>\")
 
diff --git a/bundles/pubsub/pubsub_serializer_json/CMakeLists.txt b/bundles/pubsub/pubsub_serializer_json/CMakeLists.txt
index 2b295f1..2073f0c 100644
--- a/bundles/pubsub/pubsub_serializer_json/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_serializer_json/CMakeLists.txt
@@ -32,7 +32,7 @@ target_include_directories(celix_pubsub_serializer_json PRIVATE
 )
 set_target_properties(celix_pubsub_serializer_json PROPERTIES INSTALL_RPATH "$ORIGIN")
 target_link_libraries(celix_pubsub_serializer_json PRIVATE Celix::framework Celix::dfi Jansson Celix::log_helper)
-target_link_libraries(celix_pubsub_serializer_json PRIVATE Celix::pubsub_spi Celix::pubsub_utils )
+target_link_libraries(celix_pubsub_serializer_json PRIVATE Celix::pubsub_spi Celix::pubsub_utils)
 
 install_celix_bundle(celix_pubsub_serializer_json EXPORT celix COMPONENT pubsub)
 
diff --git a/bundles/pubsub/pubsub_serializer_json/gtest/CMakeLists.txt b/bundles/pubsub/pubsub_serializer_json/gtest/CMakeLists.txt
index 60b5626..062d6cb 100644
--- a/bundles/pubsub/pubsub_serializer_json/gtest/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_serializer_json/gtest/CMakeLists.txt
@@ -26,7 +26,7 @@ add_executable(test_pubsub_serializer_json
 )
 target_link_libraries(test_pubsub_serializer_json PRIVATE Celix::framework Celix::dfi Celix::pubsub_utils GTest::gtest GTest::gtest_main Celix::pubsub_spi)
 
-add_dependencies(test_pubsub_serializer_json celix_pubsub_serializer_json_bundle pubsub_json_serialization_descriptor_bundle)
+add_celix_bundle_dependencies(test_pubsub_serializer_json celix_pubsub_serializer_json pubsub_json_serialization_descriptor)
 target_compile_definitions(test_pubsub_serializer_json PRIVATE -DSERIALIZATION_BUNDLE=\"$<TARGET_PROPERTY:celix_pubsub_serializer_json,BUNDLE_FILE>\")
 target_compile_definitions(test_pubsub_serializer_json PRIVATE -DDESCRIPTOR_BUNDLE=\"$<TARGET_PROPERTY:pubsub_json_serialization_descriptor,BUNDLE_FILE>\")
 
diff --git a/bundles/pubsub/pubsub_spi/CMakeLists.txt b/bundles/pubsub/pubsub_spi/CMakeLists.txt
index 8d1c340..465fea8 100644
--- a/bundles/pubsub/pubsub_spi/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_spi/CMakeLists.txt
@@ -25,15 +25,15 @@ add_library(pubsub_spi STATIC
 
 set_target_properties(pubsub_spi PROPERTIES OUTPUT_NAME "celix_pubsub_spi")
 target_include_directories(pubsub_spi PUBLIC
-        $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-        $<INSTALL_INTERFACE:include/celix/pubsub_spi>)
+        $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>)
 
 target_link_libraries(pubsub_spi PUBLIC Celix::framework Celix::pubsub_api)
 target_link_libraries(pubsub_spi PUBLIC Celix::pubsub_utils )
 add_library(Celix::pubsub_spi ALIAS pubsub_spi)
 
-install(TARGETS pubsub_spi EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT pubsub)
-install(DIRECTORY include/ DESTINATION include/celix/pubsub_spi COMPONENT pubsub)
+install(TARGETS pubsub_spi EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT pubsub
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/pubsub_spi)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/pubsub_spi COMPONENT pubsub)
 
 
 if (ENABLE_TESTING)
diff --git a/bundles/pubsub/pubsub_utils/CMakeLists.txt b/bundles/pubsub/pubsub_utils/CMakeLists.txt
index 0c285aa..21374ee 100644
--- a/bundles/pubsub/pubsub_utils/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_utils/CMakeLists.txt
@@ -26,15 +26,15 @@ add_library(pubsub_utils STATIC
 set_target_properties(pubsub_utils PROPERTIES OUTPUT_NAME "celix_pubsub_utils")
 target_include_directories(pubsub_utils PUBLIC
         $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-        $<INSTALL_INTERFACE:include/celix/pubsub_utils>
 )
 target_link_libraries(pubsub_utils PUBLIC Celix::framework Celix::pubsub_api Celix::log_helper Celix::shell_api)
 target_link_libraries(pubsub_utils PRIVATE Celix::pubsub_spi)
 
 add_library(Celix::pubsub_utils ALIAS pubsub_utils)
 
-install(TARGETS pubsub_utils EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT pubsub)
-install(DIRECTORY include/ DESTINATION include/celix/pubsub_utils COMPONENT pubsub)
+install(TARGETS pubsub_utils EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT pubsub
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/pubsub_utils)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/pubsub_utils COMPONENT pubsub)
 
 if (ENABLE_TESTING)
     add_subdirectory(gtest)
diff --git a/bundles/pubsub/pubsub_utils/gtest/CMakeLists.txt b/bundles/pubsub/pubsub_utils/gtest/CMakeLists.txt
index ac8cdb8..a16d29f 100644
--- a/bundles/pubsub/pubsub_utils/gtest/CMakeLists.txt
+++ b/bundles/pubsub/pubsub_utils/gtest/CMakeLists.txt
@@ -54,7 +54,6 @@ add_executable(test_pubsub_utils
 target_link_libraries(test_pubsub_utils PRIVATE Celix::framework Celix::pubsub_utils GTest::gtest GTest::gtest_main Celix::pubsub_spi)
 add_test(NAME test_pubsub_utils COMMAND test_pubsub_utils)
 setup_target_for_coverage(test_pubsub_utils SCAN_DIR ..)
-
-add_dependencies(test_pubsub_utils pubsub_serialization_matching_descriptors pubsub_serialization_provider_descriptors_bundle)
+add_celix_bundle_dependencies(test_pubsub_utils pubsub_serialization_matching_descriptors pubsub_serialization_provider_descriptors)
 target_compile_definitions(test_pubsub_utils PRIVATE -DDESCRIPTOR_BUNDLE=\"$<TARGET_PROPERTY:pubsub_serialization_provider_descriptors,BUNDLE_FILE>\")
 target_compile_definitions(test_pubsub_utils PRIVATE -DMATCHING_BUNDLE=\"$<TARGET_PROPERTY:pubsub_serialization_matching_descriptors,BUNDLE_FILE>\")
\ No newline at end of file
diff --git a/bundles/remote_services/CMakeLists.txt b/bundles/remote_services/CMakeLists.txt
index 94fee52..6c72db2 100644
--- a/bundles/remote_services/CMakeLists.txt
+++ b/bundles/remote_services/CMakeLists.txt
@@ -19,30 +19,25 @@ celix_subproject(REMOTE_SERVICE_ADMIN "Option to enable building the Remote Serv
 if (REMOTE_SERVICE_ADMIN)
 
     add_subdirectory(remote_services_api)
-    add_subdirectory(examples)
     add_subdirectory(deprecated_rsa_spi)
     add_subdirectory(rsa_common)
     add_subdirectory(civetweb)
-    add_subdirectory(topology_manager)
     add_subdirectory(discovery_common)
     add_subdirectory(discovery_configured)
     add_subdirectory(discovery_etcd)
+    add_subdirectory(examples)
+    add_subdirectory(topology_manager)
     add_subdirectory(remote_service_admin_dfi)
 
-    if (APPLE)
-        set(RSA_SHM_DEFAULT_ENABLED OFF)
-    else ()
-        set(RSA_SHM_DEFAULT_ENABLED ON)
-    endif ()
-
-    celix_subproject(RSA_SHM "Option to enable building the Discovery (SHM) bundle" ${RSA_SHM_DEFAULT_ENABLED})
+    celix_subproject(RSA_SHM "Option to enable building the Discovery (SHM) bundle" OFF)
     if (RSA_SHM)
         add_subdirectory(discovery_shm)
-        #TODO refactor shm rsa to use dfi
+        # TODO refactor shm rsa to use dfi
+        # TODO make it work on Apple
         #add_subdirectory(remote_service_admin_shm)
     endif ()
 
-    if (BUILD_RSA_DISCOVERY_ETCD AND BUILD_RSA_REMOTE_SERVICE_ADMIN_DFI)
+    if (BUILD_RSA_DISCOVERY_ETCD AND BUILD_RSA_REMOTE_SERVICE_ADMIN_DFI AND BUILD_SHELL AND BUILD_SHELL_TUI AND BUILD_LOG_SERVICE)
         add_celix_container(remote-services-dfi
                 NAME "server"
                 GROUP "remote-services/remote-services-dfi"
diff --git a/bundles/remote_services/deprecated_rsa_spi/CMakeLists.txt b/bundles/remote_services/deprecated_rsa_spi/CMakeLists.txt
index eeeb100..eac0621 100644
--- a/bundles/remote_services/deprecated_rsa_spi/CMakeLists.txt
+++ b/bundles/remote_services/deprecated_rsa_spi/CMakeLists.txt
@@ -18,12 +18,12 @@
 add_library(deprecated_rsa_spi INTERFACE)
 target_include_directories(deprecated_rsa_spi INTERFACE
     $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-    $<INSTALL_INTERFACE:include/celix/rsa>
 )
 target_link_libraries(deprecated_rsa_spi INTERFACE Celix::remote_services_api)
 
-install(TARGETS deprecated_rsa_spi EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT rsa)
-install(DIRECTORY include/ DESTINATION include/celix/rsa COMPONENT rsa)
+install(TARGETS deprecated_rsa_spi EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT rsa
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/rsa)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/rsa COMPONENT rsa)
 
 #Setup target aliases to match external usage
 add_library(Celix::deprecated_rsa_spi ALIAS deprecated_rsa_spi)
diff --git a/bundles/remote_services/discovery_configured/CMakeLists.txt b/bundles/remote_services/discovery_configured/CMakeLists.txt
index 522840d..1c2fec7 100644
--- a/bundles/remote_services/discovery_configured/CMakeLists.txt
+++ b/bundles/remote_services/discovery_configured/CMakeLists.txt
@@ -15,25 +15,28 @@
 # specific language governing permissions and limitations
 # under the License.
 
-find_package(CURL REQUIRED)
-find_package(LibXml2 REQUIRED)
+celix_subproject(RSA_DISCOVERY_CONFIGURED "Option to enable building the Discovery (Configured) bundle" ON)
+if (RSA_DISCOVERY_CONFIGURED)
+    find_package(CURL REQUIRED)
+    find_package(LibXml2 REQUIRED)
 
-add_celix_bundle(rsa_discovery
-    VERSION 0.9.0
-    SYMBOLIC_NAME "apache_celix_rsa_discovery"
-    NAME "Apache Celix RSA Configured Discovery"
-    SOURCES
-        src/discovery_impl.c
-        $<TARGET_OBJECTS:Celix::rsa_discovery_common>
-        $<TARGET_OBJECTS:Celix::civetweb>
-)
-target_include_directories(rsa_discovery PRIVATE
-        src
-        $<TARGET_PROPERTY:Celix::rsa_discovery_common,INCLUDE_DIRECTORIES>
-        $<TARGET_PROPERTY:Celix::civetweb,INCLUDE_DIRECTORIES>
-)
-target_link_libraries(rsa_discovery PRIVATE CURL::libcurl ${LIBXML2_LIBRARIES} Celix::log_helper Celix::rsa_common)
+    add_celix_bundle(rsa_discovery
+            VERSION 0.9.0
+            SYMBOLIC_NAME "apache_celix_rsa_discovery"
+            NAME "Apache Celix RSA Configured Discovery"
+            SOURCES
+            src/discovery_impl.c
+            $<TARGET_OBJECTS:Celix::rsa_discovery_common>
+            $<TARGET_OBJECTS:Celix::civetweb>
+            )
+    target_include_directories(rsa_discovery PRIVATE
+            src
+            $<TARGET_PROPERTY:Celix::rsa_discovery_common,INCLUDE_DIRECTORIES>
+            $<TARGET_PROPERTY:Celix::civetweb,INCLUDE_DIRECTORIES>
+            )
+    target_link_libraries(rsa_discovery PRIVATE CURL::libcurl ${LIBXML2_LIBRARIES} Celix::log_helper Celix::rsa_common)
 
-install_celix_bundle(rsa_discovery EXPORT celix COMPONENT rsa)
-#Setup target aliases to match external usage
-add_library(Celix::rsa_discovery ALIAS rsa_discovery)
+    install_celix_bundle(rsa_discovery EXPORT celix COMPONENT rsa)
+    #Setup target aliases to match external usage
+    add_library(Celix::rsa_discovery ALIAS rsa_discovery)
+endif (RSA_DISCOVERY_CONFIGURED)
diff --git a/bundles/remote_services/discovery_etcd/CMakeLists.txt b/bundles/remote_services/discovery_etcd/CMakeLists.txt
index c0bbba3..6fc76f9 100644
--- a/bundles/remote_services/discovery_etcd/CMakeLists.txt
+++ b/bundles/remote_services/discovery_etcd/CMakeLists.txt
@@ -15,33 +15,36 @@
 # specific language governing permissions and limitations
 # under the License.
 
-find_package(CURL REQUIRED)
-find_package(LibXml2 REQUIRED)
-find_package(Jansson REQUIRED)
+celix_subproject(RSA_DISCOVERY_ETCD "Option to enable building the Discovery (ETCD) bundle" ON DEPS CELIX_ETCDLIB)
+if (RSA_DISCOVERY_ETCD)
+	find_package(CURL REQUIRED)
+	find_package(LibXml2 REQUIRED)
+	find_package(Jansson REQUIRED)
 
-add_celix_bundle(rsa_discovery_etcd
-	VERSION 0.9.0
-	SYMBOLIC_NAME "apache_celix_rsa_discovery_etcd"
-	NAME "Apache Celix RSA Discovery ETCD"
-	GROUP "Celix/RSA"
-	SOURCES
-		src/discovery_impl.c
-		src/etcd_watcher.c
-		$<TARGET_OBJECTS:Celix::rsa_discovery_common>
-		$<TARGET_OBJECTS:Celix::civetweb>
-)
-target_link_libraries(rsa_discovery_etcd PRIVATE Celix::log_helper Celix::etcdlib_static Celix::rsa_common)
-target_include_directories(rsa_discovery_etcd PRIVATE src)
-target_include_directories(rsa_discovery_etcd PRIVATE
-		$<TARGET_PROPERTY:Celix::rsa_discovery_common,INCLUDE_DIRECTORIES>
-		$<TARGET_PROPERTY:Celix::civetweb,INCLUDE_DIRECTORIES>
-)
+	add_celix_bundle(rsa_discovery_etcd
+			VERSION 0.9.0
+			SYMBOLIC_NAME "apache_celix_rsa_discovery_etcd"
+			NAME "Apache Celix RSA Discovery ETCD"
+			GROUP "Celix/RSA"
+			SOURCES
+			src/discovery_impl.c
+			src/etcd_watcher.c
+			$<TARGET_OBJECTS:Celix::rsa_discovery_common>
+			$<TARGET_OBJECTS:Celix::civetweb>
+			)
+	target_link_libraries(rsa_discovery_etcd PRIVATE Celix::log_helper Celix::etcdlib_static Celix::rsa_common)
+	target_include_directories(rsa_discovery_etcd PRIVATE src)
+	target_include_directories(rsa_discovery_etcd PRIVATE
+			$<TARGET_PROPERTY:Celix::rsa_discovery_common,INCLUDE_DIRECTORIES>
+			$<TARGET_PROPERTY:Celix::civetweb,INCLUDE_DIRECTORIES>
+			)
 	target_include_directories(rsa_discovery_etcd SYSTEM PRIVATE
-		${CURL_INCLUDE_DIR}
-		${LIBXML2_INCLUDE_DIR}
-)
-target_link_libraries(rsa_discovery_etcd PRIVATE CURL::libcurl ${LIBXML2_LIBRARIES} Jansson)
+			${CURL_INCLUDE_DIR}
+			${LIBXML2_INCLUDE_DIR}
+			)
+	target_link_libraries(rsa_discovery_etcd PRIVATE CURL::libcurl ${LIBXML2_LIBRARIES} Jansson)
 
-install_celix_bundle(rsa_discovery_etcd EXPORT celix COMPONENT rsa)
-#Setup target aliases to match external usage
-add_library(Celix::rsa_discovery_etcd ALIAS rsa_discovery_etcd)
+	install_celix_bundle(rsa_discovery_etcd EXPORT celix COMPONENT rsa)
+	#Setup target aliases to match external usage
+	add_library(Celix::rsa_discovery_etcd ALIAS rsa_discovery_etcd)
+endif (RSA_DISCOVERY_ETCD)
diff --git a/bundles/remote_services/examples/interceptors/CMakeLists.txt b/bundles/remote_services/examples/interceptors/CMakeLists.txt
index 0b9cb35..db7257d 100644
--- a/bundles/remote_services/examples/interceptors/CMakeLists.txt
+++ b/bundles/remote_services/examples/interceptors/CMakeLists.txt
@@ -24,5 +24,5 @@ add_celix_bundle(celix_remote_interceptors_example
         src/second_interceptor.c
 )
 
-target_link_libraries(celix_remote_interceptors_example PRIVATE Celix::framework Celix::rsa_common)
+target_link_libraries(celix_remote_interceptors_example PRIVATE Celix::framework Celix::deprecated_rsa_spi)
 target_include_directories(celix_remote_interceptors_example PRIVATE include)
\ No newline at end of file
diff --git a/bundles/remote_services/remote_service_admin_dfi/CMakeLists.txt b/bundles/remote_services/remote_service_admin_dfi/CMakeLists.txt
index 2edaef1..251de6e 100644
--- a/bundles/remote_services/remote_service_admin_dfi/CMakeLists.txt
+++ b/bundles/remote_services/remote_service_admin_dfi/CMakeLists.txt
@@ -15,38 +15,40 @@
 # specific language governing permissions and limitations
 # under the License.
 
-find_package(CURL REQUIRED)
-find_package(Jansson REQUIRED)
-find_package(UUID REQUIRED)
+celix_subproject(RSA_REMOTE_SERVICE_ADMIN_DFI "Option to enable building the Remote Service Admin Service DFI" ON)
+if (RSA_REMOTE_SERVICE_ADMIN_DFI)
+    find_package(CURL REQUIRED)
+    find_package(Jansson REQUIRED)
+    find_package(UUID REQUIRED)
 
-add_celix_bundle(rsa_dfi
-        VERSION 0.9.0
-        SYMBOLIC_NAME "apache_celix_remote_service_admin_dfi"
-        NAME "Apache Celix Remote Service Admin Dynamic Function Interface (DFI)"
-        GROUP "Celix/RSA"
-        SOURCES
-        src/remote_service_admin_dfi.c
-        src/remote_service_admin_activator.c
-        src/export_registration_dfi.c
-        src/import_registration_dfi.c
-        src/dfi_utils.c
-        $<TARGET_OBJECTS:Celix::civetweb>
-)
-celix_bundle_private_libs(rsa_dfi Celix::dfi)
-target_include_directories(rsa_dfi PRIVATE $<TARGET_PROPERTY:Celix::civetweb,INCLUDE_DIRECTORIES>)
-target_link_libraries(rsa_dfi PRIVATE
-        Celix::dfi
-        Celix::log_helper
-        Celix::rsa_common
-        CURL::libcurl
-        Jansson
-)
-
-if (ENABLE_TESTING)
-    add_subdirectory(gtest)
-endif()
+    add_celix_bundle(rsa_dfi
+            VERSION 0.9.0
+            SYMBOLIC_NAME "apache_celix_remote_service_admin_dfi"
+            NAME "Apache Celix Remote Service Admin Dynamic Function Interface (DFI)"
+            GROUP "Celix/RSA"
+            SOURCES
+            src/remote_service_admin_dfi.c
+            src/remote_service_admin_activator.c
+            src/export_registration_dfi.c
+            src/import_registration_dfi.c
+            src/dfi_utils.c
+            $<TARGET_OBJECTS:Celix::civetweb>
+            )
+    celix_bundle_private_libs(rsa_dfi Celix::dfi)
+    target_include_directories(rsa_dfi PRIVATE $<TARGET_PROPERTY:Celix::civetweb,INCLUDE_DIRECTORIES>)
+    target_link_libraries(rsa_dfi PRIVATE
+            Celix::dfi
+            Celix::log_helper
+            Celix::rsa_common
+            CURL::libcurl
+            Jansson
+            )
 
+    install_celix_bundle(rsa_dfi EXPORT celix COMPONENT rsa)
+    #Setup target aliases to match external usage
+    add_library(Celix::rsa_dfi ALIAS rsa_dfi)
 
-install_celix_bundle(rsa_dfi EXPORT celix COMPONENT rsa)
-#Setup target aliases to match external usage
-add_library(Celix::rsa_dfi ALIAS rsa_dfi)
+    if (ENABLE_TESTING)
+        add_subdirectory(gtest)
+    endif()
+endif()
diff --git a/bundles/remote_services/remote_service_admin_dfi/gtest/CMakeLists.txt b/bundles/remote_services/remote_service_admin_dfi/gtest/CMakeLists.txt
index aa33865..6793eeb 100644
--- a/bundles/remote_services/remote_service_admin_dfi/gtest/CMakeLists.txt
+++ b/bundles/remote_services/remote_service_admin_dfi/gtest/CMakeLists.txt
@@ -60,10 +60,10 @@ configure_file(server.properties.in server.properties)
 #add exception service interface descriptor
 configure_file(exception_test_service.descriptor exception_test_service.descriptor)
 
-add_dependencies(test_rsa_dfi
-        rsa_dfi_bundle #note depend on the target creating the bundle zip not the lib target
-        calculator_bundle
-        remote_example_service_bundle
+add_celix_bundle_dependencies(test_rsa_dfi
+        rsa_dfi #note depend on the target creating the bundle zip not the lib target
+        calculator
+        remote_example_service
 )
 
 add_test(NAME run_test_rsa_dfi COMMAND test_rsa_dfi)
diff --git a/bundles/remote_services/remote_services_api/CMakeLists.txt b/bundles/remote_services/remote_services_api/CMakeLists.txt
index a092f59..676c095 100644
--- a/bundles/remote_services/remote_services_api/CMakeLists.txt
+++ b/bundles/remote_services/remote_services_api/CMakeLists.txt
@@ -18,11 +18,11 @@
 add_library(remote_services_api INTERFACE)
 target_include_directories(remote_services_api INTERFACE
     $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-    $<INSTALL_INTERFACE:include/celix/remote_service_admin>
 )
 
-install(TARGETS remote_services_api EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT rsa)
-install(DIRECTORY include/ DESTINATION include/celix/remote_service_admin COMPONENT rsa)
+install(TARGETS remote_services_api EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT rsa
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/remote_service_admin)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/remote_service_admin COMPONENT rsa)
 
 #Setup target aliases to match external usage
 add_library(Celix::remote_services_api ALIAS remote_services_api)
diff --git a/bundles/remote_services/topology_manager/CMakeLists.txt b/bundles/remote_services/topology_manager/CMakeLists.txt
index c812ad0..52ad5fa 100644
--- a/bundles/remote_services/topology_manager/CMakeLists.txt
+++ b/bundles/remote_services/topology_manager/CMakeLists.txt
@@ -29,11 +29,12 @@ target_include_directories(rsa_topology_manager PRIVATE src)
 target_include_directories(rsa_topology_manager PRIVATE include)
 target_link_libraries(rsa_topology_manager PRIVATE Celix::log_helper Celix::deprecated_rsa_spi)
 
-if (ENABLE_TESTING)
-    find_package(Jansson REQUIRED)
-    add_subdirectory(tms_tst)
-endif (ENABLE_TESTING)
-
 install_celix_bundle(rsa_topology_manager EXPORT celix COMPONENT rsa)
 #Setup target aliases to match external usage
 add_library(Celix::rsa_topology_manager ALIAS rsa_topology_manager)
+
+if (ENABLE_TESTING AND BUILD_RSA_REMOTE_SERVICE_ADMIN_DFI)
+    find_package(Jansson REQUIRED)
+    add_subdirectory(tms_tst)
+endif ()
+
diff --git a/bundles/remote_services/topology_manager/tms_tst/CMakeLists.txt b/bundles/remote_services/topology_manager/tms_tst/CMakeLists.txt
index 2a7442d..a46b82b 100644
--- a/bundles/remote_services/topology_manager/tms_tst/CMakeLists.txt
+++ b/bundles/remote_services/topology_manager/tms_tst/CMakeLists.txt
@@ -41,7 +41,7 @@ target_link_libraries(test_tm_scoped PRIVATE
         Celix::rsa_common
 )
 
-add_dependencies(test_tm_scoped rsa_dfi_bundle rsa_topology_manager_bundle)
+add_celix_bundle_dependencies(test_tm_scoped Celix::rsa_dfi Celix::rsa_topology_manager)
 
 file(GENERATE 
     OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/config.properties"
diff --git a/bundles/shell/remote_shell/CMakeLists.txt b/bundles/shell/remote_shell/CMakeLists.txt
index 330715d..c302170 100644
--- a/bundles/shell/remote_shell/CMakeLists.txt
+++ b/bundles/shell/remote_shell/CMakeLists.txt
@@ -14,33 +14,35 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-celix_subproject(REMOTE_SHELL "Option to enable building the Remote Shell bundles" ON DEPS LAUNCHER SHELL_TUI)
+celix_subproject(REMOTE_SHELL "Option to enable building the Remote Shell bundles" ON SHELL)
 if (REMOTE_SHELL)
 
-    add_celix_bundle(remote_shell
-     	SYMBOLIC_NAME "apache_celix_remote_shell"
-     	VERSION "0.0.2"
-     	NAME "Apache Celix Remote Shell"
-		FILENAME celix_remote_shell
-		GROUP "Celix/Shell"
-		SOURCES
+	add_celix_bundle(remote_shell
+			SYMBOLIC_NAME "apache_celix_remote_shell"
+			VERSION "0.0.2"
+			NAME "Apache Celix Remote Shell"
+			FILENAME celix_remote_shell
+			GROUP "Celix/Shell"
+			SOURCES
 			src/activator.c
 			src/connection_listener.c
 			src/shell_mediator.c
 			src/remote_shell.c
-	)
+			)
 
 	target_include_directories(remote_shell PRIVATE src)
 	target_link_libraries(remote_shell PRIVATE Celix::log_helper)
 
-    include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
-    include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
-    
-    target_link_libraries(remote_shell PRIVATE Celix::shell_api)
+	include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
+	include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
 
-        install_celix_bundle(remote_shell EXPORT celix COMPONENT remote_shell)
+	target_link_libraries(remote_shell PRIVATE Celix::shell_api)
+
+	install_celix_bundle(remote_shell EXPORT celix COMPONENT remote_shell)
 	#Alias setup to match external usage
 	add_library(Celix::remote_shell ALIAS remote_shell)
 
-    add_celix_container("remote_shell_deploy" NAME "remote_shell"  BUNDLES Celix::shell Celix::remote_shell Celix::shell_tui Celix::log_admin)
+	if (BUILD_SHELL_TUI AND BUILD_LOG_SERVICE)
+		add_celix_container("remote_shell_deploy" NAME "remote_shell"  BUNDLES Celix::shell Celix::remote_shell Celix::shell_tui Celix::log_admin)
+	endif ()
 endif (REMOTE_SHELL)
diff --git a/bundles/shell/shell/CMakeLists.txt b/bundles/shell/shell/CMakeLists.txt
index 0d8ab19..3e72148 100644
--- a/bundles/shell/shell/CMakeLists.txt
+++ b/bundles/shell/shell/CMakeLists.txt
@@ -14,22 +14,25 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-celix_subproject(SHELL "Option to enable building the Shell bundles" ON DEPS LAUNCHER LOG_SERVICE)
-if (SHELL)
-	find_package(CURL REQUIRED)
 
-	add_library(shell_api INTERFACE)
-	target_include_directories(shell_api INTERFACE
-			$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
-			$<INSTALL_INTERFACE:include/celix/shell>
-	)
-	install(TARGETS shell_api EXPORT celix COMPONENT shell)
-	install(DIRECTORY api/ DESTINATION include/celix/shell COMPONENT shell)
+add_library(shell_api INTERFACE)
+target_include_directories(shell_api INTERFACE
+		$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
+		)
 
-	if (CELIX_INSTALL_DEPRECATED_API)
-		target_include_directories(shell_api INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/deprecated_api>)
-		install(DIRECTORY deprecated_api/ DESTINATION include/celix/shell COMPONENT shell)
-	endif ()
+if (CELIX_INSTALL_DEPRECATED_API)
+	target_include_directories(shell_api INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/deprecated_api>)
+	install(DIRECTORY deprecated_api/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/shell COMPONENT shell)
+endif ()
+
+install(TARGETS shell_api EXPORT celix COMPONENT shell
+		INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/shell)
+install(DIRECTORY api/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/shell COMPONENT shell)
+
+add_library(Celix::shell_api ALIAS shell_api)
+
+celix_subproject(SHELL "Option to enable building the Shell bundles" ON)
+if (SHELL)
 
 	add_library(shell_commands STATIC
 			src/lb_command.c
@@ -45,7 +48,7 @@ if (SHELL)
 			src/std_commands.c
 	)
 	target_include_directories(shell_commands PRIVATE src)
-	target_link_libraries(shell_commands PRIVATE Celix::shell_api Celix::log_service_api Celix::log_helper)
+	target_link_libraries(shell_commands PRIVATE Celix::shell_api Celix::log_helper)
 
     add_celix_bundle(shell
         SYMBOLIC_NAME "apache_celix_c_shell"
@@ -58,7 +61,7 @@ if (SHELL)
 			src/c_shell.c
 	)
 	target_include_directories(shell PRIVATE src)
-	target_link_libraries(shell PRIVATE shell_commands Celix::shell_api Celix::log_service_api Celix::log_helper)
+	target_link_libraries(shell PRIVATE shell_commands Celix::shell_api Celix::log_helper)
 	target_compile_options(shell PRIVATE -Wno-deprecated-declarations)
 	if (CELIX_INSTALL_DEPRECATED_API)
 		target_compile_definitions(shell PRIVATE CELIX_INSTALL_DEPRECATED_API)
@@ -66,7 +69,6 @@ if (SHELL)
 	install_celix_bundle(shell EXPORT celix COMPONENT shell)
 
 	#Setup target aliases to match external usage
-	add_library(Celix::shell_api ALIAS shell_api)
 	add_library(Celix::shell ALIAS shell)
 
 	if (CELIX_CXX)
diff --git a/bundles/shell/shell/gtest/CMakeLists.txt b/bundles/shell/shell/gtest/CMakeLists.txt
index 120c738..6950e70 100644
--- a/bundles/shell/shell/gtest/CMakeLists.txt
+++ b/bundles/shell/shell/gtest/CMakeLists.txt
@@ -20,7 +20,7 @@ add_executable(test_shell
 )
 
 target_link_libraries(test_shell PRIVATE Celix::framework Celix::shell_api GTest::gtest GTest::gtest_main)
-add_dependencies(test_shell shell_bundle)
+add_celix_bundle_dependencies(test_shell shell)
 target_compile_definitions(test_shell PRIVATE -DSHELL_BUNDLE_LOCATION=\"$<TARGET_PROPERTY:shell,BUNDLE_FILE>\")
 target_compile_options(test_shell PRIVATE -Wno-deprecated-declarations)
 if (CELIX_INSTALL_DEPRECATED_API)
@@ -36,7 +36,7 @@ add_executable(test_cxx_shell
 )
 
 target_link_libraries(test_cxx_shell PRIVATE Celix::framework Celix::shell_api GTest::gtest GTest::gtest_main)
-add_dependencies(test_cxx_shell ShellCxx_bundle)
+add_celix_bundle_dependencies(test_cxx_shell ShellCxx)
 target_compile_definitions(test_cxx_shell PRIVATE -DSHELL_BUNDLE_LOCATION=\"$<TARGET_PROPERTY:ShellCxx,BUNDLE_FILE>\")
 target_compile_definitions(test_cxx_shell PRIVATE -DCXX_SHELL)
 
diff --git a/bundles/shell/shell_bonjour/CMakeLists.txt b/bundles/shell/shell_bonjour/CMakeLists.txt
index 17f8e3e..fdb76b0 100644
--- a/bundles/shell/shell_bonjour/CMakeLists.txt
+++ b/bundles/shell/shell_bonjour/CMakeLists.txt
@@ -15,14 +15,15 @@
 # specific language governing permissions and limitations
 # under the License.
 
-celix_subproject(SHELL_BONJOUR "Option to enable building the Bonjour Shell (shell access by chat clients)" OFF DEPS LAUNCHER shell)
+celix_subproject(SHELL_BONJOUR "Option to enable building the Bonjour Shell (shell access by chat clients)" OFF DEPS SHELL)
 if (SHELL_BONJOUR)
 	message(WARNING "Celix::bonjour_shell is considered unstable, because develop of this bundle has been dormant for a while")
 	find_package(LibXml2 REQUIRED)
 	
 	#TODO create/add FindDNS_SD.cmake and use it (with required)
 	find_library(DNS_SD_LIB NAMES dns_sd dns_services)
-	
+	find_path(DNS_SD_INCLUDE_DIR dns_sd.h)
+
 	set(BUNDLE_SYMBOLICNAME "bonjour_shell")
 	set(BUNDLE_VERSION "0.1.0")
 	set(BUNDLE_NAME "bonjour_shell")
@@ -41,6 +42,7 @@ if (SHELL_BONJOUR)
 	target_include_directories(bonjour_shell PRIVATE
 			"${PROJECT_SOURCE_DIR}/utils/public/include"
 			"${LIBXML2_INCLUDE_DIR}"
+			"${DNS_SD_INCLUDE_DIR}"
 			private/include
 	)
 	target_link_libraries(bonjour_shell PRIVATE ${LIBXML2_LIBRARIES} ${DNS_SD_LIB} Celix::shell_api)
diff --git a/bundles/shell/shell_tui/CMakeLists.txt b/bundles/shell/shell_tui/CMakeLists.txt
index 1002a77..238e868 100644
--- a/bundles/shell/shell_tui/CMakeLists.txt
+++ b/bundles/shell/shell_tui/CMakeLists.txt
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-celix_subproject(SHELL_TUI "Option to enable building the Shell Textual User Interface bundles" ON DEPS LAUNCHER SHELL)
+celix_subproject(SHELL_TUI "Option to enable building the Shell Textual User Interface bundles" ON DEPS SHELL)
 if (SHELL_TUI)
 
     add_celix_bundle(shell_tui
@@ -37,7 +37,7 @@ if (SHELL_TUI)
 	#Alias setup to match external usage
 	add_library(Celix::shell_tui ALIAS shell_tui)
 
-	if (ENABLE_TESTING AND TARGET Celix::shell)
+	if (ENABLE_TESTING)
 		add_subdirectory(gtest)
 	endif()
 endif (SHELL_TUI)
diff --git a/bundles/shell/shell_wui/CMakeLists.txt b/bundles/shell/shell_wui/CMakeLists.txt
index 9ebc25c..482b74d 100644
--- a/bundles/shell/shell_wui/CMakeLists.txt
+++ b/bundles/shell/shell_wui/CMakeLists.txt
@@ -17,7 +17,6 @@
 celix_subproject(SHELL_WUI "Option to enable building the Shell Web User Interface bundles" ON DEPS SHELL HTTP_ADMIN)
 if (SHELL_WUI)
 
-
     add_celix_bundle(shell_wui
         SYMBOLIC_NAME "apache_celix_shell_wui"
         VERSION "1.0.0"
@@ -38,5 +37,4 @@ if (SHELL_WUI)
     #Alias setup to match external usage
     add_library(Celix::shell_wui ALIAS shell_wui)
 
-
 endif ()
\ No newline at end of file
diff --git a/cmake/CelixConfig.cmake b/cmake/CelixConfig.cmake
index e56039e..0766bed 100644
--- a/cmake/CelixConfig.cmake
+++ b/cmake/CelixConfig.cmake
@@ -50,7 +50,10 @@ set(CELIX_INCLUDE_DIRS
 set(CELIX_FRAMEWORK_LIBRARY Celix::framework)
 set(CELIX_UTILS_LIBRARY Celix::utils)
 set(CELIX_DFI_LIBRARY Celix::dfi)
-set(CELIX_LAUNCHER Celix::launcher)
+
+if (TARGET Celix::launcher)
+  set(CELIX_LAUNCHER Celix::launcher)
+endif ()
 
 if (TARGET Celix::etcdlib)
   set(CELIX_ETCD_INCLUDE_DIRS $<TARGET_PROPERTY:Celix::etcdlib,INTERFACE_INCLUDE_DIRECTORIES>)
@@ -80,16 +83,33 @@ find_dependency(LIBZIP) #Needed by utils
 find_dependency(Jansson) #Needed by dfi, etcdlib, remote services, pubsub
 find_dependency(FFI) #Needed by dfi
 
-if (TARGET Celix::dfi)
-  find_dependency(FFI)
-endif()
+if (NOT TARGET ZLIB::ZLIB)
+  #Note more recent zlib will create ZLIB::ZLIB target
+  message("Note ZLIB::ZLIB target not created by find_package(ZLIB). Creating ZLIB::ZLIB Target.")
+  add_library(ZLIB::ZLIB SHARED IMPORTED)
+  set_target_properties(ZLIB::ZLIB PROPERTIES
+          IMPORTED_LOCATION "${ZLIB_LIBRARIES}"
+          INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIRS}"
+          )
+endif ()
+
+if (NOT TARGET CURL::libcurl)
+  #Note more recent curl will create CURL::libcurl target
+  message("Note CURL::libcurl target not created by find_package(CURL). Creating CURL::libcurl Target.")
+  add_library(CURL::libcurl SHARED IMPORTED)
+  set_target_properties(CURL::libcurl PROPERTIES
+          IMPORTED_LOCATION "${CURL_LIBRARIES}"
+          INTERFACE_INCLUDE_DIRECTORIES "${CURL_INCLUDE_DIRS}"
+          )
+endif ()
+
 if (TARGET Celix::RsaConfiguredDiscovery)
   find_dependency(RapidJSON)
 endif ()
-if (TARGET Celix::rsa_discovery_common)
+if (TARGET Celix::rsa_discovery_common OR TARGET Celix::bonjour_shell)
   find_dependency(LibXml2)
 endif ()
-if (TARGET Celix::celix_pubsub_admin_zmq OR TARGET Celix::celix_pubsub_admin_zmq_v2)
+if (TARGET  Celix::celix_pubsub_admin_zmq OR TARGET Celix::celix_pubsub_admin_zmq_v2)
   find_dependency(ZMQ)
   find_dependency(CZMQ)
 endif ()
diff --git a/cmake/celix_project/CelixProject.cmake b/cmake/celix_project/CelixProject.cmake
index 8b2d06c..9581398 100644
--- a/cmake/celix_project/CelixProject.cmake
+++ b/cmake/celix_project/CelixProject.cmake
@@ -66,36 +66,17 @@ MACRO(celix_subproject)
     
     option(${NAME} "${OPTION_DESCRIPTION}" ${OPTION_DEFAULT})
     
-    get_property(BUILD GLOBAL PROPERTY ${NAME}_INTERNAL)
-    if (NOT DEFINED BUILD)
-        set(BUILD "OFF")
-    endif (NOT DEFINED BUILD)
-    
-    IF (${NAME} OR ${BUILD})
+    IF (${NAME})
         set(${OPTION_NAME} "ON")
-    	set_property(GLOBAL PROPERTY ${NAME}_INTERNAL "ON")
-    	
         FOREACH (DEP ${OPTION_DEPS})
             string(TOUPPER ${DEP} UC_DEP)
             set(DEP_NAME "BUILD_${UC_DEP}")
-            set_property(GLOBAL PROPERTY ${DEP_NAME}_INTERNAL "ON")
+            if (NOT ${DEP_NAME})
+                message(FATAL_ERROR "${DEP} is required by ${OPTION_NAME}: please add -D${DEP_NAME}:BOOL=ON")
+            endif ()
         ENDFOREACH (DEP)
-    ELSE (${NAME} OR ${BUILD})
-        set(${OPTION_NAME} "OFF")
-    ENDIF (${NAME} OR ${BUILD})
+    ENDIF (${NAME})
 ENDMACRO(celix_subproject)
 
-MACRO(is_enabled name)
-    string(TOUPPER "BUILD_${name}_INTERNAL" OPTION)
-    
-    get_property(BUILD GLOBAL PROPERTY ${OPTION})
-    
-    if(BUILD)
-        set(${name} "ON")
-    else()
-        set(${name} "OFF")
-    endif()
-ENDMACRO(is_enabled)
-
 include(${CMAKE_CURRENT_LIST_DIR}/ApacheRat.cmake)
 include(${CMAKE_CURRENT_LIST_DIR}/CodeCoverage.cmake)
diff --git a/cmake/cmake_celix/BundlePackaging.cmake b/cmake/cmake_celix/BundlePackaging.cmake
index 844625a..3b564c6 100644
--- a/cmake/cmake_celix/BundlePackaging.cmake
+++ b/cmake/cmake_celix/BundlePackaging.cmake
@@ -908,8 +908,9 @@ function(install_celix_bundle_targets)
 
     get_target_property(EXPORT_BUNDLES celix-bundles EXPORT_${EXPORT_NAME}_BUNDLES)
 
-    if (NOT DEFINED EXPORT_BUNDLES)
-        message(FATAL_ERROR "Export ${EXPORT_NAME} not defined. Did you forgot to use a install_celix_bundle with the 'EXPORT ${EXPORT_NAME}' option?")
+    if (NOT DEFINED EXPORT_BUNDLES OR NOT EXPORT_BUNDLES)
+        message("Export ${EXPORT_NAME} not defined. Did you forgot to use a install_celix_bundle with the 'EXPORT ${EXPORT_NAME}' option?")
+        set(EXPORT_BUNDLES "")
     endif ()
     if (NOT DEFINED EXPORT_NAMESPACE)
         message(FATAL_ERROR "Please provide a namespace used for the generated cmake targets.")
diff --git a/cmake/cmake_celix/ContainerPackaging.cmake b/cmake/cmake_celix/ContainerPackaging.cmake
index d034799..8a18082 100644
--- a/cmake/cmake_celix/ContainerPackaging.cmake
+++ b/cmake/cmake_celix/ContainerPackaging.cmake
@@ -277,11 +277,10 @@ $<JOIN:$<TARGET_PROPERTY:${CONTAINER_TARGET},CONTAINER_RUNTIME_PROPERTIES>,
     endif ()
 
     #needed in the release.sh & run.sh files
-    #Setting CELIX_LIB_DIRS, CELIX_BIN_DIR and CELIX_LAUNCHER
+    #Setting CELIX_LIB_DIRS
     if (TARGET Celix::framework)
         #Celix Main Project
         set(CELIX_LIB_DIRS "$<TARGET_FILE_DIR:Celix::framework>:$<TARGET_FILE_DIR:Celix::utils>:$<TARGET_FILE_DIR:Celix::dfi>")
-        set(CELIX_BIN_DIR  "$<TARGET_FILE_DIR:Celix::launcher>")
     else ()
 	message(FATAL_ERROR "No Celix::framework target is defined. Did you use find_package(Celix REQUIRED)?")
     endif()
diff --git a/conanfile.py b/conanfile.py
index d36e8a0..64d756f 100644
--- a/conanfile.py
+++ b/conanfile.py
@@ -18,7 +18,9 @@ class CelixConan(ConanFile):
     description = "Apache Celix is an implementation of the OSGi specification adapted to C and C++ (C++17). " \
                   "It is a framework to develop (dynamic) modular software applications " \
                   "using component and/or service-oriented programming."
-    # TODO: update according to latest codes
+
+    tool_requires = "cmake/3.17.5"
+
     options = {
         "enable_testing": [True, False],
         "enable_address_sanitizer": [True, False],
@@ -30,31 +32,32 @@ class CelixConan(ConanFile):
         "build_device_access": [True, False],
         "build_http_admin": [True, False],
         "build_log_service": [True, False],
-        "build_log_writer": [True, False],
-        "build_log_writer_syslog": [True, False],
+        "build_syslog_writer": [True, False],
         "build_pubsub": [True, False],
         "build_pubsub_psa_zmq": [True, False],
         "build_zmq_security": [True, False],
+        "build_pubsub_examples": [True, False],
+        "build_pubsub_integration": [True, False],
         "build_pubsub_psa_tcp": [True, False],
         "build_pubsub_psa_udp_mc": [True, False],
         "build_pubsub_psa_ws": [True, False],
-        "build_pubsub_tests": [True, False],
+        "build_pubsub_discovery_etcd": [True, False],
+        "build_cxx_remote_service_admin": [True, False],
+        "build_cxx_rsa_integration": [True, False],
         "build_remote_service_admin": [True, False],
         "build_rsa_remote_service_admin_dfi": [True, False],
         "build_rsa_discovery_configured": [True, False],
         "build_rsa_discovery_etcd": [True, False],
-        "build_rsa_discovery_shm": [True, False],
-        "build_rsa_topology_manager": [True, False],
-        "build_rsa_examples": [True, False],
         "build_shell": [True, False],
         "build_remote_shell": [True, False],
         "build_shell_bonjour": [True, False],
         "build_shell_tui": [True, False],
         "build_shell_wui": [True, False],
         "build_examples": [True, False],
+        "build_celix_etcdlib": [True, False],
         "build_launcher": [True, False],
-        "build_event_admin": [True, False],
-        "build_experimental": [True, False],
+        "build_promises": [True, False],
+        "build_pushstreams": [True, False],
         "celix_cxx": [True, False],
         "celix_install_deprecated_api": [True, False],
         "celix_add_deprecated_attributes": [True, False],
@@ -66,35 +69,36 @@ class CelixConan(ConanFile):
         "enable_code_coverage": False,
         "celix_add_openssl_dep": False,
         "build_deployment_admin": False,
-        "build_device_access": True,
+        "build_device_access": False,
         "build_device_access_example": False,
         "build_http_admin": True,
         "build_log_service": True,
-        "build_log_writer": True,
-        "build_log_writer_syslog": True,
+        "build_syslog_writer": True,
         "build_pubsub": True,
         "build_pubsub_psa_zmq": False,
         "build_zmq_security": False,
-        "build_pubsub_psa_tcp": True,
-        "build_pubsub_psa_udp_mc": True,
+        "build_pubsub_examples": False,
+        "build_pubsub_integration": False,
+        "build_pubsub_psa_tcp": False,
+        "build_pubsub_psa_udp_mc": False,
         "build_pubsub_psa_ws": True,
-        "build_pubsub_tests": False,
+        "build_pubsub_discovery_etcd": False,
+        "build_cxx_remote_service_admin": False,
+        "build_cxx_rsa_integration": False,
         "build_remote_service_admin": True,
         "build_rsa_remote_service_admin_dfi": True,
         "build_rsa_discovery_configured": True,
-        "build_rsa_discovery_etcd": True,
-        "build_rsa_discovery_shm": False,
-        "build_rsa_topology_manager": True,
-        "build_rsa_examples": True,
+        "build_rsa_discovery_etcd": False,
         "build_shell": True,
-        "build_remote_shell": True,
+        "build_remote_shell": False,
         "build_shell_bonjour": False,
-        "build_shell_tui": True,
+        "build_shell_tui": False,
         "build_shell_wui": False,
-        "build_examples": True,
-        "build_launcher": True,
-        "build_event_admin": False,
-        "build_experimental": False,
+        "build_examples": False,
+        "build_celix_etcdlib":  False,
+        "build_launcher": False,
+        "build_promises": False,
+        "build_pushstreams": False,
         "celix_cxx": False,
         "celix_install_deprecated_api": False,
         "celix_add_deprecated_attributes": True,
@@ -103,49 +107,70 @@ class CelixConan(ConanFile):
 
     def validate(self):
         if self.settings.os != "Linux" and self.settings.os != "Macos":
-            raise ConanInvalidConfiguration("Library MyLib is only supported for Linux")
+            raise ConanInvalidConfiguration("Celix is only supported for Linux/Macos")
+
+    def package_id(self):
+        del self.info.options.enable_testing
+        del self.info.options.celix_add_openssl_dep
+        del self.info.options.build_device_access_example
+        del self.info.options.build_pubsub_integration
+        del self.info.options.build_pubsub_examples
+        del self.info.options.build_cxx_rsa_integration
+        del self.info.options.build_examples
+
+    def build_requirements(self):
+        if self.options.enable_testing:
+            self.test_requires("gtest/1.10.0")
+            self.test_requires("cpputest/4.0")
 
     def configure(self):
+        if not self.options.celix_cxx:
+            self.options.build_cxx_remote_service_admin = False
+        if not self.options.build_cxx_remote_service_admin:
+            self.options.build_cxx_rsa_integration = False
         if not self.options.enable_testing:
-            self.options.build_pubsub_tests = False;
+            self.options.build_pubsub_integration = False
         if not self.options.build_device_access:
             self.options.build_device_access_example = False
-        if not self.options.build_log_writer:
-            self.options.build_log_writer_syslog = False
+        if not self.options.build_log_service:
+            self.options.build_syslog_writer = False
         if not self.options.build_pubsub:
             self.options.build_pubsub_psa_zmq = False
+            self.options.build_pubsub_examples = False
+            self.options.build_pubsub_integration = False
+            self.options.build_pubsub_psa_tcp = False
+            self.options.build_pubsub_psa_udp_mc = False
+            self.options.build_pubsub_psa_ws = False
+            self.options.build_pubsub_discovery_etcd = False
         if not self.options.build_pubsub_psa_zmq:
             self.options.build_zmq_security = False
         if not self.options.build_remote_service_admin:
             self.options.build_rsa_remote_service_admin_dfi = False
             self.options.build_rsa_discovery_configured = False
             self.options.build_rsa_discovery_etcd = False
-            self.options.build_rsa_discovery_shm = False
-            self.options.build_rsa_topology_manager = False
-            self.options.build_rsa_examples = False
         if not self.options.build_shell:
             self.options.build_remote_shell = False
             self.options.build_shell_bonjour = False
             self.options.build_shell_tui = False
             self.options.build_shell_wui = False
-        if not self.options.build_experimental:
-            self.options.build_event_admin = False
+        if not self.options.celix_install_deprecated_api:
+            self.options.build_shell_bonjour = False
 
     def requirements(self):
         # libffi/3.3@zhengpeng/testing is a workaround of the following buggy commit:
         # https://github.com/conan-io/conan-center-index/pull/5085#issuecomment-847487808
         #self.requires("libffi/3.3@zhengpeng/testing")
         self.requires("libffi/[~3.2.1]")
-        self.requires("jansson/[~2.12]")
-        self.requires("libcurl/[~7.64.1]")
-        self.requires("zlib/[~1.2.8]")
-        self.requires("libuuid/1.0.3")
-        self.requires("libzip/[~1.7.3]")
         self.options['libffi'].shared = True
+        self.requires("jansson/[~2.12]")
         self.options['jansson'].shared = True
+        self.requires("libcurl/[~7.64.1]")
         self.options['libcurl'].shared = True
+        self.requires("zlib/[~1.2.8]")
         self.options['zlib'].shared = True
+        self.requires("libuuid/1.0.3")
         self.options['libuuid'].shared = True
+        self.requires("libzip/[~1.7.3]")
         self.options['libzip'].shared = True
         self.options['openssl'].shared = True
         self.options['libxml2'].shared = True
@@ -156,6 +181,11 @@ class CelixConan(ConanFile):
             self.requires("openssl/1.1.1k")
         if self.options.build_remote_service_admin or self.options.build_shell_bonjour:
             self.requires("libxml2/[~2.9.9]")
+        if self.options.build_shell_bonjour:
+            # TODO: CC=cc is fixed in the official mdnsresponder Makefile, patching is needed to make cross-compile work
+            # https://github.com/conan-io/conan-center-index/issues/9711
+            # Another issue is in conan infrastructure: https://github.com/conan-io/conan-center-index/issues/9709
+            self.requires("mdnsresponder/1310.140.1")
         if self.options.build_pubsub_psa_zmq:
             self.requires("zeromq/4.3.2")
             self.options['zeromq'].shared = True
@@ -170,7 +200,8 @@ class CelixConan(ConanFile):
             self._cmake.definitions[opt.upper()] = self.options.get_safe(opt, False)
         self._cmake.definitions["CMAKE_PROJECT_Celix_INCLUDE"] = os.path.join(self.build_folder, "conan_paths.cmake")
         self.output.info(self._cmake.definitions)
-        self._cmake.configure()
+        v = tools.Version(self.version)
+        self._cmake.configure(defs={'CELIX_MAJOR': v.major, 'CELIX_MINOR': v.minor, 'CELIX_MICRO': v.patch})
         return self._cmake
 
     def build(self):
diff --git a/examples/celix-examples/CMakeLists.txt b/examples/celix-examples/CMakeLists.txt
index 090d524..0a983b9 100644
--- a/examples/celix-examples/CMakeLists.txt
+++ b/examples/celix-examples/CMakeLists.txt
@@ -16,7 +16,7 @@
 # under the License.
 
 if (COMMAND celix_subproject)
-    celix_subproject(EXAMPLES "Option to enable building the Examples" ON DEPS FRAMEWORK LAUNCHER SHELL_TUI LOG_SERVICE LOG_WRITER)
+    celix_subproject(EXAMPLES "Option to enable building the Examples" ON DEPS SHELL SHELL_TUI LOG_SERVICE)
 else ()
     set(EXAMPLES true) #celix_subproject is only available in the celix project -> using examples dir in other project is also supported
     option(CELIX_CXX ON)
diff --git a/libs/dependency_manager/CMakeLists.txt b/libs/dependency_manager/CMakeLists.txt
index 758cc49..cc4102b 100644
--- a/libs/dependency_manager/CMakeLists.txt
+++ b/libs/dependency_manager/CMakeLists.txt
@@ -19,7 +19,6 @@
 add_library(dependency_manager_static STATIC src/dm_activator.c)
 target_include_directories(dependency_manager_static PUBLIC
         $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
-        $<INSTALL_INTERFACE:include/celix>
 )
 if (APPLE)
     target_link_libraries(dependency_manager_static Celix::framework "-undefined dynamic_lookup")
@@ -30,7 +29,6 @@ endif()
 add_library(dependency_manager_so SHARED src/dm_activator.c)
 target_include_directories(dependency_manager_so PUBLIC
         $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
-        $<INSTALL_INTERFACE:include/celix>
 )
 if (APPLE)
     target_link_libraries(dependency_manager_so Celix::framework "-undefined dynamic_lookup")
@@ -47,5 +45,6 @@ add_library(Celix::dependency_manager_static ALIAS dependency_manager_static)
 add_library(Celix::dependency_manager_so ALIAS dependency_manager_so)
 
 #install dummy libs
-install(TARGETS dependency_manager_static dependency_manager_so dm_shell EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT framework)
+install(TARGETS dependency_manager_static dependency_manager_so dm_shell EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT framework
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix)
 
diff --git a/libs/dfi/CMakeLists.txt b/libs/dfi/CMakeLists.txt
index 136419f..f6f4d76 100644
--- a/libs/dfi/CMakeLists.txt
+++ b/libs/dfi/CMakeLists.txt
@@ -45,8 +45,9 @@ target_link_libraries(dfi PUBLIC Jansson)
 target_link_libraries(dfi PRIVATE Celix::utils)
 set_target_properties(dfi PROPERTIES "SOVERSION" 1)
 
-install(TARGETS dfi EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT dfi)
-install(DIRECTORY include/ DESTINATION include/celix/dfi COMPONENT dfi)
+install(TARGETS dfi EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT dfi
+		INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/dfi)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/dfi COMPONENT dfi)
 
 #Alias setup to match external usage
 add_library(Celix::dfi ALIAS dfi)
diff --git a/libs/etcdlib/CMakeLists.txt b/libs/etcdlib/CMakeLists.txt
index 0ddf91c..0d1c2d4 100644
--- a/libs/etcdlib/CMakeLists.txt
+++ b/libs/etcdlib/CMakeLists.txt
@@ -35,67 +35,60 @@ if (NOT COMMAND celix_subproject)
     set(CMAKE_EXE_LINKER_FLAGS "-pthread ${CMAKE_EXE_LINKER_FLAGS}")
 
     set(ETCDLIB_CMP ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME})
-else()
-    set(ETCDLIB_CMP framework)
-endif ()
 
-find_package(CURL REQUIRED)
-find_package(Jansson REQUIRED)
-
-if (NOT TARGET CURL::libcurl)
-    #Note more recent curl will create CURL::libcurl target
-    message("Note CURL::libcurl target not created by find_package(CURL). Creating CURL::libcurl Target.")
-    add_library(CURL::libcurl SHARED IMPORTED)
-    set_target_properties(CURL::libcurl PROPERTIES
-            IMPORTED_LOCATION "${CURL_LIBRARIES}"
-            INTERFACE_INCLUDE_DIRECTORIES "${CURL_INCLUDE_DIRS}"
-    )
-endif ()
+    find_package(CURL REQUIRED)
+    find_package(Jansson REQUIRED)
 
-if (NOT TARGET Jansson)
-    #Note if JanssonConfig is present on system this is not needed
-    message("Note Jansson target not created by find_package(Jansson). Creating Jansson Target.")
-    add_library(Jansson SHARED IMPORTED)
-    set_target_properties(Jansson PROPERTIES
-            IMPORTED_LOCATION "${JANSSON_LIBRARY}"
-            INTERFACE_INCLUDE_DIRECTORIES "${JANSSON_INCLUDE_DIR}"
-    )
+    if (NOT TARGET CURL::libcurl)
+        #Note more recent curl will create CURL::libcurl target
+        message("Note CURL::libcurl target not created by find_package(CURL). Creating CURL::libcurl Target.")
+        add_library(CURL::libcurl SHARED IMPORTED)
+        set_target_properties(CURL::libcurl PROPERTIES
+                IMPORTED_LOCATION "${CURL_LIBRARIES}"
+                INTERFACE_INCLUDE_DIRECTORIES "${CURL_INCLUDE_DIRS}"
+                )
+    endif ()
+    set(ETCDLIB_STANDALONE ON)
+else()
+    set(ETCDLIB_CMP framework)
+    celix_subproject(CELIX_ETCDLIB "Option to build the ETCD library" ON)
 endif ()
 
-add_library(etcdlib SHARED
-    src/etcd.c
-)
-target_include_directories(etcdlib PUBLIC 
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
-    $<INSTALL_INTERFACE:include/etcdlib>
-)
-target_include_directories(etcdlib PRIVATE src)
+if (CELIX_ETCDLIB OR ETCDLIB_STANDALONE)
+    add_library(etcdlib SHARED
+            src/etcd.c
+            )
+    target_include_directories(etcdlib PUBLIC
+            $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
+            )
+    target_include_directories(etcdlib PRIVATE src)
 
-set_target_properties(etcdlib PROPERTIES SOVERSION 1)
-set_target_properties(etcdlib PROPERTIES VERSION 1.0.0)
-target_link_libraries(etcdlib PUBLIC CURL::libcurl Jansson ${CELIX_OPTIONAL_EXTRA_LIBS})
+    set_target_properties(etcdlib PROPERTIES SOVERSION 1)
+    set_target_properties(etcdlib PROPERTIES VERSION 1.0.0)
+    target_link_libraries(etcdlib PUBLIC CURL::libcurl Jansson ${CELIX_OPTIONAL_EXTRA_LIBS})
 
-add_library(etcdlib_static STATIC
-    src/etcd.c
-)
-target_include_directories(etcdlib_static PUBLIC 
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
-    $<INSTALL_INTERFACE:include/etcdlib>
-)
-target_include_directories(etcdlib_static PRIVATE src)
-set_target_properties(etcdlib_static PROPERTIES "SOVERSION" 1)
-target_link_libraries(etcdlib_static PUBLIC CURL::libcurl Jansson ${CELIX_OPTIONAL_EXTRA_LIBS})
+    add_library(etcdlib_static STATIC
+            src/etcd.c
+            )
+    target_include_directories(etcdlib_static PUBLIC
+            $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
+            )
+    target_include_directories(etcdlib_static PRIVATE src)
+    set_target_properties(etcdlib_static PROPERTIES "SOVERSION" 1)
+    target_link_libraries(etcdlib_static PUBLIC CURL::libcurl Jansson ${CELIX_OPTIONAL_EXTRA_LIBS})
 
-add_executable(etcdlib_test ${CMAKE_CURRENT_SOURCE_DIR}/test/etcdlib_test.c)
-target_link_libraries(etcdlib_test PRIVATE etcdlib_static CURL::libcurl Jansson)
+    add_executable(etcdlib_test ${CMAKE_CURRENT_SOURCE_DIR}/test/etcdlib_test.c)
+    target_link_libraries(etcdlib_test PRIVATE etcdlib_static CURL::libcurl Jansson)
 
-#TODO install etcdlib_static. For now left out, because the imported target leaks library paths
-install(DIRECTORY api/ DESTINATION include/etcdlib COMPONENT ${ETCDLIB_CMP})
-if (NOT COMMAND celix_subproject) 
-    install(TARGETS etcdlib DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ${ETCDLIB_CMP})
-else ()
-    install(TARGETS etcdlib EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ${ETCDLIB_CMP})
-    #Setup target aliases to match external usage
-    add_library(Celix::etcdlib ALIAS etcdlib)
-    add_library(Celix::etcdlib_static ALIAS etcdlib_static)
+    install(DIRECTORY api/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/etcdlib COMPONENT ${ETCDLIB_CMP})
+    if (NOT COMMAND celix_subproject)
+        install(TARGETS etcdlib etcdlib_static DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ${ETCDLIB_CMP}
+                INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/etcdlib)
+    else ()
+        install(TARGETS etcdlib etcdlib_static EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ${ETCDLIB_CMP}
+                INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/etcdlib)
+        #Setup target aliases to match external usage
+        add_library(Celix::etcdlib ALIAS etcdlib)
+        add_library(Celix::etcdlib_static ALIAS etcdlib_static)
+    endif ()
 endif ()
diff --git a/libs/framework/CMakeLists.txt b/libs/framework/CMakeLists.txt
index f0bcb10..4e2ffe0 100644
--- a/libs/framework/CMakeLists.txt
+++ b/libs/framework/CMakeLists.txt
@@ -38,17 +38,17 @@ add_library(framework SHARED ${SOURCES})
 set_target_properties(framework PROPERTIES OUTPUT_NAME "celix_framework")
 target_include_directories(framework PUBLIC
         $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
-        $<INSTALL_INTERFACE:include/celix>
 )
 target_compile_options(framework PRIVATE -DUSE_FILE32API)
 target_compile_options(framework PRIVATE -Wno-deprecated-declarations) #note part of the api is deprecated, ignore this warning on own api
-set_target_properties(framework PROPERTIES "SOVERSION" 2)
+set_target_properties(framework PROPERTIES "SOVERSION" ${CELIX_MAJOR})
 
 target_link_libraries(framework PUBLIC Celix::utils Celix::dfi ${CELIX_OPTIONAL_EXTRA_LIBS})
 target_link_libraries(framework PUBLIC UUID::lib CURL::libcurl ZLIB::ZLIB)
 
-install(TARGETS framework EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT framework)
-install(DIRECTORY include/ DESTINATION include/celix COMPONENT framework)
+install(TARGETS framework EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT framework
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix COMPONENT framework)
 
 #Alias setup to match external usage
 add_library(Celix::framework ALIAS framework)
diff --git a/libs/launcher/CMakeLists.txt b/libs/launcher/CMakeLists.txt
index 005de7e..52ec671 100644
--- a/libs/launcher/CMakeLists.txt
+++ b/libs/launcher/CMakeLists.txt
@@ -15,12 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
-celix_subproject(LAUNCHER "Option to build the launcher" "ON" DEPS UTILS FRAMEWORK)
+celix_subproject(LAUNCHER "Option to build the launcher" "ON")
 if (LAUNCHER) 
-    find_package(CURL REQUIRED)
-
-    include_directories(public/include)
-
     #celix launcher linked to libc
     add_executable(launcher
         src/main.c
@@ -30,10 +26,7 @@ if (LAUNCHER)
     target_include_directories(launcher PRIVATE src)
 
     target_link_libraries(launcher PRIVATE Celix::framework)
-    if (NOT ANDROID)
-        target_link_libraries(launcher PRIVATE Celix::dfi) #note not strictly needed, but ensure libdfi is a dep for the framework, useful when create docker images
-    endif()
-    
+
     install(TARGETS launcher EXPORT celix RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT framework)
     #Setup target aliases to match external usage
     add_executable(Celix::launcher ALIAS launcher)
diff --git a/libs/promises/CMakeLists.txt b/libs/promises/CMakeLists.txt
index ff715d9..d7709a6 100644
--- a/libs/promises/CMakeLists.txt
+++ b/libs/promises/CMakeLists.txt
@@ -43,7 +43,6 @@ if (PROMISES OR PROMISES_STANDALONE)
     add_library(Promises INTERFACE)
     target_include_directories(Promises INTERFACE
         $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
-        $<INSTALL_INTERFACE:include/celix/promises>
     )
     target_link_libraries(Promises INTERFACE Threads::Threads)
     add_library(Celix::Promises ALIAS Promises)
@@ -55,8 +54,9 @@ if (PROMISES OR PROMISES_STANDALONE)
         add_subdirectory(gtest)
     endif()
 
-    install(TARGETS Promises EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR})
-    install(DIRECTORY api/ DESTINATION include/celix/promises)
+    install(TARGETS Promises EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/promises)
+    install(DIRECTORY api/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/promises)
 
     if (PROMISE_STANDALONE)
         install(EXPORT celix NAMESPACE Celix:: DESTINATION share/CelixPromises/cmake FILE Targets.cmake COMPONENT cmake)
diff --git a/libs/pushstreams/CMakeLists.txt b/libs/pushstreams/CMakeLists.txt
index 363d59b..b05b121 100644
--- a/libs/pushstreams/CMakeLists.txt
+++ b/libs/pushstreams/CMakeLists.txt
@@ -16,14 +16,13 @@
 # under the License.
 
 set(PUSHSTREAMS_DEFAULT_ON ${CELIX_CXX})
-celix_subproject(PUSHSTREAMS "Option to build the PushStreams library" ${PUSHSTREAMS_DEFAULT_ON})
+celix_subproject(PUSHSTREAMS "Option to build the PushStreams library" ${PUSHSTREAMS_DEFAULT_ON} DEPS PROMISES)
 
 if (PUSHSTREAMS)
     find_package(Threads)
     add_library(PushStreams INTERFACE)
     target_include_directories(PushStreams INTERFACE
         $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
-        $<INSTALL_INTERFACE:include/celix/pushstreams>
     )
     target_link_libraries(PushStreams INTERFACE Threads::Threads)
     target_link_libraries(PushStreams INTERFACE Celix::Promises)
@@ -37,6 +36,7 @@ if (PUSHSTREAMS)
         add_subdirectory(gtest)
     endif()
 
-    install(TARGETS PushStreams EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR})
-    install(DIRECTORY api/ DESTINATION include/celix/pushstreams)
+    install(TARGETS PushStreams EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/pushstreams)
+    install(DIRECTORY api/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/pushstreams)
 endif ()
diff --git a/libs/utils/CMakeLists.txt b/libs/utils/CMakeLists.txt
index f394520..01deeb9 100644
--- a/libs/utils/CMakeLists.txt
+++ b/libs/utils/CMakeLists.txt
@@ -25,7 +25,7 @@ check_function_exists(open_memstream OPEN_MEMSTREAM_EXISTS)
 if (NOT OPEN_MEMSTREAM_EXISTS)
     set(MEMSTREAM_SOURCES src/memstream/open_memstream.c  src/memstream/fmemopen.c ${MEMSTREAM_SOURCES})
     set(MEMSTREAM_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/include/memstream ${MEMSTREAM_INCLUDE_DIR})
-    install(DIRECTORY include/memstream/ DESTINATION include/celix/memstream COMPONENT framework)
+    install(DIRECTORY include/memstream/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/memstream COMPONENT framework)
 endif()
 
 add_library(utils SHARED
@@ -62,7 +62,6 @@ endif ()
 target_include_directories(utils PUBLIC
         $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
         $<BUILD_INTERFACE:${MEMSTREAM_INCLUDE_DIR}>
-        $<INSTALL_INTERFACE:include/celix>
 )
 target_include_directories(utils PRIVATE src)
 set_target_properties(utils PROPERTIES "SOVERSION" 2)
@@ -73,8 +72,9 @@ ELSEIF(ANDROID)
     target_link_libraries(utils PRIVATE m)
 ENDIF()
 
-install(TARGETS utils EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT framework)
-install(DIRECTORY include/ DESTINATION include/celix COMPONENT framework
+install(TARGETS utils EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT framework
+        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix)
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix COMPONENT framework
         PATTERN memstream* EXCLUDE)
 
 #Alias setup to match external usage
diff --git a/misc/experimental/CMakeLists.txt b/misc/experimental/CMakeLists.txt
index 3a53ee6..de3b7a7 100644
--- a/misc/experimental/CMakeLists.txt
+++ b/misc/experimental/CMakeLists.txt
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-celix_subproject(EXPERIMENTAL "Options to enable building the experimental - non stable - bundles/libraries. " OFF DEPS FRAMEWORK)
+celix_subproject(EXPERIMENTAL "Options to enable building the experimental - non stable - bundles/libraries. " OFF)
 if (EXPERIMENTAL)
     add_subdirectory(bundles)
 endif ()
\ No newline at end of file