diff --git a/data/templates/frr/isisd.frr.tmpl b/data/templates/frr/isisd.frr.tmpl
index 8a813d9cb..6cfa076d0 100644
--- a/data/templates/frr/isisd.frr.tmpl
+++ b/data/templates/frr/isisd.frr.tmpl
@@ -1,176 +1,198 @@
 !
-router isis {{ process }}
+router isis VyOS {{ 'vrf ' + vrf if vrf is defined and vrf is not none }}
  net {{ net }}
 {% if dynamic_hostname is defined %}
  hostname dynamic
 {% endif %}
 {% if purge_originator is defined %}
  purge-originator
 {% endif %}
 {% if set_attached_bit is defined %}
  set-attached-bit
 {% endif %}
 {% if set_overload_bit is defined %}
  set-overload-bit
 {% endif %}
-{% if domain_password is defined and domain_password.plaintext_password is defined and domain_password.plaintext_password is not none %}
+{% if domain_password is defined and domain_password is not none %}
+{%   if domain_password.md5 is defined and domain_password.md5 is not none %}
+ domain-password md5 {{ domain_password.plaintext_password }}
+{%   elif domain_password.plaintext_password is defined and domain_password.plaintext_password is not none %}
  domain-password clear {{ domain_password.plaintext_password }}
+{%   endif %}
+{% endif %}
+{% if log_adjacency_changes is defined %}
+ log-adjacency-changes
 {% endif %}
 {% if lsp_gen_interval is defined and lsp_gen_interval is not none %}
  lsp-gen-interval {{ lsp_gen_interval }}
 {% endif %}
 {% if lsp_mtu is defined and lsp_mtu is not none %}
  lsp-mtu {{ lsp_mtu }}
 {% endif %}
 {% if lsp_refresh_interval is defined and lsp_refresh_interval is not none %}
  lsp-refresh-interval  {{ lsp_refresh_interval }}
 {% endif %}
 {% if max_lsp_lifetime is defined and max_lsp_lifetime is not none %}
  max-lsp-lifetime {{ max_lsp_lifetime }}
 {% endif %}
 {% if spf_interval is defined and spf_interval is not none %}
  spf-interval {{ spf_interval }}
 {% endif %}
 {% if traffic_engineering is defined and traffic_engineering is not none %}
 {%   if traffic_engineering.enable is defined %}
  mpls-te on
 {%   endif %}
 {%   if traffic_engineering.address is defined %}
  mpls-te router-address {{ traffic_engineering.address }}
 {%   endif %}
 {%   if traffic_engineering.inter_as is defined %}
 {%     if traffic_engineering.inter_as.level_1 is defined %}
  mpls-te inter-as level-1
 {%     endif %}
 {%     if traffic_engineering.inter_as.level_1_2 is defined %}
  mpls-te inter-as level-1-2
 {%     endif %}
 {%     if traffic_engineering.inter_as.level_2 is defined %}
  mpls-te inter-as level-2-only
 {%     endif %}
 {%   else %}
  mpls-te inter-as
 {%   endif %}
 {% endif %}
 {% if segment_routing is defined %}
 {%   if segment_routing.enable is defined %}
  segment-routing on
 {%   endif %}
 {%   if segment_routing.maximum_label_depth is defined %}
  segment-routing node-msd {{ segment_routing.maximum_label_depth }}
 {%   endif %}
 {%   if segment_routing.global_block is defined %}
  segment-routing global-block {{ segment_routing.global_block.low_label_value }} {{ segment_routing.global_block.high_label_value }}
 {%   endif %}
 {%   if segment_routing.local_block is defined %}
  segment-routing local-block {{ segment_routing.global_block.low_label_value }} {{ segment_routing.local_block.high_label_value }}
 {%   endif %}
 {%   if segment_routing.prefix is defined %}
 {%     for prefixes in segment_routing.prefix %}
 {%       if segment_routing.prefix[prefixes].absolute is defined %}
 {%         if segment_routing.prefix[prefixes].absolute.value is defined %}
  segment-routing prefix {{ prefixes }} absolute {{ segment_routing.prefix[prefixes].absolute.value }}
 {%           if segment_routing.prefix[prefixes].absolute.explicit_null is defined %}
  segment-routing prefix {{ prefixes }} absolute {{ segment_routing.prefix[prefixes].absolute.value }} explicit-null
 {%           endif %}
 {%           if segment_routing.prefix[prefixes].absolute.no_php_flag is defined %}
  segment-routing prefix {{ prefixes }} absolute {{ segment_routing.prefix[prefixes].absolute.value }} no-php-flag
 {%           endif %}
 {%         endif %}
 {%         if segment_routing.prefix[prefixes].index is defined %}
 {%           if segment_routing.prefix[prefixes].index.value is defined %}
  segment-routing prefix {{ prefixes }} index {{ segment_routing.prefix[prefixes].index.value }}
 {%             if segment_routing.prefix[prefixes].index.explicit_null is defined %}
  segment-routing prefix {{ prefixes }} index {{ segment_routing.prefix[prefixes].index.value }} explicit-null
 {%             endif %}
 {%             if segment_routing.prefix[prefixes].index.no_php_flag is defined %}
  segment-routing prefix {{ prefixes }} index {{ segment_routing.prefix[prefixes].index.value }} no-php-flag
 {%             endif %}
 {%           endif %}
 {%         endif %}
 {%       endif %}
 {%     endfor %}
 {%   endif %}
 {% endif %}
 {% if spf_delay_ietf is defined and spf_delay_ietf.init_delay is defined and spf_delay_ietf.init_delay is not none %}
  spf-delay-ietf init-delay {{ spf_delay_ietf.init_delay }}
 {% endif %}
-{% if area_password is defined and area_password.md5 is defined and area_password.md5 is not none %}
+{% if area_password is defined and area_password is not none %}
+{%   if area_password.md5 is defined and area_password.md5 is not none %}
  area-password md5 {{ area_password.md5 }}
-{% elif area_password is defined and area_password.plaintext_password is defined and area_password.plaintext_password is not none %}
+{%   elif area_password.plaintext_password is defined and area_password.plaintext_password is not none %}
  area-password clear {{ area_password.plaintext_password }}
+{%   endif %}
 {% endif %}
 {% if default_information is defined and default_information.originate is defined and default_information.originate is not none %}
-{%   for level in default_information.originate.ipv4 if default_information.originate.ipv4 is defined %}
- default-information originate ipv4 {{ level | replace('_', '-') }}
-{%   endfor %}
-{%   for level in default_information.originate.ipv6 if default_information.originate.ipv6 is defined %}
- default-information originate ipv6 {{ level | replace('_', '-') }} always
+{%   for afi, afi_config in default_information.originate.items() %}
+{%     for level, level_config in afi_config.items() %}
+ default-information originate {{ afi }} {{ level | replace('_', '-') }} {{ 'always' if level_config.always is defined }} {{ 'route-map ' ~ level_config.route_map if level_config.route_map is defined }} {{ 'metric ' ~ level_config.metric if level_config.metric is defined }}
+{%     endfor %}
 {%   endfor %}
 {% endif %}
-{% if redistribute is defined and redistribute.ipv4 is defined and redistribute.ipv4 is not none %}
-{%   for protocol in redistribute.ipv4 %}
-{%     for level, level_config in redistribute.ipv4[protocol].items() %}
-{%       if level_config.metric is defined and level_config.metric is not none %}
+{% if redistribute is defined %}
+{%   if redistribute.ipv4 is defined and redistribute.ipv4 is not none %}
+{%     for protocol, protocol_options in redistribute.ipv4.items() %}
+{%       for level, level_config in protocol_options.items() %}
+{%         if level_config.metric is defined and level_config.metric is not none %}
  redistribute ipv4 {{ protocol }} {{ level | replace('_', '-') }} metric {{ level_config.metric }}
-{%       elif level_config.route_map is defined and level_config.route_map is not none %}
+{%         elif level_config.route_map is defined and level_config.route_map is not none %}
  redistribute ipv4 {{ protocol }} {{ level | replace('_', '-') }} route-map {{ level_config.route_map }}
-{%       else %}
+{%         else %}
  redistribute ipv4 {{ protocol }} {{ level | replace('_', '-') }}
-{%       endif %}
+{%         endif %}
+{%       endfor %}
 {%     endfor %}
-{%   endfor %}
+{%   endif %}
+{%   if redistribute.ipv6 is defined and redistribute.ipv6 is not none %}
+{%     for protocol, protocol_options in redistribute.ipv6.items() %}
+{%       for level, level_config in protocol_options.items() %}
+{%         if level_config.metric is defined and level_config.metric is not none %}
+ redistribute ipv6 {{ protocol }} {{ level | replace('_', '-') }} metric {{ level_config.metric }}
+{%         elif level_config.route_map is defined and level_config.route_map is not none %}
+ redistribute ipv6 {{ protocol }} {{ level | replace('_', '-') }} route-map {{ level_config.route_map }}
+{%         else %}
+ redistribute ipv6 {{ protocol }} {{ level | replace('_', '-') }}
+{%         endif %}
+{%       endfor %}
+{%     endfor %}
+{%   endif %}
 {% endif %}
 {% if level is defined and level is not none %}
-{%   if level == 'level-1' %}
- is-type level-1
-{%   elif level == 'level-2'  %}
+{%   if level == 'level-2'  %}
  is-type level-2-only
-{%   elif level == 'level-1-2'  %}
- is-type level-1-2
+{%   else %}
+ is-type {{ level }}
 {%   endif %}
 {% endif %}
 !
 {% if interface is defined and interface is not none %}
 {%   for iface, iface_config in interface.items() %}
-interface {{ iface }}
- ip router isis {{ process }}
- ipv6 router isis {{ process }}
+interface {{ iface }} {{ 'vrf ' + vrf if vrf is defined and vrf is not none }}
+ ip router isis VyOS
+ ipv6 router isis VyOS
 {%     if iface_config.bfd is defined %}
  isis bfd
 {%     endif %}
 {%     if iface_config.network is defined and iface_config.network.point_to_point is defined %}
  isis network point-to-point
 {%     endif %}
 {%     if iface_config.circuit_type is defined %}
  isis circuit-type {{ iface_config.circuit_type }}
 {%     endif %}
 {%     if iface_config.hello_interval is defined and iface_config.hello_interval is not none %}
  isis hello-interval {{ iface_config.hello_interval }}
 {%     endif %}
 {%     if iface_config.hello_multiplier is defined and iface_config.hello_multiplier is not none %}
  isis hello-multiplier {{ iface_config.hello_multiplier }}
 {%     endif %}
 {%     if iface_config.hello_padding is defined %}
  isis hello padding
 {%     endif %}
 {%     if iface_config.metric is defined and iface_config.metric is not none %}
  isis metric {{ iface_config.metric }}
 {%     endif %}
 {%     if iface_config.passive is defined %}
  isis passive
 {%     endif %}
 {%     if iface_config.password is defined and iface_config.password.plaintext_password is defined and iface_config.password.plaintext_password is not none %}
  isis password clear {{ iface_config.password.plaintext_password }}
 {%     endif %}
 {%     if iface_config.priority is defined and iface_config.priority is not none %}
  isis priority {{ iface_config.priority }}
 {%     endif %}
 {%     if iface_config.psnp_interval is defined and iface_config.psnp_interval is not none %}
  isis psnp-interval {{ iface_config.psnp_interval }}
 {%     endif %}
 {%     if iface_config.no_three_way_handshake is defined %}
  no isis three-way-handshake
 {%     endif %}
 {%   endfor %}
 {% endif %}
+!
\ No newline at end of file
diff --git a/data/templates/frr/route-map.frr.tmpl b/data/templates/frr/route-map.frr.tmpl
new file mode 100644
index 000000000..6b33cc126
--- /dev/null
+++ b/data/templates/frr/route-map.frr.tmpl
@@ -0,0 +1,5 @@
+!
+{% if route_map is defined and route_map is not none %}
+ip protocol {{ protocol }} route-map {{ route_map }}
+{% endif %}
+!
diff --git a/interface-definitions/include/bfd.xml.i b/interface-definitions/include/bfd.xml.i
new file mode 100644
index 000000000..2bc3664e1
--- /dev/null
+++ b/interface-definitions/include/bfd.xml.i
@@ -0,0 +1,8 @@
+<!-- include start from bfd.xml.i -->
+<leafNode name="bfd">
+  <properties>
+    <help>Enable Bidirectional Forwarding Detection (BFD)</help>
+    <valueless/>
+  </properties>
+</leafNode>
+<!-- include end -->
diff --git a/interface-definitions/include/isis-redistribute-ipv4.xml.i b/interface-definitions/include/isis-redistribute-ipv4.xml.i
deleted file mode 100644
index 774086a81..000000000
--- a/interface-definitions/include/isis-redistribute-ipv4.xml.i
+++ /dev/null
@@ -1,56 +0,0 @@
-<!-- include start from isis-redistribute-ipv4.xml.i -->
-<node name="level-1">
-  <properties>
-    <help>Redistribute into level-1</help>
-  </properties>
-  <children>
-    <leafNode name="metric">
-      <properties>
-        <help>Metric for redistributed routes</help>
-        <valueHelp>
-          <format>u32:0-16777215</format>
-          <description>ISIS default metric</description>
-        </valueHelp>
-        <constraint>
-          <validator name="numeric" argument="--range 0-16777215"/>
-        </constraint>
-      </properties>
-    </leafNode>
-    <leafNode name="route-map">
-      <properties>
-        <help>Route map reference</help>
-        <completionHelp>
-          <path>policy route-map</path>
-        </completionHelp>
-      </properties>
-    </leafNode>
-  </children>
-</node>
-<node name="level-2">
-  <properties>
-    <help>Redistribute into level-2</help>
-  </properties>
-  <children>
-    <leafNode name="metric">
-      <properties>
-        <help>Metric for redistributed routes</help>
-        <valueHelp>
-          <format>u32:0-16777215</format>
-          <description>ISIS default metric</description>
-        </valueHelp>
-        <constraint>
-          <validator name="numeric" argument="--range 0-16777215"/>
-        </constraint>
-      </properties>
-    </leafNode>
-    <leafNode name="route-map">
-      <properties>
-        <help>Route map reference</help>
-        <completionHelp>
-          <path>policy route-map</path>
-        </completionHelp>
-      </properties>
-    </leafNode>
-  </children>
-</node>
-<!-- include end -->
diff --git a/interface-definitions/include/isis/default-information-level.xml.i b/interface-definitions/include/isis/default-information-level.xml.i
new file mode 100644
index 000000000..5ade72a4b
--- /dev/null
+++ b/interface-definitions/include/isis/default-information-level.xml.i
@@ -0,0 +1,32 @@
+<!-- include start from isis/default-information-level.xml.i -->
+<node name="level-1">
+  <properties>
+    <help>Distribute default route into level-1</help>
+  </properties>
+  <children>
+    <leafNode name="always">
+      <properties>
+        <help>Always advertise default route</help>
+        <valueless/>
+      </properties>
+    </leafNode>
+    #include <include/isis/metric.xml.i>
+    #include <include/route-map.xml.i>
+  </children>
+</node>
+<node name="level-2">
+  <properties>
+    <help>Distribute default route into level-2</help>
+  </properties>
+  <children>
+    <leafNode name="always">
+      <properties>
+        <help>Always advertise default route</help>
+        <valueless/>
+      </properties>
+    </leafNode>
+    #include <include/isis/metric.xml.i>
+    #include <include/route-map.xml.i>
+  </children>
+</node>
+<!-- include end -->
diff --git a/interface-definitions/include/isis/metric.xml.i b/interface-definitions/include/isis/metric.xml.i
new file mode 100644
index 000000000..30e2cdc10
--- /dev/null
+++ b/interface-definitions/include/isis/metric.xml.i
@@ -0,0 +1,14 @@
+<!-- include start from isis/metric.xml.i -->
+<leafNode name="metric">
+  <properties>
+    <help>Set default metric for circuit</help>
+    <valueHelp>
+      <format>u32:0-16777215</format>
+      <description>Default metric value</description>
+    </valueHelp>
+    <constraint>
+      <validator name="numeric" argument="--range 0-16777215"/>
+    </constraint>
+  </properties>
+</leafNode>
+<!-- include end -->
diff --git a/interface-definitions/include/isis/passive.xml.i b/interface-definitions/include/isis/passive.xml.i
new file mode 100644
index 000000000..6d05f8cc7
--- /dev/null
+++ b/interface-definitions/include/isis/passive.xml.i
@@ -0,0 +1,8 @@
+<!-- include start from isis/passive.xml.i -->
+<leafNode name="passive">
+  <properties>
+    <help>Configure passive mode for interface</help>
+    <valueless/>
+  </properties>
+</leafNode>
+<!-- include end -->
diff --git a/interface-definitions/include/isis/protocol-common-config.xml.i b/interface-definitions/include/isis/protocol-common-config.xml.i
new file mode 100644
index 000000000..84e2f7bb2
--- /dev/null
+++ b/interface-definitions/include/isis/protocol-common-config.xml.i
@@ -0,0 +1,769 @@
+<!-- include start from isis/protocol-common-config.xml.i -->
+<node name="area-password">
+  <properties>
+    <help>Configure the authentication password for an area</help>
+  </properties>
+  <children>
+    <leafNode name="plaintext-password">
+      <properties>
+        <help>Plain-text authentication type</help>
+        <valueHelp>
+          <format>txt</format>
+          <description>Level-wide password</description>
+        </valueHelp>
+      </properties>
+    </leafNode>
+    <leafNode name="md5">
+      <properties>
+        <help>MD5 authentication type</help>
+        <valueHelp>
+          <format>txt</format>
+          <description>Level-wide password</description>
+        </valueHelp>
+      </properties>
+    </leafNode>
+  </children>
+</node>
+<node name="default-information">
+  <properties>
+    <help>Control distribution of default information</help>
+  </properties>
+  <children>
+    <node name="originate">
+      <properties>
+        <help>Distribute a default route</help>
+      </properties>
+      <children>
+        <node name="ipv4">
+          <properties>
+            <help>Distribute default route for IPv4</help>
+          </properties>
+          <children>
+            #include <include/isis/default-information-level.xml.i>
+          </children>
+        </node>
+        <node name="ipv6">
+          <properties>
+            <help>Distribute default route for IPv6</help>
+          </properties>
+          <children>
+            #include <include/isis/default-information-level.xml.i>
+          </children>
+        </node>
+      </children>
+    </node>
+  </children>
+</node>
+<node name="domain-password">
+  <properties>
+    <help>Set the authentication password for a routing domain</help>
+  </properties>
+  <children>
+    <leafNode name="plaintext-password">
+      <properties>
+        <help>Plain-text authentication type</help>
+        <valueHelp>
+          <format>txt</format>
+          <description>Level-wide password</description>
+        </valueHelp>
+      </properties>
+    </leafNode>
+    <leafNode name="md5">
+      <properties>
+        <help>MD5 authentication type</help>
+        <valueHelp>
+          <format>txt</format>
+          <description>Level-wide password</description>
+        </valueHelp>
+      </properties>
+    </leafNode>
+  </children>
+</node>
+<leafNode name="dynamic-hostname">
+  <properties>
+    <help>Dynamic hostname for IS-IS</help>
+    <valueless/>
+  </properties>
+</leafNode>
+<leafNode name="level">
+  <properties>
+    <help>IS-IS level number</help>
+    <completionHelp>
+      <list>level-1 level-1-2 level-2</list>
+    </completionHelp>
+    <valueHelp>
+      <format>level-1</format>
+      <description>Act as a station router</description>
+    </valueHelp>
+    <valueHelp>
+      <format>level-1-2</format>
+      <description>Act as both a station and an area router</description>
+    </valueHelp>
+    <valueHelp>
+      <format>level-2</format>
+      <description>Act as an area router</description>
+    </valueHelp>
+    <constraint>
+      <regex>^(level-1|level-1-2|level-2)$</regex>
+    </constraint>
+  </properties>
+</leafNode>
+<leafNode name="log-adjacency-changes">
+  <properties>
+    <help>Log adjacency state changes</help>
+    <valueless/>
+  </properties>
+</leafNode>
+<leafNode name="lsp-gen-interval">
+  <properties>
+    <help>Minimum interval between regenerating same LSP</help>
+    <valueHelp>
+      <format>u32:1-120</format>
+      <description>Minimum interval in seconds</description>
+    </valueHelp>
+    <constraint>
+      <validator name="numeric" argument="--range 1-120"/>
+    </constraint>
+  </properties>
+</leafNode>
+<leafNode name="lsp-mtu">
+  <properties>
+    <help>Configure the maximum size of generated LSPs</help>
+    <valueHelp>
+      <format>u32:128-4352</format>
+      <description>Maximum size of generated LSPs</description>
+    </valueHelp>
+    <constraint>
+      <validator name="numeric" argument="--range 128-4352"/>
+    </constraint>
+  </properties>
+  <defaultValue>1497</defaultValue>
+</leafNode>
+<leafNode name="lsp-refresh-interval">
+  <properties>
+    <help>LSP refresh interval</help>
+    <valueHelp>
+      <format>u32:1-65235</format>
+      <description>LSP refresh interval in seconds</description>
+    </valueHelp>
+    <constraint>
+      <validator name="numeric" argument="--range 1-65235"/>
+    </constraint>
+  </properties>
+</leafNode>
+<leafNode name="max-lsp-lifetime">
+  <properties>
+    <help>Maximum LSP lifetime</help>
+    <valueHelp>
+      <format>u32:350-65535</format>
+      <description>LSP lifetime in seconds</description>
+    </valueHelp>
+    <constraint>
+      <validator name="numeric" argument="--range 1-65535"/>
+    </constraint>
+  </properties>
+</leafNode>
+<leafNode name="metric-style">
+  <properties>
+    <help>Use old-style (ISO 10589) or new-style packet formats</help>
+    <completionHelp>
+      <list>narrow transition wide</list>
+    </completionHelp>
+    <valueHelp>
+      <format>narrow</format>
+      <description>Use old style of TLVs with narrow metric</description>
+    </valueHelp>
+    <valueHelp>
+      <format>transition</format>
+      <description>Send and accept both styles of TLVs during transition</description>
+    </valueHelp>
+    <valueHelp>
+      <format>wide</format>
+      <description>Use new style of TLVs to carry wider metric</description>
+    </valueHelp>
+    <constraint>
+      <regex>^(narrow|transition|wide)$</regex>
+    </constraint>
+  </properties>
+</leafNode>
+<leafNode name="net">
+  <properties>
+    <help>A Network Entity Title for this process (ISO only)</help>
+    <valueHelp>
+      <format>XX.XXXX. ... .XXX.XX</format>
+      <description>Network entity title (NET)</description>
+    </valueHelp>
+    <constraint>
+      <regex>[a-fA-F0-9]{2}(\.[a-fA-F0-9]{4}){3,9}\.[a-fA-F0-9]{2}</regex>
+    </constraint>
+  </properties>
+</leafNode>
+<leafNode name="purge-originator">
+  <properties>
+    <help>Use the RFC 6232 purge-originator</help>
+    <valueless/>
+  </properties>
+</leafNode>
+<node name="traffic-engineering">
+  <properties>
+    <help>Show IS-IS neighbor adjacencies</help>
+  </properties>
+  <children>
+    <leafNode name="enable">
+      <properties>
+        <help>Enable MPLS traffic engineering extensions</help>
+        <valueless/>
+      </properties>
+    </leafNode>
+<!--
+    <node name="inter-as">
+      <properties>
+        <help>MPLS traffic engineering inter-AS support</help>
+      </properties>
+      <children>
+        <leafNode name="level-1">
+          <properties>
+            <help>Area native mode self originate inter-AS LSP with L1 only flooding scope</help>
+            <valueless/>
+          </properties>
+        </leafNode>
+        <leafNode name="level-1-2">
+          <properties>
+            <help>Area native mode self originate inter-AS LSP with L1 and L2 flooding scope</help>
+            <valueless/>
+          </properties>
+        </leafNode>
+        <leafNode name="level-2">
+          <properties>
+            <help>Area native mode self originate inter-AS LSP with L2 only flooding scope</help>
+            <valueless/>
+          </properties>
+        </leafNode>
+      </children>
+    </node>
+    <leafNode name="inter-as">
+      <properties>
+        <help>MPLS traffic engineering inter-AS support</help>
+        <valueless/>
+      </properties>
+    </leafNode>
+-->
+    <leafNode name="address">
+      <properties>
+        <help>MPLS traffic engineering router ID</help>
+        <valueHelp>
+          <format>ipv4</format>
+          <description>IPv4 address</description>
+        </valueHelp>
+        <constraint>
+          <validator name="ipv4-address"/>
+        </constraint>
+      </properties>
+    </leafNode>
+  </children>
+</node>
+<node name="segment-routing">
+  <properties>
+    <help>Segment-Routing (SPRING) settings</help>
+  </properties>
+  <children>
+    <leafNode name="enable">
+      <properties>
+        <help>Enable segment-routing functionality</help>
+        <valueless/>
+      </properties>
+    </leafNode>
+    <node name="global-block">
+      <properties>
+        <help>Global block label range</help>
+      </properties>
+      <children>
+        <leafNode name="low-label-value">
+          <properties>
+            <help>The lower bound of the global block</help>
+            <valueHelp>
+              <format>u32:16-1048575</format>
+              <description>MPLS label value</description>
+            </valueHelp>
+            <constraint>
+              <validator name="numeric" argument="--range 16-1048575"/>
+            </constraint>
+          </properties>
+        </leafNode>
+        <leafNode name="high-label-value">
+          <properties>
+            <help>The upper bound of the global block</help>
+            <valueHelp>
+              <format>u32:16-1048575</format>
+              <description>MPLS label value</description>
+            </valueHelp>
+            <constraint>
+              <validator name="numeric" argument="--range 16-1048575"/>
+            </constraint>
+          </properties>
+        </leafNode>
+      </children>
+    </node>
+<!--
+    <node name="local-block">
+      <properties>
+        <help>Local Block label range</help>
+      </properties>
+      <children>
+        <leafNode name="low-label-value">
+          <properties>
+            <help>The lower bound of the local block</help>
+            <valueHelp>
+              <format>u32:16-1048575</format>
+              <description>MPLS label value</description>
+            </valueHelp>
+            <constraint>
+              <validator name="numeric" argument="  range 16-1048575"/>
+            </constraint>
+          </properties>
+        </leafNode>
+        <leafNode name="high-label-value">
+          <properties>
+            <help>The upper bound of the local block</help>
+            <valueHelp>
+              <format>u32:16-1048575</format>
+              <description>MPLS label value</description>
+            </valueHelp>
+            <constraint>
+              <validator name="numeric" argument="  range 16-1048575"/>
+            </constraint>
+          </properties>
+        </leafNode>
+      </children>
+    </node>
+-->
+    <leafNode name="maximum-label-depth">
+      <properties>
+        <help>Maximum MPLS labels allowed for this router</help>
+        <valueHelp>
+          <format>u32:1-16</format>
+            <description>MPLS label depth</description>
+        </valueHelp>
+        <constraint>
+          <validator name="numeric" argument="--range 1-16"/>
+        </constraint>
+      </properties>
+    </leafNode>
+    <tagNode name="prefix">
+      <properties>
+        <help>Static IPv4/IPv6 prefix segment/label mapping</help>
+        <valueHelp>
+          <format>ipv4net</format>
+          <description>IPv4 prefix segment</description>
+        </valueHelp>
+        <valueHelp>
+          <format>ipv6net</format>
+          <description>IPv6 prefix segment</description>
+        </valueHelp>
+        <constraint>
+          <validator name="ipv4-prefix"/>
+          <validator name="ipv6-prefix"/>
+        </constraint>
+      </properties>
+      <children>
+        <node name="absolute">
+          <properties>
+            <help>Specify the absolute value of prefix segment/label ID</help>
+          </properties>
+          <children>
+            <leafNode name="value">
+              <properties>
+                <help>Specify the absolute value of prefix segment/label ID</help>
+                <valueHelp>
+                  <format>u32:16-1048575</format>
+                    <description>The absolute segment/label ID value</description>
+                </valueHelp>
+                <constraint>
+                  <validator name="numeric" argument="--range 16-1048575"/>
+                </constraint>
+              </properties>
+            </leafNode>
+            <leafNode name="explicit-null">
+              <properties>
+                <help>Request upstream neighbor to replace segment/label with explicit null label</help>
+                <valueless/>
+              </properties>
+            </leafNode>
+            <leafNode name="no-php-flag">
+              <properties>
+                <help>Do not request penultimate hop popping for segment/label</help>
+                <valueless/>
+              </properties>
+            </leafNode>
+          </children>
+        </node>
+        <node name="index">
+          <properties>
+            <help>Specify the index value of prefix segment/label ID</help>
+          </properties>
+          <children>
+            <leafNode name="value">
+              <properties>
+                <help>Specify the index value of prefix segment/label ID</help>
+                <valueHelp>
+                  <format>u32:0-65535</format>
+                    <description>The index segment/label ID value</description>
+                </valueHelp>
+                <constraint>
+                  <validator name="numeric" argument="--range 0-65535"/>
+                </constraint>
+              </properties>
+            </leafNode>
+            <leafNode name="explicit-null">
+              <properties>
+                <help>Request upstream neighbor to replace segment/label with explicit null label</help>
+                <valueless/>
+              </properties>
+            </leafNode>
+            <leafNode name="no-php-flag">
+              <properties>
+                <help>Do not request penultimate hop popping for segment/label</help>
+                <valueless/>
+              </properties>
+            </leafNode>
+          </children>
+        </node>
+      </children>
+    </tagNode>
+  </children>
+</node>
+<node name="redistribute">
+  <properties>
+    <help>Redistribute information from another routing protocol</help>
+  </properties>
+  <children>
+    <node name="ipv4">
+      <properties>
+        <help>Redistribute IPv4 routes</help>
+      </properties>
+      <children>
+        <node name="bgp">
+          <properties>
+            <help>Border Gateway Protocol (BGP)</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+        <node name="connected">
+          <properties>
+            <help>Redistribute connected routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+        <node name="kernel">
+          <properties>
+            <help>Redistribute kernel routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+        <node name="ospf">
+          <properties>
+            <help>Redistribute OSPF routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+        <node name="rip">
+          <properties>
+            <help>Redistribute RIP routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+        <node name="static">
+          <properties>
+            <help>Redistribute static routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+      </children>
+    </node>
+    <node name="ipv6">
+      <properties>
+        <help>Redistribute IPv6 routes</help>
+      </properties>
+      <children>
+        <node name="bgp">
+          <properties>
+            <help>Redistribute BGP routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+        <node name="connected">
+          <properties>
+            <help>Redistribute connected routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+        <node name="kernel">
+          <properties>
+            <help>Redistribute kernel routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+        <node name="ospf6">
+          <properties>
+            <help>Redistribute OSPFv3 routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+        <node name="ripng">
+          <properties>
+            <help>Redistribute RIPng routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+        <node name="static">
+          <properties>
+            <help>Redistribute static routes into IS-IS</help>
+          </properties>
+          <children>
+            #include <include/isis/redistribute-level-1-2.xml.i>
+          </children>
+        </node>
+      </children>
+    </node>
+  </children>
+</node>
+<leafNode name="set-attached-bit">
+  <properties>
+    <help>Set attached bit to identify as L1/L2 router for inter-area traffic</help>
+    <valueless/>
+  </properties>
+</leafNode>
+<leafNode name="set-overload-bit">
+  <properties>
+    <help>Set overload bit to avoid any transit traffic</help>
+    <valueless/>
+  </properties>
+</leafNode>
+<node name="spf-delay-ietf">
+  <properties>
+    <help>IETF SPF delay algorithm</help>
+  </properties>
+  <children>
+    <leafNode name="init-delay">
+      <properties>
+        <help>Delay used while in QUIET state</help>
+        <valueHelp>
+          <format>u32:0-60000</format>
+          <description>Delay used while in QUIET state (in ms)</description>
+        </valueHelp>
+        <constraint>
+          <validator name="numeric" argument="--range 0-60000"/>
+        </constraint>
+      </properties>
+    </leafNode>
+    <leafNode name="short-delay">
+      <properties>
+        <help>Delay used while in SHORT_WAIT state</help>
+        <valueHelp>
+          <format>u32:0-60000</format>
+          <description>Delay used while in SHORT_WAIT state (in ms)</description>
+        </valueHelp>
+        <constraint>
+          <validator name="numeric" argument="--range 0-60000"/>
+        </constraint>
+      </properties>
+    </leafNode>
+    <leafNode name="long-delay">
+      <properties>
+        <help>Delay used while in LONG_WAIT</help>
+        <valueHelp>
+          <format>u32:0-60000</format>
+          <description>Delay used while in LONG_WAIT state in ms</description>
+        </valueHelp>
+        <constraint>
+          <validator name="numeric" argument="--range 0-60000"/>
+        </constraint>
+      </properties>
+    </leafNode>
+    <leafNode name="holddown">
+      <properties>
+        <help>Time with no received IGP events before considering IGP stable</help>
+        <valueHelp>
+          <format>u32:0-60000</format>
+          <description>Time with no received IGP events before considering IGP stable in ms</description>
+        </valueHelp>
+        <constraint>
+          <validator name="numeric" argument="--range 0-60000"/>
+        </constraint>
+      </properties>
+    </leafNode>
+    <leafNode name="time-to-learn">
+      <properties>
+        <help>Maximum duration needed to learn all the events related to a single failure</help>
+        <valueHelp>
+          <format>u32:0-60000</format>
+          <description>Maximum duration needed to learn all the events related to a single failure in ms</description>
+        </valueHelp>
+        <constraint>
+          <validator name="numeric" argument="--range 0-60000"/>
+        </constraint>
+      </properties>
+    </leafNode>
+  </children>
+</node>
+<leafNode name="spf-interval">
+  <properties>
+    <help>Minimum interval between SPF calculations</help>
+    <valueHelp>
+      <format>u32:1-120</format>
+      <description>Interval in seconds</description>
+    </valueHelp>
+    <constraint>
+      <validator name="numeric" argument="--range 1-120"/>
+    </constraint>
+  </properties>
+</leafNode>
+<tagNode name="interface">
+  <properties>
+    <help>Interface params</help>
+    <completionHelp>
+      <script>${vyos_completion_dir}/list_interfaces.py</script>
+    </completionHelp>
+  </properties>
+  <children>
+    #include <include/bfd.xml.i>
+    <leafNode name="circuit-type">
+      <properties>
+        <help>Configure circuit type for interface</help>
+        <completionHelp>
+          <list>level-1 level-1-2 level-2-only</list>
+        </completionHelp>
+        <valueHelp>
+          <format>level-1</format>
+          <description>Level-1 only adjacencies are formed</description>
+        </valueHelp>
+        <valueHelp>
+          <format>level-1-2</format>
+          <description>Level-1-2 adjacencies are formed</description>
+        </valueHelp>
+        <valueHelp>
+          <format>level-2-only</format>
+          <description>Level-2 only adjacencies are formed</description>
+        </valueHelp>
+        <constraint>
+          <regex>^(level-1|level-1-2|level-2-only)$</regex>
+        </constraint>
+      </properties>
+    </leafNode>
+    <leafNode name="hello-padding">
+      <properties>
+        <help>Add padding to IS-IS hello packets</help>
+        <valueless/>
+      </properties>
+    </leafNode>
+    <leafNode name="hello-interval">
+      <properties>
+        <help>Set Hello interval</help>
+        <valueHelp>
+          <format>u32:1-600</format>
+          <description>Set Hello interval</description>
+        </valueHelp>
+        <constraint>
+          <validator name="numeric" argument="--range 1-600"/>
+        </constraint>
+      </properties>
+    </leafNode>
+    <leafNode name="hello-multiplier">
+      <properties>
+        <help>Set Hello interval</help>
+        <valueHelp>
+          <format>u32:2-100</format>
+          <description>Set multiplier for Hello holding time</description>
+        </valueHelp>
+        <constraint>
+          <validator name="numeric" argument="--range 2-100"/>
+        </constraint>
+      </properties>
+    </leafNode>
+    #include <include/isis/metric.xml.i>
+    <node name="network">
+      <properties>
+        <help>Set network type</help>
+      </properties>
+      <children>
+        <leafNode name="point-to-point">
+          <properties>
+            <help>point-to-point network type</help>
+            <valueless/>
+          </properties>
+        </leafNode>
+      </children>
+    </node>
+    #include <include/isis/passive.xml.i>
+    <node name="password">
+      <properties>
+        <help>Configure the authentication password for a circuit</help>
+      </properties>
+      <children>
+        <leafNode name="plaintext-password">
+          <properties>
+            <help>Plain-text authentication type</help>
+            <valueHelp>
+              <format>txt</format>
+              <description>Circuit password</description>
+            </valueHelp>
+          </properties>
+        </leafNode>
+      </children>
+    </node>
+    <leafNode name="priority">
+      <properties>
+        <help>Set priority for Designated Router election</help>
+        <valueHelp>
+          <format>u32:0-127</format>
+          <description>Priority value</description>
+        </valueHelp>
+        <constraint>
+          <validator name="numeric" argument="--range 0-127"/>
+        </constraint>
+      </properties>
+    </leafNode>
+    <leafNode name="psnp-interval">
+      <properties>
+        <help>Set PSNP interval</help>
+        <valueHelp>
+          <format>u32:0-127</format>
+          <description>PSNP interval in seconds</description>
+        </valueHelp>
+        <constraint>
+          <validator name="numeric" argument="--range 0-127"/>
+        </constraint>
+      </properties>
+    </leafNode>
+    <leafNode name="no-three-way-handshake">
+      <properties>
+        <help>Disable three-way handshake</help>
+        <valueless/>
+      </properties>
+    </leafNode>
+  </children>
+</tagNode>
+#include <include/route-map.xml.i>
+<!-- include end -->
\ No newline at end of file
diff --git a/interface-definitions/include/isis/redistribute-level-1-2.xml.i b/interface-definitions/include/isis/redistribute-level-1-2.xml.i
new file mode 100644
index 000000000..abb85274f
--- /dev/null
+++ b/interface-definitions/include/isis/redistribute-level-1-2.xml.i
@@ -0,0 +1,20 @@
+<!-- include start from isis/redistribute-level-1-2.xml.i -->
+<node name="level-1">
+  <properties>
+    <help>Redistribute into level-1</help>
+  </properties>
+  <children>
+    #include <include/isis/metric.xml.i>
+    #include <include/route-map.xml.i>
+  </children>
+</node>
+<node name="level-2">
+  <properties>
+    <help>Redistribute into level-2</help>
+  </properties>
+  <children>
+    #include <include/isis/metric.xml.i>
+    #include <include/route-map.xml.i>
+  </children>
+</node>
+<!-- include end -->
diff --git a/interface-definitions/include/route-map.xml.i b/interface-definitions/include/route-map.xml.i
new file mode 100644
index 000000000..88092b7d4
--- /dev/null
+++ b/interface-definitions/include/route-map.xml.i
@@ -0,0 +1,18 @@
+<!-- include start from route-map.xml.i -->
+<leafNode name="route-map">
+  <properties>
+    <help>Specify route-map name to use</help>
+    <completionHelp>
+      <path>policy route-map</path>
+    </completionHelp>
+    <valueHelp>
+      <format>txt</format>
+      <description>Route map name</description>
+    </valueHelp>
+    <constraint>
+      <regex>^[-_a-zA-Z0-9.]+$</regex>
+    </constraint>
+    <constraintErrorMessage>Name of route-map can only contain alpha-numeric letters, hyphen and underscores</constraintErrorMessage>
+  </properties>
+</leafNode>
+<!-- include end -->
diff --git a/interface-definitions/protocols-isis.xml.in b/interface-definitions/protocols-isis.xml.in
index 624c72a4c..e0bc47bb9 100644
--- a/interface-definitions/protocols-isis.xml.in
+++ b/interface-definitions/protocols-isis.xml.in
@@ -1,782 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <interfaceDefinition>
   <node name="protocols">
     <children>
-      <tagNode name="isis" owner="${vyos_conf_scripts_dir}/protocols_isis.py">
+      <node name="isis" owner="${vyos_conf_scripts_dir}/protocols_isis.py">
         <properties>
           <help>Intermediate System to Intermediate System (IS-IS)</help>
           <priority>610</priority>
-          <valueHelp>
-            <format>text(TAG)</format>
-            <description>ISO Routing area tag</description>
-          </valueHelp>
         </properties>
         <children>
-          <node name="area-password">
-            <properties>
-              <help>Configure the authentication password for an area</help>
-            </properties>
-            <children>
-              <leafNode name="plaintext-password">
-                <properties>
-                  <help>Plain-text authentication type</help>
-                  <valueHelp>
-                    <format>txt</format>
-                    <description>Level-wide password</description>
-                  </valueHelp>
-                </properties>
-              </leafNode>
-              <leafNode name="md5">
-                <properties>
-                  <help>MD5 authentication type</help>
-                  <valueHelp>
-                    <format>txt</format>
-                    <description>Level-wide password</description>
-                  </valueHelp>
-                </properties>
-              </leafNode>
-            </children>
-          </node>
-          <node name="default-information">
-            <properties>
-              <help>Control distribution of default information</help>
-            </properties>
-            <children>
-              <node name="originate">
-                <properties>
-                  <help>Distribute a default route</help>
-                </properties>
-                <children>
-                  <node name="ipv4">
-                    <properties>
-                      <help>Distribute default route for IPv4</help>
-                    </properties>
-                    <children>
-                      <leafNode name="level-1">
-                        <properties>
-                          <help>Distribute default route into level-1</help>
-                          <valueless/>
-                        </properties>
-                      </leafNode>
-                      <leafNode name="level-2">
-                        <properties>
-                          <help>Distribute default route into level-2</help>
-                          <valueless/>
-                        </properties>
-                      </leafNode>
-                    </children>
-                  </node>
-                  <node name="ipv6">
-                    <properties>
-                      <help>Distribute default route for IPv6</help>
-                    </properties>
-                    <children>
-                      <leafNode name="level-1">
-                        <properties>
-                          <help>Distribute default route into level-1</help>
-                          <completionHelp>
-                            <list>always</list>
-                          </completionHelp>
-                          <valueHelp>
-                            <format>always</format>
-                            <description>Always advertise default route</description>
-                          </valueHelp>
-                        </properties>
-                      </leafNode>
-                      <leafNode name="level-2">
-                        <properties>
-                          <help>Distribute default route into level-2</help>
-                          <completionHelp>
-                            <list>always</list>
-                          </completionHelp>
-                          <valueHelp>
-                            <format>always</format>
-                            <description>Always advertise default route</description>
-                          </valueHelp>
-                        </properties>
-                      </leafNode>
-                    </children>
-                  </node>
-                </children>
-              </node>
-            </children>
-          </node>
-          <node name="domain-password">
-            <properties>
-              <help>Set the authentication password for a routing domain</help>
-            </properties>
-            <children>
-              <leafNode name="plaintext-password">
-                <properties>
-                  <help>Plain-text authentication type</help>
-                  <valueHelp>
-                    <format>txt</format>
-                    <description>Level-wide password</description>
-                  </valueHelp>
-                </properties>
-              </leafNode>
-<!--
-              <leafNode name="md5">
-                <properties>
-                  <help>MD5 authentication type</help>
-                  <valueHelp>
-                    <format>txt</format>
-                    <description>Level-wide password</description>
-                  </valueHelp>
-                </properties>
-              </leafNode>
--->
-            </children>
-          </node>
-          <leafNode name="dynamic-hostname">
-            <properties>
-              <help>Dynamic hostname for IS-IS</help>
-              <valueless/>
-            </properties>
-          </leafNode>
-          <leafNode name="level">
-            <properties>
-              <help>IS-IS level number</help>
-              <completionHelp>
-                <list>level-1 level-1-2 level-2</list>
-              </completionHelp>
-              <valueHelp>
-                <format>level-1</format>
-                <description>Act as a station router</description>
-              </valueHelp>
-              <valueHelp>
-                <format>level-1-2</format>
-                <description>Act as both a station and an area router</description>
-              </valueHelp>
-              <valueHelp>
-                <format>level-2</format>
-                <description>Act as an area router</description>
-              </valueHelp>
-              <constraint>
-                <regex>^(level-1|level-1-2|level-2)$</regex>
-              </constraint>
-            </properties>
-          </leafNode>
-          <leafNode name="lsp-gen-interval">
-            <properties>
-              <help>Minimum interval between regenerating same LSP</help>
-              <valueHelp>
-                <format>u32:1-120</format>
-                <description>Minimum interval in seconds</description>
-              </valueHelp>
-              <constraint>
-                <validator name="numeric" argument="--range 1-120"/>
-              </constraint>
-            </properties>
-          </leafNode>
-          <leafNode name="lsp-mtu">
-            <properties>
-              <help>Configure the maximum size of generated LSPs</help>
-              <valueHelp>
-                <format>u32:128-4352</format>
-                <description>Maximum size of generated LSPs</description>
-              </valueHelp>
-              <constraint>
-                <validator name="numeric" argument="--range 128-4352"/>
-              </constraint>
-            </properties>
-          </leafNode>
-          <leafNode name="lsp-refresh-interval">
-            <properties>
-              <help>LSP refresh interval</help>
-              <valueHelp>
-                <format>u32:1-65235</format>
-                <description>LSP refresh interval in seconds</description>
-              </valueHelp>
-              <constraint>
-                <validator name="numeric" argument="--range 1-65235"/>
-              </constraint>
-            </properties>
-          </leafNode>
-          <leafNode name="max-lsp-lifetime">
-            <properties>
-              <help>Maximum LSP lifetime</help>
-              <valueHelp>
-                <format>u32:350-65535</format>
-                <description>LSP lifetime in seconds</description>
-              </valueHelp>
-              <constraint>
-                <validator name="numeric" argument="--range 1-65535"/>
-              </constraint>
-            </properties>
-          </leafNode>
-          <leafNode name="metric-style">
-            <properties>
-              <help>Use old-style (ISO 10589) or new-style packet formats</help>
-              <completionHelp>
-                <list>narrow transition wide</list>
-              </completionHelp>
-              <valueHelp>
-                <format>narrow</format>
-                <description>Use old style of TLVs with narrow metric</description>
-              </valueHelp>
-              <valueHelp>
-                <format>transition</format>
-                <description>Send and accept both styles of TLVs during transition</description>
-              </valueHelp>
-              <valueHelp>
-                <format>wide</format>
-                <description>Use new style of TLVs to carry wider metric</description>
-              </valueHelp>
-              <constraint>
-                <regex>^(narrow|transition|wide)$</regex>
-              </constraint>
-            </properties>
-          </leafNode>
-          <leafNode name="net">
-            <properties>
-              <help>A Network Entity Title for this process (ISO only)</help>
-              <valueHelp>
-                <format>XX.XXXX. ... .XXX.XX</format>
-                <description>Network entity title (NET)</description>
-              </valueHelp>
-              <constraint>
-                <regex>[a-fA-F0-9]{2}(\.[a-fA-F0-9]{4}){3,9}\.[a-fA-F0-9]{2}</regex>
-              </constraint>
-            </properties>
-          </leafNode>
-          <leafNode name="purge-originator">
-            <properties>
-              <help>Use the RFC 6232 purge-originator</help>
-              <valueless/>
-            </properties>
-          </leafNode>
-          <node name="traffic-engineering">
-            <properties>
-              <help>Show IS-IS neighbor adjacencies</help>
-            </properties>
-            <children>
-              <leafNode name="enable">
-                <properties>
-                  <help>Enable MPLS traffic engineering extensions</help>
-                  <valueless/>
-                </properties>
-              </leafNode>
-<!--
-              <node name="inter-as">
-                <properties>
-                  <help>MPLS traffic engineering inter-AS support</help>
-                </properties>
-                <children>
-                  <leafNode name="level-1">
-                    <properties>
-                      <help>Area native mode self originate inter-AS LSP with L1 only flooding scope</help>
-                      <valueless/>
-                    </properties>
-                  </leafNode>
-                  <leafNode name="level-1-2">
-                    <properties>
-                      <help>Area native mode self originate inter-AS LSP with L1 and L2 flooding scope</help>
-                      <valueless/>
-                    </properties>
-                  </leafNode>
-                  <leafNode name="level-2">
-                    <properties>
-                      <help>Area native mode self originate inter-AS LSP with L2 only flooding scope</help>
-                      <valueless/>
-                    </properties>
-                  </leafNode>
-                </children>
-              </node>
-              <leafNode name="inter-as">
-                <properties>
-                  <help>MPLS traffic engineering inter-AS support</help>
-                  <valueless/>
-                </properties>
-              </leafNode>
--->
-              <leafNode name="address">
-                <properties>
-                  <help>MPLS traffic engineering router ID</help>
-                  <valueHelp>
-                    <format>ipv4</format>
-                    <description>IPv4 address</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="ipv4-address"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-            </children>
-          </node>
-          <node name="segment-routing">
-            <properties>
-              <help>Segment-Routing (SPRING) settings</help>
-            </properties>
-            <children>
-              <leafNode name="enable">
-                <properties>
-                  <help>Enable segment-routing functionality</help>
-                  <valueless/>
-                </properties>
-              </leafNode>
-              <node name="global-block">
-                <properties>
-                  <help>Global block label range</help>
-                </properties>
-                <children>
-                  <leafNode name="low-label-value">
-                    <properties>
-                      <help>The lower bound of the global block</help>
-                      <valueHelp>
-                        <format>u32:16-1048575</format>
-                        <description>MPLS label value</description>
-                      </valueHelp>
-                      <constraint>
-                        <validator name="numeric" argument="--range 16-1048575"/>
-                      </constraint>
-                    </properties>
-                  </leafNode>
-                  <leafNode name="high-label-value">
-                    <properties>
-                      <help>The upper bound of the global block</help>
-                      <valueHelp>
-                        <format>u32:16-1048575</format>
-                        <description>MPLS label value</description>
-                      </valueHelp>
-                      <constraint>
-                        <validator name="numeric" argument="--range 16-1048575"/>
-                      </constraint>
-                    </properties>
-                  </leafNode>
-                </children>
-              </node>
-<!--
-              <node name="local-block">
-                <properties>
-                  <help>Local Block label range</help>
-                </properties>
-                <children>
-                  <leafNode name="low-label-value">
-                    <properties>
-                      <help>The lower bound of the local block</help>
-                      <valueHelp>
-                        <format>u32:16-1048575</format>
-                        <description>MPLS label value</description>
-                      </valueHelp>
-                      <constraint>
-                        <validator name="numeric" argument="  range 16-1048575"/>
-                      </constraint>
-                    </properties>
-                  </leafNode>
-                  <leafNode name="high-label-value">
-                    <properties>
-                      <help>The upper bound of the local block</help>
-                      <valueHelp>
-                        <format>u32:16-1048575</format>
-                        <description>MPLS label value</description>
-                      </valueHelp>
-                      <constraint>
-                        <validator name="numeric" argument="  range 16-1048575"/>
-                      </constraint>
-                    </properties>
-                  </leafNode>
-                </children>
-              </node>
--->
-              <leafNode name="maximum-label-depth">
-                <properties>
-                  <help>Maximum MPLS labels allowed for this router</help>
-                  <valueHelp>
-                    <format>u32:1-16</format>
-                      <description>MPLS label depth</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 1-16"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <tagNode name="prefix">
-                <properties>
-                  <help>Static IPv4/IPv6 prefix segment/label mapping</help>
-                  <valueHelp>
-                    <format>ipv4net</format>
-                    <description>IPv4 prefix segment</description>
-                  </valueHelp>
-                  <valueHelp>
-                    <format>ipv6net</format>
-                    <description>IPv6 prefix segment</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="ipv4-prefix"/>
-                    <validator name="ipv6-prefix"/>
-                  </constraint>
-                </properties>
-                <children>
-                  <node name="absolute">
-                    <properties>
-                      <help>Specify the absolute value of prefix segment/label ID</help>
-                    </properties>
-                    <children>
-                      <leafNode name="value">
-                        <properties>
-                          <help>Specify the absolute value of prefix segment/label ID</help>
-                          <valueHelp>
-                            <format>u32:16-1048575</format>
-                              <description>The absolute segment/label ID value</description>
-                          </valueHelp>
-                          <constraint>
-                            <validator name="numeric" argument="--range 16-1048575"/>
-                          </constraint>
-                        </properties>
-                      </leafNode>
-                      <leafNode name="explicit-null">
-                        <properties>
-                          <help>Request upstream neighbor to replace segment/label with explicit null label</help>
-                          <valueless/>
-                        </properties>
-                      </leafNode>
-                      <leafNode name="no-php-flag">
-                        <properties>
-                          <help>Do not request penultimate hop popping for segment/label</help>
-                          <valueless/>
-                        </properties>
-                      </leafNode>
-                    </children>
-                  </node>
-                  <node name="index">
-                    <properties>
-                      <help>Specify the index value of prefix segment/label ID</help>
-                    </properties>
-                    <children>
-                      <leafNode name="value">
-                        <properties>
-                          <help>Specify the index value of prefix segment/label ID</help>
-                          <valueHelp>
-                            <format>u32:0-65535</format>
-                              <description>The index segment/label ID value</description>
-                          </valueHelp>
-                          <constraint>
-                            <validator name="numeric" argument="--range 0-65535"/>
-                          </constraint>
-                        </properties>
-                      </leafNode>
-                      <leafNode name="explicit-null">
-                        <properties>
-                          <help>Request upstream neighbor to replace segment/label with explicit null label</help>
-                          <valueless/>
-                        </properties>
-                      </leafNode>
-                      <leafNode name="no-php-flag">
-                        <properties>
-                          <help>Do not request penultimate hop popping for segment/label</help>
-                          <valueless/>
-                        </properties>
-                      </leafNode>
-                    </children>
-                  </node>
-                </children>
-              </tagNode>
-            </children>
-          </node>
-          <node name="redistribute">
-            <properties>
-              <help>Redistribute information from another routing protocol</help>
-            </properties>
-            <children>
-              <node name="ipv4">
-                <properties>
-                  <help>Redistribute IPv4 routes</help>
-                </properties>
-                <children>
-                  <node name="bgp">
-                    <properties>
-                      <help>Border Gateway Protocol (BGP)</help>
-                    </properties>
-                    <children>
-                      #include <include/isis-redistribute-ipv4.xml.i>
-                    </children>
-                  </node>
-                  <node name="connected">
-                    <properties>
-                      <help>Redistribute connected routes into IS-IS</help>
-                    </properties>
-                    <children>
-                      #include <include/isis-redistribute-ipv4.xml.i>
-                    </children>
-                  </node>
-                  <node name="kernel">
-                    <properties>
-                      <help>Redistribute kernel routes into IS-IS</help>
-                    </properties>
-                    <children>
-                      #include <include/isis-redistribute-ipv4.xml.i>
-                    </children>
-                  </node>
-                  <node name="ospf">
-                    <properties>
-                      <help>Redistribute OSPF routes into IS-IS</help>
-                    </properties>
-                    <children>
-                      #include <include/isis-redistribute-ipv4.xml.i>
-                    </children>
-                  </node>
-                  <node name="rip">
-                    <properties>
-                      <help>Redistribute RIP routes into IS-IS</help>
-                    </properties>
-                    <children>
-                      #include <include/isis-redistribute-ipv4.xml.i>
-                    </children>
-                  </node>
-                  <node name="static">
-                    <properties>
-                      <help>Redistribute static routes into IS-IS</help>
-                    </properties>
-                    <children>
-                      #include <include/isis-redistribute-ipv4.xml.i>
-                    </children>
-                  </node>
-                </children>
-              </node>
-            </children>
-          </node>
-          <leafNode name="set-attached-bit">
-            <properties>
-              <help>Set attached bit to identify as L1/L2 router for inter-area traffic</help>
-              <valueless/>
-            </properties>
-          </leafNode>
-          <leafNode name="set-overload-bit">
-            <properties>
-              <help>Set overload bit to avoid any transit traffic</help>
-              <valueless/>
-            </properties>
-          </leafNode>
-          <node name="spf-delay-ietf">
-            <properties>
-              <help>IETF SPF delay algorithm</help>
-            </properties>
-            <children>
-              <leafNode name="init-delay">
-                <properties>
-                  <help>Delay used while in QUIET state</help>
-                  <valueHelp>
-                    <format>u32:0-60000</format>
-                    <description>Delay used while in QUIET state (in ms)</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 0-60000"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <leafNode name="short-delay">
-                <properties>
-                  <help>Delay used while in SHORT_WAIT state</help>
-                  <valueHelp>
-                    <format>u32:0-60000</format>
-                    <description>Delay used while in SHORT_WAIT state (in ms)</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 0-60000"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <leafNode name="long-delay">
-                <properties>
-                  <help>Delay used while in LONG_WAIT</help>
-                  <valueHelp>
-                    <format>u32:0-60000</format>
-                    <description>Delay used while in LONG_WAIT state (in ms)</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 0-60000"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <leafNode name="holddown">
-                <properties>
-                  <help>Time with no received IGP events before considering IGP stable</help>
-                  <valueHelp>
-                    <format>u32:0-60000</format>
-                    <description>Time with no received IGP events before considering IGP stable (in ms)</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 0-60000"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <leafNode name="time-to-learn">
-                <properties>
-                  <help>Maximum duration needed to learn all the events related to a single failure</help>
-                  <valueHelp>
-                    <format>u32:0-60000</format>
-                    <description>Maximum duration needed to learn all the events related to a single failure (in ms)</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 0-60000"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-            </children>
-          </node>
-          <leafNode name="spf-interval">
-            <properties>
-              <help>Minimum interval between SPF calculations</help>
-              <valueHelp>
-                <format>u32:1-120</format>
-                <description>Minimum interval between consecutive SPFs in seconds</description>
-              </valueHelp>
-              <constraint>
-                <validator name="numeric" argument="--range 1-120"/>
-              </constraint>
-            </properties>
-          </leafNode>
-          <tagNode name="interface">
-            <!-- (config-if)# ip router isis WORD (same as name of IS-IS process)
-                  if any section of "interface" pesent  -->
-            <properties>
-              <help>Interface params</help>
-              <completionHelp>
-                <script>${vyos_completion_dir}/list_interfaces.py</script>
-              </completionHelp>
-            </properties>
-            <children>
-              <leafNode name="bfd">
-                <properties>
-                  <help>Enable BFD support</help>
-                  <valueless/>
-                </properties>
-              </leafNode>
-              <leafNode name="circuit-type">
-                <properties>
-                  <help>Configure circuit type for interface</help>
-                  <completionHelp>
-                    <list>level-1 level-1-2 level-2-only</list>
-                  </completionHelp>
-                  <valueHelp>
-                    <format>level-1</format>
-                    <description>Level-1 only adjacencies are formed</description>
-                  </valueHelp>
-                  <valueHelp>
-                    <format>level-1-2</format>
-                    <description>Level-1-2 adjacencies are formed</description>
-                  </valueHelp>
-                  <valueHelp>
-                    <format>level-2-only</format>
-                    <description>Level-2 only adjacencies are formed</description>
-                  </valueHelp>
-                  <constraint>
-                    <regex>^(level-1|level-1-2|level-2-only)$</regex>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <leafNode name="hello-padding">
-                <properties>
-                  <help>Add padding to IS-IS hello packets</help>
-                  <valueless/>
-                </properties>
-              </leafNode>
-              <leafNode name="hello-interval">
-                <properties>
-                  <help>Set Hello interval</help>
-                  <valueHelp>
-                    <format>u32:1-600</format>
-                    <description>Set Hello interval</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 1-600"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <leafNode name="hello-multiplier">
-                <properties>
-                  <help>Set Hello interval</help>
-                  <valueHelp>
-                    <format>u32:2-100</format>
-                    <description>Set multiplier for Hello holding time</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 2-100"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <leafNode name="metric">
-                <properties>
-                  <help>Set default metric for circuit</help>
-                  <valueHelp>
-                    <format>u32:0-16777215</format>
-                    <description>Default metric value</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 0-16777215"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <node name="network">
-                <properties>
-                  <help>Set network type</help>
-                </properties>
-                <children>
-                  <leafNode name="point-to-point">
-                    <properties>
-                      <help>point-to-point network type</help>
-                      <valueless/>
-                    </properties>
-                  </leafNode>
-                </children>
-              </node>
-              <leafNode name="passive">
-                <properties>
-                  <help>Configure the passive mode for interface</help>
-                  <valueless/>
-                </properties>
-              </leafNode>
-              <node name="password">
-                <properties>
-                  <help>Configure the authentication password for a circuit</help>
-                </properties>
-                <children>
-                  <leafNode name="plaintext-password">
-                    <properties>
-                      <help>Plain-text authentication type</help>
-                      <valueHelp>
-                        <format>txt</format>
-                        <description>Circuit password</description>
-                      </valueHelp>
-                    </properties>
-                  </leafNode>
-                </children>
-              </node>
-              <leafNode name="priority">
-                <properties>
-                  <help>Set priority for Designated Router election</help>
-                  <valueHelp>
-                    <format>u32:0-127</format>
-                    <description>Priority value</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 0-127"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <leafNode name="psnp-interval">
-                <properties>
-                  <help>Set PSNP interval in seconds</help>
-                  <valueHelp>
-                    <format>u32:0-127</format>
-                    <description>Priority value</description>
-                  </valueHelp>
-                  <constraint>
-                    <validator name="numeric" argument="--range 0-127"/>
-                  </constraint>
-                </properties>
-              </leafNode>
-              <leafNode name="no-three-way-handshake">
-                <properties>
-                  <help>Disable three-way handshake</help>
-                  <valueless/>
-                </properties>
-              </leafNode>
-            </children>
-          </tagNode>
+          #include <include/isis/protocol-common-config.xml.i>
         </children>
-      </tagNode>
+      </node>
     </children>
   </node>
 </interfaceDefinition>
diff --git a/smoketest/configs/isis-small b/smoketest/configs/isis-small
new file mode 100644
index 000000000..2c42ac9c4
--- /dev/null
+++ b/smoketest/configs/isis-small
@@ -0,0 +1,105 @@
+interfaces {
+    dummy dum0 {
+        address 203.0.113.1/24
+    }
+    ethernet eth0 {
+        duplex auto
+        speed auto
+    }
+    ethernet eth1 {
+        address 192.0.2.1/24
+        duplex auto
+        speed auto
+    }
+    ethernet eth2 {
+        duplex auto
+        speed auto
+    }
+    ethernet eth3 {
+        duplex auto
+        speed auto
+    }
+}
+policy {
+    prefix-list EXPORT-ISIS {
+        rule 10 {
+            action permit
+            prefix 203.0.113.0/24
+        }
+    }
+    route-map EXPORT-ISIS {
+        rule 10 {
+            action permit
+            match {
+                ip {
+                    address {
+                        prefix-list EXPORT-ISIS
+                    }
+                }
+            }
+        }
+    }
+}
+protocols {
+    isis FOO {
+        interface eth1 {
+           bfd
+        }
+        net 49.0001.1921.6800.1002.00
+        redistribute {
+            ipv4 {
+                connected {
+                    level-2 {
+                        route-map EXPORT-ISIS
+                    }
+                }
+            }
+        }
+    }
+}
+system {
+    config-management {
+        commit-revisions 200
+    }
+    console {
+        device ttyS0 {
+            speed 115200
+        }
+    }
+    domain-name vyos.io
+    host-name vyos
+    login {
+        user vyos {
+            authentication {
+                encrypted-password $6$2Ta6TWHd/U$NmrX0x9kexCimeOcYK1MfhMpITF9ELxHcaBU/znBq.X2ukQOj61fVI2UYP/xBzP4QtiTcdkgs7WOQMHWsRymO/
+                plaintext-password ""
+            }
+            level admin
+        }
+    }
+    ntp {
+        server 0.pool.ntp.org {
+        }
+        server 1.pool.ntp.org {
+        }
+        server 2.pool.ntp.org {
+        }
+    }
+    syslog {
+        global {
+            facility all {
+                level info
+            }
+            facility protocols {
+                level debug
+            }
+        }
+    }
+    time-zone Europe/Berlin
+}
+
+
+// Warning: Do not remove the following line.
+// vyos-config-version: "broadcast-relay@1:cluster@1:config-management@1:conntrack@1:conntrack-sync@1:dhcp-relay@2:dhcp-server@5:dhcpv6-server@1:dns-forwarding@3:firewall@5:https@2:interfaces@18:ipoe-server@1:ipsec@5:l2tp@3:lldp@1:mdns@1:nat@5:ntp@1:pppoe-server@5:pptp@2:qos@1:quagga@7:rpki@1:salt@1:snmp@2:ssh@2:sstp@3:system@20:vrrp@2:vyos-accel-ppp@2:wanloadbalance@3:webproxy@2:zone-policy@1"
+// Release version: 1.3.0-rc1
+
diff --git a/smoketest/scripts/cli/test_protocols_isis.py b/smoketest/scripts/cli/test_protocols_isis.py
new file mode 100755
index 000000000..482162b0e
--- /dev/null
+++ b/smoketest/scripts/cli/test_protocols_isis.py
@@ -0,0 +1,170 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2021 VyOS maintainers and contributors
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or later as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import unittest
+
+from base_vyostest_shim import VyOSUnitTestSHIM
+from vyos.configsession import ConfigSession
+from vyos.configsession import ConfigSessionError
+from vyos.ifconfig import Section
+from vyos.util import process_named_running
+
+PROCESS_NAME = 'isisd'
+base_path = ['protocols', 'isis']
+
+domain = 'VyOS'
+net = '49.0001.1921.6800.1002.00'
+
+class TestProtocolsISIS(VyOSUnitTestSHIM.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        cls._interfaces = Section.interfaces('ethernet')
+
+        # call base-classes classmethod
+        super(cls, cls).setUpClass()
+
+    def tearDown(self):
+        self.cli_delete(base_path)
+        self.cli_commit()
+
+        # Check for running process
+        self.assertTrue(process_named_running(PROCESS_NAME))
+
+    def isis_base_config(self):
+        self.cli_set(base_path + ['net', net])
+        for interface in self._interfaces:
+            self.cli_set(base_path + ['interface', interface])
+
+    def test_isis_01_redistribute(self):
+        prefix_list = 'EXPORT-ISIS'
+        route_map = 'EXPORT-ISIS'
+        rule = '10'
+
+        self.cli_set(['policy', 'prefix-list', prefix_list, 'rule', rule, 'action', 'permit'])
+        self.cli_set(['policy', 'prefix-list', prefix_list, 'rule', rule, 'prefix', '203.0.113.0/24'])
+        self.cli_set(['policy', 'route-map', route_map, 'rule', rule, 'action', 'permit'])
+        self.cli_set(['policy', 'route-map', route_map, 'rule', rule, 'match', 'ip', 'address', 'prefix-list', prefix_list])
+
+        self.cli_set(base_path)
+
+        # verify() - net id and interface are mandatory
+        with self.assertRaises(ConfigSessionError):
+            self.cli_commit()
+
+        self.isis_base_config()
+        self.cli_set(base_path + ['redistribute', 'ipv4', 'connected', 'level-2', 'route-map', route_map])
+        self.cli_set(base_path + ['log-adjacency-changes'])
+
+        # Commit all changes
+        self.cli_commit()
+
+        # Verify all changes
+        tmp = self.getFRRconfig(f'router isis {domain}')
+        self.assertIn(f' net {net}', tmp)
+        self.assertIn(f' log-adjacency-changes', tmp)
+        self.assertIn(f' redistribute ipv4 connected level-2 route-map {route_map}', tmp)
+
+        for interface in self._interfaces:
+            tmp = self.getFRRconfig(f'interface {interface}')
+            self.assertIn(f' ip router isis {domain}', tmp)
+            self.assertIn(f' ipv6 router isis {domain}', tmp)
+
+        self.cli_delete(['policy', 'route-map', route_map])
+        self.cli_delete(['policy', 'prefix-list', prefix_list])
+
+    def test_isis_02_zebra_route_map(self):
+        # Implemented because of T3328
+        route_map = 'foo-isis-in'
+
+        self.cli_set(['policy', 'route-map', route_map, 'rule', '10', 'action', 'permit'])
+
+        self.isis_base_config()
+        self.cli_set(base_path + ['redistribute', 'ipv4', 'connected', 'level-2', 'route-map', route_map])
+        self.cli_set(base_path + ['route-map', route_map])
+
+        # commit changes
+        self.cli_commit()
+
+        # Verify FRR configuration
+        zebra_route_map = f'ip protocol isis route-map {route_map}'
+        frrconfig = self.getFRRconfig(zebra_route_map)
+        self.assertIn(zebra_route_map, frrconfig)
+
+        # Remove the route-map again
+        self.cli_delete(base_path + ['route-map'])
+        # commit changes
+        self.cli_commit()
+
+        # Verify FRR configuration
+        frrconfig = self.getFRRconfig(zebra_route_map)
+        self.assertNotIn(zebra_route_map, frrconfig)
+
+        self.cli_delete(['policy', 'route-map', route_map])
+
+    def test_isis_03_default_information(self):
+        metric = '50'
+        route_map = 'default-foo-'
+
+        self.isis_base_config()
+        for afi in ['ipv4', 'ipv6']:
+            for level in ['level-1', 'level-2']:
+                self.cli_set(base_path + ['default-information', 'originate', afi, level, 'always'])
+                self.cli_set(base_path + ['default-information', 'originate', afi, level, 'metric', metric])
+                self.cli_set(base_path + ['default-information', 'originate', afi, level, 'route-map', route_map + level + afi])
+
+        # Commit all changes
+        self.cli_commit()
+
+        # Verify all changes
+        tmp = self.getFRRconfig(f'router isis {domain}')
+        self.assertIn(f' net {net}', tmp)
+
+        for afi in ['ipv4', 'ipv6']:
+            for level in ['level-1', 'level-2']:
+                route_map_name = route_map + level + afi
+                self.assertIn(f' default-information originate {afi} {level} always route-map {route_map_name} metric {metric}', tmp)
+
+    def test_isis_04_password(self):
+        password = 'foo'
+
+        self.isis_base_config()
+
+        self.cli_set(base_path + ['area-password', 'plaintext-password', password])
+        self.cli_set(base_path + ['area-password', 'md5', password])
+        self.cli_set(base_path + ['domain-password', 'plaintext-password', password])
+        self.cli_set(base_path + ['domain-password', 'md5', password])
+
+        # verify() - can not use both md5 and plaintext-password for area-password
+        with self.assertRaises(ConfigSessionError):
+            self.cli_commit()
+        self.cli_delete(base_path + ['area-password', 'md5', password])
+
+        # verify() - can not use both md5 and plaintext-password for domain-password
+        with self.assertRaises(ConfigSessionError):
+            self.cli_commit()
+        self.cli_delete(base_path + ['domain-password', 'md5', password])
+
+        # Commit all changes
+        self.cli_commit()
+
+        # Verify all changes
+        tmp = self.getFRRconfig(f'router isis {domain}')
+        self.assertIn(f' net {net}', tmp)
+        self.assertIn(f' domain-password clear {password}', tmp)
+        self.assertIn(f' area-password clear {password}', tmp)
+
+if __name__ == '__main__':
+    unittest.main(verbosity=2)
diff --git a/src/conf_mode/protocols_isis.py b/src/conf_mode/protocols_isis.py
index eab580083..0c179b724 100755
--- a/src/conf_mode/protocols_isis.py
+++ b/src/conf_mode/protocols_isis.py
@@ -1,173 +1,218 @@
 #!/usr/bin/env python3
 #
-# Copyright (C) 2020 VyOS maintainers and contributors
+# Copyright (C) 2020-2021 VyOS maintainers and contributors
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License version 2 or later as
 # published by the Free Software Foundation.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import os
 
 from sys import exit
 
 from vyos.config import Config
+from vyos.configdict import dict_merge
 from vyos.configdict import node_changed
-from vyos import ConfigError
-from vyos.util import call
+from vyos.configverify import verify_common_route_maps
+from vyos.configverify import verify_interface_exists
+from vyos.ifconfig import Interface
 from vyos.util import dict_search
-from vyos.template import render
+from vyos.util import get_interface_config
 from vyos.template import render_to_string
+from vyos.xml import defaults
+from vyos import ConfigError
 from vyos import frr
 from vyos import airbag
 airbag.enable()
 
 def get_config(config=None):
     if config:
         conf = config
     else:
         conf = Config()
-    base = ['protocols', 'isis']
 
-    isis = conf.get_config_dict(base, key_mangling=('-', '_'), get_first_key=True)
+    base = ['protocols', 'isis']
+    isis = conf.get_config_dict(base, key_mangling=('-', '_'),
+                                get_first_key=True)
+
+    interfaces_removed = node_changed(conf, base + ['interface'])
+    if interfaces_removed:
+        isis['interface_removed'] = list(interfaces_removed)
+
+    # Bail out early if configuration tree does not exist
+    if not conf.exists(base):
+        isis.update({'deleted' : ''})
+        return isis
+
+    # We have gathered the dict representation of the CLI, but there are default
+    # options which we need to update into the dictionary retrived.
+    # XXX: Note that we can not call defaults(base), as defaults does not work
+    # on an instance of a tag node.
+    default_values = defaults(base)
+    # merge in default values
+    isis = dict_merge(default_values, isis)
+
+    # We also need some additional information from the config, prefix-lists
+    # and route-maps for instance. They will be used in verify().
+    #
+    # XXX: one MUST always call this without the key_mangling() option! See
+    # vyos.configverify.verify_common_route_maps() for more information.
+    tmp = conf.get_config_dict(['policy'])
+    # Merge policy dict into "regular" config dict
+    isis = dict_merge(tmp, isis)
 
     return isis
 
 def verify(isis):
     # bail out early - looks like removal from running config
-    if not isis:
+    if not isis or 'deleted' in isis:
         return None
 
-    for process, isis_config in isis.items():
-        # If more then one isis process is defined (Frr only supports one)
-        # http://docs.frrouting.org/en/latest/isisd.html#isis-router
-        if len(isis) > 1:
-            raise ConfigError('Only one isis process can be defined')
-
-        # If network entity title (net) not defined
-        if 'net' not in isis_config:
-            raise ConfigError('ISIS net format iso is mandatory!')
-
-        # last byte in IS-IS area address must be 0
-        tmp = isis_config['net'].split('.')
-        if int(tmp[-1]) != 0:
-            raise ConfigError('Last byte of IS-IS network entity title must always be 0!')
-
-        # If interface not set
-        if 'interface' not in isis_config:
-            raise ConfigError('ISIS interface is mandatory!')
-
-        # If md5 and plaintext-password set at the same time
-        if 'area_password' in isis_config:
-            if {'md5', 'plaintext_password'} <= set(isis_config['encryption']):
-                raise ConfigError('Can not use both md5 and plaintext-password for ISIS area-password!')
-
-        # If one param from delay set, but not set others
-        if 'spf_delay_ietf' in isis_config:
-            required_timers = ['holddown', 'init_delay', 'long_delay', 'short_delay', 'time_to_learn']
-            exist_timers = []
-            for elm_timer in required_timers:
-                if elm_timer in isis_config['spf_delay_ietf']:
-                    exist_timers.append(elm_timer)
-
-            exist_timers = set(required_timers).difference(set(exist_timers))
-            if len(exist_timers) > 0:
-                raise ConfigError('All types of delay must be specified: ' + ', '.join(exist_timers).replace('_', '-'))
-
-        # If Redistribute set, but level don't set
-        if 'redistribute' in isis_config:
-            proc_level = isis_config.get('level','').replace('-','_')
-            for proto, proto_config in isis_config.get('redistribute', {}).get('ipv4', {}).items():
+    if 'net' not in isis:
+        raise ConfigError('Network entity is mandatory!')
+
+    # last byte in IS-IS area address must be 0
+    tmp = isis['net'].split('.')
+    if int(tmp[-1]) != 0:
+        raise ConfigError('Last byte of IS-IS network entity title must always be 0!')
+
+    verify_common_route_maps(isis)
+
+    # If interface not set
+    if 'interface' not in isis:
+        raise ConfigError('Interface used for routing updates is mandatory!')
+
+    for interface in isis['interface']:
+        verify_interface_exists(interface)
+        # Interface MTU must be >= configured lsp-mtu
+        mtu = Interface(interface).get_mtu()
+        area_mtu = isis['lsp_mtu']
+        # Recommended maximum PDU size = interface MTU - 3 bytes
+        recom_area_mtu = mtu - 3
+        if mtu < int(area_mtu) or int(area_mtu) > recom_area_mtu:
+            raise ConfigError(f'Interface {interface} has MTU {mtu}, ' \
+                              f'current area MTU is {area_mtu}! \n' \
+                              f'Recommended area lsp-mtu {recom_area_mtu} or less ' \
+                              '(calculated on MTU size).')
+
+    # If md5 and plaintext-password set at the same time
+    for password in ['area_password', 'domain_password']:
+        if password in isis:
+            if {'md5', 'plaintext_password'} <= set(isis[password]):
+                tmp = password.replace('_', '-')
+                raise ConfigError(f'Can use either md5 or plaintext-password for {tmp}!')
+
+    # If one param from delay set, but not set others
+    if 'spf_delay_ietf' in isis:
+        required_timers = ['holddown', 'init_delay', 'long_delay', 'short_delay', 'time_to_learn']
+        exist_timers = []
+        for elm_timer in required_timers:
+            if elm_timer in isis['spf_delay_ietf']:
+                exist_timers.append(elm_timer)
+
+        exist_timers = set(required_timers).difference(set(exist_timers))
+        if len(exist_timers) > 0:
+            raise ConfigError('All types of delay must be specified: ' + ', '.join(exist_timers).replace('_', '-'))
+
+    # If Redistribute set, but level don't set
+    if 'redistribute' in isis:
+        proc_level = isis.get('level','').replace('-','_')
+        for afi in ['ipv4', 'ipv6']:
+            if afi not in isis['redistribute']:
+                continue
+
+            for proto, proto_config in isis['redistribute'][afi].items():
                 if 'level_1' not in proto_config and 'level_2' not in proto_config:
-                    raise ConfigError('Redistribute level-1 or level-2 should be specified in \"protocols isis {} redistribute ipv4 {}\"'.format(process, proto))
-            for redistribute_level in proto_config.keys():
-                if proc_level and proc_level != 'level_1_2' and proc_level != redistribute_level:
-                    raise ConfigError('\"protocols isis {0} redistribute ipv4 {2} {3}\" cannot be used with \"protocols isis {0} level {1}\"'.format(process, proc_level, proto, redistribute_level))
-
-        # Segment routing checks
-        if dict_search('segment_routing', isis_config):
-            if dict_search('segment_routing.global_block', isis_config):
-                high_label_value = dict_search('segment_routing.global_block.high_label_value', isis_config)
-                low_label_value = dict_search('segment_routing.global_block.low_label_value', isis_config)
-                # If segment routing global block high value is blank, throw error
-                if low_label_value and not high_label_value:
-                    raise ConfigError('Segment routing global block high value must not be left blank')
-                # If segment routing global block low value is blank, throw error
-                if high_label_value and not low_label_value:
-                    raise ConfigError('Segment routing global block low value must not be left blank')
-                # If segment routing global block low value is higher than the high value, throw error
-                if int(low_label_value) > int(high_label_value):
-                    raise ConfigError('Segment routing global block low value must be lower than high value')
-                
-            if dict_search('segment_routing.local_block', isis_config):
-                high_label_value = dict_search('segment_routing.local_block.high_label_value', isis_config)
-                low_label_value = dict_search('segment_routing.local_block.low_label_value', isis_config)
-                # If segment routing local block high value is blank, throw error
-                if low_label_value and not high_label_value:
-                    raise ConfigError('Segment routing local block high value must not be left blank')
-                # If segment routing local block low value is blank, throw error
-                if high_label_value and not low_label_value:
-                    raise ConfigError('Segment routing local block low value must not be left blank')
-                # If segment routing local block low value is higher than the high value, throw error
-                if int(low_label_value) > int(high_label_value):
-                    raise ConfigError('Segment routing local block low value must be lower than high value')
+                    raise ConfigError(f'Redistribute level-1 or level-2 should be specified in ' \
+                                      f'"protocols isis {process} redistribute {afi} {proto}"!')
+
+                for redistr_level, redistr_config in proto_config.items():
+                    if proc_level and proc_level != 'level_1_2' and proc_level != redistr_level:
+                        raise ConfigError(f'"protocols isis {process} redistribute {afi} {proto} {redistr_level}" ' \
+                                          f'can not be used with \"protocols isis {process} level {proc_level}\"')
+
+    # Segment routing checks
+    if dict_search('segment_routing.global_block', isis):
+        high_label_value = dict_search('segment_routing.global_block.high_label_value', isis)
+        low_label_value = dict_search('segment_routing.global_block.low_label_value', isis)
+
+        # If segment routing global block high value is blank, throw error
+        if (low_label_value and not high_label_value) or (high_label_value and not low_label_value):
+            raise ConfigError('Segment routing global block requires both low and high value!')
+
+        # If segment routing global block low value is higher than the high value, throw error
+        if int(low_label_value) > int(high_label_value):
+            raise ConfigError('Segment routing global block low value must be lower than high value')
+
+    if dict_search('segment_routing.local_block', isis):
+        high_label_value = dict_search('segment_routing.local_block.high_label_value', isis)
+        low_label_value = dict_search('segment_routing.local_block.low_label_value', isis)
+
+        # If segment routing local block high value is blank, throw error
+        if (low_label_value and not high_label_value) or (high_label_value and not low_label_value):
+            raise ConfigError('Segment routing local block requires both high and low value!')
+
+        # If segment routing local block low value is higher than the high value, throw error
+        if int(low_label_value) > int(high_label_value):
+            raise ConfigError('Segment routing local block low value must be lower than high value')
 
     return None
 
 def generate(isis):
-    if not isis:
-        isis['new_frr_config'] = ''
+    if not isis or 'deleted' in isis:
+        isis['frr_isisd_config'] = ''
+        isis['frr_zebra_config'] = ''
         return None
 
-    # only one ISIS process is supported, so we can directly send the first key
-    # of the config dict
-    process = list(isis.keys())[0]
-    isis[process]['process'] = process
-
-    isis['new_frr_config'] = render_to_string('frr/isisd.frr.tmpl',
-                                              isis[process])
-
+    isis['protocol'] = 'isis' # required for frr/route-map.frr.tmpl
+    isis['frr_zebra_config'] = render_to_string('frr/route-map.frr.tmpl', isis)
+    isis['frr_isisd_config'] = render_to_string('frr/isisd.frr.tmpl', isis)
     return None
 
 def apply(isis):
+    isis_daemon = 'isisd'
+    zebra_daemon = 'zebra'
+
     # Save original configuration prior to starting any commit actions
     frr_cfg = frr.FRRConfig()
-    frr_cfg.load_configuration(daemon='isisd')
-    frr_cfg.modify_section(r'interface \S+', '')
-    frr_cfg.modify_section(f'router isis \S+', '')
-    frr_cfg.add_before(r'(ip prefix-list .*|route-map .*|line vty)', isis['new_frr_config'])
-    frr_cfg.commit_configuration(daemon='isisd')
-
-    # If FRR config is blank, rerun the blank commit x times due to frr-reload
-    # behavior/bug not properly clearing out on one commit.
-    if isis['new_frr_config'] == '':
-        for a in range(5):
-            frr_cfg.commit_configuration(daemon='isisd')
-
-    # Debugging
-    '''
-    print('')
-    print('--------- DEBUGGING ----------')
-    print(f'Existing config:\n{frr_cfg["original_config"]}\n\n')
-    print(f'Replacement config:\n{isis["new_frr_config"]}\n\n')
-    print(f'Modified config:\n{frr_cfg["modified_config"]}\n\n')
-   '''
+
+    # The route-map used for the FIB (zebra) is part of the zebra daemon
+    frr_cfg.load_configuration(zebra_daemon)
+    frr_cfg.modify_section(r'(\s+)?ip protocol isis route-map [-a-zA-Z0-9.]+$', '', '(\s|!)')
+    frr_cfg.add_before(r'(ip prefix-list .*|route-map .*|line vty)', isis['frr_zebra_config'])
+    frr_cfg.commit_configuration(zebra_daemon)
+
+    frr_cfg.load_configuration(isis_daemon)
+    frr_cfg.modify_section(f'^router isis VyOS$', '')
+
+    for key in ['interface', 'interface_removed']:
+        if key not in isis:
+            continue
+        for interface in isis[key]:
+            frr_cfg.modify_section(f'^interface {interface}$', '')
+
+    frr_cfg.add_before(r'(ip prefix-list .*|route-map .*|line vty)', isis['frr_isisd_config'])
+    frr_cfg.commit_configuration(isis_daemon)
+
+    # Save configuration to /run/frr/config/frr.conf
+    frr.save_configuration()
 
     return None
 
 if __name__ == '__main__':
     try:
         c = get_config()
         verify(c)
         generate(c)
         apply(c)
     except ConfigError as e:
         print(e)
         exit(1)
diff --git a/src/migration-scripts/isis/0-to-1 b/src/migration-scripts/isis/0-to-1
new file mode 100755
index 000000000..93cbbbed5
--- /dev/null
+++ b/src/migration-scripts/isis/0-to-1
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2021 VyOS maintainers and contributors
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or later as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# T3417: migrate IS-IS tagNode to node as we can only have one IS-IS process
+
+from sys import argv
+from sys import exit
+
+from vyos.configtree import ConfigTree
+
+if (len(argv) < 1):
+    print("Must specify file name!")
+    exit(1)
+
+file_name = argv[1]
+
+with open(file_name, 'r') as f:
+    config_file = f.read()
+
+base = ['protocols', 'isis']
+config = ConfigTree(config_file)
+
+if not config.exists(base):
+    # Nothing to do
+    exit(0)
+
+# Only one IS-IS process is supported, thus this operation is save
+isis_base = base + config.list_nodes(base)
+
+# We need a temporary copy of the config
+tmp_base = ['protocols', 'isis2']
+config.copy(isis_base, tmp_base)
+
+# Now it's save to delete the old configuration
+config.delete(base)
+
+# Rename temporary copy to new final config (IS-IS domain key is static and no
+# longer required to be set via CLI)
+config.rename(tmp_base, 'isis')
+
+try:
+    with open(file_name, 'w') as f:
+        f.write(config.to_string())
+except OSError as e:
+    print(f'Failed to save the modified config: {e}')
+    exit(1)