diff --git a/net/frr/src/etc/rc.carp_service_status.d/carp_frr_ospf b/net/frr/src/etc/rc.carp_service_status.d/carp_frr_ospf
new file mode 100755
index 000000000..91d761ef8
--- /dev/null
+++ b/net/frr/src/etc/rc.carp_service_status.d/carp_frr_ospf
@@ -0,0 +1,25 @@
+#!/bin/sh
+if [ -f /etc/rc.conf.d/frr ]; then
+ . /etc/rc.conf.d/frr
+fi
+
+if [ "$frr_enable" == "YES" ] && (`echo "$frr_daemons" | /usr/bin/grep -F -q -w "ospfd"`) &&
+ (`echo "$frr_carp_demote" | /usr/bin/grep -F -q -w "ospfd"`) ; then
+ # OSPF enabled
+ OSPF_NEIGHBOR=`echo "show ip ospf neighbor" | /usr/local/bin/vtysh 2>&1` IFS=
+ if [ "$?" -eq 0 ]; then
+ # running, check if we can find any neighbors
+ IFS=
+ neighbors_count=`echo $OSPF_NEIGHBOR | grep "Full/" | wc -l`
+ unset IFS
+ if [ "$neighbors_count" -eq 0 ]; then
+ # no neighbors in state Full/* found
+ exit 2
+ else
+ exit 0
+ fi
+ else
+ # not running
+ exit 1
+ fi
+fi
diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml
index 825d5b638..0305f5891 100644
--- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml
+++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml
@@ -5,6 +5,16 @@
checkbox
This will activate the OSPF service if routing protocols are enabled in "General".
+
+ ospf.carp_demote
+
+ checkbox
+
+ Register CARP status monitor, when no neighbors are found, consider this node less attractive.
+ This feature needs syslog enabled using "Debugging" logging to catch all relevant status events.
+ This option is not compatible with "Enable CARP Failover".
+
+
ospf.routerid
diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml
index 187742e4b..b15b9f2e4 100644
--- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml
+++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml
@@ -7,6 +7,10 @@
0
Y
+
+ 0
+ Y
+
N
diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS
index eeb0f1e51..b01f28018 100644
--- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS
+++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS
@@ -5,3 +5,4 @@ ripd.conf:/usr/local/etc/frr/ripd.conf
frr:/etc/rc.conf.d/frr
zebra.conf:/usr/local/etc/frr/zebra.conf
vtysh.conf:/usr/local/etc/frr/vtysh.conf
+syslog-ng-frr-events.conf:/usr/local/etc/syslog-ng.conf.d/frr-events.conf
diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr
index bb4d09766..e2b5da14d 100644
--- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr
+++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr
@@ -11,6 +11,7 @@ if helpers.exists('OPNsense.quagga.bgp.enabled') and OPNsense.quagga.bgp.enabled
if helpers.exists('OPNsense.quagga.ospf6.enabled') and OPNsense.quagga.ospf6.enabled == '1' %} ospf6d{% endif %}{%
if helpers.exists('OPNsense.quagga.ripng.enabled') and OPNsense.quagga.ripng.enabled == '1' %} ripngd{% endif %}{%
if helpers.exists('OPNsense.quagga.isis.enabled') and OPNsense.quagga.isis.enabled == '1' %} isisd{% endif %}"
+frr_carp_demote="{% if not helpers.empty('OPNsense.quagga.ospf.carp_demote') %} ospfd{% endif %}"
{% else %}
frr_enable="NO"
{% endif %}
diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/syslog-ng-frr-events.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/syslog-ng-frr-events.conf
new file mode 100644
index 000000000..9644313b8
--- /dev/null
+++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/syslog-ng-frr-events.conf
@@ -0,0 +1,23 @@
+{% if not helpers.empty('OPNsense.quagga.general.enabled')
+ and not helpers.empty('OPNsense.quagga.ospf.enabled')
+ and not helpers.empty('OPNsense.quagga.ospf.carp_demote') %}
+destination d_frr_event {
+ program("/usr/local/sbin/configctl -e -t 0.5 interface update carp service_status");
+};
+
+filter f_frr_ospf {
+ program("ospfd") and (
+ (
+ level("info") or level("notice")
+ ) or (
+ level("debug") and message(".*EXT .*ospf_ext_link_ism_change.*")
+ )
+ );
+};
+
+log {
+ source(s_all);
+ filter(f_frr_ospf);
+ destination(d_frr_event);
+};
+{% endif %}