diff --git a/data/templates/frr/pimd.frr.j2 b/data/templates/frr/pimd.frr.j2
index b01fb5ec7..68edf4a5c 100644
--- a/data/templates/frr/pimd.frr.j2
+++ b/data/templates/frr/pimd.frr.j2
@@ -1,95 +1,95 @@
 {% if interface is vyos_defined %}
 {%     for iface, iface_config in interface.items() %}
 !
 interface {{ iface }}
  ip pim
 {%         if iface_config.bfd is vyos_defined %}
  ip pim bfd {{ 'profile ' ~ iface_config.bfd.profile if iface_config.bfd.profile is vyos_defined }}
 {%         endif %}
 {%         if iface_config.no_bsm is vyos_defined %}
  no ip pim bsm
 {%         endif %}
 {%         if iface_config.dr_priority is vyos_defined %}
  ip pim drpriority {{ iface_config.dr_priority }}
 {%         endif %}
 {%         if iface_config.hello is vyos_defined %}
  ip pim hello {{ iface_config.hello }}
 {%         endif %}
 {%         if iface_config.no_unicast_bsm is vyos_defined %}
  no ip pim unicast-bsm
 {%         endif %}
 {%         if iface_config.passive is vyos_defined %}
  ip pim passive
 {%         endif %}
 {%         if iface_config.source_address is vyos_defined %}
  ip pim use-source {{ iface_config.source_address }}
 {%         endif %}
-{%         if iface_config.igmp is vyos_defined %}
+{%         if iface_config.igmp is vyos_defined and iface_config.igmp.disable is not vyos_defined %}
  ip igmp
-{%         endif %}
-{%         if iface_config.igmp.query_interval %}
+{%             if iface_config.igmp.query_interval %}
  ip igmp query-interval {{ iface_config.igmp.query_interval }}
-{%         endif %}
-{%         if iface_config.igmp.query_max_response_time %}
+{%             endif %}
+{%             if iface_config.igmp.query_max_response_time %}
  ip igmp query-max-response-time {{ iface_config.igmp.query_max_response_time }}
-{%         endif %}
-{%         if iface_config.igmp.version is vyos_defined %}
+{%             endif %}
+{%             if iface_config.igmp.version is vyos_defined %}
  ip igmp version {{ iface_config.igmp.version }}
-{%         endif %}
-{%         if iface_config.igmp.join is vyos_defined %}
-{%             for join, join_config in iface_config.igmp.join.items() %}
-{%                 if join_config.source_address is vyos_defined %}
-{%                     for source_address in join_config.source_address %}
+{%             endif %}
+{%             if iface_config.igmp.join is vyos_defined %}
+{%                 for join, join_config in iface_config.igmp.join.items() %}
+{%                     if join_config.source_address is vyos_defined %}
+{%                         for source_address in join_config.source_address %}
  ip igmp join {{ join }} {{ source_address }}
-{%                     endfor %}
-{%                 else %}
+{%                         endfor %}
+{%                     else %}
  ip igmp join {{ join }}
-{%                 endif %}
-{%             endfor %}
+{%                     endif %}
+{%                 endfor %}
+{%             endif %}
 {%         endif %}
 exit
 {%     endfor %}
 {% endif %}
 !
 {% if ecmp is vyos_defined %}
 ip pim ecmp {{ 'rebalance' if ecmp.rebalance is vyos_defined }}
 {% endif %}
 {% if join_prune_interval is vyos_defined %}
 ip pim join-prune-interval {{ join_prune_interval }}
 {% endif %}
 {% if keep_alive_timer is vyos_defined %}
 ip pim keep-alive-timer {{ keep_alive_timer }}
 {% endif %}
 {% if packets is vyos_defined %}
 ip pim packets {{ packets }}
 {% endif %}
 {% if register_accept_list.prefix_list is vyos_defined %}
 ip pim register-accept-list {{ register_accept_list.prefix_list }}
 {% endif %}
 {% if register_suppress_time is vyos_defined %}
 ip pim register-suppress-time {{ register_suppress_time }}
 {% endif %}
 {% if rp.address is vyos_defined %}
 {%     for address, address_config in rp.address.items() %}
 {%         for group in address_config.group %}
 ip pim rp {{ address }} {{ group }}
 {%         endfor %}
 {%     endfor %}
 {% endif %}
 {% if rp.keep_alive_timer is vyos_defined %}
 ip pim rp keep-alive-timer {{ rp.keep_alive_timer }}
 {% endif %}
 {% if no_v6_secondary is vyos_defined %}
 no ip pim send-v6-secondary
 {% endif %}
 {% if spt_switchover.infinity_and_beyond is vyos_defined %}
 ip pim spt-switchover infinity-and-beyond {{ 'prefix-list ' ~ spt_switchover.infinity_and_beyond.prefix_list if spt_switchover.infinity_and_beyond.prefix_list is defined }}
 {% endif %}
 {% if ssm.prefix_list is vyos_defined %}
 ip pim ssm prefix-list {{ ssm.prefix_list }}
 {% endif %}
 !
 {% if igmp.watermark_warning is vyos_defined %}
 ip igmp watermark-warn {{ igmp.watermark_warning }}
 {% endif %}
 !
diff --git a/interface-definitions/protocols-pim.xml.in b/interface-definitions/protocols-pim.xml.in
index bbdb00cae..39188398b 100644
--- a/interface-definitions/protocols-pim.xml.in
+++ b/interface-definitions/protocols-pim.xml.in
@@ -1,209 +1,210 @@
 <?xml version="1.0"?>
 <!-- Protocol Independent Multicast (PIM) configuration -->
 <interfaceDefinition>
   <node name="protocols">
     <children>
       <node name="pim" owner="${vyos_conf_scripts_dir}/protocols_pim.py">
         <properties>
           <help>Protocol Independent Multicast (PIM) and IGMP</help>
           <priority>400</priority>
         </properties>
         <children>
           <tagNode name="interface">
             <properties>
               <help>PIM interface</help>
               <completionHelp>
                 <script>${vyos_completion_dir}/list_interfaces</script>
               </completionHelp>
               <constraint>
                 #include <include/constraint/interface-name.xml.i>
               </constraint>
             </properties>
             <children>
             #include <include/bfd/bfd.xml.i>
             #include <include/pim/bsm.xml.i>
             #include <include/pim/dr-priority.xml.i>
             #include <include/pim/hello.xml.i>
             #include <include/pim/passive.xml.i>
             #include <include/source-address-ipv4.xml.i>
             <node name="igmp">
               <properties>
                 <help>Internet Group Management Protocol (IGMP) options</help>
               </properties>
               <children>
+                #include <include/generic-disable-node.xml.i>
                 <tagNode name="join">
                   <properties>
                     <help>IGMP join multicast group</help>
                     <valueHelp>
                       <format>ipv4</format>
                       <description>Multicast group address</description>
                     </valueHelp>
                     <constraint>
                       <validator name="ipv4-address"/>
                     </constraint>
                   </properties>
                   <children>
                     #include <include/source-address-ipv4-multi.xml.i>
                   </children>
                 </tagNode>
                 <leafNode name="query-interval">
                   <properties>
                     <help>IGMP host query interval</help>
                     <valueHelp>
                       <format>u32:1-1800</format>
                       <description>Query interval in seconds</description>
                     </valueHelp>
                     <constraint>
                       <validator name="numeric" argument="--range 1-1800"/>
                     </constraint>
                   </properties>
                 </leafNode>
                 <leafNode name="query-max-response-time">
                   <properties>
                     <help>IGMP max query response time</help>
                     <valueHelp>
                       <format>u32:10-250</format>
                       <description>Query response value in deci-seconds</description>
                     </valueHelp>
                     <constraint>
                       <validator name="numeric" argument="--range 10-250"/>
                     </constraint>
                   </properties>
                 </leafNode>
                 <leafNode name="version">
                   <properties>
                     <help>Interface IGMP version</help>
                     <completionHelp>
                       <list>2 3</list>
                     </completionHelp>
                     <valueHelp>
                       <format>2</format>
                       <description>IGMP version 2</description>
                     </valueHelp>
                     <valueHelp>
                       <format>3</format>
                       <description>IGMP version 3</description>
                     </valueHelp>
                     <constraint>
                       <validator name="numeric" argument="--range 2-3"/>
                     </constraint>
                   </properties>
                   <defaultValue>3</defaultValue>
                   </leafNode>
                 </children>
               </node>
             </children>
           </tagNode>
           <node name="ecmp">
             <properties>
               <help>Enable PIM ECMP</help>
             </properties>
             <children>
               <leafNode name="rebalance">
                 <properties>
                   <help>Enable PIM ECMP Rebalance</help>
                   <valueless/>
                 </properties>
               </leafNode>
             </children>
           </node>
           <node name="igmp">
             <properties>
               <help>Internet Group Management Protocol (IGMP) options</help>
             </properties>
             <children>
               <leafNode name="watermark-warning">
                 <properties>
                   <help>Configure group limit for watermark warning</help>
                   <valueHelp>
                     <format>u32:1-65535</format>
                     <description>Group count to generate watermark warning</description>
                   </valueHelp>
                   <constraint>
                     <validator name="numeric" argument="--range 1-65535"/>
                   </constraint>
                 </properties>
               </leafNode>
             </children>
           </node>
           #include <include/pim/join-prune-interval.xml.i>
           #include <include/pim/keep-alive-timer.xml.i>
           #include <include/pim/packets.xml.i>
           #include <include/pim/register-suppress-time.xml.i>
           <node name="register-accept-list">
             <properties>
               <help>Only accept registers from a specific source prefix list</help>
             </properties>
             <children>
               #include <include/policy/prefix-list.xml.i>
             </children>
           </node>
           <node name="rp">
             <properties>
               <help>Rendezvous Point</help>
             </properties>
             <children>
               <tagNode name="address">
                 <properties>
                   <help>Rendezvous Point address</help>
                   <valueHelp>
                     <format>ipv4</format>
                     <description>Rendezvous Point address</description>
                   </valueHelp>
                   <constraint>
                     <validator name="ipv4-address"/>
                   </constraint>
                 </properties>
                 <children>
                   <leafNode name="group">
                     <properties>
                       <help>Group Address range</help>
                       <valueHelp>
                         <format>ipv4net</format>
                         <description>Group Address range RFC 3171</description>
                       </valueHelp>
                       <constraint>
                         <validator name="ip-prefix"/>
                       </constraint>
                       <multi/>
                     </properties>
                   </leafNode>
                 </children>
               </tagNode>
               #include <include/pim/keep-alive-timer.xml.i>
             </children>
           </node>
           <leafNode name="no-v6-secondary">
             <properties>
               <help>Disable IPv6 secondary address in hello packets</help>
               <valueless/>
             </properties>
           </leafNode>
           <node name="spt-switchover">
             <properties>
               <help>Send v6 secondary addresses</help>
             </properties>
             <children>
               <node name="infinity-and-beyond">
                 <properties>
                   <help>Never switch to SPT Tree</help>
                 </properties>
                 <children>
                   #include <include/policy/prefix-list.xml.i>
                 </children>
               </node>
             </children>
           </node>
           <node name="ssm">
             <properties>
               <help>Source-Specific Multicast</help>
             </properties>
             <children>
               #include <include/policy/prefix-list.xml.i>
             </children>
           </node>
         </children>
       </node>
     </children>
   </node>
 </interfaceDefinition>