diff --git a/include/ADXL345_accel.h b/include/ADXL345_accel.h
index f2e2ebcf40b7b8a2d06db8bafed3447f219e800a..d9a2ba199fd8d45fba6dd8e11afb549cc73190b4 100644
--- a/include/ADXL345_accel.h
+++ b/include/ADXL345_accel.h
@@ -1,6 +1,10 @@
 #ifndef ADXL345_ACCEL_H
 #define ADXL345_ACCEL_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 
 // public functions
@@ -12,4 +16,8 @@ void imu_accel_set_config(void);
 uint8_t imu_accel_detect(void);
 void imu_accel_process_data(void);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/HMC5843_compass.h b/include/HMC5843_compass.h
index eac9ddab5bad5c68687fe636c6849ca9821b8da2..2a24978ccb6f059e18b083a1a9359fdcc6648025 100644
--- a/include/HMC5843_compass.h
+++ b/include/HMC5843_compass.h
@@ -1,6 +1,10 @@
 #ifndef _HMC5843_compass_h
 #define _HMC5843_compass_h
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 
 uint8_t imu_compass_detect(void);
@@ -11,5 +15,8 @@ void imu_compass_get_data(void);
 void imu_compass_set_config(void);
 void imu_compass_process_data(void);
 
+#ifdef __cplusplus
+}
+#endif
 
 #endif
diff --git a/include/ITG3200_gyro.h b/include/ITG3200_gyro.h
index f2efc4c83c57a110346374a9d6cab61a758a483f..6540e77a62fb325aa86933971f586ba26721b6ed 100644
--- a/include/ITG3200_gyro.h
+++ b/include/ITG3200_gyro.h
@@ -1,6 +1,10 @@
 #ifndef _ITG3200_GYRO_H
 #define _ITG3200_GYRO_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 
 // public functions
@@ -12,4 +16,8 @@ void imu_gyro_get_data(void);
 void imu_gyro_set_config(void);
 void imu_gyro_process_data(void);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/action.h b/include/action.h
index 6270491fb1cb641ce016ac626fb5a940e121d009..74ec9fceb82925eb23c9a117ad15c072a0ca7e8e 100644
--- a/include/action.h
+++ b/include/action.h
@@ -1,6 +1,10 @@
 #ifndef _ACTION_H
 #define _ACTION_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 #include "motion_pages.h"
 
@@ -19,4 +23,8 @@ uint8_t action_is_running(void);
 // motion manager interface
 void action_process(void);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/adc_dma.h b/include/adc_dma.h
index 5a67f14a4d9da07200c5242f41885908ac955485..05699e454d72613ae80b01356927b9f66267f39d 100644
--- a/include/adc_dma.h
+++ b/include/adc_dma.h
@@ -1,9 +1,17 @@
 #ifndef _ADC_DMA_H
 #define _ADC_DMA_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 
 void adc_init(void);
 uint16_t adc_get_temperature(void);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/comm.h b/include/comm.h
index 1e8c7b8292bc8b1808ac192b4205707a2e0098df..41b57cea13369f6093435d0d0354714d6f69c1ca 100644
--- a/include/comm.h
+++ b/include/comm.h
@@ -1,10 +1,18 @@
 #ifndef _COMM_H
 #define _COMM_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 
 // public functions
 void comm_init(void);
 void comm_start(void);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/dyn_servos.h b/include/dyn_servos.h
index 775f26d6ccbede393c8efa80a9da52f2c6c558e9..0ed9a2b2db3adcfbda4037b51d568da12086228e 100644
--- a/include/dyn_servos.h
+++ b/include/dyn_servos.h
@@ -1,6 +1,10 @@
 #ifndef _DYN_SERVOS_H
 #define _DYN_SERVOS_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 // servo models
 #define       SERVO_AX12A     0x000C
 #define       SERVO_AX12W     0x012C
@@ -88,4 +92,8 @@ typedef enum{
   P_D_ERROR_OUT_L             = 66,
   P_D_ERROR_OUT_H             = 67}TDynServo;
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/dynamixel_master_uart_dma.h b/include/dynamixel_master_uart_dma.h
index 74763f75ea18c811eef55ef12eec2013a443a169..e07789ed1722735f0f6e2ad4272de497e602df56 100755
--- a/include/dynamixel_master_uart_dma.h
+++ b/include/dynamixel_master_uart_dma.h
@@ -1,6 +1,10 @@
 #ifndef _DYNAMIXEL_MASTER_DMA_H
 #define _DYNAMIXEL_MASTER_DMA_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 #include "dynamixel.h"
 #include "dynamixel2.h"
@@ -38,4 +42,8 @@ uint8_t dyn_master_bulk_read(uint8_t num,uint8_t *ids,uint8_t *address, uint8_t
 // repeater functions
 uint8_t dyn_master_resend_inst_packet(uint8_t *inst_packet, uint8_t *status_packet);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/dynamixel_slave_uart_dma.h b/include/dynamixel_slave_uart_dma.h
index 4652a1be75fcc2981b5ad398d701aa61874e3e4b..65cb4be5fb5ccfe4893d169a872259a830292d0e 100644
--- a/include/dynamixel_slave_uart_dma.h
+++ b/include/dynamixel_slave_uart_dma.h
@@ -1,7 +1,12 @@
 #ifndef _DYNAMIXEL_SLAVE_UART_DMA_H
 #define _DYNAXIXEL_SLAVE_UART_DMA_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "dynamixel.h"
+#include "dynamixel2.h"
 #include "stm32f4xx.h"
 
 // public functions
@@ -12,9 +17,13 @@ inline void dyn_slave_set_return_delay(uint8_t delay);
 inline void dyn_slave_set_return_level(uint8_t level);
 inline uint8_t dyn_slave_get_return_level(void);
 uint8_t dyn_slave_is_packet_ready(void);
-void dyn_slave_get_inst_packet(uint8_t *packet);
-void dyn_slave_send_status_packet(uint8_t error,uint8_t length, uint8_t *data);
+TDynVersion  dyn_slave_get_inst_packet(uint8_t *packet);
+void dyn_slave_send_status_packet(uint8_t error,uint16_t length, uint8_t *data);
 void dyn_slave_resend_status_packet(uint8_t *packet);
 void dyn_slave_reset(void);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/eeprom.h b/include/eeprom.h
index 21d2595eee48e21d0b723e1b307b96732f37ca34..7b389a5e11559efba4be55c2416c91b043f3b28f 100755
--- a/include/eeprom.h
+++ b/include/eeprom.h
@@ -24,6 +24,10 @@
 #ifndef __EEPROM_H
 #define __EEPROM_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /* Includes ------------------------------------------------------------------*/
 #include "stm32f4xx.h"
 
@@ -86,6 +90,10 @@ uint16_t EE_Init(void);
 uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data);
 uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* __EEPROM_H */
 
 /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
diff --git a/include/gpio.h b/include/gpio.h
index 544b7278aec1fa6bec869ce5621cf6639f3e5cd6..25be95af7cc2d496b868559cbde57dfba0daa99b 100644
--- a/include/gpio.h
+++ b/include/gpio.h
@@ -1,6 +1,10 @@
 #ifndef _GPIO_H
 #define _GPIO_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx_hal.h"
 
 typedef enum {USER1_LED,USER2_LED,RXD_LED,TXD_LED} led_t;
@@ -17,4 +21,8 @@ void gpio_blink_led(led_t led_id, int16_t period_ms);
 uint8_t gpio_is_pushbutton_pressed(pushbutton_t pb_id);
 void gpio_set_pushbutton_callback(pushbutton_t pb_id,void (*callback)(void));
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/imu_9dof_dma.h b/include/imu_9dof_dma.h
index 41db3c0d74587c695e0ae1e224e3718172f5aecc..6b22fb67a6128c2d4c1f84143a30b21328393190 100644
--- a/include/imu_9dof_dma.h
+++ b/include/imu_9dof_dma.h
@@ -1,6 +1,10 @@
 #ifndef _IMU_9DOF_DMA_H
 #define _IMU_9DOF_DMA_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 
 // general IMU public functions
@@ -8,4 +12,8 @@ void imu_init(void);
 void imu_start(void);
 void imu_stop(void);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/imu_int.h b/include/imu_int.h
index 9dc552e2a819ea55f78399fb0242d2db4f632fdd..32b77838eac40835c12477d7249cd1dc3478b8dd 100644
--- a/include/imu_int.h
+++ b/include/imu_int.h
@@ -1,6 +1,10 @@
 #ifndef _IMU_INT_H
 #define _IMU_INT_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #define I2C_IMU_DMA                      DMA1
 #define I2C_IMU_DMA_CHANNEL              DMA_Channel_3
 #define I2C_IMU_DR_ADDRESS               ((uint32_t)I2C3+0x10)
@@ -64,4 +68,8 @@ extern DMA_InitTypeDef IMU_DMA_RX_InitStructure;
 void imu_wait_op_done(void);
 uint8_t imu_is_op_done(void);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/motion_manager.h b/include/motion_manager.h
index 47aee894a3e1de6b9a839ecac8c569070498e458..fcc07e6457ec18e36fb0a414a8f8e5f98cf0b796 100644
--- a/include/motion_manager.h
+++ b/include/motion_manager.h
@@ -1,6 +1,10 @@
 #ifndef _MOTION_MANAGER_H
 #define _MOTION_MANAGER_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 
 #define         MANAGER_MAX_NUM_SERVOS          31
@@ -23,8 +27,14 @@ typedef struct{
   uint16_t current_value;
   TModules module;
   uint8_t enabled;
+  int16_t cw_angle_limit;
+  int16_t ccw_angle_limit;
+  uint8_t dyn_version;
 }TServoInfo;
 
+// public variables
+extern int64_t current_angles[MANAGER_MAX_NUM_SERVOS];
+
 // public functions
 void manager_init(uint16_t period_us);
 inline uint16_t manager_get_period(void);
@@ -32,6 +42,8 @@ inline void manager_set_period(uint16_t period_us);
 inline void manager_enable(void);
 inline void manager_disable(void);
 inline uint8_t manager_is_enabled(void);
+void manager_enable_balance(void);
+void manager_disable_balance(void);
 inline uint8_t manager_get_num_servos(void);
 inline void manager_set_module(uint8_t servo_id,TModules module);
 inline TModules manager_get_module(uint8_t servo_id);
@@ -39,5 +51,11 @@ inline void manager_enable_servo(uint8_t servo_id);
 inline void manager_disable_servo(uint8_t servo_id);
 void manager_disable_servos(void);
 inline uint8_t manager_is_servo_enabled(uint8_t servo_id);
+inline int16_t manager_get_cw_angle_limit(uint8_t servo_id);
+inline int16_t manager_get_ccw_angle_limit(uint8_t servo_id);
+
+#ifdef __cplusplus
+}
+#endif
 
 #endif
diff --git a/include/motion_pages.h b/include/motion_pages.h
index cac9f755ab14ae48c278ad5a51b50bf2c05e3bb2..a195e1705a164993678da09238ef0047fb8a1a95 100644
--- a/include/motion_pages.h
+++ b/include/motion_pages.h
@@ -1,6 +1,10 @@
 #ifndef _MOTION_PAGES_H
 #define _MOTION_PAGES_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 
 #define MAX_PAGES                     256 
@@ -49,4 +53,8 @@ void pages_clear_page(TPage *page);
 void pages_copy_page(TPage *src,TPage *dst);
 inline uint8_t pages_get_slope(TPage *page,uint8_t servo_id);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/ram.h b/include/ram.h
index b0fb2f38647139114d271535c28eac76d3f8418d..a1d31eb2ebc8dcc4ff2097f24c60094acc7c000a 100644
--- a/include/ram.h
+++ b/include/ram.h
@@ -1,6 +1,10 @@
 #ifndef _RAM_H
 #define _RAM_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 #include "eeprom.h"
 
@@ -153,4 +157,8 @@ uint8_t ram_write_word(uint8_t address, uint16_t data);
 uint8_t ram_write_table(uint8_t address, uint8_t length,uint8_t *data);
 inline uint8_t ram_in_range(uint8_t start_reg,uint8_t end_reg,uint8_t address,uint8_t length);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/include/stm32_time.h b/include/stm32_time.h
index 9595becd1e7e53acb500b90f339f20ca7a378a53..6b47829c0ff8debc66edf1391df3f3729ce898ef 100755
--- a/include/stm32_time.h
+++ b/include/stm32_time.h
@@ -1,6 +1,10 @@
 #ifndef _STM32_TIME_H
 #define _STM32_TIME_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "stm32f4xx.h"
 #include "system_stm32f4xx.h"
 
@@ -8,4 +12,8 @@ void time_init(void);
 void delay_ms(__IO uint32_t time);
 void delay_us(uint32_t us);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif