diff --git a/front/php/templates/language/en_us.json b/front/php/templates/language/en_us.json
index 9d3cc9ac..8c7ff7d6 100755
--- a/front/php/templates/language/en_us.json
+++ b/front/php/templates/language/en_us.json
@@ -533,15 +533,7 @@
"WEBHOOK_SIZE_description" : "The maximum size of the webhook payload as number of characters in the passed string. If above limit, it will be truncated and a (text was truncated) message is appended.",
"WEBHOOK_SECRET_name": "HMAC Secret",
"WEBHOOK_SECRET_description": "When set, use this secret to generate the SHA256-HMAC hex digest value of the request body, which will be passed as the X-Webhook-Signature header to the request. You can find more informations here.",
-
- "PUSHSAFER_display_name" : "Pushsafer",
- "PUSHSAFER_icon" : "",
- "REPORT_PUSHSAFER_name" : "Enable Pushsafer",
- "REPORT_PUSHSAFER_description" : "Enable sending notifications via Pushsafer.",
- "PUSHSAFER_TOKEN_name" : "Pushsafer token",
- "PUSHSAFER_TOKEN_description" : "Your secret Pushsafer API key (token).",
- "MQTT_display_name" : "MQTT",
- "MQTT_icon" : "",
+
"REPORT_TITLE" : "Report",
"REPORT_ERROR" : "The page you are looking for is temporarily unavailable, please try again after a few seconds",
diff --git a/front/plugins/_publisher_apprise/apprise.py b/front/plugins/_publisher_apprise/apprise.py
index ab4a4196..0e8b97ed 100755
--- a/front/plugins/_publisher_apprise/apprise.py
+++ b/front/plugins/_publisher_apprise/apprise.py
@@ -14,7 +14,7 @@ sys.path.extend(["/home/pi/pialert/front/plugins", "/home/pi/pialert/pialert"])
import conf
from plugin_helper import Plugin_Objects
from logger import mylog, append_line_to_file
-from helper import timeNowTZ, noti_obj, get_setting_value
+from helper import timeNowTZ, get_setting_value
from notification import Notification_obj
from database import DB
diff --git a/front/plugins/_publisher_email/email_smtp.py b/front/plugins/_publisher_email/email_smtp.py
index df75bd09..b0f23905 100755
--- a/front/plugins/_publisher_email/email_smtp.py
+++ b/front/plugins/_publisher_email/email_smtp.py
@@ -22,7 +22,7 @@ sys.path.extend(["/home/pi/pialert/front/plugins", "/home/pi/pialert/pialert"])
import conf
from plugin_helper import Plugin_Objects
from logger import mylog, append_line_to_file, print_log
-from helper import timeNowTZ, noti_obj, get_setting_value, hide_email
+from helper import timeNowTZ, get_setting_value, hide_email
from notification import Notification_obj
from database import DB
diff --git a/front/plugins/_publisher_mqtt/README.md b/front/plugins/_publisher_mqtt/README.md
index 3c2c02fe..a75c3b65 100755
--- a/front/plugins/_publisher_mqtt/README.md
+++ b/front/plugins/_publisher_mqtt/README.md
@@ -1,6 +1,6 @@
## Overview
-- TBC
+- Feed your data and device changes into [Home Assistant](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/HOME_ASSISTANT.md) via the MQTT Mosquito broker.
### Usage
diff --git a/front/plugins/_publisher_mqtt/mqtt.py b/front/plugins/_publisher_mqtt/mqtt.py
index c5ee053d..532e7e1e 100755
--- a/front/plugins/_publisher_mqtt/mqtt.py
+++ b/front/plugins/_publisher_mqtt/mqtt.py
@@ -22,7 +22,7 @@ from const import apiPath
from plugin_utils import getPluginObject
from plugin_helper import Plugin_Objects
from logger import mylog, append_line_to_file
-from helper import timeNowTZ, noti_obj, get_setting_value, bytes_to_string, sanitize_string
+from helper import timeNowTZ, get_setting_value, bytes_to_string, sanitize_string
from notification import Notification_obj
from database import DB, get_all_devices, get_device_stats
diff --git a/front/plugins/_publisher_ntfy/README.md b/front/plugins/_publisher_ntfy/README.md
index 3c2c02fe..58e14658 100755
--- a/front/plugins/_publisher_ntfy/README.md
+++ b/front/plugins/_publisher_ntfy/README.md
@@ -1,6 +1,6 @@
## Overview
-- TBC
+A plugin to publish a notification via the NTFY gateway. Enable sending notifications via NTFY. Supports authentication.
### Usage
diff --git a/front/plugins/_publisher_ntfy/ntfy.py b/front/plugins/_publisher_ntfy/ntfy.py
index 2e459fda..2125e0e5 100755
--- a/front/plugins/_publisher_ntfy/ntfy.py
+++ b/front/plugins/_publisher_ntfy/ntfy.py
@@ -17,7 +17,7 @@ sys.path.extend(["/home/pi/pialert/front/plugins", "/home/pi/pialert/pialert"])
import conf
from plugin_helper import Plugin_Objects, handleEmpty
from logger import mylog, append_line_to_file
-from helper import timeNowTZ, noti_obj, get_setting_value
+from helper import timeNowTZ, get_setting_value
from notification import Notification_obj
from database import DB
diff --git a/front/plugins/_publisher_pushsafer/README.md b/front/plugins/_publisher_pushsafer/README.md
new file mode 100755
index 00000000..6b110e92
--- /dev/null
+++ b/front/plugins/_publisher_pushsafer/README.md
@@ -0,0 +1,8 @@
+## Overview
+
+A plugin to publish a notification via the Pushsafer gateway. Enable sending notifications via Pushsafer.
+
+### Usage
+
+- Go to settings and fill in relevant details.
+
diff --git a/front/plugins/_publisher_pushsafer/config.json b/front/plugins/_publisher_pushsafer/config.json
new file mode 100755
index 00000000..fb4d67c9
--- /dev/null
+++ b/front/plugins/_publisher_pushsafer/config.json
@@ -0,0 +1,316 @@
+{
+ "code_name": "_publisher_pushsafer",
+ "unique_prefix": "PUSHSAFER",
+ "plugin_type": "publisher",
+ "enabled": true,
+ "data_source": "script",
+ "show_ui": true,
+ "localized": ["display_name", "description", "icon"],
+ "display_name" : [
+ {
+ "language_code": "en_us",
+ "string" : "Pushsafer publisher"
+ },
+ {
+ "language_code": "es_es",
+ "string" : "Habilitar Pushsafer"
+ }
+ ],
+ "icon":[{
+ "language_code": "en_us",
+ "string" : ""
+ }],
+ "description": [
+ {
+ "language_code": "en_us",
+ "string" : "A plugin to publish a notification via the Pushsafer gateway."
+ }
+ ],
+ "params" : [
+ ],
+ "database_column_definitions":
+ [
+ {
+ "column": "Index",
+ "css_classes": "col-sm-2",
+ "show": false,
+ "type": "label",
+ "default_value":"",
+ "options": [],
+ "localized": ["name"],
+ "name":[{
+ "language_code": "en_us",
+ "string" : "N/A"
+ },
+ {
+ "language_code": "es_es",
+ "string" : "N/A"
+ }]
+ },
+ {
+ "column": "Plugin",
+ "css_classes": "col-sm-2",
+ "show": false,
+ "type": "label",
+ "default_value":"",
+ "options": [],
+ "localized": ["name"],
+ "name":[{
+ "language_code": "en_us",
+ "string" : "N/A"
+ },
+ {
+ "language_code": "es_es",
+ "string" : "N/A"
+ }]
+ },
+ {
+ "column": "Object_PrimaryID",
+ "css_classes": "col-sm-2",
+ "show": false,
+ "type": "label",
+ "default_value":"",
+ "options": [],
+ "localized": ["name"],
+ "name":[{
+ "language_code": "en_us",
+ "string" : "N/A"
+ }]
+ },
+ {
+ "column": "Object_SecondaryID",
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "label",
+ "default_value":"",
+ "options": [],
+ "localized": ["name"],
+ "name":[{
+ "language_code": "en_us",
+ "string" : "Sent when"
+ }]
+ },
+ {
+ "column": "Watched_Value1",
+ "css_classes": "col-sm-3",
+ "show": true,
+ "type": "label",
+ "default_value":"",
+ "options": [],
+ "localized": ["name"],
+ "name":[{
+ "language_code": "en_us",
+ "string" : "Notification GUID"
+ }]
+ },
+ {
+ "column": "Watched_Value2",
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "textarea_readonly",
+ "default_value":"",
+ "options": [],
+ "localized": ["name"],
+ "name":[{
+ "language_code": "en_us",
+ "string" : "Response"
+ }]
+ },
+ {
+ "column": "Watched_Value3",
+ "css_classes": "col-sm-2",
+ "show": true,
+ "type": "label",
+ "default_value":"",
+ "options": [],
+ "localized": ["name"],
+ "name":[{
+ "language_code": "en_us",
+ "string" : "Response code"
+ }]
+ },
+ {
+ "column": "Watched_Value4",
+ "css_classes": "col-sm-2",
+ "show": false,
+ "type": "device_mac",
+ "default_value":"",
+ "options": [],
+ "localized": ["name"],
+ "name":[{
+ "language_code": "en_us",
+ "string" : "Device"
+ }
+ ]
+ },
+ {
+ "column": "UserData",
+ "css_classes": "col-sm-2",
+ "show": false,
+ "type": "textbox_save",
+ "default_value":"",
+ "options": [],
+ "localized": ["name"],
+ "name":[{
+ "language_code": "en_us",
+ "string" : "Comments"
+ },
+ {
+ "language_code": "es_es",
+ "string" : "Comentarios"
+ }]
+ },
+ {
+ "column": "Status",
+ "css_classes": "col-sm-1",
+ "show": false,
+ "type": "replace",
+ "default_value":"",
+ "options": [
+ {
+ "equals": "watched-not-changed",
+ "replacement": "