diff --git a/Android.mk b/Android.mk
index 801a40c..3ee7f89 100644
--- a/Android.mk
+++ b/Android.mk
@@ -16,6 +16,8 @@
 
 ifneq ($(BOARD_ANT_WIRELESS_DEVICE),)
 
+LOCAL_PATH := $(call my-dir)
+
 #
 # ANT native library
 #
@@ -24,15 +26,19 @@
 
 ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"wl12xx")
 
-include $(LOCAL_PATH)/hal/bluez_hci/Android.mk
+ANT_DIR := src/bluez_hci
 
-else ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"chip-B")
+else ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"bcm433x")
 
-include $(LOCAL_PATH)/hal/chip-B/Android.mk
+ANT_DIR := src/bluez_hci
 
-else ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"chip-C")
+else ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"cg29xx")
 
-include $(LOCAL_PATH)/hal/chip-C/Android.mk
+ANT_DIR := src/vfs
+
+else ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"vfs-prerelease")
+
+ANT_DIR := src/vfs
 
 else
 
@@ -40,6 +46,9 @@
 
 endif # BOARD_ANT_WIRELESS_DEVICE type
 
+COMMON_DIR := src/common
+
+include $(LOCAL_PATH)/$(ANT_DIR)/Android.mk
 
 #
 # ANT Application
@@ -54,7 +63,7 @@
 LOCAL_CFLAGS:= -g -c -W -Wall -O2
 
 LOCAL_SRC_FILES:= \
-	$(LOCAL_PATH)/app/ant_app.c
+	app/ant_app.c
 
 LOCAL_SHARED_LIBRARIES := \
 	libantradio \
diff --git a/src/bluez_hci/Android.mk b/src/bluez_hci/Android.mk
index 0320a39..2a7687b 100644
--- a/src/bluez_hci/Android.mk
+++ b/src/bluez_hci/Android.mk
@@ -14,39 +14,41 @@
 # limitations under the License.
 #
 
-ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"wl12xx")
-
-LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
 LOCAL_CFLAGS := -g -c -W -Wall -O2
 
 # Check which chip is used so correct values in messages
 ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"wl12xx")
-LOCAL_CFLAGS += -DBOARD_ANT_DEVICE_WILINK
-endif # BOARD_ANT_WIRELESS_DEVICE = wl12xx
+LOCAL_CFLAGS += -DBOARD_ANT_DEVICE_WL12XX
+else ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"bcm433x")
+LOCAL_CFLAGS += -DBOARD_ANT_DEVICE_BCM433X
+endif
 
 LOCAL_C_INCLUDES := \
-   $(LOCAL_PATH)/../common/inc \
-   $(LOCAL_PATH)/inc \
+   $(LOCAL_PATH)/src/common/inc \
+   $(LOCAL_PATH)/$(ANT_DIR)/inc \
    system/bluetooth/bluez-clean-headers \
 
 ifeq ($(BOARD_ANT_WIRELESS_POWER),"bluedroid")
-LOCAL_CFLAGS += -DBOARD_HAVE_ANT_WIRELESS
+LOCAL_CFLAGS += \
+   -DBOARD_HAVE_ANT_WIRELESS \
+   -DUSE_EXTERNAL_POWER_LIBRARY \
+
 LOCAL_C_INCLUDES += system/bluetooth/bluedroid/include/bluedroid
 endif # BOARD_ANT_WIRELESS_POWER = bluedroid
 
+LOCAL_SRC_FILES := \
+   $(COMMON_DIR)/JAntNative.cpp \
+   $(COMMON_DIR)/ant_utils.c \
+   $(ANT_DIR)/ant_native_hci.c \
+   $(ANT_DIR)/ant_rx.c \
+   $(ANT_DIR)/ant_tx.c \
+
+# JNI
 LOCAL_C_INCLUDE += $(JNI_H_INCLUDE)
 
-LOCAL_SRC_FILES := \
-   ../../JAntNative.cpp \
-   ../common/ant_utils.c \
-   ant_native_hci.c \
-   ant_rx.c \
-   ant_tx.c \
-
-# jni
-LOCAL_SHARED_LIBRARIES +=  \
+LOCAL_SHARED_LIBRARIES += \
    libnativehelper \
 
 # chip power
@@ -63,5 +65,3 @@
 
 include $(BUILD_SHARED_LIBRARY)
 
-endif # BOARD_ANT_WIRELESS_DEVICE = "wl12xx"
-
diff --git a/src/bluez_hci/ant_native_hci.c b/src/bluez_hci/ant_native_hci.c
index 4650f62..c2c453f 100644
--- a/src/bluez_hci/ant_native_hci.c
+++ b/src/bluez_hci/ant_native_hci.c
@@ -1,26 +1,26 @@
 /*
-* ANT Stack
-*
-* Copyright 2009 Dynastream Innovations
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
+ * ANT Stack
+ *
+ * Copyright 2009 Dynastream Innovations
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 /******************************************************************************\
 *
 *   FILE NAME:      ant_native_hci.c
 *
 *   BRIEF:
-*        This file provides the HCI implementation of ant_native.h
+*      This file provides the BlueZ HCI implementation of ant_native.h
 *
 *
 \******************************************************************************/
@@ -29,13 +29,15 @@
 #include <string.h>
 #include <unistd.h>
 
-#include "antradio_power.h"
-
 #include "ant_types.h"
 #include "ant_native.h"
 #include "ant_utils.h"
 #include "ant_version.h"
 
+#if USE_EXTERNAL_POWER_LIBRARY
+#include "antradio_power.h"
+#endif
+
 #include "ant_rx.h"
 #include "ant_tx.h"
 #include "ant_hciutils.h"
@@ -44,7 +46,7 @@
 static pthread_mutex_t         txLock;
 pthread_mutex_t                enableLock;
 
-static ANTRadioEnabledStatus radio_status = RADIO_STATUS_DISABLED;
+ANTRadioEnabledStatus radio_status = RADIO_STATUS_DISABLED;
 ANTRadioEnabledStatus get_and_set_radio_status(void);
 
 ////////////////////////////////////////////////////////////////////
@@ -238,6 +240,11 @@
    }
    ANT_DEBUG_V("got enableLock in %s", __FUNCTION__);
 
+   if(RADIO_STATUS_DISABLED == radio_status)
+   {
+      radio_status = RADIO_STATUS_ENABLING;
+   }
+
    ANT_DEBUG_V("getting txLock in %s", __FUNCTION__);
    lockResult = pthread_mutex_lock(&txLock);
    if (lockResult)
@@ -258,15 +265,23 @@
          RxParams.thread = 0;
          ANT_DEBUG_V("recovered. joined by rx thread");
       }
+
       ANT_DEBUG_I("radio_status (%d -> %d)", radio_status, RADIO_STATUS_ENABLING);
       radio_status = RADIO_STATUS_ENABLING;
 
+#if USE_EXTERNAL_POWER_LIBRARY
       if (RxParams.pfStateCallback)
          RxParams.pfStateCallback(radio_status);
+#endif
    }
 
+#if USE_EXTERNAL_POWER_LIBRARY
    result = ant_enable();
+
    ANT_DEBUG_D("ant_enable() result is %d", result);
+#else
+   result = 0;
+#endif
    if (result == 0)
    {
       if (RxParams.thread)
@@ -286,6 +301,7 @@
          else
          {
             result_status = ANT_STATUS_SUCCESS;
+#if USE_EXTERNAL_POWER_LIBRARY
             if (radio_status == RADIO_STATUS_ENABLING)
             {
                ANT_DEBUG_I("radio_status (%d -> %d)", radio_status, RADIO_STATUS_ENABLED);
@@ -298,6 +314,9 @@
             {
                ANT_WARN("radio was already enabled but rx thread was not running");
             }
+#else
+            radio_status = RADIO_STATUS_ENABLED;
+#endif
          }
       }
    }
@@ -306,9 +325,11 @@
       result_status = ANT_STATUS_TRANSPORT_INIT_ERR;
    }
 
-   if (result_status != ANT_STATUS_SUCCESS)
+   if (result_status != ANT_STATUS_SUCCESS) // ant_enable() or rx thread creating failed
    {
+#if USE_EXTERNAL_POWER_LIBRARY
       ant_disable();
+#endif
 
       switch (get_and_set_radio_status())
       {
@@ -333,6 +354,22 @@
    return result_status;
 }
 
+////////////////////////////////////////////////////////////////////
+//  ant_radio_hard_reset
+//
+//  Does nothing as Hard Reset is not supported.
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      ANT_NOT_SUPPORTED
+//
+//  Psuedocode:
+/*
+RESULT = NOT SUPPORTED
+*/
+////////////////////////////////////////////////////////////////////
 ANTStatus ant_radio_hard_reset(void)
 {
    ANTStatus result_status = ANT_STATUS_NOT_SUPPORTED;
@@ -406,6 +443,7 @@
    }
    ANT_DEBUG_V("got txLock in %s", __FUNCTION__);
 
+#if USE_EXTERNAL_POWER_LIBRARY
    if (get_and_set_radio_status() != RADIO_STATUS_DISABLED)
    {
       ANT_DEBUG_I("radio_status (%d -> %d)", radio_status, RADIO_STATUS_DISABLING);
@@ -416,7 +454,11 @@
    }
 
    result = ant_disable();
+
    ANT_DEBUG_D("ant_disable() result is %d", result);
+#else
+   radio_status = RADIO_STATUS_DISABLED;
+#endif
 
    // If rx thread exists ( != 0)
    if (RxParams.thread)
@@ -512,7 +554,7 @@
 //  change internal state from enabled, disabled, or unknown to any of these
 //  three on errors.
 //
-//  Paramerters:
+//  Parameters:
 //      -
 //
 //  Returns:
@@ -521,9 +563,9 @@
 ////////////////////////////////////////////////////////////////////
 ANTRadioEnabledStatus get_and_set_radio_status(void)
 {
-   ANTRadioEnabledStatus orig_status = radio_status;
    ANT_FUNC_START();
-
+#if USE_EXTERNAL_POWER_LIBRARY
+   ANTRadioEnabledStatus orig_status = radio_status;
    switch (ant_is_enabled())
    {
       case 0:
@@ -544,7 +586,7 @@
       if (RxParams.pfStateCallback)
          RxParams.pfStateCallback(radio_status);
    }
-
+#endif
    ANT_FUNC_END();
    return radio_status;
 }
@@ -556,7 +598,7 @@
 //
 //  Parameters:
 //      rx_callback_func   the ANTNativeANTEventCb function to be used
-//                         for recieved messages.
+//                         for received messages.
 //
 //  Returns:
 //          ANT_STATUS_SUCCESS
@@ -569,13 +611,11 @@
 ANTStatus set_ant_rx_callback(ANTNativeANTEventCb rx_callback_func)
 {
    ANTStatus status = ANT_STATUS_SUCCESS;
-
    ANT_FUNC_START();
 
    RxParams.pfRxCallback = rx_callback_func;
 
    ANT_FUNC_END();
-
    return status;
 }
 
@@ -586,7 +626,7 @@
 //
 //  Parameters:
 //      state_callback_func   the ANTNativeANTStateCb function to be used
-//                            for recieved state changes.
+//                            for received state changes.
 //
 //  Returns:
 //          ANT_STATUS_SUCCESS
@@ -599,7 +639,6 @@
 ANTStatus set_ant_state_callback(ANTNativeANTStateCb state_callback_func)
 {
    ANTStatus status = ANT_STATUS_SUCCESS;
-
    ANT_FUNC_START();
 
    RxParams.pfStateCallback = state_callback_func;
diff --git a/src/bluez_hci/ant_rx.c b/src/bluez_hci/ant_rx.c
index 76d29ff..3894cd6 100644
--- a/src/bluez_hci/ant_rx.c
+++ b/src/bluez_hci/ant_rx.c
@@ -20,13 +20,12 @@
 *   FILE NAME:      ant_rx.c
 *
 *   BRIEF:
-*      This file Implements the receive thread for an HCI implementation
+*      This file implements the receive thread for a BlueZ HCI implementation
 *      using Vendor Specific messages.
 *
 *
 \******************************************************************************/
 
-
 #define _GNU_SOURCE /* needed for PTHREAD_MUTEX_RECURSIVE */
 
 #include <errno.h>
@@ -44,23 +43,24 @@
 #include <sys/types.h>
 #include <sys/un.h>
 
-#include "antradio_power.h"
-
 #include <bluetooth/bluetooth.h>
 #include <bluetooth/hci.h>
 #include <bluetooth/hci_lib.h>
 
+#include "ant_types.h"
+
+#if USE_EXTERNAL_POWER_LIBRARY
+#include "antradio_power.h"
+#endif
+
 #include "ant_rx.h"
 #include "ant_hciutils.h"
-#include "ant_types.h"
 #include "ant_framing.h"
 #include "ant_log.h"
+
 #undef LOG_TAG
 #define LOG_TAG "antradio_rx"
 
-static char EVT_PKT_VENDOR_FILTER[] = {0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-                                       0x00,0x00,0x00,0x80,0x00,0x05,0x00,0x00};
-
 /* Global Options */
 ANTHCIRxParams RxParams = {
    .pfRxCallback = NULL,
@@ -70,6 +70,10 @@
 
 extern pthread_mutex_t enableLock;
 extern ANTRadioEnabledStatus get_and_set_radio_status(void);
+#ifndef USE_EXTERNAL_POWER_LIBRARY
+extern ANTRadioEnabledStatus radio_status;
+#endif
+
 /*
  * This thread opens a Bluez HCI socket and waits for ANT messages.
  */
@@ -80,6 +84,7 @@
    int len;
    unsigned char buf[HCI_MAX_EVENT_SIZE];
    int result;
+   struct hci_filter eventVendorFilter;
    ANT_FUNC_START();
 
    (void)pvHCIDevice; //unused waring
@@ -95,8 +100,12 @@
       goto out;
    }
 
-   if (setsockopt(rxSocket, SOL_HCI, HCI_FILTER, &EVT_PKT_VENDOR_FILTER,
-                                             sizeof(EVT_PKT_VENDOR_FILTER)) < 0)
+   eventVendorFilter.type_mask = TYPE_MASK_EVENT_PACKET;
+   eventVendorFilter.event_mask[0] = 0;
+   eventVendorFilter.event_mask[1] = EVENT_MASK_1_EVENT_VENDOR;
+   eventVendorFilter.opcode = htobs(ANT_EVENT_VENDOR_CODE);
+
+   if (setsockopt(rxSocket, SOL_HCI, HCI_FILTER, &eventVendorFilter, sizeof(eventVendorFilter)) < 0)
    {
       ANT_ERROR("failed to set socket options: %s", strerror(errno));
 
@@ -150,84 +159,23 @@
          goto close;
       }
 
-    // 0 = packet type eg. HCI_EVENT_PKT
-    // FOR EVENT:
-    //   1 = event code  eg. EVT_VENDOR, EVT_CMD_COMPLETE
-    //   2 = Parameter total length
-    //   3... parameters
-    //  FOR CC
-    //      3   = Num HCI Command packets allowed to be sent
-    //      4+5 = ANT Opcode
-    //      6   = Result ??
-    //   FOR VS
-    //     3+4 = ANT Opcode
-    //     5   = length
-    //     6 ? MSB of length ?
-    //     7... ant message
-
-      if (len >= 7)
+      hci_event_packet_t *event_packet = (hci_event_packet_t *)buf;
+      int hci_payload_len = validate_hci_event_packet(event_packet, len);
+      if (hci_payload_len == -1)
       {
-          ANT_DEBUG_V("HCI Data: [%02X][%02X][%02X][%02X][%02X][%02X][%02X]...",
-             buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
-      }
-      else
-      {
-         ANT_ERROR("Failed to read full header off socket. len = %d", len);
+         // part of the message is incorrect, ignore it. validate_event_packet will log error
          continue;
       }
 
-      if (len != (buf[2] + 3))
+      ANT_SERIAL(event_packet->hci_payload, hci_payload_len, 'R');
+
+      if(RxParams.pfRxCallback != NULL)
       {
-         ANT_WARN("HCI packet length(%d) and bytes read(%d) dont match", buf[2] + 3, len);
-      }
-
-      if(HCI_EVENT_PKT == buf[0])
-      {
-         ANT_DEBUG_D("Received Event Packet");
-
-         if (EVT_VENDOR == buf[1])
-         {
-            if ((HCI_VSOP_ANT_LSB == buf[3]) && (HCI_VSOP_ANT_MSB == buf[4]))
-            {
-               ANT_DEBUG_D("Received ANT VS Message");
-
-               if (len < 9)
-               {
-                  ANT_ERROR("Malformed ANT header");
-                  ret = ANT_STATUS_FAILED;
-                  goto close;
-               }
-
-               ANT_DEBUG_V("ANT Mesg: ANTMesgSize:%d ANTMesgID:0x%02X ...",
-                                                               buf[7], buf[8]);
-
-               ANT_SERIAL(&(buf[7]), buf[5], 'R');
-
-               if(RxParams.pfRxCallback != NULL)
-               {
-                  RxParams.pfRxCallback(buf[5], &(buf[7]));
-               }
-               else
-               {
-                  ANT_ERROR("Can't send rx message - no callback registered");
-               }
-
-               continue;
-            }
-            else
-            {
-               ANT_DEBUG_W("Vendor Specific message for another vendor. "
-                                                         "Should filter out");
-            }
-         }
-         else
-         {
-            ANT_DEBUG_V("Other Event Packet, Ignoring");
-         }
+         RxParams.pfRxCallback(hci_payload_len, event_packet->hci_payload);
       }
       else
       {
-         ANT_DEBUG_V("Non-Event Packet, Ignoring");
+         ANT_ERROR("Can't send rx message - no callback registered");
       }
    }
 
@@ -238,10 +186,14 @@
    if (result == 0)
    {
       ANT_DEBUG_W("rx thread socket has unexpectedly crashed");
+#if USE_EXTERNAL_POWER_LIBRARY
       if (RxParams.pfStateCallback)
          RxParams.pfStateCallback(RADIO_STATUS_DISABLING);
       ant_disable();
       get_and_set_radio_status();
+#else
+      radio_status = RADIO_STATUS_DISABLED;
+#endif
       RxParams.thread = 0;
       pthread_mutex_unlock(&enableLock);
    }
diff --git a/src/bluez_hci/ant_tx.c b/src/bluez_hci/ant_tx.c
index 2757a3b..e1efa7f 100644
--- a/src/bluez_hci/ant_tx.c
+++ b/src/bluez_hci/ant_tx.c
@@ -20,8 +20,8 @@
 *   FILE NAME:      ant_tx.c
 *
 *   BRIEF:
-*      This file Implements the transmit functionality for an HCI implementation
-*      using Vendor Specific messages.
+*      This file Implements the transmit functionality for a BlueZ HCI
+*      implementation using Vendor Specific messages.
 *
 *
 \******************************************************************************/
@@ -39,31 +39,35 @@
 #include "ant_framing.h"
 #include "ant_utils.h"
 #include "ant_log.h"
+
 #undef LOG_TAG
 #define LOG_TAG "antradio_tx"
 
-static char EVT_PKT_CMD_COMPLETE_FILTER[] = {0x10,0x00,0x00,0x00,0x00,0x40,0x00,
-                                 0x00,0x00,0x00,0x00,0x00,0xD1,0xFD,0x00,0x00};
-
 int g_ant_cmd_socket = -1;
 
 int ant_open_tx_transport(void)
 {
    int socket = -1;
+   struct hci_filter commandCompleteFilter;
    ANT_FUNC_START();
 
    socket = create_hci_sock();
-   
-   if (socket < 0) 
+
+   if (socket < 0)
    {
       ANT_DEBUG_E("failed to open HCI socket for tx: %s", strerror(errno));
    }
    else
    {
       g_ant_cmd_socket = socket;
-      ANT_DEBUG_D("socket handle %#x", g_ant_cmd_socket);
-      if (setsockopt(g_ant_cmd_socket, SOL_HCI, HCI_FILTER, 
-         &EVT_PKT_CMD_COMPLETE_FILTER, sizeof(EVT_PKT_CMD_COMPLETE_FILTER)) < 0)
+      ANT_DEBUG_D("socket handle %#x", socket);
+
+      commandCompleteFilter.type_mask = TYPE_MASK_EVENT_PACKET;
+      commandCompleteFilter.event_mask[0] = EVENT_MASK_0_COMMAND_COMPLETE;
+      commandCompleteFilter.event_mask[1] = 0;
+      commandCompleteFilter.opcode = htobs(ANT_COMMAND_OPCODE);
+
+      if (setsockopt(socket, SOL_HCI, HCI_FILTER, &commandCompleteFilter, sizeof(commandCompleteFilter)) < 0)
       {
          ANT_ERROR("failed to set socket options: %s", strerror(errno));
          close(socket);
@@ -81,7 +85,7 @@
 
    if(0 < socket)
    {
-      if (0 == close(socket)) 
+      if (0 == close(socket))
       {
          ANT_DEBUG_D("closed hci device (socket handle=%#x)", socket);
       }
@@ -176,17 +180,11 @@
    ANT_BOOL retry = ANT_FALSE;
    int bytes_written;
    struct iovec iov[2];
-   hci_vendor_cmd_packet_t hci_header;
-   ANT_U16 hci_opcode;
+   hci_command_vendor_header_t hci_header;
 
    ANT_FUNC_START();
 
-   hci_opcode = cmd_opcode_pack(OGF_VENDOR_CMD, HCI_CMD_ANT_MESSAGE_WRITE);
-
-   hci_header.packet_type = HCI_COMMAND_PKT;
-   ANT_UTILS_StoreLE16(hci_header.cmd_header.opcode, hci_opcode);
-   hci_header.cmd_header.plen = ((ant_message_len + HCI_VENDOR_HEADER_SIZE) & 0xFF);
-   ANT_UTILS_StoreLE16(hci_header.vendor_header.hcilen, ant_message_len);
+   create_command_header(&hci_header, ant_message_len);
 
    iov[0].iov_base = &hci_header;
    iov[0].iov_len = sizeof(hci_header);
@@ -257,9 +255,8 @@
 {
    ANTStatus status = ANT_STATUS_NO_VALUE_AVAILABLE;
    int len;
-   ANTStatus ret = ANT_STATUS_SUCCESS;
    ANT_U8 ucResult = -1;
-   ANT_U8 buf[ANT_NATIVE_MAX_PARMS_LEN];
+   ANT_U8 buf[HCI_MAX_EVENT_SIZE];
 
    ANT_FUNC_START();
    ANT_DEBUG_V("reading off socket %#x", socket);
@@ -272,82 +269,62 @@
 
       ANT_ERROR("failed to read socket. error: %s", strerror(errno));
 
-      ret = ANT_STATUS_FAILED;
+      status = ANT_STATUS_FAILED;
       goto close;
    }
 
    ANT_SERIAL(buf, len, 'C');
 
-   ANT_DEBUG_V("HCI Data: [%02X][%02X][%02X][%02X][%02X][%02X][%02X]...", 
-              buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
-
-   // 0 = packet type eg. HCI_EVENT_PKT
-   // FOR EVENT:
-   //   1 = event code  eg. EVT_VENDOR, EVT_CMD_COMPLETE
-   //   2 = Parameter total length
-   //   3... parameters
-   //  FOR CC
-   //      3   = Num HCI Vommand packets (allowed to be sent)
-   //      4+5 = ANT Opcode
-   //      6   = Result ??
-   //   FOR VS
-   //     3+4 = ANT Opcode
-   //     5   = length
-   //     6 ? MSB of length ?
-   //     7... ant message
-
-   if(HCI_EVENT_PKT == buf[0])
+   // validate that we have a single command complete packet
+   if (len != sizeof(hci_command_complete_packet_t))
    {
-      ANT_DEBUG_D("Received Event Packet");
+       status = ANT_STATUS_FAILED;
+   }
+   else
+   {
+      hci_command_complete_packet_t *command_complete = (hci_command_complete_packet_t *)buf;
 
-      if(EVT_CMD_COMPLETE == buf[1])
+      if(command_complete->packet_type == HCI_EVENT_PKT)
       {
-         if(len < HCI_EVENT_OVERHEAD_SIZE) 
+         ANT_DEBUG_D("Received Event Packet");
+
+         if(command_complete->event_header.evt == EVT_CMD_COMPLETE)
          {
-            status = ANT_STATUS_FAILED;
+            ANT_U16 opcode = ANT_UTILS_LEtoHost16((ANT_U8 *)&command_complete->command_complete_hdr.opcode);
+            if(opcode == ANT_COMMAND_OPCODE)
+            {
+               ANT_DEBUG_V("Received COMMAND COMPLETE");
+               ucResult = command_complete->response;
+
+               if(ucResult == 0)
+               {
+                  ANT_DEBUG_D("Command Complete = SUCCESS");
+                  status = ANT_STATUS_SUCCESS;
+               }
+               else if(ucResult == HCI_UNSPECIFIED_ERROR)
+               {
+                  ANT_DEBUG_D("Command Complete = UNSPECIFIED_ERROR");
+                  status = ANT_STATUS_TRANSPORT_UNSPECIFIED_ERROR;
+               }
+               else
+               {
+                  status = ANT_STATUS_COMMAND_WRITE_FAILED;
+                  ANT_DEBUG_D("Command Complete = WRITE_FAILED");
+               }
+            }
+            else
+            {
+               ANT_DEBUG_W("Command complete has wrong opcode, this should have been filtered out");
+            }
          }
          else
          {
-            if((HCI_CMD_OPCODE_ANT_LSB == buf[4]) && 
-                                         (HCI_CMD_OPCODE_ANT_MSB == buf[5]))
-            {
-               ucResult = buf[6];
-
-               ANT_DEBUG_V("Received COMMAND COMPLETE");
-            }
-            else
-            {
-               ANT_DEBUG_V("Command complete has wrong opcode");
-            }
-         }
-
-         /*
-          * if got a status byte, pass it forward, otherwise pass a failure
-          * status
-          */
-         if(status != ANT_STATUS_FAILED)
-         {
-            if(ucResult == 0)
-            {
-               ANT_DEBUG_D("Command Complete = SUCCESS");
-               status = ANT_STATUS_SUCCESS;
-            }
-            else if(ucResult == HCI_UNSPECIFIED_ERROR)
-            {
-               ANT_DEBUG_D("Command Complete = UNSPECIFIED_ERROR");
-
-               status = ANT_STATUS_TRANSPORT_UNSPECIFIED_ERROR;
-            }
-            else
-            {
-               status = ANT_STATUS_COMMAND_WRITE_FAILED;
-               ANT_DEBUG_D("Command Complete = WRITE_FAILED");
-            }
+            ANT_DEBUG_W("Event is not a command complete, this should have been filtered out");
          }
       }
       else
       {
-         ANT_DEBUG_W("Other Event Packet, Should filter out");
+         ANT_DEBUG_W("Other Event Packet, this should have been filtered out");
       }
    }
 
diff --git a/src/bluez_hci/inc/ant_framing.h b/src/bluez_hci/inc/ant_framing.h
index 7d01844..59c16ca 100644
--- a/src/bluez_hci/inc/ant_framing.h
+++ b/src/bluez_hci/inc/ant_framing.h
@@ -2,25 +2,26 @@
  * ANT Stack
  *
  * Copyright 2009 Dynastream Innovations
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and  
+ * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 /******************************************************************************\
 *
-*   FILE NAME:      ANT_Framing.h
+*   FILE NAME:      ant_framing.h
 *
-*   BRIEF:          
-*		This file defines ANT specific HCI values used by the ANT chip.
+*   BRIEF:
+*      This file defines ANT specific HCI values used by the ANT chip with a
+*      shared BlueZ HCI transport.
 *
 *
 \******************************************************************************/
@@ -28,23 +29,167 @@
 #ifndef __ANT_HCIFRAMING_H
 #define __ANT_HCIFRAMING_H
 
-#ifdef BOARD_ANT_DEVICE_WILINK
+#if defined(BOARD_ANT_DEVICE_WL12XX)
 
-/* Number to used by the VS Parameters Len field */
-#define ANT_NATIVE_HCI_VS_PARMS_LEN_FIELD_LEN    (2)
+#define ANT_COMMAND_OPCODE                         0xFDD1
+#define ANT_EVENT_VENDOR_CODE                      0x0500
 
-#define HCI_CMD_ANT_MESSAGE_WRITE                ((ANT_U16)0x01D1)
+typedef struct {
+   ANT_U16                    vendor_msg_len;
+} __attribute__ ((packed)) hci_cmd_vendor_hdr_t;
+#define HCI_COMMAND_VENDOR_HDR_SIZE                2
 
-#define HCI_CMD_OPCODE_ANT_LSB                   0xD1
-#define HCI_CMD_OPCODE_ANT_MSB                   0xFD
+typedef struct {
+   ANT_U16                    vendor_code;
+   ANT_U16                    vendor_msg_len;
+} __attribute__ ((packed)) hci_evt_vendor_hdr_t;
+#define HCI_EVENT_VENDOR_HDR_SIZE                  4
 
-#define HCI_VSOP_ANT_LSB                         0x00
-#define HCI_VSOP_ANT_MSB                         0x05
+#elif defined(BOARD_ANT_DEVICE_BCM433X)
 
-#else
+#define ANT_COMMAND_OPCODE                         0xFCEC
+#define ANT_EVENT_VENDOR_CODE                      0x2D
 
-#error "Board ANT Device Type not recognised"
+typedef struct {
+   ANT_U8                     command_id_padding;
+} __attribute__ ((packed)) hci_cmd_vendor_hdr_t;
+#define HCI_COMMAND_VENDOR_HDR_SIZE                1
+
+typedef struct {
+   ANT_U8                     vendor_code;
+   ANT_U8                     status;
+} __attribute__ ((packed)) hci_evt_vendor_hdr_t;
+#define HCI_EVENT_VENDOR_HDR_SIZE                  2
+
+#define  COMMAND_ID_PADDING                        0xFF
 
 #endif
 
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+
+#include "ant_native.h"
+#include "ant_types.h"
+#include "ant_utils.h"
+
+#define HCI_EVENT_HEADER_OVERHEAD (HCI_TYPE_LEN + HCI_EVENT_HDR_SIZE)
+#define HCI_EVENT_TOTAL_OVERHEAD (HCI_EVENT_HEADER_OVERHEAD + HCI_EVENT_VENDOR_HDR_SIZE)
+
+#define TYPE_MASK_EVENT_PACKET                     0x00000010
+#define EVENT_MASK_0_COMMAND_COMPLETE              0x00004000
+#define EVENT_MASK_1_EVENT_VENDOR                  0x80000000
+
+// -------------------------------------------------
+
+typedef struct {
+   ANT_U8                     packet_type;         // HCI_COMMAND_PKT
+   hci_command_hdr            command_header;      // from hci.h
+   hci_cmd_vendor_hdr_t       vendor_header;
+} __attribute__ ((packed)) hci_command_vendor_header_t;
+
+
+typedef struct {
+   ANT_U8                     packet_type;         // HCI_EVENT_PKT
+   hci_event_hdr              event_header;        // from hci.h
+   hci_evt_vendor_hdr_t       vendor_header;
+   ANT_U8                     hci_payload[HCI_MAX_EVENT_SIZE];
+} __attribute__ ((packed)) hci_event_packet_t;
+
+typedef struct {
+   ANT_U8                     packet_type;         // HCI_EVENT_PKT
+   hci_event_hdr              event_header;        // from hci.h
+   evt_cmd_complete           command_complete_hdr;// from hci.h
+   ANT_U8                     response;
+} __attribute__ ((packed)) hci_command_complete_packet_t;
+
+// -------------------------------------------------
+
+/**
+ * @param header the struct to fill with chip specific hci header
+ * @param ant_message_len total ant length, size, id, and data
+ */
+static inline void create_command_header(hci_command_vendor_header_t *header, ANT_U8 ant_message_len)
+{
+   header->packet_type = HCI_COMMAND_PKT;
+   header->command_header.opcode = htobs(ANT_COMMAND_OPCODE);
+   header->command_header.plen = ant_message_len + HCI_COMMAND_VENDOR_HDR_SIZE;
+#if defined(BOARD_ANT_DEVICE_WL12XX)
+   header->vendor_header.vendor_msg_len = htobs(ant_message_len);
+#elif defined(BOARD_ANT_DEVICE_BCM433X)
+   header->vendor_header.command_id_padding = COMMAND_ID_PADDING;
+#endif
+}
+
+/**
+ * @param packet the struct to check if is an ANT hci payload
+ * @param packet_len the total length of the packet
+ * @return 0 if valid, -1 if not valid
+ */
+static inline int validate_hci_event_vendor(hci_event_packet_t *packet, int packet_len)
+{
+#if defined(BOARD_ANT_DEVICE_WL12XX)
+   ANT_U16 vendor_code = ANT_UTILS_LEtoHost16((ANT_U8 *)&packet->vendor_header.vendor_code);
+#elif defined(BOARD_ANT_DEVICE_BCM433X)
+   ANT_U8 vendor_code = packet->vendor_header.vendor_code;
+#endif
+   if (vendor_code != ANT_EVENT_VENDOR_CODE) {
+      ANT_ERROR("HCI packet vendor event code is not ANT");
+      return -1;
+   }
+
+#if defined(BOARD_ANT_DEVICE_WL12XX)
+   ANT_U16 vendor_msg_len = ANT_UTILS_LEtoHost16((ANT_U8 *)&packet->vendor_header.vendor_msg_len);
+   if (packet_len != vendor_msg_len + HCI_EVENT_TOTAL_OVERHEAD) {
+      ANT_ERROR("HCI packet length (%d) should be %d bytes more than HCI payload length (%d)",
+              packet_len, HCI_EVENT_TOTAL_OVERHEAD, vendor_msg_len);
+      return -1;
+   }
+#elif defined(BOARD_ANT_DEVICE_BCM433X)
+   (void)packet_len; // unused warning
+#endif
+
+   return 0;
+}
+
+/**
+ * @param packet the struct to validate
+ * @param packet_len the total length of the packet
+ * @return -1 if not valid, or length of the ANT hci payload
+ */
+static inline int validate_hci_event_packet(hci_event_packet_t *packet, int packet_len)
+{
+   // Make sure we have at the minimum the hci header, vendor header, and ANT size/id bytes
+   if (packet_len < HCI_EVENT_TOTAL_OVERHEAD) {
+      ANT_ERROR("HCI packet length (%d) is less than minimum (%d)",
+              packet_len, HCI_EVENT_TOTAL_OVERHEAD);
+      return -1;
+   }
+
+   if (packet->packet_type != HCI_EVENT_PKT) {
+      ANT_ERROR("HCI packet is not an event packet");
+      return -1;
+   }
+
+   if (packet->event_header.evt != EVT_VENDOR) {
+      ANT_ERROR("HCI packet is not a vendor event");
+      return -1;
+   }
+
+   if (packet_len != packet->event_header.plen + HCI_EVENT_HEADER_OVERHEAD) {
+      ANT_ERROR("HCI packet length (%d) should be %d bytes more than HCI event length (%d)",
+              packet_len, HCI_EVENT_HDR_SIZE, packet->event_header.plen);
+      return -1;
+   }
+
+   if (validate_hci_event_vendor(packet, packet_len) == -1)
+   {
+      return -1;
+   }
+   else
+   {
+      // return HCI payload len
+      return packet_len - HCI_EVENT_TOTAL_OVERHEAD;
+   }
+}
+
 #endif /* __ANT_HCIFRAMING_H */
diff --git a/src/bluez_hci/inc/ant_hciutils.h b/src/bluez_hci/inc/ant_hciutils.h
index f8cf579..d654ce9 100644
--- a/src/bluez_hci/inc/ant_hciutils.h
+++ b/src/bluez_hci/inc/ant_hciutils.h
@@ -17,10 +17,10 @@
  */
 /******************************************************************************\
 *
-*   FILE NAME:      ant_hciuntils.h
+*   FILE NAME:      ant_hciutils.h
 *
 *   BRIEF:
-*		This file defines the utility functions for an HCI implementation
+*      This file defines the utility functions for a Bluetooth HCI implementation
 *
 *
 \******************************************************************************/
@@ -33,65 +33,9 @@
 #include <bluetooth/bluetooth.h>
 #include <bluetooth/hci.h>
 
-#include "ant_types.h"
-#include "ant_native.h"
 #include "ant_log.h"
 // -------------------------------------------------
 
-#define HCI_COMMAND_HEADER_SIZE 3
-typedef struct {
-   ANT_U8                     opcode[2];           // 0xFDD1 for ANT
-   ANT_U8                     plen;
-} __attribute__ ((packed)) hci_command_header_t;
-
-#define HCI_VENDOR_HEADER_SIZE 2
-typedef struct {
-   ANT_U8                  hcilen[2];
-} __attribute__ ((packed)) hci_vendor_header_t;
-
-#define HCI_COMMAND_OVERHEAD_SIZE ( HCI_COMMAND_HEADER_SIZE + \
-                                    HCI_VENDOR_HEADER_SIZE + 1)
-typedef struct {
-   ANT_U8                     packet_type;         // 0x01 for HCI_COMMAND_PKT
-   hci_command_header_t       cmd_header;
-   hci_vendor_header_t        vendor_header;
-} __attribute__ ((packed)) hci_vendor_cmd_packet_t;
-
-#define HCI_EVENT_HEADER_SIZE 2
-typedef struct {
-   ANT_U8                     event_c;             // 0xFF for Vendor Specific,
-                                                   // 0x0E for EVNT_CMD_COMPLETE
-   ANT_U8                     plen;                // data/parameter length
-} __attribute__ ((packed)) hci_event_header_t;
-
-#define HCI_EVENT_OVERHEAD_SIZE (HCI_EVENT_HEADER_SIZE + 5)
-typedef struct {
-   ANT_U8                     packet_type;         // HCI_EVENT_PKT
-   hci_event_header_t         header;
-   union {
-      struct {
-         ANT_U8               vendor_c[2];         // 0x0500 for ANT
-         ANT_U8               hcilen[2];
-      } vendor;
-      struct {
-         ANT_U8               num_token;
-         ANT_U8               opcode[2];           // 0xFDD1 for ANT
-         ANT_U8               resp;
-      } cmd_cmplt;
-   };
-   ANT_U8                     data[ANT_NATIVE_MAX_PARMS_LEN];  // Should be 255
-} __attribute__ ((packed)) hci_event_packet_t;
-
-typedef struct {
-   union {
-      hci_event_packet_t      hci_event_packet;
-      ANT_U8                  raw_packet[sizeof(hci_event_packet_t)];
-   };
-} rx_data_t;  // Use this is for vendor specific and command complete events
-
-
-// -------------------------------------------------
-
 static inline int create_hci_sock() {
    struct sockaddr_hci sa;
    int sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
diff --git a/src/bluez_hci/inc/ant_rx.h b/src/bluez_hci/inc/ant_rx.h
index c914bb6..aff076d 100644
--- a/src/bluez_hci/inc/ant_rx.h
+++ b/src/bluez_hci/inc/ant_rx.h
@@ -20,7 +20,8 @@
 *   FILE NAME:      ant_rx.h
 *
 *   BRIEF:
-*		This file defines the receive thread function
+*      This file defines the receive thread function and the ANTHCIRxParams
+*      type for storing the configuration of the receive thread.
 *
 *
 \******************************************************************************/
@@ -32,6 +33,7 @@
 #include "ant_types.h"
 #include "ant_native.h"
 
+// The configuration of a receive thread
 typedef struct
 {
    //The function to call back with received data
diff --git a/src/bluez_hci/inc/ant_tx.h b/src/bluez_hci/inc/ant_tx.h
index 5057011..0c85a5a 100644
--- a/src/bluez_hci/inc/ant_tx.h
+++ b/src/bluez_hci/inc/ant_tx.h
@@ -20,7 +20,7 @@
 *   FILE NAME:      ant_tx.h
 *
 *   BRIEF:
-*		This file defines the transmit function
+*      This file defines the utility functions used by the transmit function.
 *
 *
 \******************************************************************************/
diff --git a/src/chip-B/ant_native_chardev.c b/src/chip-B/ant_native_chardev.c
deleted file mode 100644
index 39e61d7..0000000
--- a/src/chip-B/ant_native_chardev.c
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * ANT Stack
- *
- * Copyright 2011 Dynastream Innovations
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*******************************************************************************\
-*
-*   FILE NAME:     ant_native_chardev.c
-*
-*   BRIEF:
-*      This file provides the character device implementation of ant_native.h
-*
-*
-\*******************************************************************************/
-
-#include <errno.h>
-#include <fcntl.h> /* for open() */
-#include <linux/ioctl.h>
-#include <pthread.h>
-
-#include "ant_native.h"
-#include "ant_types.h"
-#include "ant_log.h"
-#include "ant_version.h"
-
-#include "ant_native_chardev.h"
-#include "ant_rx_chardev.h"
-
-#define CHIP_B_CHAR_DEV_IOCTL_RESET          _IO('H', 160)
-
-#define MESG_BROADCAST_DATA_ID               ((ANT_U8)0x4E)
-#define MESG_ACKNOWLEDGED_DATA_ID            ((ANT_U8)0x4F)
-#define MESG_BURST_DATA_ID                   ((ANT_U8)0x50)
-#define MESG_EXT_BROADCAST_DATA_ID           ((ANT_U8)0x5D)
-#define MESG_EXT_ACKNOWLEDGED_DATA_ID        ((ANT_U8)0x5E)
-#define MESG_EXT_BURST_DATA_ID               ((ANT_U8)0x5F)
-
-static ant_rx_thread_info_t stRxThreadInfo;
-static pthread_mutex_t stEnabledStatusLock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t stFlowControlLock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t stFlowControlCond = PTHREAD_COND_INITIALIZER;
-ANTNativeANTStateCb g_fnStateCallback;
-
-static void ant_channel_init(ant_channel_info_t *pstChnlInfo, const char *pcCharDevName)
-{
-   pstChnlInfo->pcDevicePath = pcCharDevName;
-   pstChnlInfo->iFd = -1;
-   pstChnlInfo->fnRxCallback = NULL;
-   pstChnlInfo->ucFlowControlResp = FLOW_GO;
-   pstChnlInfo->pstFlowControlCond = &stFlowControlCond;
-   pstChnlInfo->pstFlowControlLock = &stFlowControlLock;
-}
-
-ANTStatus ant_init(void)
-{
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   ANT_FUNC_START();
-   stRxThreadInfo.stRxThread = 0;
-   stRxThreadInfo.ucRunThread = 0;
-   stRxThreadInfo.ucChipResetting = 0;
-   stRxThreadInfo.pstEnabledStatusLock = &stEnabledStatusLock;
-   g_fnStateCallback = 0;
-   ant_channel_init(&stRxThreadInfo.astChannels[COMMAND_CHANNEL], ANT_COMMANDS_DEVICE_NAME);
-   ant_channel_init(&stRxThreadInfo.astChannels[DATA_CHANNEL], ANT_DATA_DEVICE_NAME);
-   uiRet = ANT_STATUS_SUCCESS;
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-ANTStatus ant_deinit(void)
-{
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   ANT_FUNC_START();
-   uiRet = ANT_STATUS_SUCCESS;
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-ANTStatus set_ant_rx_callback(ANTNativeANTEventCb rx_callback_func)
-{
-   ANT_FUNC_START();
-   stRxThreadInfo.astChannels[COMMAND_CHANNEL].fnRxCallback = rx_callback_func;
-   stRxThreadInfo.astChannels[DATA_CHANNEL].fnRxCallback = rx_callback_func;
-   ANT_FUNC_END();
-   return ANT_STATUS_SUCCESS;
-}
-
-ANTStatus set_ant_state_callback(ANTNativeANTStateCb state_callback_func)
-{
-   ANT_FUNC_START();
-   g_fnStateCallback = state_callback_func;
-   ANT_FUNC_END();
-   return ANT_STATUS_SUCCESS;
-}
-
-ANTStatus ant_tx_message(ANT_U8 ucLen, ANT_U8 *pucMesg)
-{
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   int iMutexResult;
-   int iResult;
-   struct timespec stTimeout;
-   int iCondWaitResult;
-   ANT_U8 txBuffer[ANT_HCI_MAX_MSG_SIZE];
-   ANT_FUNC_START();
-   if (ant_radio_enabled_status() != RADIO_STATUS_ENABLED) {
-      uiRet = ANT_STATUS_FAILED_BT_NOT_INITIALIZED;
-      goto out;
-   }
-   txBuffer[CHIP_B_HCI_SIZE_OFFSET] = ucLen;
-   memcpy(txBuffer + CHIP_B_HCI_HEADER_SIZE, pucMesg, ucLen);
-   ANT_SERIAL(txBuffer, ucLen + CHIP_B_HCI_HEADER_SIZE, 'T');
-   switch (txBuffer[CHIP_B_HCI_DATA_OFFSET + ANT_MSG_ID_OFFSET]) {
-   case MESG_BROADCAST_DATA_ID:
-   case MESG_ACKNOWLEDGED_DATA_ID:
-   case MESG_BURST_DATA_ID:
-   case MESG_EXT_BROADCAST_DATA_ID:
-   case MESG_EXT_ACKNOWLEDGED_DATA_ID:
-   case MESG_EXT_BURST_DATA_ID:
-      ANT_DEBUG_V("getting stFlowControlLock in %s", __FUNCTION__);
-      iMutexResult = pthread_mutex_lock(&stFlowControlLock);
-      if (iMutexResult) {
-         ANT_ERROR("failed to lock flow control mutex during tx: %s", strerror(iMutexResult));
-         goto out;
-      }
-      ANT_DEBUG_V("got stFlowControlLock in %s", __FUNCTION__);
-
-      stRxThreadInfo.astChannels[COMMAND_CHANNEL].ucFlowControlResp = FLOW_STOP;
-      iResult = write(stRxThreadInfo.astChannels[DATA_CHANNEL].iFd, txBuffer, ucLen + CHIP_B_HCI_HEADER_SIZE);
-      if (iResult < 0) {
-         ANT_ERROR("failed to write data message to device: %s", strerror(errno));
-      } else if (iResult != ucLen + CHIP_B_HCI_HEADER_SIZE) {
-         ANT_ERROR("bytes written and message size dont match up");
-      } else {
-         stTimeout.tv_sec = time(0) + CHIP_B_FLOW_GO_WAIT_TIMEOUT_SEC;
-         stTimeout.tv_nsec = 0;
-
-         while (stRxThreadInfo.astChannels[COMMAND_CHANNEL].ucFlowControlResp != FLOW_GO) {
-            iCondWaitResult = pthread_cond_timedwait(&stFlowControlCond, &stFlowControlLock, &stTimeout);
-            if (iCondWaitResult) {
-               ANT_ERROR("failed to wait for flow control response: %s", strerror(iCondWaitResult));
-               if (iCondWaitResult == ETIMEDOUT)
-                  uiRet = ANT_STATUS_HARDWARE_ERR;
-               goto wait_error;
-            }
-         }
-         uiRet = ANT_STATUS_SUCCESS;
-      }
-wait_error:
-      ANT_DEBUG_V("releasing stFlowControlLock in %s", __FUNCTION__);
-      pthread_mutex_unlock(&stFlowControlLock);
-      ANT_DEBUG_V("released stFlowControlLock in %s", __FUNCTION__);
-      break;
-   default:
-      iResult = write(stRxThreadInfo.astChannels[COMMAND_CHANNEL].iFd, txBuffer, ucLen + CHIP_B_HCI_HEADER_SIZE);
-      if (iResult < 0) {
-         ANT_ERROR("failed to write message to device: %s", strerror(errno));
-      }  else if (iResult != ucLen + CHIP_B_HCI_HEADER_SIZE) {
-         ANT_ERROR("bytes written and message size dont match up");
-      } else {
-         uiRet = ANT_STATUS_SUCCESS;
-      }
-   }
-out:
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-ANTStatus ant_radio_hard_reset(void)
-{
-   enum ant_channel_type eChannel;
-   int iLockResult;
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   ANT_FUNC_START();
-   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
-   iLockResult = pthread_mutex_lock(&stEnabledStatusLock);
-   if(iLockResult) {
-      ANT_ERROR("enable failed to get state lock: %s", strerror(iLockResult));
-      goto out;
-   }
-   ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
-
-   stRxThreadInfo.ucChipResetting = 1;
-   if (g_fnStateCallback)
-      g_fnStateCallback(RADIO_STATUS_RESETTING);
-
-   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++)
-      ioctl(stRxThreadInfo.astChannels[eChannel].iFd, CHIP_B_CHAR_DEV_IOCTL_RESET); //TODO only one?
-
-   ant_do_disable();
-
-   if (ant_do_enable()) { /* failed */
-      if (g_fnStateCallback)
-         g_fnStateCallback(RADIO_STATUS_DISABLED);
-   } else { /* success */
-      if (g_fnStateCallback)
-         g_fnStateCallback(RADIO_STATUS_RESET);
-      uiRet = ANT_STATUS_SUCCESS;
-   }
-   stRxThreadInfo.ucChipResetting = 0;
-
-   ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
-   pthread_mutex_unlock(&stEnabledStatusLock);
-   ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
-out:
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-static void ant_disable_channel(ant_channel_info_t *pstChnlInfo)
-{
-   ANT_FUNC_START();
-   if (!pstChnlInfo) {
-      ANT_ERROR("null channel info passed to channel disable function");
-      goto out;
-   }
-   if (pstChnlInfo->iFd != -1) {
-      if (close(pstChnlInfo->iFd) < 0) {
-         ANT_ERROR("failed to close channel %s(%#x): %s", pstChnlInfo->pcDevicePath, pstChnlInfo->iFd, strerror(errno));
-      }
-      pstChnlInfo->iFd = -1; //TODO can this overwrite a still valid fd?
-   } else {
-      ANT_DEBUG_D("%s file is already closed", pstChnlInfo->pcDevicePath);
-   }
-out:
-   ANT_FUNC_END();
-}
-
-static int ant_enable_channel(ant_channel_info_t *pstChnlInfo)
-{
-   int iRet = -1;
-   ANT_FUNC_START();
-   if (!pstChnlInfo) {
-      ANT_ERROR("null channel info passed to channel enable function");
-      errno = EINVAL;
-      goto out;
-   }
-   if (pstChnlInfo->iFd == -1) {
-      pstChnlInfo->iFd = open(pstChnlInfo->pcDevicePath, O_RDWR);
-      if (pstChnlInfo->iFd < 0) {
-         ANT_ERROR("failed to open dev %s: %s", pstChnlInfo->pcDevicePath, strerror(errno));
-         goto out;
-      }
-   } else {
-      ANT_DEBUG_D("%s is already enabled", pstChnlInfo->pcDevicePath);
-   }
-   iRet = 0;
-out:
-   ANT_FUNC_END();
-   return iRet;
-}
-
-int ant_do_enable(void)
-{
-   int iRet = -1;
-   enum ant_channel_type eChannel;
-   ANT_FUNC_START();
-
-   stRxThreadInfo.ucRunThread = 1;
-   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
-      if (ant_enable_channel(&stRxThreadInfo.astChannels[eChannel]) < 0) {
-         ANT_ERROR("failed to enable channel %s: %s",
-                         stRxThreadInfo.astChannels[eChannel].pcDevicePath,
-                         strerror(errno));
-         goto out;
-      }
-   }
-   if (stRxThreadInfo.stRxThread == 0) {
-      if (pthread_create(&stRxThreadInfo.stRxThread, NULL, fnRxThread, &stRxThreadInfo) < 0) {
-         ANT_ERROR("failed to start rx thread: %s", strerror(errno));
-         goto out;
-      }
-   } else {
-      ANT_DEBUG_D("rx thread is already running");
-   }
-   if (!stRxThreadInfo.ucRunThread) {
-      ANT_ERROR("rx thread crashed during init");
-      goto out;
-   }
-   iRet = 0;
-out:
-   ANT_FUNC_END();
-   return iRet;
-}
-
-void ant_do_disable(void)
-{
-   enum ant_channel_type eChannel;
-   ANT_FUNC_START();
-   stRxThreadInfo.ucRunThread = 0;
-   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++)
-      ant_disable_channel(&stRxThreadInfo.astChannels[eChannel]);
-   if (stRxThreadInfo.stRxThread != 0) {
-      if (pthread_join(stRxThreadInfo.stRxThread, NULL) < 0) {
-         ANT_ERROR("failed to join rx thread: %s", strerror(errno));
-      }
-      stRxThreadInfo.stRxThread = 0;
-   } else {
-      ANT_DEBUG_D("rx thread is not running");
-   }
-   ANT_FUNC_END();
-}
-
-ANTStatus ant_enable_radio(void)
-{
-   int iLockResult;
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   ANT_FUNC_START();
-   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
-   iLockResult = pthread_mutex_lock(&stEnabledStatusLock);
-   if(iLockResult) {
-      ANT_ERROR("enable failed to get state lock: %s", strerror(iLockResult));
-      goto out;
-   }
-   ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
-
-   if (g_fnStateCallback)
-      g_fnStateCallback(RADIO_STATUS_ENABLING);
-
-   if (ant_do_enable() < 0) {
-      ANT_ERROR("ant enable failed: %s", strerror(errno));
-
-      ant_do_disable();
-
-      if (g_fnStateCallback)
-         g_fnStateCallback(ant_radio_enabled_status());
-   } else {
-      if (g_fnStateCallback)
-         g_fnStateCallback(RADIO_STATUS_ENABLED);
-      uiRet = ANT_STATUS_SUCCESS;
-   }
-
-   ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
-   pthread_mutex_unlock(&stEnabledStatusLock);
-   ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
-out:
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-ANTStatus ant_disable_radio(void)
-{
-   int iLockResult;
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   ANT_FUNC_START();
-   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
-   iLockResult = pthread_mutex_lock(&stEnabledStatusLock);
-   if(iLockResult) {
-      ANT_ERROR("disable failed to get state lock: %s", strerror(iLockResult));
-      goto out;
-   }
-   ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
-
-   if (g_fnStateCallback)
-      g_fnStateCallback(RADIO_STATUS_DISABLING);
-
-   ant_do_disable();
-
-   if (g_fnStateCallback)
-      g_fnStateCallback(ant_radio_enabled_status());
-   uiRet = ANT_STATUS_SUCCESS;
-
-   ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
-   pthread_mutex_unlock(&stEnabledStatusLock);
-   ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
-out:
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-ANTRadioEnabledStatus ant_radio_enabled_status(void)
-{
-   enum ant_channel_type eChannel;
-   int iOpenFiles = 0;
-   int iOpenThread;
-   ANTRadioEnabledStatus uiRet = RADIO_STATUS_UNKNOWN;
-   ANT_FUNC_START();
-   if (stRxThreadInfo.ucChipResetting) {
-      uiRet = RADIO_STATUS_RESETTING;
-      goto out;
-   }
-   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++)
-      if (stRxThreadInfo.astChannels[eChannel].iFd != -1)
-         iOpenFiles++;
-   iOpenThread = (stRxThreadInfo.stRxThread) ? 1 : 0;
-
-   if (!stRxThreadInfo.ucRunThread) {
-      if (iOpenFiles || iOpenThread) {
-         uiRet = RADIO_STATUS_DISABLING;
-      } else {
-         uiRet = RADIO_STATUS_DISABLED;
-      }
-   } else {
-      if ((iOpenFiles == NUM_ANT_CHANNELS) && iOpenThread) {
-         uiRet = RADIO_STATUS_ENABLED;
-      } else if (!iOpenFiles && iOpenThread) {
-         uiRet = RADIO_STATUS_UNKNOWN;
-      } else {
-         uiRet = RADIO_STATUS_ENABLING;
-      }
-   }
-out:
-   ANT_DEBUG_D("get radio enabled status returned %d", uiRet);
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-const char *ant_get_lib_version()
-{
-   return "libantradio.so: CHIP_B Character Device Transport. Version "
-      LIBANT_STACK_MAJOR"."LIBANT_STACK_MINOR"."LIBANT_STACK_INCRE;
-}
-
diff --git a/src/chip-B/ant_rx_chardev.c b/src/chip-B/ant_rx_chardev.c
deleted file mode 100644
index c4aedac..0000000
--- a/src/chip-B/ant_rx_chardev.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * ANT Stack
- *
- * Copyright 2011 Dynastream Innovations
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*******************************************************************************\
-*
-*   FILE NAME:     ant_rx_chardev.c
-*
-*   BRIEF:
-*      This file provides the rx function which will loop reading ANT messages
-*        until told to exit.
-*
-*
-\*******************************************************************************/
-
-#include <errno.h>
-#include <poll.h>
-#include <pthread.h>
-
-#include "ant_rx_chardev.h"
-#include "ant_native_chardev.h"
-
-#include "ant_native.h"
-#include "ant_types.h"
-#include "ant_log.h"
-#undef LOG_TAG
-#define LOG_TAG "antradio_rx"
-
-#define ANT_POLL_TIMEOUT         ((int)30000)
-
-int readChannelMsg(ant_channel_info_t *pstChnlInfo)
-{
-   int iRet = -1;
-   ANT_U8 aucRxBuffer[ANT_HCI_MAX_MSG_SIZE];
-   int iRxLenRead;
-   int iMutexResult;
-   ANT_FUNC_START();
-
-   while (((iRxLenRead = read(pstChnlInfo->iFd, aucRxBuffer, sizeof(aucRxBuffer))) < 0)
-                   && errno == EAGAIN)
-      ;
-
-   if (iRxLenRead < 0) {
-      if (errno == ENODEV) {
-         ANT_ERROR("%s not enabled, exiting rx thread",
-               pstChnlInfo->pcDevicePath);
-         goto out;
-      } else if (errno == ENXIO) {
-         ANT_ERROR("%s there is no physical ANT device connected",
-               pstChnlInfo->pcDevicePath);
-         goto out;
-      } else {
-         ANT_ERROR("%s read thread exiting, unhandled error: %s",
-               pstChnlInfo->pcDevicePath, strerror(errno));
-         goto out;
-      }
-   } else {
-      ANT_SERIAL(aucRxBuffer, iRxLenRead, 'R');
-      if (aucRxBuffer[CHIP_B_HCI_DATA_OFFSET + ANT_MSG_ID_OFFSET] == ANT_MESG_FLOW_CONTROL) {
-         ANT_DEBUG_V("getting stFlowControlLock in %s", __FUNCTION__);
-         iMutexResult = pthread_mutex_lock(pstChnlInfo->pstFlowControlLock);
-         if (iMutexResult) {
-            ANT_ERROR("failed to lock flow control mutex during response: %s", strerror(iMutexResult));
-            goto out;
-         }
-         ANT_DEBUG_V("got stFlowControlLock in %s", __FUNCTION__);
-
-         pstChnlInfo->ucFlowControlResp = aucRxBuffer[CHIP_B_HCI_DATA_OFFSET + ANT_MSG_DATA_OFFSET];
-
-         ANT_DEBUG_V("releasing stFlowControlLock in %s", __FUNCTION__);
-         pthread_mutex_unlock(pstChnlInfo->pstFlowControlLock);
-         ANT_DEBUG_V("released stFlowControlLock in %s", __FUNCTION__);
-         pthread_cond_signal(pstChnlInfo->pstFlowControlCond);
-      } else {
-         if (pstChnlInfo->fnRxCallback != NULL) {
-            pstChnlInfo->fnRxCallback(aucRxBuffer[CHIP_B_HCI_SIZE_OFFSET], &aucRxBuffer[CHIP_B_HCI_DATA_OFFSET]);
-         } else {
-            ANT_WARN("%s rx callback is null", pstChnlInfo->pcDevicePath);
-         }
-      }
-      iRet = 0;
-   }
-out:
-   ANT_FUNC_END();
-   return iRet;
-}
-
-void *fnRxThread(void *ant_rx_thread_info)
-{
-   int iMutexLockResult;
-   int iPollRet;
-   ant_rx_thread_info_t *stRxThreadInfo;
-   struct pollfd astPollFd[NUM_ANT_CHANNELS];
-   enum ant_channel_type eChannel;
-   ANT_FUNC_START();
-
-   stRxThreadInfo = (ant_rx_thread_info_t *)ant_rx_thread_info;
-   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
-      astPollFd[eChannel].fd = stRxThreadInfo->astChannels[eChannel].iFd;
-      astPollFd[eChannel].events = POLLIN | POLLRDNORM;
-   }
-
-   while (stRxThreadInfo->ucRunThread) {
-      iPollRet = poll(astPollFd, NUM_ANT_CHANNELS, ANT_POLL_TIMEOUT);
-      if (!iPollRet) {
-         ANT_DEBUG_V("poll timed out, checking exit cond");
-      } else if (iPollRet < 0) {
-         ANT_ERROR("read thread exiting, unhandled error: %s", strerror(errno));
-      } else {
-         for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
-            if (astPollFd[eChannel].revents & (POLLERR | POLLPRI | POLLRDHUP)) {
-               ANT_ERROR("poll error from %s. exiting rx thread",
-                            stRxThreadInfo->astChannels[eChannel].pcDevicePath);
-               /* Chip was reset or other error, only way to recover is to
-                * close and open ANT chardev */
-               stRxThreadInfo->ucChipResetting = 1;
-               if (g_fnStateCallback)
-                  g_fnStateCallback(RADIO_STATUS_RESETTING);
-               goto reset;
-
-            } else if (astPollFd[eChannel].revents & (POLLIN | POLLRDNORM)) {
-               ANT_DEBUG_D("data on %s. reading it",
-                            stRxThreadInfo->astChannels[eChannel].pcDevicePath);
-               if (readChannelMsg(&stRxThreadInfo->astChannels[eChannel]) < 0)
-                  goto out;
-            } else if (astPollFd[eChannel].revents) {
-               ANT_DEBUG_W("unhandled poll result %#x from %s",
-                            astPollFd[eChannel].revents,
-                            stRxThreadInfo->astChannels[eChannel].pcDevicePath);
-            }
-         }
-      }
-   }
-out:
-   stRxThreadInfo->ucRunThread = 0;
-   /* Try to get stEnabledStatusLock.
-    * if you get it then noone is enabling or disabling
-    * if you can't get it assume something made you exit */
-   ANT_DEBUG_V("try getting stEnabledStatusLock in %s", __FUNCTION__);
-   iMutexLockResult = pthread_mutex_trylock(stRxThreadInfo->pstEnabledStatusLock);
-   if (!iMutexLockResult) {
-      ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
-      ANT_WARN("rx thread has unexpectedly crashed, cleaning up");
-      stRxThreadInfo->stRxThread = 0; /* spoof our handle as closed so we don't
-                                       * try to join ourselves in disable */
-
-      if (g_fnStateCallback)
-         g_fnStateCallback(RADIO_STATUS_DISABLING);
-
-      ant_do_disable();
-
-      if (g_fnStateCallback)
-         g_fnStateCallback(ant_radio_enabled_status());
-
-      ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
-      pthread_mutex_unlock(stRxThreadInfo->pstEnabledStatusLock);
-      ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
-   } else if (iMutexLockResult != EBUSY) {
-      ANT_ERROR("rx thread closing code, trylock on state lock failed: %s",
-            strerror(iMutexLockResult));
-   } else {
-      ANT_DEBUG_V("stEnabledStatusLock busy");
-   }
-   ANT_FUNC_END();
-#ifdef ANDROID
-   return NULL;
-#endif
-
-reset:
-   stRxThreadInfo->ucRunThread = 0;
-   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
-   iMutexLockResult = pthread_mutex_lock(stRxThreadInfo->pstEnabledStatusLock);
-   if (iMutexLockResult < 0) {
-      ANT_ERROR("chip was reset, getting state mutex failed: %s",
-            strerror(iMutexLockResult));
-      stRxThreadInfo->stRxThread = 0;
-   } else {
-      ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
-      stRxThreadInfo->stRxThread = 0; /* spoof our handle as closed so we don't
-                                       * try to join ourselves in disable */
-      ant_do_disable();
-
-      if (ant_do_enable()) { /* failed */
-         if (g_fnStateCallback)
-            g_fnStateCallback(RADIO_STATUS_DISABLED);
-      } else { /* success */
-         if (g_fnStateCallback)
-            g_fnStateCallback(RADIO_STATUS_RESET);
-      }
-      ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
-      pthread_mutex_unlock(stRxThreadInfo->pstEnabledStatusLock);
-      ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
-   }
-   stRxThreadInfo->ucChipResetting = 0;
-   ANT_FUNC_END();
-#ifdef ANDROID
-   return NULL;
-#endif
-}
-
diff --git a/src/chip-B/inc/ant_native_chardev.h b/src/chip-B/inc/ant_native_chardev.h
deleted file mode 100644
index 1173f08..0000000
--- a/src/chip-B/inc/ant_native_chardev.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * ANT Stack
- *
- * Copyright 2011 Dynastream Innovations
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*******************************************************************************\
-*
-*   FILE NAME:      ant_native_chardev.h
-*
-*   BRIEF:
-*       This file defines constants for the char dev implementation
-*
-*
-\*******************************************************************************/
-
-#ifndef __ANT_NATIVE_CHARDEV_H
-#define __ANT_NATIVE_CHARDEV_H
-
-#define ANT_COMMANDS_DEVICE_NAME             "/dev/antradio_cmd"
-#define ANT_DATA_DEVICE_NAME                 "/dev/antradio_data"
-
-#define CHIP_B_HCI_SIZE_OFFSET               0
-#define CHIP_B_HCI_DATA_OFFSET               1
-#define CHIP_B_HCI_HEADER_SIZE               1
-
-#define ANT_MESG_FLOW_CONTROL                ((ANT_U8)0xC9)
-#define FLOW_GO                              ((ANT_U8)0x00)
-#define FLOW_STOP                            ((ANT_U8)0x80)
-#define CHIP_B_FLOW_GO_WAIT_TIMEOUT_SEC      10
-
-int ant_do_enable(void);
-void ant_do_disable(void);
-extern ANTNativeANTStateCb g_fnStateCallback;
-
-#endif /* ifndef __ANT_NATIVE_CHARDEV_H */
-
diff --git a/src/chip-C/Android.mk b/src/chip-C/Android.mk
deleted file mode 100644
index 1f75535..0000000
--- a/src/chip-C/Android.mk
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# Copyright (C) 2011 Dynastream Innovations
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"chip-C")
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_CFLAGS := -g -c -W -Wall -O2
-
-LOCAL_C_INCLUDES := \
-    $(LOCAL_PATH)/../common/inc \
-    $(LOCAL_PATH)/inc \
-
-LOCAL_SRC_FILES:= \
-    ../../JAntNative.cpp \
-    ../common/ant_utils.c \
-    ant_native_chardev.c \
-    ant_rx_chardev.c \
-
-#JNI
-LOCAL_C_INCLUDE += $(JNI_H_INCLUDE)
-
-LOCAL_SHARED_LIBRARIES += \
-    libnativehelper
-
-# logging
-LOCAL_SHARED_LIBRARIES += \
-    libcutils
-
-LOCAL_MODULE_TAGS := optional
-LOCAL_PRELINK_MODULE := false
-LOCAL_MODULE := libantradio
-
-include $(BUILD_SHARED_LIBRARY)
-
-endif # BOARD_ANT_WIRELESS_DEVICE = "chip-C"
diff --git a/src/chip-C/ant_native_chardev.c b/src/chip-C/ant_native_chardev.c
deleted file mode 100644
index fe10382..0000000
--- a/src/chip-C/ant_native_chardev.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- * ANT Stack
- *
- * Copyright 2011 Dynastream Innovations
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*******************************************************************************\
-*
-*   FILE NAME:     ant_native_chardev.c
-*
-*   BRIEF:
-*      This file provides the character device implementation of ant_native.h
-*
-*
-\*******************************************************************************/
-
-#include <errno.h>
-#include <fcntl.h> /* for open() */
-#include <linux/ioctl.h>
-#include <pthread.h>
-
-#include "ant_native.h"
-#include "ant_types.h"
-#include "ant_log.h"
-#include "ant_version.h"
-
-#include "ant_native_chardev.h"
-#include "ant_rx_chardev.h"
-
-#define MESG_BROADCAST_DATA_ID               ((ANT_U8)0x4E)
-#define MESG_ACKNOWLEDGED_DATA_ID            ((ANT_U8)0x4F)
-#define MESG_BURST_DATA_ID                   ((ANT_U8)0x50)
-#define MESG_EXT_BROADCAST_DATA_ID           ((ANT_U8)0x5D)
-#define MESG_EXT_ACKNOWLEDGED_DATA_ID        ((ANT_U8)0x5E)
-#define MESG_EXT_BURST_DATA_ID               ((ANT_U8)0x5F)
-
-static ant_rx_thread_info_t stRxThreadInfo;
-static pthread_mutex_t stEnabledStatusLock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t stFlowControlLock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t stFlowControlCond = PTHREAD_COND_INITIALIZER;
-ANTNativeANTStateCb g_fnStateCallback;
-
-static void ant_channel_init(ant_channel_info_t *pstChnlInfo, const char *pcCharDevName)
-{
-   pstChnlInfo->pcDevicePath = pcCharDevName;
-   pstChnlInfo->iFd = -1;
-   pstChnlInfo->fnRxCallback = NULL;
-   pstChnlInfo->ucFlowControlResp = FLOW_GO;
-   pstChnlInfo->pstFlowControlCond = &stFlowControlCond;
-   pstChnlInfo->pstFlowControlLock = &stFlowControlLock;
-}
-
-ANTStatus ant_init(void)
-{
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   ANT_FUNC_START();
-   stRxThreadInfo.stRxThread = 0;
-   stRxThreadInfo.ucRunThread = 0;
-   stRxThreadInfo.ucChipResetting = 0;
-   stRxThreadInfo.pstEnabledStatusLock = &stEnabledStatusLock;
-   g_fnStateCallback = 0;
-   ant_channel_init(&stRxThreadInfo.astChannels[COMMAND_CHANNEL], ANT_COMMANDS_DEVICE_NAME);
-   ant_channel_init(&stRxThreadInfo.astChannels[DATA_CHANNEL], ANT_DATA_DEVICE_NAME);
-   uiRet = ANT_STATUS_SUCCESS;
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-ANTStatus ant_deinit(void)
-{
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   ANT_FUNC_START();
-   uiRet = ANT_STATUS_SUCCESS;
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-ANTStatus set_ant_rx_callback(ANTNativeANTEventCb rx_callback_func)
-{
-   ANT_FUNC_START();
-   stRxThreadInfo.astChannels[COMMAND_CHANNEL].fnRxCallback = rx_callback_func;
-   stRxThreadInfo.astChannels[DATA_CHANNEL].fnRxCallback = rx_callback_func;
-   ANT_FUNC_END();
-   return ANT_STATUS_SUCCESS;
-}
-
-ANTStatus set_ant_state_callback(ANTNativeANTStateCb state_callback_func)
-{
-   ANT_FUNC_START();
-   g_fnStateCallback = state_callback_func;
-   ANT_FUNC_END();
-   return ANT_STATUS_SUCCESS;
-}
-
-ANTStatus ant_tx_message(ANT_U8 ucLen, ANT_U8 *pucMesg)
-{
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   int iMutexResult;
-   int iResult;
-   struct timespec stTimeout;
-   int iCondWaitResult;
-   ANT_U8 txBuffer[ANT_HCI_MAX_MSG_SIZE];
-   ANT_FUNC_START();
-   if (ant_radio_enabled_status() != RADIO_STATUS_ENABLED) {
-      uiRet = ANT_STATUS_FAILED_BT_NOT_INITIALIZED;
-      goto out;
-   }
-   txBuffer[CHIP_C_HCI_SIZE_OFFSET] = ucLen;
-   memcpy(txBuffer + CHIP_C_HCI_HEADER_SIZE, pucMesg, ucLen);
-   ANT_SERIAL(txBuffer, ucLen + CHIP_C_HCI_HEADER_SIZE, 'T');
-   switch (txBuffer[CHIP_C_HCI_DATA_OFFSET + ANT_MSG_ID_OFFSET]) {
-   case MESG_BROADCAST_DATA_ID:
-   case MESG_ACKNOWLEDGED_DATA_ID:
-   case MESG_BURST_DATA_ID:
-   case MESG_EXT_BROADCAST_DATA_ID:
-   case MESG_EXT_ACKNOWLEDGED_DATA_ID:
-   case MESG_EXT_BURST_DATA_ID:
-      ANT_DEBUG_V("getting stFlowControlLock in %s", __FUNCTION__);
-      iMutexResult = pthread_mutex_lock(&stFlowControlLock);
-      if (iMutexResult) {
-         ANT_ERROR("failed to lock flow control mutex during tx: %s", strerror(iMutexResult));
-         goto out;
-      }
-      ANT_DEBUG_V("got stFlowControlLock in %s", __FUNCTION__);
-
-      stRxThreadInfo.astChannels[COMMAND_CHANNEL].ucFlowControlResp = FLOW_STOP;
-      iResult = write(stRxThreadInfo.astChannels[DATA_CHANNEL].iFd, txBuffer, ucLen + CHIP_C_HCI_HEADER_SIZE);
-      if (iResult < 0) {
-         ANT_ERROR("failed to write data message to device: %s", strerror(errno));
-      } else if (iResult != ucLen + CHIP_C_HCI_HEADER_SIZE) {
-         ANT_ERROR("bytes written and message size dont match up");
-      } else {
-         stTimeout.tv_sec = time(0) + CHIP_C_FLOW_GO_WAIT_TIMEOUT_SEC;
-         stTimeout.tv_nsec = 0;
-
-         while (stRxThreadInfo.astChannels[COMMAND_CHANNEL].ucFlowControlResp != FLOW_GO) {
-            iCondWaitResult = pthread_cond_timedwait(&stFlowControlCond, &stFlowControlLock, &stTimeout);
-            if (iCondWaitResult) {
-               ANT_ERROR("failed to wait for flow control response: %s", strerror(iCondWaitResult));
-               if (iCondWaitResult == ETIMEDOUT)
-                  uiRet = ANT_STATUS_HARDWARE_ERR;
-               goto wait_error;
-            }
-         }
-         uiRet = ANT_STATUS_SUCCESS;
-      }
-wait_error:
-      ANT_DEBUG_V("releasing stFlowControlLock in %s", __FUNCTION__);
-      pthread_mutex_unlock(&stFlowControlLock);
-      ANT_DEBUG_V("released stFlowControlLock in %s", __FUNCTION__);
-      break;
-   default:
-      iResult = write(stRxThreadInfo.astChannels[COMMAND_CHANNEL].iFd, txBuffer, ucLen + CHIP_C_HCI_HEADER_SIZE);
-      if (iResult < 0) {
-         ANT_ERROR("failed to write message to device: %s", strerror(errno));
-      }  else if (iResult != ucLen + CHIP_C_HCI_HEADER_SIZE) {
-         ANT_ERROR("bytes written and message size dont match up");
-      } else {
-         uiRet = ANT_STATUS_SUCCESS;
-      }
-   }
-out:
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-ANTStatus ant_radio_hard_reset(void)
-{
-   ANTStatus result_status = ANT_STATUS_NOT_SUPPORTED;
-   ANT_FUNC_START();
-   ANT_FUNC_END();
-   return result_status;
-}
-
-static void ant_disable_channel(ant_channel_info_t *pstChnlInfo)
-{
-   ANT_FUNC_START();
-   if (!pstChnlInfo) {
-      ANT_ERROR("null channel info passed to channel disable function");
-      goto out;
-   }
-   if (pstChnlInfo->iFd != -1) {
-      if (close(pstChnlInfo->iFd) < 0) {
-         ANT_ERROR("failed to close channel %s(%#x): %s", pstChnlInfo->pcDevicePath, pstChnlInfo->iFd, strerror(errno));
-      }
-      pstChnlInfo->iFd = -1; //TODO can this overwrite a still valid fd?
-   } else {
-      ANT_DEBUG_D("%s file is already closed", pstChnlInfo->pcDevicePath);
-   }
-out:
-   ANT_FUNC_END();
-}
-
-static int ant_enable_channel(ant_channel_info_t *pstChnlInfo)
-{
-   int iRet = -1;
-   ANT_FUNC_START();
-   if (!pstChnlInfo) {
-      ANT_ERROR("null channel info passed to channel enable function");
-      errno = EINVAL;
-      goto out;
-   }
-   if (pstChnlInfo->iFd == -1) {
-      pstChnlInfo->iFd = open(pstChnlInfo->pcDevicePath, O_RDWR);
-      if (pstChnlInfo->iFd < 0) {
-         ANT_ERROR("failed to open dev %s: %s", pstChnlInfo->pcDevicePath, strerror(errno));
-         goto out;
-      }
-   } else {
-      ANT_DEBUG_D("%s is already enabled", pstChnlInfo->pcDevicePath);
-   }
-   iRet = 0;
-out:
-   ANT_FUNC_END();
-   return iRet;
-}
-
-int ant_do_enable(void)
-{
-   int iRet = -1;
-   enum ant_channel_type eChannel;
-   ANT_FUNC_START();
-
-   stRxThreadInfo.ucRunThread = 1;
-   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
-      if (ant_enable_channel(&stRxThreadInfo.astChannels[eChannel]) < 0) {
-         ANT_ERROR("failed to enable channel %s: %s",
-                         stRxThreadInfo.astChannels[eChannel].pcDevicePath,
-                         strerror(errno));
-         goto out;
-      }
-   }
-   if (stRxThreadInfo.stRxThread == 0) {
-      if (pthread_create(&stRxThreadInfo.stRxThread, NULL, fnRxThread, &stRxThreadInfo) < 0) {
-         ANT_ERROR("failed to start rx thread: %s", strerror(errno));
-         goto out;
-      }
-   } else {
-      ANT_DEBUG_D("rx thread is already running");
-   }
-   if (!stRxThreadInfo.ucRunThread) {
-      ANT_ERROR("rx thread crashed during init");
-      goto out;
-   }
-   iRet = 0;
-out:
-   ANT_FUNC_END();
-   return iRet;
-}
-
-void ant_do_disable(void)
-{
-   enum ant_channel_type eChannel;
-   ANT_FUNC_START();
-   stRxThreadInfo.ucRunThread = 0;
-   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++)
-      ant_disable_channel(&stRxThreadInfo.astChannels[eChannel]);
-   if (stRxThreadInfo.stRxThread != 0) {
-      if (pthread_join(stRxThreadInfo.stRxThread, NULL) < 0) {
-         ANT_ERROR("failed to join rx thread: %s", strerror(errno));
-      }
-      stRxThreadInfo.stRxThread = 0;
-   } else {
-      ANT_DEBUG_D("rx thread is not running");
-   }
-   ANT_FUNC_END();
-}
-
-ANTStatus ant_enable_radio(void)
-{
-   int iLockResult;
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   ANT_FUNC_START();
-   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
-   iLockResult = pthread_mutex_lock(&stEnabledStatusLock);
-   if(iLockResult) {
-      ANT_ERROR("enable failed to get state lock: %s", strerror(iLockResult));
-      goto out;
-   }
-   ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
-
-   if (g_fnStateCallback)
-      g_fnStateCallback(RADIO_STATUS_ENABLING);
-
-   if (ant_do_enable() < 0) {
-      ANT_ERROR("ant enable failed: %s", strerror(errno));
-
-      ant_do_disable();
-
-      if (g_fnStateCallback)
-         g_fnStateCallback(ant_radio_enabled_status());
-   } else {
-      if (g_fnStateCallback)
-         g_fnStateCallback(RADIO_STATUS_ENABLED);
-      uiRet = ANT_STATUS_SUCCESS;
-   }
-
-   ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
-   pthread_mutex_unlock(&stEnabledStatusLock);
-   ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
-out:
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-ANTStatus ant_disable_radio(void)
-{
-   int iLockResult;
-   ANTStatus uiRet = ANT_STATUS_FAILED;
-   ANT_FUNC_START();
-   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
-   iLockResult = pthread_mutex_lock(&stEnabledStatusLock);
-   if(iLockResult) {
-      ANT_ERROR("disable failed to get state lock: %s", strerror(iLockResult));
-      goto out;
-   }
-   ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
-
-   if (g_fnStateCallback)
-      g_fnStateCallback(RADIO_STATUS_DISABLING);
-
-   ant_do_disable();
-
-   if (g_fnStateCallback)
-      g_fnStateCallback(ant_radio_enabled_status());
-   uiRet = ANT_STATUS_SUCCESS;
-
-   ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
-   pthread_mutex_unlock(&stEnabledStatusLock);
-   ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
-out:
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-ANTRadioEnabledStatus ant_radio_enabled_status(void)
-{
-   enum ant_channel_type eChannel;
-   int iOpenFiles = 0;
-   int iOpenThread;
-   ANTRadioEnabledStatus uiRet = RADIO_STATUS_UNKNOWN;
-   ANT_FUNC_START();
-   if (stRxThreadInfo.ucChipResetting) {
-      uiRet = RADIO_STATUS_RESETTING;
-      goto out;
-   }
-   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++)
-      if (stRxThreadInfo.astChannels[eChannel].iFd != -1)
-         iOpenFiles++;
-   iOpenThread = (stRxThreadInfo.stRxThread) ? 1 : 0;
-
-   if (!stRxThreadInfo.ucRunThread) {
-      if (iOpenFiles || iOpenThread) {
-         uiRet = RADIO_STATUS_DISABLING;
-      } else {
-         uiRet = RADIO_STATUS_DISABLED;
-      }
-   } else {
-      if ((iOpenFiles == NUM_ANT_CHANNELS) && iOpenThread) {
-         uiRet = RADIO_STATUS_ENABLED;
-      } else if (!iOpenFiles && iOpenThread) {
-         uiRet = RADIO_STATUS_UNKNOWN;
-      } else {
-         uiRet = RADIO_STATUS_ENABLING;
-      }
-   }
-out:
-   ANT_DEBUG_D("get radio enabled status returned %d", uiRet);
-   ANT_FUNC_END();
-   return uiRet;
-}
-
-const char *ant_get_lib_version()
-{
-   return "libantradio.so: CHIP_C TTY Transport. Version "
-      LIBANT_STACK_MAJOR"."LIBANT_STACK_MINOR"."LIBANT_STACK_INCRE;
-}
-
diff --git a/src/chip-C/ant_rx_chardev.c b/src/chip-C/ant_rx_chardev.c
deleted file mode 100644
index 2c0c6bd..0000000
--- a/src/chip-C/ant_rx_chardev.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * ANT Stack
- *
- * Copyright 2011 Dynastream Innovations
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*******************************************************************************\
-*
-*   FILE NAME:     ant_rx_chardev.c
-*
-*   BRIEF:
-*      This file provides the rx function which will loop reading ANT messages
-*        until told to exit.
-*
-*
-\*******************************************************************************/
-
-#include <errno.h>
-#include <poll.h>
-#include <pthread.h>
-
-#include "ant_rx_chardev.h"
-#include "ant_native_chardev.h"
-
-#include "ant_native.h"
-#include "ant_types.h"
-#include "ant_log.h"
-#undef LOG_TAG
-#define LOG_TAG "antradio_rx"
-
-#define ANT_POLL_TIMEOUT         ((int)30000)
-
-int readChannelMsg(ant_channel_info_t *pstChnlInfo)
-{
-   int iRet = -1;
-   ANT_U8 aucRxBuffer[ANT_HCI_MAX_MSG_SIZE];
-   int iRxLenRead;
-   int iMutexResult;
-   ANT_FUNC_START();
-
-   while (((iRxLenRead = read(pstChnlInfo->iFd, aucRxBuffer, sizeof(aucRxBuffer))) < 0)
-                   && errno == EAGAIN)
-      ;
-
-   if (iRxLenRead < 0) {
-      if (errno == ENODEV) {
-         ANT_ERROR("%s not enabled, exiting rx thread",
-               pstChnlInfo->pcDevicePath);
-         goto out;
-      } else if (errno == ENXIO) {
-         ANT_ERROR("%s there is no physical ANT device connected",
-               pstChnlInfo->pcDevicePath);
-         goto out;
-      } else {
-         ANT_ERROR("%s read thread exiting, unhandled error: %s",
-               pstChnlInfo->pcDevicePath, strerror(errno));
-         goto out;
-      }
-   } else {
-      ANT_SERIAL(aucRxBuffer, iRxLenRead, 'R');
-      if (aucRxBuffer[CHIP_C_HCI_DATA_OFFSET + ANT_MSG_ID_OFFSET] == ANT_MESG_FLOW_CONTROL) {
-         ANT_DEBUG_V("getting stFlowControlLock in %s", __FUNCTION__);
-         iMutexResult = pthread_mutex_lock(pstChnlInfo->pstFlowControlLock);
-         if (iMutexResult) {
-            ANT_ERROR("failed to lock flow control mutex during response: %s", strerror(iMutexResult));
-            goto out;
-         }
-         ANT_DEBUG_V("got stFlowControlLock in %s", __FUNCTION__);
-
-         pstChnlInfo->ucFlowControlResp = aucRxBuffer[CHIP_C_HCI_DATA_OFFSET + ANT_MSG_DATA_OFFSET];
-
-         ANT_DEBUG_V("releasing stFlowControlLock in %s", __FUNCTION__);
-         pthread_mutex_unlock(pstChnlInfo->pstFlowControlLock);
-         ANT_DEBUG_V("released stFlowControlLock in %s", __FUNCTION__);
-         pthread_cond_signal(pstChnlInfo->pstFlowControlCond);
-      } else {
-         if (pstChnlInfo->fnRxCallback != NULL) {
-            pstChnlInfo->fnRxCallback(aucRxBuffer[CHIP_C_HCI_SIZE_OFFSET], &aucRxBuffer[CHIP_C_HCI_DATA_OFFSET]);
-         } else {
-            ANT_WARN("%s rx callback is null", pstChnlInfo->pcDevicePath);
-         }
-      }
-      iRet = 0;
-   }
-out:
-   ANT_FUNC_END();
-   return iRet;
-}
-
-void *fnRxThread(void *ant_rx_thread_info)
-{
-   int iMutexLockResult;
-   int iPollRet;
-   ant_rx_thread_info_t *stRxThreadInfo;
-   struct pollfd astPollFd[NUM_ANT_CHANNELS];
-   enum ant_channel_type eChannel;
-   ANT_FUNC_START();
-
-   stRxThreadInfo = (ant_rx_thread_info_t *)ant_rx_thread_info;
-   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
-      astPollFd[eChannel].fd = stRxThreadInfo->astChannels[eChannel].iFd;
-      astPollFd[eChannel].events = POLLIN | POLLRDNORM;
-   }
-
-   while (stRxThreadInfo->ucRunThread) {
-      iPollRet = poll(astPollFd, NUM_ANT_CHANNELS, ANT_POLL_TIMEOUT);
-      if (!iPollRet) {
-         ANT_DEBUG_V("poll timed out, checking exit cond");
-      } else if (iPollRet < 0) {
-         ANT_ERROR("read thread exiting, unhandled error: %s", strerror(errno));
-      } else {
-         for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
-            if (astPollFd[eChannel].revents & (POLLERR | POLLPRI | POLLRDHUP)) {
-               ANT_ERROR("poll error from %s. exiting rx thread",
-                            stRxThreadInfo->astChannels[eChannel].pcDevicePath);
-               /* Chip was reset or other error, only way to recover is to
-                * close and open ANT chardev */
-               stRxThreadInfo->ucChipResetting = 1;
-               if (g_fnStateCallback)
-                  g_fnStateCallback(RADIO_STATUS_RESETTING);
-               goto reset;
-
-            } else if (astPollFd[eChannel].revents & (POLLIN | POLLRDNORM)) {
-               ANT_DEBUG_D("data on %s. reading it",
-                            stRxThreadInfo->astChannels[eChannel].pcDevicePath);
-               if (readChannelMsg(&stRxThreadInfo->astChannels[eChannel]) < 0)
-                  goto out;
-            } else if (astPollFd[eChannel].revents) {
-               ANT_DEBUG_W("unhandled poll result %#x from %s",
-                            astPollFd[eChannel].revents,
-                            stRxThreadInfo->astChannels[eChannel].pcDevicePath);
-            }
-         }
-      }
-   }
-out:
-   stRxThreadInfo->ucRunThread = 0;
-   /* Try to get stEnabledStatusLock.
-    * if you get it then noone is enabling or disabling
-    * if you can't get it assume something made you exit */
-   ANT_DEBUG_V("try getting stEnabledStatusLock in %s", __FUNCTION__);
-   iMutexLockResult = pthread_mutex_trylock(stRxThreadInfo->pstEnabledStatusLock);
-   if (!iMutexLockResult) {
-      ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
-      ANT_WARN("rx thread has unexpectedly crashed, cleaning up");
-      stRxThreadInfo->stRxThread = 0; /* spoof our handle as closed so we don't
-                                       * try to join ourselves in disable */
-
-      if (g_fnStateCallback)
-         g_fnStateCallback(RADIO_STATUS_DISABLING);
-
-      ant_do_disable();
-
-      if (g_fnStateCallback)
-         g_fnStateCallback(ant_radio_enabled_status());
-
-      ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
-      pthread_mutex_unlock(stRxThreadInfo->pstEnabledStatusLock);
-      ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
-   } else if (iMutexLockResult != EBUSY) {
-      ANT_ERROR("rx thread closing code, trylock on state lock failed: %s",
-            strerror(iMutexLockResult));
-   } else {
-      ANT_DEBUG_V("stEnabledStatusLock busy");
-   }
-   ANT_FUNC_END();
-#ifdef ANDROID
-   return NULL;
-#endif
-
-reset:
-   stRxThreadInfo->ucRunThread = 0;
-   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
-   iMutexLockResult = pthread_mutex_lock(stRxThreadInfo->pstEnabledStatusLock);
-   if (iMutexLockResult < 0) {
-      ANT_ERROR("chip was reset, getting state mutex failed: %s",
-            strerror(iMutexLockResult));
-      stRxThreadInfo->stRxThread = 0;
-   } else {
-      ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
-      stRxThreadInfo->stRxThread = 0; /* spoof our handle as closed so we don't
-                                       * try to join ourselves in disable */
-      ant_do_disable();
-
-      if (ant_do_enable()) { /* failed */
-         if (g_fnStateCallback)
-            g_fnStateCallback(RADIO_STATUS_DISABLED);
-      } else { /* success */
-         if (g_fnStateCallback)
-            g_fnStateCallback(RADIO_STATUS_RESET);
-      }
-      ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
-      pthread_mutex_unlock(stRxThreadInfo->pstEnabledStatusLock);
-      ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
-   }
-   stRxThreadInfo->ucChipResetting = 0;
-   ANT_FUNC_END();
-#ifdef ANDROID
-   return NULL;
-#endif
-}
-
diff --git a/src/chip-C/inc/ant_native_chardev.h b/src/chip-C/inc/ant_native_chardev.h
deleted file mode 100644
index c72ac0e..0000000
--- a/src/chip-C/inc/ant_native_chardev.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * ANT Stack
- *
- * Copyright 2011 Dynastream Innovations
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*******************************************************************************\
-*
-*   FILE NAME:      ant_native_chardev.h
-*
-*   BRIEF:
-*       This file defines constants for the char dev implementation
-*
-*
-\*******************************************************************************/
-
-#ifndef __ANT_NATIVE_CHARDEV_H
-#define __ANT_NATIVE_CHARDEV_H
-
-#define ANT_COMMANDS_DEVICE_NAME             "/dev/smd5"
-#define ANT_DATA_DEVICE_NAME                 "/dev/smd6"
-
-#define CHIP_C_HCI_SIZE_OFFSET               0
-#define CHIP_C_HCI_DATA_OFFSET               1
-#define CHIP_C_HCI_HEADER_SIZE               1
-
-#define ANT_MESG_FLOW_CONTROL                ((ANT_U8)0xC9)
-#define FLOW_GO                              ((ANT_U8)0x00)
-#define FLOW_STOP                            ((ANT_U8)0x80)
-#define CHIP_C_FLOW_GO_WAIT_TIMEOUT_SEC      10
-
-int ant_do_enable(void);
-void ant_do_disable(void);
-extern ANTNativeANTStateCb g_fnStateCallback;
-
-#endif /* ifndef __ANT_NATIVE_CHARDEV_H */
-
diff --git a/src/chip-C/inc/ant_rx_chardev.h b/src/chip-C/inc/ant_rx_chardev.h
deleted file mode 100644
index 6721222..0000000
--- a/src/chip-C/inc/ant_rx_chardev.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * ANT Stack
- *
- * Copyright 2011 Dynastream Innovations
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*******************************************************************************\
-*
-*   FILE NAME:      ant_rx_chardev.h
-*
-*   BRIEF:
-*       This file defines public members in ant_rx_chardev.c
-*
-*
-\*******************************************************************************/
-
-#ifndef __ANT_RX_NATIVE_H
-#define __ANT_RX_NATIVE_H
-
-#include "ant_native.h"
-
-/* This struct defines the info passed to an rx thread */
-typedef struct {
-   /* Device path */
-   const char *pcDevicePath;
-   /* File descriptor to read from */
-   int iFd;
-   /* Callback to call with ANT packet */
-   ANTNativeANTEventCb fnRxCallback;
-   /* Flow control response if channel supports it */
-   ANT_U8 ucFlowControlResp;
-   /* Handle to flow control condition */
-   pthread_cond_t *pstFlowControlCond;
-   /* Handle to flow control mutex */
-   pthread_mutex_t *pstFlowControlLock;
-} ant_channel_info_t;
-
-enum ant_channel_type {
-   DATA_CHANNEL,
-   COMMAND_CHANNEL,
-   NUM_ANT_CHANNELS
-};
-
-typedef struct {
-   /* Thread handle */
-   pthread_t stRxThread;
-   /* Exit condition */
-   ANT_U8 ucRunThread;
-   /* Set state as resetting override */
-   ANT_U8 ucChipResetting;
-   /* Handle to state change lock for crash cleanup */
-   pthread_mutex_t *pstEnabledStatusLock;
-   /* ANT channels */
-   ant_channel_info_t astChannels[NUM_ANT_CHANNELS];
-} ant_rx_thread_info_t;
-
-/* This is the rx thread function. It loops reading ANT packets until told to
- * exit */
-void *fnRxThread(void *ant_rx_thread_info);
-
-#endif /* ifndef __ANT_RX_NATIVE_H */
-
diff --git a/JAntNative.cpp b/src/common/JAntNative.cpp
similarity index 100%
rename from JAntNative.cpp
rename to src/common/JAntNative.cpp
diff --git a/src/common/inc/ant_log.h b/src/common/inc/ant_log.h
index f2d09b5..bc45462 100644
--- a/src/common/inc/ant_log.h
+++ b/src/common/inc/ant_log.h
@@ -1,26 +1,26 @@
 /*
- * ANT Stack
- *
- * Copyright 2009 Dynastream Innovations
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and  
- * limitations under the License.
- */
+* ANT Stack
+*
+* Copyright 2009 Dynastream Innovations
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
 /******************************************************************************\
 *
-*   FILE NAME:      ANT_log.h
+* FILE NAME: ANT_log.h
 *
-*   BRIEF:          
-*		This file defines logging functions
+* BRIEF:
+* This file defines logging functions
 *
 *
 \******************************************************************************/
@@ -108,11 +108,11 @@
       #undef NDEBUG /* Define verbose logging for logcat if required */
    #endif
    #include <cutils/log.h>
-   #define OUTPUT_VERBOSE(...)         LOGV(__VA_ARGS__)
-   #define OUTPUT_DEBUG(...)           LOGD(__VA_ARGS__)
-   #define OUTPUT_INFO(...)            LOGI(__VA_ARGS__)
-   #define OUTPUT_WARNING(...)         LOGW(__VA_ARGS__)
-   #define OUTPUT_ERROR(...)           LOGE(__VA_ARGS__)
+   #define OUTPUT_VERBOSE(...)         ALOGV(__VA_ARGS__)
+   #define OUTPUT_DEBUG(...)           ALOGD(__VA_ARGS__)
+   #define OUTPUT_INFO(...)            ALOGI(__VA_ARGS__)
+   #define OUTPUT_WARNING(...)         ALOGW(__VA_ARGS__)
+   #define OUTPUT_ERROR(...)           ALOGE(__VA_ARGS__)
 #endif
 
 #define ANT_WARN(...)                  OUTPUT_WARNING(__VA_ARGS__)
diff --git a/src/common/inc/ant_native.h b/src/common/inc/ant_native.h
index eedec50..6fe106d 100644
--- a/src/common/inc/ant_native.h
+++ b/src/common/inc/ant_native.h
@@ -40,13 +40,6 @@
  * Constants
  *
  ******************************************************************************/
-#define ANT_NATIVE_MAX_PARMS_LEN              255
-#define ANT_NATIVE_MESSAGE_OVERHEAD_SIZE      2
-#define ANT_HCI_MAX_MSG_SIZE                  260
-
-#define ANT_MSG_SIZE_OFFSET     ((ANT_U8)0)
-#define ANT_MSG_ID_OFFSET       ((ANT_U8)1)
-#define ANT_MSG_DATA_OFFSET     ((ANT_U8)2)
 
 /*******************************************************************************
  *
diff --git a/src/common/inc/ant_version.h b/src/common/inc/ant_version.h
index bc1f239..8270723 100644
--- a/src/common/inc/ant_version.h
+++ b/src/common/inc/ant_version.h
@@ -19,8 +19,8 @@
 #ifndef __ANT_VERSION_H
 #define __ANT_VERSION_H
 
-#define LIBANT_STACK_MAJOR "0"
-#define LIBANT_STACK_MINOR "7"
+#define LIBANT_STACK_MAJOR "1"
+#define LIBANT_STACK_MINOR "3"
 #define LIBANT_STACK_INCRE "0"
 
 #endif // __ANT_VERSION_H
diff --git a/src/chip-B/Android.mk b/src/vfs/Android.mk
similarity index 63%
rename from src/chip-B/Android.mk
rename to src/vfs/Android.mk
index 5b030ff..969fa03 100644
--- a/src/chip-B/Android.mk
+++ b/src/vfs/Android.mk
@@ -14,37 +14,42 @@
 # limitations under the License.
 #
 
-ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"chip-B")
-
-LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
 LOCAL_CFLAGS := -g -c -W -Wall -O2
 
 LOCAL_C_INCLUDES := \
-    $(LOCAL_PATH)/../common/inc \
-    $(LOCAL_PATH)/inc \
+   $(LOCAL_PATH)/src/common/inc \
+   $(LOCAL_PATH)/$(ANT_DIR)/inc \
 
-LOCAL_SRC_FILES:= \
-    ../../JAntNative.cpp \
-    ../common/ant_utils.c \
-    ant_native_chardev.c \
-    ant_rx_chardev.c \
+ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"cg29xx")
+LOCAL_C_INCLUDES += \
+   $(ANT_DIR)/ste/cg29xx \
 
-#JNI
+else ifeq ($(BOARD_ANT_WIRELESS_DEVICE),"vfs-prerelease")
+LOCAL_C_INCLUDES += \
+   $(ANT_DIR)/prerelease \
+
+endif # BOARD_ANT_WIRELESS_DEVICE = "vfs-prerelease"
+
+LOCAL_SRC_FILES := \
+   $(COMMON_DIR)/JAntNative.cpp \
+   $(COMMON_DIR)/ant_utils.c \
+   $(ANT_DIR)/ant_native_chardev.c \
+   $(ANT_DIR)/ant_rx_chardev.c \
+
+# JNI
 LOCAL_C_INCLUDE += $(JNI_H_INCLUDE)
 
 LOCAL_SHARED_LIBRARIES += \
-    libnativehelper
+   libnativehelper \
 
 # logging
 LOCAL_SHARED_LIBRARIES += \
-    libcutils
+   libcutils \
 
 LOCAL_MODULE_TAGS := optional
 LOCAL_PRELINK_MODULE := false
 LOCAL_MODULE := libantradio
 
 include $(BUILD_SHARED_LIBRARY)
-
-endif # BOARD_ANT_WIRELESS_DEVICE = "chip-B"
diff --git a/src/vfs/ant_native_chardev.c b/src/vfs/ant_native_chardev.c
new file mode 100644
index 0000000..80ca0d1
--- /dev/null
+++ b/src/vfs/ant_native_chardev.c
@@ -0,0 +1,905 @@
+/*
+ * ANT Stack
+ *
+ * Copyright 2011 Dynastream Innovations
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/******************************************************************************\
+*
+*   FILE NAME:      ant_native_chardev.c
+*
+*   BRIEF:
+*      This file provides the VFS implementation of ant_native.h
+*      VFS could be Character Device, TTY, etc.
+*
+*
+\******************************************************************************/
+
+#include <errno.h>
+#include <fcntl.h> /* for open() */
+#include <linux/ioctl.h> /* For hard reset */
+#include <pthread.h>
+
+#include "ant_types.h"
+#include "ant_native.h"
+#include "ant_version.h"
+
+#include "antradio_power.h"
+#include "ant_rx_chardev.h"
+#include "ant_driver_defines.h"
+#include "ant_log.h"
+
+#if ANT_HCI_SIZE_SIZE > 1
+#include "ant_utils.h"  // Put HCI Size value across multiple bytes
+#endif
+
+#define MESG_BROADCAST_DATA_ID               ((ANT_U8)0x4E)
+#define MESG_ACKNOWLEDGED_DATA_ID            ((ANT_U8)0x4F)
+#define MESG_BURST_DATA_ID                   ((ANT_U8)0x50)
+#define MESG_EXT_BROADCAST_DATA_ID           ((ANT_U8)0x5D)
+#define MESG_EXT_ACKNOWLEDGED_DATA_ID        ((ANT_U8)0x5E)
+#define MESG_EXT_BURST_DATA_ID               ((ANT_U8)0x5F)
+#define MESG_ADV_BURST_DATA_ID               ((ANT_U8)0x72)
+
+static ant_rx_thread_info_t stRxThreadInfo;
+static pthread_mutex_t stEnabledStatusLock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t stFlowControlLock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t stFlowControlCond = PTHREAD_COND_INITIALIZER;
+ANTNativeANTStateCb g_fnStateCallback;
+
+static void ant_channel_init(ant_channel_info_t *pstChnlInfo, const char *pcCharDevName);
+
+////////////////////////////////////////////////////////////////////
+//  ant_init
+//
+//  Initialises the native environment.
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      ANT_STATUS_SUCCESS
+//
+//  Psuedocode:
+/*
+Set variables to defaults
+Initialise each supported path to chip
+RESULT = ANT_STATUS_SUCCESS
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_init(void)
+{
+   ANTStatus status = ANT_STATUS_FAILED;
+   ANT_FUNC_START();
+
+   stRxThreadInfo.stRxThread = 0;
+   stRxThreadInfo.ucRunThread = 0;
+   stRxThreadInfo.ucChipResetting = 0;
+   stRxThreadInfo.pstEnabledStatusLock = &stEnabledStatusLock;
+   g_fnStateCallback = 0;
+
+#ifdef ANT_DEVICE_NAME // Single transport path
+   ant_channel_init(&stRxThreadInfo.astChannels[SINGLE_CHANNEL], ANT_DEVICE_NAME);
+#else // Separate data/command paths
+   ant_channel_init(&stRxThreadInfo.astChannels[COMMAND_CHANNEL], ANT_COMMANDS_DEVICE_NAME);
+   ant_channel_init(&stRxThreadInfo.astChannels[DATA_CHANNEL], ANT_DATA_DEVICE_NAME);
+#endif // Separate data/command paths
+
+   status = ANT_STATUS_SUCCESS;
+
+   ANT_FUNC_END();
+   return status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  ant_deinit
+//
+//  Doesn't actually do anything.
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      ANT_STATUS_SUCCESS
+//
+//  Psuedocode:
+/*
+RESULT = SUCCESS
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_deinit(void)
+{
+   ANTStatus result_status = ANT_STATUS_FAILED;
+   ANT_FUNC_START();
+
+   result_status = ANT_STATUS_SUCCESS;
+
+   ANT_FUNC_END();
+   return result_status;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//  ant_enable_radio
+//
+//  Powers on the ANT part and initialises the transport to the chip.
+//  Changes occur in part implementing ant_enable() call
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failures:
+//          ANT_STATUS_TRANSPORT_INIT_ERR if could not enable
+//          ANT_STATUS_FAILED if failed to get mutex or init rx thread
+//
+//  Psuedocode:
+/*
+LOCK enable_LOCK
+    State callback: STATE = ENABLING
+    ant enable
+    IF ant_enable success
+        State callback: STATE = ENABLED
+        RESULT = SUCCESS
+    ELSE
+        ant disable
+        State callback: STATE = Current state
+        RESULT = FAILURE
+    ENDIF
+UNLOCK
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_enable_radio(void)
+{
+   int iLockResult;
+   ANTStatus result_status = ANT_STATUS_FAILED;
+   ANT_FUNC_START();
+
+   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
+   iLockResult = pthread_mutex_lock(&stEnabledStatusLock);
+   if(iLockResult) {
+      ANT_ERROR("enable failed to get state lock: %s", strerror(iLockResult));
+      goto out;
+   }
+   ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
+
+   if (g_fnStateCallback) {
+      g_fnStateCallback(RADIO_STATUS_ENABLING);
+   }
+
+   if (ant_enable() < 0) {
+      ANT_ERROR("ant enable failed: %s", strerror(errno));
+
+      ant_disable();
+
+      if (g_fnStateCallback) {
+         g_fnStateCallback(ant_radio_enabled_status());
+      }
+   } else {
+      if (g_fnStateCallback) {
+         g_fnStateCallback(RADIO_STATUS_ENABLED);
+      }
+
+      result_status = ANT_STATUS_SUCCESS;
+   }
+
+   ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
+   pthread_mutex_unlock(&stEnabledStatusLock);
+   ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
+
+out:
+   ANT_FUNC_END();
+   return result_status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  ant_radio_hard_reset
+//
+//  IF SUPPORTED triggers a hard reset of the chip providing ANT functionality.
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failures:
+//          ANT_STATUS_NOT_SUPPORTED if the chip can't hard reset
+//          ANT_STATUS_FAILED if failed to get mutex or enable
+//
+//  Psuedocode:
+/*
+IF Hard Reset not supported
+    RESULT = NOT SUPPORTED
+ELSE
+  LOCK enable_LOCK
+  IF Lock failed
+        RESULT = FAILED
+  ELSE
+    Set Flag Rx thread that chip is resetting
+    FOR each path to chip
+        Send Reset IOCTL to path
+    ENDFOR
+    ant disable
+    ant enable
+    IF ant_enable success
+        State callback: STATE = RESET
+        RESULT = SUCCESS
+    ELSE
+        State callback: STATE = DISABLED
+        RESULT = FAILURE
+    ENDIF
+    Clear Flag Rx thread that chip is resetting
+  UNLOCK
+ENDIF
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_radio_hard_reset(void)
+{
+   ANTStatus result_status = ANT_STATUS_NOT_SUPPORTED;
+   ANT_FUNC_START();
+
+#ifdef ANT_IOCTL_RESET
+   ant_channel_type eChannel;
+   int iLockResult;
+
+   result_status = ANT_STATUS_FAILED;
+
+   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
+   iLockResult = pthread_mutex_lock(&stEnabledStatusLock);
+   if(iLockResult) {
+      ANT_ERROR("enable failed to get state lock: %s", strerror(iLockResult));
+      goto out;
+   }
+   ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
+
+   stRxThreadInfo.ucChipResetting = 1;
+   if (g_fnStateCallback)
+      g_fnStateCallback(RADIO_STATUS_RESETTING);
+
+   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++)
+      ioctl(stRxThreadInfo.astChannels[eChannel].iFd, ANT_IOCTL_RESET); //TODO only one?
+
+   ant_disable();
+
+   if (ant_enable()) { /* failed */
+      if (g_fnStateCallback)
+         g_fnStateCallback(RADIO_STATUS_DISABLED);
+   } else { /* success */
+      if (g_fnStateCallback)
+         g_fnStateCallback(RADIO_STATUS_RESET);
+      result_status = ANT_STATUS_SUCCESS;
+   }
+   stRxThreadInfo.ucChipResetting = 0;
+
+   ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
+   pthread_mutex_unlock(&stEnabledStatusLock);
+   ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
+out:
+#endif // ANT_IOCTL_RESET
+
+   ANT_FUNC_END();
+   return result_status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  ant_disable_radio
+//
+//  Powers off the ANT part and closes the transport to the chip.
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failures:
+//          ANT_STATUS_FAILED if failed to get mutex
+//
+//  Psuedocode:
+/*
+LOCK enable_LOCK
+    State callback: STATE = DISABLING
+    ant disable
+    State callback: STATE = Current state
+    RESULT = SUCCESS
+UNLOCK
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_disable_radio(void)
+{
+   int iLockResult;
+   ANTStatus ret = ANT_STATUS_FAILED;
+   ANT_FUNC_START();
+
+   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
+   iLockResult = pthread_mutex_lock(&stEnabledStatusLock);
+   if(iLockResult) {
+      ANT_ERROR("disable failed to get state lock: %s", strerror(iLockResult));
+      goto out;
+   }
+   ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
+
+   if (g_fnStateCallback) {
+      g_fnStateCallback(RADIO_STATUS_DISABLING);
+   }
+
+   ant_disable();
+
+   if (g_fnStateCallback) {
+      g_fnStateCallback(ant_radio_enabled_status());
+   }
+
+   ret = ANT_STATUS_SUCCESS;
+
+   ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
+   pthread_mutex_unlock(&stEnabledStatusLock);
+   ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
+
+out:
+   ANT_FUNC_END();
+   return ret;
+}
+
+////////////////////////////////////////////////////////////////////
+//  ant_radio_enabled_status
+//
+//  Gets the current chip/transport state; either disabled, disabling,
+//  enabling, enabled, or resetting.  Determines this on the fly by checking
+//  if Rx thread is running and how many of the paths for the ANT chip have
+//  open VFS files.
+//
+//  Parameters:
+//      -
+//
+//  Returns:
+//      The current radio status (ANTRadioEnabledStatus)
+//
+//  Psuedocode:
+/*
+IF Thread Resetting Flag is set
+    RESULT = Resetting
+ELSE
+    COUNT the number of open files
+    IF Thread Run Flag is Not Set
+        IF there are open files OR Rx thread exists
+            RESULT = Disabling
+        ELSE
+            RESULT = Disabled
+        ENDIF
+    ELSE
+        IF All files are open (all paths) AND Rx thread exists
+            RESULT = ENABLED
+        ELSE IF there are open files (Not 0 open files) AND Rx thread exists
+            RESULT = UNKNOWN
+        ELSE (0 open files or Rx thread does not exist [while Thread Run set])
+            RESULT = ENABLING
+        ENDIF
+    ENDIF
+ENDIF
+*/
+////////////////////////////////////////////////////////////////////
+ANTRadioEnabledStatus ant_radio_enabled_status(void)
+{
+   ant_channel_type eChannel;
+   int iOpenFiles = 0;
+   int iOpenThread;
+   ANTRadioEnabledStatus uiRet = RADIO_STATUS_UNKNOWN;
+   ANT_FUNC_START();
+
+   if (stRxThreadInfo.ucChipResetting) {
+      uiRet = RADIO_STATUS_RESETTING;
+      goto out;
+   }
+
+   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
+      if (stRxThreadInfo.astChannels[eChannel].iFd != -1) {
+         iOpenFiles++;
+      }
+   }
+
+   iOpenThread = (stRxThreadInfo.stRxThread) ? 1 : 0;
+
+   if (!stRxThreadInfo.ucRunThread) {
+      if (iOpenFiles || iOpenThread) {
+         uiRet = RADIO_STATUS_DISABLING;
+      } else {
+         uiRet = RADIO_STATUS_DISABLED;
+      }
+   } else {
+      if ((iOpenFiles == NUM_ANT_CHANNELS) && iOpenThread) {
+         uiRet = RADIO_STATUS_ENABLED;
+      } else if (!iOpenFiles && iOpenThread) {
+         uiRet = RADIO_STATUS_UNKNOWN;
+      } else {
+         uiRet = RADIO_STATUS_ENABLING;
+      }
+   }
+
+out:
+   ANT_DEBUG_D("get radio enabled status returned %d", uiRet);
+
+   ANT_FUNC_END();
+   return uiRet;
+}
+
+////////////////////////////////////////////////////////////////////
+//  set_ant_rx_callback
+//
+//  Sets which function to call when an ANT message is received.
+//
+//  Parameters:
+//      rx_callback_func   the ANTNativeANTEventCb function to be used for
+//                         received messages (from all transport paths).
+//
+//  Returns:
+//          ANT_STATUS_SUCCESS
+//
+//  Psuedocode:
+/*
+FOR each transport path
+    Path Rx Callback = rx_callback_func
+ENDFOR
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus set_ant_rx_callback(ANTNativeANTEventCb rx_callback_func)
+{
+   ANTStatus status = ANT_STATUS_SUCCESS;
+   ANT_FUNC_START();
+
+#ifdef ANT_DEVICE_NAME // Single transport path
+   stRxThreadInfo.astChannels[SINGLE_CHANNEL].fnRxCallback = rx_callback_func;
+#else // Separate data/command paths
+   stRxThreadInfo.astChannels[COMMAND_CHANNEL].fnRxCallback = rx_callback_func;
+   stRxThreadInfo.astChannels[DATA_CHANNEL].fnRxCallback = rx_callback_func;
+#endif // Separate data/command paths
+
+   ANT_FUNC_END();
+   return status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  set_ant_state_callback
+//
+//  Sets which function to call when an ANT state change occurs.
+//
+//  Parameters:
+//      state_callback_func   the ANTNativeANTStateCb function to be used
+//                            for received state changes.
+//
+//  Returns:
+//          ANT_STATUS_SUCCESS
+//
+//  Psuedocode:
+/*
+    State Callback = state_callback_func
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus set_ant_state_callback(ANTNativeANTStateCb state_callback_func)
+{
+   ANTStatus status = ANT_STATUS_SUCCESS;
+   ANT_FUNC_START();
+
+   g_fnStateCallback = state_callback_func;
+
+   ANT_FUNC_END();
+   return status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  ant_tx_message_flowcontrol_wait
+//
+//  Sends an ANT message to the chip and waits for a CTS signal
+//
+//  Parameters:
+//      eTxPath          device to transmit message on
+//      eFlowMessagePath device that receives CTS
+//      ucMessageLength  the length of the message
+//      pucMesg          pointer to the message data
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failure:
+//          ANT_STATUS_NOT_ENABLED
+//
+//  Psuedocode:
+/*
+        LOCK flow control
+        IF Lock failed
+            RESULT = FAILED
+        ELSE
+            SET flowMessagePath Flow Control response as FLOW_STOP
+            WRITE txBuffer to txPath (only length of packet part)
+            IF Wrote less then 0 bytes
+                Log error
+                RESULT = FAILED
+            ELSE IF Didn't write 'length of packet' bytes
+                Log error
+                RESULT = FAILED
+            ELSE
+                IF flowMessagePath Flow Control response is not FLOW_GO
+                    WAIT until flowMessagePath Flow Control response is FLOW_GO, UNTIL FLOW_GO Wait Timeout seconds (10) from Now
+                    IF error Waiting
+                        IF error is Timeout
+                            RESULT = HARDWARE ERROR
+                        ELSE
+                            RESULT = FAILED
+                        ENDIF
+                    ELSE
+                        RESULT = SUCCESS
+                    ENDIF
+                ELSE
+                    RESULT = SUCCESS;
+                ENDIF
+            ENDIF
+            UNLOCK flow control
+        ENDIF
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_tx_message_flowcontrol_wait(ant_channel_type eTxPath, ant_channel_type eFlowMessagePath, ANT_U8 ucMessageLength, ANT_U8 *pucTxMessage)
+{
+   int iMutexResult;
+   int iResult;
+   struct timespec stTimeout;
+   int iCondWaitResult;
+   ANTStatus status = ANT_STATUS_FAILED;
+   ANT_FUNC_START();
+
+   ANT_DEBUG_V("getting stFlowControlLock in %s", __FUNCTION__);
+   iMutexResult = pthread_mutex_lock(&stFlowControlLock);
+   if (iMutexResult) {
+      ANT_ERROR("failed to lock flow control mutex during tx: %s", strerror(iMutexResult));
+      goto out;
+   }
+   ANT_DEBUG_V("got stFlowControlLock in %s", __FUNCTION__);
+
+   stRxThreadInfo.astChannels[eFlowMessagePath].ucFlowControlResp = ANT_FLOW_STOP;
+
+#ifdef ANT_FLOW_RESEND
+   // Store Tx message so can resend it from Rx thread
+   stRxThreadInfo.astChannels[eFlowMessagePath].ucResendMessageLength = ucMessageLength;
+   stRxThreadInfo.astChannels[eFlowMessagePath].pucResendMessage = pucTxMessage;
+#endif // ANT_FLOW_RESEND
+
+   iResult = write(stRxThreadInfo.astChannels[eTxPath].iFd, pucTxMessage, ucMessageLength);
+   if (iResult < 0) {
+      ANT_ERROR("failed to write data message to device: %s", strerror(errno));
+   } else if (iResult != ucMessageLength) {
+      ANT_ERROR("bytes written and message size don't match up");
+   } else {
+      stTimeout.tv_sec = time(0) + ANT_FLOW_GO_WAIT_TIMEOUT_SEC;
+      stTimeout.tv_nsec = 0;
+
+      while (stRxThreadInfo.astChannels[eFlowMessagePath].ucFlowControlResp != ANT_FLOW_GO) {
+         iCondWaitResult = pthread_cond_timedwait(&stFlowControlCond, &stFlowControlLock, &stTimeout);
+         if (iCondWaitResult) {
+            ANT_ERROR("failed to wait for flow control response: %s", strerror(iCondWaitResult));
+
+            if (iCondWaitResult == ETIMEDOUT) {
+               status = ANT_STATUS_HARDWARE_ERR;
+
+#ifdef ANT_FLOW_RESEND
+               // Clear Tx message so will stop resending it from Rx thread
+               stRxThreadInfo.astChannels[eFlowMessagePath].ucResendMessageLength = 0;
+               stRxThreadInfo.astChannels[eFlowMessagePath].pucResendMessage = NULL;
+#endif // ANT_FLOW_RESEND
+            }
+            goto wait_error;
+         }
+      }
+
+      status = ANT_STATUS_SUCCESS;
+   }
+
+wait_error:
+   ANT_DEBUG_V("releasing stFlowControlLock in %s", __FUNCTION__);
+   pthread_mutex_unlock(&stFlowControlLock);
+   ANT_DEBUG_V("released stFlowControlLock in %s", __FUNCTION__);
+
+out:
+   ANT_FUNC_END();
+   return status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  ant_tx_message_flowcontrol_none
+//
+//  Sends an ANT message to the chip without waiting for flow control
+//
+//  Parameters:
+//      eTxPath         device to transmit on
+//      ucMessageLength the length of the message
+//      pucMesg         pointer to the message data
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failure:
+//          ANT_STATUS_NOT_ENABLED
+//
+//  Psuedocode:
+/*
+        WRITE txBuffer to Tx Path (only length of packet part)
+        IF Wrote less then 0 bytes
+            Log error
+            RESULT = FAILED
+        ELSE IF Didn't write 'length of packet' bytes
+            Log error
+            RESULT = FAILED
+        ELSE
+            RESULT = SUCCESS
+        ENDIF
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_tx_message_flowcontrol_none(ant_channel_type eTxPath, ANT_U8 ucMessageLength, ANT_U8 *pucTxMessage)
+{
+   int iResult;
+   ANTStatus status = ANT_STATUS_FAILED;\
+   ANT_FUNC_START();
+
+   iResult = write(stRxThreadInfo.astChannels[eTxPath].iFd, pucTxMessage, ucMessageLength);
+   if (iResult < 0) {
+      ANT_ERROR("failed to write message to device: %s", strerror(errno));
+   }  else if (iResult != ucMessageLength) {
+      ANT_ERROR("bytes written and message size don't match up");
+   } else {
+      status = ANT_STATUS_SUCCESS;
+   }
+
+   ANT_FUNC_END();
+   return status;
+}
+
+////////////////////////////////////////////////////////////////////
+//  ant_tx_message
+//
+//  Frames ANT data and decides which flow control method to use for sending the
+//  ANT message to the chip
+//
+//  Parameters:
+//      ucLen   the length of the message
+//      pucMesg pointer to the message data
+//
+//  Returns:
+//      Success:
+//          ANT_STATUS_SUCCESS
+//      Failure:
+//          ANT_STATUS_NOT_ENABLED
+//
+//  Psuedocode:
+/*
+IF not enabled
+    RESULT = BT NOT INITIALIZED
+ELSE
+    Create txBuffer, MAX HCI Message Size large
+    PUT ucLen in txBuffer AT ANT HCI Size Offset (0)
+    COPY pucMesg to txBuffer AT ANT HCI Header Size (1)     <- ? Not at offset?
+    LOG txBuffer as a serial Tx (only length of packet part)
+    IF is a data message
+        Tx message on Data Path with FLOW_GO/FLOW_STOP flow control (ant_tx_message_flowcontrol_go_stop())
+    ELSE
+        Tx message on Command Path with no flow control (ant_tx_message_flowcontrol_none())
+    ENDIF
+ENDIF
+*/
+////////////////////////////////////////////////////////////////////
+ANTStatus ant_tx_message(ANT_U8 ucLen, ANT_U8 *pucMesg)
+{
+   ANTStatus status = ANT_STATUS_FAILED;
+   // TODO ANT_HCI_MAX_MSG_SIZE is transport (driver) dependent.
+   ANT_U8 txBuffer[ANT_HCI_MAX_MSG_SIZE];
+   // TODO Message length can be greater than ANT_U8 can hold.
+   // Not changed as ANT_SERIAL takes length as ANT_U8.
+   ANT_U8 txMessageLength = ucLen + ANT_HCI_HEADER_SIZE;
+   ANT_FUNC_START();
+
+   if (ant_radio_enabled_status() != RADIO_STATUS_ENABLED) {
+      status = ANT_STATUS_FAILED_BT_NOT_INITIALIZED;
+      goto out;
+   }
+
+#if ANT_HCI_OPCODE_SIZE == 1
+   txBuffer[ANT_HCI_OPCODE_OFFSET] = ANT_HCI_OPCODE_TX;
+#elif ANT_HCI_OPCODE_SIZE > 1
+#error "Specified ANT_HCI_OPCODE_SIZE not currently supported"
+#endif
+
+#if ANT_HCI_SIZE_SIZE == 1
+   txBuffer[ANT_HCI_SIZE_OFFSET] = ucLen;
+#elif ANT_HCI_SIZE_SIZE == 2
+   ANT_UTILS_StoreLE16(txBuffer + ANT_HCI_SIZE_OFFSET, (ANT_U16)ucLen);
+#else
+#error "Specified ANT_HCI_SIZE_SIZE not currently supported"
+#endif
+
+   memcpy(txBuffer + ANT_HCI_HEADER_SIZE, pucMesg, ucLen);
+
+   ANT_SERIAL(txBuffer, txMessageLength, 'T');
+
+#ifdef ANT_DEVICE_NAME // Single transport path
+   status = ant_tx_message_flowcontrol_wait(SINGLE_CHANNEL, SINGLE_CHANNEL, txMessageLength, txBuffer);
+#else // Separate data/command paths
+   switch (txBuffer[ANT_HCI_DATA_OFFSET + ANT_MSG_ID_OFFSET]) {
+   case MESG_BROADCAST_DATA_ID:
+   case MESG_ACKNOWLEDGED_DATA_ID:
+   case MESG_BURST_DATA_ID:
+   case MESG_EXT_BROADCAST_DATA_ID:
+   case MESG_EXT_ACKNOWLEDGED_DATA_ID:
+   case MESG_EXT_BURST_DATA_ID:
+   case MESG_ADV_BURST_DATA_ID:
+      status = ant_tx_message_flowcontrol_wait(DATA_CHANNEL, COMMAND_CHANNEL, txMessageLength, txBuffer);
+      break;
+   default:
+      status = ant_tx_message_flowcontrol_none(COMMAND_CHANNEL, txMessageLength, txBuffer);
+   }
+#endif // Separate data/command paths
+
+out:
+   ANT_FUNC_END();
+   return status;
+}
+
+//----------------- TODO Move these somewhere for multi transport path / dedicated channel support:
+
+static void ant_channel_init(ant_channel_info_t *pstChnlInfo, const char *pcCharDevName)
+{
+   ANT_FUNC_START();
+
+   // TODO Don't need to store, only accessed when trying to open:
+   // Is however useful for logs.
+   pstChnlInfo->pcDevicePath = pcCharDevName;
+
+   // This is the only piece of info that needs to be stored per channel
+   pstChnlInfo->iFd = -1;
+
+   // TODO Only 1 of these (not per-channel) is actually ever used:
+   pstChnlInfo->fnRxCallback = NULL;
+   pstChnlInfo->ucFlowControlResp = ANT_FLOW_GO;
+#ifdef ANT_FLOW_RESEND
+   pstChnlInfo->ucResendMessageLength = 0;
+   pstChnlInfo->pucResendMessage = NULL;
+#endif // ANT_FLOW_RESEND
+   // TODO Only used when Flow Control message received, so must only be Command path Rx thread
+   pstChnlInfo->pstFlowControlCond = &stFlowControlCond;
+   pstChnlInfo->pstFlowControlLock = &stFlowControlLock;
+
+   ANT_FUNC_END();
+}
+
+static void ant_disable_channel(ant_channel_info_t *pstChnlInfo)
+{
+   ANT_FUNC_START();
+
+   if (!pstChnlInfo) {
+      ANT_ERROR("null channel info passed to channel disable function");
+      goto out;
+   }
+
+   if (pstChnlInfo->iFd != -1) {
+      if (close(pstChnlInfo->iFd) < 0) {
+         ANT_ERROR("failed to close channel %s(%#x): %s", pstChnlInfo->pcDevicePath, pstChnlInfo->iFd, strerror(errno));
+      }
+
+      pstChnlInfo->iFd = -1; //TODO can this overwrite a still valid fd?
+   } else {
+      ANT_DEBUG_D("%s file is already closed", pstChnlInfo->pcDevicePath);
+   }
+
+out:
+   ANT_FUNC_END();
+}
+
+static int ant_enable_channel(ant_channel_info_t *pstChnlInfo)
+{
+   int iRet = -1;
+   ANT_FUNC_START();
+   if (!pstChnlInfo) {
+      ANT_ERROR("null channel info passed to channel enable function");
+      errno = EINVAL;
+      goto out;
+   }
+   if (pstChnlInfo->iFd == -1) {
+      pstChnlInfo->iFd = open(pstChnlInfo->pcDevicePath, O_RDWR);
+      if (pstChnlInfo->iFd < 0) {
+         ANT_ERROR("failed to open dev %s: %s", pstChnlInfo->pcDevicePath, strerror(errno));
+         goto out;
+      }
+   } else {
+      ANT_DEBUG_D("%s is already enabled", pstChnlInfo->pcDevicePath);
+   }
+   iRet = 0;
+out:
+   ANT_FUNC_END();
+   return iRet;
+}
+
+//----------------------------------------------------------------------- This is antradio_power.h:
+
+int ant_enable(void)
+{
+   int iRet = -1;
+   ant_channel_type eChannel;
+   ANT_FUNC_START();
+
+   stRxThreadInfo.ucRunThread = 1;
+
+   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
+      if (ant_enable_channel(&stRxThreadInfo.astChannels[eChannel]) < 0) {
+         ANT_ERROR("failed to enable channel %s: %s",
+                         stRxThreadInfo.astChannels[eChannel].pcDevicePath,
+                         strerror(errno));
+         goto out;
+      }
+   }
+
+   if (stRxThreadInfo.stRxThread == 0) {
+      if (pthread_create(&stRxThreadInfo.stRxThread, NULL, fnRxThread, &stRxThreadInfo) < 0) {
+         ANT_ERROR("failed to start rx thread: %s", strerror(errno));
+         goto out;
+      }
+   } else {
+      ANT_DEBUG_D("rx thread is already running");
+   }
+
+   if (!stRxThreadInfo.ucRunThread) {
+      ANT_ERROR("rx thread crashed during init");
+      goto out;
+   }
+
+   iRet = 0;
+
+out:
+   ANT_FUNC_END();
+   return iRet;
+}
+
+int ant_disable(void)
+{
+   int iRet = -1;
+   ant_channel_type eChannel;
+   ANT_FUNC_START();
+
+   stRxThreadInfo.ucRunThread = 0;
+
+   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
+      ant_disable_channel(&stRxThreadInfo.astChannels[eChannel]);
+   }
+
+   if (stRxThreadInfo.stRxThread != 0) {
+      if (pthread_join(stRxThreadInfo.stRxThread, NULL) < 0) {
+         ANT_ERROR("failed to join rx thread: %s", strerror(errno));
+         goto out;
+      }
+   } else {
+      ANT_DEBUG_D("rx thread is not running");
+   }
+
+   iRet = 0;
+
+out:
+   stRxThreadInfo.stRxThread = 0;
+   ANT_FUNC_END();
+   return iRet;
+}
+
+//---------------------------------------------------------
+
+const char *ant_get_lib_version()
+{
+   return "libantradio.so: "ANT_CHIP_NAME". Version "
+      LIBANT_STACK_MAJOR"."LIBANT_STACK_MINOR"."LIBANT_STACK_INCRE;
+}
diff --git a/src/vfs/ant_rx_chardev.c b/src/vfs/ant_rx_chardev.c
new file mode 100644
index 0000000..5a4a255
--- /dev/null
+++ b/src/vfs/ant_rx_chardev.c
@@ -0,0 +1,312 @@
+/*
+ * ANT Stack
+ *
+ * Copyright 2011 Dynastream Innovations
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/******************************************************************************\
+*
+*   FILE NAME:      ant_rx_chardev.c
+*
+*   BRIEF:
+*      This file implements the receive thread function which will loop reading
+*      ANT messages until told to exit.
+*
+*
+\******************************************************************************/
+
+#include <errno.h>
+#include <poll.h>
+#include <pthread.h>
+
+#include "ant_types.h"
+#include "antradio_power.h"
+#include "ant_rx_chardev.h"
+#include "ant_driver_defines.h"
+#include "ant_log.h"
+#include "ant_native.h"  // ANT_HCI_MAX_MSG_SIZE, ANT_MSG_ID_OFFSET, ANT_MSG_DATA_OFFSET,
+                         // ant_radio_enabled_status()
+
+extern ANTStatus ant_tx_message_flowcontrol_none(ant_channel_type eTxPath, ANT_U8 ucMessageLength, ANT_U8 *pucTxMessage);
+
+#undef LOG_TAG
+#define LOG_TAG "antradio_rx"
+
+#define ANT_POLL_TIMEOUT         ((int)30000)
+
+int readChannelMsg(ant_channel_type eChannel, ant_channel_info_t *pstChnlInfo);
+
+/*
+ * This thread waits for ANT messages from a VFS file.
+ */
+void *fnRxThread(void *ant_rx_thread_info)
+{
+   int iMutexLockResult;
+   int iPollRet;
+   ant_rx_thread_info_t *stRxThreadInfo;
+   struct pollfd astPollFd[NUM_ANT_CHANNELS];
+   ant_channel_type eChannel;
+   ANT_FUNC_START();
+
+   stRxThreadInfo = (ant_rx_thread_info_t *)ant_rx_thread_info;
+   for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
+      astPollFd[eChannel].fd = stRxThreadInfo->astChannels[eChannel].iFd;
+      astPollFd[eChannel].events = POLLIN | POLLRDNORM;
+   }
+
+   /* continue running as long as not terminated */
+   while (stRxThreadInfo->ucRunThread) {
+      /* Wait for data available on any file (transport path) */
+      iPollRet = poll(astPollFd, NUM_ANT_CHANNELS, ANT_POLL_TIMEOUT);
+      if (!iPollRet) {
+         ANT_DEBUG_V("poll timed out, checking exit cond");
+      } else if (iPollRet < 0) {
+         ANT_ERROR("read thread exiting, unhandled error: %s", strerror(errno));
+      } else {
+         for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
+            if (astPollFd[eChannel].revents & (POLLERR | POLLPRI | POLLRDHUP)) {
+               ANT_ERROR("poll error from %s. exiting rx thread",
+                            stRxThreadInfo->astChannels[eChannel].pcDevicePath);
+               /* Chip was reset or other error, only way to recover is to
+                * close and open ANT chardev */
+               stRxThreadInfo->ucChipResetting = 1;
+
+               if (g_fnStateCallback) {
+                  g_fnStateCallback(RADIO_STATUS_RESETTING);
+               }
+
+               goto reset;
+            } else if (astPollFd[eChannel].revents & (POLLIN | POLLRDNORM)) {
+               ANT_DEBUG_D("data on %s. reading it",
+                            stRxThreadInfo->astChannels[eChannel].pcDevicePath);
+
+               if (readChannelMsg(eChannel, &stRxThreadInfo->astChannels[eChannel]) < 0) {
+                  goto out;
+               }
+            } else if (astPollFd[eChannel].revents) {
+               ANT_DEBUG_W("unhandled poll result %#x from %s",
+                            astPollFd[eChannel].revents,
+                            stRxThreadInfo->astChannels[eChannel].pcDevicePath);
+            }
+         }
+      }
+   }
+
+out:
+   stRxThreadInfo->ucRunThread = 0;
+
+   /* Try to get stEnabledStatusLock.
+    * if you get it then noone is enabling or disabling
+    * if you can't get it assume something made you exit */
+   ANT_DEBUG_V("try getting stEnabledStatusLock in %s", __FUNCTION__);
+   iMutexLockResult = pthread_mutex_trylock(stRxThreadInfo->pstEnabledStatusLock);
+   if (!iMutexLockResult) {
+      ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
+      ANT_WARN("rx thread has unexpectedly crashed, cleaning up");
+      stRxThreadInfo->stRxThread = 0; /* spoof our handle as closed so we don't
+                                       * try to join ourselves in disable */
+
+      if (g_fnStateCallback) {
+         g_fnStateCallback(RADIO_STATUS_DISABLING);
+      }
+
+      ant_disable();
+
+      if (g_fnStateCallback) {
+         g_fnStateCallback(ant_radio_enabled_status());
+      }
+
+      ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
+      pthread_mutex_unlock(stRxThreadInfo->pstEnabledStatusLock);
+      ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
+   } else if (iMutexLockResult != EBUSY) {
+      ANT_ERROR("rx thread closing code, trylock on state lock failed: %s",
+            strerror(iMutexLockResult));
+   } else {
+      ANT_DEBUG_V("stEnabledStatusLock busy");
+   }
+
+   // FIXME This is not the end of the function
+   // Probably because goto:reset is a bad implementation; can have a reset function.
+   // Will only end here on Android.
+   ANT_FUNC_END();
+#ifdef ANDROID
+   return NULL;
+#endif
+
+reset:
+   stRxThreadInfo->ucRunThread = 0;
+
+   ANT_DEBUG_V("getting stEnabledStatusLock in %s", __FUNCTION__);
+   iMutexLockResult = pthread_mutex_lock(stRxThreadInfo->pstEnabledStatusLock);
+   if (iMutexLockResult < 0) {
+      ANT_ERROR("chip was reset, getting state mutex failed: %s",
+            strerror(iMutexLockResult));
+      stRxThreadInfo->stRxThread = 0;
+   } else {
+      ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
+
+      stRxThreadInfo->stRxThread = 0; /* spoof our handle as closed so we don't
+                                       * try to join ourselves in disable */
+
+      ant_disable();
+
+      if (ant_enable()) { /* failed */
+         if (g_fnStateCallback) {
+            g_fnStateCallback(RADIO_STATUS_DISABLED);
+         }
+      } else { /* success */
+         if (g_fnStateCallback) {
+            g_fnStateCallback(RADIO_STATUS_RESET);
+         }
+      }
+
+      ANT_DEBUG_V("releasing stEnabledStatusLock in %s", __FUNCTION__);
+      pthread_mutex_unlock(stRxThreadInfo->pstEnabledStatusLock);
+      ANT_DEBUG_V("released stEnabledStatusLock in %s", __FUNCTION__);
+   }
+
+   stRxThreadInfo->ucChipResetting = 0;
+
+   ANT_FUNC_END();
+#ifdef ANDROID
+   return NULL;
+#endif
+}
+
+////////////////////////////////////////////////////////////////////
+//  setFlowControl
+//
+//  Sets the flow control "flag" to the value provided and signals the transmit
+//  thread to check the value.
+//
+//  Parameters:
+//      pstChnlInfo   the details of the channel being updated
+//      ucFlowSetting the value to use
+//
+//  Returns:
+//      Success:
+//          0
+//      Failure:
+//          -1
+////////////////////////////////////////////////////////////////////
+int setFlowControl(ant_channel_info_t *pstChnlInfo, ANT_U8 ucFlowSetting)
+{
+   int iRet = -1;
+   int iMutexResult;
+   ANT_FUNC_START();
+
+   ANT_DEBUG_V("getting stFlowControlLock in %s", __FUNCTION__);
+   iMutexResult = pthread_mutex_lock(pstChnlInfo->pstFlowControlLock);
+   if (iMutexResult) {
+      ANT_ERROR("failed to lock flow control mutex during response: %s", strerror(iMutexResult));
+   } else {
+      ANT_DEBUG_V("got stFlowControlLock in %s", __FUNCTION__);
+
+      pstChnlInfo->ucFlowControlResp = ucFlowSetting;
+
+      ANT_DEBUG_V("releasing stFlowControlLock in %s", __FUNCTION__);
+      pthread_mutex_unlock(pstChnlInfo->pstFlowControlLock);
+      ANT_DEBUG_V("released stFlowControlLock in %s", __FUNCTION__);
+
+      pthread_cond_signal(pstChnlInfo->pstFlowControlCond);
+
+      iRet = 0;
+   }
+
+   ANT_FUNC_END();
+   return iRet;
+}
+
+int readChannelMsg(ant_channel_type eChannel, ant_channel_info_t *pstChnlInfo)
+{
+   int iRet = -1;
+   ANT_U8 aucRxBuffer[ANT_HCI_MAX_MSG_SIZE];
+   int iRxLenRead;
+   ANT_FUNC_START();
+
+   // Keep trying to read while there is an error, and that error is EAGAIN
+   while (((iRxLenRead = read(pstChnlInfo->iFd, aucRxBuffer, sizeof(aucRxBuffer))) < 0)
+                   && errno == EAGAIN)
+      ;
+
+   if (iRxLenRead < 0) {
+      if (errno == ENODEV) {
+         ANT_ERROR("%s not enabled, exiting rx thread",
+               pstChnlInfo->pcDevicePath);
+
+         goto out;
+      } else if (errno == ENXIO) {
+         ANT_ERROR("%s there is no physical ANT device connected",
+               pstChnlInfo->pcDevicePath);
+
+         goto out;
+      } else {
+         ANT_ERROR("%s read thread exiting, unhandled error: %s",
+               pstChnlInfo->pcDevicePath, strerror(errno));
+
+         goto out;
+      }
+   } else {
+      ANT_SERIAL(aucRxBuffer, iRxLenRead, 'R');
+
+#if ANT_HCI_OPCODE_SIZE == 1  // Check the different message types by opcode
+      ANT_U8 opcode = aucRxBuffer[ANT_HCI_OPCODE_OFFSET];
+
+      if(ANT_HCI_OPCODE_COMMAND_COMPLETE == opcode) {
+         // Command Complete, so signal a FLOW_GO
+         if(setFlowControl(pstChnlInfo, ANT_FLOW_GO)) {
+            goto out;
+         }
+      } else if(ANT_HCI_OPCODE_FLOW_ON == opcode) {
+         // FLow On, so resend the last Tx
+#ifdef ANT_FLOW_RESEND
+         // Check if there is a message to resend
+         if(pstChnlInfo->ucResendMessageLength > 0) {
+            ant_tx_message_flowcontrol_none(eChannel, pstChnlInfo->ucResendMessageLength, pstChnlInfo->pucResendMessage);
+         } else {
+            ANT_DEBUG_D("Resend requested by chip, but tx request cancelled");
+         }
+#endif // ANT_FLOW_RESEND
+      } else if(ANT_HCI_OPCODE_ANT_EVENT == opcode)
+         // ANT Event, send ANT packet to Rx Callback
+#endif // ANT_HCI_OPCODE_SIZE == 1
+      {
+      // Received an ANT packet
+#ifdef ANT_MESG_FLOW_CONTROL
+         if (aucRxBuffer[ANT_HCI_DATA_OFFSET + ANT_MSG_ID_OFFSET] == ANT_MESG_FLOW_CONTROL) {
+            // This is a flow control packet, not a standard ANT message
+            if(setFlowControl(pstChnlInfo, aucRxBuffer[ANT_HCI_DATA_OFFSET + ANT_MSG_DATA_OFFSET])) {
+               goto out;
+            }
+         } else
+#endif // ANT_MESG_FLOW_CONTROL
+         {
+            if (pstChnlInfo->fnRxCallback != NULL) {
+               // TODO Allow HCI Size value to be larger than 1 byte
+               // This currently works as no size value is greater than 255, and little endian
+               pstChnlInfo->fnRxCallback(aucRxBuffer[ANT_HCI_SIZE_OFFSET], &aucRxBuffer[ANT_HCI_DATA_OFFSET]);
+            } else {
+               ANT_WARN("%s rx callback is null", pstChnlInfo->pcDevicePath);
+            }
+         }
+      }
+
+      iRet = 0;
+   }
+
+out:
+   ANT_FUNC_END();
+   return iRet;
+}
diff --git a/src/chip-B/inc/ant_rx_chardev.h b/src/vfs/inc/ant_rx_chardev.h
similarity index 65%
rename from src/chip-B/inc/ant_rx_chardev.h
rename to src/vfs/inc/ant_rx_chardev.h
index 6721222..526070c 100644
--- a/src/chip-B/inc/ant_rx_chardev.h
+++ b/src/vfs/inc/ant_rx_chardev.h
@@ -20,7 +20,10 @@
 *   FILE NAME:      ant_rx_chardev.h
 *
 *   BRIEF:
-*       This file defines public members in ant_rx_chardev.c
+*      This file defines the receive thread function, the ant_rx_thread_info_t
+*      type for storing the -configuration- <state> of the receive thread, the
+*      ant_channel_info_t type for storing a channel's (transport path)
+*      configuration, and an enumeration of all ANT channels (transport paths).
 *
 *
 \*******************************************************************************/
@@ -29,6 +32,14 @@
 #define __ANT_RX_NATIVE_H
 
 #include "ant_native.h"
+#include "ant_driver_defines.h"
+
+/* same as HCI_MAX_EVENT_SIZE from hci.h, but hci.h is not included for vfs */
+#define ANT_HCI_MAX_MSG_SIZE 260
+
+#define ANT_MSG_SIZE_OFFSET     ((ANT_U8)0)
+#define ANT_MSG_ID_OFFSET       ((ANT_U8)1)
+#define ANT_MSG_DATA_OFFSET     ((ANT_U8)2)
 
 /* This struct defines the info passed to an rx thread */
 typedef struct {
@@ -44,13 +55,23 @@
    pthread_cond_t *pstFlowControlCond;
    /* Handle to flow control mutex */
    pthread_mutex_t *pstFlowControlLock;
+#ifdef ANT_FLOW_RESEND
+   /* Length of message to resend on request from chip */
+   ANT_U8 ucResendMessageLength;
+   /* The message to resend on request from chip */
+   ANT_U8 *pucResendMessage;
+#endif // ANT_FLOW_RESEND
 } ant_channel_info_t;
 
-enum ant_channel_type {
+typedef enum {
+#ifdef ANT_DEVICE_NAME // Single transport path
+   SINGLE_CHANNEL,
+#else // Separate data/command paths
    DATA_CHANNEL,
    COMMAND_CHANNEL,
+#endif // Separate data/command paths
    NUM_ANT_CHANNELS
-};
+} ant_channel_type;
 
 typedef struct {
    /* Thread handle */
@@ -65,6 +86,8 @@
    ant_channel_info_t astChannels[NUM_ANT_CHANNELS];
 } ant_rx_thread_info_t;
 
+extern ANTNativeANTStateCb g_fnStateCallback;  // TODO State callback should be inside ant_rx_thread_info_t.
+
 /* This is the rx thread function. It loops reading ANT packets until told to
  * exit */
 void *fnRxThread(void *ant_rx_thread_info);
diff --git a/src/vfs/inc/antradio_power.h b/src/vfs/inc/antradio_power.h
new file mode 100644
index 0000000..1aa0b24
--- /dev/null
+++ b/src/vfs/inc/antradio_power.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ANTRADIOPM_H
+#define __ANTRADIOPM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Enable the ANT radio interface.
+ *
+ * Responsible for power on, and bringing up HCI interface.
+ * Will block until the HCI interface is ready to use.
+ *
+ * Returns 0 on success, -ve on error */
+int ant_enable();
+
+/* Disable the ANT radio interface.
+ *
+ * Responsbile for pulling down the HCI interface, and powering down the chip.
+ * Will block until power down is complete, and it is safe to immediately call 
+ * enable().
+ *
+ * Returns 0 on success, -ve on error */
+int ant_disable();
+
+/* Returns 1 if enabled, 0 if disabled, and -ve on error */
+int ant_is_enabled();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/vfs/prerelease/ant_driver_defines.h b/src/vfs/prerelease/ant_driver_defines.h
new file mode 100644
index 0000000..7b6b58b
--- /dev/null
+++ b/src/vfs/prerelease/ant_driver_defines.h
@@ -0,0 +1,67 @@
+/*
+ * ANT Stack
+ *
+ * Copyright 2011 Dynastream Innovations
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*******************************************************************************\
+*
+*   FILE NAME:    ant_driver_defines.h
+*
+*   BRIEF:
+*      This file defines ANT specific HCI values used by the ANT chip for a
+*      sample TTY implementation.
+*
+*
+\*******************************************************************************/
+
+#ifndef __VFS_PRERELEASE_H
+#define __VFS_PRERELEASE_H
+
+#define ANT_CHIP_NAME                        "TTY"
+
+#define ANT_COMMANDS_DEVICE_NAME             "/dev/smd5"
+#define ANT_DATA_DEVICE_NAME                 "/dev/smd6"
+
+// Hard reset not supported, don't define ANT_IOCTL_RESET
+
+// -----------------------------------------
+// |         Header       | Data |  Footer  |
+// |----------------------|-----------------|
+// |Optional| Data | Opt. | ...  | Optional |
+// | Opcode | Size | Sync |      | Checksum |
+
+#define ANT_HCI_OPCODE_SIZE                  0
+#define ANT_HCI_SIZE_SIZE                    1
+
+#define ANT_HCI_SYNC_SIZE                    0
+#define ANT_HCI_CHECKSUM_SIZE                0
+
+#define ANT_MESG_FLOW_CONTROL                ((ANT_U8)0xC9)
+
+#define ANT_FLOW_GO                          ((ANT_U8)0x00)
+
+// ---------------------- Not chip specific
+
+#define ANT_HCI_HEADER_SIZE                  ((ANT_HCI_OPCODE_SIZE) + (ANT_HCI_SIZE_SIZE) + (ANT_HCI_SYNC_SIZE))
+
+#define ANT_HCI_OPCODE_OFFSET                0
+#define ANT_HCI_SIZE_OFFSET                  ((ANT_HCI_OPCODE_OFFSET) + (ANT_HCI_OPCODE_SIZE))
+#define ANT_HCI_SYNC_OFFSET                  ((ANT_HCI_SIZE_OFFSET) + (ANT_HCI_SIZE_SIZE))
+#define ANT_HCI_DATA_OFFSET                  (ANT_HCI_HEADER_SIZE)
+
+#define ANT_FLOW_STOP                        ((ANT_U8)0x80)
+#define ANT_FLOW_GO_WAIT_TIMEOUT_SEC         10
+
+#endif /* ifndef __VFS_PRERELEASE_H */
diff --git a/src/vfs/ste/cg29xx/ant_driver_defines.h b/src/vfs/ste/cg29xx/ant_driver_defines.h
new file mode 100644
index 0000000..238782b
--- /dev/null
+++ b/src/vfs/ste/cg29xx/ant_driver_defines.h
@@ -0,0 +1,67 @@
+/*
+ * ANT Stack
+ *
+ * Copyright 2011 Dynastream Innovations
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*******************************************************************************\
+*
+*   FILE NAME:      ant_driver_defines.h
+*
+*   BRIEF:
+*       This file defines constants for the ST-E CG29XX implementation
+*
+*
+\*******************************************************************************/
+
+#ifndef __VFS_PRERELEASE_H
+#define __VFS_PRERELEASE_H
+
+#define ANT_CHIP_NAME                        "ST-E CG29XX"
+
+#define ANT_COMMANDS_DEVICE_NAME             "/dev/cg2900_antradio_cmd"
+#define ANT_DATA_DEVICE_NAME                 "/dev/cg2900_antradio_data"
+
+// TODO Must define ANT_IOCTL_RESET to value driver is expecting
+#define ANT_IOCTL_RESET                      _IO('H', 160)
+
+// -----------------------------------------
+// |         Header       | Data |  Footer  |
+// |----------------------|-----------------|
+// |Optional| Data | Opt. | ...  | Optional |
+// | Opcode | Size | Sync |      | Checksum |
+
+#define ANT_HCI_OPCODE_SIZE                  0
+#define ANT_HCI_SIZE_SIZE                    1
+
+#define ANT_HCI_SYNC_SIZE                    0
+#define ANT_HCI_CHECKSUM_SIZE                0
+
+#define ANT_MESG_FLOW_CONTROL                ((ANT_U8)0xC9)
+
+#define ANT_FLOW_GO                          ((ANT_U8)0x00)
+
+// ---------------------- Not chip specific
+
+#define ANT_HCI_HEADER_SIZE                  ((ANT_HCI_OPCODE_SIZE) + (ANT_HCI_SIZE_SIZE) + (ANT_HCI_SYNC_SIZE))
+
+#define ANT_HCI_OPCODE_OFFSET                0
+#define ANT_HCI_SIZE_OFFSET                  ((ANT_HCI_OPCODE_OFFSET) + (ANT_HCI_OPCODE_SIZE))
+#define ANT_HCI_SYNC_OFFSET                  ((ANT_HCI_SIZE_OFFSET) + (ANT_HCI_SIZE_SIZE))
+#define ANT_HCI_DATA_OFFSET                  (ANT_HCI_HEADER_SIZE)
+
+#define ANT_FLOW_STOP                        ((ANT_U8)0x80)
+#define ANT_FLOW_GO_WAIT_TIMEOUT_SEC         10
+
+#endif /* ifndef __VFS_PRERELEASE_H */
