diff --git a/Makefile b/Makefile
index 5253ac2ea1039ff86a63e80b12ee253f3e61eb40..b9057ee170e906e7e16ec415840f24cadda37f96 100644
--- a/Makefile
+++ b/Makefile
@@ -569,7 +569,7 @@ main-bininstall:
 bininstall: _all installdirs $(SUBDIRS_INSTALL) main-bininstall
 	$(INSTALL) -m 755 contrib/scripts/astgenkey "$(DESTDIR)$(ASTSBINDIR)/"
 	$(INSTALL) -m 755 contrib/scripts/autosupport "$(DESTDIR)$(ASTSBINDIR)/"
-	if [ ! -f "$(DESTDIR)$(ASTSBINDIR)/safe_asterisk" -a ! -f /sbin/launchd ]; then \
+	if [ ! -f /sbin/launchd ]; then \
 		./build_tools/install_subst contrib/scripts/safe_asterisk "$(DESTDIR)$(ASTSBINDIR)/safe_asterisk"; \
 	fi
 	$(INSTALL) -m 644 include/asterisk.h "$(DESTDIR)$(includedir)"
diff --git a/UPGRADE.txt b/UPGRADE.txt
index 65c7f3a757effb85611f0dbc32683e1cc4eb6dfb..84e2c7bbd12b9cc5e112cb3002bb32c4004b952a 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -23,12 +23,6 @@
 
 From 12 to 13:
 
- - Changed a log message in safe_asterisk and the $NOTIFY mail subject. If
-   you use tools to parse either of them, update your parse functions
-   accordingly. The changed strings are:
-   - "Exited on signal $EXITSIGNAL" => "Asterisk exited on signal $EXITSIGNAL."
-   - "Asterisk Died" => "Asterisk on $MACHINE died (sig $EXITSIGNAL)"
-
  - The asterisk command line -I option and the asterisk.conf internal_timing
    option are removed and always enabled if any timing module is loaded.
 
@@ -195,6 +189,19 @@ Realtime Configuration:
  - A new set of Alembic scripts has been added for CDR tables. This will create
    a 'cdr' table with the default schema that Asterisk expects.
 
+safe_asterisk:
+ - The safe_asterisk script was previously not installed on top of an existing
+   version. This caused bug-fixes in that script not to be deployed. If your
+   safe_asterisk script is customized, be sure to keep your changes. Custom
+   values for variables should be created in *.sh file(s) inside
+   ASTETCDIR/startup.d/. See ASTERISK-21965.
+
+ - Changed a log message in safe_asterisk and the $NOTIFY mail subject. If
+   you use tools to parse either of them, update your parse functions
+   accordingly. The changed strings are:
+   - "Exited on signal $EXITSIGNAL" => "Asterisk exited on signal $EXITSIGNAL."
+   - "Asterisk Died" => "Asterisk on $MACHINE died (sig $EXITSIGNAL)"
+
 Unistim:
  - Added 'dtmf_duration' option with changing default operation to disable
    receivied dtmf playback on unistim phone
diff --git a/contrib/scripts/safe_asterisk b/contrib/scripts/safe_asterisk
index 8901d8a83557f99e536bba9c26074adf09099e28..de24d1b288a06600775a9215b56a59487317337f 100644
--- a/contrib/scripts/safe_asterisk
+++ b/contrib/scripts/safe_asterisk
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+ASTETCDIR="__ASTERISK_ETC_DIR__"
 ASTSBINDIR="__ASTERISK_SBIN_DIR__"
 ASTVARRUNDIR="__ASTERISK_VARRUN_DIR__"
 ASTVARLOGDIR="__ASTERISK_LOG_DIR__"
@@ -146,10 +147,10 @@ trap '' PIPE
 # Run scripts to set any environment variables or do any other system-specific setup needed
 #
 
-if test -d /etc/asterisk/startup.d; then
-	for script in /etc/asterisk/startup.d/*.sh; do
-		if test -r ${script}; then
-			. ${script}
+if test -d "${ASTETCDIR}/startup.d"; then
+	for script in "${ASTETCDIR}/startup.d/"*.sh; do
+		if test -r "${script}"; then
+			. "${script}"
 		fi
 	done
 fi