diff --git a/src/CHANGES.md b/src/CHANGES.md
index a1b23dbc..3002ed7c 100644
--- a/src/CHANGES.md
+++ b/src/CHANGES.md
@@ -1,5 +1,8 @@
 # Development Changes
 
+## 0.8.122 - 2024-05-23
+* add button for donwloading coredump
+
 ## 0.8.121 - 2024-05-20
 * fix ESP32 factory image generation
 * fix plot of history graph #1635
diff --git a/src/defines.h b/src/defines.h
index a83d4e89..c0664b7d 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -13,7 +13,7 @@
 //-------------------------------------
 #define VERSION_MAJOR       0
 #define VERSION_MINOR       8
-#define VERSION_PATCH       121
+#define VERSION_PATCH       122
 //-------------------------------------
 typedef struct {
     uint8_t ch;
diff --git a/src/web/RestApi.h b/src/web/RestApi.h
index eaa18a0f..e810a5cb 100644
--- a/src/web/RestApi.h
+++ b/src/web/RestApi.h
@@ -55,6 +55,7 @@ class RestApi {
             mSrv->on("/api", HTTP_GET,  std::bind(&RestApi::onApi,         this, std::placeholders::_1));
 
             mSrv->on("/get_setup", HTTP_GET,  std::bind(&RestApi::onDwnldSetup, this, std::placeholders::_1));
+            mSrv->on("/coredump", HTTP_GET,  std::bind(&RestApi::getCoreDump, this, std::placeholders::_1));
         }
 
         uint32_t getTimezoneOffset(void) {
@@ -348,6 +349,33 @@ class RestApi {
             fp.close();
         }
 
+        void getCoreDump(AsyncWebServerRequest *request) {
+            const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_COREDUMP, "coredump");
+            if (partition != NULL) {
+                size_t size = partition->size;
+
+                AsyncWebServerResponse *response = request->beginResponse("application/octet-stream", size, [size, partition](uint8_t *buffer, size_t maxLen, size_t index) -> size_t {
+                    if((index + maxLen) > size)
+                        maxLen = size - index;
+
+                    if (ESP_OK != esp_partition_read(partition, index, buffer, maxLen))
+                        DPRINTLN(DBG_ERROR, F("can't read partition"));
+
+                    return maxLen;
+                });
+
+                String filename = ah::getDateTimeStrFile(gTimezone.toLocal(mApp->getTimestamp()));
+                filename += "_v" + String(mApp->getVersion());
+
+                response->addHeader("Content-Description", "File Transfer");
+                response->addHeader("Content-Disposition", "attachment; filename=" + filename + "_coredump.bin");
+                request->send(response);
+            } else {
+                AsyncWebServerResponse *response = request->beginResponse(200, F("application/json; charset=utf-8"), "{}");
+                request->send(response);
+            }
+        }
+
         void getGeneric(AsyncWebServerRequest *request, JsonObject obj) {
             mApp->resetLockTimeout();
             #if !defined(ETHERNET)
@@ -435,8 +463,8 @@ class RestApi {
         void getHtmlSystem(AsyncWebServerRequest *request, JsonObject obj) {
             getSysInfo(request, obj.createNestedObject(F("system")));
             getGeneric(request, obj.createNestedObject(F("generic")));
-            char tmp[200];
-            snprintf(tmp, 200, "%s
%s", FACTORY_RESET, BTN_REBOOT);
+            char tmp[300];
+            snprintf(tmp, 300, "%s
%s
%s", FACTORY_RESET, BTN_REBOOT, BTN_COREDUMP);
             obj[F("html")] = String(tmp);
         }
 
diff --git a/src/web/lang.h b/src/web/lang.h
index 54ade94e..dd6640b2 100644
--- a/src/web/lang.h
+++ b/src/web/lang.h
@@ -90,4 +90,10 @@
     #define BTN_NO "no"
 #endif
 
+#ifdef LANG_DE
+    #define BTN_COREDUMP "CoreDump herunterladen"
+#else /*LANG_EN*/
+    #define BTN_COREDUMP "download CoreDump"
+#endif
+
 #endif /*__LANG_H__*/