diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8c7442c758f828e7c7002c987378cb1d20350b5c..dc21806a605dbff74021e278c8f136071de3693e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -199,7 +199,6 @@ px4_add_git_submodule(TARGET git_mavlink PATH "mavlink/include/mavlink/v1.0")
 px4_add_git_submodule(TARGET git_mavlink2 PATH "mavlink/include/mavlink/v2.0")
 px4_add_git_submodule(TARGET git_nuttx PATH "platforms/nuttx/NuttX/nuttx")
 px4_add_git_submodule(TARGET git_uavcan PATH "src/modules/uavcan/libuavcan")
-px4_add_git_submodule(TARGET git_micro_cdr PATH "src/lib/micro-CDR")
 
 #=============================================================================
 
@@ -356,6 +355,22 @@ include_directories(${include_dirs})
 link_directories(${link_dirs})
 add_definitions(${definitions})
 
+#=============================================================================
+# RTPS and micro-cdr
+#
+
+find_program(FASTRTPSGEN fastrtpsgen PATHS $ENV{FASTRTPSGEN_DIR})
+if (FASTRTPSGEN AND (config_rtps_send_topics OR config_rtps_receive_topics))
+	option(GENERATE_RTPS_BRIDGE "enable RTPS and microCDR" ON)
+endif()
+
+if (GENERATE_RTPS_BRIDGE)
+	# add micro-CDR
+	message(STATUS "RTPS bridge enabled, send: ${config_rtps_send_topics} receive: ${config_rtps_receive_topics}")
+	px4_add_git_submodule(TARGET git_micro_cdr PATH src/lib/micro-CDR)
+	add_subdirectory(src/lib/micro-CDR EXCLUDE_FROM_ALL)
+endif()
+
 #=============================================================================
 # message, and airframe generation
 #
diff --git a/cmake/common/px4_base.cmake b/cmake/common/px4_base.cmake
index f3343728539d85455e240473cfb9502200a34522..5c939446e9f06cc5d051b53fe710da3a96de1c34 100644
--- a/cmake/common/px4_base.cmake
+++ b/cmake/common/px4_base.cmake
@@ -545,7 +545,9 @@ endfunction()
 #
 function(px4_add_library target)
 	add_library(${target} ${ARGN})
+	add_dependencies(${target} prebuild_targets)
 	px4_add_optimization_flags_for_target(${target})
+
 	# Pass variable to the parent px4_add_module.
 	set(_no_optimization_for_target ${_no_optimization_for_target} PARENT_SCOPE)
 
diff --git a/cmake/configs/nuttx_aerocore2_default.cmake b/cmake/configs/nuttx_aerocore2_default.cmake
index cdd136869bf596036ce232ce904112c8bb35611d..c2ed66b898bf89c2ceb9f9d8328d653f42e12a8c 100644
--- a/cmake/configs/nuttx_aerocore2_default.cmake
+++ b/cmake/configs/nuttx_aerocore2_default.cmake
@@ -129,7 +129,6 @@ set(config_module_list
 	lib/version
 	lib/DriverFramework/framework
 	platforms/nuttx
-	lib/micro-CDR
 
 	# had to add for cmake, not sure why wasn't in original config
 	platforms/common
diff --git a/cmake/configs/nuttx_aerofc-v1_default.cmake b/cmake/configs/nuttx_aerofc-v1_default.cmake
index ce1f44e144b5507d7bf3b25b3e0c97b28ed00b2f..b7cd86b228797e9ff560ab22c953075c135ea921 100644
--- a/cmake/configs/nuttx_aerofc-v1_default.cmake
+++ b/cmake/configs/nuttx_aerofc-v1_default.cmake
@@ -89,7 +89,6 @@ set(config_module_list
 	lib/DriverFramework/framework
 	lib/rc
 	platforms/nuttx
-	lib/micro-CDR
 	platforms/common
 	platforms/nuttx/px4_layer
 )
diff --git a/cmake/configs/nuttx_auav-x21_default.cmake b/cmake/configs/nuttx_auav-x21_default.cmake
index c0180bfe818a9b7ad80b7a3e8a67cd5f1ebeee3e..34c7700aceba3a1f0dee6755951838363c746d96 100644
--- a/cmake/configs/nuttx_auav-x21_default.cmake
+++ b/cmake/configs/nuttx_auav-x21_default.cmake
@@ -149,7 +149,6 @@ set(config_module_list
 	lib/version
 	lib/DriverFramework/framework
 	platforms/nuttx
-	lib/micro-CDR
 
 	# had to add for cmake, not sure why wasn't in original config
 	platforms/common
diff --git a/cmake/configs/nuttx_crazyflie_default.cmake b/cmake/configs/nuttx_crazyflie_default.cmake
index f876bcaa0f9b166f29d979d536a7acc286693bec..9a5ad86ec2db552ca3eaea2757d90b167b88093b 100644
--- a/cmake/configs/nuttx_crazyflie_default.cmake
+++ b/cmake/configs/nuttx_crazyflie_default.cmake
@@ -96,7 +96,6 @@ set(config_module_list
 	lib/version
 	lib/DriverFramework/framework
 	platforms/nuttx
-	lib/micro-CDR
 
 	# had to add for cmake, not sure why wasn't in original config
 	platforms/common
diff --git a/cmake/configs/nuttx_esc35-v1_default.cmake b/cmake/configs/nuttx_esc35-v1_default.cmake
index fb7b3a59ada1e361c159458e3eb80adf5c66aad4..cc78a748813c023f65e8965358fc8af62bab68a9 100644
--- a/cmake/configs/nuttx_esc35-v1_default.cmake
+++ b/cmake/configs/nuttx_esc35-v1_default.cmake
@@ -66,7 +66,6 @@ set(config_module_list
 	#
 	# Library modules
 	#
-	lib/micro-CDR
 	lib/version
 	modules/systemlib
 	modules/systemlib/param
diff --git a/cmake/configs/nuttx_mindpx-v2_default.cmake b/cmake/configs/nuttx_mindpx-v2_default.cmake
index 8da71c258ae624e057e8988d06750bcfc574412c..446a5aaa770f0b932ef5c0709a02ff27782aa065 100644
--- a/cmake/configs/nuttx_mindpx-v2_default.cmake
+++ b/cmake/configs/nuttx_mindpx-v2_default.cmake
@@ -157,7 +157,6 @@ set(config_module_list
 	lib/version
 	lib/DriverFramework/framework
 	platforms/nuttx
-	lib/micro-CDR
 
 	# had to add for cmake, not sure why wasn't in original config
 	platforms/common
diff --git a/cmake/configs/nuttx_nxphlite-v3_default.cmake b/cmake/configs/nuttx_nxphlite-v3_default.cmake
index e91834dedb0ed3116e235a2642a13a6e0a83263e..e010c843acf7537c78ee7a6c510ebc5381420fa2 100644
--- a/cmake/configs/nuttx_nxphlite-v3_default.cmake
+++ b/cmake/configs/nuttx_nxphlite-v3_default.cmake
@@ -166,7 +166,6 @@ set(config_module_list
 	lib/tailsitter_recovery
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	#
 	# Platform
diff --git a/cmake/configs/nuttx_px4-same70xplained-v1_default.cmake b/cmake/configs/nuttx_px4-same70xplained-v1_default.cmake
index aaa009b8d7a6e236dafaf182be947c44fbe77ae6..f07b27350de2db7884450d28bb0f9576a4f7d23a 100644
--- a/cmake/configs/nuttx_px4-same70xplained-v1_default.cmake
+++ b/cmake/configs/nuttx_px4-same70xplained-v1_default.cmake
@@ -135,7 +135,6 @@ set(config_module_list
 	# had to add for cmake, not sure why wasn't in original config
 	platforms/common
 	platforms/nuttx/px4_layer
-	lib/micro-CDR
 
 	#
 	# OBC challenge
diff --git a/cmake/configs/nuttx_px4-stm32f4discovery_default.cmake b/cmake/configs/nuttx_px4-stm32f4discovery_default.cmake
index 8172dcbd0a8a05f92dadc9ed7bf72605201a8a4f..7d4110ef05d9705cfeb4a1e13b0b653525665550 100644
--- a/cmake/configs/nuttx_px4-stm32f4discovery_default.cmake
+++ b/cmake/configs/nuttx_px4-stm32f4discovery_default.cmake
@@ -46,7 +46,6 @@ set(config_module_list
 	lib/version
 	lib/DriverFramework/framework
 	platforms/nuttx
-	lib/micro-CDR
 
 	# had to add for cmake, not sure why wasn't in original config
 	platforms/common
diff --git a/cmake/configs/nuttx_px4cannode-v1_default.cmake b/cmake/configs/nuttx_px4cannode-v1_default.cmake
index f607b2f195d238648f2adc38bd563acc46078571..b97e05e16f7beceb97013caa11981fc984d5e617 100644
--- a/cmake/configs/nuttx_px4cannode-v1_default.cmake
+++ b/cmake/configs/nuttx_px4cannode-v1_default.cmake
@@ -58,7 +58,6 @@ set(config_module_list
 	#
 	# Library modules
 	#
-	lib/micro-CDR
 	lib/version
 	modules/systemlib
 	modules/systemlib/param
diff --git a/cmake/configs/nuttx_px4esc-v1_default.cmake b/cmake/configs/nuttx_px4esc-v1_default.cmake
index 78c6d5f229ad92f0236dc527cb6a2d7020d1148c..1adf33a879317f4755cab47f19c88e8cc1aac0da 100644
--- a/cmake/configs/nuttx_px4esc-v1_default.cmake
+++ b/cmake/configs/nuttx_px4esc-v1_default.cmake
@@ -67,7 +67,6 @@ set(config_module_list
 	#
 	# Library modules
 	#
-	lib/micro-CDR
 	lib/version
 	modules/systemlib
 	modules/systemlib/param
diff --git a/cmake/configs/nuttx_px4fmu-v2_default.cmake b/cmake/configs/nuttx_px4fmu-v2_default.cmake
index 9402c0c0be0f891c8f6114edcd9e3ceebe7173b7..557400774dd0772a4ca052a67bd77c9306df6957 100644
--- a/cmake/configs/nuttx_px4fmu-v2_default.cmake
+++ b/cmake/configs/nuttx_px4fmu-v2_default.cmake
@@ -149,7 +149,6 @@ set(config_module_list
 	lib/version
 	lib/DriverFramework/framework
 	platforms/nuttx
-	lib/micro-CDR
 
 	# had to add for cmake, not sure why wasn't in original config
 	platforms/common
diff --git a/cmake/configs/nuttx_px4fmu-v2_test.cmake b/cmake/configs/nuttx_px4fmu-v2_test.cmake
index eacce1f59855b48ed49585ec502802700d26a0e7..59d16b2d66e07b96ee6cb5f221de35cb8483a7ed 100644
--- a/cmake/configs/nuttx_px4fmu-v2_test.cmake
+++ b/cmake/configs/nuttx_px4fmu-v2_test.cmake
@@ -145,7 +145,6 @@ set(config_module_list
 	lib/version
 	lib/DriverFramework/framework
 	platforms/nuttx
-	lib/micro-CDR
 
 	# had to add for cmake, not sure why wasn't in original config
 	platforms/common
diff --git a/cmake/configs/nuttx_px4fmu-v3_default.cmake b/cmake/configs/nuttx_px4fmu-v3_default.cmake
index 35aba3fa54653b5c2abf822df0ee388f84b1c39e..a11d48beadd39a588b5182db4d3ee3687bf3b909 100644
--- a/cmake/configs/nuttx_px4fmu-v3_default.cmake
+++ b/cmake/configs/nuttx_px4fmu-v3_default.cmake
@@ -159,7 +159,6 @@ set(config_module_list
 	lib/tailsitter_recovery
 	lib/terrain_estimation
 	lib/version
-	lib/micro-CDR
 
 	#
 	# Platform
diff --git a/cmake/configs/nuttx_px4fmu-v4_default.cmake b/cmake/configs/nuttx_px4fmu-v4_default.cmake
index 9cb297f53456ca9abd45e16ecb5eff2f38fbcc61..417d17a36e1314e25d30ce7066ca2c8829dceaee 100644
--- a/cmake/configs/nuttx_px4fmu-v4_default.cmake
+++ b/cmake/configs/nuttx_px4fmu-v4_default.cmake
@@ -161,7 +161,6 @@ set(config_module_list
 	lib/tailsitter_recovery
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	#
 	# Platform
diff --git a/cmake/configs/nuttx_px4fmu-v4pro_default.cmake b/cmake/configs/nuttx_px4fmu-v4pro_default.cmake
index db4f47d4481c7965f3d19b34f0612943889679d9..20c54bf9ac3725df441efd652ad61af40fa15780 100644
--- a/cmake/configs/nuttx_px4fmu-v4pro_default.cmake
+++ b/cmake/configs/nuttx_px4fmu-v4pro_default.cmake
@@ -160,7 +160,6 @@ set(config_module_list
 	lib/tailsitter_recovery
 	lib/terrain_estimation
 	lib/version
-	lib/micro-CDR
 
 	#
 	# Platform
diff --git a/cmake/configs/nuttx_px4fmu-v5_default.cmake b/cmake/configs/nuttx_px4fmu-v5_default.cmake
index 98483a323acf7b75c85122e2e6423d9d501d054f..f26c3192a2e81c978f2c75b9af01497ffd0ff9db 100644
--- a/cmake/configs/nuttx_px4fmu-v5_default.cmake
+++ b/cmake/configs/nuttx_px4fmu-v5_default.cmake
@@ -161,7 +161,6 @@ set(config_module_list
 	lib/tailsitter_recovery
 	lib/terrain_estimation
 	lib/version
-	lib/micro-CDR
 
 	#
 	# Platform
diff --git a/cmake/configs/nuttx_px4io-v2_default.cmake b/cmake/configs/nuttx_px4io-v2_default.cmake
index abe966fa505a639659f0b50cf9f49e9d11e2f071..40ee747ef2cd6e45f82dc3650c76592e6f070be3 100644
--- a/cmake/configs/nuttx_px4io-v2_default.cmake
+++ b/cmake/configs/nuttx_px4io-v2_default.cmake
@@ -10,5 +10,4 @@ set(config_module_list
 	modules/systemlib/mixer
 	platforms/common
 
-	lib/micro-CDR
 )
diff --git a/cmake/configs/nuttx_px4nucleoF767ZI-v1_default.cmake b/cmake/configs/nuttx_px4nucleoF767ZI-v1_default.cmake
index ac8a2ab02cbaa5745d67a64f2e704d141792de54..cbf98a728a03eb0e4ad36d053b349d9af1beb204 100644
--- a/cmake/configs/nuttx_px4nucleoF767ZI-v1_default.cmake
+++ b/cmake/configs/nuttx_px4nucleoF767ZI-v1_default.cmake
@@ -137,7 +137,6 @@ set(config_module_list
 	lib/version
 	lib/DriverFramework/framework
 	platforms/nuttx
-	lib/micro-CDR
 
 	# had to add for cmake, not sure why wasn't in original config
 	platforms/common
diff --git a/cmake/configs/nuttx_s2740vc-v1_default.cmake b/cmake/configs/nuttx_s2740vc-v1_default.cmake
index 2c9e138b9a820baedcd974315026984fc8c94815..6512bf6c82d29db586eded7af86f7ff0b52fa68c 100644
--- a/cmake/configs/nuttx_s2740vc-v1_default.cmake
+++ b/cmake/configs/nuttx_s2740vc-v1_default.cmake
@@ -60,7 +60,6 @@ set(config_module_list
 	modules/systemlib/param
 	modules/systemlib
 	lib/version
-	lib/micro-CDR
 
 	#
 	# Libraries
diff --git a/cmake/configs/nuttx_tap-v1_default.cmake b/cmake/configs/nuttx_tap-v1_default.cmake
index b0489d483f69123af2374031ae4e784b236b2f71..717641a45df6bc38a0f796add5d1d93575eb1fdc 100644
--- a/cmake/configs/nuttx_tap-v1_default.cmake
+++ b/cmake/configs/nuttx_tap-v1_default.cmake
@@ -104,7 +104,6 @@ set(config_module_list
 	lib/version
 	lib/DriverFramework/framework
 	platforms/nuttx
-	lib/micro-CDR
 
 	# had to add for cmake, not sure why wasn't in original config
 	platforms/common
diff --git a/cmake/configs/posix_bebop_default.cmake b/cmake/configs/posix_bebop_default.cmake
index 61665fff13f06b959486c30054be76b5265140d6..3fa4c44142acf8ec8ac89be8daed15688f1f48ae 100644
--- a/cmake/configs/posix_bebop_default.cmake
+++ b/cmake/configs/posix_bebop_default.cmake
@@ -87,7 +87,6 @@ set(config_module_list
 	lib/tailsitter_recovery
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	#
 	# POSIX
diff --git a/cmake/configs/posix_eagle_hil.cmake b/cmake/configs/posix_eagle_hil.cmake
index 65cb84d9e82e382e5bedd92ae23f6fc07eaa87c7..1037d7d030aa91b602e2d719253c4509fd180694 100644
--- a/cmake/configs/posix_eagle_hil.cmake
+++ b/cmake/configs/posix_eagle_hil.cmake
@@ -48,7 +48,6 @@ set(config_module_list
 	lib/conversion
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	platforms/common
 	platforms/posix/px4_layer
diff --git a/cmake/configs/posix_eagle_muorb.cmake b/cmake/configs/posix_eagle_muorb.cmake
index dbcab7785bca2bef9ed46d1e461b3f7661619013..a04d645e0ff9ba25a01460fd517f4bb62ef98bc1 100644
--- a/cmake/configs/posix_eagle_muorb.cmake
+++ b/cmake/configs/posix_eagle_muorb.cmake
@@ -19,7 +19,6 @@ set(config_module_list
 	modules/uORB
 
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	platforms/posix/px4_layer
 	platforms/posix/work_queue
diff --git a/cmake/configs/posix_ocpoc_cross.cmake b/cmake/configs/posix_ocpoc_cross.cmake
index 83620b46dc0b3c6d71fbdb91f0044dea308dcff6..9eda20cc3e15ff02a178cf2b24a5e3ed526ad5bb 100644
--- a/cmake/configs/posix_ocpoc_cross.cmake
+++ b/cmake/configs/posix_ocpoc_cross.cmake
@@ -94,7 +94,6 @@ set(config_module_list
 	lib/DriverFramework/framework
 	lib/rc
 	lib/led
-	lib/micro-CDR
 
 	#
 	# POSIX
diff --git a/cmake/configs/posix_ocpoc_ubuntu.cmake b/cmake/configs/posix_ocpoc_ubuntu.cmake
index cade535c4048123ecbb647c3539e2d590bc5d008..87762770ee924c536165bc697de08fcc5e1f097f 100644
--- a/cmake/configs/posix_ocpoc_ubuntu.cmake
+++ b/cmake/configs/posix_ocpoc_ubuntu.cmake
@@ -93,7 +93,6 @@ set(config_module_list
 	lib/DriverFramework/framework
 	lib/rc
 	lib/led
-	lib/micro-CDR
 
 	#
 	# POSIX
diff --git a/cmake/configs/posix_rpi_common.cmake b/cmake/configs/posix_rpi_common.cmake
index e54331d0a2fd56ddcff9df9e811c86d4261d7cbe..10a711189a8e7708dc0061ed5c1a252b814ca7d1 100644
--- a/cmake/configs/posix_rpi_common.cmake
+++ b/cmake/configs/posix_rpi_common.cmake
@@ -108,7 +108,6 @@ set(config_module_list
 	lib/tailsitter_recovery
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	#
 	# POSIX
diff --git a/cmake/configs/posix_sdflight_default.cmake b/cmake/configs/posix_sdflight_default.cmake
index 5f870208e7e14d447954ff80e463377ba648e2a3..edb9a72f618afbde17c0b115b14c8777288a87dc 100644
--- a/cmake/configs/posix_sdflight_default.cmake
+++ b/cmake/configs/posix_sdflight_default.cmake
@@ -82,7 +82,6 @@ set(config_module_list
 	lib/tailsitter_recovery
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	platforms/common
 	platforms/posix/px4_layer
diff --git a/cmake/configs/posix_sdflight_legacy.cmake b/cmake/configs/posix_sdflight_legacy.cmake
index 9d7a13bffdec52cf15a5263f826b3f16bb4110b5..977006646409d65d30a07c73d78c0446c112f74e 100644
--- a/cmake/configs/posix_sdflight_legacy.cmake
+++ b/cmake/configs/posix_sdflight_legacy.cmake
@@ -74,7 +74,6 @@ set(config_module_list
 	lib/tailsitter_recovery
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	platforms/common
 	platforms/posix/px4_layer
diff --git a/cmake/configs/posix_sitl_default.cmake b/cmake/configs/posix_sitl_default.cmake
index 8fbbaec0d8d1d43111fe8c0e3b15481e86c233b9..8eff874d92c2f9da42ea4ccc0d6472b793689313 100644
--- a/cmake/configs/posix_sitl_default.cmake
+++ b/cmake/configs/posix_sitl_default.cmake
@@ -191,7 +191,6 @@ set(config_module_list
 	examples/ekf_att_pos_estimator
 
 	# micro-RTPS
-	lib/micro-CDR
 )
 
 set(config_rtps_send_topics
diff --git a/cmake/configs/qurt_eagle_hello.cmake b/cmake/configs/qurt_eagle_hello.cmake
index bb009f7f86ca5c9e029dda50802c8bab428bd0ab..f8fd30f33b10cfeff361825b7e00c1a7339ab188 100644
--- a/cmake/configs/qurt_eagle_hello.cmake
+++ b/cmake/configs/qurt_eagle_hello.cmake
@@ -34,11 +34,6 @@ set(config_module_list
 	modules/systemlib/param
 	modules/systemlib
 	modules/uORB
-	
-	#
-    # Libraries
-    #
-	lib/micro-CDR
 
 	#
 	# QuRT port
diff --git a/cmake/configs/qurt_eagle_hil.cmake b/cmake/configs/qurt_eagle_hil.cmake
index 6ab7e9590a7c6f9eb524507cb8bbbc7609f65fce..7cbf3a24115e7aae130a19729a9a4244ead33073 100644
--- a/cmake/configs/qurt_eagle_hil.cmake
+++ b/cmake/configs/qurt_eagle_hil.cmake
@@ -73,7 +73,6 @@ set(config_module_list
 	lib/controllib
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	#
 	# QuRT port
diff --git a/cmake/configs/qurt_eagle_muorb.cmake b/cmake/configs/qurt_eagle_muorb.cmake
index bd8bc0fe8acd26be696200d0aa21fbd29288d174..7f34764a328b5259ec5013630ac969886fc38bad 100644
--- a/cmake/configs/qurt_eagle_muorb.cmake
+++ b/cmake/configs/qurt_eagle_muorb.cmake
@@ -45,7 +45,6 @@ set(config_module_list
 	lib/conversion
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	#
 	# QuRT port
diff --git a/cmake/configs/qurt_eagle_test.cmake b/cmake/configs/qurt_eagle_test.cmake
index 46f979d3bc2fb6334d971da9f8f6efa9068725d4..c046420a6e9517956648cb89fcdf5eafbe46540a 100644
--- a/cmake/configs/qurt_eagle_test.cmake
+++ b/cmake/configs/qurt_eagle_test.cmake
@@ -43,7 +43,6 @@ set(config_module_list
 	lib/mathlib/math/filter
 	lib/conversion
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	#
 	# QuRT port
diff --git a/cmake/configs/qurt_eagle_travis.cmake b/cmake/configs/qurt_eagle_travis.cmake
index 385e901f2a8e6121c15568cf37e09c2923d54f3e..5d50971bd9eb474a37186fb8a0dc5f9195940d32 100644
--- a/cmake/configs/qurt_eagle_travis.cmake
+++ b/cmake/configs/qurt_eagle_travis.cmake
@@ -79,7 +79,6 @@ set(config_module_list
 	lib/tailsitter_recovery
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	#
 	# QuRT port
diff --git a/cmake/configs/qurt_sdflight_default.cmake b/cmake/configs/qurt_sdflight_default.cmake
index a1b65c01f8244ad3bc46d0c5c2b3da814f085ddb..2fbd8c2946b5ffe2fc27993b7762a990961fa524 100644
--- a/cmake/configs/qurt_sdflight_default.cmake
+++ b/cmake/configs/qurt_sdflight_default.cmake
@@ -94,7 +94,6 @@ set(config_module_list
 	lib/rc
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	#
 	# QuRT port
diff --git a/cmake/configs/qurt_sdflight_legacy.cmake b/cmake/configs/qurt_sdflight_legacy.cmake
index 9a6eeb9aa3479819fe0fbc5c0fe07d16128f7818..f4ffa3b0263cf64f21a00c3d23c2ea3a116bc9db 100644
--- a/cmake/configs/qurt_sdflight_legacy.cmake
+++ b/cmake/configs/qurt_sdflight_legacy.cmake
@@ -94,7 +94,6 @@ set(config_module_list
 	lib/rc
 	lib/version
 	lib/DriverFramework/framework
-	lib/micro-CDR
 
 	#
 	# QuRT port
diff --git a/cmake/nuttx/px4_impl_nuttx.cmake b/cmake/nuttx/px4_impl_nuttx.cmake
index feeb1ab9dbc55bd701772cad4c42e1bd669f8a9f..d4078f8c91255e1f9129630b46820b553983c2b8 100644
--- a/cmake/nuttx/px4_impl_nuttx.cmake
+++ b/cmake/nuttx/px4_impl_nuttx.cmake
@@ -236,7 +236,7 @@ function(px4_os_prebuild_targets)
 			REQUIRED OUT BOARD
 			ARGN ${ARGN})
 
-	add_custom_target(${OUT} DEPENDS nuttx_context)
+	add_custom_target(${OUT} DEPENDS nuttx_context uorb_headers)
 
 	# parse nuttx config options for cmake
 	file(STRINGS ${PX4_SOURCE_DIR}/nuttx-configs/${BOARD}/nsh/defconfig ConfigContents)
diff --git a/cmake/posix/px4_impl_posix.cmake b/cmake/posix/px4_impl_posix.cmake
index 778bca284f355bd6dfc13a33a97de33ee7dcc678..e285bfcc48c1ca7a0f8c48ea6220694b677b09a3 100644
--- a/cmake/posix/px4_impl_posix.cmake
+++ b/cmake/posix/px4_impl_posix.cmake
@@ -330,5 +330,6 @@ function(px4_os_prebuild_targets)
 			ONE_VALUE OUT BOARD THREADS
 			REQUIRED OUT BOARD
 			ARGN ${ARGN})
-	add_custom_target(${OUT})
+
+	add_custom_target(${OUT} DEPENDS uorb_headers)
 endfunction()
diff --git a/cmake/qurt/px4_impl_qurt.cmake b/cmake/qurt/px4_impl_qurt.cmake
index b0431108df6834e8598da74f92b7594ea4d25b75..e6ec7f5a2604ef095dccf8c7d05c0262e9b2ca8f 100644
--- a/cmake/qurt/px4_impl_qurt.cmake
+++ b/cmake/qurt/px4_impl_qurt.cmake
@@ -80,6 +80,7 @@ function(px4_qurt_generate_builtin_commands)
 		MULTI_VALUE MODULE_LIST
 		REQUIRED MODULE_LIST OUT
 		ARGN ${ARGN})
+
 	set(builtin_apps_string)
 	set(builtin_apps_decl_string)
 	set(command_count 0)
@@ -235,7 +236,8 @@ function(px4_os_prebuild_targets)
 			ONE_VALUE OUT BOARD THREADS
 			REQUIRED OUT BOARD
 			ARGN ${ARGN})
-	add_custom_target(${OUT} DEPENDS git_driverframework)
+
+	add_custom_target(${OUT} DEPENDS git_driverframework uorb_headers)
 
 endfunction()
 
diff --git a/msg/CMakeLists.txt b/msg/CMakeLists.txt
index 5e2b2166a73e82a0ce5d2104fa7084a4c9e90d01..9b0181d3914a45943015983f9b37b229bda1b19b 100644
--- a/msg/CMakeLists.txt
+++ b/msg/CMakeLists.txt
@@ -127,20 +127,17 @@ set(msg_files
 	wind_estimate.msg
 	)
 
-px4_add_git_submodule(TARGET git_gencpp PATH "Tools/gencpp")
-px4_add_git_submodule(TARGET git_genmsg PATH "Tools/genmsg")
+px4_add_git_submodule(TARGET git_gencpp PATH tools/gencpp)
+px4_add_git_submodule(TARGET git_genmsg PATH tools/genmsg)
 
 # headers
 set(msg_out_path ${PX4_BINARY_DIR}/uORB/topics)
 set(msg_source_out_path	${CMAKE_CURRENT_BINARY_DIR}/topics_sources)
-#set(msg_source_files_out ${CMAKE_CURRENT_BINARY_DIR}/uORBTopics.cpp)
 
-set(msg_list)
 set(uorb_headers)
 set(uorb_sources ${msg_source_out_path}/uORBTopics.cpp)
 foreach(msg_file ${msg_files})
 	get_filename_component(msg ${msg_file} NAME_WE)
-	list(APPEND msg_list ${msg})
 	list(APPEND uorb_headers ${msg_out_path}/${msg}.h)
 	list(APPEND uorb_sources ${msg_source_out_path}/${msg}.cpp)
 endforeach()
@@ -178,12 +175,78 @@ add_custom_command(OUTPUT ${uorb_sources}
 	VERBATIM
 	)
 
-add_library(uorb_msgs STATIC EXCLUDE_FROM_ALL ${uorb_sources})
-add_dependencies(uorb_msgs uorb_headers prebuild_targets)
+px4_add_library(uorb_msgs ${uorb_sources})
+add_dependencies(uorb_msgs uorb_headers)
 
-# microCDR now part of uORB
-target_include_directories(uorb_msgs
-	PRIVATE ${PX4_SOURCE_DIR}/src/lib/micro-CDR/include
-	PRIVATE ${PX4_BINARY_DIR}/src/lib/micro-CDR/include/microcdr
+###############################################################################
+# micro-cdr serialization
+###############################################################################
+# if RTPS is enabled generate serialization code for each uORB message
+if (GENERATE_RTPS_BRIDGE)
+
+	set(msg_out_path_microcdr ${PX4_BINARY_DIR}/uORB_microcdr/topics)
+	set(msg_source_out_path_microcdr ${CMAKE_CURRENT_BINARY_DIR}/topics_microcdr_sources)
+
+	set(uorb_headers_microcdr)
+	set(uorb_sources_microcdr)
+
+	# send topic files
+	set(send_topic_files)
+	foreach(topic ${config_rtps_send_topics})
+		list(APPEND send_topic_files ${PX4_SOURCE_DIR}/msg/${topic}.msg)
+		list(APPEND uorb_headers_microcdr ${msg_out_path_microcdr}/${topic}.h)
+		list(APPEND uorb_sources_microcdr ${msg_source_out_path_microcdr}/${topic}.cpp)
+	endforeach()
+
+	# receive topic files
+	set(receive_topic_files)
+	foreach(topic ${config_rtps_receive_topics})
+		list(APPEND receive_topic_files ${PX4_SOURCE_DIR}/msg/${topic}.msg)
+		list(APPEND uorb_headers_microcdr ${msg_out_path_microcdr}/${topic}.h)
+		list(APPEND uorb_sources_microcdr ${msg_source_out_path_microcdr}/${topic}.cpp)
+	endforeach()
+
+	list(REMOVE_DUPLICATES uorb_headers_microcdr)
+	list(REMOVE_DUPLICATES uorb_sources_microcdr)
+
+	# Generate uORB serialization headers
+	add_custom_command(OUTPUT ${uorb_headers_microcdr}
+		COMMAND ${PYTHON_EXECUTABLE} tools/px_generate_uorb_topic_files.py
+			--headers
+			-f ${send_topic_files} ${receive_topic_files}
+			-i ${CMAKE_CURRENT_SOURCE_DIR}
+			-o ${msg_out_path_microcdr}
+			-e templates/uorb_microcdr
+			-t ${CMAKE_CURRENT_BINARY_DIR}/tmp/headers_microcdr
+			-q
+		DEPENDS ${msg_files}
+		COMMENT "Generating uORB microcdr topic headers"
+		WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+		VERBATIM
+		)
+	add_custom_target(uorb_headers_microcdr DEPENDS ${uorb_headers_microcdr})
+
+	# Generate uORB serialization sources
+	add_custom_command(OUTPUT ${uorb_sources_microcdr}
+		COMMAND ${PYTHON_EXECUTABLE} tools/px_generate_uorb_topic_files.py
+			--sources
+			-f ${send_topic_files} ${receive_topic_files}
+			-i ${CMAKE_CURRENT_SOURCE_DIR}
+			-o ${msg_source_out_path_microcdr}
+			-e templates/uorb_microcdr
+			-t ${CMAKE_CURRENT_BINARY_DIR}/tmp/sources_microcdr
+			-q
+		DEPENDS ${msg_files}
+		COMMENT "Generating uORB microcdr topic sources"
+		WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+		VERBATIM
+		)
+	px4_add_library(uorb_msgs_microcdr ${uorb_sources_microcdr})
+	add_dependencies(uorb_msgs_microcdr uorb_headers_microcdr uorb_headers)
+
+	# microCDR
+	target_include_directories(uorb_msgs_microcdr
+		PRIVATE ${PX4_SOURCE_DIR}/src/lib/micro-CDR/include
+		PRIVATE ${PX4_BINARY_DIR}/src/lib/micro-CDR/include/microcdr
 	)
-target_link_libraries(uorb_msgs PRIVATE lib__micro-CDR)
+endif()
diff --git a/msg/templates/uorb/msg.cpp.template b/msg/templates/uorb/msg.cpp.template
index 5c3523c44ad8564e00821a83b3a148c361ec677e..3437e5c109cd3c4be7c8f6323cd177703829b297 100644
--- a/msg/templates/uorb/msg.cpp.template
+++ b/msg/templates/uorb/msg.cpp.template
@@ -64,9 +64,6 @@ struct_size, padding_end_size = add_padding_bytes(sorted_fields, search_path)
 topic_fields = ["uint64_t timestamp"]+["%s %s" % (convert_type(field.type), field.name) for field in sorted_fields]
 }@
 
-#include <px4_config.h>
-#include <drivers/drv_orb_dev.h>
-#include <microcdr/microCdr.h>
 #include <uORB/topics/@(topic_name).h>
 
 @# join all msg files in one line e.g: "float[3] position;float[3] velocity;bool armed"
@@ -76,99 +73,3 @@ constexpr char __orb_@(topic_name)_fields[] = "@( ";".join(topic_fields) );";
 @[for multi_topic in topics]@
 ORB_DEFINE(@multi_topic, struct @uorb_struct, @(struct_size-padding_end_size), __orb_@(topic_name)_fields);
 @[end for]
-
-@#################################################
-@# Searching for serialize function per each field
-@#################################################
-@{
-
-def print_info(field):
-    print("type: ", field.type, "name: ", field.name, "base_type: ", \
-          field.base_type, "field.is_array:", ('0', '1')[field.is_array], " array_len: ", field.array_len, \
-          "is_builtin:", ('0', '1')[field.is_builtin], "is_header:", ('0', '1')[field.is_header])
-
-def print_level_info(fields):
-    for field in fields:
-        print_info(field)
-        if (not field.is_builtin):
-            print("\n")
-            children_fields = get_children_fields(field.base_type, search_path)
-            print_level_info(children_fields)
-            print("\n")
-
-def walk_through_parsed_fields():
-    print_level_info(spec.parsed_fields())
-
-def get_serialization_type_name(type_name):
-    if type_name in type_serialize_map:
-        return type_serialize_map[type_name]
-    else:
-        raise Exception("Type {0} not supported, add to type_serialize_map!".format(type_name))
-
-def add_serialize_functions(fields, scope_name):
-    for field in fields:
-        if (not field.is_header):
-            if (field.is_builtin):
-                if (not field.is_array):
-                    print("\tserialize"+str(get_serialization_type_name(field.type))+"(input->"+scope_name+str(field.name)+", microCDRWriter);")
-                else:
-                    print("\tserialize"+str(get_serialization_type_name(field.base_type))+"Array(input->"+scope_name+str(field.name)+", "+str(field.array_len)+", microCDRWriter);")
-            else:
-                name = field.name
-                children_fields = get_children_fields(field.base_type, search_path)
-                if (scope_name):  name = scope_name + name
-                if (not field.is_array):
-                    add_serialize_functions(children_fields, name + '.')
-                else:
-                    for i in range(field.array_len):
-                        add_serialize_functions(children_fields, name + ('[%d].' %i))
-
-def add_deserialize_functions(fields, scope_name):
-    for field in fields:
-        if (not field.is_header):
-            if (field.is_builtin):
-                if (not field.is_array):
-                    print("\tdeserialize"+str(get_serialization_type_name(field.type))+"(&output->"+scope_name+str(field.name)+", microCDRReader);")
-                else:
-                    for i in range(field.array_len):
-                        print("\tdeserialize"+str(get_serialization_type_name(field.base_type))+"(&output->"+scope_name+str(field.name)+ str('[%d]' %i) +", microCDRReader);")
-            else:
-                name = field.name
-                children_fields = get_children_fields(field.base_type, search_path)
-                if (scope_name):  name = scope_name + name
-                if (not field.is_array):
-                    add_deserialize_functions(children_fields, name + '.')
-                else:
-                    for i in range(field.array_len):
-                        add_deserialize_functions(children_fields, name + ('[%d].' %i))
-
-def add_code_to_serialize():
-    # sort fields (using a stable sort) as in the declaration of the type
-    sorted_fields = sorted(spec.parsed_fields(), key=sizeof_field_type, reverse=True)
-    add_serialize_functions(sorted_fields, "")
-
-def add_code_to_deserialize():
-    # sort fields (using a stable sort) as in the declaration of the type
-    sorted_fields = sorted(spec.parsed_fields(), key=sizeof_field_type, reverse=True)
-    add_deserialize_functions(sorted_fields, "")
-}@
-
-void serialize_@(topic_name)(const struct @(uorb_struct) *input, char *output, uint32_t *length, struct microCDR *microCDRWriter)
-{
-    if (nullptr == input || nullptr == output || nullptr == length || nullptr == microCDRWriter) return;
-
-    resetStaticMicroCDRForSerialize(microCDRWriter);
-
-@add_code_to_serialize()
-
-    (*length) = microCDRWriter->m_microBuffer->m_serializedBuffer;
-}
-
-void deserialize_@(topic_name)(struct @(uorb_struct) *output, char *input, struct microCDR *microCDRReader)
-{
-    if (nullptr == output || nullptr == input || nullptr == microCDRReader) return;
-
-    resetStaticMicroCDRForDeserialize(microCDRReader);
-
-@add_code_to_deserialize()
-}
\ No newline at end of file
diff --git a/msg/templates/uorb/msg.h.template b/msg/templates/uorb/msg.h.template
index b4d9d09e6588ec1366dd243e735efbd25ad96f60..1d1c74271ed6ac267da3e8824e9f84a423f0f780 100644
--- a/msg/templates/uorb/msg.h.template
+++ b/msg/templates/uorb/msg.h.template
@@ -65,12 +65,6 @@ topic_name = spec.short_name
 @##############################
 @# Generic Includes
 @##############################
-#include <stdint.h>
-#ifdef __cplusplus
-#include <cstring>
-#else
-#include <string.h>
-#endif
 
 #include <uORB/uORB.h>
 
@@ -108,8 +102,6 @@ def print_parsed_fields():
             print_field_def(field)
 }@
 
-struct microCDR;
-
 #ifdef __cplusplus
 @#class @(uorb_struct) {
 struct __EXPORT @(uorb_struct) {
@@ -137,10 +129,6 @@ for constant in spec.constants:
 #endif
 };
 
-
-void serialize_@(topic_name)(const struct @(uorb_struct) *input, char *output, uint32_t *length, struct microCDR *microCDRWriter);
-void deserialize_@(topic_name)(struct @(uorb_struct) *output, char *input, struct microCDR *microCDRReader);
-
 /* register this as object request broker structure */
 @[for multi_topic in topics]@
 ORB_DECLARE(@multi_topic);
diff --git a/msg/templates/uorb/microRTPS_client.cpp.template b/msg/templates/uorb_microcdr/microRTPS_client.cpp.template
similarity index 99%
rename from msg/templates/uorb/microRTPS_client.cpp.template
rename to msg/templates/uorb_microcdr/microRTPS_client.cpp.template
index 8bdde23c0b07aa48b66a4af95902886755fefe64..500c961066fb0a78cccd177274067102fb5fabae 100644
--- a/msg/templates/uorb/microRTPS_client.cpp.template
+++ b/msg/templates/uorb_microcdr/microRTPS_client.cpp.template
@@ -67,6 +67,7 @@ recv_topics = [s.short_name for idx, s in enumerate(spec) if scope[idx] == MsgSc
 
 @[for topic in list(set(topic_names))]@
 #include <uORB/topics/@(topic).h>
+#include <uORB_microcdr/topics/@(topic).h>
 @[end for]@
 
 void* send(void *data);
diff --git a/msg/templates/uorb_microcdr/msg.cpp.template b/msg/templates/uorb_microcdr/msg.cpp.template
new file mode 100644
index 0000000000000000000000000000000000000000..fce05165972ec0c4120c4bcde1e1103560670444
--- /dev/null
+++ b/msg/templates/uorb_microcdr/msg.cpp.template
@@ -0,0 +1,166 @@
+@###############################################
+@#
+@# PX4 ROS compatible message source code
+@# generation for C++
+@#
+@# EmPy template for generating <msg>.h files
+@# Based on the original template for ROS
+@#
+@###############################################
+@# Start of Template
+@#
+@# Context:
+@#  - file_name_in (String) Source file
+@#  - spec (msggen.MsgSpec) Parsed specification of the .msg file
+@#  - md5sum (String) MD5Sum of the .msg specification
+@#  - search_path (dict) search paths for genmsg
+@#  - topics (List of String) multi-topic names
+@###############################################
+/****************************************************************************
+ *
+ *   Copyright (C) 2013-2016 PX4 Development Team. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name PX4 nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/* Auto-generated by genmsg_cpp from file @file_name_in */
+
+@{
+import genmsg.msgs
+import gencpp
+from px_generate_uorb_topic_helper import * # this is in Tools/
+
+uorb_struct = '%s_s'%spec.short_name
+topic_name = spec.short_name
+
+sorted_fields = sorted(spec.parsed_fields(), key=sizeof_field_type, reverse=True)
+struct_size, padding_end_size = add_padding_bytes(sorted_fields, search_path)
+topic_fields = ["uint64_t timestamp"]+["%s %s" % (convert_type(field.type), field.name) for field in sorted_fields]
+}@
+
+#include <px4_config.h>
+#include <microcdr/microCdr.h>
+#include <uORB/topics/@(topic_name).h>
+#include <uORB_microcdr/topics/@(topic_name).h>
+
+@#################################################
+@# Searching for serialize function per each field
+@#################################################
+@{
+
+def print_info(field):
+    print("type: ", field.type, "name: ", field.name, "base_type: ", \
+          field.base_type, "field.is_array:", ('0', '1')[field.is_array], " array_len: ", field.array_len, \
+          "is_builtin:", ('0', '1')[field.is_builtin], "is_header:", ('0', '1')[field.is_header])
+
+def print_level_info(fields):
+    for field in fields:
+        print_info(field)
+        if (not field.is_builtin):
+            print("\n")
+            children_fields = get_children_fields(field.base_type, search_path)
+            print_level_info(children_fields)
+            print("\n")
+
+def walk_through_parsed_fields():
+    print_level_info(spec.parsed_fields())
+
+def get_serialization_type_name(type_name):
+    if type_name in type_serialize_map:
+        return type_serialize_map[type_name]
+    else:
+        raise Exception("Type {0} not supported, add to type_serialize_map!".format(type_name))
+
+def add_serialize_functions(fields, scope_name):
+    for field in fields:
+        if (not field.is_header):
+            if (field.is_builtin):
+                if (not field.is_array):
+                    print("\tserialize"+str(get_serialization_type_name(field.type))+"(input->"+scope_name+str(field.name)+", microCDRWriter);")
+                else:
+                    print("\tserialize"+str(get_serialization_type_name(field.base_type))+"Array(input->"+scope_name+str(field.name)+", "+str(field.array_len)+", microCDRWriter);")
+            else:
+                name = field.name
+                children_fields = get_children_fields(field.base_type, search_path)
+                if (scope_name):  name = scope_name + name
+                if (not field.is_array):
+                    add_serialize_functions(children_fields, name + '.')
+                else:
+                    for i in range(field.array_len):
+                        add_serialize_functions(children_fields, name + ('[%d].' %i))
+
+def add_deserialize_functions(fields, scope_name):
+    for field in fields:
+        if (not field.is_header):
+            if (field.is_builtin):
+                if (not field.is_array):
+                    print("\tdeserialize"+str(get_serialization_type_name(field.type))+"(&output->"+scope_name+str(field.name)+", microCDRReader);")
+                else:
+                    for i in range(field.array_len):
+                        print("\tdeserialize"+str(get_serialization_type_name(field.base_type))+"(&output->"+scope_name+str(field.name)+ str('[%d]' %i) +", microCDRReader);")
+            else:
+                name = field.name
+                children_fields = get_children_fields(field.base_type, search_path)
+                if (scope_name):  name = scope_name + name
+                if (not field.is_array):
+                    add_deserialize_functions(children_fields, name + '.')
+                else:
+                    for i in range(field.array_len):
+                        add_deserialize_functions(children_fields, name + ('[%d].' %i))
+
+def add_code_to_serialize():
+    # sort fields (using a stable sort) as in the declaration of the type
+    sorted_fields = sorted(spec.parsed_fields(), key=sizeof_field_type, reverse=True)
+    add_serialize_functions(sorted_fields, "")
+
+def add_code_to_deserialize():
+    # sort fields (using a stable sort) as in the declaration of the type
+    sorted_fields = sorted(spec.parsed_fields(), key=sizeof_field_type, reverse=True)
+    add_deserialize_functions(sorted_fields, "")
+}@
+
+void serialize_@(topic_name)(const struct @(uorb_struct) *input, char *output, uint32_t *length, struct microCDR *microCDRWriter)
+{
+    if (nullptr == input || nullptr == output || nullptr == length || nullptr == microCDRWriter) return;
+
+    resetStaticMicroCDRForSerialize(microCDRWriter);
+
+@add_code_to_serialize()
+
+    (*length) = microCDRWriter->m_microBuffer->m_serializedBuffer;
+}
+
+void deserialize_@(topic_name)(struct @(uorb_struct) *output, char *input, struct microCDR *microCDRReader)
+{
+    if (nullptr == output || nullptr == input || nullptr == microCDRReader) return;
+
+    resetStaticMicroCDRForDeserialize(microCDRReader);
+
+@add_code_to_deserialize()
+}
\ No newline at end of file
diff --git a/msg/templates/uorb_microcdr/msg.h.template b/msg/templates/uorb_microcdr/msg.h.template
new file mode 100644
index 0000000000000000000000000000000000000000..ec05f4ead0bbb27499bcf307b904fe36db38e037
--- /dev/null
+++ b/msg/templates/uorb_microcdr/msg.h.template
@@ -0,0 +1,75 @@
+@###############################################
+@#
+@# PX4 ROS compatible message source code
+@# generation for C++
+@#
+@# EmPy template for generating <msg>.h files
+@# Based on the original template for ROS
+@#
+@###############################################
+@# Start of Template
+@#
+@# Context:
+@#  - file_name_in (String) Source file
+@#  - spec (msggen.MsgSpec) Parsed specification of the .msg file
+@#  - md5sum (String) MD5Sum of the .msg specification
+@#  - search_path (dict) search paths for genmsg
+@#  - topics (List of String) multi-topic names
+@###############################################
+/****************************************************************************
+ *
+ *   Copyright (C) 2013-2016 PX4 Development Team. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name PX4 nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/* Auto-generated by genmsg_cpp from file @file_name_in */
+
+@{
+import genmsg.msgs
+import gencpp
+from px_generate_uorb_topic_helper import * # this is in Tools/
+
+uorb_struct = '%s_s'%spec.short_name
+topic_name = spec.short_name
+}@
+
+#pragma once
+
+@##############################
+@# Generic Includes
+@##############################
+#include <uORB/topics/@(topic_name).h>
+#include <uORB_microcdr/topics/@(topic_name).h>
+
+struct microCDR;
+
+
+void serialize_@(topic_name)(const struct @(uorb_struct) *input, char *output, uint32_t *length, struct microCDR *microCDRWriter);
+void deserialize_@(topic_name)(struct @(uorb_struct) *output, char *input, struct microCDR *microCDRReader);
diff --git a/msg/templates/uorb_microcdr/uORBTopics.cpp.template b/msg/templates/uorb_microcdr/uORBTopics.cpp.template
new file mode 100644
index 0000000000000000000000000000000000000000..bc245b5f544258d6398670c4e8492852732acb71
--- /dev/null
+++ b/msg/templates/uorb_microcdr/uORBTopics.cpp.template
@@ -0,0 +1,46 @@
+@###############################################
+@#
+@# EmPy template for generating uORBTopics.cpp file
+@# for logging purposes
+@#
+@###############################################
+@# Start of Template
+@#
+@# Context:
+@#  - msgs (List) list of all msg files
+@#  - multi_topics (List) list of all multi-topic names
+@###############################################
+/****************************************************************************
+ *
+ *   Copyright (C) 2013-2015 PX4 Development Team. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name PX4 nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+#include <uORB/uORB.h>
\ No newline at end of file
diff --git a/msg/tools/generate_microRTPS_bridge.py b/msg/tools/generate_microRTPS_bridge.py
index fbff244b8203169fc01c8dbbdcc0a1d90b3d2e7f..86d212ac9f88b606dd12e9f7cb05e2e9fd0a4460 100644
--- a/msg/tools/generate_microRTPS_bridge.py
+++ b/msg/tools/generate_microRTPS_bridge.py
@@ -126,7 +126,7 @@ if del_tree:
 if agent and os.path.isdir(agent_out_dir + "/idl"):
     shutil.rmtree(agent_out_dir + "/idl")
 
-uorb_templates_dir = msg_folder + "/templates/uorb"
+uorb_templates_dir = msg_folder + "/templates/uorb_microcdr"
 urtps_templates_dir = msg_folder + "/templates/urtps"
 
 uRTPS_CLIENT_TEMPL_FILE = 'microRTPS_client.cpp.template'
diff --git a/src/drivers/airspeed/airspeed.h b/src/drivers/airspeed/airspeed.h
index d911e9dc3ede874ee8c816ce3600ca42366a8228..384403cb54027eba09e1a6b826c112e7d9805774 100644
--- a/src/drivers/airspeed/airspeed.h
+++ b/src/drivers/airspeed/airspeed.h
@@ -33,6 +33,7 @@
 
 #pragma once
 
+#include <string.h>
 #include <drivers/device/i2c.h>
 #include <drivers/drv_airspeed.h>
 #include <drivers/drv_hrt.h>
diff --git a/src/drivers/blinkm/blinkm.cpp b/src/drivers/blinkm/blinkm.cpp
index c69dae676aca4d5dd51f1d19bdd3b2019ee1e4b6..afc07becaff08b3bedfcb9bf28887f53e9c36b57 100644
--- a/src/drivers/blinkm/blinkm.cpp
+++ b/src/drivers/blinkm/blinkm.cpp
@@ -93,6 +93,8 @@
  *
  */
 
+#include <strings.h>
+
 #include <px4_config.h>
 
 #include <sys/types.h>
diff --git a/src/modules/mavlink/mavlink_ftp.cpp b/src/modules/mavlink/mavlink_ftp.cpp
index c1a385e42a03916af56f8b771d792ac07ae6f864..7221ef0011dc5e8fb972c84d59b15f12ce117ecf 100644
--- a/src/modules/mavlink/mavlink_ftp.cpp
+++ b/src/modules/mavlink/mavlink_ftp.cpp
@@ -40,6 +40,7 @@
 #include <fcntl.h>
 #include <sys/stat.h>
 #include <errno.h>
+#include <cstring>
 
 #include "mavlink_ftp.h"
 #include "mavlink_main.h"
diff --git a/src/modules/micrortps_bridge/micrortps_client/CMakeLists.txt b/src/modules/micrortps_bridge/micrortps_client/CMakeLists.txt
index 8b0e1db119f1e21b11b5d2c0af603ade5e2a99cc..1aaaaa4ac17bc9cedae50d28f7d567cf56a8ac74 100644
--- a/src/modules/micrortps_bridge/micrortps_client/CMakeLists.txt
+++ b/src/modules/micrortps_bridge/micrortps_client/CMakeLists.txt
@@ -31,19 +31,12 @@
 #
 ############################################################################
 
-if(NOT GENERATE_RTPS_BRIDGE MATCHES "off")
+if(GENERATE_RTPS_BRIDGE)
 
 	find_program(FASTRTPSGEN fastrtpsgen PATHS $ENV{FASTRTPSGEN_DIR})
 	if(NOT FASTRTPSGEN)
 		message(STATUS "WARNING: Unable to find fastrtpsgen. Building PX4 without RTPS bridge support")
-		px4_add_module(
-		    MODULE modules__micrortps_bridge__micrortps_client
-		    MAIN micrortps_client
-		    SRCS
-			microRTPS_client_dummy.cpp
-		    DEPENDS
-			platforms__common
-		)
+
 		return()
 	endif()
 
@@ -63,13 +56,13 @@ if(NOT GENERATE_RTPS_BRIDGE MATCHES "off")
 		endforeach()
 
 		foreach(topic ${config_rtps_send_topics})
-			list(APPEND topic_bridge_files_out ${msg_out_path}/${topic}_Publisher.cpp)
-			list(APPEND topic_bridge_files_out ${msg_out_path}/${topic}_Publisher.h)
+			list(APPEND topic_bridge_files_out ${msg_out_path}/micrortps_agent/${topic}_Publisher.cpp)
+			list(APPEND topic_bridge_files_out ${msg_out_path}/micrortps_agent/${topic}_Publisher.h)
 		endforeach()
 
 		foreach(topic ${config_rtps_receive_topics})
-			list(APPEND topic_bridge_files_out ${msg_out_path}/${topic}_Subscriber.cpp)
-			list(APPEND topic_bridge_files_out ${msg_out_path}/${topic}_Subscriber.h)
+			list(APPEND topic_bridge_files_out ${msg_out_path}/micrortps_agent/${topic}_Subscriber.cpp)
+			list(APPEND topic_bridge_files_out ${msg_out_path}/micrortps_agent/${topic}_Subscriber.h)
 		endforeach()
 
 		set(send_topic_files_opt)
@@ -96,9 +89,9 @@ if(NOT GENERATE_RTPS_BRIDGE MATCHES "off")
 				--topic-msg-dir ${PX4_SOURCE_DIR}/msg
 				--agent-outdir ${CMAKE_CURRENT_BINARY_DIR}/micrortps_agent
 				--client-outdir ${CMAKE_CURRENT_BINARY_DIR}/micrortps_client
+				>micrortps_bridge.log 2>&1 || cat micrortps_bridge.log # quiet successful build output
 			DEPENDS ${send_topic_files} ${receive_topic_files}
 			COMMENT "Generating RTPS topic bridge"
-			VERBATIM
 		)
 		add_custom_target(topic_bridge_files DEPENDS ${topic_bridge_files_out})
 
@@ -110,13 +103,13 @@ if(NOT GENERATE_RTPS_BRIDGE MATCHES "off")
 			MAIN micrortps_client
 			STACK_MAIN 4096
 			SRCS
-				${CMAKE_CURRENT_BINARY_DIR}/micrortps_client/microRTPS_transport.cpp
-				${CMAKE_CURRENT_BINARY_DIR}/micrortps_client/microRTPS_client.cpp
 				microRTPS_client_main.cpp
+				${msg_out_path}/micrortps_client/microRTPS_client.cpp
+				${msg_out_path}/micrortps_client/microRTPS_transport.cpp
 			DEPENDS
 				platforms__common
 				topic_bridge_files
-				uorb_headers
+				uorb_headers_microcdr
 		)
 		target_link_libraries(modules__micrortps_bridge__micrortps_client PRIVATE lib__micro-CDR)
 	endif()
diff --git a/src/modules/sdlog2/sdlog2.c b/src/modules/sdlog2/sdlog2.c
index 242826f37d1b4586e955db2f9446ba375e76ee26..ff69dc3df710e5fe6fae71807722ebc3a431338a 100644
--- a/src/modules/sdlog2/sdlog2.c
+++ b/src/modules/sdlog2/sdlog2.c
@@ -61,6 +61,7 @@
 #include <systemlib/err.h>
 #include <drivers/drv_hrt.h>
 #include <math.h>
+#include <string.h>
 
 #include <uORB/uORB.h>
 #include <uORB/topics/vehicle_status.h>
diff --git a/src/modules/uORB/CMakeLists.txt b/src/modules/uORB/CMakeLists.txt
index 95b5121363f3dbcd9f98204e85678d13cb93cd35..50187b771515bdaee6697006171ffb8b3cb85855 100644
--- a/src/modules/uORB/CMakeLists.txt
+++ b/src/modules/uORB/CMakeLists.txt
@@ -48,5 +48,4 @@ px4_add_module(
 		uORBUtils.cpp
 	DEPENDS
 		platforms__common
-	)
-target_link_libraries(modules__uORB uorb_msgs)
+	)
\ No newline at end of file
diff --git a/src/platforms/posix/px4_layer/px4_log.c b/src/platforms/posix/px4_layer/px4_log.c
index fddc46cf1462023fdbbcc001b049e1ecdf455980..6f40bd52776046136eb9469352633d90e428df44 100644
--- a/src/platforms/posix/px4_layer/px4_log.c
+++ b/src/platforms/posix/px4_layer/px4_log.c
@@ -1,4 +1,5 @@
 #include <stdlib.h>
+#include <string.h>
 #include <px4_log.h>
 #ifdef __PX4_POSIX
 #include <execinfo.h>