diff --git a/CMakeLists.txt b/CMakeLists.txt
index a8e28ad8f8369511e62fd2d174ee61b6ef1227b3..a338b605eb8cb0490b398545c20088dec0fb692c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,207 +1,103 @@
 # Copyright (C) 2008-2020 LAAS-CNRS, JRL AIST-CNRS.
 #
-# Author: Florent Lamiraux, Nirmal Giftsun
+# Author: Florent Lamiraux, Nirmal Giftsun, Guilhem Saurel
 #
 
-cmake_minimum_required(VERSION 3.1)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
 
-set(PROJECT_ORG stack-of-tasks)
-set(PROJECT_NAME dynamic_graph_bridge)
-set(PROJECT_DESCRIPTION "Dynamic graph bridge library")
-set(PROJECT_URL "https://github.com/${PROJECT_ORG}/${PROJECT_NAME}")
-set(PROJECT_SUFFIX "-v3")
+# Project properties
+SET(PROJECT_ORG stack-of-tasks)
+SET(PROJECT_NAME dynamic_graph_bridge)
+SET(PROJECT_DESCRIPTION "Dynamic graph bridge library")
+SET(PROJECT_URL "https://github.com/${PROJECT_ORG}/${PROJECT_NAME}")
+SET(PROJECT_SUFFIX "-v3")
 
-OPTION (BUILD_PYTHON_INTERFACE "Build the python binding" ON)
+# Project options
+OPTION(BUILD_PYTHON_INTERFACE "Build the python bindings" ON)
 
-set(CUSTOM_HEADER_DIR dynamic_graph_bridge)
+# Project configuration
+SET(PROJECT_USE_CMAKE_EXPORT TRUE)
+SET(CUSTOM_HEADER_DIR ${PROJECT_NAME})
+set(CXX_DISABLE_WERROR FALSE)
 SET(DOXYGEN_USE_MATHJAX YES)
 SET(CATKIN_ENABLE_TESTING OFF)
-set(CXX_DISABLE_WERROR False)
 
-include(cmake/base.cmake)
-include(cmake/boost.cmake)
-include(cmake/ros.cmake)
-include(cmake/python.cmake)
+# JRL-cmakemodule setup
+INCLUDE(cmake/base.cmake)
+INCLUDE(cmake/boost.cmake)
+INCLUDE(cmake/python.cmake)
+INCLUDE(cmake/ros.cmake)
 
-CMAKE_POLICY(SET CMP0048 OLD)
-project(${PROJECT_NAME} CXX)
+# Project definition
+COMPUTE_PROJECT_ARGS(PROJECT_ARGS LANGUAGES CXX)
+PROJECT(${PROJECT_NAME} ${PROJECT_ARGS})
 
+# Project dependencies
 SET(CATKIN_REQUIRED_COMPONENTS roscpp std_msgs message_generation std_srvs geometry_msgs sensor_msgs tf2_ros)
-SET(CATKIN_DEPENDS_LIBRARIES ros_bridge sot_loader)
 
 IF(BUILD_PYTHON_INTERFACE)
   FINDPYTHON()
   STRING(REGEX REPLACE "-" "_" PY_NAME ${PROJECT_NAME})
-  INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS})
-  ADD_REQUIRED_DEPENDENCY("dynamic-graph-python >= 3.0.0")
+  ADD_PROJECT_DEPENDENCY(dynamic-graph-python REQUIRED
+    PKG_CONFIG_REQUIRES dynamic-graph-python)
   SET(CATKIN_REQUIRED_COMPONENTS ${CATKIN_REQUIRED_COMPONENTS} rospy)
-  SET(CATKIN_DEPENDS_LIBRARIES ${CATKIN_DEPENDS_LIBRARIES} ros_interpreter)
+  SET(BOOST_COMPONENTS ${BOOST_COMPONENTS} python)
 ENDIF(BUILD_PYTHON_INTERFACE)
 
 find_package(catkin REQUIRED COMPONENTS ${CATKIN_REQUIRED_COMPONENTS})
 find_package(realtime_tools)
 
-set(${PROJECT_NAME}_HEADERS
-  include/dynamic_graph_bridge/ros_init.hh
-  include/dynamic_graph_bridge/sot_loader.hh
-  include/dynamic_graph_bridge/sot_loader_basic.hh
-  )
-
-IF(BUILD_PYTHON_INTERFACE)
-  set(${PROJECT_NAME}_HEADERS ${${PROJECT_NAME}_HEADERS}
-    include/dynamic_graph_bridge/ros_interpreter.hh )
-ENDIF(BUILD_PYTHON_INTERFACE)
-
 SEARCH_FOR_BOOST()
 
-set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
-set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
-set(CMAKE_INSTALL_RPATH "${LIBRARY_OUTPUT_PATH}")
-set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${LIBRARY_OUTPUT_PATH}")
-
-# Add dependency to SoT specific packages.
-SET(SOT_PKGNAMES
-dynamic_graph_bridge_msgs)
-
 add_required_dependency(roscpp)
 add_required_dependency(tf2_ros)
 add_required_dependency("realtime_tools >= 1.8")
 
-ADD_REQUIRED_DEPENDENCY("dynamic-graph >= 3.0.0")
-ADD_REQUIRED_DEPENDENCY("sot-core >= 3.0.0")
+ADD_PROJECT_DEPENDENCY(sot-core REQUIRED PKG_CONFIG_REQUIRES sot-core)
 
 add_required_dependency(dynamic_graph_bridge_msgs)
 
-foreach(sot_pkgname ${SOT_PKGNAMES})
-  add_required_dependency(${sot_pkgname})
-  pkg_check_modules(SOT_${sot_pkgname} REQUIRED ${sot_pkgname})
-endforeach(sot_pkgname)
-
-
-# Build ros_bridge library
-add_library(ros_bridge
+# Main Library
+set(${PROJECT_NAME}_HEADERS
+  include/dynamic_graph_bridge/ros_init.hh
+  include/dynamic_graph_bridge/sot_loader.hh
+  include/dynamic_graph_bridge/sot_loader_basic.hh
+  include/dynamic_graph_bridge/ros_interpreter.hh
   src/converter.hh
-  include/dynamic_graph_bridge/ros_init.hh src/ros_init.cpp
-  src/sot_to_ros.hh src/sot_to_ros.cpp
+  src/sot_to_ros.hh
   )
-pkg_config_use_dependency(ros_bridge dynamic_graph_bridge_msgs)
-install(TARGETS ros_bridge DESTINATION lib)
-
-# Add ros_bridge in the dynamic-graph-bridge pkg-config file.
-
 
-# Make sure rpath are preserved during the install as ROS dependencies
-# are not installed.
-set_target_properties(ros_bridge PROPERTIES BUILD_WITH_INSTALL_RPATH True
-                      LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
-
-macro(compile_plugin NAME)
-  message(lib path ${LIBRARY_OUTPUT_PATH})
-  file(MAKE_DIRECTORY "${LIBRARY_OUTPUT_PATH}/dynamic_graph/ros/${NAME}")
-  add_library(${NAME} SHARED src/${NAME}.cpp src/${NAME}.hh)
-  pkg_config_use_dependency(${NAME} dynamic-graph)
-  pkg_config_use_dependency(${NAME} sot-core)
-  pkg_config_use_dependency(${NAME} dynamic_graph_bridge_msgs)
-  add_dependencies(${NAME} ros_bridge)
-  target_link_libraries(${NAME} ros_bridge)
-  set_target_properties(${NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH True)
-  set_target_properties(${NAME} PROPERTIES PREFIX "")
-  install(TARGETS ${NAME} DESTINATION lib/plugin)
-endmacro()
-
-# Build Sot Entities
-set(listplugins ros_publish ros_subscribe ros_queued_subscribe ros_tf_listener ros_time)
-
-foreach(aplugin ${listplugins})
-  compile_plugin(${aplugin})
-endforeach()
-
-target_link_libraries(ros_publish ros_bridge)
+SET(${PROJECT_NAME}_SOURCES
+  src/ros_init.cpp
+  src/sot_to_ros.cpp
+  )
 
-IF(BUILD_PYTHON_INTERFACE)
-  foreach(NAME ${listplugins})
-    dynamic_graph_python_module("ros/${NAME}"
-      ${NAME}
-      ros/${NAME}/wrap
-      )
-
-    PKG_CONFIG_USE_DEPENDENCY(ros/${NAME}/wrap realtime_tools)
-    PKG_CONFIG_USE_DEPENDENCY(ros/${NAME}/wrap dynamic_graph)
-    PKG_CONFIG_USE_DEPENDENCY(ros/${NAME}/wrap sot-core)
-    PKG_CONFIG_USE_DEPENDENCY(ros/${NAME}/wrap dynamic_graph_bridge_msgs)
-    PKG_CONFIG_USE_DEPENDENCY(ros/${NAME}/wrap tf2_ros)
-  endforeach()
-
-  # ros_interperter library.
-
-  add_library(ros_interpreter src/ros_interpreter.cpp)
-  pkg_config_use_dependency(ros_interpreter dynamic-graph)
-  pkg_config_use_dependency(ros_interpreter sot-core)
-  pkg_config_use_dependency(ros_interpreter roscpp)
-  pkg_config_use_dependency(ros_interpreter dynamic_graph_bridge_msgs)
-  pkg_config_use_dependency(ros_interpreter dynamic-graph-python)
-
-  add_dependencies(ros_interpreter ros_bridge)
-  target_link_libraries(ros_interpreter ros_bridge)
-  set_target_properties(ros_interpreter PROPERTIES BUILD_WITH_INSTALL_RPATH True
-                        LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
-  message(cmakeinstalllibdir " is ${CMAKE_INSTALL_LIBDIR} ")
-  install(TARGETS ros_interpreter
-    EXPORT ${TARGETS_EXPORT_NAME}
-    DESTINATION lib)
+ADD_LIBRARY(ros_bridge SHARED
+  ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS})
+TARGET_INCLUDE_DIRECTORIES(ros_bridge SYSTEM PUBLIC ${catkin_INCLUDE_DIRS})
+TARGET_INCLUDE_DIRECTORIES(ros_bridge PUBLIC $<INSTALL_INTERFACE:include>)
+TARGET_LINK_LIBRARIES(ros_bridge ${catkin_LIBRARIES} sot-core::sot-core)
+pkg_config_use_dependency(ros_bridge dynamic_graph_bridge_msgs)
 
-ENDIF(BUILD_PYTHON_INTERFACE)
+IF(SUFFIX_SO_VERSION)
+  SET_TARGET_PROPERTIES(ros_bridge PROPERTIES SOVERSION ${PROJECT_VERSION})
+ENDIF(SUFFIX_SO_VERSION)
 
-# Stand alone embedded intepreter with a robot controller.
-add_executable(geometric_simu src/geometric_simu.cpp src/sot_loader.cpp src/sot_loader_basic.cpp)
-pkg_config_use_dependency(geometric_simu tf2_ros)
-pkg_config_use_dependency(geometric_simu roscpp)
-pkg_config_use_dependency(geometric_simu dynamic-graph)
-target_link_libraries(geometric_simu  ros_bridge tf2_ros ${Boost_LIBRARIES} ${CMAKE_DL_LIBS})
-
-# Sot loader library
-add_library(sot_loader src/sot_loader.cpp src/sot_loader_basic.cpp)
-pkg_config_use_dependency(sot_loader dynamic-graph)
-pkg_config_use_dependency(sot_loader sot-core)
-target_link_libraries(sot_loader ${Boost_LIBRARIES} roscpp ros_bridge tf2_ros)
-install(TARGETS sot_loader
-  EXPORT ${TARGETS_EXPORT_NAME}
-  DESTINATION lib)
+IF(NOT INSTALL_PYTHON_INTERFACE_ONLY)
+  INSTALL(TARGETS ros_bridge EXPORT ${TARGETS_EXPORT_NAME} DESTINATION lib)
+ENDIF(NOT INSTALL_PYTHON_INTERFACE_ONLY)
 
 add_subdirectory(src)
 add_subdirectory(tests)
 
-# This is necessary so that the pc file generated by catking is similar to the on
-# done directly by jrl-cmake-modules
-catkin_package(INCLUDE_DIRS include CATKIN_DEPENDS message_runtime roscpp realtime_tools ${SOT_PKGNAMES} tf2_ros
-  LIBRARIES ${CATKIN_DEPENDS_LIBRARIES}
-)
-
-# Add libraries in pc file generated by cmake submodule
-PKG_CONFIG_APPEND_LIBS(ros_bridge sot_loader)
-
-IF(BUILD_PYTHON_INTERFACE)
-  PKG_CONFIG_APPEND_LIBS(ros_interpreter)
-
-  #install ros executables
-  install(PROGRAMS
-    ${CMAKE_SOURCE_DIR}/scripts/robot_pose_publisher
-    ${CMAKE_SOURCE_DIR}/scripts/run_command
-    ${CMAKE_SOURCE_DIR}/scripts/tf_publisher
-    DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
-    )
-
-ENDIF(BUILD_PYTHON_INTERFACE)
-
-message(cmake_install_bindir " is ${CMAKE_INSTALL_BINDIR} ")
-
-# Install the geometrical simulation node
-install(TARGETS geometric_simu
-  EXPORT ${TARGETS_EXPORT_NAME}
-  DESTINATION
-  ${CATKIN_PACKAGE_SHARE_DESTINATION})
+#install ros executables
+install(PROGRAMS
+  scripts/robot_pose_publisher
+  scripts/run_command
+  scripts/tf_publisher
+  DESTINATION share/${PROJECT_NAME}
+  )
 
 # Install package information
-install(FILES manifest.xml
-  DESTINATION
-  ${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}/)
+install(FILES manifest.xml package.xml DESTINATION share/${PROJECT_NAME})
+PKG_CONFIG_APPEND_LIBS(ros_bridge sot_loader)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 85861d397e2fd9390d0b8b93a31257f7febed691..653ee63219c57dd59a02292b53a7f170f100c236 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,8 +1,62 @@
+SET(plugins
+  ros_publish
+  ros_subscribe
+  ros_queued_subscribe
+  ros_tf_listener
+  ros_time
+  )
+
+FOREACH(plugin ${plugins})
+  GET_FILENAME_COMPONENT(LIBRARY_NAME ${plugin} NAME)
+  ADD_LIBRARY(${LIBRARY_NAME} SHARED ${plugin}.cpp ${plugin}.hh)
+
+  IF(SUFFIX_SO_VERSION)
+    SET_TARGET_PROPERTIES(${LIBRARY_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION})
+  ENDIF(SUFFIX_SO_VERSION)
+
+  TARGET_LINK_LIBRARIES(${LIBRARY_NAME} ros_bridge ${${LIBRARY_NAME}_deps})
+
+  IF(NOT INSTALL_PYTHON_INTERFACE_ONLY)
+    INSTALL(TARGETS ${LIBRARY_NAME} EXPORT ${TARGETS_EXPORT_NAME}
+      DESTINATION ${DYNAMIC_GRAPH_PLUGINDIR})
+  ENDIF(NOT INSTALL_PYTHON_INTERFACE_ONLY)
+
+  IF(BUILD_PYTHON_INTERFACE)
+    STRING(REPLACE - _ PYTHON_LIBRARY_NAME ${LIBRARY_NAME})
+    DYNAMIC_GRAPH_PYTHON_MODULE("ros/${PYTHON_LIBRARY_NAME}"
+      ${LIBRARY_NAME} ${PROJECT_NAME}-${PYTHON_LIBRARY_NAME}-wrap)
+
+    PKG_CONFIG_USE_DEPENDENCY(${PROJECT_NAME}-${PYTHON_LIBRARY_NAME}-wrap realtime_tools)
+    PKG_CONFIG_USE_DEPENDENCY(${PROJECT_NAME}-${PYTHON_LIBRARY_NAME}-wrap tf2_ros)
+  ENDIF(BUILD_PYTHON_INTERFACE)
+ENDFOREACH(plugin)
+
+target_link_libraries(ros_publish ros_bridge)
+
 IF(BUILD_PYTHON_INTERFACE)
-  INSTALL(FILES
-    "dynamic_graph/ros/__init__.py"
-    "dynamic_graph/ros/ros.py"
-    "dynamic_graph/ros/dgcompleter.py"
-    DESTINATION "${PYTHON_SITELIB}/dynamic_graph/ros"
-    )
+  PYTHON_INSTALL_ON_SITE("dynamic_graph/ros" "__init__.py")
+  PYTHON_INSTALL_ON_SITE("dynamic_graph/ros" "ros.py")
+  PYTHON_INSTALL_ON_SITE("dynamic_graph/ros" "dgcompleter.py")
+
+  # ros_interperter library.
+  add_library(ros_interpreter ros_interpreter.cpp)
+  TARGET_LINK_LIBRARIES(ros_interpreter ros_bridge
+    dynamic-graph-python::dynamic-graph-python)
+  pkg_config_use_dependency(ros_interpreter roscpp)
+
+  install(TARGETS ros_interpreter
+    EXPORT ${TARGETS_EXPORT_NAME}
+    DESTINATION lib)
 ENDIF(BUILD_PYTHON_INTERFACE)
+
+# Stand alone embedded intepreter with a robot controller.
+add_executable(geometric_simu geometric_simu.cpp sot_loader.cpp sot_loader_basic.cpp)
+pkg_config_use_dependency(geometric_simu roscpp)
+target_link_libraries(geometric_simu ros_bridge tf2_ros ${Boost_LIBRARIES} ${CMAKE_DL_LIBS})
+install(TARGETS geometric_simu EXPORT ${TARGETS_EXPORT_NAME}
+  DESTINATION bin)
+
+# Sot loader library
+add_library(sot_loader sot_loader.cpp sot_loader_basic.cpp)
+target_link_libraries(sot_loader ${Boost_LIBRARIES} roscpp ros_bridge tf2_ros)
+install(TARGETS sot_loader EXPORT ${TARGETS_EXPORT_NAME} DESTINATION lib)