diff --git a/system/stack/include/port_api.h b/system/stack/include/port_api.h
index b0a7e63..daea3d4 100644
--- a/system/stack/include/port_api.h
+++ b/system/stack/include/port_api.h
@@ -35,47 +35,27 @@
  * set settings request, or to the application in the set settings indication.
 */
 typedef struct {
-#define PORT_BAUD_RATE_2400 0x00
-#define PORT_BAUD_RATE_4800 0x01
-#define PORT_BAUD_RATE_7200 0x02
 #define PORT_BAUD_RATE_9600 0x03
-#define PORT_BAUD_RATE_19200 0x04
-#define PORT_BAUD_RATE_38400 0x05
-#define PORT_BAUD_RATE_57600 0x06
-#define PORT_BAUD_RATE_115200 0x07
-#define PORT_BAUD_RATE_230400 0x08
 
   uint8_t baud_rate;
 
-#define PORT_5_BITS 0x00
-#define PORT_6_BITS 0x01
-#define PORT_7_BITS 0x02
 #define PORT_8_BITS 0x03
 
   uint8_t byte_size;
 
 #define PORT_ONESTOPBIT 0x00
-#define PORT_ONE5STOPBITS 0x01
   uint8_t stop_bits;
 
 #define PORT_PARITY_NO 0x00
-#define PORT_PARITY_YES 0x01
   uint8_t parity;
 
 #define PORT_ODD_PARITY 0x00
-#define PORT_EVEN_PARITY 0x01
-#define PORT_MARK_PARITY 0x02
-#define PORT_SPACE_PARITY 0x03
 
   uint8_t parity_type;
 
 #define PORT_FC_OFF 0x00
-#define PORT_FC_XONXOFF_ON_INPUT 0x01
-#define PORT_FC_XONXOFF_ON_OUTPUT 0x02
 #define PORT_FC_CTS_ON_INPUT 0x04
 #define PORT_FC_CTS_ON_OUTPUT 0x08
-#define PORT_FC_DSR_ON_INPUT 0x10
-#define PORT_FC_DSR_ON_OUTPUT 0x20
 
   uint8_t fc_type;
 
@@ -133,18 +113,6 @@
 #define PORT_EV_FCS 0x00020000
 
 /*
- * To register for events application should provide bitmask with
- * corresponding bit set
-*/
-
-#define PORT_MASK_ALL                                                  \
-  (PORT_EV_RXCHAR | PORT_EV_TXEMPTY | PORT_EV_CTS | PORT_EV_DSR |      \
-   PORT_EV_RLSD | PORT_EV_BREAK | PORT_EV_ERR | PORT_EV_RING |         \
-   PORT_EV_CONNECT_ERR | PORT_EV_DSRS | PORT_EV_CTSS | PORT_EV_RLSDS | \
-   PORT_EV_RXFLAG | PORT_EV_TXCHAR | PORT_EV_OVERRUN | PORT_EV_FC |    \
-   PORT_EV_FCS | PORT_EV_CONNECTED)
-
-/*
  * Define port result codes
 */
 #define PORT_SUCCESS 0
@@ -267,21 +235,6 @@
  ******************************************************************************/
 int PORT_ClearKeepHandleFlag(uint16_t port_handle);
 
-/*******************************************************************************
- *
- * Function         PORT_SetEventCallback
- *
- * Description      Set event data callback the specified connection.
- *
- * Parameters:      handle       - Handle of the port returned in the Open
- *                  p_callback   - address of the callback function which should
- *                                 be called from the RFCOMM when a data
- *                                 packet is received.
- *
- ******************************************************************************/
-extern int PORT_SetDataCallback(uint16_t port_handle,
-                                tPORT_DATA_CALLBACK* p_cb);
-
 extern int PORT_SetDataCOCallback(uint16_t port_handle,
                                   tPORT_DATA_CO_CALLBACK* p_port_cb);
 /*******************************************************************************
@@ -341,18 +294,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_GetRxQueueCnt
- *
- * Description      This function return number of buffers on the rx queue.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  p_rx_queue_count - Pointer to return queue count in.
- *
- ******************************************************************************/
-extern int PORT_GetRxQueueCnt(uint16_t handle, uint16_t* p_rx_queue_count);
-
-/*******************************************************************************
- *
  * Function         PORT_GetState
  *
  * Description      This function is called to fill tPORT_STATE structure
@@ -367,43 +308,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_Control
- *
- * Description      This function directs a specified connection to pass control
- *                  control information to the peer device.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  signal     - specify the function to be passed
- *
- ******************************************************************************/
-#define PORT_SET_DTRDSR 0x01
-#define PORT_CLR_DTRDSR 0x02
-#define PORT_SET_CTSRTS 0x03
-#define PORT_CLR_CTSRTS 0x04
-#define PORT_SET_RI 0x05  /* DCE only */
-#define PORT_CLR_RI 0x06  /* DCE only */
-#define PORT_SET_DCD 0x07 /* DCE only */
-#define PORT_CLR_DCD 0x08 /* DCE only */
-#define PORT_BREAK 0x09   /* Break event */
-
-extern int PORT_Control(uint16_t handle, uint8_t signal);
-
-/*******************************************************************************
- *
- * Function         PORT_FlowControl
- *
- * Description      This function directs a specified connection to pass
- *                  flow control message to the peer device.  Enable flag passed
- *                  shows if port can accept more data.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  enable     - enables data flow
- *
- ******************************************************************************/
-extern int PORT_FlowControl(uint16_t handle, bool enable);
-
-/*******************************************************************************
- *
  * Function         PORT_FlowControl_MaxCredit
  *
  * Description      This function directs a specified connection to pass
@@ -417,20 +321,6 @@
  ******************************************************************************/
 extern int PORT_FlowControl_MaxCredit(uint16_t handle, bool enable);
 
-/*******************************************************************************
- *
- * Function         PORT_GetModemStatus
- *
- * Description      This function retrieves modem control signals.  Normally
- *                  application will call this function after a callback
- *                  function is called with notification that one of signals
- *                  has been changed.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                               callback.
- *                  p_signal   - specify the pointer to control signals info
- *
- ******************************************************************************/
 #define PORT_DTRDSR_ON 0x01
 #define PORT_CTSRTS_ON 0x02
 #define PORT_RING_ON 0x04
@@ -447,103 +337,12 @@
   (PORT_DTRDSR_ON | PORT_CTSRTS_ON | PORT_DCD_ON)
 #define PORT_DUN_DEFAULT_SIGNAL_STATE (PORT_DTRDSR_ON | PORT_CTSRTS_ON)
 
-extern int PORT_GetModemStatus(uint16_t handle, uint8_t* p_control_signal);
-
-/*******************************************************************************
- *
- * Function         PORT_ClearError
- *
- * Description      This function retreives information about a communications
- *                  error and reports current status of a connection.  The
- *                  function should be called when an error occures to clear
- *                  the connection error flag and to enable additional read
- *                  and write operations.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  p_errors   - pointer of the variable to receive error codes
- *                  p_status   - pointer to the tPORT_STATUS structur to receive
- *                               connection status
- *
- ******************************************************************************/
-
 #define PORT_ERR_BREAK 0x01   /* Break condition occured on the peer device */
 #define PORT_ERR_OVERRUN 0x02 /* Overrun is reported by peer device */
 #define PORT_ERR_FRAME 0x04   /* Framing error reported by peer device */
 #define PORT_ERR_RXOVER 0x08  /* Input queue overflow occured */
 #define PORT_ERR_TXFULL 0x10  /* Output queue overflow occured */
 
-typedef struct {
-#define PORT_FLAG_CTS_HOLD 0x01  /* Tx is waiting for CTS signal */
-#define PORT_FLAG_DSR_HOLD 0x02  /* Tx is waiting for DSR signal */
-#define PORT_FLAG_RLSD_HOLD 0x04 /* Tx is waiting for RLSD signal */
-
-  uint16_t flags;
-  uint16_t in_queue_size;  /* Number of bytes in the input queue */
-  uint16_t out_queue_size; /* Number of bytes in the output queue */
-  uint16_t mtu_size;       /* peer MTU size */
-} tPORT_STATUS;
-
-extern int PORT_ClearError(uint16_t handle, uint16_t* p_errors,
-                           tPORT_STATUS* p_status);
-
-/*******************************************************************************
- *
- * Function         PORT_SendError
- *
- * Description      This function send a communications error to the peer device
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  errors     - receive error codes
- *
- ******************************************************************************/
-extern int PORT_SendError(uint16_t handle, uint8_t errors);
-
-/*******************************************************************************
- *
- * Function         PORT_GetQueueStatus
- *
- * Description      This function reports current status of a connection.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  p_status   - pointer to the tPORT_STATUS structur to receive
- *                               connection status
- *
- ******************************************************************************/
-extern int PORT_GetQueueStatus(uint16_t handle, tPORT_STATUS* p_status);
-
-/*******************************************************************************
- *
- * Function         PORT_Purge
- *
- * Description      This function discards all the data from the output or
- *                  input queues of the specified connection.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  purge_flags - specify the action to take.
- *
- ******************************************************************************/
-#define PORT_PURGE_TXCLEAR 0x01
-#define PORT_PURGE_RXCLEAR 0x02
-
-extern int PORT_Purge(uint16_t handle, uint8_t purge_flags);
-
-/*******************************************************************************
- *
- * Function         PORT_Read
- *
- * Description      This function returns the pointer to the buffer received
- *                  from the peer device.  Normally application will call this
- *                  function after receiving PORT_EVT_RXCHAR event.
- *                  Application calling this function is responsible to free
- *                  buffer returned.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                                callback.
- *                  pp_buf      - pointer to address of buffer with data,
- *
- ******************************************************************************/
-extern int PORT_Read(uint16_t handle, BT_HDR** pp_buf);
-
 /*******************************************************************************
  *
  * Function         PORT_ReadData
@@ -563,19 +362,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_Write
- *
- * Description      This function to send BT buffer to the peer device.
- *                  Application should not free the buffer.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  p_buf       - pointer to the buffer with data,
- *
- ******************************************************************************/
-extern int PORT_Write(uint16_t handle, BT_HDR* p_buf);
-
-/*******************************************************************************
- *
  * Function         PORT_WriteData
  *
  * Description      This function is called from the legacy application to
@@ -604,19 +390,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_Test
- *
- * Description      Application can call this function to send RFCOMM Test frame
- *
- * Parameters:      handle      - Handle returned in the RFCOMM_CreateConnection
- *                  p_data      - Data area
- *                  max_len     - Byte count requested
- *
- ******************************************************************************/
-extern int PORT_Test(uint16_t handle, uint8_t* p_data, uint16_t len);
-
-/*******************************************************************************
- *
  * Function         RFCOMM_Init
  *
  * Description      This function is called to initialize RFCOMM layer
diff --git a/system/stack/rfcomm/port_api.cc b/system/stack/rfcomm/port_api.cc
index 0bb817d..f2b9583 100644
--- a/system/stack/rfcomm/port_api.cc
+++ b/system/stack/rfcomm/port_api.cc
@@ -31,8 +31,6 @@
 #include "osi/include/mutex.h"
 
 #include "bt_common.h"
-#include "btm_api.h"
-#include "btm_int.h"
 #include "l2c_api.h"
 #include "port_api.h"
 #include "port_int.h"
@@ -40,17 +38,8 @@
 #include "rfcdefs.h"
 #include "sdp_api.h"
 
-/* duration of break in 200ms units */
-#define PORT_BREAK_DURATION 1
-
-#define info(fmt, ...) LOG_INFO(LOG_TAG, "%s: " fmt, __func__, ##__VA_ARGS__)
-#define debug(fmt, ...) LOG_DEBUG(LOG_TAG, "%s: " fmt, __func__, ##__VA_ARGS__)
 #define error(fmt, ...) \
   LOG_ERROR(LOG_TAG, "## ERROR : %s: " fmt "##", __func__, ##__VA_ARGS__)
-#define asrt(s)                                                            \
-  if (!(s))                                                                \
-  LOG_ERROR(LOG_TAG, "## %s assert %s failed at line:%d ##", __func__, #s, \
-            __LINE__)
 
 /* Mapping from PORT_* result codes to human readable strings. */
 static const char* result_code_strings[] = {"Success",
@@ -368,40 +357,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_SetDataCallback
- *
- * Description      This function is when a data packet is received
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  p_callback - address of the callback function which should
- *                               be called from the RFCOMM when data packet
- *                               is received.
- *
- *
- ******************************************************************************/
-int PORT_SetDataCallback(uint16_t port_handle, tPORT_DATA_CALLBACK* p_port_cb) {
-  tPORT* p_port;
-
-  RFCOMM_TRACE_API("PORT_SetDataCallback() handle:%d cb 0x%x", port_handle,
-                   p_port_cb);
-
-  /* Check if handle is valid to avoid crashing */
-  if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-
-  p_port = &rfc_cb.port.port[port_handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  p_port->p_data_callback = p_port_cb;
-
-  return (PORT_SUCCESS);
-}
-/*******************************************************************************
- *
  * Function         PORT_SetCODataCallback
  *
  * Description      This function is when a data packet is received
@@ -602,45 +557,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_GetRxQueueCnt
- *
- * Description      This function return number of buffers on the rx queue.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  p_rx_queue_count - Pointer to return queue count in.
- *
- ******************************************************************************/
-int PORT_GetRxQueueCnt(uint16_t handle, uint16_t* p_rx_queue_count) {
-  tPORT* p_port;
-
-  RFCOMM_TRACE_API("PORT_GetRxQueueCnt() handle:%d", handle);
-
-  /* Check if handle is valid to avoid crashing */
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  if (p_port->line_status) {
-    return (PORT_LINE_ERR);
-  }
-
-  *p_rx_queue_count = p_port->rx.queue_size;
-
-  RFCOMM_TRACE_API(
-      "PORT_GetRxQueueCnt() p_rx_queue_count:%d, p_port->rx.queue.count = %d",
-      *p_rx_queue_count, p_port->rx.queue_size);
-
-  return (PORT_SUCCESS);
-}
-
-/*******************************************************************************
- *
  * Function         PORT_GetState
  *
  * Description      This function is called to fill tPORT_STATE structure
@@ -677,153 +593,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_Control
- *
- * Description      This function directs a specified connection to pass control
- *                  control information to the peer device.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  signal     = specify the function to be passed
- *
- ******************************************************************************/
-int PORT_Control(uint16_t handle, uint8_t signal) {
-  tPORT* p_port;
-  uint8_t old_modem_signal;
-
-  RFCOMM_TRACE_API("PORT_Control() handle:%d signal:0x%x", handle, signal);
-
-  /* Check if handle is valid to avoid crashing */
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  old_modem_signal = p_port->local_ctrl.modem_signal;
-  p_port->local_ctrl.break_signal = 0;
-
-  switch (signal) {
-    case PORT_SET_CTSRTS:
-      p_port->local_ctrl.modem_signal |= PORT_CTSRTS_ON;
-      break;
-
-    case PORT_CLR_CTSRTS:
-      p_port->local_ctrl.modem_signal &= ~PORT_CTSRTS_ON;
-      break;
-
-    case PORT_SET_DTRDSR:
-      p_port->local_ctrl.modem_signal |= PORT_DTRDSR_ON;
-      break;
-
-    case PORT_CLR_DTRDSR:
-      p_port->local_ctrl.modem_signal &= ~PORT_DTRDSR_ON;
-      break;
-
-    case PORT_SET_RI:
-      p_port->local_ctrl.modem_signal |= PORT_RING_ON;
-      break;
-
-    case PORT_CLR_RI:
-      p_port->local_ctrl.modem_signal &= ~PORT_RING_ON;
-      break;
-
-    case PORT_SET_DCD:
-      p_port->local_ctrl.modem_signal |= PORT_DCD_ON;
-      break;
-
-    case PORT_CLR_DCD:
-      p_port->local_ctrl.modem_signal &= ~PORT_DCD_ON;
-      break;
-  }
-
-  if (signal == PORT_BREAK)
-    p_port->local_ctrl.break_signal = PORT_BREAK_DURATION;
-  else if (p_port->local_ctrl.modem_signal == old_modem_signal)
-    return (PORT_SUCCESS);
-
-  port_start_control(p_port);
-
-  RFCOMM_TRACE_EVENT(
-      "PORT_Control DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d",
-      ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0),
-      ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0),
-      ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0),
-      ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_DCD) ? 1 : 0));
-
-  return (PORT_SUCCESS);
-}
-
-/*******************************************************************************
- *
- * Function         PORT_FlowControl
- *
- * Description      This function directs a specified connection to pass
- *                  flow control message to the peer device.  Enable flag passed
- *                  shows if port can accept more data.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  enable     - enables data flow
- *
- ******************************************************************************/
-int PORT_FlowControl(uint16_t handle, bool enable) {
-  tPORT* p_port;
-  bool old_fc;
-  uint32_t events;
-
-  RFCOMM_TRACE_API("PORT_FlowControl() handle:%d enable: %d", handle, enable);
-
-  /* Check if handle is valid to avoid crashing */
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  if (!p_port->rfc.p_mcb) {
-    return (PORT_NOT_OPENED);
-  }
-
-  p_port->rx.user_fc = !enable;
-
-  if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) {
-    if (!p_port->rx.user_fc) {
-      port_flow_control_peer(p_port, true, 0);
-    }
-  } else {
-    old_fc = p_port->local_ctrl.fc;
-
-    /* FC is set if user is set or peer is set */
-    p_port->local_ctrl.fc = (p_port->rx.user_fc | p_port->rx.peer_fc);
-
-    if (p_port->local_ctrl.fc != old_fc) port_start_control(p_port);
-  }
-
-  /* Need to take care of the case when we could not deliver events */
-  /* to the application because we were flow controlled */
-  if (enable && (p_port->rx.queue_size != 0)) {
-    events = PORT_EV_RXCHAR;
-    if (p_port->rx_flag_ev_pending) {
-      p_port->rx_flag_ev_pending = false;
-      events |= PORT_EV_RXFLAG;
-    }
-
-    events &= p_port->ev_mask;
-    if (p_port->p_callback && events) {
-      p_port->p_callback(events, p_port->handle);
-    }
-  }
-  return (PORT_SUCCESS);
-}
-/*******************************************************************************
- *
  * Function         PORT_FlowControl_MaxCredit
  *
  * Description      This function directs a specified connection to pass
@@ -892,230 +661,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_GetModemStatus
- *
- * Description      This function retrieves modem control signals.  Normally
- *                  application will call this function after a callback
- *                  function is called with notification that one of signals
- *                  has been changed.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  p_signal   - specify the pointer to control signals info
- *
- ******************************************************************************/
-int PORT_GetModemStatus(uint16_t handle, uint8_t* p_signal) {
-  tPORT* p_port;
-
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  *p_signal = p_port->peer_ctrl.modem_signal;
-
-  RFCOMM_TRACE_API("PORT_GetModemStatus() handle:%d signal:%x", handle,
-                   *p_signal);
-
-  return (PORT_SUCCESS);
-}
-
-/*******************************************************************************
- *
- * Function         PORT_ClearError
- *
- * Description      This function retreives information about a communications
- *                  error and reports current status of a connection.  The
- *                  function should be called when an error occures to clear
- *                  the connection error flag and to enable additional read
- *                  and write operations.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  p_errors   - pointer of the variable to receive error codes
- *                  p_status   - pointer to the tPORT_STATUS structur to receive
- *                               connection status
- *
- ******************************************************************************/
-int PORT_ClearError(uint16_t handle, uint16_t* p_errors,
-                    tPORT_STATUS* p_status) {
-  tPORT* p_port;
-
-  RFCOMM_TRACE_API("PORT_ClearError() handle:%d", handle);
-
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  *p_errors = p_port->line_status;
-
-  /* This is the only call to clear error status.  We can not clear */
-  /* connection failed status.  To clean it port should be closed and reopened
-   */
-  p_port->line_status = (p_port->line_status & LINE_STATUS_FAILED);
-
-  PORT_GetQueueStatus(handle, p_status);
-  return (PORT_SUCCESS);
-}
-
-/*******************************************************************************
- *
- * Function         PORT_SendError
- *
- * Description      This function send a communications error to the peer device
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  errors     - receive error codes
- *
- ******************************************************************************/
-int PORT_SendError(uint16_t handle, uint8_t errors) {
-  tPORT* p_port;
-
-  RFCOMM_TRACE_API("PORT_SendError() handle:%d errors:0x%x", handle, errors);
-
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  if (!p_port->rfc.p_mcb) {
-    return (PORT_NOT_OPENED);
-  }
-
-  RFCOMM_LineStatusReq(p_port->rfc.p_mcb, p_port->dlci, errors);
-  return (PORT_SUCCESS);
-}
-
-/*******************************************************************************
- *
- * Function         PORT_GetQueueStatus
- *
- * Description      This function reports current status of a connection.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  p_status   - pointer to the tPORT_STATUS structur to receive
- *                               connection status
- *
- ******************************************************************************/
-int PORT_GetQueueStatus(uint16_t handle, tPORT_STATUS* p_status) {
-  tPORT* p_port;
-
-  /* RFCOMM_TRACE_API ("PORT_GetQueueStatus() handle:%d", handle); */
-
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  p_status->in_queue_size = (uint16_t)p_port->rx.queue_size;
-  p_status->out_queue_size = (uint16_t)p_port->tx.queue_size;
-
-  p_status->mtu_size = (uint16_t)p_port->peer_mtu;
-
-  p_status->flags = 0;
-
-  if (!(p_port->peer_ctrl.modem_signal & PORT_CTSRTS_ON))
-    p_status->flags |= PORT_FLAG_CTS_HOLD;
-
-  if (!(p_port->peer_ctrl.modem_signal & PORT_DTRDSR_ON))
-    p_status->flags |= PORT_FLAG_DSR_HOLD;
-
-  if (!(p_port->peer_ctrl.modem_signal & PORT_DCD_ON))
-    p_status->flags |= PORT_FLAG_RLSD_HOLD;
-
-  return (PORT_SUCCESS);
-}
-
-/*******************************************************************************
- *
- * Function         PORT_Purge
- *
- * Description      This function discards all the data from the output or
- *                  input queues of the specified connection.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  purge_flags - specify the action to take.
- *
- ******************************************************************************/
-int PORT_Purge(uint16_t handle, uint8_t purge_flags) {
-  tPORT* p_port;
-  BT_HDR* p_buf;
-  uint16_t count;
-  uint32_t events;
-
-  RFCOMM_TRACE_API("PORT_Purge() handle:%d flags:0x%x", handle, purge_flags);
-
-  /* Check if handle is valid to avoid crashing */
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  if (purge_flags & PORT_PURGE_RXCLEAR) {
-    mutex_global_lock(); /* to prevent missing credit */
-
-    count = fixed_queue_length(p_port->rx.queue);
-
-    while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_port->rx.queue)) != NULL)
-      osi_free(p_buf);
-
-    p_port->rx.queue_size = 0;
-
-    mutex_global_unlock();
-
-    /* If we flowed controlled peer based on rx_queue size enable data again */
-    if (count) port_flow_control_peer(p_port, true, count);
-  }
-
-  if (purge_flags & PORT_PURGE_TXCLEAR) {
-    mutex_global_lock(); /* to prevent tx.queue_size from being negative */
-
-    while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_port->tx.queue)) != NULL)
-      osi_free(p_buf);
-
-    p_port->tx.queue_size = 0;
-
-    mutex_global_unlock();
-
-    events = PORT_EV_TXEMPTY;
-
-    events |= port_flow_control_user(p_port);
-
-    events &= p_port->ev_mask;
-
-    if ((p_port->p_callback != NULL) && events)
-      (p_port->p_callback)(events, p_port->handle);
-  }
-
-  return (PORT_SUCCESS);
-}
-
-/*******************************************************************************
- *
  * Function         PORT_ReadData
  *
  * Description      Normally not GKI aware application will call this function
@@ -1214,56 +759,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_Read
- *
- * Description      Normally application will call this function after receiving
- *                  PORT_EV_RXCHAR event.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  pp_buf      - pointer to address of buffer with data,
- *
- ******************************************************************************/
-int PORT_Read(uint16_t handle, BT_HDR** pp_buf) {
-  tPORT* p_port;
-  BT_HDR* p_buf;
-
-  RFCOMM_TRACE_API("PORT_Read() handle:%d", handle);
-
-  /* Check if handle is valid to avoid crashing */
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  if (p_port->line_status) {
-    return (PORT_LINE_ERR);
-  }
-
-  mutex_global_lock();
-
-  p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_port->rx.queue);
-  if (p_buf) {
-    p_port->rx.queue_size -= p_buf->len;
-
-    mutex_global_unlock();
-
-    /* If rfcomm suspended traffic from the peer based on the rx_queue_size */
-    /* check if it can be resumed now */
-    port_flow_control_peer(p_port, true, 1);
-  } else {
-    mutex_global_unlock();
-  }
-
-  *pp_buf = p_buf;
-  return (PORT_SUCCESS);
-}
-
-/*******************************************************************************
- *
  * Function         port_write
  *
  * Description      This function when a data packet is received from the apper
@@ -1322,64 +817,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_Write
- *
- * Description      This function when a data packet is received from the apper
- *                  layer task.
- *
- * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
- *                  pp_buf      - pointer to address of buffer with data,
- *
- ******************************************************************************/
-int PORT_Write(uint16_t handle, BT_HDR* p_buf) {
-  tPORT* p_port;
-  uint32_t event = 0;
-  int rc;
-
-  RFCOMM_TRACE_API("PORT_Write() handle:%d", handle);
-
-  /* Check if handle is valid to avoid crashing */
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    osi_free(p_buf);
-    return (PORT_BAD_HANDLE);
-  }
-
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    osi_free(p_buf);
-    return (PORT_NOT_OPENED);
-  }
-
-  if (p_port->line_status) {
-    RFCOMM_TRACE_WARNING("PORT_Write: Data dropped line_status:0x%x",
-                         p_port->line_status);
-    osi_free(p_buf);
-    return (PORT_LINE_ERR);
-  }
-
-  rc = port_write(p_port, p_buf);
-  event |= port_flow_control_user(p_port);
-
-  switch (rc) {
-    case PORT_TX_FULL:
-      event |= PORT_EV_ERR;
-      break;
-
-    case PORT_SUCCESS:
-      event |= (PORT_EV_TXCHAR | PORT_EV_TXEMPTY);
-      break;
-  }
-  /* Mask out all events that are not of interest to user */
-  event &= p_port->ev_mask;
-
-  /* Send event to the application */
-  if (p_port->p_callback && event) (p_port->p_callback)(event, p_port->handle);
-
-  return (PORT_SUCCESS);
-}
-/*******************************************************************************
- *
  * Function         PORT_WriteDataCO
  *
  * Description      Normally not GKI aware application will call this function
@@ -1647,46 +1084,6 @@
 
 /*******************************************************************************
  *
- * Function         PORT_Test
- *
- * Description      Application can call this function to send RFCOMM Test frame
- *
- * Parameters:      handle      - Handle returned in the RFCOMM_CreateConnection
- *                  p_data      - Data area
- *                  max_len     - Byte count requested
- *
- ******************************************************************************/
-int PORT_Test(uint16_t handle, uint8_t* p_data, uint16_t len) {
-  tPORT* p_port;
-
-  RFCOMM_TRACE_API("PORT_Test() len:%d", len);
-
-  if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
-    return (PORT_BAD_HANDLE);
-  }
-  p_port = &rfc_cb.port.port[handle - 1];
-
-  if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
-    return (PORT_NOT_OPENED);
-  }
-
-  if (len > ((p_port->mtu == 0) ? RFCOMM_DEFAULT_MTU : p_port->mtu)) {
-    return (PORT_UNKNOWN_ERROR);
-  }
-
-  BT_HDR* p_buf = (BT_HDR*)osi_malloc(RFCOMM_CMD_BUF_SIZE);
-  p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET + 2;
-  p_buf->len = len;
-
-  memcpy((uint8_t*)(p_buf + 1) + p_buf->offset, p_data, p_buf->len);
-
-  rfc_send_test(p_port->rfc.p_mcb, true, p_buf);
-
-  return (PORT_SUCCESS);
-}
-
-/*******************************************************************************
- *
  * Function         RFCOMM_Init
  *
  * Description      This function is called to initialize RFCOMM layer
diff --git a/system/stack/rfcomm/port_int.h b/system/stack/rfcomm/port_int.h
index ecd8fbc..01eb95f 100644
--- a/system/stack/rfcomm/port_int.h
+++ b/system/stack/rfcomm/port_int.h
@@ -32,17 +32,6 @@
 #include "port_api.h"
 #include "rfcdefs.h"
 
-/* Local events passed when application event is sent from the api to PORT */
-/* ???*/
-#define PORT_EVENT_OPEN (1 | BT_EVT_TO_BTU_SP_EVT)
-#define PORT_EVENT_CONTROL (2 | BT_EVT_TO_BTU_SP_EVT)
-#define PORT_EVENT_SET_STATE (3 | BT_EVT_TO_BTU_SP_EVT)
-#define PORT_EVENT_SET_CALLBACK (5 | BT_EVT_TO_BTU_SP_EVT)
-#define PORT_EVENT_WRITE (6 | BT_EVT_TO_BTU_SP_EVT)
-#define PORT_EVENT_PURGE (7 | BT_EVT_TO_BTU_SP_EVT)
-#define PORT_EVENT_SEND_ERROR (8 | BT_EVT_TO_BTU_SP_EVT)
-#define PORT_EVENT_FLOW_CONTROL (9 | BT_EVT_TO_BTU_SP_EVT)
-
 /*
  * Flow control configuration values for the mux
 */
@@ -114,12 +103,6 @@
  * RFCOMM Port Connection Control Block
 */
 typedef struct {
-#define RFC_PORT_STATE_IDLE 0
-#define RFC_PORT_STATE_WAIT_START 1
-#define RFC_PORT_STATE_OPENING 2
-#define RFC_PORT_STATE_OPENED 3
-#define RFC_PORT_STATE_CLOSING 4
-
   uint8_t state; /* Current state of the connection */
 
 #define RFC_RSP_PN 0x01
