 // Spin if the expression is not true
 #define SIMPLEPERIPHERAL_ASSERT(expr) if (!(expr)) simple_peripheral_spin();
 
+// Hard coded PSM for passing data between central and peripheral
+#define SBP_PSM             0x0080
+
 /*********************************************************************
  * TYPEDEFS
  */
@@ -325,6 +328,9 @@ static GAP_Addr_Modes_t addrMode = DEFAULT_ADDRESS_MODE;
 // Current Random Private Address
 static uint8 rpa[B_ADDR_LEN] = {0};
 
+// Unique CoC CID
+uint16_t cocCID;
+
 /*********************************************************************
  * LOCAL FUNCTIONS
  */
@@ -375,6 +381,10 @@ void simple_peripheral_handleNPIRxInterceptEvent(uint8_t *pMsg);  // Declaration
 static void simple_peripheral_sendToNPI(uint8_t *buf, uint16_t len);  // Declaration
 #endif // PTM_MODE
 
+static uint8_t SimplePeripheral_processL2CAPMsg(l2capSignalEvent_t *pMsg);
+static void SimplePeripheral_processL2CAPDataEvent(l2capDataEvent_t *pMsg);
+static void SimplePeripheral_sendL2CAPData(uint8_t *params, uint16_t paramLen);
+
 /*********************************************************************
  * EXTERN FUNCTIONS
  */
@@ -548,6 +558,25 @@ static void SimplePeripheral_init(void)
   DevInfo_AddService();                        // Device Information Service
   SimpleProfile_AddService(GATT_ALL_SERVICES); // Simple GATT Profile
 
+  l2capPsm_t psm;
+
+  psm.psm = SBP_PSM; // connHandle is PSM here
+  psm.mtu = MAX_PDU_SIZE;
+  psm.initPeerCredits = 0xFFFF;
+  psm.peerCreditThreshold = 0;
+  psm.maxNumChannels = 1;
+  psm.pfnVerifySecCB = NULL;
+  // Need to translate ICall task entity to OSAL for registration with stack
+  psm.taskId = ICall_getLocalMsgEntityId(ICALL_SERVICE_CLASS_BLE_MSG, selfEntity);
+
+  bStatus_t registerStat = L2CAP_RegisterPsm(&psm);
+
+  if(registerStat != SUCCESS)
+  {
+    Display_printf(dispHandle, 8, 0, "Failed to register PSM with stat: %d",
+                    registerStat);
+  }
+
   // Setup the SimpleProfile Characteristic Values
   // For more information, see the GATT and GATTServApp sections in the User's Guide:
   // http://software-dl.ti.com/lprf/ble5stack-latest/
@@ -638,6 +667,10 @@ static void SimplePeripheral_init(void)
   // Inform Stack to Initialize PTM
   HCI_EXT_EnablePTMCmd();
 #endif // PTM_MODE
+
+  // Register for L2CAP Flow Control Events
+  L2CAP_RegisterFlowCtrlTask(selfEntity);
+
 }
 
 /*********************************************************************
@@ -823,6 +856,16 @@ static uint8_t SimplePeripheral_processStackMsg(ICall_Hdr *pMsg)
       break;
     }
 
+    case L2CAP_SIGNAL_EVENT:
+      // Process L2CAP signal
+      safeToDealloc = SimplePeripheral_processL2CAPMsg((l2capSignalEvent_t *)pMsg);
+      break;
+
+    case L2CAP_DATA_EVENT:
+      // Process L2CAP data
+      SimplePeripheral_processL2CAPDataEvent((l2capDataEvent_t *)pMsg);
+      break;
+
     default:
       // do nothing
       break;
@@ -1343,6 +1386,10 @@ static void SimplePeripheral_performPeriodicTask(void)
     SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR4, sizeof(uint8_t),
                                &valueToCopy);
   }
+
+  static uint32_t l2capCounter = 0;
+  SimplePeripheral_sendL2CAPData((uint8_t *)(&l2capCounter), sizeof(l2capCounter));
+  l2capCounter++;
 }
 
 /*********************************************************************
@@ -2547,5 +2594,107 @@ static void SimplePeripheral_menuSwitchCb(tbmMenuObj_t* pMenuObjCurr,
     Display_clearLine(dispHandle, SP_ROW_CONNECTION);
   }
 }
+
+/*********************************************************************
+ * @fn      SimplePeripheral_processL2CAPMsg
+ *
+ * @brief   Process L2CAP messages and events.
+ *
+ * @return  TRUE if safe to deallocate incoming message, FALSE otherwise.
+ */
+static uint8_t SimplePeripheral_processL2CAPMsg(l2capSignalEvent_t *pMsg)
+{
+  uint8_t safeToDealloc = TRUE;
+
+  switch (pMsg->opcode)
+  {
+      case L2CAP_CHANNEL_ESTABLISHED_EVT:
+      {
+        l2capChannelEstEvt_t *pEstEvt = &(pMsg->cmd.channelEstEvt);
+
+        cocCID = pEstEvt->CID;
+
+        // Give max credits to the other side
+        L2CAP_FlowCtrlCredit(pEstEvt->CID, 0xFFFF);
+      }
+      break;
+
+      case L2CAP_SEND_SDU_DONE_EVT:
+      {
+          if (pMsg->hdr.status == SUCCESS)
+          {
+            // Handle Success
+            Display_printf(dispHandle, 16, 0, "SDU sent");
+          }
+          else
+          {
+            // Handle fail
+            Display_printf(dispHandle, 16, 0, "SDU send failed");
+          }
+      }
+      break;
+  }
+
+  return (safeToDealloc);
+}
+
+/*********************************************************************
+ * @fn      SimplePeripheral_processL2CAPDataEvent
+ *
+ * @brief   Handles incoming L2CAP data
+ *
+ * @param   pMsg - pointer to the signal that was received
+ *
+ * @return  none
+ */
+static void SimplePeripheral_processL2CAPDataEvent(l2capDataEvent_t *pMsg)
+{
+  // This application doesn't care about other L2CAP data events other than CoC
+  // It is possible to expand this function to support multiple COC CID's
+  if (pMsg->pkt.CID == cocCID)
+  {
+
+    // Clear RX data lines before printing
+    Display_clearLines(dispHandle, 7,9);
+
+    uint32_t rxDataCtr = BUILD_UINT32(pMsg->pkt.pPayload[0],
+                                      pMsg->pkt.pPayload[1],
+                                      pMsg->pkt.pPayload[2],
+                                      pMsg->pkt.pPayload[3]);
+
+    // Process data
+    Display_printf(dispHandle, 15, 0, "L2CAP RX: %d", rxDataCtr);
+  }
+}
+
+/*********************************************************************
+ * @fn      SimplePeripheral_sendL2CAPData
+ *
+ * @brief   Send L2CAP data to the peer
+ *
+ * @param   params - data to send
+ * @param   paramLen - len of data
+ *
+ * @return  none
+ */
+static void SimplePeripheral_sendL2CAPData(uint8_t *params, uint16_t paramLen)
+{
+  l2capPacket_t pkt;
+  bStatus_t stat;
+
+  if (cocCID)
+  {
+    pkt.CID = cocCID;
+    pkt.pPayload = params;
+    pkt.len = paramLen;
+
+    stat = L2CAP_SendSDU(&pkt);
+    if(stat != SUCCESS)
+    {
+      Display_printf(dispHandle, 17, 0, "L2CAP Data send error: %d", stat);
+    }
+  }
+}
+
 /*********************************************************************
 *********************************************************************/
