diff --git a/epicardium/ble/epic_ble_api.c b/epicardium/ble/epic_ble_api.c
index 13f6a3e1baf524017321348aa2027ef5cbba80e0..3b39a7c0a9fefbd86f8f5b26f710dcc8e8a45739 100644
--- a/epicardium/ble/epic_ble_api.c
+++ b/epicardium/ble/epic_ble_api.c
@@ -26,6 +26,8 @@ static uint8_t adv_data_buf[HCI_ADV_DATA_LEN];
 static uint8_t sr_data_buf[HCI_ADV_DATA_LEN];
 static dmEvt_t connection_open_event;
 
+static bool connection_open;
+
 int epic_ble_free_event(struct epic_ble_event *e)
 {
 	if (e->data) {
@@ -46,6 +48,25 @@ void ble_epic_ble_api_trigger_event(enum epic_ble_event_type type, void *data)
 
 	struct epic_ble_event e = { .type = type, .data = data };
 
+	if (type == BLE_EVENT_DM_EVENT) {
+		dmEvt_t *dm_event = data;
+		if (dm_event->hdr.event == DM_CONN_OPEN_IND) {
+			connection_open = true;
+		}
+
+		if (dm_event->hdr.event == DM_CONN_CLOSE_IND) {
+			connection_open = false;
+		}
+	}
+
+	if (!connection_open &&
+	    (type == BLE_EVENT_ATT_EVENT || type == BLE_EVENT_DM_EVENT)) {
+		// Don't forward DM and ATT events until epicardium is done setting up
+		// the connection
+		epic_ble_free_event(&e);
+		return;
+	}
+
 	if (enabled) {
 		if (xQueueSend(ble_event_queue, &e, 0) != pdTRUE) {
 			/* Print a warning if the app is missing events. Missing scan results