diff --git a/src/avrdude.conf.in b/src/avrdude.conf.in
index 1152af77..6e9df324 100644
--- a/src/avrdude.conf.in
+++ b/src/avrdude.conf.in
@@ -1458,6 +1458,38 @@ programmer
     usbpid                 = 0x0c9f;
 ;
 
+#------------------------------------------------------------
+# arduino_gemma
+#------------------------------------------------------------
+
+# https://github.com/arduino/ArduinoCore-avr/tree/master/bootloaders/gemma
+
+programmer
+    id                     = "arduino_gemma";
+    desc                   = "Arduino Gemma bootloader disguised as USBtiny";
+    type                   = "usbtiny";
+    prog_modes             = PM_SPM;
+    connection_type        = usb;
+    usbvid                 = 0x2341;
+    usbpid                 = 0x0c9f;
+;
+
+#------------------------------------------------------------
+# adafruit_gemma
+#------------------------------------------------------------
+
+# https://github.com/adafruit/Adafruit-Trinket-Gemma-Bootloader
+
+programmer
+    id                     = "adafruit_gemma";
+    desc                   = "Adafruit Trinket Gemma bootloader disguised as USBtiny";
+    type                   = "usbtiny";
+    prog_modes             = PM_SPM;
+    connection_type        = usb;
+    usbvid                 = 0x1781;
+    usbpid                 = 0x0c9f;
+;
+
 #------------------------------------------------------------
 # arduinoisp
 #------------------------------------------------------------
diff --git a/src/usbtiny.c b/src/usbtiny.c
index 2e319318..7153ede9 100644
--- a/src/usbtiny.c
+++ b/src/usbtiny.c
@@ -618,7 +618,13 @@ static int usbtiny_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
   if (! usbtiny_avr_op( pgm, p, AVR_OP_CHIP_ERASE, res )) {
     return -1;
   }
-  usleep( p->chip_erase_delay );
+
+  if(pgm->prog_modes & PM_SPM) { // Talking to bootloader directly
+    AVRMEM *fl = avr_locate_mem(p, "flash");
+    // Estimated time it takes to erase all pages in bootloader
+    usleep(p->chip_erase_delay * (fl? fl->num_pages: 999));
+  } else
+    usleep(p->chip_erase_delay);
 
   // prepare for further instruction
   pgm->initialize(pgm, p);