diff --git a/Hello_World/Makefile b/Hello_World/Makefile
index 4f67e2b847a9d1be39957ff39e96a2b33c721846..184e192b30de6e862fc9c3657b37426ce41329bc 100644
--- a/Hello_World/Makefile
+++ b/Hello_World/Makefile
@@ -67,8 +67,6 @@ CMSIS_ROOT=$(LIBS_DIR)/CMSIS
 
 # Source files for this test (add path to VPATH below)
 SRCS  = main.c
-SRCS  += oled96.c
-SRCS  += fonts.c
 SRCS  += pmic.c
 SRCS  += bosch.c
 SRCS  += bhy_support.c bhy_uc_driver.c bhy.c
@@ -76,6 +74,7 @@ SRCS  += MAX77650-Arduino-Library.c
 SRCS  += bme680.h
 SRCS  += bma400.c
 
+
 # Where to find source files for this test
 VPATH = .
 
diff --git a/Hello_World/main.c b/Hello_World/main.c
index f2063ca3bec16d9df3166a037ddb7e487d233803..ce6f2d42c7368173c62fd7b9edb0712b8c515137 100644
--- a/Hello_World/main.c
+++ b/Hello_World/main.c
@@ -41,167 +41,31 @@
  */
 
 /***** Includes *****/
+#include "pmic.h"
+#include "card10.h"
+
+#include "tmr_utils.h"
+
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
-#include "mxc_config.h"
-#include "led.h"
-#include "board.h"
-#include "tmr_utils.h"
-#include "i2c.h"
-#include "rtc.h"
-#include "spi.h"
-#include "gpio.h"
-#include "oled96.h"
-#include "bhy.h"
-#include "Bosch_PCB_7183_di03_BMI160_BMM150-7183_di03.2.1.11696_170103.h"
-#include "bhy_uc_driver.h"
-#include "pmic.h"
-#include "bme680.h"
-#include "bma400.h"
-#include "bosch.h"
 
 /***** Definitions *****/
 
-#define I2C_DEVICE	    MXC_I2C0_BUS0
-
-#define SPI SPI0
-#define SPI_SPEED       1000000  // Bit Rate
-
 /***** Globals *****/
-static const gpio_cfg_t motor_pin = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
+//static const gpio_cfg_t motor_pin = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
 
 /***** Functions *****/
-#if 0
-void I2C0_IRQHandler(void)
-{
-    I2C_Handler(I2C_DEVICE);
-    return;
-}
-#endif
-
-uint32_t ecg_read_reg(uint8_t reg)
-{
-    spi_req_t req;
-    uint8_t tx_data[] = {(reg << 1) | 1, 0, 0, 0};
-    uint8_t rx_data[] = {0, 0, 0, 0};
-    req.tx_data = tx_data;
-    req.rx_data = rx_data;
-    req.len = 4;
-    req.bits = 8;
-    req.width = SPI17Y_WIDTH_1;
-    req.ssel = 0;
-    req.deass = 1;
-    req.ssel_pol = SPI17Y_POL_LOW;
-    req.tx_num = 0;
-    req.rx_num = 0;
-
-    SPI_MasterTrans(SPI, &req);
-
-    return (rx_data[1] << 16) | (rx_data[2] << 8) | rx_data[3];
-}
-
 // *****************************************************************************
 int main(void)
 {
     int count = 0;
 
-    printf("Hello World!\n");
-
-    //Setup the I2CM
-    I2C_Shutdown(MXC_I2C0_BUS0);
-    I2C_Init(MXC_I2C0_BUS0, I2C_FAST_MODE, NULL);
-
-    I2C_Shutdown(MXC_I2C1_BUS0);
-    I2C_Init(MXC_I2C1_BUS0, I2C_FAST_MODE, NULL);
-
-    pmic_init();
-    pmic_set_led(0, 0);
-    pmic_set_led(1, 0);
-    pmic_set_led(2, 0);
-    TMR_Delay(MXC_TMR0, MSEC(1000), 0);
-
- #if 0
-    NVIC_EnableIRQ(I2C0_IRQn); // Not sure if we actually need this when not doing async requests
- #endif
-
-    uint8_t dummy[1] = {0};
-    // "7-bit addresses 0b0000xxx and 0b1111xxx are reserved"
-    for (int addr = 0x8; addr < 0x78; ++addr) {
-        // A 0 byte write does not seem to work so always send a single byte.
-        int res = I2C_MasterWrite(MXC_I2C0_BUS0, addr << 1, dummy, 1, 0);
-        if(res == 1) {
-            printf("Found (7 bit) address 0x%02x on I2C0\n", addr);
-        }
-
-        res = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, dummy, 1, 0);
-        if(res == 1) {
-            printf("Found (7 bit) address 0x%02x on I2C1\n", addr);
-        }
-    }
-
-    oledInit(0x3c, 0, 0);
-    oledFill(0x00);
-    oledWriteString(0, 0, "Hello", 0);
-    oledWriteString(0, 2, "my name is", 0);
-    oledWriteString(0, 4, "card10", 1);
-
-    if(bhy_driver_init(bhy1_fw)) {
-        printf("Failed to init bhy\n");
-    }
-
-
-    struct bme680_dev gas_sensor;
-    gas_sensor.dev_id = BME680_I2C_ADDR_PRIMARY;
-    gas_sensor.intf = BME680_I2C_INTF;
-    gas_sensor.read = card10_bosch_i2c_read;
-    gas_sensor.write = card10_bosch_i2c_write;
-    gas_sensor.delay_ms = card10_bosch_delay;
-    gas_sensor.amb_temp = 25;
-
-    int8_t rslt = BME680_OK;
-    rslt = bme680_init(&gas_sensor);
-    if(rslt != BME680_OK) {
-        printf("Failed to init BME680\n");
-    }
-
-    struct bma400_dev bma;
-    bma.intf_ptr = NULL; /* To attach your interface device reference */
-    bma.delay_ms = card10_bosch_delay;
-    bma.dev_id = BMA400_I2C_ADDRESS_SDO_LOW;
-    bma.read = card10_bosch_i2c_read_ex;
-    bma.write = card10_bosch_i2c_write_ex;
-    bma.intf = BMA400_I2C_INTF;
-
-    rslt = bma400_init(&bma);
-    if (rslt == BMA400_OK) {
-        printf("BMA400 found with chip ID 0x%X\r\n", bma.chip_id);
-    }
-
-
-    // Enable 32 kHz output
-    RTC_SquareWave(MXC_RTC, SQUARE_WAVE_ENABLED, F_32KHZ, NOISE_IMMUNE_MODE, NULL);
-
-    // Enable SPI
-    sys_cfg_spi_t spi17y_master_cfg;
-
-    spi17y_master_cfg.map = MAP_A;
-    spi17y_master_cfg.ss0 = Enable;
-    spi17y_master_cfg.ss1 = Disable;
-    spi17y_master_cfg.ss2 = Disable;
-
-    if (SPI_Init(SPI, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
-        printf("Error configuring SPI\n");
-        while (1);
-    }
-
-    for(int i=0; i<0x20; i++) {
-        uint32_t val = ecg_read_reg(i);
-        printf("%02x: 0x%06x\n", i, val);
-    }
-
+    card10_init();
+    card10_diag();
 
     while (1) {
+#if 1
         pmic_set_led(0, 31);
         pmic_set_led(1, 0);
         pmic_set_led(2, 0);
@@ -220,9 +84,22 @@ int main(void)
         pmic_set_led(0, 0);
         pmic_set_led(1, 0);
         pmic_set_led(2, 0);
+        //TMR_Delay(MXC_TMR0, MSEC(200), 0);
+#endif
+#if 0
+        //TMR_Delay(MXC_TMR0, MSEC(600), 0);
         GPIO_OutSet(&motor_pin);
-        TMR_Delay(MXC_TMR0, MSEC(500), 0);
+        TMR_Delay(MXC_TMR0, MSEC(30), 0);
         GPIO_OutClr(&motor_pin);
+        TMR_Delay(MXC_TMR0, MSEC(200), 0);
+#endif
+#if 0
+        LED_Off(0);
+        TMR_Delay(MXC_TMR0, MSEC(500), 0);
+        LED_On(0);
+        TMR_Delay(MXC_TMR0, MSEC(500), 0);
+#endif
+
         TMR_Delay(MXC_TMR0, MSEC(1000), 0);
         printf("count = %d\n", count++);
     }
diff --git a/bmatest/Makefile b/bmatest/Makefile
index 4f67e2b847a9d1be39957ff39e96a2b33c721846..66cfc9f8697065e1143ac729c7433b2caaaf3240 100644
--- a/bmatest/Makefile
+++ b/bmatest/Makefile
@@ -75,6 +75,7 @@ SRCS  += bhy_support.c bhy_uc_driver.c bhy.c
 SRCS  += MAX77650-Arduino-Library.c
 SRCS  += bme680.h
 SRCS  += bma400.c
+SRCS  += card10.c
 
 # Where to find source files for this test
 VPATH = .
diff --git a/bmatest/main.c b/bmatest/main.c
index 85e277462e3454b26c15b5423ba79d768fcb7135..cac0d1ef26f7af1a8092caf0d160afa9e26326b7 100644
--- a/bmatest/main.c
+++ b/bmatest/main.c
@@ -41,9 +41,6 @@
  */
 
 /***** Includes *****/
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
 #include "mxc_config.h"
 #include "led.h"
 #include "board.h"
@@ -53,14 +50,15 @@
 #include "spi.h"
 #include "gpio.h"
 #include "oled96.h"
-#include "bhy.h"
-#include "Bosch_PCB_7183_di03_BMI160_BMM150-7183_di03.2.1.11696_170103.h"
-#include "bhy_uc_driver.h"
-#include "pmic.h"
-#include "bme680.h"
 #include "bma400.h"
 #include "bosch.h"
 
+#include "card10.h"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
 /***** Definitions *****/
 
 /***** Globals *****/
@@ -95,37 +93,8 @@ void print_rslt(int8_t rslt)
 // *****************************************************************************
 int main(void)
 {
-    int count = 0;
-
-    printf("Hello World!\n");
-
-    //Setup the I2CM
-    I2C_Shutdown(MXC_I2C0_BUS0);
-    I2C_Init(MXC_I2C0_BUS0, I2C_FAST_MODE, NULL);
-
-    I2C_Shutdown(MXC_I2C1_BUS0);
-    I2C_Init(MXC_I2C1_BUS0, I2C_FAST_MODE, NULL);
-
-    pmic_init();
-    pmic_set_led(0, 0);
-    pmic_set_led(1, 0);
-    pmic_set_led(2, 0);
-    TMR_Delay(MXC_TMR0, MSEC(1000), 0);
-
-    uint8_t dummy[1] = {0};
-    // "7-bit addresses 0b0000xxx and 0b1111xxx are reserved"
-    for (int addr = 0x8; addr < 0x78; ++addr) {
-        // A 0 byte write does not seem to work so always send a single byte.
-        int res = I2C_MasterWrite(MXC_I2C0_BUS0, addr << 1, dummy, 1, 0);
-        if(res == 1) {
-            printf("Found (7 bit) address 0x%02x on I2C0\n", addr);
-        }
-
-        res = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, dummy, 1, 0);
-        if(res == 1) {
-            printf("Found (7 bit) address 0x%02x on I2C1\n", addr);
-        }
-    }
+    card10_init();
+    card10_diag();
 
     oledInit(0x3c, 0, 0);
     oledFill(0x00);
diff --git a/bmetest/Makefile b/bmetest/Makefile
index 02d4d978a06834b67511ee9796996756000d424c..66cfc9f8697065e1143ac729c7433b2caaaf3240 100644
--- a/bmetest/Makefile
+++ b/bmetest/Makefile
@@ -74,6 +74,9 @@ SRCS  += bosch.c
 SRCS  += bhy_support.c bhy_uc_driver.c bhy.c
 SRCS  += MAX77650-Arduino-Library.c
 SRCS  += bme680.h
+SRCS  += bma400.c
+SRCS  += card10.c
+
 # Where to find source files for this test
 VPATH = .
 
@@ -93,6 +96,9 @@ VPATH += ../lib/maxim/MAX77650-Arduino-Library
 IPATH += ../lib/bosch/BME680_driver
 VPATH += ../lib/bosch/BME680_driver
 
+IPATH += ../lib/bosch/BMA400-API
+VPATH += ../lib/bosch/BMA400-API
+
 # Enable assertion checking for development
 PROJ_CFLAGS+=-DMXC_ASSERT_ENABLE
 
diff --git a/bmetest/main.c b/bmetest/main.c
index b7edeb288fdf234e8422ef6dafb879321c615f87..d664ca44bfa317eb50025301580d9b7ea6df6705 100644
--- a/bmetest/main.c
+++ b/bmetest/main.c
@@ -41,9 +41,6 @@
  */
 
 /***** Includes *****/
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
 #include "mxc_config.h"
 #include "led.h"
 #include "board.h"
@@ -51,46 +48,21 @@
 #include "i2c.h"
 #include "gpio.h"
 #include "oled96.h"
-#include "pmic.h"
 #include "bme680.h"
 #include "bosch.h"
 
+#include "card10.h"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
 /***** Definitions *****/
 // *****************************************************************************
 int main(void)
 {
-    printf("Hello World!\n");
-    //Setup the I2CM
-    I2C_Shutdown(MXC_I2C0_BUS0);
-    I2C_Init(MXC_I2C0_BUS0, I2C_FAST_MODE, NULL);
-
-    I2C_Shutdown(MXC_I2C1_BUS0);
-    I2C_Init(MXC_I2C1_BUS0, I2C_FAST_MODE, NULL);
-
-    pmic_init();
-    pmic_set_led(0, 0);
-    pmic_set_led(1, 0);
-    pmic_set_led(2, 0);
-    TMR_Delay(MXC_TMR0, MSEC(1000), 0);
-
- #if 0
-    NVIC_EnableIRQ(I2C0_IRQn); // Not sure if we actually need this when not doing async requests
- #endif
-
-    uint8_t dummy[1] = {0};
-    // "7-bit addresses 0b0000xxx and 0b1111xxx are reserved"
-    for (int addr = 0x8; addr < 0x78; ++addr) {
-        // A 0 byte write does not seem to work so always send a single byte.
-        int res = I2C_MasterWrite(MXC_I2C0_BUS0, addr << 1, dummy, 1, 0);
-        if(res == 1) {
-            printf("Found (7 bit) address 0x%02x on I2C0\n", addr);
-        }
-
-        res = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, dummy, 1, 0);
-        if(res == 1) {
-            printf("Found (7 bit) address 0x%02x on I2C1\n", addr);
-        }
-    }
+    card10_init();
+    card10_diag();
 
     oledInit(0x3c, 0, 0);
     oledFill(0x00);
diff --git a/ecgtest/Makefile b/ecgtest/Makefile
index 49bf141c9025f1193e3c92da588ec3a8c96a975a..fe06e462c6a867de3e9bcef0e14be3e10b6c094f 100644
--- a/ecgtest/Makefile
+++ b/ecgtest/Makefile
@@ -70,8 +70,12 @@ SRCS  = main.c
 SRCS  += pmic.c
 SRCS  += ../lib/card10/oled96.c
 SRCS  += ../lib/card10/fonts.c
+SRCS  += bosch.c
+SRCS  += bhy_support.c bhy_uc_driver.c bhy.c
 SRCS  += MAX77650-Arduino-Library.c
-
+SRCS  += bme680.h
+SRCS  += bma400.c
+SRCS  += card10.c
 
 # Where to find source files for this test
 VPATH = .
@@ -82,9 +86,19 @@ IPATH = .
 IPATH += ../lib/card10
 VPATH += ../lib/card10
 
+IPATH += ../lib/bosch/BHy1_driver_and_MCU_solution/driver/inc
+IPATH += ../lib/bosch/BHy1_driver_and_MCU_solution/examples/firmware/
+VPATH += ../lib/bosch/BHy1_driver_and_MCU_solution/driver/src
+
 IPATH += ../lib/maxim/MAX77650-Arduino-Library
 VPATH += ../lib/maxim/MAX77650-Arduino-Library
 
+IPATH += ../lib/bosch/BME680_driver
+VPATH += ../lib/bosch/BME680_driver
+
+IPATH += ../lib/bosch/BMA400-API
+VPATH += ../lib/bosch/BMA400-API
+
 # Enable assertion checking for development
 PROJ_CFLAGS+=-DMXC_ASSERT_ENABLE
 
diff --git a/ecgtest/main.c b/ecgtest/main.c
index 02024deb9ded42a8676be7cf8627d7ed1eb301dd..e314ffa79d7a4feeba240650dc0960db3e201af2 100644
--- a/ecgtest/main.c
+++ b/ecgtest/main.c
@@ -55,28 +55,15 @@
 #include "MAX30003.h"
 #include "oled96.h"
 #include "pmic.h"
+#include "card10.h"
 #include <stdbool.h>
 
 /***** Definitions *****/
 
-#define I2C_DEVICE	    MXC_I2C0_BUS0
-
-#define SPI SPI0
-#define SPI_SPEED       10000000  // Bit Rate
-
-
 /***** Globals *****/
 
 /***** Functions *****/
-#if 0
-void I2C0_IRQHandler(void)
-{
-    I2C_Handler(I2C_DEVICE);
-    return;
-}
-#endif
-
-uint32_t ecg_read_reg(uint8_t reg)
+static uint32_t ecg_read_reg(uint8_t reg)
 {
     spi_req_t req;
     uint8_t tx_data[] = {(reg << 1) | 1, 0, 0, 0};
@@ -92,12 +79,12 @@ uint32_t ecg_read_reg(uint8_t reg)
     req.tx_num = 0;
     req.rx_num = 0;
 
-    SPI_MasterTrans(SPI, &req);
+    SPI_MasterTrans(SPI0, &req);
 
     return (rx_data[1] << 16) | (rx_data[2] << 8) | rx_data[3];
 }
 
-void ecg_write_reg(uint8_t reg, uint32_t data)
+static void ecg_write_reg(uint8_t reg, uint32_t data)
 {
     printf("write %02x %06x\n", reg, data);
     spi_req_t req;
@@ -114,7 +101,7 @@ void ecg_write_reg(uint8_t reg, uint32_t data)
     req.tx_num = 0;
     req.rx_num = 0;
 
-    SPI_MasterTrans(SPI, &req);
+    SPI_MasterTrans(SPI0, &req);
 }
 
 void ecg_config(void)
@@ -243,52 +230,9 @@ void ecgFIFO_callback(void *data) {
 // *****************************************************************************
 int main(void)
 {
-    //int count = 0;
-
-    printf("Hello World!\n");
-    TMR_Delay(MXC_TMR0, MSEC(1000), 0);
-
-    //Setup the I2CM
-    I2C_Shutdown(MXC_I2C0_BUS0);
-    I2C_Init(MXC_I2C0_BUS0, I2C_FAST_MODE, NULL);
-
-    I2C_Shutdown(MXC_I2C1_BUS0);
-    I2C_Init(MXC_I2C1_BUS0, I2C_FAST_MODE, NULL);
-
- #if 0
-    NVIC_EnableIRQ(I2C0_IRQn); // Not sure if we actually need this when not doing async requests
- #endif
-
-    uint8_t dummy[1] = {0};
-    // "7-bit addresses 0b0000xxx and 0b1111xxx are reserved"
-    for (int addr = 0x8; addr < 0x78; ++addr) {
-        // A 0 byte write does not seem to work so always send a single byte.
-        int res = I2C_MasterWrite(MXC_I2C0_BUS0, addr << 1, dummy, 1, 0);
-        if(res == 1) {
-            printf("Found (7 bit) address 0x%02x on I2C0\n", addr);
-        }
-
-        res = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, dummy, 1, 0);
-        if(res == 1) {
-            printf("Found (7 bit) address 0x%02x on I2C1\n", addr);
-        }
-    }
-
-    pmic_init();
-    pmic_set_led(0, 0);
-    pmic_set_led(1, 0);
-    pmic_set_led(2, 0);
-
-    TMR_Delay(MXC_TMR0, MSEC(1000), 0);
 
-    oledInit(0x3c, 0, 0);
-    oledFill(0x00);
-    oledWriteString(0, 0, " card10", 1);
-
-    TMR_Delay(MXC_TMR0, MSEC(1500), 0);
-
-    // Enable 32 kHz output
-    RTC_SquareWave(MXC_RTC, SQUARE_WAVE_ENABLED, F_32KHZ, NOISE_IMMUNE_MODE, NULL);
+    card10_init();
+    card10_diag();
 
     const gpio_cfg_t interrupt_pin = {PORT_1, PIN_12, GPIO_FUNC_IN, GPIO_PAD_PULL_UP};
     GPIO_Config(&interrupt_pin);
@@ -298,24 +242,6 @@ int main(void)
     NVIC_EnableIRQ(MXC_GPIO_GET_IRQ(PORT_1));
 
 
-    // Enable SPI
-    sys_cfg_spi_t spi17y_master_cfg;
-
-    spi17y_master_cfg.map = MAP_A;
-    spi17y_master_cfg.ss0 = Enable;
-    spi17y_master_cfg.ss1 = Disable;
-    spi17y_master_cfg.ss2 = Disable;
-
-    if (SPI_Init(SPI, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
-        printf("Error configuring SPI\n");
-        while (1);
-    }
-
-    for(int i=0; i<0x20; i++) {
-        uint32_t val = ecg_read_reg(i);
-        printf("%02x: 0x%06x\n", i, val);
-    }
-
     ecg_config();
 
     for(int i=0; i<0x20; i++) {
diff --git a/imutest/Makefile b/imutest/Makefile
index 7103aa7df95cb593000287b8c6f0a2efe8d8b5e2..66cfc9f8697065e1143ac729c7433b2caaaf3240 100644
--- a/imutest/Makefile
+++ b/imutest/Makefile
@@ -73,6 +73,10 @@ SRCS  += pmic.c
 SRCS  += bosch.c
 SRCS  += bhy_support.c bhy_uc_driver.c bhy.c
 SRCS  += MAX77650-Arduino-Library.c
+SRCS  += bme680.h
+SRCS  += bma400.c
+SRCS  += card10.c
+
 # Where to find source files for this test
 VPATH = .
 
@@ -89,6 +93,12 @@ VPATH += ../lib/bosch/BHy1_driver_and_MCU_solution/driver/src
 IPATH += ../lib/maxim/MAX77650-Arduino-Library
 VPATH += ../lib/maxim/MAX77650-Arduino-Library
 
+IPATH += ../lib/bosch/BME680_driver
+VPATH += ../lib/bosch/BME680_driver
+
+IPATH += ../lib/bosch/BMA400-API
+VPATH += ../lib/bosch/BMA400-API
+
 # Enable assertion checking for development
 PROJ_CFLAGS+=-DMXC_ASSERT_ENABLE
 
diff --git a/imutest/main.c b/imutest/main.c
index adabba9ba6c226dc600c317f749b964a807f6115..b7a226beff5bb2aa893ab98feabd669c5afc322e 100644
--- a/imutest/main.c
+++ b/imutest/main.c
@@ -41,9 +41,6 @@
  */
 
 /***** Includes *****/
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
 #include "mxc_config.h"
 #include "led.h"
 #include "board.h"
@@ -52,19 +49,17 @@
 #include "rtc.h"
 #include "spi.h"
 #include "gpio.h"
-#include "oled96.h"
-#include "bhy.h"
-#include "Bosch_PCB_7183_di03_BMI160_BMM150-7183_di03.2.1.11696_170103.h"
 #include "bhy_uc_driver.h"
 #include "pmic.h"
-#include <math.h>
 
-/***** Definitions *****/
+#include "card10.h"
 
-#define I2C_DEVICE	    MXC_I2C0_BUS0
+#include <math.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
 
-#define SPI SPI0
-#define SPI_SPEED       1000000  // Bit Rate
+/***** Definitions *****/
 
 /* should be greater or equal to 69 bytes, page size (50) + maximum packet size(18) + 1 */
 #define FIFO_SIZE                      300
@@ -74,24 +69,14 @@
 
 
 /***** Globals *****/
-static const gpio_cfg_t motor_pin = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
 char out_buffer[OUT_BUFFER_SIZE] = " W: 0.999  X: 0.999  Y: 0.999  Z: 0.999   \r";
 uint8_t fifo[FIFO_SIZE];
 
 
-
 /***** Functions *****/
-#if 0
-void I2C0_IRQHandler(void)
-{
-    I2C_Handler(I2C_DEVICE);
-    return;
-}
-#endif
-
 static void sensors_callback_vector(bhy_data_generic_t * sensor_data, bhy_virtual_sensor_t sensor_id)
 {
-    printf("x=%d, y=%d, z=%d status=%d\n",
+    printf("x=%05d, y=%05d, z=%05d status=%d\n",
     sensor_data->data_vector.x,
     sensor_data->data_vector.y,
     sensor_data->data_vector.z,
@@ -99,6 +84,17 @@ static void sensors_callback_vector(bhy_data_generic_t * sensor_data, bhy_virtua
     );
 }
 
+static void sensors_callback_vector_uncalib(bhy_data_generic_t * sensor_data, bhy_virtual_sensor_t sensor_id)
+{
+    printf("x=%05d, y=%05d, z=%05d status=%d\n",
+    sensor_data->data_uncalib_vector.x,
+    sensor_data->data_uncalib_vector.y,
+    sensor_data->data_uncalib_vector.z,
+    sensor_data->data_uncalib_vector.status
+    );
+}
+
+
 /*!
  * @brief This function is  callback function for acquring sensor datas
  *
@@ -167,49 +163,6 @@ static void sensors_callback_rotation_vector(bhy_data_generic_t * sensor_data, b
 // *****************************************************************************
 int main(void)
 {
-    printf("Hello World!\n");
-
-    //Setup the I2CM
-    I2C_Shutdown(MXC_I2C0_BUS0);
-    I2C_Init(MXC_I2C0_BUS0, I2C_FAST_MODE, NULL);
-
-    I2C_Shutdown(MXC_I2C1_BUS0);
-    I2C_Init(MXC_I2C1_BUS0, I2C_FAST_MODE, NULL);
-
-    pmic_init();
-    pmic_set_led(0, 0);
-    pmic_set_led(1, 0);
-    pmic_set_led(2, 0);
-
-    TMR_Delay(MXC_TMR0, MSEC(1000), 0);
-
- #if 0
-    NVIC_EnableIRQ(I2C0_IRQn); // Not sure if we actually need this when not doing async requests
- #endif
-
-    uint8_t dummy[1] = {0};
-    // "7-bit addresses 0b0000xxx and 0b1111xxx are reserved"
-    for (int addr = 0x8; addr < 0x78; ++addr) {
-        // A 0 byte write does not seem to work so always send a single byte.
-        int res = I2C_MasterWrite(MXC_I2C0_BUS0, addr << 1, dummy, 1, 0);
-        if(res == 1) {
-            printf("Found (7 bit) address 0x%02x on I2C0\n", addr);
-        }
-
-        res = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, dummy, 1, 0);
-        if(res == 1) {
-            printf("Found (7 bit) address 0x%02x on I2C1\n", addr);
-        }
-    }
-
-#if 0
-    oledInit(0x3c, 0, 0);
-    oledFill(0x00);
-    oledWriteString(0, 0, "Hello", 0);
-    oledWriteString(0, 2, "my name is", 0);
-    oledWriteString(0, 4, "card10", 1);
-#endif
-
     /* BHY Variable*/
     uint8_t                    *fifoptr           = NULL;
     uint8_t                    bytes_left_in_fifo = 0;
@@ -222,15 +175,14 @@ int main(void)
     const gpio_cfg_t interrupt_pin = {PORT_0, PIN_13, GPIO_FUNC_IN, GPIO_PAD_PULL_UP};
     GPIO_Config(&interrupt_pin);
 
-    if(bhy_driver_init(bhy1_fw)) {
-        printf("Failed to init bhy\n");
-    }
-
+    card10_init();
     /* wait for the bhy trigger the interrupt pin go down and up again */
     while (GPIO_InGet(&interrupt_pin));
-
     while (!GPIO_InGet(&interrupt_pin));
 
+
+    card10_diag();
+
     /* the remapping matrix for BHI and Magmetometer should be configured here to make sure rotation vector is */
     /* calculated in a correct coordinates system. */
     int8_t                     bhy_mapping_matrix_config[3*3] = {0,-1,0,1,0,0,0,0,1};
@@ -255,7 +207,9 @@ int main(void)
 #endif
 
     //if(bhy_install_sensor_callback(VS_TYPE_GEOMAGNETIC_FIELD, VS_WAKEUP, sensors_callback_vector))
-    if(bhy_install_sensor_callback(VS_TYPE_GRAVITY, VS_WAKEUP, sensors_callback_vector))
+    //if(bhy_install_sensor_callback(VS_TYPE_GRAVITY, VS_WAKEUP, sensors_callback_vector))
+    //if(bhy_install_sensor_callback(VS_TYPE_ACCELEROMETER, VS_WAKEUP, sensors_callback_vector))
+    if(bhy_install_sensor_callback(VS_TYPE_MAGNETIC_FIELD_UNCALIBRATED, VS_WAKEUP, sensors_callback_vector_uncalib))
     {
         printf("Fail to install sensor callback\n");
     }
@@ -270,7 +224,9 @@ int main(void)
 
     /* enables the virtual sensor */
     //if(bhy_enable_virtual_sensor(VS_TYPE_GEOMAGNETIC_FIELD, VS_WAKEUP, ROTATION_VECTOR_SAMPLE_RATE, 0, VS_FLUSH_NONE, 0, 0))
-    if(bhy_enable_virtual_sensor(VS_TYPE_GRAVITY, VS_WAKEUP, ROTATION_VECTOR_SAMPLE_RATE, 0, VS_FLUSH_NONE, 0, 0))
+    //if(bhy_enable_virtual_sensor(VS_TYPE_GRAVITY, VS_WAKEUP, ROTATION_VECTOR_SAMPLE_RATE, 0, VS_FLUSH_NONE, 0, 0))
+    //if(bhy_enable_virtual_sensor(VS_TYPE_ACCELEROMETER, VS_WAKEUP, ROTATION_VECTOR_SAMPLE_RATE, 0, VS_FLUSH_NONE, 0, 0))
+    if(bhy_enable_virtual_sensor(VS_TYPE_MAGNETIC_FIELD_UNCALIBRATED, VS_WAKEUP, ROTATION_VECTOR_SAMPLE_RATE, 0, VS_FLUSH_NONE, 0, 0))
     {
         printf("Fail to enable sensor id=%d\n", VS_TYPE_GEOMAGNETIC_FIELD);
     }
diff --git a/ips/Makefile b/ips/Makefile
index dde919d041f836616ece1273756dca928782b108..2f79eeb2ac781e8d55e2f09088a15b65e4f8502b 100644
--- a/ips/Makefile
+++ b/ips/Makefile
@@ -67,8 +67,6 @@ CMSIS_ROOT=$(LIBS_DIR)/CMSIS
 
 # Source files for this test (add path to VPATH below)
 SRCS  = main.c
-SRCS  += oled96.c
-SRCS  += fonts.c
 SRCS  += pmic.c
 SRCS  += bosch.c
 SRCS  += bhy_support.c bhy_uc_driver.c bhy.c
@@ -82,6 +80,7 @@ SRCS  += font24.c
 SRCS  += font24CN.c
 SRCS  += image.c
 SRCS  += image2.c
+SRCS  += card10.c
 
 
 # Where to find source files for this test
diff --git a/ips/main.c b/ips/main.c
index f65f8d95d13f7f7cd48c79ebf6bc8d589b50d0d3..eb7bf1d7cf8b8aabf119ef8b26f7898d2c58871e 100644
--- a/ips/main.c
+++ b/ips/main.c
@@ -41,9 +41,6 @@
  */
 
 /***** Includes *****/
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
 #include "mxc_config.h"
 #include "led.h"
 #include "board.h"
@@ -52,20 +49,18 @@
 #include "rtc.h"
 #include "spi.h"
 #include "gpio.h"
-#include "oled96.h"
-#include "bhy.h"
-#include "Bosch_PCB_7183_di03_BMI160_BMM150-7183_di03.2.1.11696_170103.h"
-#include "bhy_uc_driver.h"
-#include "pmic.h"
-#include "bme680.h"
-#include "bma400.h"
-#include "bosch.h"
 #include "LCD/LCD_Driver.h"
 #include "GUI_DEV/GUI_Paint.h"
 #include "Fonts/fonts.h"
 #include "image/image.h"
 #include "tmr.h"
 
+#include "card10.h"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
 // Parameters for PWM output
 #define PORT_PWM   PORT_0  // port
 #define PIN_PWM    PIN_28   // pin
@@ -144,35 +139,8 @@ int main(void)
 {
     int count = 0;
 
-    printf("Hello World!\n");
-
-#if 1
-    //Setup the I2CM
-    I2C_Shutdown(MXC_I2C0_BUS0);
-    I2C_Init(MXC_I2C0_BUS0, I2C_FAST_MODE, NULL);
-
-    I2C_Shutdown(MXC_I2C1_BUS0);
-    I2C_Init(MXC_I2C1_BUS0, I2C_FAST_MODE, NULL);
-
-    pmic_init();
-    pmic_set_led(0, 0);
-    pmic_set_led(1, 0);
-    pmic_set_led(2, 0);
-    TMR_Delay(MXC_TMR0, MSEC(1000), 0);
-#endif
-
-    // Enable SPI
-    sys_cfg_spi_t spi17y_master_cfg;
-
-    spi17y_master_cfg.map = MAP_A;
-    spi17y_master_cfg.ss0 = Enable;
-    spi17y_master_cfg.ss1 = Disable;
-    spi17y_master_cfg.ss2 = Disable;
-
-    if (SPI_Init(SPI, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
-        printf("Error configuring SPI\n");
-        while (1);
-    }
+    card10_init();
+    card10_diag();
 
     //GPIO_Config(&DEV_RST_PIN);
     GPIO_Config(&DEV_DC_PIN);
diff --git a/lib/card10/card10.c b/lib/card10/card10.c
new file mode 100644
index 0000000000000000000000000000000000000000..6c3d94cb4b520f4e77a725d429733554f15421cd
--- /dev/null
+++ b/lib/card10/card10.c
@@ -0,0 +1,136 @@
+#include "pmic.h"
+#include "bosch.h"
+
+#include "bhy_uc_driver.h"
+#include "Bosch_PCB_7183_di03_BMI160_BMM150-7183_di03.2.1.11696_170103.h"
+#include "bme680.h"
+#include "bma400.h"
+#include "bhy.h"
+
+#include "mxc_config.h"
+#include "led.h"
+#include "board.h"
+
+#include "tmr_utils.h"
+#include "i2c.h"
+#include "rtc.h"
+#include "spi.h"
+#include "gpio.h"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#define SPI SPI0
+#define SPI_SPEED       1000000  // Bit Rate
+
+void card10_init(void)
+{
+    printf("card10 init...\n");
+
+    //Setup the I2CM
+    I2C_Shutdown(MXC_I2C0_BUS0);
+    I2C_Init(MXC_I2C0_BUS0, I2C_FAST_MODE, NULL);
+
+    I2C_Shutdown(MXC_I2C1_BUS0);
+    I2C_Init(MXC_I2C1_BUS0, I2C_FAST_MODE, NULL);
+
+    pmic_init();
+    pmic_set_led(0, 0);
+    pmic_set_led(1, 0);
+    pmic_set_led(2, 0);
+    TMR_Delay(MXC_TMR0, MSEC(1000), 0);
+
+    // Enable 32 kHz output
+    RTC_SquareWave(MXC_RTC, SQUARE_WAVE_ENABLED, F_32KHZ, NOISE_IMMUNE_MODE, NULL);
+
+    // Enable SPI
+    sys_cfg_spi_t spi17y_master_cfg;
+
+    spi17y_master_cfg.map = MAP_A;
+    spi17y_master_cfg.ss0 = Enable;
+    spi17y_master_cfg.ss1 = Disable;
+    spi17y_master_cfg.ss2 = Disable;
+
+    if (SPI_Init(SPI, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
+        printf("Error configuring SPI\n");
+        while (1);
+    }
+
+    if(bhy_driver_init(bhy1_fw)) {
+        printf("Failed to init bhy\n");
+    }
+}
+
+static uint32_t ecg_read_reg(uint8_t reg)
+{
+    spi_req_t req;
+    uint8_t tx_data[] = {(reg << 1) | 1, 0, 0, 0};
+    uint8_t rx_data[] = {0, 0, 0, 0};
+    req.tx_data = tx_data;
+    req.rx_data = rx_data;
+    req.len = 4;
+    req.bits = 8;
+    req.width = SPI17Y_WIDTH_1;
+    req.ssel = 0;
+    req.deass = 1;
+    req.ssel_pol = SPI17Y_POL_LOW;
+    req.tx_num = 0;
+    req.rx_num = 0;
+
+    SPI_MasterTrans(SPI0, &req);
+
+    return (rx_data[1] << 16) | (rx_data[2] << 8) | rx_data[3];
+}
+
+void card10_diag(void)
+{
+    uint8_t dummy[1] = {0};
+    // "7-bit addresses 0b0000xxx and 0b1111xxx are reserved"
+    for (int addr = 0x8; addr < 0x78; ++addr) {
+        // A 0 byte write does not seem to work so always send a single byte.
+        int res = I2C_MasterWrite(MXC_I2C0_BUS0, addr << 1, dummy, 1, 0);
+        if(res == 1) {
+            printf("Found (7 bit) address 0x%02x on I2C0\n", addr);
+        }
+
+        res = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, dummy, 1, 0);
+        if(res == 1) {
+            printf("Found (7 bit) address 0x%02x on I2C1\n", addr);
+        }
+    }
+
+
+    struct bme680_dev gas_sensor;
+    gas_sensor.dev_id = BME680_I2C_ADDR_PRIMARY;
+    gas_sensor.intf = BME680_I2C_INTF;
+    gas_sensor.read = card10_bosch_i2c_read;
+    gas_sensor.write = card10_bosch_i2c_write;
+    gas_sensor.delay_ms = card10_bosch_delay;
+    gas_sensor.amb_temp = 25;
+
+    int8_t rslt = BME680_OK;
+    rslt = bme680_init(&gas_sensor);
+    if(rslt != BME680_OK) {
+        printf("Failed to init BME680\n");
+    }
+
+    struct bma400_dev bma;
+    bma.intf_ptr = NULL; /* To attach your interface device reference */
+    bma.delay_ms = card10_bosch_delay;
+    bma.dev_id = BMA400_I2C_ADDRESS_SDO_LOW;
+    bma.read = card10_bosch_i2c_read_ex;
+    bma.write = card10_bosch_i2c_write_ex;
+    bma.intf = BMA400_I2C_INTF;
+
+    rslt = bma400_init(&bma);
+    if (rslt == BMA400_OK) {
+        printf("BMA400 found with chip ID 0x%X\r\n", bma.chip_id);
+    }
+
+
+    for(int i=0; i<0x20; i++) {
+        uint32_t val = ecg_read_reg(i);
+        printf("ECG: %02x: 0x%06x\n", i, val);
+    }
+}
diff --git a/lib/card10/card10.h b/lib/card10/card10.h
new file mode 100644
index 0000000000000000000000000000000000000000..de8e96e44456648f5f11b5aef951ec14fdd60f28
--- /dev/null
+++ b/lib/card10/card10.h
@@ -0,0 +1,8 @@
+#ifndef CARD10_H
+
+#include <stdint.h>
+
+void card10_init(void);
+void card10_diag(void);
+
+#endif