diff --git a/cores/esp32/esp32-hal-bt.c b/cores/esp32/esp32-hal-bt.c
index f6b174e4203..2554698606e 100644
--- a/cores/esp32/esp32-hal-bt.c
+++ b/cores/esp32/esp32-hal-bt.c
@@ -38,18 +38,48 @@ bool btStarted(){
     return (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED);
 }
 
-bool btStart(){
+bool btStart() {
+    return btStartMode(BT_MODE);
+}
+
+bool btStartMode(bt_mode mode){
+    esp_bt_mode_t esp_bt_mode;
     esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
+#if CONFIG_IDF_TARGET_ESP32
+    switch(mode) {
+        case BT_MODE_BLE: esp_bt_mode=ESP_BT_MODE_BLE;
+        break;
+        case BT_MODE_CLASSIC_BT: esp_bt_mode=ESP_BT_MODE_CLASSIC_BT;
+        break;
+        case BT_MODE_BTDM: esp_bt_mode=ESP_BT_MODE_BTDM;
+        break;
+        default: esp_bt_mode=BT_MODE;
+        break;
+    }
+    // esp_bt_controller_enable(MODE) This mode must be equal as the mode in “cfg” of esp_bt_controller_init().
+    cfg.mode=esp_bt_mode;
+    if(cfg.mode == ESP_BT_MODE_CLASSIC_BT) {
+        esp_bt_controller_mem_release(ESP_BT_MODE_BLE);
+    }
+#else
+// other esp variants dont support BT-classic / DM.
+    esp_bt_mode=BT_MODE;
+#endif
+
     if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED){
         return true;
     }
+    esp_err_t ret;
     if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE){
-        esp_bt_controller_init(&cfg);
+        if((ret = esp_bt_controller_init(&cfg)) != ESP_OK) {
+            log_e("initialize controller failed: %s", esp_err_to_name(ret));
+            return false;
+        }
         while(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE){}
     }
     if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED){
-        if (esp_bt_controller_enable(BT_MODE)) {
-            log_e("BT Enable failed");
+        if((ret = esp_bt_controller_enable(esp_bt_mode)) != ESP_OK) {
+            log_e("BT Enable mode=%d failed %s", BT_MODE, esp_err_to_name(ret));
             return false;
         }
     }
diff --git a/cores/esp32/esp32-hal-bt.h b/cores/esp32/esp32-hal-bt.h
index 9758e8ab1fc..00fac100a80 100644
--- a/cores/esp32/esp32-hal-bt.h
+++ b/cores/esp32/esp32-hal-bt.h
@@ -24,8 +24,11 @@
 extern "C" {
 #endif
 
+typedef enum {BT_MODE_DEFAULT, BT_MODE_BLE, BT_MODE_CLASSIC_BT, BT_MODE_BTDM } bt_mode;
+
 bool btStarted();
 bool btStart();
+bool btStartMode(bt_mode mode);
 bool btStop();
 
 #ifdef __cplusplus
diff --git a/libraries/BluetoothSerial/src/BluetoothSerial.cpp b/libraries/BluetoothSerial/src/BluetoothSerial.cpp
index e80d7194e2d..8bdf7657ae4 100644
--- a/libraries/BluetoothSerial/src/BluetoothSerial.cpp
+++ b/libraries/BluetoothSerial/src/BluetoothSerial.cpp
@@ -626,7 +626,7 @@ static void esp_bt_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *pa
     }
 }
 
-static bool _init_bt(const char *deviceName)
+static bool _init_bt(const char *deviceName, bt_mode mode)
 {
     if(!_bt_event_group){
         _bt_event_group = xEventGroupCreate();
@@ -678,7 +678,7 @@ static bool _init_bt(const char *deviceName)
         }
     }
 
-    if (!btStarted() && !btStart()){
+    if (!btStarted() && !btStartMode(mode)){
         log_e("initialize controller failed");
         return false;
     }
@@ -815,11 +815,10 @@ static bool waitForSDPRecord(int timeout) {
     return (xEventGroupWaitBits(_bt_event_group, BT_SDP_COMPLETED, pdFALSE, pdTRUE, xTicksToWait) & BT_SDP_COMPLETED) != 0;
 }
 
-/*
+/**
  * Serial Bluetooth Arduino
  *
- * */
-
+ */
 BluetoothSerial::BluetoothSerial()
 {
     local_name = "ESP32"; //default bluetooth name
@@ -831,15 +830,16 @@ BluetoothSerial::~BluetoothSerial(void)
 }
 
 /**
- * @Param isMaster set to true if you want to connect to an other device
+ * @param isMaster set to true if you want to connect to an other device
+ * @param disableBLE if BLE is not used, its ram can be freed to get +10kB free ram
  */
-bool BluetoothSerial::begin(String localName, bool isMaster)
+bool BluetoothSerial::begin(String localName, bool isMaster, bool disableBLE)
 {
     _isMaster = isMaster;
     if (localName.length()){
         local_name = localName;
     }
-    return _init_bt(local_name.c_str());
+    return _init_bt(local_name.c_str(), disableBLE ? BT_MODE_CLASSIC_BT : BT_MODE_BTDM);
 }
 
 int BluetoothSerial::available(void)
@@ -910,6 +910,14 @@ void BluetoothSerial::end()
     _stop_bt();
 }
 
+/**
+ * free additional ~30kB ram, reset is required to enable BT again
+ */
+void BluetoothSerial::memrelease()
+{
+    esp_bt_mem_release(ESP_BT_MODE_BTDM);
+}
+
 #ifdef CONFIG_BT_SSP_ENABLED
 void BluetoothSerial::onConfirmRequest(ConfirmRequestCb cb)
 {
@@ -1026,11 +1034,13 @@ bool BluetoothSerial::connect(String remoteName)
 }
 
 /**
- * @Param channel: specify channel or 0 for auto-detect
- * @Param sec_mask:
+ * Connect to an other bluetooth device
+ *
+ * @param channel specify channel or 0 for auto-detect
+ * @param sec_mask
  *           ESP_SPP_SEC_ENCRYPT|ESP_SPP_SEC_AUTHENTICATE
  *           ESP_SPP_SEC_NONE
- * @Param role:
+ * @param role
  *           ESP_SPP_ROLE_MASTER   master can handle up to 7 connections to slaves
  *           ESP_SPP_ROLE_SLAVE    can only have one connection to a master
  */
diff --git a/libraries/BluetoothSerial/src/BluetoothSerial.h b/libraries/BluetoothSerial/src/BluetoothSerial.h
index a446ee557e4..574b96af089 100644
--- a/libraries/BluetoothSerial/src/BluetoothSerial.h
+++ b/libraries/BluetoothSerial/src/BluetoothSerial.h
@@ -42,7 +42,7 @@ class BluetoothSerial: public Stream
         BluetoothSerial(void);
         ~BluetoothSerial(void);
 
-        bool begin(String localName=String(), bool isMaster=false);
+        bool begin(String localName=String(), bool isMaster=false, bool disableBLE=false);
         bool begin(unsigned long baud){//compatibility
             return begin();
         }
@@ -54,6 +54,7 @@ class BluetoothSerial: public Stream
         size_t write(const uint8_t *buffer, size_t size);
         void flush();
         void end(void);
+        void memrelease();
         void setTimeout(int timeoutMS);
         void onData(BluetoothSerialDataCb cb);
         esp_err_t register_callback(esp_spp_cb_t * callback);