diff --git a/src/dyknow_echo/CMakeLists.txt b/src/dyknow_echo/CMakeLists.txt
index 3ee26d271351cdf3a91efab4c089022d48f6f8d5..9b2a3c0250bf3edcfc3350d52e16b03d3ec86b49 100644
--- a/src/dyknow_echo/CMakeLists.txt
+++ b/src/dyknow_echo/CMakeLists.txt
@@ -12,13 +12,11 @@ find_package(rclcpp_components REQUIRED)
 find_package(dyknow_nodehandle REQUIRED)
 find_package(dyknow_analytics REQUIRED)
 
-message(STATUS "include: ${include}")
-include_directories(
-  include
-  ${dyknow_nodehandle_INCLUDE_DIRS}
-  ${dyknow_analytics_INCLUDE_DIRS}
-  #"/root/ros2_ws/install/dyknow_nodehandle/include/dyknow_nodehandle" # this is the way that the directory structure is created but there is an extra dyknow_nodehandle in the file path i deduce that the include file path is likly mangled in dyknow_nodehandle cmakefile 
-)
+# include_directories(
+#   include
+#   ${dyknow_nodehandle_INCLUDE_DIRS}
+#   ${dyknow_analytics_INCLUDE_DIRS}
+# )
 
 # Declare a shared library
 add_library(dyknow_echo_component SHARED
diff --git a/src/dyknow_interfaces/CMakeLists.txt b/src/dyknow_interfaces/CMakeLists.txt
index 9864eae979d2ab10375374cd38936e58827870c6..40eb2a0a452550646f808b718406f28819e40915 100644
--- a/src/dyknow_interfaces/CMakeLists.txt
+++ b/src/dyknow_interfaces/CMakeLists.txt
@@ -13,12 +13,34 @@ find_package(builtin_interfaces REQUIRED)
 
 set(msg_files
   "msg/Configuration.msg"
+  "msg/Connection.msg"
   "msg/Field.msg"
+  "msg/Parameter.msg"
   "msg/Sample.msg"
+  "msg/Tag.msg"
+  "msg/Target.msg"
+  "msg/Transformation.msg"
+  "msg/Unit.msg"
 )
+
 set(srv_files
+  "srv/AddTarget.srv"
+  "srv/AddTransformation.srv"
   "srv/Configure.srv"
+  "srv/CreateStream.srv"
+  "srv/Destroy.srv"
+  "srv/ExpPopulate.srv"
   "srv/GetConfig.srv"
+  "srv/GetConfiguration.srv"
+  "srv/GetUniqueName.srv"
+  "srv/GetValidInputs.srv"
+  "srv/ManagerConfigure.srv"
+  "srv/Refresh.srv"
+  "srv/RemoveTarget.srv"
+  "srv/RemoveTransformation.srv"
+  "srv/Repair.srv"
+  "srv/RequestUnload.srv"
+  "srv/Spawn.srv"
 )
 
 # Add message and service files
@@ -30,7 +52,4 @@ rosidl_generate_interfaces(${PROJECT_NAME}
 
 ament_export_dependencies(rosidl_default_runtime)
 
-
-
-
 ament_package()
diff --git a/src/dyknow_manager/msg/Connection.msg b/src/dyknow_interfaces/msg/Connection.msg
similarity index 100%
rename from src/dyknow_manager/msg/Connection.msg
rename to src/dyknow_interfaces/msg/Connection.msg
diff --git a/src/dyknow_manager/msg/Parameter.msg b/src/dyknow_interfaces/msg/Parameter.msg
similarity index 100%
rename from src/dyknow_manager/msg/Parameter.msg
rename to src/dyknow_interfaces/msg/Parameter.msg
diff --git a/src/dyknow_manager/msg/Tag.msg b/src/dyknow_interfaces/msg/Tag.msg
similarity index 100%
rename from src/dyknow_manager/msg/Tag.msg
rename to src/dyknow_interfaces/msg/Tag.msg
diff --git a/src/dyknow_manager/msg/Target.msg b/src/dyknow_interfaces/msg/Target.msg
similarity index 100%
rename from src/dyknow_manager/msg/Target.msg
rename to src/dyknow_interfaces/msg/Target.msg
diff --git a/src/dyknow_manager/msg/Transformation.msg b/src/dyknow_interfaces/msg/Transformation.msg
similarity index 61%
rename from src/dyknow_manager/msg/Transformation.msg
rename to src/dyknow_interfaces/msg/Transformation.msg
index 11462e6ef9c41e166b12b9f8d9918ba995883d0b..0cd8ee2ef5f97f0c14983cef1a61cf4f4fb949db 100644
--- a/src/dyknow_manager/msg/Transformation.msg
+++ b/src/dyknow_interfaces/msg/Transformation.msg
@@ -1,9 +1,9 @@
 string label
 string type
 string source
-dyknow_manager/Parameter[] params
+dyknow_interfaces/Parameter[] params
 string[] out_ports
 string[] in_ports
-dyknow_manager/Tag[] tags
+dyknow_interfaces/Tag[] tags
 float64 cost
 uint32 environment
\ No newline at end of file
diff --git a/src/dyknow_interfaces/msg/Unit.msg b/src/dyknow_interfaces/msg/Unit.msg
new file mode 100644
index 0000000000000000000000000000000000000000..2262d4d71b80bd38931512a8bf6ca46a0c575872
--- /dev/null
+++ b/src/dyknow_interfaces/msg/Unit.msg
@@ -0,0 +1,5 @@
+string label
+string type
+uint32 environment
+dyknow_interfaces/Connection[] incoming
+dyknow_interfaces/Connection[] outgoing
diff --git a/src/dyknow_interfaces/srv/AddTarget.srv b/src/dyknow_interfaces/srv/AddTarget.srv
new file mode 100644
index 0000000000000000000000000000000000000000..1bcb1294756ffe7f34797fe249cf279113015372
--- /dev/null
+++ b/src/dyknow_interfaces/srv/AddTarget.srv
@@ -0,0 +1,4 @@
+dyknow_interfaces/Target[] targets
+uint32 envid
+---
+bool success
\ No newline at end of file
diff --git a/src/dyknow_interfaces/srv/AddTransformation.srv b/src/dyknow_interfaces/srv/AddTransformation.srv
new file mode 100644
index 0000000000000000000000000000000000000000..0b50d4f43506160a9e05cf03c6b353d0d2aeb86f
--- /dev/null
+++ b/src/dyknow_interfaces/srv/AddTransformation.srv
@@ -0,0 +1,4 @@
+dyknow_interfaces/Transformation[] transformations
+uint32 envid
+---
+bool success
\ No newline at end of file
diff --git a/src/dyknow_manager/srv/CreateStream.srv b/src/dyknow_interfaces/srv/CreateStream.srv
similarity index 100%
rename from src/dyknow_manager/srv/CreateStream.srv
rename to src/dyknow_interfaces/srv/CreateStream.srv
diff --git a/src/dyknow_manager/srv/Destroy.srv b/src/dyknow_interfaces/srv/Destroy.srv
similarity index 100%
rename from src/dyknow_manager/srv/Destroy.srv
rename to src/dyknow_interfaces/srv/Destroy.srv
diff --git a/src/dyknow_manager/srv/ExpPopulate.srv b/src/dyknow_interfaces/srv/ExpPopulate.srv
similarity index 79%
rename from src/dyknow_manager/srv/ExpPopulate.srv
rename to src/dyknow_interfaces/srv/ExpPopulate.srv
index 80a0f2b746c89848d530b3f8e80fc097494f731f..41054694656f440f476194008175b548480d90d2 100644
--- a/src/dyknow_manager/srv/ExpPopulate.srv
+++ b/src/dyknow_interfaces/srv/ExpPopulate.srv
@@ -1,7 +1,7 @@
 uint32 env
 uint32 seed
 uint32 numtransform 
-float32 lambda 
+float32 lambdafunction 
 uint32 numtarget
 float32 density
 ---
diff --git a/src/dyknow_interfaces/srv/GetConfiguration.srv b/src/dyknow_interfaces/srv/GetConfiguration.srv
new file mode 100644
index 0000000000000000000000000000000000000000..322c0f524a678c07eeb7da4fbfe0ad238f3e16b1
--- /dev/null
+++ b/src/dyknow_interfaces/srv/GetConfiguration.srv
@@ -0,0 +1,4 @@
+---
+dyknow_interfaces/Unit[] units
+dyknow_interfaces/Transformation[] transformations
+dyknow_interfaces/Target[] targets
\ No newline at end of file
diff --git a/src/dyknow_manager/srv/GetUniqueName.srv b/src/dyknow_interfaces/srv/GetUniqueName.srv
similarity index 100%
rename from src/dyknow_manager/srv/GetUniqueName.srv
rename to src/dyknow_interfaces/srv/GetUniqueName.srv
diff --git a/src/dyknow_manager/srv/GetValidInputs.srv b/src/dyknow_interfaces/srv/GetValidInputs.srv
similarity index 100%
rename from src/dyknow_manager/srv/GetValidInputs.srv
rename to src/dyknow_interfaces/srv/GetValidInputs.srv
diff --git a/src/dyknow_manager/srv/Configure.srv b/src/dyknow_interfaces/srv/ManagerConfigure.srv
similarity index 51%
rename from src/dyknow_manager/srv/Configure.srv
rename to src/dyknow_interfaces/srv/ManagerConfigure.srv
index 513003be3a16abce45cb8f2b064e6a9f1bd881b2..3345cacd57bc9d289d18384fcad16604fc5691da 100644
--- a/src/dyknow_manager/srv/Configure.srv
+++ b/src/dyknow_interfaces/srv/ManagerConfigure.srv
@@ -1,5 +1,5 @@
 string name
-dyknow_nodehandle/Configuration config
+dyknow_interfaces/Configuration config
 uint32 envid
 ---
 bool success
\ No newline at end of file
diff --git a/src/dyknow_manager/srv/Refresh.srv b/src/dyknow_interfaces/srv/Refresh.srv
similarity index 100%
rename from src/dyknow_manager/srv/Refresh.srv
rename to src/dyknow_interfaces/srv/Refresh.srv
diff --git a/src/dyknow_manager/srv/RemoveTarget.srv b/src/dyknow_interfaces/srv/RemoveTarget.srv
similarity index 100%
rename from src/dyknow_manager/srv/RemoveTarget.srv
rename to src/dyknow_interfaces/srv/RemoveTarget.srv
diff --git a/src/dyknow_manager/srv/RemoveTransformation.srv b/src/dyknow_interfaces/srv/RemoveTransformation.srv
similarity index 100%
rename from src/dyknow_manager/srv/RemoveTransformation.srv
rename to src/dyknow_interfaces/srv/RemoveTransformation.srv
diff --git a/src/dyknow_manager/srv/Repair.srv b/src/dyknow_interfaces/srv/Repair.srv
similarity index 100%
rename from src/dyknow_manager/srv/Repair.srv
rename to src/dyknow_interfaces/srv/Repair.srv
diff --git a/src/dyknow_manager/srv/RequestUnload.srv b/src/dyknow_interfaces/srv/RequestUnload.srv
similarity index 100%
rename from src/dyknow_manager/srv/RequestUnload.srv
rename to src/dyknow_interfaces/srv/RequestUnload.srv
diff --git a/src/dyknow_manager/srv/Spawn.srv b/src/dyknow_interfaces/srv/Spawn.srv
similarity index 100%
rename from src/dyknow_manager/srv/Spawn.srv
rename to src/dyknow_interfaces/srv/Spawn.srv
diff --git a/src/dyknow_manager/CMakeLists.txt b/src/dyknow_manager/CMakeLists.txt
index f3a20a625cf98c0bddcbb7c83146cfc696bce021..57b94d2706486c8611006de5d8178f1e6bc6b5c4 100644
--- a/src/dyknow_manager/CMakeLists.txt
+++ b/src/dyknow_manager/CMakeLists.txt
@@ -14,94 +14,59 @@ find_package(dyknow_nodehandle REQUIRED)
 find_package(dyknow_analytics REQUIRED)
 find_package(rosidl_default_generators REQUIRED)
 
-
-
-# Add message and service files
-rosidl_generate_interfaces(${PROJECT_NAME}
-  "msg/Tag.msg"
-  "msg/Parameter.msg"
-  "msg/Transformation.msg"
-  "msg/Unit.msg"
-  "msg/Connection.msg"
-  "msg/Target.msg"
-  "srv/GetUniqueName.srv"
-  "srv/RequestUnload.srv"
-  "srv/CreateStream.srv"
-  "srv/GetConfiguration.srv"
-  "srv/AddTransformation.srv"
-  "srv/RemoveTransformation.srv"
-  "srv/Spawn.srv"
-  "srv/Destroy.srv"
-  "srv/Configure.srv"
-  "srv/AddTarget.srv"
-  "srv/RemoveTarget.srv"
-  "srv/Refresh.srv"
-  "srv/Repair.srv"
-  "srv/GetValidInputs.srv"
-  "srv/ExpPopulate.srv"
-  DEPENDENCIES dyknow_nodehandle
-)
-
-ament_export_dependencies(rosidl_default_runtime)
-
-
-
-include_directories(
-  include
-  ${rclcpp_INCLUDE_DIRS}
-  ${dyknow_nodehandle_INCLUDE_DIRS}
-  ${dyknow_analytics_INCLUDE_DIRS}
-  ${rosidl_default_generators_INCLUDE_DIRS}
-  "${CMAKE_BINARY_DIR}/rosidl_generator_cpp"
-)
+# include_directories( # Testing if this part is needed or not....
+#   include
+#   ${rclcpp_INCLUDE_DIRS}
+#   ${dyknow_nodehandle_INCLUDE_DIRS}
+#   ${dyknow_analytics_INCLUDE_DIRS}
+# )
 
 # Define our target, should this not be all of our cpp files?
-add_library(${PROJECT_NAME}_lib SHARED
+add_library(${PROJECT_NAME} SHARED
    src/manager_componet.cpp
    #src/configuration_manager.cpp # if this is included the project fails to compile 
 ) # this should be all the source files that are requierd for compiling the lib
 
-# Define where the include directories for our target is
-target_include_directories(${PROJECT_NAME}_lib PUBLIC
-  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
-  $<INSTALL_INTERFACE:include/${PROJECT_NAME}>
-) # Either this one or the add library one could be faulty 
+target_include_directories(${PROJECT_NAME} PUBLIC
+  "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
+  "$<INSTALL_INTERFACE:include>"
+)
 
 # Link dependencies to our target ,hmmm
 # For this we might instead conider using target_link_libraries, works the same but with namespaces 
-ament_target_dependencies(${PROJECT_NAME}_lib
+ament_target_dependencies(${PROJECT_NAME}
   rclcpp
   rclcpp_components
   dyknow_nodehandle
 ) # These are going to be the PACKAGES that we are dependend on 
 
 # This is the component that we are creating
-rclcpp_components_register_node(${PROJECT_NAME}_lib
+rclcpp_components_register_node(${PROJECT_NAME}
   PLUGIN "manager::ManagerComponet"
   EXECUTABLE dyknow_manager_componet
 )
-
-
-#target_compile_features(dyknow_manager_componet PUBLIC c_std_99 cxx_std_17)  # Require C99 and C++17
-
-# Ensure that the generated message headers are available to this target
-# add_dependencies(${PROJECT_NAME}_lib ${PROJECT_NAME}__rosidl_typesupport_cpp)
-
 install(
-  TARGETS ${PROJECT_NAME}_lib
+  TARGETS ${PROJECT_NAME}
   EXPORT export_${PROJECT_NAME}
   ARCHIVE DESTINATION lib
   LIBRARY DESTINATION lib
   RUNTIME DESTINATION bin
 )
 
+# Export the header files downstream 
+install(
+  DIRECTORY include/
+  DESTINATION include/ 
+)
+
 # This will tell any packages downstream what dependencies that this library has to we dont need to call add_packages for them too
 #ament_export_dependencies(some_dependency)
 
-# Have tested and this is not be needed 
-#install(DIRECTORY include/
-#    DESTINATION include/${PROJECT_NAME}/
-#)
+ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET)
+
+ament_export_dependencies(dyknow_nodehandle)
+
+ament_export_include_directories(include)
 
 
 ament_package()
diff --git a/src/dyknow_manager/include/dyknow_manager/configuration_manager.hpp b/src/dyknow_manager/include/dyknow_manager/configuration_manager.hpp
index 15faf4c478404bb6f82aba177f6ecd500ac3dc24..2fd8fd601e3e0098638098d9750793b9730bf300 100644
--- a/src/dyknow_manager/include/dyknow_manager/configuration_manager.hpp
+++ b/src/dyknow_manager/include/dyknow_manager/configuration_manager.hpp
@@ -11,22 +11,22 @@
 #include "target_spec.hpp"
 
 #include "dyknow_nodehandle/node.hpp"
-#include "dyknow_manager/srv/get_configuration.hpp"
-#include "dyknow_manager/srv/add_transformation.hpp"
-#include "dyknow_manager/srv/remove_transformation.hpp"
-#include "dyknow_manager/srv/spawn.hpp"
-#include "dyknow_manager/srv/destroy.hpp"
-#include "dyknow_manager/srv/add_target.hpp"
-#include "dyknow_manager/srv/remove_target.hpp"
-#include "dyknow_manager/srv/refresh.hpp"
-#include "dyknow_manager/srv/repair.hpp"
-#include "dyknow_manager/srv/exp_populate.hpp"
-#include "dyknow_manager/msg/unit.hpp"
-#include "dyknow_manager/msg/transformation.hpp"
-#include "dyknow_manager/srv/configure.hpp"
-#include "dyknow_manager/msg/connection.hpp"
-#include "dyknow_manager/msg/target.hpp"
-#include "dyknow_manager/srv/get_valid_inputs.hpp"
+#include "dyknow_interfaces/srv/get_configuration.hpp"
+#include "dyknow_interfaces/srv/add_transformation.hpp"
+#include "dyknow_interfaces/srv/remove_transformation.hpp"
+#include "dyknow_interfaces/srv/spawn.hpp"
+#include "dyknow_interfaces/srv/destroy.hpp"
+#include "dyknow_interfaces/srv/add_target.hpp"
+#include "dyknow_interfaces/srv/remove_target.hpp"
+#include "dyknow_interfaces/srv/refresh.hpp"
+#include "dyknow_interfaces/srv/repair.hpp"
+#include "dyknow_interfaces/srv/exp_populate.hpp"
+#include "dyknow_interfaces/msg/unit.hpp"
+#include "dyknow_interfaces/msg/transformation.hpp"
+#include "dyknow_interfaces/srv/configure.hpp"
+#include "dyknow_interfaces/msg/connection.hpp"
+#include "dyknow_interfaces/msg/target.hpp"
+#include "dyknow_interfaces/srv/get_valid_inputs.hpp"
 
 namespace dyknow {
 
@@ -36,21 +36,21 @@ public:
 	static const unsigned int VERBOSITY = 10;
 	static const bool EXPERIMENTAL = true;
 
-	//, getConfigurationService(nh->create_service<dyknow_manager::srv::GetConfiguration>("get_model", &ConfigurationManager::getConfigurationCallback))
-	//, getConfigurationService(nh->create_service<dyknow_manager::srv::GetConfiguration>("get_model", [this](const std::shared_ptr<dyknow_manager::srv::GetConfiguration::Request> req, std::shared_ptr<dyknow_manager::srv::GetConfiguration::Response> res) {this->getConfigurationCallback(req, res);}))
+	//, getConfigurationService(nh->create_service<dyknow_interfaces::srv::GetConfiguration>("get_model", &ConfigurationManager::getConfigurationCallback))
+	//, getConfigurationService(nh->create_service<dyknow_interfaces::srv::GetConfiguration>("get_model", [this](const std::shared_ptr<dyknow_interfaces::srv::GetConfiguration::Request> req, std::shared_ptr<dyknow_interfaces::srv::GetConfiguration::Response> res) {this->getConfigurationCallback(req, res);}))
 	ConfigurationManager(std::shared_ptr<dyknow::Node>& nh)
 	: nh(nh)
-	, getConfigurationService(nh->create_service<dyknow_manager::srv::GetConfiguration>("get_model", std::bind(&ConfigurationManager::getConfigurationCallback, this, std::placeholders::_1, std::placeholders::_2))) // We need to say where the function should operate i.e. this
-	, addTransformationService(nh->create_service<dyknow_manager::srv::AddTransformation>("add_transformation", std::bind(&ConfigurationManager::addTransformationCallback, this, std::placeholders::_1, std::placeholders::_2)))
-	, removeTransformationService(nh->create_service<dyknow_manager::srv::RemoveTransformation>("remove_transformation", std::bind(&ConfigurationManager::removeTransformationCallback, this, std::placeholders::_1, std::placeholders::_2)))
-	, spawnService(nh->create_service<dyknow_manager::srv::Spawn>("spawn", std::bind(&ConfigurationManager::spawnCallback, this, std::placeholders::_1, std::placeholders::_2)))
-	, destroyService(nh->create_service<dyknow_manager::srv::Destroy>("destroy", std::bind(&ConfigurationManager::destroyCallback, this, std::placeholders::_1, std::placeholders::_2)))
-	, configureService(nh->create_service<dyknow_manager::srv::Configure>("configure", std::bind(&ConfigurationManager::configureCallback, this, std::placeholders::_1, std::placeholders::_2)))
-	, addTargetService(nh->create_service<dyknow_manager::srv::AddTarget>("add_target", std::bind(&ConfigurationManager::addTargetCallback, this, std::placeholders::_1, std::placeholders::_2)))
-	, removeTargetService(nh->create_service<dyknow_manager::srv::RemoveTarget>("remove_target", std::bind(&ConfigurationManager::removeTargetCallback, this, std::placeholders::_1, std::placeholders::_2)))
-	, refreshService(nh->create_service<dyknow_manager::srv::Refresh>("refresh", std::bind(&ConfigurationManager::refreshCallback, this, std::placeholders::_1, std::placeholders::_2)))
-	, repairService(nh->create_service<dyknow_manager::srv::Repair>("repair", std::bind(&ConfigurationManager::repairCallback, this, std::placeholders::_1, std::placeholders::_2)))
-	, getValidInputsService(nh->create_service<dyknow_manager::srv::GetValidInputs>("get_valid_inputs", std::bind(&ConfigurationManager::getValidInputsCallback, this, std::placeholders::_1, std::placeholders::_2)))
+	, getConfigurationService(nh->create_service<dyknow_interfaces::srv::GetConfiguration>("get_model", std::bind(&ConfigurationManager::getConfigurationCallback, this, std::placeholders::_1, std::placeholders::_2))) // We need to say where the function should operate i.e. this
+	, addTransformationService(nh->create_service<dyknow_interfaces::srv::AddTransformation>("add_transformation", std::bind(&ConfigurationManager::addTransformationCallback, this, std::placeholders::_1, std::placeholders::_2)))
+	, removeTransformationService(nh->create_service<dyknow_interfaces::srv::RemoveTransformation>("remove_transformation", std::bind(&ConfigurationManager::removeTransformationCallback, this, std::placeholders::_1, std::placeholders::_2)))
+	, spawnService(nh->create_service<dyknow_interfaces::srv::Spawn>("spawn", std::bind(&ConfigurationManager::spawnCallback, this, std::placeholders::_1, std::placeholders::_2)))
+	, destroyService(nh->create_service<dyknow_interfaces::srv::Destroy>("destroy", std::bind(&ConfigurationManager::destroyCallback, this, std::placeholders::_1, std::placeholders::_2)))
+	, configureService(nh->create_service<dyknow_interfaces::srv::Configure>("configure", std::bind(&ConfigurationManager::configureCallback, this, std::placeholders::_1, std::placeholders::_2)))
+	, addTargetService(nh->create_service<dyknow_interfaces::srv::AddTarget>("add_target", std::bind(&ConfigurationManager::addTargetCallback, this, std::placeholders::_1, std::placeholders::_2)))
+	, removeTargetService(nh->create_service<dyknow_interfaces::srv::RemoveTarget>("remove_target", std::bind(&ConfigurationManager::removeTargetCallback, this, std::placeholders::_1, std::placeholders::_2)))
+	, refreshService(nh->create_service<dyknow_interfaces::srv::Refresh>("refresh", std::bind(&ConfigurationManager::refreshCallback, this, std::placeholders::_1, std::placeholders::_2)))
+	, repairService(nh->create_service<dyknow_interfaces::srv::Repair>("repair", std::bind(&ConfigurationManager::repairCallback, this, std::placeholders::_1, std::placeholders::_2)))
+	, getValidInputsService(nh->create_service<dyknow_interfaces::srv::GetValidInputs>("get_valid_inputs", std::bind(&ConfigurationManager::getValidInputsCallback, this, std::placeholders::_1, std::placeholders::_2)))
 	, planner(nh)
 	{						
 		this->processThread = std::shared_ptr< std::thread >(new std::thread(std::bind(&ConfigurationManager::spin, this)));
@@ -66,18 +66,18 @@ public:
 	void createEnvironment(int id, std::string manager);
 
 	// Services
-	void getConfigurationCallback(const std::shared_ptr<dyknow_manager::srv::GetConfiguration::Request> req, 			std::shared_ptr<dyknow_manager::srv::GetConfiguration::Response> res);
-	void addTransformationCallback(const std::shared_ptr<dyknow_manager::srv::AddTransformation::Request> req, 			std::shared_ptr<dyknow_manager::srv::AddTransformation::Response> res);
-	void removeTransformationCallback(const std::shared_ptr<dyknow_manager::srv::RemoveTransformation::Request> req, 	std::shared_ptr<dyknow_manager::srv::RemoveTransformation::Response> res);
-	void spawnCallback(const std::shared_ptr<dyknow_manager::srv::Spawn::Request> req, 									std::shared_ptr<dyknow_manager::srv::Spawn::Response> res);
-	void destroyCallback(const std::shared_ptr<dyknow_manager::srv::Destroy::Request> req, 								std::shared_ptr<dyknow_manager::srv::Destroy::Response> res);
-	void configureCallback(const std::shared_ptr<dyknow_manager::srv::Configure::Request> req, 							std::shared_ptr<dyknow_manager::srv::Configure::Response> res);
-	void addTargetCallback(const std::shared_ptr<dyknow_manager::srv::AddTarget::Request> req, 							std::shared_ptr<dyknow_manager::srv::AddTarget::Response> res);
-	void removeTargetCallback(const std::shared_ptr<dyknow_manager::srv::RemoveTarget::Request> req, 					std::shared_ptr<dyknow_manager::srv::RemoveTarget::Response> res);
-	void refreshCallback(const std::shared_ptr<dyknow_manager::srv::Refresh::Request> req, 								std::shared_ptr<dyknow_manager::srv::Refresh::Response> res);
-	void repairCallback(const std::shared_ptr<dyknow_manager::srv::Repair::Request> req, 								std::shared_ptr<dyknow_manager::srv::Repair::Response> res);
-	void getValidInputsCallback(const std::shared_ptr<dyknow_manager::srv::GetValidInputs::Request> req, 				std::shared_ptr<dyknow_manager::srv::GetValidInputs::Response> res);
-	void expPopulateCallback(const std::shared_ptr<dyknow_manager::srv::ExpPopulate::Request> req, 						std::shared_ptr<dyknow_manager::srv::ExpPopulate::Response> res);
+	void getConfigurationCallback(const std::shared_ptr<dyknow_interfaces::srv::GetConfiguration::Request> req, 			std::shared_ptr<dyknow_interfaces::srv::GetConfiguration::Response> res);
+	void addTransformationCallback(const std::shared_ptr<dyknow_interfaces::srv::AddTransformation::Request> req, 			std::shared_ptr<dyknow_interfaces::srv::AddTransformation::Response> res);
+	void removeTransformationCallback(const std::shared_ptr<dyknow_interfaces::srv::RemoveTransformation::Request> req, 	std::shared_ptr<dyknow_interfaces::srv::RemoveTransformation::Response> res);
+	void spawnCallback(const std::shared_ptr<dyknow_interfaces::srv::Spawn::Request> req, 									std::shared_ptr<dyknow_interfaces::srv::Spawn::Response> res);
+	void destroyCallback(const std::shared_ptr<dyknow_interfaces::srv::Destroy::Request> req, 								std::shared_ptr<dyknow_interfaces::srv::Destroy::Response> res);
+	void configureCallback(const std::shared_ptr<dyknow_interfaces::srv::Configure::Request> req, 							std::shared_ptr<dyknow_interfaces::srv::Configure::Response> res);
+	void addTargetCallback(const std::shared_ptr<dyknow_interfaces::srv::AddTarget::Request> req, 							std::shared_ptr<dyknow_interfaces::srv::AddTarget::Response> res);
+	void removeTargetCallback(const std::shared_ptr<dyknow_interfaces::srv::RemoveTarget::Request> req, 					std::shared_ptr<dyknow_interfaces::srv::RemoveTarget::Response> res);
+	void refreshCallback(const std::shared_ptr<dyknow_interfaces::srv::Refresh::Request> req, 								std::shared_ptr<dyknow_interfaces::srv::Refresh::Response> res);
+	void repairCallback(const std::shared_ptr<dyknow_interfaces::srv::Repair::Request> req, 								std::shared_ptr<dyknow_interfaces::srv::Repair::Response> res);
+	void getValidInputsCallback(const std::shared_ptr<dyknow_interfaces::srv::GetValidInputs::Request> req, 				std::shared_ptr<dyknow_interfaces::srv::GetValidInputs::Response> res);
+	void expPopulateCallback(const std::shared_ptr<dyknow_interfaces::srv::ExpPopulate::Request> req, 						std::shared_ptr<dyknow_interfaces::srv::ExpPopulate::Response> res);
 
 	bool apply(Change delta, int environment);
 	void spin();
@@ -98,17 +98,17 @@ private:
 	std::queue<std::pair<int, Change> > changeQueue;
 	ConfigurationPlanner planner;
 
-    rclcpp::Service<dyknow_manager::srv::GetConfiguration>::SharedPtr getConfigurationService;
-    rclcpp::Service<dyknow_manager::srv::AddTransformation>::SharedPtr addTransformationService;
-    rclcpp::Service<dyknow_manager::srv::RemoveTransformation>::SharedPtr removeTransformationService;
-    rclcpp::Service<dyknow_manager::srv::Spawn>::SharedPtr spawnService;
-    rclcpp::Service<dyknow_manager::srv::Destroy>::SharedPtr destroyService;
-    rclcpp::Service<dyknow_manager::srv::Configure>::SharedPtr configureService;
-    rclcpp::Service<dyknow_manager::srv::AddTarget>::SharedPtr addTargetService;
-    rclcpp::Service<dyknow_manager::srv::RemoveTarget>::SharedPtr removeTargetService;
-    rclcpp::Service<dyknow_manager::srv::Refresh>::SharedPtr refreshService;
-    rclcpp::Service<dyknow_manager::srv::Repair>::SharedPtr repairService;
-    rclcpp::Service<dyknow_manager::srv::GetValidInputs>::SharedPtr getValidInputsService;
+    rclcpp::Service<dyknow_interfaces::srv::GetConfiguration>::SharedPtr getConfigurationService;
+    rclcpp::Service<dyknow_interfaces::srv::AddTransformation>::SharedPtr addTransformationService;
+    rclcpp::Service<dyknow_interfaces::srv::RemoveTransformation>::SharedPtr removeTransformationService;
+    rclcpp::Service<dyknow_interfaces::srv::Spawn>::SharedPtr spawnService;
+    rclcpp::Service<dyknow_interfaces::srv::Destroy>::SharedPtr destroyService;
+    rclcpp::Service<dyknow_interfaces::srv::Configure>::SharedPtr configureService;
+    rclcpp::Service<dyknow_interfaces::srv::AddTarget>::SharedPtr addTargetService;
+    rclcpp::Service<dyknow_interfaces::srv::RemoveTarget>::SharedPtr removeTargetService;
+    rclcpp::Service<dyknow_interfaces::srv::Refresh>::SharedPtr refreshService;
+    rclcpp::Service<dyknow_interfaces::srv::Repair>::SharedPtr repairService;
+    rclcpp::Service<dyknow_interfaces::srv::GetValidInputs>::SharedPtr getValidInputsService;
 
 	std::mutex deltaAccess;
 	std::mutex envAccess;
diff --git a/src/dyknow_manager/include/dyknow_manager/target_spec.hpp b/src/dyknow_manager/include/dyknow_manager/target_spec.hpp
index 64b951d6c4de44cae880599cd98f9b23c26c0137..eef7bf64537d36197fbf81825691cfe351ce2d09 100644
--- a/src/dyknow_manager/include/dyknow_manager/target_spec.hpp
+++ b/src/dyknow_manager/include/dyknow_manager/target_spec.hpp
@@ -2,7 +2,7 @@
 #define INCLUDE_TARGET_SPEC_HPP_
 
 #include <rclcpp/rclcpp.hpp>
-#include "dyknow_manager/msg/target.hpp"
+#include "dyknow_interfaces/msg/target.hpp"
 
 namespace dyknow {
 
@@ -34,7 +34,7 @@ struct TargetSpec {
 class TargetFactory {
 public:
 	static TargetSpec create(int id, std::string label, int port = 0, std::string topic = "/result");
-	static TargetSpec create(dyknow_manager::msg::Target target);
+	static TargetSpec create(dyknow_interfaces::msg::Target target);
 };
 
 } //namespace
diff --git a/src/dyknow_manager/include/dyknow_manager/transformation_spec.hpp b/src/dyknow_manager/include/dyknow_manager/transformation_spec.hpp
index d529972ab46758835c000b059d76300bf70e7f28..d9cf9f13b41a451d86af93fec9378d79e5d1e836 100644
--- a/src/dyknow_manager/include/dyknow_manager/transformation_spec.hpp
+++ b/src/dyknow_manager/include/dyknow_manager/transformation_spec.hpp
@@ -2,9 +2,9 @@
 #define INCLUDE_TRANSFORMATION_SPEC_HPP_
 
 #include <rclcpp/rclcpp.hpp>
-#include "dyknow_manager/msg/transformation.hpp"
-#include "dyknow_manager/msg/tag.hpp"
-#include "dyknow_manager/msg/parameter.hpp"
+#include "dyknow_interfaces/msg/transformation.hpp"
+#include "dyknow_interfaces/msg/tag.hpp"
+#include "dyknow_interfaces/msg/parameter.hpp"
 
 namespace dyknow {
 
@@ -67,7 +67,7 @@ struct TransformationSpec {
 class TransformationFactory {
 public:
 	static TransformationSpec create(std::string path);
-	static TransformationSpec create(dyknow_manager::msg::Transformation);
+	static TransformationSpec create(dyknow_interfaces::msg::Transformation);
 };
 
 } //namespace
diff --git a/src/dyknow_manager/msg/Unit.msg b/src/dyknow_manager/msg/Unit.msg
deleted file mode 100644
index 1dd43405295b809bd75d7eb59456ae6603b0afa8..0000000000000000000000000000000000000000
--- a/src/dyknow_manager/msg/Unit.msg
+++ /dev/null
@@ -1,5 +0,0 @@
-string label
-string type
-uint32 environment
-dyknow_manager/Connection[] incoming
-dyknow_manager/Connection[] outgoing
diff --git a/src/dyknow_manager/srv/AddTarget.srv b/src/dyknow_manager/srv/AddTarget.srv
deleted file mode 100644
index 2f00dacc9629ab04f7361543451ed129d9b85e99..0000000000000000000000000000000000000000
--- a/src/dyknow_manager/srv/AddTarget.srv
+++ /dev/null
@@ -1,4 +0,0 @@
-dyknow_manager/Target[] targets
-uint32 envid
----
-bool success
\ No newline at end of file
diff --git a/src/dyknow_manager/srv/AddTransformation.srv b/src/dyknow_manager/srv/AddTransformation.srv
deleted file mode 100644
index a98a4c2944aa69dca9203dd6324de64a76f4c2e7..0000000000000000000000000000000000000000
--- a/src/dyknow_manager/srv/AddTransformation.srv
+++ /dev/null
@@ -1,4 +0,0 @@
-dyknow_manager/Transformation[] transformations
-uint32 envid
----
-bool success
\ No newline at end of file
diff --git a/src/dyknow_manager/srv/GetConfiguration.srv b/src/dyknow_manager/srv/GetConfiguration.srv
deleted file mode 100644
index b5b607faf16f879f10e8523807cbdb4e3760e49b..0000000000000000000000000000000000000000
--- a/src/dyknow_manager/srv/GetConfiguration.srv
+++ /dev/null
@@ -1,4 +0,0 @@
----
-dyknow_manager/Unit[] units
-dyknow_manager/Transformation[] transformations
-dyknow_manager/Target[] targets
\ No newline at end of file
diff --git a/src/dyknow_nodehandle/CMakeLists.txt b/src/dyknow_nodehandle/CMakeLists.txt
index 55d6627e3413b9e443c64ab95037ba03ab342546..acb7a7d16565d4e53558b539044f7d3d39dd4cb5 100644
--- a/src/dyknow_nodehandle/CMakeLists.txt
+++ b/src/dyknow_nodehandle/CMakeLists.txt
@@ -11,12 +11,12 @@ find_package(rclcpp REQUIRED)
 find_package(dyknow_analytics REQUIRED)
 find_package(dyknow_interfaces REQUIRED)
 
-include_directories(
-  include
-  ${rclcpp_INCLUDE_DIRS}
-  ${dyknow_analytics_INCLUDE_DIRS}
-  ${dyknow_interfaces_INCLUDE_DIRS}
-)
+# include_directories( # i guess these are not needed then 
+#   include
+#   ${rclcpp_INCLUDE_DIRS}
+#   ${dyknow_analytics_INCLUDE_DIRS}
+#   ${dyknow_interfaces_INCLUDE_DIRS}
+# )
 
 # Add library
 add_library(${PROJECT_NAME} SHARED
@@ -57,7 +57,7 @@ install(TARGETS ${PROJECT_NAME}
 # Export the header files downstream 
 install(
   DIRECTORY include/
-  DESTINATION include/ # extra project name?
+  DESTINATION include/ 
 )
 
 # OK, this line is NESSESARY else the packages downstream wont find THIS .so file 
diff --git a/src/dyknow_nodehandle/include/dyknow_nodehandle/node.hpp b/src/dyknow_nodehandle/include/dyknow_nodehandle/node.hpp
index 01e447ebe0d64c5f913f38ccb4e375a9f92c4380..0ea833cc26d37488f3d912ebaf4324b96175587c 100644
--- a/src/dyknow_nodehandle/include/dyknow_nodehandle/node.hpp
+++ b/src/dyknow_nodehandle/include/dyknow_nodehandle/node.hpp
@@ -59,19 +59,7 @@ public:
 		return create_subscription(statePtr);
 	}
 
-	dyknow::Subscriber create_subscription(SubscriberState* statePtr) {
-		auto iter = subscriberMap.find(statePtr->channel);
-		if (iter != subscriberMap.end()) {
-			RCLCPP_WARN(this->get_logger(), "Input channel %s already exists", statePtr->channel.c_str());
-			delete subscriberMap[statePtr->channel];
-			subscriberMap[statePtr->channel] = statePtr;
-			return dyknow::Subscriber(iter->second);
-		} else {
-			subCount++;
-			subscriberMap[statePtr->channel] = statePtr;
-			return dyknow::Subscriber(statePtr);
-		}
-	}
+	dyknow::Subscriber create_subscription(SubscriberState* statePtr); 
 
 
 	template<class M>
@@ -92,61 +80,17 @@ public:
 		return create_publisher(statePtr);
 	}
 
-	dyknow::Publisher create_publisher(PublisherState* statePtr) {
-		auto iter = publisherMap.find(statePtr->channel);
-		if (iter != publisherMap.end()) {
-			RCLCPP_WARN(this->get_logger(), "Output channel %s already exists", statePtr->channel.c_str());
-			delete publisherMap[statePtr->channel];
-			publisherMap[statePtr->channel] = statePtr;
-			return dyknow::Publisher(statePtr);
-		} else {
-			pubCount++;
-			publisherMap[statePtr->channel] = statePtr;
-			return dyknow::Publisher(statePtr);
-		}
-	}
-
+	dyknow::Publisher create_publisher(PublisherState* statePtr); 
 
 
-	bool getConfigCallback(const std::shared_ptr<dyknow_interfaces::srv::GetConfig::Request> req, std::shared_ptr<dyknow_interfaces::srv::GetConfig::Response> res) {
-		res->inputs = getInputs();
-		res->outputs = getOutputs();
-		res->success = true;
-		return true;
-	}
 
-	// I propose an experiment, I will atempt to move this function to the source and i will se what gose wrong. Great success! cmake now works 
+	bool getConfigCallback(const std::shared_ptr<dyknow_interfaces::srv::GetConfig::Request> req, std::shared_ptr<dyknow_interfaces::srv::GetConfig::Response> res);
 	std::vector<std::string> getInputs();
-	/*
-	std::vector<std::string> getInputs() {
-		std::vector<std::string> inputs;
-		for(auto& subPair : subscriberMap) {
-			inputs.push_back(subPair.second->getTopic());
-		}
-		return inputs;
-	}
-	*/
-	
+
 	std::vector<std::string> getOutputs();
-	// std::vector<std::string> getOutputs() {
-	// 	std::vector<std::string> outputs;
-	// 	for(auto& pubPair : publisherMap) {
-	// 		outputs.push_back(pubPair.second->getTopic());
-	// 	}
-	// 	return outputs;
-	// }
-
-	void connectInput(std::string channel, std::string topic) {
-		auto iter = subscriberMap.find(channel);
-		if(iter != subscriberMap.end()) {
-			iter->second->createSubscriber(topic, iter->second->size == 0 ? DEFAULT_QUEUE_SIZE : iter->second->size);
-		}
-		else {
-			if(channel.at(0) != '_') {
-				RCLCPP_WARN(this->get_logger(), "Could not find a Subscriber for input channel %s", channel.c_str());
-			}
-		}
-	}
+
+
+	void connectInput(std::string channel, std::string topic); 
 
 	template<class M, class T>
 	void delegateSubscribe(std::string topic, uint32_t queueSize, void(T::*fp)(std::shared_ptr<M>&), T* obj, SubscriberState* statePtr, bool decorate = true) {
@@ -169,17 +113,7 @@ public:
 		statePtr->connected = true;
 	}
 
-	void connectOutput(std::string channel, std::string topic) {
-		auto iter = publisherMap.find(channel);
-		if(iter != publisherMap.end()) {
-			iter->second->createPublisher(topic, iter->second->size == 0 ? DEFAULT_QUEUE_SIZE : iter->second->size);
-		}
-		else {
-			if(channel.at(0) != '/') {
-				RCLCPP_WARN(this->get_logger(), "Could not find a Publisher for output channel %s", channel.c_str());
-			}
-		}
-	}
+	void connectOutput(std::string channel, std::string topic); 
 
 	template<class M>
     void delegateAdvertise(std::string topic, uint32_t queueSize, PublisherState* statePtr, bool latch = false) {
@@ -189,80 +123,11 @@ public:
     }
 
 
-	bool configureCallback(const std::shared_ptr<dyknow_interfaces::srv::Configure::Request> req, std::shared_ptr<dyknow_interfaces::srv::Configure::Response> res) {
-		std::map<std::string, std::string> incoming;
-		std::map<std::string, std::string> outgoing;
-
-		if(req->config.in_names.size() == req->config.in_channels.size()) {
-			for(size_t i = 0; i < req->config.in_names.size(); ++i) {
-				std::stringstream ss;
-				ss << i;
-				std::string port = "_" + ss.str();
-
-				connectInput(req->config.in_channels[i].empty() ? port : req->config.in_channels[i], req->config.in_names[i]);
-				incoming[req->config.in_channels[i].empty() ? port : req->config.in_channels[i]] = req->config.in_names[i];
-			}
-		}
-		else {
-			RCLCPP_WARN(this->get_logger(), "Number of incoming topics does not match number of incoming channels: skipping");
-		}
-
-		if(req->config.out_names.size() == req->config.out_channels.size()) {
-			for(size_t i = 0; i < req->config.out_names.size(); ++i) {
-				std::stringstream ss;
-				ss << i;
-				std::string port = "/" + ss.str();
+	bool configureCallback(const std::shared_ptr<dyknow_interfaces::srv::Configure::Request> req, std::shared_ptr<dyknow_interfaces::srv::Configure::Response> res);
 
-				connectOutput(req->config.out_channels[i].empty() ? port : req->config.out_channels[i], req->config.out_names[i]);
-				outgoing[req->config.out_channels[i].empty() ? port : req->config.out_channels[i]] = req->config.out_names[i];
-			}
-		}
-		else {
-			RCLCPP_WARN(this->get_logger(), "Number of outgoing topics does not match number of outgoing channels: skipping");
-		}
+	// dyknow::Timer createTimer(TimerState* statePtr); // TODO this is yet to be implemented 
 
-		if(this->reconfigCallbackFn != NULL) {
-			this->reconfigCallbackFn(incoming, outgoing);
-		}
-		reconfigCount++;
-		res->success = true;
-		return true;
-	}
-
-	void analyticsCallback() {
-		dyknow_analytics::msg::MonitorSet msg;
-		msg.received = 0;
-		msg.sent = 0;
-
-		for(auto* timer : timers) {
-			auto trace = timer->collectTrace();
-			for(auto& pair : trace) {
-				dyknow_analytics::msg::MonitorPair monitorPair;
-				monitorPair.first = pair.first.toMsg();
-				monitorPair.second = pair.second.toMsg();
-				msg.monitors.push_back(monitorPair);
-			}
-		}
-
-		for(auto& subPair : subscriberMap) {
-			auto trace = subPair.second->collectTrace();
-			for(auto& pair : trace) {
-				dyknow_analytics::msg::MonitorPair monitorPair;
-				monitorPair.first = pair.first.toMsg();
-				monitorPair.second = pair.second.toMsg();
-				msg.monitors.push_back(monitorPair);
-			}
-			msg.received += subPair.second->received;
-		}
-
-		for(auto& pubPair : publisherMap) {
-			msg.sent += pubPair.second->sent;
-		}
-
-		if(this->ready) {
-			analyticsPublisher->publish(msg);
-		}
-	}
+	void analyticsCallback() ; 
 
 
 private:
diff --git a/src/dyknow_nodehandle/src/node.cpp b/src/dyknow_nodehandle/src/node.cpp
index 29e0adcbc7c44ca6f386f529d5bfe39e399c3cf8..4f7dbbfead4dbc5c7bf1d98611cfbe6b1811112b 100644
--- a/src/dyknow_nodehandle/src/node.cpp
+++ b/src/dyknow_nodehandle/src/node.cpp
@@ -3,8 +3,59 @@
 
 namespace dyknow{
 
+	dyknow::Subscriber Node::create_subscription(SubscriberState* statePtr) {
+		auto iter = subscriberMap.find(statePtr->channel);
+		if (iter != subscriberMap.end()) {
+			RCLCPP_WARN(this->get_logger(), "Input channel %s already exists", statePtr->channel.c_str());
+			delete subscriberMap[statePtr->channel];
+			subscriberMap[statePtr->channel] = statePtr;
+			return dyknow::Subscriber(iter->second);
+		} else {
+			subCount++;
+			subscriberMap[statePtr->channel] = statePtr;
+			return dyknow::Subscriber(statePtr);
+		}
+	}
+
+	dyknow::Publisher Node::create_publisher(PublisherState* statePtr) {
+		auto iter = publisherMap.find(statePtr->channel);
+		if (iter != publisherMap.end()) {
+			RCLCPP_WARN(this->get_logger(), "Output channel %s already exists", statePtr->channel.c_str());
+			delete publisherMap[statePtr->channel];
+			publisherMap[statePtr->channel] = statePtr;
+			return dyknow::Publisher(statePtr);
+		} else {
+			pubCount++;
+			publisherMap[statePtr->channel] = statePtr;
+			return dyknow::Publisher(statePtr);
+		}
+	}
+
+	void Node::connectInput(std::string channel, std::string topic) {
+		auto iter = subscriberMap.find(channel);
+		if(iter != subscriberMap.end()) {
+			iter->second->createSubscriber(topic, iter->second->size == 0 ? DEFAULT_QUEUE_SIZE : iter->second->size);
+		}
+		else {
+			if(channel.at(0) != '_') {
+				RCLCPP_WARN(this->get_logger(), "Could not find a Subscriber for input channel %s", channel.c_str());
+			}
+		}
+	}
+
+	void Node::connectOutput(std::string channel, std::string topic) {
+		auto iter = publisherMap.find(channel);
+		if(iter != publisherMap.end()) {
+			iter->second->createPublisher(topic, iter->second->size == 0 ? DEFAULT_QUEUE_SIZE : iter->second->size);
+		}
+		else {
+			if(channel.at(0) != '/') {
+				RCLCPP_WARN(this->get_logger(), "Could not find a Publisher for output channel %s", channel.c_str());
+			}
+		}
+	}
 	
-    std::vector<std::string> Node::getInputs() {
+	std::vector<std::string> Node::getInputs() {
 		std::vector<std::string> inputs;
 		for(auto& subPair : subscriberMap) {
 			inputs.push_back(subPair.second->getTopic());
@@ -20,7 +71,91 @@ namespace dyknow{
 		return outputs;
 	}
 
-	
+	bool Node::getConfigCallback(const std::shared_ptr<dyknow_interfaces::srv::GetConfig::Request> req, std::shared_ptr<dyknow_interfaces::srv::GetConfig::Response> res) {
+		res->inputs = getInputs();
+		res->outputs = getOutputs();
+		res->success = true;
+		return true;
+	}
+
+	bool Node::configureCallback(const std::shared_ptr<dyknow_interfaces::srv::Configure::Request> req, std::shared_ptr<dyknow_interfaces::srv::Configure::Response> res) {
+		std::map<std::string, std::string> incoming;
+		std::map<std::string, std::string> outgoing;
+
+		if(req->config.in_names.size() == req->config.in_channels.size()) {
+			for(size_t i = 0; i < req->config.in_names.size(); ++i) {
+				std::stringstream ss;
+				ss << i;
+				std::string port = "_" + ss.str();
+
+				connectInput(req->config.in_channels[i].empty() ? port : req->config.in_channels[i], req->config.in_names[i]);
+				incoming[req->config.in_channels[i].empty() ? port : req->config.in_channels[i]] = req->config.in_names[i];
+			}
+		}
+		else {
+			RCLCPP_WARN(this->get_logger(), "Number of incoming topics does not match number of incoming channels: skipping");
+		}
+
+		if(req->config.out_names.size() == req->config.out_channels.size()) {
+			for(size_t i = 0; i < req->config.out_names.size(); ++i) {
+				std::stringstream ss;
+				ss << i;
+				std::string port = "/" + ss.str();
+
+				connectOutput(req->config.out_channels[i].empty() ? port : req->config.out_channels[i], req->config.out_names[i]);
+				outgoing[req->config.out_channels[i].empty() ? port : req->config.out_channels[i]] = req->config.out_names[i];
+			}
+		}
+		else {
+			RCLCPP_WARN(this->get_logger(), "Number of outgoing topics does not match number of outgoing channels: skipping");
+		}
+
+		if(this->reconfigCallbackFn != NULL) {
+			this->reconfigCallbackFn(incoming, outgoing);
+		}
+		reconfigCount++;
+		res->success = true;
+		return true;
+	}
+
+	void Node::analyticsCallback() {
+		dyknow_analytics::msg::MonitorSet msg;
+		msg.received = 0;
+		msg.sent = 0;
+
+		for(auto* timer : timers) {
+			auto trace = timer->collectTrace();
+			for(auto& pair : trace) {
+				dyknow_analytics::msg::MonitorPair monitorPair;
+				monitorPair.first = pair.first.toMsg();
+				monitorPair.second = pair.second.toMsg();
+				msg.monitors.push_back(monitorPair);
+			}
+		}
+
+		for(auto& subPair : subscriberMap) {
+			auto trace = subPair.second->collectTrace();
+			for(auto& pair : trace) {
+				dyknow_analytics::msg::MonitorPair monitorPair;
+				monitorPair.first = pair.first.toMsg();
+				monitorPair.second = pair.second.toMsg();
+				msg.monitors.push_back(monitorPair);
+			}
+			msg.received += subPair.second->received;
+		}
+
+		for(auto& pubPair : publisherMap) {
+			msg.sent += pubPair.second->sent;
+		}
+
+		if(this->ready) {
+			analyticsPublisher->publish(msg);
+		}
+	}
+
+
+
+
 
 }