diff --git a/src/usr/local/sbin/pfSense-dhclient-script b/src/usr/local/sbin/pfSense-dhclient-script
index 726e4d4b5f..f784e3c5ae 100755
--- a/src/usr/local/sbin/pfSense-dhclient-script
+++ b/src/usr/local/sbin/pfSense-dhclient-script
@@ -286,11 +286,11 @@ notify_rc_newwanip() {
 #
 # Start of active code.
 #
+exit_status=0
 
 # Invoke the local dhcp client enter hooks, if they exist.
 if [ -f /etc/dhclient-enter-hooks ]; then
 	$LOGGER "dhclient-enter-hooks"
-	exit_status=0
 	. /etc/dhclient-enter-hooks
 	# allow the local script to abort processing of this state
 	# local script must set exit_status variable to nonzero.
@@ -359,6 +359,9 @@ EXPIRE|FAIL|RELEASE)
 	;;
 
 TIMEOUT)
+	# This case must exit zero only if the cached address
+	# is considered valid. See dhclient-script(8).
+	exit_status=1
 	delete_old_alias
 	add_new_address
 	/bin/sleep 1
@@ -373,19 +376,21 @@ TIMEOUT)
 			if add_new_resolv_conf; then
 				notify_rc_newwanip
 			fi
+			exit_status=0
 		fi
 	fi
-	$IFCONFIG $interface inet -alias $new_ip_address $medium
-	delete_old_routes
+	if [ $exit_status -ne 0 ]; then
+		$IFCONFIG $interface inet -alias $new_ip_address $medium
+		delete_old_routes
+	fi
 	;;
 esac
 
 # Invoke the local dhcp client exit hooks, if they exist.
 if [ -f /etc/dhclient-exit-hooks ]; then
 	$LOGGER "dhclient-exit-hooks"
-	exit_status=0
 	. /etc/dhclient-exit-hooks
 	# allow the local script to abort processing of this state
 	# local script must set exit_status variable to nonzero.
-	exit $exit_status
 fi
+exit $exit_status
