diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..53a2343
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+*~
+*.orig
+*#
+.*.swp
+debian/files
+debian/tmp
+debian/vyatta-frr-vci
+debian/vyatta-protocols-frr
+debian/*.debhelper.log
+debian/*.substvars
+debian/*-yang
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..44050da
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,120 @@
+This repository uses SPDX (https://spdx.org/) tags.
+
+
+Files without a "SPDX-License-Identifier" tag or with the "SPDX-License-Identifier: GPL-2.0-only" tag are available under the following license:
+
+GNU GENERAL PUBLIC LICENSE
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+    0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+
+    Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+    1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+
+    You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+    2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+        a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+        b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+        c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+
+    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+    In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+    3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+        a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+        b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+        c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+
+    The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+    If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+    4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+    5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+    6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+    7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+
+    If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+    It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+    This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+    8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+    9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+    Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+    10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+    NO WARRANTY
+    11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+    12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+<one line to give the program's name and an idea of what it does.>
+Copyright (C) < yyyy> <name of author>
+
+This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+<signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
+
+
+Files with the "SPDX-License-Identifier: BSD-3-Clause" tag are available under the following license:
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..83c298c
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# vyatta-protocols-frr
diff --git a/cmd/frr/main.go b/cmd/frr/main.go
new file mode 100644
index 0000000..3906559
--- /dev/null
+++ b/cmd/frr/main.go
@@ -0,0 +1,67 @@
+// Copyright (c) 2018-2019, AT&T Intellectual Property.
+// All rights reserved.
+//
+// SPDX-License-Identifier: GPL-2.0-only
+
+package main
+
+import (
+	"encoding/json"
+	"eng.vyatta.net/protocols"
+	"eng.vyatta.net/protocols/static"
+	"errors"
+	log "github.com/Sirupsen/logrus"
+	"os/exec"
+)
+
+const (
+	cfgFileName   = "frr.json"
+	componentName = "net.vyatta.vci.frr"
+	v1Component   = componentName + ".v1"
+)
+
+func Set(pmc *protocols.ProtocolsModelComponent, cfg []byte) error {
+	var frontend_interface, old_frontend_interface interface{}
+
+	old_cfg := pmc.Get()
+	old_conv_cfg, err := protocols.ConvertConfigToInternalJson(old_cfg)
+	if err != nil {
+		log.Errorln("Failed to convert old config from RFC 7951 JSON: " + err.Error())
+		return err
+	}
+	json.Unmarshal(old_conv_cfg, &old_frontend_interface)
+	old_frontend_map := old_frontend_interface.(map[string]interface{})
+
+	json.Unmarshal(cfg, &frontend_interface)
+	frontend_map := frontend_interface.(map[string]interface{})
+
+	//Strip out disabled nexthops and other translations
+	static.Translate(frontend_map, old_frontend_map)
+
+	//Enable MPLS in kernel if required
+	Mpls(frontend_map)
+
+	//Write new config file
+	jsonString, _ := json.MarshalIndent(frontend_map, "", "    ")
+	err = pmc.WriteJsonFile(jsonString, pmc.GetDaemonConfigFilePath())
+	if err != nil {
+		log.Errorln(err)
+		return err
+	}
+
+	err = exec.Command("/opt/vyatta/sbin/parser.py").Run()
+	if err != nil {
+		msg := "Failed to run FRR translation: " + err.Error()
+		log.Errorln(msg)
+		return errors.New(msg)
+	}
+
+	log.Infoln("FRR translation successful")
+	return nil
+}
+
+func main() {
+	pmc := protocols.NewProtocolsModelComponent(v1Component, cfgFileName)
+	pmc.SetSetFunction(Set)
+	pmc.Run(componentName)
+}
diff --git a/cmd/frr/mpls.go b/cmd/frr/mpls.go
new file mode 100644
index 0000000..d0f3598
--- /dev/null
+++ b/cmd/frr/mpls.go
@@ -0,0 +1,98 @@
+// Copyright (c) 2018-2019, AT&T Intellectual Property.
+// All rights reserved.
+//
+// SPDX-License-Identifier: GPL-2.0-only
+
+package main
+
+import (
+	"errors"
+	"fmt"
+	"os"
+)
+
+func Mpls(frontend_map map[string]interface{}) error {
+	if frontend_map == nil || frontend_map["protocols"] == nil {
+		return nil
+	}
+
+	proto_map := frontend_map["protocols"].(map[string]interface{})
+	if proto_map == nil || proto_map["mpls-ldp"] == nil {
+		return nil
+	}
+
+	ldp_map := proto_map["mpls-ldp"].(map[string]interface{})
+	if ldp_map == nil || ldp_map["address-family"] == nil {
+		return nil
+	}
+
+	af_map := ldp_map["address-family"].(map[string]interface{})
+	if af_map == nil || af_map["ipv4"] == nil {
+		return nil
+	}
+
+	v4_map := af_map["ipv4"].(map[string]interface{})
+	if v4_map == nil || v4_map["discovery"] == nil {
+		return nil
+	}
+
+	disc_map := v4_map["discovery"].(map[string]interface{})
+	if disc_map == nil || disc_map["interfaces"] == nil {
+		return nil
+	}
+
+	intf_map := disc_map["interfaces"].(map[string]interface{})
+	if intf_map == nil || intf_map["interface"] == nil {
+		return nil
+	}
+
+	intf_arr := intf_map["interface"].([]interface{})
+	if intf_arr == nil {
+		return nil
+	}
+
+	//Set up kernel label table
+	f, err := os.OpenFile("/proc/sys/net/mpls/platform_labels",
+		os.O_WRONLY, 0)
+	if err != nil {
+		msg := "Failed to open platform labels: " + err.Error()
+		fmt.Println(msg)
+		return errors.New(msg)
+	}
+	_, err = f.Write([]byte("1048575\n"))
+	f.Close()
+	if err != nil {
+		msg := "Failed to write platform labels: " + err.Error()
+		fmt.Println(msg)
+		return errors.New(msg)
+	}
+
+	for _, intf_entry := range intf_arr {
+		intf_entry_map := intf_entry.(map[string]interface{})
+		if intf_entry_map["interface"] == nil {
+			continue
+		}
+
+		intf_name := intf_entry_map["interface"].(string)
+
+		//Enable MPLS forwarding on the interface
+		f, err = os.OpenFile("/proc/sys/net/mpls/conf/"+intf_name+
+			"/input", os.O_WRONLY, 0)
+		if err != nil {
+			msg := "Failed to open MPLS conf for " +
+				intf_name + ": " + err.Error()
+			fmt.Println(msg)
+			return errors.New(msg)
+		}
+		_, err = f.Write([]byte("1\n"))
+		f.Close()
+		if err != nil {
+			msg := "Failed to write MPLS conf for " +
+				intf_name + ": " + err.Error()
+			fmt.Println(msg)
+			return errors.New(msg)
+		}
+	}
+
+	return nil
+}
diff --git a/component-config/frr.conf b/component-config/frr.conf
new file mode 100644
index 0000000..74e0f12
--- /dev/null
+++ b/component-config/frr.conf
@@ -0,0 +1 @@
+!
\ No newline at end of file
diff --git a/component-config/mpls-modules.conf b/component-config/mpls-modules.conf
new file mode 100644
index 0000000..dce4105
--- /dev/null
+++ b/component-config/mpls-modules.conf
@@ -0,0 +1,2 @@
+mpls_router
+mpls_iptunnel
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..f530480
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+vyatta-protocols-frr (1.12.3) unstable; urgency=medium
+
+  * DANOS Import
+
+ -- Vyatta Package Maintainers <DL-vyatta-help@att.com>  Mon, 4 Nov 2019 14:30:00 +0000
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..ec63514
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..1cdbef3
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,188 @@
+Source: vyatta-protocols-frr
+Section: contrib/net
+Priority: extra
+Maintainer: Vyatta Package Maintainers <DL-vyatta-help@att.com>
+Build-Depends:
+ debhelper (>= 9),
+ dh-golang,
+ dh-python,
+ dh-vci,
+ dh-yang,
+ golang-any,
+ golang-vyatta-protocols-dev,
+ python3
+Standards-Version: 3.9.8
+
+Package: vyatta-protocols-frr
+Provides: vyatta-protocols
+Conflicts: vyatta-protocols-ipi
+Breaks: vyatta-protocols (<< 1.12.0)
+Replaces: vyatta-protocols (<< 1.12.0)
+Architecture: all
+Depends: frr, vyatta-protocols-common, ${misc:Depends}
+Description: Common scripts & libs for FRR on Vyatta
+
+Package: vyatta-op-show-ip-ipv6-route-frr-v1-yang
+Architecture: all
+Depends: ${misc:Depends}, ${yang:Depends}
+Description: Routing table show CLI for FRR
+ The YANG module package for vyatta-op-show-ip-ipv6-route-frr-v1
+
+Package: vyatta-op-show-monitoring-protocols-frr-v1-yang
+Architecture: all
+Depends: ${misc:Depends}, ${yang:Depends}
+Description: "show monitoring protocols" operational YANG module
+ The YANG module package for vyatta-op-show-monitoring-protocols-frr-yang
+
+Package: vyatta-op-protocols-frr-zebra-v1-yang
+Architecture: all
+Depends: ${misc:Depends}, ${yang:Depends}
+Description: Zebra operational YANG module
+ The YANG module package for vyatta-op-protocols-frr-zebra-v1-yang
+
+Package: vyatta-op-protocols-frr-bgp-v1-yang
+Architecture: all
+Depends:
+ vyatta-op-common-protocols-bgp-v1-yang,
+ ${misc:Depends},
+ ${yang:Depends}
+Description: BGP operational YANG module
+ The YANG module package for vyatta-op-frr-bgp-v1-yang
+
+Package: vyatta-op-protocols-frr-bgp-routing-instance-v1-yang
+Architecture: all
+Depends:
+ vyatta-op-common-protocols-bgp-routing-instance-v1-yang,
+ ${misc:Depends},
+ ${yang:Depends}
+Description: BGP routing instance operational YANG module
+ The YANG module package for vyatta-op-frr-bgp-routing-instance-v1-yang
+
+Package: vyatta-protocols-frr-bgp-v1-yang
+Architecture: all
+Depends:
+ frr,
+ vyatta-cfg (>= 0.18.56),
+ vyatta-frr-vci,
+ vyatta-protocols-frr (>= ${source:Version}),
+ vyatta-vrrp-v1-yang,
+ ${misc:Depends},
+ ${perl:Depends},
+ ${yang:Depends}
+Description: bgp yang module package
+ The YANG module package for vyatta-protocols-bgp-v1
+
+Package: vyatta-protocols-frr-bgp-routing-instance-v1-yang
+Architecture: all
+Depends: frr, vyatta-frr-vci, ${misc:Depends}, ${yang:Depends}
+Description: BGP Yang module which supports Routing Instance
+ The YANG module for vyatta-protocols-frr-bgp-routing-instance-v1
+
+Package: vyatta-frr-vci
+Architecture: any
+Priority: extra
+Depends: frr-pythontools, python3, ${misc:Depends}, ${shlibs:Depends}
+Conflicts:
+ vyatta-bgp-vci,
+ vyatta-ospf-vci,
+ vyatta-policy-route-vci,
+ vyatta-rib-vci
+Built-Using: ${misc:Built-Using}
+Description: FRR Service
+ Service for FRR using the Vyatta Component Infrastructure
+
+Package: vyatta-op-protocols-frr-ospf-v1-yang
+Architecture: all
+Depends:
+ vyatta-op-common-protocols-ospf-v1-yang,
+ ${misc:Depends},
+ ${yang:Depends}
+Description: OSPF operational YANG module
+ The YANG module package for vyatta-op-protocols-frr-ospf-v1-yang
+
+Package: vyatta-op-protocols-frr-ospf-routing-instance-v1-yang
+Architecture: all
+Depends:
+ vyatta-op-common-protocols-ospf-routing-instance-v1-yang,
+ ${misc:Depends},
+ ${yang:Depends}
+Description: OSPF routing instance operational YANG module
+ The YANG module package for vyatta-op-protocols-frr-ospf-routing-instance-v1-yang
+
+Package: vyatta-protocols-frr-ospf-v1-yang
+Architecture: all
+Depends:
+ frr,
+ vyatta-cfg (>= 0.18.56),
+ vyatta-frr-vci,
+ vyatta-protocols-frr (>= ${source:Version}),
+ ${misc:Depends},
+ ${yang:Depends}
+Conflicts: vyatta-protocols-ospf-v1-yang
+Description: FRR ospf yang module package
+ The YANG module package for vyatta-protocols-frr-ospf-v1
+
+Package: vyatta-protocols-frr-ospf-routing-instance-v1-yang
+Architecture: all
+Depends:
+ frr,
+ vyatta-cfg (>= 0.18.56),
+ vyatta-frr-vci,
+ vyatta-protocols-frr (>= ${source:Version}),
+ ${misc:Depends},
+ ${yang:Depends}
+Description: ospf yang module package for routing-instance support
+ The YANG module package for vyatta-protocols-frr-ospf-routing-instance-v1
+
+Package: vyatta-protocols-frr-switch-vif-ospf-v1-yang
+Architecture: any
+Depends: ${misc:Depends}, ${yang:Depends}
+Description: switch VLAN ospf yang module package
+ The YANG module for enabling ospf on switch VLAN interfaces
+
+Package: vyatta-op-protocols-frr-ospfv3-v1-yang
+Architecture: all
+Depends:
+ vyatta-op-common-protocols-ospfv3-v1-yang,
+ ${misc:Depends},
+ ${yang:Depends}
+Description: OSPFv3 operational YANG module
+ The YANG module package for vyatta-op-protocols-frr-ospfv3-v1-yang
+
+Package: vyatta-protocols-frr-ospfv3-v1-yang
+Architecture: all
+Depends:
+ frr,
+ vyatta-cfg (>= 0.18.56),
+ vyatta-frr-vci,
+ vyatta-protocols-frr (>= ${source:Version}),
+ ${misc:Depends},
+ ${yang:Depends}
+Conflicts: vyatta-protocols-ospfv3-v1-yang
+Description: FRR ospfv3 yang module package
+ The YANG module package for vyatta-protocols-frr-ospfv3-v1
+
+Package: vyatta-protocols-frr-switch-vif-ospfv3-v1-yang
+Architecture: any
+Depends: ${misc:Depends}, ${yang:Depends}
+Description: switch VLAN ospfv3 yang module package
+ The YANG module for enabling ospfv3 on switch VLAN interfaces
+
+Package: vyatta-op-protocols-frr-ldp-v1-yang
+Architecture: all
+Depends: ${misc:Depends}, ${yang:Depends}
+Description: LDP operational YANG module
+ The YANG module package for vyatta-op-frr-ldp-v1-yang
+
+Package: vyatta-protocols-frr-ldp-v1-yang
+Architecture: all
+Depends:
+ frr,
+ vyatta-cfg (>= 0.18.56),
+ vyatta-frr-vci,
+ vyatta-protocols-frr (>= ${source:Version}),
+ ${misc:Depends},
+ ${yang:Depends}
+Conflicts: vyatta-protocols-mpls-ldp-v1-yang
+Description: FRR ldp yang module package
+ The YANG module package for vyatta-protocols-frr-ldp-v1
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..6c8ead6
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,99 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+
+Files: *
+Copyright:
+    Copyright (c) 2018-2019 AT&T Intellectual Property
+License: GPL-2
+
+Files: scripts/common/*
+Copyright:
+    Copyright (c) 2018-2019 AT&T Intellectual Property
+    Copyright (c) 2013-2017 Brocade Communications Systems, Inc.
+    Copyright (c) 2007-2010 Vyatta, Inc.
+License: GPL-2
+
+Files: yang/vyatta-protocols-frr-ldp-v1.yang
+Copyright:
+    Copyright (c) 2018-2019 AT&T Intellectual Property
+    Copyright (c) 2016 IETF Trust and the persons identified as authors of the code.
+License: IETF-BSD and BSD-3-clause
+
+Files: yang/*
+Copyright:
+    Copyright (c) 2018-2019 AT&T Intellectual Property
+License: BSD-3-clause
+
+License: BSD-3-clause
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ .
+    1. Redistributions of source code must retain the above copyright notice,
+       this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice,
+       this list of conditions and the following disclaimer in the documentation
+       and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holder nor the names of its
+       contributors may be used to endorse or promote products derived from this
+       software without specific prior written permission.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License: GPL-2
+ This program is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation;
+ version 2.
+ .
+ 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 package; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ Boston, MA  02110-1301 USA
+ .
+ On Debian systems, the full text of the GNU General Public
+ License version 2 can be found in the file
+ `/usr/share/common-licenses/GPL-2'.
+
+License: IETF-BSD
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ .
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the distribution.
+ * Neither the name of Internet Society, IETF or IETF Trust, nor the names
+   of specific contributors, may be used to endorse or promote products
+   derived from this software without specific prior written permission.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS”
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ THE POSSIBILITY OF SUCH DAMAGE.
+ .
+ See section 4.c of the IETF Trust's "Legal Provisions Relating to IETF
+ Documents", http://trustee.ietf.org/license-info, for additional information.
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..154893d
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,30 @@
+#!/usr/bin/make -f
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+export DH_GOPKG := eng.vyatta.net/protocols-frr
+
+# Use hardening options
+export DEB_BUILD_HARDENING=1
+
+GO_BUILD_DIR = golang_build
+
+%:
+	# Build Go packages
+	dh $@ --buildsystem=golang --with=golang,vci   \
+	      --builddirectory=${GO_BUILD_DIR}         \
+	      --package vyatta-frr-vci                 
+
+	# Build all other packages
+	# There must be a --no-package argument for each --package argument
+	# in the above dh invocation
+	dh $@ --with=yang,python3         \
+	      --no-package vyatta-frr-vci              
+
+override_dh_auto_build: vet
+	dh_auto_build
+
+# We do not vet vendor code
+vet:
+	go tool vet $$(find . -type f -name \*.go | xargs dirname | \
+		sort -u | grep -v "/vendor/");
diff --git a/debian/vyatta-frr-vci.component b/debian/vyatta-frr-vci.component
new file mode 100644
index 0000000..47efc0a
--- /dev/null
+++ b/debian/vyatta-frr-vci.component
@@ -0,0 +1,21 @@
+[Vyatta Component]
+Name=net.vyatta.vci.frr
+Description=FRR VCI Component
+ExecName=/opt/vyatta/sbin/frr -user routing
+ConfigFile=/etc/vyatta-routing/frr.json
+
+[Model net.vyatta.vci.frr.v1]
+Modules=vyatta-protocols-frr-bgp-v1,                      \
+    vyatta-protocols-frr-bgp-routing-instance-v1,         \
+    vyatta-protocols-frr-ldp-v1,                          \
+    vyatta-protocols-frr-ospf-v1,                         \
+    vyatta-protocols-frr-ospf-routing-instance-v1,        \
+    vyatta-protocols-frr-switch-vif-ospf-v1,              \
+    vyatta-protocols-frr-ospfv3-v1,                       \
+    vyatta-protocols-frr-switch-vif-ospfv3-v1,            \
+    vyatta-policy-route-v1,                               \
+    vyatta-protocols-static-v1,                           \
+    vyatta-protocols-static-routing-instance-v1,          \
+    vyatta-protocols-static-routing-instance-inter-vrf-v1
+
+ModelSets=vyatta-v1
diff --git a/debian/vyatta-frr-vci.install b/debian/vyatta-frr-vci.install
new file mode 100644
index 0000000..f2a3637
--- /dev/null
+++ b/debian/vyatta-frr-vci.install
@@ -0,0 +1,6 @@
+component-config/frr.conf etc/vyatta-routing
+component-config/mpls-modules.conf etc/modules-load.d
+scripts/frr/command.py usr/lib/python3/dist-packages/vyatta
+scripts/frr/configs/* etc/vyatta-routing/configs
+scripts/frr/parser.py opt/vyatta/sbin
+usr/bin/frr opt/vyatta/sbin
diff --git a/debian/vyatta-frr-vci.postinst b/debian/vyatta-frr-vci.postinst
new file mode 100644
index 0000000..6a1e36a
--- /dev/null
+++ b/debian/vyatta-frr-vci.postinst
@@ -0,0 +1,6 @@
+#!/bin/bash -e
+
+chown routing:routing /etc/vyatta-routing/frr.conf
+chmod 600  /etc/vyatta-routing/frr.conf
+
+#DEBHELPER#
diff --git a/debian/vyatta-frr-vci.preinst b/debian/vyatta-frr-vci.preinst
new file mode 100644
index 0000000..12d4262
--- /dev/null
+++ b/debian/vyatta-frr-vci.preinst
@@ -0,0 +1,22 @@
+#!/bin/bash -e
+
+# creating routeadm group if it isn't already there
+if ! getent group routeadm >/dev/null; then
+        addgroup --system routeadm >/dev/null
+fi
+
+# creating Routing group if it isn't already there
+if ! getent group routing >/dev/null; then
+        addgroup --system routing >/dev/null
+fi
+
+# creating routing user if he isn't already there
+if ! getent passwd routing >/dev/null; then
+        adduser \
+          --system \
+          --ingroup routing \
+          --home /var/run/routing/ \
+          --gecos "Frr vyatta routing suite" \
+          --shell /bin/false \
+          routing  >/dev/null
+fi
diff --git a/debian/vyatta-op-protocols-frr-bgp-routing-instance-v1-yang.install b/debian/vyatta-op-protocols-frr-bgp-routing-instance-v1-yang.install
new file mode 100644
index 0000000..047839e
--- /dev/null
+++ b/debian/vyatta-op-protocols-frr-bgp-routing-instance-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-op-protocols-frr-bgp-routing-instance-v1.yang usr/share/configd/yang
diff --git a/debian/vyatta-op-protocols-frr-bgp-v1-yang.install b/debian/vyatta-op-protocols-frr-bgp-v1-yang.install
new file mode 100644
index 0000000..ecaf07f
--- /dev/null
+++ b/debian/vyatta-op-protocols-frr-bgp-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-op-protocols-frr-bgp-v1.yang usr/share/configd/yang
diff --git a/debian/vyatta-op-protocols-frr-ldp-v1-yang.install b/debian/vyatta-op-protocols-frr-ldp-v1-yang.install
new file mode 100644
index 0000000..9aef9a6
--- /dev/null
+++ b/debian/vyatta-op-protocols-frr-ldp-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-op-protocols-frr-ldp-v1.yang usr/share/configd/yang
diff --git a/debian/vyatta-op-protocols-frr-ospf-routing-instance-v1-yang.install b/debian/vyatta-op-protocols-frr-ospf-routing-instance-v1-yang.install
new file mode 100644
index 0000000..470e0d4
--- /dev/null
+++ b/debian/vyatta-op-protocols-frr-ospf-routing-instance-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-op-protocols-frr-ospf-routing-instance-v1.yang usr/share/configd/yang
diff --git a/debian/vyatta-op-protocols-frr-ospf-v1-yang.install b/debian/vyatta-op-protocols-frr-ospf-v1-yang.install
new file mode 100644
index 0000000..0779ed0
--- /dev/null
+++ b/debian/vyatta-op-protocols-frr-ospf-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-op-protocols-frr-ospf-v1.yang usr/share/configd/yang
diff --git a/debian/vyatta-op-protocols-frr-ospfv3-v1-yang.install b/debian/vyatta-op-protocols-frr-ospfv3-v1-yang.install
new file mode 100644
index 0000000..3430b50
--- /dev/null
+++ b/debian/vyatta-op-protocols-frr-ospfv3-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-op-protocols-frr-ospfv3-v1.yang usr/share/configd/yang
diff --git a/debian/vyatta-op-protocols-frr-zebra-v1-yang.install b/debian/vyatta-op-protocols-frr-zebra-v1-yang.install
new file mode 100644
index 0000000..77d2fa8
--- /dev/null
+++ b/debian/vyatta-op-protocols-frr-zebra-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-op-protocols-frr-zebra-v1.yang usr/share/configd/yang
diff --git a/debian/vyatta-op-show-ip-ipv6-route-frr-v1-yang.install b/debian/vyatta-op-show-ip-ipv6-route-frr-v1-yang.install
new file mode 100644
index 0000000..5235b0b
--- /dev/null
+++ b/debian/vyatta-op-show-ip-ipv6-route-frr-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-op-show-ip-ipv6-route-frr-v1.yang usr/share/configd/yang
diff --git a/debian/vyatta-op-show-monitoring-protocols-frr-v1-yang.install b/debian/vyatta-op-show-monitoring-protocols-frr-v1-yang.install
new file mode 100644
index 0000000..653c50d
--- /dev/null
+++ b/debian/vyatta-op-show-monitoring-protocols-frr-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-op-show-monitoring-protocols-frr-v1.yang usr/share/configd/yang
diff --git a/debian/vyatta-protocols-frr-bgp-routing-instance-v1-yang.install b/debian/vyatta-protocols-frr-bgp-routing-instance-v1-yang.install
new file mode 100644
index 0000000..303c2ae
--- /dev/null
+++ b/debian/vyatta-protocols-frr-bgp-routing-instance-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-protocols-frr-bgp-routing-instance-v1.yang usr/share/configd/yang/
diff --git a/debian/vyatta-protocols-frr-bgp-v1-yang.install b/debian/vyatta-protocols-frr-bgp-v1-yang.install
new file mode 100644
index 0000000..1355696
--- /dev/null
+++ b/debian/vyatta-protocols-frr-bgp-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-protocols-frr-bgp-v1.yang usr/share/configd/yang/
diff --git a/debian/vyatta-protocols-frr-ldp-v1-yang.install b/debian/vyatta-protocols-frr-ldp-v1-yang.install
new file mode 100644
index 0000000..68136d4
--- /dev/null
+++ b/debian/vyatta-protocols-frr-ldp-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-protocols-frr-ldp-v1.yang usr/share/configd/yang/
diff --git a/debian/vyatta-protocols-frr-ospf-routing-instance-v1-yang.install b/debian/vyatta-protocols-frr-ospf-routing-instance-v1-yang.install
new file mode 100644
index 0000000..f9ab112
--- /dev/null
+++ b/debian/vyatta-protocols-frr-ospf-routing-instance-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-protocols-frr-ospf-routing-instance-v1.yang usr/share/configd/yang/
diff --git a/debian/vyatta-protocols-frr-ospf-v1-yang.install b/debian/vyatta-protocols-frr-ospf-v1-yang.install
new file mode 100644
index 0000000..d9a6482
--- /dev/null
+++ b/debian/vyatta-protocols-frr-ospf-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-protocols-frr-ospf-v1.yang usr/share/configd/yang/
diff --git a/debian/vyatta-protocols-frr-ospfv3-v1-yang.install b/debian/vyatta-protocols-frr-ospfv3-v1-yang.install
new file mode 100644
index 0000000..296ff10
--- /dev/null
+++ b/debian/vyatta-protocols-frr-ospfv3-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-protocols-frr-ospfv3-v1.yang usr/share/configd/yang/
diff --git a/debian/vyatta-protocols-frr-switch-vif-ospf-v1-yang.install b/debian/vyatta-protocols-frr-switch-vif-ospf-v1-yang.install
new file mode 100644
index 0000000..e9f04ab
--- /dev/null
+++ b/debian/vyatta-protocols-frr-switch-vif-ospf-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-protocols-frr-switch-vif-ospf-v1.yang usr/share/configd/yang/
diff --git a/debian/vyatta-protocols-frr-switch-vif-ospfv3-v1-yang.install b/debian/vyatta-protocols-frr-switch-vif-ospfv3-v1-yang.install
new file mode 100644
index 0000000..b93067d
--- /dev/null
+++ b/debian/vyatta-protocols-frr-switch-vif-ospfv3-v1-yang.install
@@ -0,0 +1 @@
+yang/vyatta-protocols-frr-switch-vif-ospfv3-v1.yang usr/share/configd/yang/
diff --git a/debian/vyatta-protocols-frr.install b/debian/vyatta-protocols-frr.install
new file mode 100644
index 0000000..c467aaf
--- /dev/null
+++ b/debian/vyatta-protocols-frr.install
@@ -0,0 +1,2 @@
+scripts/common/vtyshow.pl opt/vyatta/bin/
+scripts/common/vyatta-link-detect opt/vyatta/sbin/
diff --git a/debian/vyatta-protocols-frr.tmpfile b/debian/vyatta-protocols-frr.tmpfile
new file mode 100644
index 0000000..ca504be
--- /dev/null
+++ b/debian/vyatta-protocols-frr.tmpfile
@@ -0,0 +1 @@
+D /var/run/routing 0775 routing adm -
diff --git a/scripts/common/vtyshow.pl b/scripts/common/vtyshow.pl
new file mode 100755
index 0000000..70d5756
--- /dev/null
+++ b/scripts/common/vtyshow.pl
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+#
+# Copyright (c) 2018-2019 AT&T Intellectual Property
+# Copyright (c) 2013-2017 Brocade Communications Systems, Inc.
+# Copyright (c) 2007-2010 Vyatta, Inc.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+use strict;
+use warnings;
+
+($ARGV[0] eq 'show' ) or die "must be a show command\n";
+
+my $p = join(' ', @ARGV);
+
+# Translate between the DANOS CLI and the FRR CLI.
+$p =~ s/ospf routing-instance .* process/ospf/g;
+$p =~ s/ospf process/ospf/g;
+$p =~ s/ospfv3/ospf6/g; 
+$p =~ s/routing-instance/vrf/g;
+$p =~ s/vrf (\S+)/vrf vrf${1}/g;
+$p =~ s/vpnv4 unicast/vpnv4/g;
+$p =~ s/(ip|ipv6) route( vrf \S+|)? database/${1} route${2}/g;
+$p =~ s/ any/ */g;
+
+exec '/usr/bin/vtysh', '-c', $p;
+die "Could not exec vtysh";
diff --git a/scripts/common/vyatta-link-detect b/scripts/common/vyatta-link-detect
new file mode 100755
index 0000000..b6c5b1e
--- /dev/null
+++ b/scripts/common/vyatta-link-detect
@@ -0,0 +1,38 @@
+#! /bin/bash
+#
+# Usage: vyatta-link-detect devicename on|off
+#
+# Copyright (c) 2019, AT&T Intellectual Property.
+# Copyright (c) 2014 by Brocade Communications Systems, Inc.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+usage() {
+    echo "Usage: $0 devicename {on|off}"
+    exit 1
+}
+
+if [ $# -ne 2 ]; then
+    usage
+fi
+
+# Note can't use sysctl it is broken for vlan name because of dots
+# link_filter values:
+#   0 - always receive
+#   1 - ignore receive if admin_down
+#   2 - ignore receive if admin_down or link down
+set-sysctl () {
+    (echo "$2" > "/proc/sys/net/ipv4/conf/$1/link_filter") 2> /dev/null
+}
+
+case $2 in
+on)	set-sysctl "$1" 2
+	exec vtysh -c "configure terminal" -c "interface $1" \
+	    -c "link-detect" ;;
+off)    set-sysctl "$1" 1
+	exec vtysh -c "configure terminal" -c "interface $1" \
+	    -c "no link-detect" ;;
+*)	usage;;
+esac
+
diff --git a/scripts/frr/.gitignore b/scripts/frr/.gitignore
new file mode 100644
index 0000000..7db61e6
--- /dev/null
+++ b/scripts/frr/.gitignore
@@ -0,0 +1,104 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
\ No newline at end of file
diff --git a/scripts/frr/README.md b/scripts/frr/README.md
new file mode 100644
index 0000000..dc1d7e4
--- /dev/null
+++ b/scripts/frr/README.md
@@ -0,0 +1,214 @@
+# Vyatta JSON to FRR CLI format translator  
+
+## How it works  
+
+1. Parse the Vyatta JSON config file to a Python dictionary using the [JSONDecoder](https://docs.python.org/2/library/json.html#json.JSONDecoder).
+2. Order critical nodes in the tree to allow specific 'priority' commands to come before others (optional).
+3. Visit every node in the dict in a depth first manner, building its path along the way in a Linux FS like format (i.e. /protocols/ospf/...). List members have no names so an *@element* tag is appended to the path. Note that the index of the element is not appended, so the path /a/b/@element refers to **every** element of the list `{a: {b: [...]}}`
+4. When each node is reached, its path is used to retrieve the corresponding command(s) from the syntax file. The command itself can make relative references to other nodes in the tree, either in lower or upper levels from the current node but these references can't pass by a list.
+5. Sanitize the command to allow Python's string.Formatter to parse it: Dots are not allowed in identifier name so replace up traversal '..' with a different sign.
+6. Resolve these references and replace them with their values using python's advanced string formatting features.
+7. Append the finalized command into the output list if all required references were resolved, otherwise discard the command to avoid producing invalid commands.
+8. Create the FRR config by joining the output list elements (commands) with newlines.
+
+## Accompanying config files
+
+* **config/syntax files**: Flat JSON files dictating what parts of the Vyatta json map to what FRR CLI commands. At most one entry for each path. Should all be stored under \<configDir>/commands directory. The format is as follows:
+
+```json
+{
+    '/path/to/nodeA': 'single command to include with {/references/@text}',  
+    '/path/to/nodeB': ['can', 'include', 'multiple', 'commands'],
+    '/path/to/nodeC': 'single command [with a {/set/@text}, of {/options/@text}]',
+    '/path/to/nodeD': 'single command [with an optional {/set/@text}, ]',
+    '/path/to/node/@enter': 'enter command',
+    '/path/to/node/@exit': 'exit command',
+}
+```
+
+* **priority file**: Flat JSON file dictating nodes that have ordering requirements. Should be stored under \<configDir> directory. The format is as follows:
+
+```json
+{
+    '/path/to/parent/of/critical/node': {
+        'first': ['child1', 'child2'],
+        'last': ['child3', 'child4']
+    }
+}
+```
+
+## JSON Decoding
+
+The [JSONDecoder](https://docs.python.org/2/library/json.html#json.JSONDecoder) is used to parse the json string into a Python dict. **The only change from the default types is that and OrderedDict is using instead of a dict**. Note the following:
+
+* **null values** are decoded as None type in Python. If a key with a None value is referenced, then parser will use the string 'None'
+
+## Usage instructions
+
+Usually you only need to edit / create a commands json file to add support for a new translation.
+
+1. Identify the path in the json where the key element of the command lives in.
+2. Add a new entry in the appropriate commands json file (or create a new one) with key being the path above and value being the command string template.
+3. Add a priority entry in the priorities json file, if the command needs to appear before/after others.
+
+## References
+
+All keywords inside a path start with an @, to avoid conflicts:
+
+* **@text**: value of a text leaf
+* **@dict**: value of a json dictionary
+* **@element**: an element of a list
+* **@enter**: enter command of node
+* **@exit**: exit command of node
+
+All references that live inside a command:
+
+* are relative to the current node (the node on the path indicated by the key)
+* should start with a `/`  
+* need to be enclosed in `{}`  
+* should finish with a @text keyword, to specify the target value
+
+Examples:  
+`dict = {a: {b: 'value'}, key: 'text', c: [1,2,3]}`  
+To reference b's value from the root: {/a/b/@text}  
+To reference key's value from inside b: {/../key/@text}  
+To reference c's every element from inside b: {/../c/@element/@text}  
+
+## Value formatting
+
+References are resolved by a child class of Python's [string Formatter](https://docs.python.org/3.4/library/string.html#string.Formatter). Hence, you can format reference's values using python's [format specification mini-language](https://docs.python.org/3.4/library/string.html#formatspec). A few examples:
+
+* **{/number/@text:x}**: print the number as a lowercase hexadecimal digit
+* **{/number/@text:+05}**: include the + sign if positive, print in 5 spaces and left pad with 0s.
+
+## Custom formatting
+
+The Formatter class format_field method is extended to add some custom formatting.
+
+### Loops
+
+Used to print an array inline. The syntax is as follows:
+>`{/name/@text:for:template with {{element}}}`
+
+Note the use of double curly brackets and the keyword *element* when referring to list elements.
+
+Example:
+
+* **{/name/@text}:for:{{element}} }** will print "a b c " if /name has a value of ['a', 'b', 'c']
+
+## Command string processing
+
+The command string processing procedure follows these steps:
+
+1. Replace all references with their values or with the **unresolved reference template** (constant in the command python script) if no value was found.
+2. Evaluate functions and replace their patterns with the resulting value.
+3. Resolve sets.
+4. If the unresolved reference template exists then discard the command otherwise add it in the output list.
+
+## Required and optional references
+
+All references in a command are considered required, i.e. if an unresolved reference exists in step 4, then that command will not be included in the output to avoid invalid commands. If a part of a command is optional then it should be included in an optional set.
+
+## Sets
+
+Sets are indicated by square brackets (`[]`) in commands and their members are comma separated.  
+The first member of the set that has no unresolved references (i.e. doesn't include the unresolved reference template) will replace the whole set.  
+For example, the command  
+>`neighbor 3.3.3.3 [remote-as {/remote-as/@text}, peer-group {/peer-group/@text}]
+`
+
+will become:
+
+* `neighbor 3.3.3.3 remote-as #` if there is a string value under *remote-as*
+* `neighbor 3.3.3.3 peer-group #` if there is no string value under *remote-as* but there is under *peer-group*
+* None otherwise
+
+### Optional Sets
+
+Optional sets are regular sets with an empty member at the end, e.g.
+>`[remote-as {/remote-as/@text}, peer-group {/peer-group/@text},]`
+
+If none of the members can be satisfied, the empty string is always satisfied (has no unresolved references) and it will replace the set, creating the command `neighbor 3.3.3.3` in the above scenario
+
+## Functions
+
+Functions allow you to manipulate the value of a reference before printing it. They are evaluated after resolving references so you can have references anywhere in them. The general format is as follows:
+>`$name_of_function|pipe_separated_parameters$`
+
+These are the functions currently supported:  
+
+### Conditionals
+
+Conditionals allow you to adjust the output according to the value of the reference. The syntax is as follows:
+>`$if|value1,value2,...valueN,|condition1,condition2,...conditionN,$`
+
+Condition currently supports:
+
+* equality checking (==)
+* inequality checking (!=)
+* greater than or equal (>=)
+* less than or equal (<=)
+* greater than (>)
+* less than (<)
+* dictionary presence (in)
+
+Only conditions that have a matching value will be evaluated, if there are 4 conditions and 2 values only the first two of each section will be parsed.
+If an else clause is required then use a comma with no condition as the last element. In the code a tautology will be inserted to act as the else.
+
+Examples:
+
+* **$if|message-digest,plaintext|{/@text}==md5,$** will print message-digest if the value /@text is equal to md5 else it will print plaintext.
+* **$if|message-digest,|{/@text}==md5$** will print message-digest if the value /@text is equal to md5 else it won't print anything.
+* **$if|:message-digest,{/other/@text}|{/@text}==md5,$** will print message-digest if the value /@text is equal to md5 else it will print the value of another node.
+* **[$if|message-digest,???|{/@text}==md5$, ...]** assuming that the *unresolved reference template* is equal to '???', then this is how you can include conditionals in a set if you want other set members to take priority in the else case.
+* **$if|host {/source/host/@text},network {/source/network} {/source/mask}, any|host in {/source}, network in {source},$** will print host and the ip address if host exists in the dictionary, network and the network address and mask if network is in the dictionary, and any if neither of the other two conditions match.
+
+### Code execution
+
+Python code can be included in the commands and it will be evaluated using the eval function. Due to safety reasons, no functions can be called but this can be adjusted. The syntax is as following:
+>`$ex|python_code$`
+
+For example a conditional can be formed as follows:  
+>$ex|'message-digest' if '{/@text}'=='md5' else ''$
+
+## Enter and exit commands
+
+You can specify a command to include in the output config before including the translations of a node and all its children, and/or an exit command after that.  
+Enter and exit commands are tagged with an `@enter` and `@exit` appropriately and currently can have no references in them.  
+They are useful when in need to enter a submode.
+
+E.g.  
+
+```json
+{
+    '/protocols/rip/@enter': 'router rip',  
+    '/protocols/rip/@exit': 'exit-router-rip',  
+}
+```
+
+This will enter the 'router rip' command before converting /protocols/rip and its children to commands, and then enter the command 'exit-router-rip'.  
+
+## Ordering
+
+There are some cases where some commands need to come before others, e.g.
+> neighbor x.x.x.x remote-as #
+
+needs to come before any other configuration for that specific neighbor, under router bgp mode.
+You can ensure this by ordering the configuration tree before parsing it. To do this:
+
+1. Identify the path of the parent node whose children need to be prioritized.
+2. Add a new string key in the priorities json file, with the string being the **path to the parent node**.
+3. The key's value should be an object which optionally includes keys **first** and / or **last**, containing the names of the child nodes that should appear first or last correspondingly, in the defined order.
+
+e.g.
+
+```json
+{
+    '/protocols/ospf': {
+        'first': ['a', 'b'],
+        'last': ['y', 'z']
+    }
+}
+```
+
+Specifies that when visiting children of /protocols/ospf, child 'a' will be retrieved first (if exists), then b, then any other children in random order and finally 'y' and then 'z'.
diff --git a/scripts/frr/command.py b/scripts/frr/command.py
new file mode 100644
index 0000000..0aa9878
--- /dev/null
+++ b/scripts/frr/command.py
@@ -0,0 +1,257 @@
+# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+from re import sub, findall, split, match
+from string import Formatter
+import operator
+import ast
+
+MISSING_VALUE_TEMPLATE = '???'
+OPERATOR_EXPRESSION = r"(==|>=|<=|>|<|!=| in |\s)"
+
+
+class CommandFiller:
+    """Responsible for finding all patterns in the raw commands
+    and filling them with their values that are passed as parameters.
+    """
+    PATTERN_REGEX = r'\[[^]]+\]'
+
+    def __init__(self, command, debug=False):
+        self.command = command
+        self.debug = debug
+        self.formatter = CommandFormatter(self.debug)
+
+    def find_all_path_refs(self):
+        """Finds all path references to other tree nodes that exist in the command
+        @return: list of paths
+        """
+        return self.formatter.find_all_path_refs(self.command)
+
+    def fill_command(self, values):
+        """Treats all patterns in the raw command string"""
+        # print(self.command, values)
+        self.command = self.fill_values(values)
+        self.execute_functions()
+        self.finalize_sets()
+        if MISSING_VALUE_TEMPLATE in self.command:
+            # couldn't fill all required references
+            self.discard_command()
+        else:
+            self.remove_extra_whitespaces()
+        return self.command
+
+    @staticmethod
+    def execute_code(code):
+        """Evaluate the python code given as string.
+        Restrict any use of functions for safety
+        """
+        return eval(code, {'__builtins__': None})
+
+    @staticmethod
+    def _get_operator_fn(op):
+        """Return a function based on a string. The returned function must
+        operate on two values. If the operator isn't found in the dictionary
+        return a shim function that prints a warning.
+        When the dictionary is updated with a new operator the  OPERATOR_EXPRESSION
+        constant must also be updated.
+        """
+        oper_dict = {
+            '==': operator.eq,
+            '>=': operator.ge,
+            '<=': operator.le,
+            '>': operator.gt,
+            '<': operator.lt,
+            '!=': operator.ne,
+            " in ": CommandFiller.exists_in
+        }
+        return oper_dict[op] if op in oper_dict else CommandFiller._undefined_operator
+
+    @staticmethod
+    def _undefined_operator(a, b):
+        """Shim function for when there's no function for an operator.
+        TODO: Print the unknown operator as well as what it is acting on.
+        """
+        print("unknown operator acting on ", a, " and ", b)
+        return False
+
+    @staticmethod
+    def exists_in(k, json_dict):
+        """Wrapper function for a key test of a dictionary.
+        Uses the ast.literal_eval as it works only on a reduced set of python
+        code.
+
+        It's possible that extremely large dictionaries will crash the python
+        interpreter.
+        """
+        json_dict = json_dict.replace("&", ",")
+        return k in ast.literal_eval(json_dict)
+
+    @staticmethod
+    def set_else(zipped_list):
+        """Replace empty string else condition with a tautology so it's always
+        true
+        """
+        if zipped_list[-1][0] == "":
+            zipped_list[-1] = ("1==1", zipped_list[-1][1])
+        return zipped_list
+
+    @staticmethod
+    def execute_conditional(conditional):
+        """Evaluate the result of the conditional statement given as a
+        list of
+        ['function(if)', 'value1[,value2,...,valueN,]','condition1[condition2,...conditionN,]']
+        Parsing each condition into the format [a, oper, b] using a for loop to find the first
+        true condtion and then returning the corresponding value.
+        """
+        result = ''
+        params = conditional[2].split(',')
+        outcomes = conditional[1].split(',')
+        # Keep backwards compatibility of else commands that are already written
+        if len(outcomes) == len(params) + 1:
+            params.append("")
+        expression_pairs = list(zip(params, outcomes))
+        expression_pairs = CommandFiller.set_else(expression_pairs)
+        for pair in expression_pairs:
+            # Filter out any tokens that are the empty string or just spaces
+            # should be left with just the operator and what it's to act on
+            tokens = [token for token in split(OPERATOR_EXPRESSION, pair[0])
+                      if token != "" and match(r'^\s$', token) == None]
+            if CommandFiller._get_operator_fn(tokens[1])(tokens[0], tokens[2]):
+                result = pair[1]
+                break
+        return result
+
+    @staticmethod
+    def get_acl_target(target):
+        """
+        Check a dictionary for keys that an ACL could use to filter, also
+        checking existance as the JSON can contain things like host but without
+        a value.
+        """
+        if "any" in target:
+            return "any"
+        if "network" in target and (target["network"] is not None and target["network"] != ""):
+            return "{0} {1}".format(target["network"], target["inverse-mask"])
+        if "host" in target and (target["host"] is not None and target["host"] != ""):
+            return "host {0}".format(target["host"])
+
+    @staticmethod
+    def execute_acl(acl_dict):
+        """
+        Function to generate config for an access control list
+
+        This is a work around for the parser not being powerful enough to test
+        a range of numbers, this is easier than extending the if condition code.
+        This function will take each element of the /policy/route/access-list
+        list and generate multiple lines of config for the access-list
+        """
+        json_dict = ast.literal_eval(acl_dict.replace("&", ","))
+        result = ""
+        acl_number = int(json_dict["tagnode"])
+        prefix_string = "access-list {0}".format(str(acl_number))
+        extended = False
+        if (acl_number >= 100 and acl_number <= 199) or (acl_number >= 2000 and acl_number <= 2699):
+            extended = True
+        for rule in json_dict.get("rule", dict()):
+            result += prefix_string+" {0}".format(rule["action"])
+            if extended:
+                result += " ip"
+            result += " "+CommandFiller.get_acl_target(rule["source"])
+            if extended:
+                result += " "+CommandFiller.get_acl_target(rule["destination"])
+            if rule != json_dict["rule"][-1]:
+                result += "\n"
+        return result
+
+    def execute_functions(self):
+        """find functions defined in the command, evaluate them and replace
+        the pattern.
+        """
+        functions = [x[1:-1].split('|') + [x]
+                     for x in findall(r'\$[^$]+\$', self.command)]
+        result = ''
+        for function in functions:
+            if function[0] == 'if':
+                result = CommandFiller.execute_conditional(function)
+            elif function[0] == 'ex':
+                result = CommandFiller.execute_code(function[1])
+            elif function[0] == 'acl':
+                result = CommandFiller.execute_acl(function[1])
+            self.command = self.command.replace(function[-1], result)
+
+    def discard_command(self):
+        """Erases command to avoid unfilled commands entering the final config"""
+        if self.debug:
+            print('ERROR: Couldnt fill required parts of',
+                  self.command, '. Omitting...')
+        self.command = ''
+
+    def fill_values(self, values):
+        """Fill all resolved references"""
+        return self.formatter.format(self.command, **values)
+
+    def finalize_sets(self):
+        """picks the first satisfied member of the set and replaces the set pattern with it.
+        If none is satisfied, the command is discarded.
+        Set members are comma separated. Optional sets have an empty member
+        """
+        for pattern in findall(self.PATTERN_REGEX, self.command):
+            replacement = None
+            for member in pattern[1:-1].split(','):
+                if MISSING_VALUE_TEMPLATE not in member:
+                    # value was replaced, found a satisfied member
+                    replacement = member
+                    break
+            if replacement is not None:
+                self.command = self.command.replace(pattern, replacement)
+
+    def remove_extra_whitespaces(self):
+        """remove extra whitespace occuring from substitutions"""
+        self.command = sub(r'(\S) +', r'\1 ', self.command)
+
+
+class CommandFormatter(Formatter):
+    """Custom formatter subclass for the resolving of
+    references in commands
+    """
+
+    def find_all_path_refs(self, msg):
+        """use string formatter to retrieve all references inside {}.
+        It returns them along with their formatting arguments so cut these out.
+        """
+        result = [x[1] for x in super().parse(msg) if x[1] is not None]
+        return map(self.get_field_name, result)
+
+    def get_field_name(self, identifier):
+        """Cuts out formatting arguments from a reference"""
+        field_name = identifier
+        # currently only ! and : are the formatting operators so remove them if they exist.
+        if '!' in field_name:
+            field_name = field_name.split('!')[0]
+        elif ':' in field_name:
+            field_name = field_name.split(':')[0]
+        return field_name
+
+    def __init__(self, debug=False):
+        self.debug = debug
+
+    def get_value(self, key, args, kwargs):
+        try:
+            result = super(CommandFormatter, self).get_value(key, args, kwargs)
+        except KeyError as _:
+            result = MISSING_VALUE_TEMPLATE
+            if self.debug:
+                print('Warning: Could not find value of', key, 'in', kwargs)
+        return result
+
+    def format_field(self, value, format_spec):
+        # extend this method for more custom formatting
+        if format_spec.startswith('for'):
+            template = format_spec.split(':')[-1]
+            formatted_field = ''.join(
+                [template.format(element=elem) for elem in value])
+        else:
+            formatted_field = super(
+                CommandFormatter, self).format_field(value, format_spec)
+        return formatted_field
diff --git a/scripts/frr/command_ut.py b/scripts/frr/command_ut.py
new file mode 100644
index 0000000..725a0fa
--- /dev/null
+++ b/scripts/frr/command_ut.py
@@ -0,0 +1,302 @@
+#!/usr/bin/env python3
+# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+import unittest
+from command import CommandFiller, MISSING_VALUE_TEMPLATE
+
+
+class CommandFillerTestCase(unittest.TestCase):
+
+    # def setUp(self):
+    #     self.actioner = Actioner()
+
+    def test_find_patterns_simple(self):
+        command = CommandFiller('abc {/name/@text} ef {/../surname/@text}')
+        expected = ['/name/@text', '/../surname/@text']
+        actual = list(command.find_all_path_refs())
+        self.assertCountEqual(expected, actual)
+
+    def test_find_patterns_optional(self):
+        command = CommandFiller(
+            'a [name is: {/name/@text},] ef [and surname {/../surname/@text}]')
+        expected = ['/name/@text', '/../surname/@text']
+        actual = list(command.find_all_path_refs())
+        self.assertCountEqual(expected, actual)
+
+    def test_find_patterns_optional_subs(self):
+        command = CommandFiller(
+            'abc [name is: {/name/@text}, and surname {/../surname/@text},]')
+        expected = ['/name/@text', '/../surname/@text']
+        actual = list(command.find_all_path_refs())
+        self.assertCountEqual(expected, actual)
+
+    def test_fill_simple(self):
+        command = CommandFiller('abc {/name/@text} ef')
+        inputValues = dict([('/name/@text', 'Mix')])
+        actual = command.fill_values(inputValues)
+        expected = 'abc Mix ef'
+        self.assertEqual(expected, actual)
+
+    def test_fill_optionals_refs(self):
+        command = CommandFiller('abc [{/name/@text}] [whose surname is {/namesurname/@text},]' +
+                                ' ef [{name-surname/@text}, initials {/names/@text}]')
+        inputValues = dict([('/name/@text', 'Mix'), ('/namesurname/@text', 'mair'),
+                            ('name-surname/@text', 'MM'), ('/names/@text', 'theo')])
+        actual = command.fill_values(inputValues)
+        expected = 'abc [Mix] [whose surname is mair,] ef [MM, initials theo]'
+        self.assertEqual(expected, actual)
+
+    def test_fill_missing_marked(self):
+        command = CommandFiller(
+            'abc {/name/@text} ef [name {/names/@text}] and {/age/@text}')
+        inputValues = dict([('/name/@text', 'Mix')])
+        actual = command.fill_values(inputValues)
+        expected = 'abc Mix ef [name {}] and {}'.format(
+            MISSING_VALUE_TEMPLATE, MISSING_VALUE_TEMPLATE)
+        self.assertEqual(expected, actual)
+
+    def test_fill_multiple_missing_not_replaced(self):
+        command = CommandFiller(
+            'abc {/name/@text} {/namesurname/@text} ef {name-surname/@text} {/names/@text}')
+        inputValues = dict(
+            [('/namesurname/@text', 'mair'), ('/names/@text', 'theo')])
+        actual = command.fill_values(inputValues)
+        expected = 'abc {} mair ef {} theo'.format(
+            MISSING_VALUE_TEMPLATE, MISSING_VALUE_TEMPLATE)
+        self.assertEqual(expected, actual)
+
+    def test_filled_optionals_fixed(self):
+        command = CommandFiller('ef [name {/names/@text}] and [{/age/@text}]')
+        inputValues = dict([('/names/@text', 'theo'), ('/age/@text', '20')])
+        command.fill_command(inputValues)
+        actual = command.command
+        expected = 'ef name theo and 20'
+        self.assertEqual(expected, actual)
+
+    def test_filled_optionals_substitutes_keep_one(self):
+        command = CommandFiller('ef [name {/names/@text}, age {/age/@text}]')
+        inputValues = [('/names/@text', 'theo'), ('/age/@text', '20')]
+        command.fill_command(dict(inputValues))
+        actual = command.command
+        expected = 'ef name theo'
+        self.assertEqual(expected, actual)
+
+        command = CommandFiller('ef [name {/names/@text}, age {/age/@text}]')
+        inputValues.pop(0)
+        command.fill_command(dict(inputValues))
+        actual = command.command
+        expected = 'ef age 20'
+        self.assertEqual(expected, actual)
+
+    def test_unfilled_optionals_removed(self):
+        command = CommandFiller('ef [name {/names/@text},] and [{/age/@text}]')
+        inputValues = dict([('/age/@text', '20')])
+        command.fill_command(inputValues)
+        actual = command.command
+        expected = 'ef and 20'
+        self.assertEqual(expected, actual)
+
+    def test_unfilled_optionals_subs_removed(self):
+        command = CommandFiller('ef [name {/names/@text}, age {/age/@text},]')
+        inputValues = dict([])
+        command.fill_command(inputValues)
+        actual = command.command
+        expected = 'ef '
+        self.assertEqual(expected, actual)
+
+    def test_unfilled_required_set_discard_command(self):
+        command = CommandFiller('ef [name {/names/@text}, age {/age/@text}]')
+        inputValues = dict([])
+        command.fill_command(inputValues)
+        actual = command.command
+        expected = ''
+        self.assertEqual(expected, actual)
+
+    def test_unfilled_required_single_discard_command(self):
+        command = CommandFiller('ef age {/age/@text}')
+        inputValues = dict([])
+        command.fill_command(inputValues)
+        actual = command.command
+        expected = ''
+        self.assertEqual(expected, actual)
+
+    def test_filled_required_set(self):
+        command = CommandFiller('ef [name {/names/@text}, age {/age/@text}]')
+        inputValues = dict([('/age/@text', '21')])
+        command.fill_command(inputValues)
+        actual = command.command
+        expected = 'ef age 21'
+        self.assertEqual(expected, actual)
+
+    def test_conditional_with_references(self):
+        command = CommandFiller(
+            'ef $if|age {/age/@text},name {/name/@text}|md5==md{/ver/@text},$')
+        inputValues = dict(
+            [('/age/@text', 21), ('/name/@text', 'mm'), ('/ver/@text', 5)])
+        actual = command.fill_command(inputValues)
+        expected = 'ef age 21'
+        self.assertEqual(expected, actual)
+
+    def test_conditional_if_elseif_else(self):
+        conditional = ['if', 'age 21,age 22,age 23', '1 == 1,1 == 2,']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 21'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 21,age 22,age 23', '2 == 1,2 == 2,']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 22'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 21,age 22,age 23', '2 == 1,1 == 2,']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 23'
+        self.assertEqual(expected, actual)
+
+    def test_conditional_equality(self):
+        conditional = ['if', 'age 21,name mm', 'md5==md5,']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 21'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 21,name mm', 'md5==md6,']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'name mm'
+        self.assertEqual(expected, actual)
+
+    def test_conditional_equality_backwards_compat(self):
+        conditional = ['if', 'age 21,name mm', 'md5==md5']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 21'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 21,name mm', 'md5==md6']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'name mm'
+        self.assertEqual(expected, actual)
+
+    def test_conditional_greater_or_equal(self):
+        conditional = ['if', 'age 21', '2 >= 1']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 21'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 22', '2 >= 2']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 22'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 23', '2 >= 3']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = ''
+        self.assertEqual(expected, actual)
+
+    def test_conditional_less_or_equal(self):
+        conditional = ['if', 'age 21', '1<= 2']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 21'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 22', '2 <= 2']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 22'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 23', '3 <=2']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = ''
+        self.assertEqual(expected, actual)
+
+    def test_conditional_greater_than(self):
+        conditional = ['if', 'age 21', '2 > 1']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 21'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 22', '2 > 2']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = ''
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 23', '2 > 3']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = ''
+        self.assertEqual(expected, actual)
+
+    def test_conditional_less_than(self):
+        conditional = ['if', 'age 21', '1< 2']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 21'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 22', '2 < 2']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = ''
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 23', '3 <2']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = ''
+        self.assertEqual(expected, actual)
+
+    def test_conditional_inequality(self):
+        conditional = ['if', 'age 21,name mm', 'md5!=md5,']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'name mm'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 21,name mm', 'md5!=md6,']
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 21'
+        self.assertEqual(expected, actual)
+
+    def test_conditional_key_in_dictionary(self):
+        conditional = ['if', 'age 21,name mm',
+                       "test in {'notest':2&'test':1},"]
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'age 21'
+        self.assertEqual(expected, actual)
+
+        conditional = ['if', 'age 21,name mm', "result in {'test':1},"]
+        actual = CommandFiller.execute_conditional(conditional)
+        expected = 'name mm'
+        self.assertEqual(expected, actual)
+
+    def test_None_value_parsed(self):
+        command = CommandFiller('ef {/name/@text}')
+        inputValues = dict([('/name/@text', None)])
+        actual = command.fill_command(inputValues)
+        expected = "ef None"
+        self.assertEqual(expected, actual)
+
+    def test_formatting_string(self):
+        command = CommandFiller('ef {/name/@text!r:s>5}')
+        inputValues = dict([('/name/@text', 'mm')])
+        actual = command.fill_command(inputValues)
+        expected = "ef s'mm'"
+        self.assertEqual(expected, actual)
+
+    def test_formatting_numbers(self):
+        command = CommandFiller('ef {/name/@text:x}')
+        inputValues = dict([('/name/@text', 10)])
+        actual = command.fill_command(inputValues)
+        expected = "ef a"
+        self.assertEqual(expected, actual)
+
+        command = CommandFiller('ef {/name/@text:+05}')
+        actual = command.fill_command(inputValues)
+        expected = "ef +0010"
+        self.assertEqual(expected, actual)
+
+    def test_formatting_loop(self):
+        command = CommandFiller('ef {/name/@text:for:{{element}} }')
+        inputValues = dict([('/name/@text', ['a', 'b', 'c'])])
+        actual = command.fill_command(inputValues)
+        expected = "ef a b c "
+        self.assertEqual(expected, actual)
+
+
+suite = unittest.TestLoader().loadTestsFromTestCase(CommandFillerTestCase)
+unittest.TextTestRunner(verbosity=2).run(suite)
diff --git a/scripts/frr/configs/commands/bgp.json b/scripts/frr/configs/commands/bgp.json
new file mode 100644
index 0000000..e9d25d8
--- /dev/null
+++ b/scripts/frr/configs/commands/bgp.json
@@ -0,0 +1,205 @@
+{
+    "/protocols/bgp/@enter": "!",
+    "/protocols/bgp/@element": ["router bgp {/tagnode/@text}", "no bgp default ipv4-unicast"],
+    "/protocols/bgp/@element/timers": "timers bgp {/keepalive/@text} {/holdtime/@text}",
+
+    "/protocols/bgp/@element/parameters/always-compare-med": "bgp always-compare-med",
+    "/protocols/bgp/@element/parameters/bestpath/as-path/confed": "bgp bestpath as-path confed",
+    "/protocols/bgp/@element/parameters/bestpath/as-path/ignore": "bgp bestpath as-path ignore",
+    "/protocols/bgp/@element/parameters/bestpath/compare-routerid": "bgp bestpath compare-routerid",
+    "/protocols/bgp/@element/parameters/bestpath/med/confed": "bgp bestpath med confed $if|missing-as-worst,|missing-as-worst in {/@dict}$",
+    "/protocols/bgp/@element/parameters/cluster-id": "bgp cluster-id {/@text}",
+    "/protocols/bgp/@element/parameters/confederation/identifier": "bgp confederation identifier {/@text}",
+    "/protocols/bgp/@element/parameters/confederation/peers": "bgp confederation peers {/@text}",
+    "/protocols/bgp/@element/parameters/default/local-pref": "bgp default local-preference {/@text}",
+    "/protocols/bgp/@element/parameters/deterministic-med": "bgp deterministic-med",
+    "/protocols/bgp/@element/parameters/graceful-restart": "bgp graceful-restart",
+    "/protocols/bgp/@element/parameters/graceful-restart/restart-time": "bgp graceful-restart restart-time {/@text}",
+    "/protocols/bgp/@element/parameters/graceful-restart/stalepath-time": "bgp graceful-restart stalepath-time {/@text}",
+    "/protocols/bgp/@element/parameters/log-neighbor-changes": "bgp log-neighbor-changes",
+    "/protocols/bgp/@element/parameters/router-id": "bgp router-id {/@text}",
+
+    "/protocols/bgp/@element/neighbor/@element": "[neighbor {/../../tagnode/@text} peer-group {/peer-group/@text},]", 
+    "/protocols/bgp/@element/neighbor/@element/advertisement-interval": "neighbor {/../tagnode/@text} advertisement-interval {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/capability/dynamic": "neighbor {/../../tagnode/@text} capability dynamic",
+    "/protocols/bgp/@element/neighbor/@element/description": "neighbor {/../tagnode/@text} description {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/disable-capability-negotiation": "neighbor {/../tagnode/@text} dont-capability-negotiate",
+    "/protocols/bgp/@element/neighbor/@element/ebgp-multihop": "neighbor {/../tagnode/@text} ebgp-multihop {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/enforce-first-as": "neighbor {/../tagnode/@text} enforce-first-as",
+    "/protocols/bgp/@element/neighbor/@element/enforce-multihop": "neighbor {/../tagnode/@text} disable-connected-check",
+    "/protocols/bgp/@element/neighbor/@element/interface/@element": "neighbor {/../../tagnode/@text} interface {/ifname/@text}",
+    "/protocols/bgp/@element/neighbor/@element/local-as/@element": "neighbor {/../../tagnode/@text} local-as {/tagnode/@text}",
+    "/protocols/bgp/@element/neighbor/@element/override-capability": "neighbor {/../tagnode/@text} override-capability",
+    "/protocols/bgp/@element/neighbor/@element/passive": "neighbor {/../tagnode/@text} passive",
+    "/protocols/bgp/@element/neighbor/@element/password": "neighbor {/../tagnode/@text} password {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/port": "neighbor {/../tagnode/@text} port {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/remote-as": "neighbor {/../tagnode/@text} remote-as {/@text}",
+    "/protocols/bgp/@element/neighbor/@element": "$if|neighbor {tagnode/@text} shutdown,|shutdown in {@dict}$",
+    "/protocols/bgp/@element/neighbor/@element/strict-capability-match": "neighbor {/../tagnode/@text} strict-capability-match",
+    "/protocols/bgp/@element/neighbor/@element/timers/connect": "neighbor {/../../tagnode/@text} timers connect {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/timers": "neighbor {/../tagnode/@text} timers {/keepalive/@text} {/holdtime/@text}",
+    "/protocols/bgp/@element/neighbor/@element/ttl-security/hops": "neighbor {/../../tagnode/@text} ttl-security hops {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/update-source": "neighbor {/../tagnode/@text} update-source {/@text}",
+
+    "/protocols/bgp/@element/address-family/ipv4-unicast/@enter": "address-family ipv4 unicast",
+    "/protocols/bgp/@element/address-family/ipv4-unicast/@exit": "exit-address-family",
+    "/protocols/bgp/@element/address-family/ipv4-unicast/aggregate-address/@element": "aggregate-address {/tagnode/@text} $if|as-set,summary-only,|as-set in {/@dict}, summary-only in {/@dict}$",
+    "/protocols/bgp/@element/address-family/ipv4-unicast/redistribute/static": "redistribute static [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/address-family/ipv4-unicast/redistribute/connected": "redistribute connected [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/address-family/ipv4-unicast/redistribute/kernel": "redistribute kernel [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/address-family/ipv4-unicast/redistribute/ospf": "redistribute ospf [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/address-family/ipv4-unicast/redistribute/rip": "redistribute rip [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/address-family/ipv4-unicast/parameters/dampening": "bgp dampening $if|{/half-life/@text},|half-life in {/@dict}$",
+    "/protocols/bgp/@element/address-family/ipv4-unicast/parameters/distance/global": "distance bgp {/external/@text} {/internal/@text} {/local/@text}",
+    "/protocols/bgp/@element/address-family/ipv4-unicast/network/@element": "network {/tagnode/@text} [route-map {/route-map/@text},] $if|backdoor,|backdoor in {/@dict}$",
+
+    "/protocols/bgp/@element/address-family/ipv6-unicast/@enter": "address-family ipv6 unicast",
+    "/protocols/bgp/@element/address-family/ipv6-unicast/@exit": "exit-address-family",
+    "/protocols/bgp/@element/address-family/ipv6-unicast/aggregate-address/@element": "aggregate-address {/tagnode/@text} $if|as-set,summary-only,|as-set in {/@dict}, summary-only in {/@dict}$",
+    "/protocols/bgp/@element/address-family/ipv6-unicast/redistribute/static": "redistribute static [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/address-family/ipv6-unicast/redistribute/connected": "redistribute connected [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/address-family/ipv6-unicast/redistribute/kernel": "redistribute kernel [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/address-family/ipv6-unicast/redistribute/ospfv3": "redistribute ospf6 [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/address-family/ipv6-unicast/redistribute/ripng": "redistribute ripng [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/address-family/ipv6-unicast/parameters/dampening": "bgp dampening $if|{/half-life/@text},|half-life in {/@dict}$",
+    "/protocols/bgp/@element/address-family/ipv6-unicast/parameters/distance/global": "distance bgp {/external/@text} {/internal/@text} {/local/@text}",
+    "/protocols/bgp/@element/address-family/ipv6-unicast/network/@element": "network {/tagnode/@text} [route-map {/route-map/@text},]",
+
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/@enter": "address-family ipv4 unicast",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/@exit": "exit-address-family",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast": ["[neighbor {/../../tagnode/@text} peer-group {/peer-group/@text},]", "neighbor {/../../tagnode/@text} activate"],
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/allowas-in": "neighbor {/../../../tagnode/@text} allowas-in",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/allowas-in/number": "neighbor {/../../../../tagnode/@text} allowas-in {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/attribute-unchanged": "neighbor {/../../../tagnode/@text} attribute-unchanged $if|as-path,|as-path in {/@dict}$ $if|med,|med in {/@dict}$ $if|next-hop,|next-hop in {/@dict}$",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/capability/orf/prefix-list/send": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list send",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/capability/orf/prefix-list/receive": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list receive",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/default-originate": "neighbor {/../../../tagnode/@text} default-originate [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/disable-send-community/standard": "no neighbor {/../../../../tagnode/@text} send-community standard",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/disable-send-community/extended": "no neighbor {/../../../../tagnode/@text} send-community extended",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/distribute-list/export": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} out",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/distribute-list/import": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} in",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/filter-list/export": "neighbor {/../../../../tagnode/@text} filter-list {/@text} out",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/filter-list/import": "neighbor {/../../../../tagnode/@text} filter-list {/@text} in",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/maximum-prefix/@element": "neighbor {/../../../../tagnode/@text} maximum-prefix {/tagnode/@text} $if|{/threshold/@element/tagnode/@text},|threshold in {/@dict}$",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/maximum-prefix/@element/threshold/@element": "neighbor {/../../../../../../tagnode/@text} maximum-prefix {/../../tagnode/@text} {/tagnode/@text} $if|warning-only,|warning-only in {/@dict}$",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/nexthop-self": "neighbor {/../../../tagnode/@text} next-hop-self",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/prefix-list/export": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} out",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/prefix-list/import": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} in",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/remove-private-as": "neighbor {/../../../tagnode/@text} remove-private-AS",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/route-reflector-client": "neighbor {/../../../tagnode/@text} route-reflector-client",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/route-server-client": "neighbor {/../../../tagnode/@text} route-server-client",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/soft-reconfiguration/inbound": "neighbor {/../../../../tagnode/@text} soft-reconfiguration inbound",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/route-map/import": "neighbor {/../../../../tagnode/@text} route-map {/@text} in",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/route-map/export": "neighbor {/../../../../tagnode/@text} route-map {/@text} out",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/unsuppress-map": "neighbor {/../../../tagnode/@text} unsuppress-map {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/weight": "neighbor {/../../../tagnode/@text} weight {/@text}",
+
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/@enter": "address-family ipv6 unicast",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/@exit": "exit-address-family",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast": ["[neighbor {/../../tagnode/@text} peer-group {/peer-group/@text},]", "neighbor {/../../tagnode/@text} activate"],
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/allowas-in": "neighbor {/../../../tagnode/@text} allowas-in",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/allowas-in/number": "neighbor {/../../../../tagnode/@text} allowas-in {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/attribute-unchanged": "neighbor {/../../../tagnode/@text} attribute-unchanged $if|as-path,|as-path in {/@dict}$ $if|med,|med in {/@dict}$ $if|next-hop,|next-hop in {/@dict}$",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/capability/orf/prefix-list/send": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list send",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/capability/orf/prefix-list/receive": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list receive",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/default-originate": "neighbor {/../../../tagnode/@text} default-originate [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/disable-send-community/standard": "no neighbor {/../../../../tagnode/@text} send-community standard",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/disable-send-community/extended": "no neighbor {/../../../../tagnode/@text} send-community extended",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/distribute-list/export": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} out",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/distribute-list/import": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} in",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/filter-list/export": "neighbor {/../../../../tagnode/@text} filter-list {/@text} out",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/filter-list/import": "neighbor {/../../../../tagnode/@text} filter-list {/@text} in",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/maximum-prefix/@element": "neighbor {/../../../../tagnode/@text} maximum-prefix {/tagnode/@text} $if|{/threshold/@element/tagnode/@text},|threshold in {/@dict}$",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/maximum-prefix/@element/threshold/@element": "neighbor {/../../../../../../tagnode/@text} maximum-prefix {/../../tagnode/@text} {/tagnode/@text} $if|warning-only,|warning-only in {/@dict}$",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/nexthop-self": "neighbor {/../../../tagnode/@text} next-hop-self",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/prefix-list/export": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} out",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/prefix-list/import": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} in",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/remove-private-as": "neighbor {/../../../tagnode/@text} remove-private-AS",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/route-reflector-client": "neighbor {/../../../tagnode/@text} route-reflector-client",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/route-server-client": "neighbor {/../../../tagnode/@text} route-server-client",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/soft-reconfiguration/inbound": "neighbor {/../../../../tagnode/@text} soft-reconfiguration inbound",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/route-map/import": "neighbor {/../../../../tagnode/@text} route-map {/@text} in",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/route-map/export": "neighbor {/../../../../tagnode/@text} route-map {/@text} out",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/unsuppress-map": "neighbor {/../../../tagnode/@text} unsuppress-map {/@text}",
+    "/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/weight": "neighbor {/../../../tagnode/@text} weight {/@text}",
+    
+    "/protocols/bgp/@element/peer-group/@element": "neighbor {/tagnode/@text} peer-group",
+    "/protocols/bgp/@element/peer-group/@element/advertisement-interval": "neighbor {/../tagnode/@text} advertisement-interval {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/capability/dynamic": "neighbor {/../../tagnode/@text} capability dynamic",
+    "/protocols/bgp/@element/peer-group/@element/description": "neighbor {/../tagnode/@text} description {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/disable-capability-negotiation": "neighbor {/../tagnode/@text} dont-capability-negotiate",
+    "/protocols/bgp/@element/peer-group/@element/ebgp-multihop": "neighbor {/../tagnode/@text} ebgp-multihop {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/enforce-first-as": "neighbor {/../tagnode/@text} enforce-first-as",
+    "/protocols/bgp/@element/peer-group/@element/enforce-multihop": "neighbor {/../tagnode/@text} disable-connected-check",
+    "/protocols/bgp/@element/peer-group/@element/interface/@element": "neighbor {/../../tagnode/@text} interface {/ifname/@text}",
+    "/protocols/bgp/@element/peer-group/@element/local-as/@element": "neighbor {/../../tagnode/@text} local-as {/tagnode/@text}",
+    "/protocols/bgp/@element/peer-group/@element/override-capability": "neighbor {/../tagnode/@text} override-capability",
+    "/protocols/bgp/@element/peer-group/@element/passive": "neighbor {/../tagnode/@text} passive",
+    "/protocols/bgp/@element/peer-group/@element/password": "neighbor {/../tagnode/@text} password {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/port": "neighbor {/../tagnode/@text} port {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/remote-as": "neighbor {/../tagnode/@text} remote-as {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/shutdown": "neighbor {/../tagnode/@text} shutdown",
+    "/protocols/bgp/@element/peer-group/@element/strict-capability-match": "neighbor {/../tagnode/@text} strict-capability-match",
+    "/protocols/bgp/@element/peer-group/@element/timers/connect": "neighbor {/../../tagnode/@text} timers connect {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/timers": "neighbor {/../tagnode/@text} timers {/keepalive/@text} {/holdtime/@text}",
+    "/protocols/bgp/@element/peer-group/@element/ttl-security/hops": "neighbor {/../../tagnode/@text} ttl-security hops {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/update-source": "neighbor {/../tagnode/@text} update-source {/@text}",
+
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/@enter": "address-family ipv4 unicast",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/@exit": "exit-address-family",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast": ["[neighbor {/../../tagnode/@text} neighbor {/neighbor/@text},]", "neighbor {/../../tagnode/@text} activate"],
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/allowas-in": "neighbor {/../../../tagnode/@text} allowas-in",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/allowas-in/number": "neighbor {/../../../../tagnode/@text} allowas-in {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/attribute-unchanged": "neighbor {/../../../tagnode/@text} attribute-unchanged $if|as-path,|as-path in {/@dict}$ $if|med,|med in {/@dict}$ $if|next-hop,|next-hop in {/@dict}$",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/capability/orf/prefix-list/send": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list send",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/capability/orf/prefix-list/receive": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list receive",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/default-originate": "neighbor {/../../../tagnode/@text} default-originate [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/disable-send-community/standard": "no neighbor {/../../../../tagnode/@text} send-community standard",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/disable-send-community/extended": "no neighbor {/../../../../tagnode/@text} send-community extended",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/distribute-list/export": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} out",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/distribute-list/import": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} in",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/filter-list/export": "neighbor {/../../../../tagnode/@text} filter-list {/@text} out",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/filter-list/import": "neighbor {/../../../../tagnode/@text} filter-list {/@text} in",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/nexthop-self": "neighbor {/../../../tagnode/@text} next-hop-self",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/prefix-list/export": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} out",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/prefix-list/import": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} in",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/maximum-prefix/@element": "neighbor {/../../../../tagnode/@text} maximum-prefix {/tagnode/@text} $if|{/threshold/@element/tagnode/@text},|threshold in {/@dict}$",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/maximum-prefix/@element/threshold/@element": "neighbor {/../../../../../../tagnode/@text} maximum-prefix {/../../tagnode/@text} {/tagnode/@text} $if|warning-only,|warning-only in {/@dict}$",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/remove-private-as": "neighbor {/../../../tagnode/@text} remove-private-AS",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/route-reflector-client": "neighbor {/../../../tagnode/@text} route-reflector-client",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/route-server-client": "neighbor {/../../../tagnode/@text} route-server-client",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/soft-reconfiguration/inbound": "neighbor {/../../../../tagnode/@text} soft-reconfiguration inbound",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/route-map/import": "neighbor {/../../../../tagnode/@text} route-map {/@text} in",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/route-map/export": "neighbor {/../../../../tagnode/@text} route-map {/@text} out",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/unsuppress-map": "neighbor {/../../../tagnode/@text} unsuppress-map {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/weight": "neighbor {/../../../tagnode/@text} weight {/@text}",
+
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/@enter": "address-family ipv6 unicast",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/@exit": "exit-address-family",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast": ["[neighbor {/../../tagnode/@text} neighbor {/neighbor/@text},]", "neighbor {/../../tagnode/@text} activate"],
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/allowas-in": "neighbor {/../../../tagnode/@text} allowas-in",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/allowas-in/number": "neighbor {/../../../../tagnode/@text} allowas-in {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/attribute-unchanged": "neighbor {/../../../tagnode/@text} attribute-unchanged $if|as-path,|as-path in {/@dict}$ $if|med,|med in {/@dict}$ $if|next-hop,|next-hop in {/@dict}$",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/capability/orf/prefix-list/send": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list send",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/capability/orf/prefix-list/receive": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list receive",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/default-originate": "neighbor {/../../../tagnode/@text} default-originate [route-map {/route-map/@text},]",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/disable-send-community/standard": "no neighbor {/../../../../tagnode/@text} send-community standard",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/disable-send-community/extended": "no neighbor {/../../../../tagnode/@text} send-community extended",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/distribute-list/export": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} out",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/distribute-list/import": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} in",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/filter-list/export": "neighbor {/../../../../tagnode/@text} filter-list {/@text} out",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/filter-list/import": "neighbor {/../../../../tagnode/@text} filter-list {/@text} in",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/maximum-prefix/@element": "neighbor {/../../../../tagnode/@text} maximum-prefix {/tagnode/@text} $if|{/threshold/@element/tagnode/@text},|threshold in {/@dict}$",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/maximum-prefix/@element/threshold/@element": "neighbor {/../../../../../../tagnode/@text} maximum-prefix {/../../tagnode/@text} {/tagnode/@text} $if|warning-only,|warning-only in {/@dict}$",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/nexthop-self": "neighbor {/../../../tagnode/@text} next-hop-self",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/prefix-list/export": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} out",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/prefix-list/import": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} in",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/remove-private-as": "neighbor {/../../../tagnode/@text} remove-private-AS",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/route-reflector-client": "neighbor {/../../../tagnode/@text} route-reflector-client",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/route-server-client": "neighbor {/../../../tagnode/@text} route-server-client",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/soft-reconfiguration/inbound": "neighbor {/../../../../tagnode/@text} soft-reconfiguration inbound",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/route-map/import": "neighbor {/../../../../tagnode/@text} route-map {/@text} in",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/route-map/export": "neighbor {/../../../../tagnode/@text} route-map {/@text} out",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/unsuppress-map": "neighbor {/../../../tagnode/@text} unsuppress-map {/@text}",
+    "/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/weight": "neighbor {/../../../tagnode/@text} weight {/@text}"
+}
diff --git a/scripts/frr/configs/commands/bgp_vrf.json b/scripts/frr/configs/commands/bgp_vrf.json
new file mode 100644
index 0000000..68e7687
--- /dev/null
+++ b/scripts/frr/configs/commands/bgp_vrf.json
@@ -0,0 +1,211 @@
+{
+    "/routing/routing-instance/@element/protocols/bgp/@enter": "!",
+    "/routing/routing-instance/@element/protocols/bgp/@element": ["router bgp {/tagnode/@text} vrf vrf{/../../../instance-name/@text}", "no bgp default ipv4-unicast"],
+    "/routing/routing-instance/@element/protocols/bgp/@element/timers": "timers bgp {/keepalive/@text} {/holdtime/@text}",
+
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/always-compare-med": "bgp always-compare-med",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/bestpath/as-path/confed": "bgp bestpath as-path confed",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/bestpath/as-path/ignore": "bgp bestpath as-path ignore",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/bestpath/compare-routerid": "bgp bestpath compare-routerid",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/bestpath/med/confed": "bgp bestpath med confed $if|missing-as-worst,|missing-as-worst in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/cluster-id": "bgp cluster-id {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/confederation/identifier": "bgp confederation identifier {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/confederation/peers": "bgp confederation peers {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/default/local-pref": "bgp default local-preference {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/deterministic-med": "bgp deterministic-med",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/graceful-restart": "bgp graceful-restart",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/graceful-restart/restart-time": "bgp graceful-restart restart-time {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/graceful-restart/stalepath-time": "bgp graceful-restart stalepath-time {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/log-neighbor-changes": "bgp log-neighbor-changes",
+    "/routing/routing-instance/@element/protocols/bgp/@element/parameters/router-id": "bgp router-id {/@text}",
+
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element": "[neighbor {/../../tagnode/@text} peer-group {/peer-group/@text},]", 
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/advertisement-interval": "neighbor {/../tagnode/@text} advertisement-interval {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/capability/dynamic": "neighbor {/../../tagnode/@text} capability dynamic",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/description": "neighbor {/../tagnode/@text} description {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/disable-capability-negotiation": "neighbor {/../tagnode/@text} dont-capability-negotiate",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/ebgp-multihop": "neighbor {/../tagnode/@text} ebgp-multihop {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/enforce-first-as": "neighbor {/../tagnode/@text} enforce-first-as",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/enforce-multihop": "neighbor {/../tagnode/@text} disable-connected-check",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/interface/@element": "neighbor {/../../tagnode/@text} interface {/ifname/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/local-as/@element": "neighbor {/../../tagnode/@text} local-as {/tagnode/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/override-capability": "neighbor {/../tagnode/@text} override-capability",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/passive": "neighbor {/../tagnode/@text} passive",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/password": "neighbor {/../tagnode/@text} password {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/port": "neighbor {/../tagnode/@text} port {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/remote-as": "neighbor {/../tagnode/@text} remote-as {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element": "$if|neighbor {tagnode/@text} shutdown,|shutdown in {@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/strict-capability-match": "neighbor {/../tagnode/@text} strict-capability-match",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/timers/connect": "neighbor {/../../tagnode/@text} timers connect {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/timers": "neighbor {/../tagnode/@text} timers {/keepalive/@text} {/holdtime/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/ttl-security/hops": "neighbor {/../../tagnode/@text} ttl-security hops {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/update-source": "neighbor {/../tagnode/@text} update-source {/@text}",
+
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/@enter": "address-family ipv4 unicast",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/@exit": "exit-address-family",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/aggregate-address/@element": "aggregate-address {/tagnode/@text} $if|as-set,summary-only,|as-set in {/@dict}, summary-only in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/route-distinguisher": ["rd vpn export {/@text}", "import vpn", "export vpn"],
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/route-target/@element": "rt vpn {/type/@text} {/rt/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/route-target/vpn/import/@element": "rt vpn import {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/redistribute/static": "redistribute static [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/redistribute/connected": "redistribute connected [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/redistribute/kernel": "redistribute kernel [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/redistribute/ospf": "redistribute ospf [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/redistribute/rip": "redistribute rip [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/parameters/dampening": "bgp dampening $if|{/half-life/@text},|half-life in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/parameters/distance/global": "distance bgp {/external/@text} {/internal/@text} {/local/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv4-unicast/network/@element": "network {/tagnode/@text} [route-map {/route-map/@text},] $if|backdoor,|backdoor in {/@dict}$",
+
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/@enter": "address-family ipv6 unicast",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/@exit": "exit-address-family",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/aggregate-address/@element": "aggregate-address {/tagnode/@text} $if|as-set,summary-only,|as-set in {/@dict}, summary-only in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/route-distinguisher": ["rd vpn export {/@text}", "import vpn", "export vpn"],
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/route-target/@element": "rt vpn {/type/@text} {/rt/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/route-target/vpn/import/@element": "rt vpn import {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/redistribute/static": "redistribute static [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/redistribute/connected": "redistribute connected [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/redistribute/kernel": "redistribute kernel [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/redistribute/ospfv3": "redistribute ospf6 [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/redistribute/ripng": "redistribute ripng [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/parameters/dampening": "bgp dampening $if|{/half-life/@text},|half-life in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/parameters/distance/global": "distance bgp {/external/@text} {/internal/@text} {/local/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/address-family/ipv6-unicast/network/@element": "network {/tagnode/@text} [route-map {/route-map/@text},]",
+
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/@enter": "address-family ipv4 unicast",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/@exit": "exit-address-family",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast": ["[neighbor {/../../tagnode/@text} peer-group {/peer-group/@text},]", "neighbor {/../../tagnode/@text} activate"],
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/allowas-in": "neighbor {/../../../tagnode/@text} allowas-in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/allowas-in/number": "neighbor {/../../../../tagnode/@text} allowas-in {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/attribute-unchanged": "neighbor {/../../../tagnode/@text} attribute-unchanged $if|as-path,|as-path in {/@dict}$ $if|med,|med in {/@dict}$ $if|next-hop,|next-hop in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/capability/orf/prefix-list/send": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list send",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/capability/orf/prefix-list/receive": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list receive",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/default-originate": "neighbor {/../../../tagnode/@text} default-originate [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/disable-send-community/standard": "no neighbor {/../../../../tagnode/@text} send-community standard",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/disable-send-community/extended": "no neighbor {/../../../../tagnode/@text} send-community extended",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/distribute-list/export": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/distribute-list/import": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/filter-list/export": "neighbor {/../../../../tagnode/@text} filter-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/filter-list/import": "neighbor {/../../../../tagnode/@text} filter-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/maximum-prefix/@element": "neighbor {/../../../../tagnode/@text} maximum-prefix {/tagnode/@text} $if|{/threshold/@element/tagnode/@text},|threshold in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/maximum-prefix/@element/threshold/@element": "neighbor {/../../../../../../tagnode/@text} maximum-prefix {/../../tagnode/@text} {/tagnode/@text} $if|warning-only,|warning-only in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/nexthop-self": "neighbor {/../../../tagnode/@text} next-hop-self",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/prefix-list/export": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/prefix-list/import": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/remove-private-as": "neighbor {/../../../tagnode/@text} remove-private-AS",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/route-reflector-client": "neighbor {/../../../tagnode/@text} route-reflector-client",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/route-server-client": "neighbor {/../../../tagnode/@text} route-server-client",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/soft-reconfiguration/inbound": "neighbor {/../../../../tagnode/@text} soft-reconfiguration inbound",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/route-map/import": "neighbor {/../../../../tagnode/@text} route-map {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/route-map/export": "neighbor {/../../../../tagnode/@text} route-map {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/unsuppress-map": "neighbor {/../../../tagnode/@text} unsuppress-map {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv4-unicast/weight": "neighbor {/../../../tagnode/@text} weight {/@text}",
+
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/@enter": "address-family ipv6 unicast",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/@exit": "exit-address-family",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast": ["[neighbor {/../../tagnode/@text} peer-group {/peer-group/@text},]", "neighbor {/../../tagnode/@text} activate"],
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/allowas-in": "neighbor {/../../../tagnode/@text} allowas-in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/allowas-in/number": "neighbor {/../../../../tagnode/@text} allowas-in {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/attribute-unchanged": "neighbor {/../../../tagnode/@text} attribute-unchanged $if|as-path,|as-path in {/@dict}$ $if|med,|med in {/@dict}$ $if|next-hop,|next-hop in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/capability/orf/prefix-list/send": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list send",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/capability/orf/prefix-list/receive": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list receive",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/default-originate": "neighbor {/../../../tagnode/@text} default-originate [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/disable-send-community/standard": "no neighbor {/../../../../tagnode/@text} send-community standard",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/disable-send-community/extended": "no neighbor {/../../../../tagnode/@text} send-community extended",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/distribute-list/export": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/distribute-list/import": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/filter-list/export": "neighbor {/../../../../tagnode/@text} filter-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/filter-list/import": "neighbor {/../../../../tagnode/@text} filter-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/maximum-prefix/@element": "neighbor {/../../../../tagnode/@text} maximum-prefix {/tagnode/@text} $if|{/threshold/@element/tagnode/@text},|threshold in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/maximum-prefix/@element/threshold/@element": "neighbor {/../../../../../../tagnode/@text} maximum-prefix {/../../tagnode/@text} {/tagnode/@text} $if|warning-only,|warning-only in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/nexthop-self": "neighbor {/../../../tagnode/@text} next-hop-self",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/prefix-list/export": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/prefix-list/import": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/remove-private-as": "neighbor {/../../../tagnode/@text} remove-private-AS",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/route-reflector-client": "neighbor {/../../../tagnode/@text} route-reflector-client",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/route-server-client": "neighbor {/../../../tagnode/@text} route-server-client",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/soft-reconfiguration/inbound": "neighbor {/../../../../tagnode/@text} soft-reconfiguration inbound",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/route-map/import": "neighbor {/../../../../tagnode/@text} route-map {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/route-map/export": "neighbor {/../../../../tagnode/@text} route-map {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/unsuppress-map": "neighbor {/../../../tagnode/@text} unsuppress-map {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/neighbor/@element/address-family/ipv6-unicast/weight": "neighbor {/../../../tagnode/@text} weight {/@text}",
+    
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element": "neighbor {/tagnode/@text} peer-group",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/advertisement-interval": "neighbor {/../tagnode/@text} advertisement-interval {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/capability/dynamic": "neighbor {/../../tagnode/@text} capability dynamic",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/description": "neighbor {/../tagnode/@text} description {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/disable-capability-negotiation": "neighbor {/../tagnode/@text} dont-capability-negotiate",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/ebgp-multihop": "neighbor {/../tagnode/@text} ebgp-multihop {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/enforce-first-as": "neighbor {/../tagnode/@text} enforce-first-as",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/enforce-multihop": "neighbor {/../tagnode/@text} disable-connected-check",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/interface/@element": "neighbor {/../../tagnode/@text} interface {/ifname/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/local-as/@element": "neighbor {/../../tagnode/@text} local-as {/tagnode/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/override-capability": "neighbor {/../tagnode/@text} override-capability",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/passive": "neighbor {/../tagnode/@text} passive",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/password": "neighbor {/../tagnode/@text} password {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/port": "neighbor {/../tagnode/@text} port {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/remote-as": "neighbor {/../tagnode/@text} remote-as {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/shutdown": "neighbor {/../tagnode/@text} shutdown",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/strict-capability-match": "neighbor {/../tagnode/@text} strict-capability-match",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/timers/connect": "neighbor {/../../tagnode/@text} timers connect {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/timers": "neighbor {/../tagnode/@text} timers {/keepalive/@text} {/holdtime/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/ttl-security/hops": "neighbor {/../../tagnode/@text} ttl-security hops {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/update-source": "neighbor {/../tagnode/@text} update-source {/@text}",
+
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/@enter": "address-family ipv4 unicast",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/@exit": "exit-address-family",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast": ["[neighbor {/../../tagnode/@text} neighbor {/neighbor/@text},]", "neighbor {/../../tagnode/@text} activate"],
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/allowas-in": "neighbor {/../../../tagnode/@text} allowas-in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/allowas-in/number": "neighbor {/../../../../tagnode/@text} allowas-in {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/attribute-unchanged": "neighbor {/../../../tagnode/@text} attribute-unchanged $if|as-path,|as-path in {/@dict}$ $if|med,|med in {/@dict}$ $if|next-hop,|next-hop in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/capability/orf/prefix-list/send": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list send",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/capability/orf/prefix-list/receive": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list receive",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/default-originate": "neighbor {/../../../tagnode/@text} default-originate [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/disable-send-community/standard": "no neighbor {/../../../../tagnode/@text} send-community standard",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/disable-send-community/extended": "no neighbor {/../../../../tagnode/@text} send-community extended",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/distribute-list/export": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/distribute-list/import": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/filter-list/export": "neighbor {/../../../../tagnode/@text} filter-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/filter-list/import": "neighbor {/../../../../tagnode/@text} filter-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/nexthop-self": "neighbor {/../../../tagnode/@text} next-hop-self",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/prefix-list/export": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/prefix-list/import": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/maximum-prefix/@element": "neighbor {/../../../../tagnode/@text} maximum-prefix {/tagnode/@text} $if|{/threshold/@element/tagnode/@text},|threshold in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/maximum-prefix/@element/threshold/@element": "neighbor {/../../../../../../tagnode/@text} maximum-prefix {/../../tagnode/@text} {/tagnode/@text} $if|warning-only,|warning-only in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/remove-private-as": "neighbor {/../../../tagnode/@text} remove-private-AS",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/route-reflector-client": "neighbor {/../../../tagnode/@text} route-reflector-client",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/route-server-client": "neighbor {/../../../tagnode/@text} route-server-client",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/soft-reconfiguration/inbound": "neighbor {/../../../../tagnode/@text} soft-reconfiguration inbound",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/route-map/import": "neighbor {/../../../../tagnode/@text} route-map {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/route-map/export": "neighbor {/../../../../tagnode/@text} route-map {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/unsuppress-map": "neighbor {/../../../tagnode/@text} unsuppress-map {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv4-unicast/weight": "neighbor {/../../../tagnode/@text} weight {/@text}",
+
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/@enter": "address-family ipv6 unicast",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/@exit": "exit-address-family",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast": ["[neighbor {/../../tagnode/@text} neighbor {/neighbor/@text},]", "neighbor {/../../tagnode/@text} activate"],
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/allowas-in": "neighbor {/../../../tagnode/@text} allowas-in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/allowas-in/number": "neighbor {/../../../../tagnode/@text} allowas-in {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/attribute-unchanged": "neighbor {/../../../tagnode/@text} attribute-unchanged $if|as-path,|as-path in {/@dict}$ $if|med,|med in {/@dict}$ $if|next-hop,|next-hop in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/capability/orf/prefix-list/send": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list send",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/capability/orf/prefix-list/receive": "neighbor {/../../../../../../tagnode/@text} capability orf prefix-list receive",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/default-originate": "neighbor {/../../../tagnode/@text} default-originate [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/disable-send-community/standard": "no neighbor {/../../../../tagnode/@text} send-community standard",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/disable-send-community/extended": "no neighbor {/../../../../tagnode/@text} send-community extended",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/distribute-list/export": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/distribute-list/import": "neighbor {/../../../../tagnode/@text} distribute-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/filter-list/export": "neighbor {/../../../../tagnode/@text} filter-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/filter-list/import": "neighbor {/../../../../tagnode/@text} filter-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/maximum-prefix/@element": "neighbor {/../../../../tagnode/@text} maximum-prefix {/tagnode/@text} $if|{/threshold/@element/tagnode/@text},|threshold in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/maximum-prefix/@element/threshold/@element": "neighbor {/../../../../../../tagnode/@text} maximum-prefix {/../../tagnode/@text} {/tagnode/@text} $if|warning-only,|warning-only in {/@dict}$",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/nexthop-self": "neighbor {/../../../tagnode/@text} next-hop-self",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/prefix-list/export": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/prefix-list/import": "neighbor {/../../../../tagnode/@text} prefix-list {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/remove-private-as": "neighbor {/../../../tagnode/@text} remove-private-AS",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/route-reflector-client": "neighbor {/../../../tagnode/@text} route-reflector-client",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/route-server-client": "neighbor {/../../../tagnode/@text} route-server-client",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/soft-reconfiguration/inbound": "neighbor {/../../../../tagnode/@text} soft-reconfiguration inbound",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/route-map/import": "neighbor {/../../../../tagnode/@text} route-map {/@text} in",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/route-map/export": "neighbor {/../../../../tagnode/@text} route-map {/@text} out",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/unsuppress-map": "neighbor {/../../../tagnode/@text} unsuppress-map {/@text}",
+    "/routing/routing-instance/@element/protocols/bgp/@element/peer-group/@element/address-family/ipv6-unicast/weight": "neighbor {/../../../tagnode/@text} weight {/@text}"
+}
diff --git a/scripts/frr/configs/commands/ldp.json b/scripts/frr/configs/commands/ldp.json
new file mode 100644
index 0000000..77a0c97
--- /dev/null
+++ b/scripts/frr/configs/commands/ldp.json
@@ -0,0 +1,19 @@
+{
+    "/protocols/mpls-ldp/@enter": "!",
+    "/protocols/mpls-ldp": "mpls ldp",
+    "/protocols/mpls-ldp/address-family/ipv4/@enter": " address-family ipv4",
+    "/protocols/mpls-ldp/address-family/ipv4/@exit": " exit-address-family",
+    "/protocols/mpls-ldp/address-family/ipv4/label-policy/allocate/for/access-list": "  label local allocate for {/@text}",
+    "/protocols/mpls-ldp/address-family/ipv4/label-policy/allocate/host-routes": "  label local allocate host-routes",
+    "/protocols/mpls-ldp/address-family/ipv4/label-policy/advertise/for/access-list": "  label local advertise for {/@text}",
+    "/protocols/mpls-ldp/address-family/ipv4/label-policy/advertise/explicit-null": "  label local advertise explicit-null",
+    "/protocols/mpls-ldp/address-family/ipv4/session-ka-holdtime": "  session holdtime {/@text}",
+    "/protocols/mpls-ldp/address-family/ipv4/transport-address": "  discovery transport-address {/@text}",
+    "/protocols/mpls-ldp/address-family/ipv4/discovery/interfaces/interface/@element/@exit": "  !",
+    "/protocols/mpls-ldp/address-family/ipv4/discovery/interfaces/interface/@element/interface": "  interface {/@text}",
+    "/protocols/mpls-ldp/address-family/ipv4/discovery/interfaces/interface/@element/hello-holdtime": "   discovery hello holdtime {/@text}",
+    "/protocols/mpls-ldp/address-family/ipv4/discovery/interfaces/interface/@element/hello-interval": "   discovery hello interval {/@text}",
+    "/protocols/mpls-ldp/lsr-id": " router-id {/@text}",
+    "/protocols/mpls-ldp/neighbors/neighbor/@element/md5-password": " neighbor {../lsr-id/@text} password {/@text}",
+    "/protocols/mpls-ldp/neighbors/neighbor/@element/session-ka-holdtime": " neighbor {../lsr-id/@text} session holdtime {/@text}"
+}
diff --git a/scripts/frr/configs/commands/ospf.json b/scripts/frr/configs/commands/ospf.json
new file mode 100644
index 0000000..fb03ac0
--- /dev/null
+++ b/scripts/frr/configs/commands/ospf.json
@@ -0,0 +1,109 @@
+{
+    "/interfaces/@element/ip/ospf": "interface {/../../tagnode/@text}",
+    "/interfaces/@element/ip/ospf/authentication/md5": "ip ospf authentication message-digest",
+    "/interfaces/@element/ip/ospf/authentication/md5-key-id/@element": "ip ospf message-digest-key {/tagnode/@text} md5 {/md5-key/@text}",
+    "/interfaces/@element/ip/ospf/authentication/plaintext": "ip ospf authentication",
+    "/interfaces/@element/ip/ospf/authentication/plaintext-password": "ip ospf authentication-key {/@text}",
+    "/interfaces/@element/ip/ospf/cost": "ip ospf cost {/@text}",
+    "/interfaces/@element/ip/ospf/dead-interval": "ip ospf dead-interval {/@text}",
+    "/interfaces/@element/ip/ospf/hello-interval": "ip ospf hello-interval {/@text}",
+    "/interfaces/@element/ip/ospf/mtu-ignore": "ip ospf mtu-ignore",
+    "/interfaces/@element/ip/ospf/network": "ip ospf network {/@text}",
+    "/interfaces/@element/ip/ospf/priority": "ip ospf priority {/@text}",
+    "/interfaces/@element/ip/ospf/retransmit-interval": "ip ospf retransmit-interval {/@text}",
+    "/interfaces/@element/ip/ospf/transmit-delay": "ip ospf transmit-delay {/@text}",
+    "/protocols/ospf/@enter": "!",
+    "/protocols/ospf": "router ospf",
+    "/protocols/ospf/area/@element/authentication" : "area {/../tagnode/@text} authentication $if|message-digest,|{/@text}==md5$",
+    "/protocols/ospf/area/@element/area-type/nssa": "area {/../../tagnode/@text} nssa",
+    "/protocols/ospf/area/@element/area-type/nssa/default-cost": "area {/../../../tagnode/@text} default-cost {/@text}",
+    "/protocols/ospf/area/@element/area-type/nssa/no-summary": "area {/../../../tagnode/@text} nssa no-summary",
+    "/protocols/ospf/area/@element/area-type/nssa/translate": "area {/../../../tagnode/@text} nssa translate-{/@text}",
+    "/protocols/ospf/area/@element/area-type/stub": "area {/../../tagnode/@text} stub",
+    "/protocols/ospf/area/@element/area-type/stub/default-cost": "area {/../../../tagnode/@text} default-cost {/@text}",
+    "/protocols/ospf/area/@element/area-type/stub/no-summary": "area {/../../../tagnode/@text} stub no-summary",
+    "/protocols/ospf/area/@element/network/@element": "network {/@text} area {/../../tagnode/@text}",
+    "/protocols/ospf/area/@element/range/@element": "area {/../../tagnode/@text} range {/tagnode/@text} [cost {/metric/@text},] $if|not-advertise,|{/not-advertise/@text}==None$",
+    "/protocols/ospf/area/@element/shortcut": "area {/../tagnode/@text} shortcut {/@text}",
+    "/protocols/ospf/area/@element/virtual-link/@element": "area {/../../tagnode/@text} virtual-link {/tagnode/@text}",
+    "/protocols/ospf/area/@element/virtual-link/@element/authentication/md5": "area {/../../../../tagnode/@text} virtual-link {/../../tagnode/@text} authentication message-digest",
+    "/protocols/ospf/area/@element/virtual-link/@element/authentication/md5-key-id/@element/md5-key": "area {/../../../../../../ tagnode/@text} virtual-link {/../../../../tagnode/@text} authentication message-digest-key {/../tagnode/@text} md5 {/@text}",
+    "/protocols/ospf/area/@element/virtual-link/@element/authentication/plaintext": "area {/../../../../tagnode/@text} virtual-link {/../../tagnode/@text} authentication",
+    "/protocols/ospf/area/@element/virtual-link/@element/authentication/plaintext-password": "area {/../../../../tagnode/@text} virtual-link {/../../tagnode/@text} authentication-key {/@text}",
+    "/protocols/ospf/area/@element/virtual-link/@element/dead-interval": "area {/../../../tagnode/@text} virtual-link {/../tagnode/@text} dead-interval {/@text}",
+    "/protocols/ospf/area/@element/virtual-link/@element/hello-interval": "area {/../../../tagnode/@text} virtual-link {/../tagnode/@text} hello-interval {/@text}",
+    "/protocols/ospf/area/@element/virtual-link/@element/retransmit-interval": "area {/../../../tagnode/@text} virtual-link {/../tagnode/@text} retransmit-interval {/@text}",
+    "/protocols/ospf/area/@element/virtual-link/@element/transmit-delay": "area {/../../../tagnode/@text} virtual-link {/../tagnode/@text} transmit-delay {/@text}",
+    "/protocols/ospf/auto-cost/reference-bandwidth": "auto-cost reference-bandwidth {/@text}",
+    "/protocols/ospf/default-information/originate": "default-information originate [always] [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/protocols/ospf/default-metric": "default-metric {/@text}",
+    "/protocols/ospf/distance/global": "distance {/@text}",
+    "/protocols/ospf/distance/ospf/external": "distance ospf external {/@text}",
+    "/protocols/ospf/distance/ospf/inter-area": "distance ospf inter-area {/@text}",
+    "/protocols/ospf/distance/ospf/intra-area": "distance ospf intra-area {/@text}",
+    "/protocols/ospf/distribute-list/export/bgp": "distribute-list {@text} out bgp",
+    "/protocols/ospf/distribute-list/export/connected": "distribute-list {@text} out connected",
+    "/protocols/ospf/distribute-list/export/kernel": "distribute-list {@text} out kernel",
+    "/protocols/ospf/distribute-list/export/rip": "distribute-list {@text} out rip",
+    "/protocols/ospf/distribute-list/export/static": "distribute-list {@text} out static",
+    "/protocols/ospf/parameters/abr-type": "ospf abr-type {/@text}",
+    "/protocols/ospf/parameters/router-id" :"ospf router-id {/@text}",
+    "/protocols/ospf/passive-interface/@element": "passive-interface {/@text}",
+    "/protocols/ospf/neighbor/@element": "neighbor {/tagnode/@text} [priority {/priority/@text},] [poll-interval {/poll-interval/@text},]",
+    "/protocols/ospf/redistribute/bgp": "redistribute bgp [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/protocols/ospf/redistribute/connected": "redistribute connected [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/protocols/ospf/redistribute/kernel": "redistribute kernel [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/protocols/ospf/redistribute/ospf/process-id/@element": "redistribute ospf {/process-id/@text} [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/protocols/ospf/redistribute/rip": "redistribute rip [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/protocols/ospf/redistribute/static": "redistribute static [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/protocols/ospf/timers/lsa": "timers lsa min-arrival {/arrival/@text}",
+    "/protocols/ospf/timers/throttle/lsa": "timers throttle lsa all {/delay/@text}",
+    "/protocols/ospf/timers/throttle/spf": "timers throttle spf {/delay/@text} {/min-wait/@text} {/max-wait/@text}",
+
+    "/routing/routing-instance/@element/protocols/ospf": "router ospf vrf vrf{/../../instance-name/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/authentication" : "area {/../tagnode/@text} authentication $if|message-digest,|{/@text}==md5$",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/area-type/nssa": "area {/../../tagnode/@text} nssa",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/area-type/nssa/default-cost": "area {/../../../tagnode/@text} default-cost {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/area-type/nssa/no-summary": "area {/../../../tagnode/@text} nssa no-summary",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/area-type/nssa/translate": "area {/../../../tagnode/@text} nssa translate-{/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/area-type/stub": "area {/../../tagnode/@text} stub",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/area-type/stub/default-cost": "area {/../../../tagnode/@text} default-cost {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/area-type/stub/no-summary": "area {/../../../tagnode/@text} stub no-summary",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/network/@element": "network {/@text} area {/../../tagnode/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/range/@element": "area {/../../tagnode/@text} range {/tagnode/@text} [cost {/metric/@text},] $if|not-advertise,|{/not-advertise/@text}==None$",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/shortcut": "area {/../tagnode/@text} shortcut {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/virtual-link/@element": "area {/../../tagnode/@text} virtual-link {/tagnode/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/virtual-link/@element/authentication/md5": "area {/../../../../tagnode/@text} virtual-link {/../../tagnode/@text} authentication message-digest",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/virtual-link/@element/authentication/md5-key-id/@element/md5-key": "area {/../../../../../../ tagnode/@text} virtual-link {/../../../../tagnode/@text} authentication message-digest-key {/../tagnode/@text} md5 {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/virtual-link/@element/authentication/plaintext": "area {/../../../../tagnode/@text} virtual-link {/../../tagnode/@text} authentication",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/virtual-link/@element/authentication/plaintext-password": "area {/../../../../tagnode/@text} virtual-link {/../../tagnode/@text} authentication-key {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/virtual-link/@element/dead-interval": "area {/../../../tagnode/@text} virtual-link {/../tagnode/@text} dead-interval {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/virtual-link/@element/hello-interval": "area {/../../../tagnode/@text} virtual-link {/../tagnode/@text} hello-interval {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/virtual-link/@element/retransmit-interval": "area {/../../../tagnode/@text} virtual-link {/../tagnode/@text} retransmit-interval {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/virtual-link/@element/transmit-delay": "area {/../../../tagnode/@text} virtual-link {/../tagnode/@text} transmit-delay {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/auto-cost/reference-bandwidth": "auto-cost reference-bandwidth {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/default-information/originate": "default-information originate [always] [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/ospf/default-metric": "default-metric {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/distance/global": "distance {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/distance/ospf/external": "distance ospf external {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/distance/ospf/inter-area": "distance ospf inter-area {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/distance/ospf/intra-area": "distance ospf intra-area {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/distribute-list/export/bgp": "distribute-list {/@text} out bgp",
+    "/routing/routing-instance/@element/protocols/ospf/distribute-list/export/connected": "distribute-list {/@text} out connected",
+    "/routing/routing-instance/@element/protocols/ospf/distribute-list/export/kernel": "distribute-list {/@text} out kernel",
+    "/routing/routing-instance/@element/protocols/ospf/distribute-list/export/rip": "distribute-list {/@text} out rip",
+    "/routing/routing-instance/@element/protocols/ospf/distribute-list/export/static": "distribute-list {/@text} out static",
+    "/routing/routing-instance/@element/protocols/ospf/parameters/abr-type": "ospf abr-type {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/parameters/router-id" :"ospf router-id {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/passive-interface/@element": "passive-interface {/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/neighbor/@element": "neighbor {/tagnode/@text} [priority {/priority/@text},] [poll-interval {/poll-interval/@text},]",
+    "/routing/routing-instance/@element/protocols/ospf/area/@element/network/@element": "network {/@text} area {/../../tagnode/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/redistribute/bgp": "redistribute bgp [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/ospf/redistribute/connected": "redistribute connected [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/ospf/redistribute/kernel": "redistribute kernel [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/ospf/redistribute/rip": "redistribute rip [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/ospf/redistribute/static": "redistribute static [metric {/metric/@text},] [metric-type {/metric-type/@text},] [route-map {/route-map/@text},]",
+    "/routing/routing-instance/@element/protocols/ospf/timers/lsa": "timers lsa min-arrival {/arrival/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/timers/throttle/lsa": "timers throttle lsa all {/delay/@text}",
+    "/routing/routing-instance/@element/protocols/ospf/timers/throttle/spf": "timers throttle spf {/delay/@text} {/min-wait/@text} {/max-wait/@text}"
+}
diff --git a/scripts/frr/configs/commands/ospf6.json b/scripts/frr/configs/commands/ospf6.json
new file mode 100644
index 0000000..6ba56c9
--- /dev/null
+++ b/scripts/frr/configs/commands/ospf6.json
@@ -0,0 +1,29 @@
+{
+    "/interfaces/@element/ipv6/ospfv3": "interface {/../../tagnode/@text}",
+    "/interfaces/@element/ipv6/ospfv3/cost": "ipv6 ospf6 cost {/@text}",
+    "/interfaces/@element/ipv6/ospfv3/dead-interval": "ipv6 ospf6 dead-interval {/@text}",
+    "/interfaces/@element/ipv6/ospfv3/hello-interval": "ipv6 ospf6 hello-interval {/@text}",
+    "/interfaces/@element/ipv6/ospfv3/instance-id": "ipv6 ospf6 instance-id {/@text}",    
+    "/interfaces/@element/ipv6/ospfv3/mtu-ignore": "ipv6 ospf6 mtu-ignore",
+    "/interfaces/@element/ipv6/ospfv3/network/@element": "ipv6 ospf6 network {/tagnode/@text}",
+    "/interfaces/@element/ipv6/ospfv3/priority": "ipv6 ospf6 priority {/@text}",
+    "/interfaces/@element/ipv6/ospfv3/retransmit-interval": "ipv6 ospf6 retransmit-interval {/@text}",
+    "/interfaces/@element/ipv6/ospfv3/transmit-delay": "ipv6 ospf6 transmit-delay {/@text}",
+    "/protocols/ospfv3/@enter": "!",
+    "/protocols/ospfv3": "router ospf6",
+    "/protocols/ospfv3/area/@element/range/@element": "area {/../../tagnode/@text} range {/tagnode/@text} [cost {/metric/@text},] $if|not-advertise,|{/not-advertise/@text}==None$",
+    "/protocols/ospfv3/area/@element/stub": "area {../tagnode/@text} stub $if|no-summary,|{/no-summary/@text}==None$",
+    "/protocols/ospfv3/area/@element/interface/@element": "interface {/tagnode/@text/} area {../../tagnode/@text}",
+    "/protocols/ospfv3/auto-cost/reference-bandwidth": "auto-cost reference-bandwidth {/@text}",
+    "/protocols/ospfv3/distance/global": "distance {/@text}",
+    "/protocols/ospfv3/distance/ospfv3/external": "distance ospf6 external {/@text}",
+    "/protocols/ospfv3/distance/ospfv3/inter-area": "distance ospf6 inter-area {/@text}",
+    "/protocols/ospfv3/distance/ospfv3/intra-area": "distance ospf6 intra-area {/@text}",
+    "/protocols/ospfv3/redistribute/bgp": "redistribute bgp [route-map {/route-map/@text},]",
+    "/protocols/ospfv3/redistribute/connected": "redistribute connected [route-map {/route-map/@text},]",
+    "/protocols/ospfv3/redistribute/kernel": "redistribute kernel [route-map {/route-map/@text},]",
+    "/protocols/ospfv3/redistribute/rip": "redistribute ripng [route-map {/route-map/@text},]",
+    "/protocols/ospfv3/redistribute/static": "redistribute static [route-map {/route-map/@text},]",
+    "/protocols/ospfv3/router-id" :"ospf6 router-id {/@text}",
+    "/protocols/ospfv3/timers/spf/exp": "timers throttle spf {/min/@text} {/min/@text} {/max/@text}"
+}
diff --git a/scripts/frr/configs/commands/policy.json b/scripts/frr/configs/commands/policy.json
new file mode 100644
index 0000000..1844825
--- /dev/null
+++ b/scripts/frr/configs/commands/policy.json
@@ -0,0 +1,49 @@
+{
+    "/policy/route/route-map/@enter": "!",
+    "/policy/route/route-map/@element/rule/@element":"route-map {/../../tagnode/@text} {/action/@text} {/tagnode/@text}",
+   "/policy/route/route-map/@element/rule/@element/match/as-path":"match as-path {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/interface":"match interface {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/ip/address/standard-acl":"match ip address {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/ip/address/extended-acl":"match ip address {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/ip/address/prefix-lists":"match ip address prefix-list {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/ip/nexthop/standard-acl":"match ip next-hop {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/ip/nexthop/extended-acl":"match ip next-hop {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/ip/nexthop/prefix-lists":"match ip next-hop prefix-list {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/ip/source-protocol":"match source-protocol {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/ipv6/address/access-list":"match ipv6 address {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/ipv6/address/prefix-list":"match ipv6 address prefix-list {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/ipv6/source-protocol":"match source-protocol $if|ospf6,{@text}|{@text}==ospfv3$",
+    "/policy/route/route-map/@element/rule/@element/match/metric":"match metric {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/origin":"match origin {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/tag":"match tag {@text}",
+    "/policy/route/route-map/@element/rule/@element/match/community":"match community {/community-list/@text} $if|exact-match,|exact-match in {@dict}$",
+    "/policy/route/route-map/@element/rule/@element/match/extcommunity/extcommunity-list":"match extcommunity {@text}",
+    "/policy/route/route-map/@element/rule/@element/continue":"continue {@text}",
+    "/policy/route/route-map/@element/rule/@element/set/originator-id":"set originator-id {@text}",
+    "/policy/route/route-map/@element/rule/@element/set/aggregator":"set aggregator as {/as/@text} {/ip/@text}",
+    "/policy/route/route-map/@element/rule/@element/set/local-preference":"set local-preference {@text}",
+    "/policy/route/route-map/@element/rule/@element/set/ipv6-next-hop/global":"set ipv6 next-hop global {/@text}",
+    "/policy/route/route-map/@element/rule/@element/set/ipv6-next-hop/local":"set ipv6 next-hop local {/@text}",
+    "/policy/route/route-map/@element/rule/@element/set/origin":"set origin {@text}",
+    "/policy/route/route-map/@element/rule/@element/set/metric-type":"set metric-type {@text}",
+    "/policy/route/route-map/@element/rule/@element/set/as-path-prepend":"set as-path prepend {@text}",
+    "/policy/route/route-map/@element/rule/@element/set/prepend-last-as":"set as-path prepend last-as {@text}",
+    "/policy/route/route-map/@element/rule/@element/set/community":"set community {/@text}",
+    "/policy/route/route-map/@element/rule/@element/set/add-community":"set community {/@text}",
+    "/policy/route/route-map/@element/rule/@element/set/extcommunity/rt":"set extcommunity rt {@text}",
+    "/policy/route/route-map/@element/rule/@element/set/extcommunity/soo":"set extcommunity soo {@text}",
+    "/policy/route/route-map/@element/rule/@element/set/add-extcommunity":"set extcommunity rt {/rt/@text}",
+    "/policy/route/route-map/@element/rule/@element/set/atomic-aggregate":"set atomic-aggregate",
+    "/policy/route/route-map/@element/rule/@element/set/ip-next-hop":"set ip next-hop {/@text}",
+    "/policy/route/route-map/@element/rule/@element/set/weight":"set weight {/@text}",
+    "/policy/route/route-map/@element/rule/@element/set/metric":"set metric {/@text}",
+    "/policy/route/prefix-list/@element/rule/@element":"ip prefix-list {/../../tagnode/@text} seq {/tagnode/@text} {/action/@text} {/prefix/@text} [ge {/ge/@text},] [le {/le/@text},]",
+    "/policy/route/prefix-list/@element/description":"ip prefix-list {/../tagnode/@text} description {/@text}",
+    "/policy/route/prefix-list6/@element/rule/@element":"ipv6 prefix-list {/../../tagnode/@text} seq {/tagnode/@text} {/action/@text} {/prefix/@text} [ge {/ge/@text},] [le {/le/@text},]",
+    "/policy/route/prefix-list6/@element/description":"ipv6 prefix-list {/../tagnode/@text} description {/@text}",
+    "/policy/route/access-list/@element":"$acl|{/@dict}$",
+    "/policy/route/community-list/standard/@element/rule/@element":"ip community-list standard {/../../tagnode/@text} {/action/@text} {community/@text}",
+    "/policy/route/community-list/expanded/@element/rule/@element":"ip community-list expanded {/../../tagnode/@text} {/action/@text} {regex/@text}",
+    "/policy/route/extcommunity-list/standard/@element/rule/@element":"ip extcommunity-list standard {/../../tagnode/@text} {/action/@text} [rt {rt/@text},] [soo {soo/@text},]",
+    "/policy/route/extcommunity-list/expanded/@element/rule/@element":"ip extcommunity-list expanded {/../../tagnode/@text} {/action/@text} {regex/@text}"
+}
diff --git a/scripts/frr/configs/commands/static.json b/scripts/frr/configs/commands/static.json
new file mode 100644
index 0000000..5cab8e0
--- /dev/null
+++ b/scripts/frr/configs/commands/static.json
@@ -0,0 +1,42 @@
+{
+    "/protocols/static/@enter": "!",
+    "/protocols/static/interface-route/@element/next-hop-interface/@element":"ip route {/../../tagnode/@text} {/tagnode/@text} [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/protocols/static/interface-route/@element/next-hop-routing-instance/@element/next-hop-interface/@element":"ip route {/../../../../tagnode/@text} {/tagnode/@text} [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ nexthop-vrf vrf{/../../routing-instance/@text}",
+    "/protocols/static/route/@element/next-hop/@element":"ip route {/../../tagnode/@text} {/tagnode/@text} [{/interface/@text},] [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/protocols/static/route/@element/blackhole":"ip route {/../tagnode/@text} blackhole [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/protocols/static/route/@element/unreachable": "ip route {/../tagnode/@text} reject [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/protocols/static/route/@element/next-hop-routing-instance/@element/next-hop/@element": "ip route {/../../../../tagnode/@text} {/tagnode/@text} [{/interface/@text},] [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ nexthop-vrf vrf{/../../routing-instance/@text}",
+
+    "/protocols/static/interface-route6/@element/next-hop-interface/@element":"ipv6 route {/../../tagnode/@text} {/tagnode/@text} [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/protocols/static/interface-route6/@element/next-hop-routing-instance/@element/next-hop-interface/@element":"ipv6 route {/../../../../tagnode/@text} {/tagnode/@text} [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ nexthop-vrf vrf{/../../routing-instance/@text}",
+    "/protocols/static/route6/@element/next-hop/@element":"ipv6 route {/../../tagnode/@text} {/tagnode/@text} [{/interface/@text},] [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/protocols/static/route6/@element/blackhole":"ipv6 route {/../tagnode/@text} blackhole [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/protocols/static/route6/@element/unreachable": "ipv6 route {/../tagnode/@text} reject [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/protocols/static/route6/@element/next-hop-routing-instance/@element/next-hop/@element": "ipv6 route {/../../../../tagnode/@text} {/tagnode/@text} [{/interface/@text},] [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ nexthop-vrf vrf{/../../routing-instance/@text}",
+
+    "/protocols/static/table/@element/interface-route/@element/next-hop-interface/@element":"ip route {/../../tagnode/@text} {/tagnode/@text} [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ table {/../../../../tagnode/@text}",
+    "/protocols/static/table/@element/route/@element/next-hop/@element":"ip route {/../../tagnode/@text} {/tagnode/@text} [{/interface/@text},] [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ table {/../../../../tagnode/@text}",
+    "/protocols/static/table/@element/route/@element/blackhole":"ip route {/../tagnode/@text} blackhole [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$  table {/../../../tagnode/@text}",
+    "/protocols/static/table/@element/route/@element/unreachable": "ip route {/../tagnode/@text} reject [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$  table {/../../../tagnode/@text}",
+
+    "/protocols/static/table/@element/interface-route6/@element/next-hop-interface/@element":"ipv6 route {/../../tagnode/@text} {/tagnode/@text} [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ table {/../../../../tagnode/@text}",
+    "/protocols/static/table/@element/route6/@element/next-hop/@element":"ipv6 route {/../../tagnode/@text} {/tagnode/@text} [{/interface/@text},] [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ table {/../../../../tagnode/@text}",
+    "/protocols/static/table/@element/route6/@element/blackhole":"ipv6 route {/../tagnode/@text} blackhole [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$  table {/../../../tagnode/@text}",
+    "/protocols/static/table/@element/route6/@element/unreachable": "ipv6 route {/../tagnode/@text} reject [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$  table {/../../../tagnode/@text}",
+    
+    "/routing/routing-instance/@element/protocols/static": "vrf vrf{/../../instance-name/@text}",
+    "/routing/routing-instance/@element/protocols/static/@exit": "exit-vrf",
+    "/routing/routing-instance/@element/protocols/static/interface-route/@element/next-hop-interface/@element":"ip route {/../../tagnode/@text} {/tagnode/@text} [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/routing/routing-instance/@element/protocols/static/interface-route/@element/next-hop-routing-instance/@element/next-hop-interface/@element":"ip route {/../../../../tagnode/@text} {/tagnode/@text} [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ nexthop-vrf $if|Default-IP-Routing-Table,vrf{/../../routing-instance/@text}|{/../../routing-instance/@text}==default,$",
+    "/routing/routing-instance/@element/protocols/static/route/@element/next-hop/@element": "ip route {/../../tagnode/@text} {/tagnode/@text} [{/interface/@text},] [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/routing/routing-instance/@element/protocols/static/route/@element/blackhole":"ip route {/../tagnode/@text} blackhole [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/routing/routing-instance/@element/protocols/static/route/@element/unreachable": "ip route {/../tagnode/@text} reject [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/routing/routing-instance/@element/protocols/static/route/@element/next-hop-routing-instance/@element/next-hop/@element": "ip route {/../../../../tagnode/@text} {/tagnode/@text} [{/interface/@text},] [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ nexthop-vrf $if|Default-IP-Routing-Table,vrf{/../../routing-instance/@text}|{/../../routing-instance/@text}==default,$",
+
+    "/routing/routing-instance/@element/protocols/static/interface-route6/@element/next-hop-interface/@element":"ipv6 route {/../../tagnode/@text} {/tagnode/@text} [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/routing/routing-instance/@element/protocols/static/interface-route6/@element/next-hop-routing-instance/@element/next-hop-interface/@element":"ipv6 route {/../../../../tagnode/@text} {/tagnode/@text} [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ nexthop-vrf $if|Default-IP-Routing-Table,vrf{/../../routing-instance/@text}|{/../../routing-instance/@text}==default,$",
+    "/routing/routing-instance/@element/protocols/static/route6/@element/next-hop/@element": "ipv6 route {/../../tagnode/@text} {/tagnode/@text} [{/interface/@text},] [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/routing/routing-instance/@element/protocols/static/route6/@element/blackhole":"ipv6 route {/../tagnode/@text} blackhole [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/routing/routing-instance/@element/protocols/static/route6/@element/unreachable": "ipv6 route {/../tagnode/@text} reject [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$",
+    "/routing/routing-instance/@element/protocols/static/route6/@element/next-hop-routing-instance/@element/next-hop/@element": "ipv6 route {/../../../../tagnode/@text} {/tagnode/@text} [{/interface/@text},] [tag {/tag/@text},] $if|{/distance/@text},|{/distance/@text}!=1,$ nexthop-vrf $if|Default-IP-Routing-Table,vrf{/../../routing-instance/@text}|{/../../routing-instance/@text}==default,$"
+}
diff --git a/scripts/frr/configs/priorities.json b/scripts/frr/configs/priorities.json
new file mode 100644
index 0000000..c6a906c
--- /dev/null
+++ b/scripts/frr/configs/priorities.json
@@ -0,0 +1,20 @@
+{
+    "/protocols/bgp/@element": {
+        "last": ["neighbor"]
+    },
+    "/protocols/bgp/@element/neighbor/@element": {
+        "first": ["remote-as"]
+    },
+    "/protocols/bgp/@element/peer-group/@element": {
+        "first": ["remote-as"]
+    },
+    "/protocols/mpls-ldp": {
+        "last": ["address-family"]
+    },
+    "/protocols/mpls-ldp/address-family/ipv4": {
+        "last": ["discovery"]
+    },
+    "/protocols/mpls-ldp/address-family/ipv4/discovery/interfaces/interface/@element": {
+        "first": ["interface"]
+    }
+}
diff --git a/scripts/frr/frr.conf b/scripts/frr/frr.conf
new file mode 100644
index 0000000..8affa90
--- /dev/null
+++ b/scripts/frr/frr.conf
@@ -0,0 +1,46 @@
+!
+router ospf
+network 192.168.122.0/24 area 0
+network 10.2.1.0/24 area 0
+passive-interface dp0s4
+passive-interface dp0s5
+neighbor 1.1.1.1 priority 2 poll-interval 1
+ospf abr-type cisco
+ospf router-id 1.1.1.1
+redistribute static metric 2
+redistribute bgp metric 2
+timers lsa arrival 1000
+timers throttle lsa all 0
+timers throttle spf 500 500 50000
+!
+ip route 90.1.1.0/24 dp0s4 1
+ipv6 route 9000::/64 dp0s4 1
+ip route 10.1.1.0/24 10.0.1.21 1
+ip route 22.1.1.0/24 Null0 1
+ip route 54.23.4.0/24 unreachable 1
+ipv6 route 8800::/64 Null0 1
+ipv6 route 8900::/64 unreachable 1
+ipv6 route 9800::/64 6001::1 1
+!
+router bgp 200
+no bgp default ipv4-unicast
+address-family ipv4 unicast
+network 20.1.1.0/24 route-map EXPORT-SET
+redistribute static
+exit-address-family
+neighbor 3.3.3.3 remote-as 200
+address-family ipv4 unicast
+neighbor 3.3.3.3 activate
+exit-address-family
+neighbor 3.3.3.3 update-source 1.1.1.1
+neighbor 20.1.1.10 remote-as 100
+address-family ipv4 unicast
+neighbor 20.1.1.10 activate
+neighbor 20.1.1.10 route-map IMPORT-SET in
+exit-address-family
+bgp router-id 20.3.6.30
+!
+route-map EXPORT-SET permit 10
+set community no-export
+route-map IMPORT-SET permit 10
+set extcommunity rt 100:1
\ No newline at end of file
diff --git a/scripts/frr/frr.py b/scripts/frr/frr.py
new file mode 100755
index 0000000..fc92ec5
--- /dev/null
+++ b/scripts/frr/frr.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+import json
+import os
+
+input_file = "/etc/vyatta-routing/frr.json"
+output_file = "/etc/vyatta-routing/frr.conf"
+
+
+def iterate_routes(route_arr, write_file, prefix):
+    for route in route_arr:
+        if 'next-hop' in route:
+            for nexthop in route['next-hop']:
+                write_file.write(
+                    prefix + ' route ' + route['tagnode'] + " " + nexthop['tagnode'] + " " + str(nexthop['distance']) + "\n")
+        elif 'blackhole' in route:
+            nexthop = route['blackhole']
+            write_file.write(
+                prefix + ' route ' + route['tagnode'] + " blackhole " + str(nexthop['distance']) + "\n")
+        elif 'unreachable' in route:
+            nexthop = route['unreachable']
+            write_file.write(
+                prefix + ' route ' + route['tagnode'] + " " + "reject " + str(nexthop['distance']) + "\n")
+        elif 'next-hop-interface' in route:
+            for nexthop in route['next-hop-interface']:
+                write_file.write(
+                    prefix + ' route ' + route['tagnode'] + " " + nexthop['tagnode'] + " " + str(nexthop['distance']) + "\n")
+
+
+if __name__ == "__main__":
+    with open(input_file, "r") as read_file:
+        with open(output_file, "w") as write_file:
+            data = json.load(read_file)
+            # avoid empty file
+            write_file.write("!\n")
+            if 'protocols' in data:
+                protocols = data['protocols']
+                if 'static' in protocols:
+                    static = protocols['static']
+                    if 'route' in static:
+                        route_arr = static['route']
+                        iterate_routes(route_arr, write_file, "ip")
+                    if 'interface-route' in static:
+                        int_route_arr = static['interface-route']
+                        iterate_routes(int_route_arr, write_file, "ip")
+                    if 'route6' in static:
+                        route_arr = static['route6']
+                        iterate_routes(route_arr, write_file, "ipv6")
+                    if 'interface-route6' in static:
+                        int_route_arr = static['interface-route6']
+                        iterate_routes(int_route_arr, write_file, "ipv6")
+    os.system("/opt/vyatta/bin/frr-reload.py --reload /etc/vyatta-routing/frr.conf")
diff --git a/scripts/frr/parser.py b/scripts/frr/parser.py
new file mode 100755
index 0000000..6f0d864
--- /dev/null
+++ b/scripts/frr/parser.py
@@ -0,0 +1,290 @@
+#!/usr/bin/env python3
+# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+from argparse import ArgumentParser
+from collections import OrderedDict
+from json import loads, load
+import os
+from os import listdir, system
+import shutil
+import sys
+
+from vyatta.command import CommandFiller, MISSING_VALUE_TEMPLATE
+
+TEXT_LEAF_LABEL = '@text'
+LIST_ELEM_LABEL = '@element'
+DICT_ELEM_LABEL = '@dict'
+ENTER_LABEL = '@enter'
+EXIT_LABEL = '@exit'
+
+DIR_TRAVERSE_UP_LABEL = "¬"
+
+CONFIGS_DIR = '/etc/vyatta-routing/configs'
+PRIORITIES_FILENAME = '/priorities.json'
+COMMANDS_DIRNAME = '/commands'
+VYATTA_JSON_FILE = "/etc/vyatta-routing/frr.json"
+OUTPUT_FILE = "/etc/vyatta-routing/frr.conf"
+OUTPUT_FILE_OWNER = "routing"
+FRR_RELOAD = "/usr/lib/frr/frr-reload.py"
+
+
+def print_err(x): return print(x, file=sys.stderr)
+
+
+class VyattaJSONParser:
+    """Traverses the json config, visits every node and extracts the values of
+    keys referenced in the commands
+    """
+
+    def __init__(self, vyatta_config=None, syntax=None, debug=False):
+        self.tree = vyatta_config
+        self.syntax = syntax
+        # holds the parent of each node in the json. Used to traverse up the tree
+        self.parent_stack = []
+        # holds the CLI commands as a list of strings
+        self.output = []
+        # enables debugging commands
+        self.debug = debug
+
+    def read_vyatta_config(self, path):
+        """Reads vyatta json config file"""
+        with open(path, 'r') as vyatta_json:
+            self.tree = self.decode_vyatta_config(vyatta_json.read())
+
+    def decode_vyatta_config(self, config_string):
+        """Decodes the json with OrderedDicts instead of dicts"""
+        return loads(config_string, object_pairs_hook=OrderedDict)
+
+    def read_syntax_files(self, dir_path):
+        """Reads all files syntax files and merges them to one big
+        dict with all the syntax commands"""
+        self.syntax = {}
+        command_files = filter(
+            lambda x: x.lower().endswith('.json'), listdir(dir_path))
+        for filename in command_files:
+            with open(dir_path+'/'+filename, 'r') as syntax_json:
+                self.syntax = {**self.syntax, **load(syntax_json)}
+
+    def output_config(self, path, owner):
+        """Write the already parsed config to a file"""
+        # avoid empty file
+        self.output.append('!')
+        config = '\n'.join(self.output)
+        if self.debug:
+            print(config)
+
+        try:
+            fd = os.open(path, os.O_CREAT | os.O_TRUNC | os.O_WRONLY)
+            # Ensure permissions are set on an existing file
+            os.fchmod(fd, 0o600)
+            with os.fdopen(fd, 'w') as write_file:
+                write_file.write(config)
+        except Exception as e:
+            print_err("Failed to write configuration: {}".format(e))
+            return
+
+        try:
+            shutil.chown(path, owner, owner)
+        except Exception as e:
+            print_err("Failed to set configuration file owner: {}".format(e))
+
+    def prioritize(self, filepath):
+        """Reads priorities file and sorts the configuration tree"""
+        with open(filepath, 'r') as priorities_json:
+            priorities = load(priorities_json)
+        self.sort_tree(priorities)
+
+    def sort_tree(self, priorities):
+        """Sorts the vyatta config according to the priorities dict"""
+        for node, path in self.depth_first_traverse(self.tree):
+            defined_priorities = priorities.get(path, {})
+            first_keys = defined_priorities.get('first', [])
+            last_keys = defined_priorities.get('last', [])
+            # reverse first to sort keys the same way as defined in first list
+            for key in reversed(first_keys):
+                if key in node:
+                    node.move_to_end(key, False)
+            for key in last_keys:
+                if key in node:
+                    node.move_to_end(key, True)
+        # clear commands triggering from traversing the tree
+        self.output.clear()
+
+    def parse_config(self):
+        """Retrieves each node's command and puts it in the output CLI config
+        Returns list of command strings.
+        """
+        self.output.append('log syslog')
+        for node, path in self.depth_first_traverse(self.tree):
+            self.on_enter(path)
+            for command in self.retrieve_commands(path):
+                # command template exists for this node
+                commandf = CommandFiller(command, self.debug)
+                pattern_values = commandf.find_all_path_refs()
+                # print(command, pattern_values)
+                pattern_values = self.retrieve_values(node, pattern_values)
+                command = commandf.fill_command(pattern_values)
+                if not command == '':
+                    self.output.append(command)
+        return self.output
+
+    def retrieve_commands(self, path):
+        """Retrieves the command(s) associated with this path, if any"""
+        commands = self.syntax.get(path, [])
+        if isinstance(commands, str):
+            commands = [commands]
+        # make references valid identifier names to allow them to be treated by string formatter
+        return map(lambda x: x.replace('..', DIR_TRAVERSE_UP_LABEL), commands)
+
+    def depth_first_traverse(self, node, path=''):
+        """Traverses the tree in a DFS style returning every node and its path.
+        Stores the parent in the stack at each level of recursion and pops it out when done.
+        Creates the path of each node incrementally.
+        """
+        if path == '':
+            yield(node, '/')
+        else:
+            yield(node, path)
+        self.parent_stack.append(node)
+        if isinstance(node, dict):
+            for key in node:
+                child_path = path+'/' + key
+                yield from self.depth_first_traverse(node[key], child_path)
+        elif isinstance(node, list):
+            for elem in node:
+                child_path = path+'/' + LIST_ELEM_LABEL
+                yield from self.depth_first_traverse(elem, child_path)
+        self.on_exit(path)
+        self.parent_stack.pop()
+
+    def on_enter(self, path):
+        """Executed when node is just visited.
+        Used for enter commands.
+        """
+        enter_command = self.syntax.get(path+'/'+ENTER_LABEL)
+        if enter_command is not None:
+            self.output.append(enter_command)
+
+    def on_exit(self, path):
+        """Executed when we visited node in path and all its children.
+        Removes node from the parent stack and checks if there are any exit commands.
+        """
+        exit_command = self.syntax.get(path+'/'+EXIT_LABEL)
+        if exit_command is not None:
+            self.output.append(exit_command)
+
+    def find_origin_node(self, node, target_steps):
+        """Traverses up the tree as many levels as indicated by the steps list,
+        removing the backward steps on the way
+        """
+        levels_up = 0
+        while target_steps[0] == DIR_TRAVERSE_UP_LABEL:
+            # print(node, targetSteps)
+            target_steps.pop(0)
+            levels_up += 1
+            node = self.parent_stack[-levels_up]
+
+        return node
+
+    def retrieve_values(self, node, paths):
+        """Retrieves the values of nodes referenced in paths (if they exist).
+
+        @param node: the node associated with the command whose patterns are in paths
+        @param paths: list of relative paths to desired tree nodes / leaves
+        @return: list of (path, value) where value is the value which exists in the
+        corresponding path or None if nothing's there
+        """
+        # print(node, paths)
+        values = {}
+        for path in paths:
+            steps_to_value = [
+                step for step in path.split('/') if not step == '']
+            value = self.retrieve_value(node, steps_to_value)
+            if value != MISSING_VALUE_TEMPLATE:
+                values[path] = value
+        return values
+
+    def recursive_dictionary_swap(self, node):
+        """
+        The dictionaries can contain dictionaries and previously only the top
+        level ordered dictionary was cast to a dictionary. This function
+        recursively casts ordered dictionaries into the dictionary type
+        """
+        for key in node:
+            if type(node[key]) is list:
+                if type(node[key][0]) is OrderedDict:
+                    new_list = []
+                    for entry in node[key]:
+                        new_list.append(
+                            self.recursive_dictionary_swap(dict(entry)))
+                    node[key] = new_list
+            elif type(node[key]) is OrderedDict:
+                node[key] = self.recursive_dictionary_swap(dict(node[key]))
+        return node
+
+    def retrieve_value(self, node, target_steps):
+        """Retrieves the value of a node referenced by target steps (if exists)
+
+        @param node: the origin node where the relative path starts in
+        @param target_steps: the relative path as a list of steps
+        @return: value or None if referenced node doesn't exist
+        """
+        # print(node, target_steps)
+        node = self.find_origin_node(node, target_steps)
+        step = target_steps.pop(0)
+        value = MISSING_VALUE_TEMPLATE
+        if step == TEXT_LEAF_LABEL:
+            if type(node) in [OrderedDict, list] and self.debug:
+                print('Warning:', node, 'is not a leaf')
+            # extract text value
+            value = node
+        elif step == DICT_ELEM_LABEL:
+            if type(node) is list:
+                new_list = []
+                for elem in list(node):
+                    if type(elem) is OrderedDict:
+                        elem = self.recursive_dictionary_swap(dict(elem))
+                    new_list.append(elem)
+                node = new_list
+            if type(node) is OrderedDict:
+                node = self.recursive_dictionary_swap(dict(node))
+            # When using dictionaries we need to replace ", " with another
+            # symbol as the if conditional code splits on "," which breaks
+            # dictionaries.
+            value = str(node).replace(", ", "&")
+            value = str(value).replace(" ", "")
+        else:
+            try:
+                value = self.retrieve_value(node[step], target_steps)
+            except (KeyError, TypeError) as _:
+                if self.debug:
+                    print('Warning: Couldnt find', step, 'in', node)
+        return value
+
+
+def main():
+    parser = ArgumentParser(
+        description='Translate the vyatta JSON config to the FRR CLI config')
+    parser.add_argument('-i', help='specify input vyatta JSON file location',
+                        default=VYATTA_JSON_FILE)
+    parser.add_argument(
+        '-o', help='specify output file to be created', default=OUTPUT_FILE)
+    parser.add_argument('-c', help='specify configuration directory location',
+                        default=CONFIGS_DIR)
+    parser.add_argument('-d', help='show debugging messages', action='store_const',
+                        const=True, default=False)
+    args = parser.parse_args()
+
+    v = VyattaJSONParser(debug=args.d)
+    v.read_vyatta_config(args.i)
+    v.read_syntax_files(args.c + COMMANDS_DIRNAME)
+    v.prioritize(args.c + PRIORITIES_FILENAME)
+    v.parse_config()
+    v.output_config(args.o, OUTPUT_FILE_OWNER)
+    system(FRR_RELOAD + " --reload /etc/vyatta-routing/frr.conf")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/scripts/frr/parser_ut.py b/scripts/frr/parser_ut.py
new file mode 100644
index 0000000..93661d8
--- /dev/null
+++ b/scripts/frr/parser_ut.py
@@ -0,0 +1,222 @@
+#!/usr/bin/env python3
+# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+from parser import VyattaJSONParser, TEXT_LEAF_LABEL, OrderedDict, DIR_TRAVERSE_UP_LABEL, DICT_ELEM_LABEL
+import unittest
+
+
+class ParserTestCase(unittest.TestCase):
+    def test_find_parent_dict(self):
+        l0 = {}
+        l1 = {}
+        l2 = {}
+        l31 = [1, 2, 3]
+        l32 = {'area': 0}
+        l2['l'] = l31
+        l2['area'] = l32
+        l1['ospf'] = l2
+        l0['protocols'] = l1
+        v = VyattaJSONParser(l0, {})
+        for node, path in v.depth_first_traverse(l0):
+            if len(v.parent_stack) > 0:
+                if isinstance(v.parent_stack[-1], list):
+                    self.assertTrue(node in v.parent_stack[-1])
+                else:
+                    self.assertTrue(
+                        node is v.parent_stack[-1][path.split('/')[-1]])
+
+    def test_null_decode_as_None(self):
+        v = VyattaJSONParser({}, {})
+        node = '{"protocols": null}'
+        actual = v.decode_vyatta_config(node)['protocols']
+        expected = None
+        self.assertEqual(actual, expected)
+
+    def test_obj_decode_as_OrderedDict(self):
+        v = VyattaJSONParser({}, {})
+        node = '{"protocols": null}'
+        actual = type(v.decode_vyatta_config(node))
+        expected = type(OrderedDict())
+        self.assertEqual(actual, expected)
+
+    def test_retreive_multi_OrderedDict(self):
+        v = VyattaJSONParser({}, {})
+        node = OrderedDict(
+            [('protocols', OrderedDict([('ospf', OrderedDict([('timers', 'timerVal')]))]))])
+        steps = ['protocols', DICT_ELEM_LABEL]
+        actual = v.retrieve_value(node, steps)
+        print(actual)
+        expected = "{'ospf':{'timers':'timerVal'}}"
+        self.assertEqual(actual, expected)
+
+    def test_retreive_multi_OrderedDict_from_list(self):
+        v = VyattaJSONParser({}, {})
+        node = OrderedDict(
+            [('protocols', [OrderedDict([('ospf', OrderedDict([('timers', 'timerVal')]))])])])
+        steps = ['protocols', DICT_ELEM_LABEL]
+        actual = v.retrieve_value(node, steps)
+        print(actual)
+        expected = "[{'ospf':{'timers':'timerVal'}}]"
+        self.assertEqual(actual, expected)
+
+    def test_retrieve_value_traverse_down(self):
+        v = VyattaJSONParser({}, {})
+        node = {'protocols': {'ospf': {'timers': "timerVal"}}}
+        steps = ['protocols', 'ospf', 'timers', TEXT_LEAF_LABEL]
+        actual = v.retrieve_value(node, steps)
+        expected = "timerVal"
+        self.assertEqual(actual, expected)
+
+    def test_retrieve_value_traverse_up_simple(self):
+        v = VyattaJSONParser({}, {})
+        l3 = {'timers': "timerVal"}
+        l2 = {'ospf': l3}
+        node = {'protocols': l2, 'key': 'value'}
+        v.parent_stack = [node, l2]
+        steps = [DIR_TRAVERSE_UP_LABEL,
+                 DIR_TRAVERSE_UP_LABEL, 'key', TEXT_LEAF_LABEL]
+        actual = v.retrieve_value(l3, steps)
+        expected = "value"
+        self.assertEqual(actual, expected)
+
+    def test_retrieve_value_traverse_up_mixed(self):
+        v = VyattaJSONParser({}, {})
+        l4 = {'timers': "timerVal"}
+        l3 = [l4]
+        l2 = {'ospf': l3}
+        l1 = [l2]
+        node = {'protocols': l1, 'key': 'value'}
+        v.parent_stack = [node, l1, l2, l3]
+        steps = [DIR_TRAVERSE_UP_LABEL, DIR_TRAVERSE_UP_LABEL, DIR_TRAVERSE_UP_LABEL,
+                 DIR_TRAVERSE_UP_LABEL, 'key', TEXT_LEAF_LABEL]
+        actual = v.retrieve_value(l4, steps)
+        expected = "value"
+        self.assertEqual(actual, expected)
+
+    def test_retrieve_command_as_list(self):
+        template = "{/timers/@text} {/@text}"
+        path = '/protocols/ospf/freq'
+        syntax = {path: template}
+        v = VyattaJSONParser({}, syntax)
+        actual = list(v.retrieve_commands(path))
+        expected = [template]
+        self.assertEqual(actual, expected)
+
+    def test_retrieve_command_escape_dots(self):
+        template = "{/../timers/@text}"
+        path = '/protocols/ospf/freq'
+        syntax = {path: template}
+        v = VyattaJSONParser({}, syntax)
+        actual = list(v.retrieve_commands(path))
+        expected = ["{{/{}/timers/@text}}".format(DIR_TRAVERSE_UP_LABEL)]
+        self.assertEqual(actual, expected)
+
+    def test_traversal_up_primitive_same_value_children(self):
+        l1 = {'keyN': "21", 'ospf': {'timers': "timerVal", "freq": "21"}}
+        node = {'keyN': "21", 'protocols': l1, }
+        syntax = {'/protocols/ospf/freq': "{/../timers/@text} {/@text}"}
+        expected = ['timerVal 21']
+        v = VyattaJSONParser(node, syntax)
+        actual = v.parse_config()
+        self.assertEqual(actual, expected)
+
+    def test_traversal(self):
+        l1 = [{'ospf': [{'timers': "timerVal", "freq": "21"}], 'keyl2': 'vall21'},
+              {'keyl2': 'vall22'}]
+        node = {'protocols': l1, 'key': 'value'}
+        syntax = {
+            '/protocols': "constant command",
+            '/protocols/@element/ospf/@element':
+            "timers {/timers/@text} [optional {/../../keyl2/@text},]",
+            '/protocols/@element/ospf/@element/timers':
+            "{/../../../../../key/@text} [nonexistant optional {/../../../../../abc/@text},]",
+            '/protocols/@element/ospf/@element/freq': "{/../timers/@text} {/@text}",
+            '/protocols/@element/keyl2': "Level 2 {/@text}"
+        }
+        expected = ['constant command', 'timers timerVal optional vall21', 'value ',
+                    'timerVal 21', 'Level 2 vall21', 'Level 2 vall22']
+        v = VyattaJSONParser(node, syntax)
+        actual = v.parse_config()
+        self.assertEqual(actual, expected)
+
+    def test_enter_exit_commands(self):
+        node = {'protocols': [{'ospf': [1, 2, 3]}], 'key': 'value'}
+        syntax = {
+            '/protocols/@enter': "in",
+            '/protocols/@element/ospf/@element': "{/@text}",
+            '/protocols/@element/ospf/@element/@enter': "i",
+            '/protocols/@element/ospf/@element/@exit': "o",
+            '/protocols/@exit': "out",
+        }
+        expected = ['in', 'i', '1', 'o', 'i', '2', 'o', 'i', '3', 'o', 'out']
+        v = VyattaJSONParser(node, syntax)
+        actual = v.parse_config()
+        self.assertEqual(actual, expected)
+
+    def test_priority_sorting(self):
+        node = OrderedDict({'ospf': OrderedDict(
+            {'timers': "timerVal", "freq": "21"})})
+        syntax = {'/ospf/freq': "{/@text}", '/ospf/timers': "{/@text}"}
+        first = []
+        # test timers moved at the end
+        last = ['timers']
+        priorities = {'/ospf': {"first": first, "last": last}}
+        expected = ['21', 'timerVal']
+        v = VyattaJSONParser(node, syntax)
+        v.sort_tree(priorities)
+        actual = v.parse_config()
+        self.assertEqual(actual, expected)
+        # test timers moved at the front
+        expected = ['timerVal', '21']
+        first.append(last.pop())
+        v.sort_tree(priorities)
+        actual = v.parse_config()
+        self.assertEqual(actual, expected)
+
+    def test_priority_sorting_multiple_nonexisting(self):
+        node = OrderedDict(
+            {'key1': "1", 'key2': '2', 'key3': '3', 'key4': '4'})
+        syntax = {'/key1': "{/@text}", '/key2': "{/@text}", '/key3': "{/@text}",
+                  '/key4': "{/@text}"}
+        first = ['key1', 'key2', 'keyN']
+        last = ['key3', 'key4']
+        priorities = {'/': {"first": first, "last": last}}
+        v = VyattaJSONParser(node, syntax)
+        v.sort_tree(priorities)
+        expected = ['1', '2', '3', '4']
+        actual = v.parse_config()
+        self.assertEqual(actual, expected)
+        # test timers moved at the front
+        first.clear()
+        last.clear()
+        first.extend(['key4', 'key1', 'keyZ'])
+        last.extend(['key3', 'key2'])
+        v.sort_tree(priorities)
+        expected = ['4', '1', '3', '2']
+        actual = v.parse_config()
+        self.assertEqual(actual, expected)
+
+    def test_multiple_commands(self):
+        l1 = [{'ospf': [{'timers': "timerVal", "freq": "21"}], 'keyl2': 'vall21'},
+              {'keyl2': 'vall22'}]
+        node = {'protocols': l1, 'key': 'value'}
+        syntax = {
+            '/protocols': ["constant command1", "constant command2"],
+            '/protocols/@element/ospf/@element':
+            ["Level 2 {/../../keyl2/@text}",
+             "timers {/timers/@text} [optional {/../../keyl2/@text},]"],
+            '/protocols/@element/ospf/@element/timers':
+            ["{/../../../../../key/@text} [nonexistant optional {/../../../../../abc/@text},]",
+             "{@text} {/../freq/@text}"]
+        }
+        expected = ["constant command1", "constant command2", 'Level 2 vall21',
+                    'timers timerVal optional vall21', 'value ', 'timerVal 21']
+        v = VyattaJSONParser(node, syntax)
+        actual = v.parse_config()
+        self.assertEqual(actual, expected)
+
+
+suite = unittest.TestLoader().loadTestsFromTestCase(ParserTestCase)
+unittest.TextTestRunner(verbosity=2).run(suite)
diff --git a/scripts/frr/vyatta.json b/scripts/frr/vyatta.json
new file mode 100644
index 0000000..6be038a
--- /dev/null
+++ b/scripts/frr/vyatta.json
@@ -0,0 +1,202 @@
+{
+    "protocols": {
+        "ospf": {
+            "area": [
+                {
+                    "network": [
+                        "192.168.122.0/24",
+                        "10.2.1.0/24"
+                    ],
+                    "tagnode": "0"
+                }
+            ],
+            "passive-interface": [
+                "dp0s4",
+                "dp0s5"
+            ],
+            "neighbor": [
+                {
+                    "poll-interval": 1,
+                    "priority": 2,
+                    "tagnode": "1.1.1.1"
+                }
+            ],
+            "parameters": {
+                "abr-type": "cisco",
+                "router-id": "1.1.1.1"
+            },
+            "redistribute": {
+                "static": {
+                    "metric": 2,
+                    "metric-type": 1
+                },
+                "bgp": {
+                    "metric": 2,
+                    "metric-type": 1
+                }
+            },
+            "timers": {
+                "lsa": {
+                    "arrival": 1000
+                },
+                "throttle": {
+                    "lsa": {
+                        "delay": 0,
+                        "max-wait": 5000,
+                        "min-wait": 5000
+                    },
+                    "spf": {
+                        "delay": 500,
+                        "max-wait": 50000,
+                        "min-wait": 500
+                    }
+                }
+            }
+        },
+        "static": {
+            "interface-route": [
+                {
+                    "next-hop-interface": [
+                        {
+                            "distance": 1,
+                            "tagnode": "dp0s4"
+                        }
+                    ],
+                    "tagnode": "90.1.1.0/24"
+                }
+            ],
+            "interface-route6": [
+                {
+                    "next-hop-interface": [
+                        {
+                            "distance": 1,
+                            "tagnode": "dp0s4"
+                        }
+                    ],
+                    "tagnode": "9000::/64"
+                }
+            ],
+            "route": [
+                {
+                    "next-hop": [
+                        {
+                            "distance": 1,
+                            "tagnode": "10.0.1.21"
+                        }
+                    ],
+                    "tagnode": "10.1.1.0/24"
+                },
+                {
+                    "blackhole": {
+                        "distance": 1
+                    },
+                    "tagnode": "22.1.1.0/24"
+                },
+                {
+                    "tagnode": "54.23.4.0/24",
+                    "unreachable": {
+                        "distance": 1
+                    }
+                }
+            ],
+            "route6": [
+                {
+                    "blackhole": {
+                        "distance": 1
+                    },
+                    "tagnode": "8800::/64"
+                },
+                {
+                    "tagnode": "8900::/64",
+                    "unreachable": {
+                        "distance": 1
+                    }
+                },
+                {
+                    "next-hop": [
+                        {
+                            "distance": 1,
+                            "tagnode": "6001::1"
+                        }
+                    ],
+                    "tagnode": "9800::/64"
+                }
+            ]
+        },
+        "bgp": [
+            {
+                "address-family": {
+                    "ipv4-unicast": {
+                        "network": [
+                            {
+                                "route-map": "EXPORT-SET",
+                                "tagnode": "20.1.1.0/24"
+                            }
+                        ],
+                        "redistribute": {
+                            "static": {}
+                        }
+                    }
+                },
+                "neighbor": [
+                    {
+                        "address-family": {
+                            "ipv4-unicast": {}
+                        },
+                        "remote-as": 200,
+                        "tagnode": "3.3.3.3",
+                        "update-source": "1.1.1.1"
+                    },
+                    {
+                        "address-family": {
+                            "ipv4-unicast": {
+                                "route-map": {
+                                    "import": "IMPORT-SET"
+                                }
+                            }
+                        },
+                        "remote-as": 100,
+                        "tagnode": "20.1.1.10"
+                    }
+                ],
+                "parameters": {
+                    "maximum-as-limit": 254,
+                    "router-id": "20.3.6.30"
+                },
+                "tagnode": 200
+            }
+        ]
+    },
+    "policy": {
+        "route": {
+            "route-map": [
+                {
+                    "rule": [
+                        {
+                            "action": "permit",
+                            "set": {
+                                "add-community": "no-export"
+                            },
+                            "tagnode": 10
+                        }
+                    ],
+                    "tagnode": "EXPORT-SET"
+                },
+                {
+                    "rule": [
+                        {
+                            "action": "permit",
+                            "set": {
+                                "add-extcommunity": {
+                                    "rt": "100:1"
+                                }
+                            },
+                            "tagnode": 10
+                        }
+                    ],
+                    "tagnode": "IMPORT-SET"
+                }
+            ]
+        }
+    }
+}
\ No newline at end of file
diff --git a/yang/vyatta-op-protocols-frr-bgp-routing-instance-v1.yang b/yang/vyatta-op-protocols-frr-bgp-routing-instance-v1.yang
new file mode 100644
index 0000000..b1fe6e1
--- /dev/null
+++ b/yang/vyatta-op-protocols-frr-bgp-routing-instance-v1.yang
@@ -0,0 +1,508 @@
+module vyatta-op-protocols-frr-bgp-routing-instance-v1 {
+    namespace "urn:vyatta.com:mgmt:vyatta-op-protocols-frr-bgp-routing-instance:1";
+    prefix vyatta-op-protocols-frr-bgp-routing-instance;
+
+    import vyatta-types-v1 {
+        prefix types;
+    }
+    import vyatta-opd-extensions-v1 {
+        prefix opd;
+    }
+    import vyatta-op-routing-instance-v1 {
+        prefix op-routing-instance;
+    }
+    import vyatta-op-show-v1 {
+        prefix op-show;
+    }
+    import vyatta-op-show-protocols-v1 {
+        prefix op-show-protocols;
+    }
+    import vyatta-op-protocols-frr-bgp-v1 {
+        prefix op-protocols-bgp;
+    }
+    import vyatta-routing-v1 {
+        prefix routing;
+    }
+    import vyatta-op-reset-v1 {
+        prefix op-reset;
+    }
+    import vyatta-op-reset-protocols-v1 {
+        prefix op-reset-protocols;
+    }
+
+    organization "AT&T, Inc.";
+    contact
+        "AT&T
+         Postal: 208 S. Akard Street
+                 Dallas, TX 25202
+         Web: www.att.com";
+
+    description
+        "Copyright (c) 2018-2019, AT&T Intellectual Property.
+         All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+         This module implements the BGP routing instance operational CLI";
+
+    revision 2018-09-27 {
+        description "Initial revision";
+    }
+
+    opd:augment /op-show:show/op-show-protocols:protocols/op-protocols-bgp:bgp {
+        opd:option routing-instance {
+            opd:help "Show BGP routing instance";
+            type routing:routing-instance-name;
+            opd:allowed "allowed-nodes routing routing-instance";
+            opd:command all {
+                opd:help "Show BGP information applicable to all address families";
+                opd:command summary {
+                    opd:help "Show BGP summary information";
+                    opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 summary"';
+                    opd:privileged true;
+                }
+            }
+            opd:command ipv4 {
+                opd:help "Show BGP address family IPv4 routing instance information";
+                opd:command unicast {
+                    opd:help "Show BGP IPv4 unicast information";
+                    opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast"';
+                    opd:privileged true;
+
+                    opd:command as-path-list {
+                        opd:help "Show BGP IPv4 unicast filter with as-path-list";
+                        opd:argument filter-list-name {
+                            opd:help "Show BGP IPv4 unicast as-path-list";
+                            opd:allowed "allowed-nodes policy route as-path-list";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast filter-list $9"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command community-list {
+                        opd:help "Show BGP IPv4 unicast filtered by community list";
+                        opd:argument community {
+                            opd:help "Show BGP IPv4 unicast filtered by community-list";
+                            opd:allowed "allowed-nodes policy route community-list standard";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast community-list $7"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command cidr-only {
+                        opd:help "Show BGP IPv6 unicast without natural netmasks";
+                        opd:on-enter 'vtysh -c "show ip vrf vrf$5 bgp ipv4 unicast cidr-only"';
+                        opd:privileged true;
+                    }
+                    opd:command dampening {
+                        opd:help "Show BGP IPv4 unicast dampening parameters";
+                        opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast dampening parameters"';
+                        opd:privileged true;
+
+                        opd:command dampened-paths {
+                            opd:help "Show BGP IPv4 unicast dampened paths";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast dampening dampened-paths"';
+                            opd:privileged true;
+                        }
+                        opd:command flap-statistics {
+                            opd:help "Show BGP IPv4 unicast flap statistics";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast dampening flap-statistics"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command neighbors {
+                        opd:help "Show BGP IPv4 unicast neighbors";
+                        opd:argument ip-address {
+                            opd:help "Show BGP ipv4 unicast neighbor address";
+                            opd:allowed 'local -a vals
+                                eval "bgp_as=$(cli-shell-api listActiveNodes protocols bgp)"
+                                eval "vals=($(cli-shell-api listActiveNodes protocols bgp $bgp_as neighbor))"
+                                echo -n ${vals[@]}';
+                            type types:ip-address;
+                            opd:command advertised-routes {
+                               opd:help "Show BGP IPv4 unicast neighbor advertised routes";
+                               opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast neighbors $9 advertised-routes"';
+                               opd:privileged true;
+                            }
+                            opd:command received-routes {
+                               opd:help "Show BGP IPv4 unicast neighbor received routes";
+                               opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast neighbors $9 received-routes"';
+                               opd:privileged true;
+                            }
+                            opd:command routes {
+                               opd:help "Show BGP IPv4 unicast neighbor routes";
+                               opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast neighbors $9 routes"';
+                               opd:privileged true;
+                            }
+                        }
+                    }
+                    opd:argument prefix {
+                        opd:help "Show BGP IPv4 unicast prefix";
+                        opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast $8"';
+                        type types:ip-address;
+                        opd:privileged true;
+                    }
+                    opd:command prefix-list {
+                        opd:help "Show BGP IPv4 unicast prefix-list";
+                        opd:argument prefix-list-name {
+                            opd:help "Show BGP IPv4 unicast prefix-list name";
+                            opd:allowed "allowed-nodes policy route prefix-list";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast prefix-list $9"';
+                            type string;
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command regexp {
+                        opd:help "Show BGP IPv4 unicast AS path filtered by regular expression";
+                        opd:argument regexp-string {
+                            opd:help "Show BGP IPv4 unicast using regular expression";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast regexp $9"';
+                            type string;
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command route-map {
+                        opd:help "Show BGP IPv4 unicast filtered by route-map";
+                        opd:argument route-map-name {
+                            opd:help "Show BGP IPv4 unicast route-map name";
+                            opd:allowed "allowed-nodes policy route route-map";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast route-map $9"';
+                            type string;
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command summary {
+                        opd:help "Show BGP IPv4 unicast summary";
+                        opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 unicast summary"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command vpn {
+                    opd:help "Show BGP VPNv4 information";
+
+                    opd:inherit "Using vtysh needs privileges" {
+                        opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 vpn"';
+                        opd:privileged true;
+                    }
+                    opd:argument prefix {
+                        opd:help "Show BGP VPNv4 prefix";
+                        opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 vpn $8"';
+                        opd:privileged true;
+                        type types:ip-address;
+                    }
+                    opd:command summary {
+                        opd:help "Show BGP VPNv4 summary";
+                        opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv4 vpn summary"';
+                        opd:privileged true;
+                    }
+                }
+            }
+            opd:command ipv6 {
+                opd:help "Show BGP address family IPv6 routing instance information";
+                opd:command unicast {
+                    opd:help "Show BGP IPv6 unicast information";
+                    opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast"';
+                    opd:privileged true;
+
+                    opd:command as-path-list {
+                        opd:help "Show BGP IPv6 unicast filter with as-path-list";
+                        opd:argument filter-list-name {
+                            opd:help "Show BGP IPv6 unicast as-path-list";
+                            opd:allowed "allowed-nodes policy route as-path-list";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast filter-list $9"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command community-list {
+                        opd:help "Show BGP IPv6 unicast filtered by community list";
+                        opd:argument community {
+                            opd:help "Show BGP IPv6 unicast filtered by community-list";
+                            opd:allowed "allowed-nodes policy route community-list standard";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast community-list $7"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command dampening {
+                        opd:help "Show BGP IPv6 unicast dampening parameters";
+                        opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast dampening parameters"';
+                        opd:privileged true;
+
+                        opd:command dampened-paths {
+                            opd:help "Show BGP IPv6 unicast dampened paths";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast dampening dampened-paths"';
+                            opd:privileged true;
+                        }
+                        opd:command flap-statistics {
+                            opd:help "Show BGP IPv6 unicast flap statistics";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast dampening flap-statistics"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command extcommunity-list {
+                        opd:help "Show BGP IPv6 unicast filtered by extended community list";
+                        opd:argument extcommunity {
+                            opd:help "Show BGP IPv6 unicast filtered by extended community-list";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast extcommunity-list $7"';
+                            opd:allowed "allowed-nodes policy route extcommunity-list standard";
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:argument prefix {
+                        opd:help "Show BGP IPv6 unicast prefix";
+                        opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast $8"';
+                        opd:privileged true;
+                        type types:ip-address;
+                    }
+                    opd:command prefix-list {
+                        opd:help "Show BGP IPv6 unicast prefix-list";
+                        opd:argument prefix-list-name {
+                            opd:help "Show BGP IPv6 unicast prefix-list name";
+                            opd:allowed "allowed-nodes policy route prefix-list";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast prefix-list $9"';
+                            type string;
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command regexp {
+                        opd:help "Show BGP IPv6 unicast AS path filtered by regular expression";
+                        opd:argument regexp-string {
+                            opd:help "Show BGP IPv6 unicast using regular expression";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast regexp $9"';
+                            type string;
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command neighbors {
+                        opd:help "Show BGP IPv6 unicast neighbors";
+                        opd:argument ip-address {
+                            opd:help "Show BGP ipv6 unicast over ipv4 neighbor address";
+                            opd:allowed 'local -a vals
+                                eval "bgp_as=$(cli-shell-api listActiveNodes protocols bgp)"
+                                eval "vals=($(cli-shell-api listActiveNodes protocols bgp $bgp_as neighbor))"
+                                echo -n ${vals[@]}';
+                            type types:ip-address;
+                            opd:command advertised-routes {
+                               opd:help "Show BGP IPv6 unicast neighbor advertised routes";
+                               opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast neighbors $9 advertised-routes"';
+                               opd:privileged true;
+                            }
+                            opd:command received-routes {
+                               opd:help "Show BGP IPv6 unicast neighbor received routes";
+                               opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast neighbors $9 received-routes"';
+                               opd:privileged true;
+                            }
+                            opd:command routes {
+                               opd:help "Show BGP IPv6 unicast neighbor routes";
+                               opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast neighbors $9 routes"';
+                               opd:privileged true;
+                            }
+                        }
+                    }
+                    opd:command route-map {
+                        opd:help "Show BGP IPv6 unicast filtered by route-map";
+                        opd:argument route-map-name {
+                            opd:help "Show BGP IPv6 unicast route-map name";
+                            opd:allowed "allowed-nodes policy route route-map";
+                            opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast route-map $9"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command summary {
+                        opd:help "Show BGP IPv6 unicast summary";
+                        opd:on-enter 'vtysh -c "show ip bgp vrf vrf$5 ipv6 unicast summary"';
+                        opd:privileged true;
+                    }
+                }
+            }
+        }
+    }
+    opd:augment /op-reset:reset/op-reset-protocols:protocols/op-protocols-bgp:bgp {
+        opd:option routing-instance {
+            opd:help "Reset BGP routing instance";
+            type routing:routing-instance-name;
+            opd:allowed "allowed-nodes routing routing-instance";
+
+            opd:command ipv4 {
+                opd:help "Reset BGP address family IPv4 routing instance information";
+                opd:command unicast {
+                    opd:help "Reset BGP IPv4 unicast information";
+                    opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv4 unicast *"';
+                    opd:privileged true;
+
+                    opd:command external {
+                        opd:help "Reset BGP IPv4 unicast external neighbors";
+
+                        opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv4 unicast external soft"';
+                        opd:privileged true;
+
+                        opd:option soft-in {
+                            opd:help "Reset BGP IPv4 unicast external soft inbound";
+                            opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv4 unicast external soft in"';
+                            opd:privileged true;
+                            type empty;
+                        }
+                        opd:option soft-out {
+                            opd:help "Reset BGP IPv4 unicast external soft outbound";
+                            opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv4 unicast external soft out"';
+                            opd:privileged true;
+                            type empty;
+                        }
+                    }
+                    opd:command neighbor {
+                        opd:help "Reset BGP IPv4 unicast neighbor";
+
+                        opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv4 unicast *"';
+                        opd:privileged true;
+                        opd:option as-number {
+                            opd:help "Reset BGP IPv4 neighbors belonging to the specified AS";
+                            opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv4 unicast $10"';
+                            opd:privileged true;
+                            type uint32 {
+                                range 1..65535;
+                            }
+                        }
+                        opd:argument ip-address {
+                            opd:help "Reset BGP IPv4 neighbor address";
+                            opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv4 unicast $9"';
+                            opd:privileged true;
+                            type types:ip-address;
+                        }
+                    }
+                    opd:command peer-group {
+                        opd:help "Reset BGP IPv4 unicast peer-group";
+
+                        opd:argument peer-group-name {
+                            opd:help "Reset BGP IPv4 unicast peer-group";
+                            opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv4 unicast peer-group $9 soft"';
+                            opd:allowed 'local -a vals
+                                eval "bgp_as=$(cli-shell-api listActiveNodes protocols bgp)"
+                                eval "vals=($(cli-shell-api listActiveNodes protocols bgp $bgp_as peer-group))"
+                                echo -n ${vals[@]}';
+                            opd:privileged true;
+                            type string;
+
+                            opd:option soft-in {
+                                opd:help "Reset BGP IPv4 unicast peer-group soft inbound";
+                                opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 bgp ipv4 unicast peer-group $9 soft in"';
+                                opd:privileged true;
+                                type empty;
+                            }
+                            opd:option soft-out {
+                                opd:help "Reset BGP IPv4 unicast peer-group soft outbound";
+                                opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv4 unicast bgp peer-group $9 soft out"';
+                                opd:privileged true;
+                                type empty;
+                            }
+                        }
+                    }
+                }
+            }
+            opd:command ipv6 {
+                opd:help "Reset BGP address family IPv6 routing instance information";
+                opd:command unicast {
+                    opd:help "Reset BGP IPv6 unicast information";
+                    opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv6 unicast *"';
+                    opd:privileged true;
+
+                    opd:command external {
+                        opd:help "Reset BGP IPv6 unicast external neighbors";
+
+                        opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv6 unicast external soft"';
+                        opd:privileged true;
+
+                        opd:option soft-in {
+                            opd:help "Reset BGP IPv6 unicast external soft inbound";
+                            opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv6 unicast external soft in"';
+                            opd:privileged true;
+                            type empty;
+                        }
+                        opd:option soft-out {
+                            opd:help "Reset BGP IPv6 unicast external soft outbound";
+                            opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv6 unicast external soft out"';
+                            opd:privileged true;
+                            type empty;
+                        }
+                    }
+                    opd:command neighbor {
+                        opd:help "Reset BGP IPv6 unicast neighbor";
+
+                        opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv6 unicast *"';
+                        opd:privileged true;
+                        opd:option as-number {
+                            opd:help "Reset BGP IPv6 neighbors belonging to the specified AS";
+                            opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv6 unicast $10"';
+                            opd:privileged true;
+                            type uint32 {
+                                range 1..65535;
+                            }
+                        }
+                        opd:argument ip-address {
+                            opd:help "Reset BGP IPv6 neighbor address";
+                            opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv6 unicast $9"';
+                            opd:privileged true;
+                            type types:ip-address;
+                        }
+                    }
+                    opd:command peer-group {
+                        opd:help "Reset BGP IPv4 unicast peer-group";
+
+                        opd:argument peer-group-name {
+                            opd:help "Reset BGP IPv6 unicast peer-group";
+                            opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv6 unicast peer-group $9 soft"';
+                            opd:allowed 'local -a vals
+                                eval "bgp_as=$(cli-shell-api listActiveNodes protocols bgp)"
+                                eval "vals=($(cli-shell-api listActiveNodes protocols bgp $bgp_as peer-group))"
+                                echo -n ${vals[@]}';
+                            opd:privileged true;
+                            type string;
+
+                            opd:option soft-in {
+                                opd:help "Reset BGP IPv6 unicast peer-group soft inbound";
+                                opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 bgp ipv6 unicast peer-group $9 soft in"';
+                                opd:privileged true;
+                                type empty;
+                            }
+                            opd:option soft-out {
+                                opd:help "Reset BGP IPv6 unicast peer-group soft outbound";
+                                opd:on-enter 'vtysh -c "clear ip bgp vrf vrf$5 ipv6 unicast bgp peer-group $9 soft out"';
+                                opd:privileged true;
+                                type empty;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/yang/vyatta-op-protocols-frr-bgp-v1.yang b/yang/vyatta-op-protocols-frr-bgp-v1.yang
new file mode 100644
index 0000000..71571ae
--- /dev/null
+++ b/yang/vyatta-op-protocols-frr-bgp-v1.yang
@@ -0,0 +1,736 @@
+module vyatta-op-protocols-frr-bgp-v1 {
+    namespace "urn:vyatta.com:mgmt:vyatta-op-bgp-1";
+    prefix vyatta-op-protocols-frr-bgp-v1;
+
+    import vyatta-types-v1 {
+        prefix types;
+    }
+    import vyatta-opd-extensions-v1 {
+        prefix opd;
+    }
+    import vyatta-op-show-v1 {
+        prefix op-show;
+    }
+    import vyatta-op-show-protocols-v1 {
+        prefix op-show-protocols;
+    }
+    import vyatta-op-reset-v1 {
+        prefix op-reset;
+    }
+    import vyatta-op-reset-protocols-v1 {
+        prefix op-reset-protocols;
+    }
+    import vyatta-op-monitor-v1 {
+        prefix op-monitor;
+    }
+    import vyatta-op-monitor-protocols-v1 {
+        prefix op-monitor-protocols;
+    }
+
+    organization "AT&T, Inc.";
+    contact
+        "AT&T
+         Postal: 208 S. Akard Street
+         Dallas, TX 25202
+         Web: www.att.com";
+
+    description
+        "Copyright (c) 2018-2019, AT&T Intellectual Property.
+         All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+         This module implements the bgp operational CLI.";
+
+    revision 2018-09-27 {
+        description "Initial revision";
+    }
+    opd:augment /op-show:show/op-show-protocols:protocols {
+        opd:command bgp {
+            opd:help "Show BGP information";
+            opd:command all {
+                opd:help "Show BGP information";
+                opd:command attribute-info {
+                    opd:help "Show BGP attribute information applicable to all address families";
+                    opd:on-enter 'vtysh -c "show ip bgp attribute-info"';
+                    opd:privileged true;
+                }
+                opd:command community-info {
+                    opd:help "Show BGP community information";
+                    opd:on-enter 'vtysh -c "show ip bgp community-info"';
+                    opd:privileged true;
+                }
+                opd:command json {
+                    opd:help "Show BGP json operational state";
+                    opd:on-enter 'vtysh -c "show ip bgp json"';
+                    opd:privileged true;
+                }
+                opd:command memory {
+                    opd:help "Show BGP memory information";
+                    opd:on-enter 'vtysh -c "show ip bgp memory"';
+                    opd:privileged true;
+                }
+                opd:command paths {
+                    opd:help "Show BGP path information";
+                    opd:on-enter 'vtysh -c "show ip bgp paths"';
+                    opd:privileged true;
+                }
+                opd:command summary {
+                    opd:help "Show BGP summary information";
+                    opd:on-enter 'vtysh -c "show ip bgp summary"';
+                    opd:privileged true;
+                }
+            }
+            opd:command ipv4 {
+                opd:help "Show BGP address family IPv4 information";
+                opd:command unicast {
+                    opd:help "Show BGP IPv4 unicast information";
+                    opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast"';
+                    opd:privileged true;
+
+                    opd:command as-path-list {
+                        opd:help "Show BGP IPv4 unicast filter with as-path-list";
+                        opd:argument filter-list-name {
+                            opd:help "Show BGP IPv4 unicast filtered by as-path-list";
+                            opd:allowed "allowed-nodes policy route as-path-list";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast filter-list $7"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command community-list {
+                        opd:help "Show BGP IPv4 unicast filtered by community list";
+                        opd:argument community {
+                            opd:help "Show BGP IPv4 unicast filtered by community-list";
+                            opd:allowed "allowed-nodes policy route community-list standard";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast community-list $7"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command cidr-only {
+                        opd:help "Show BGP IPv4 unicast without natural netmasks";
+                        opd:on-enter 'vtysh -c "show ip bgp cidr-only"';
+                        opd:privileged true;
+                    }
+                    opd:command dampening {
+                        opd:help "Show BGP IPv4 unicast dampening parameters";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast dampening parameters"';
+                        opd:privileged true;
+
+                        opd:command dampened-paths {
+                            opd:help "Show BGP IPv4 unicast dampened paths";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast dampening dampened-paths"';
+                            opd:privileged true;
+                        }
+                        opd:command flap-statistics {
+                            opd:help "Show BGP IPv4 unicast flap statistics";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast dampening flap-statistics"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command neighbors {
+                        opd:help "Show BGP IPv4 unicast neighbors";
+                        opd:argument ip-address {
+                            opd:help "Show BGP ipv4 unicast neighbor address";
+                            opd:allowed 'local -a vals
+                                eval "bgp_as=$(cli-shell-api listActiveNodes protocols bgp)"
+                                eval "vals=($(cli-shell-api listActiveNodes protocols bgp $bgp_as neighbor))"
+                                echo -n ${vals[@]}';
+                            type types:ip-address;
+                            opd:command advertised-routes {
+                               opd:help "Show BGP IPv4 unicast neighbor advertised routes";
+                               opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast neighbors $7 advertised-routes"';
+                               opd:privileged true;
+                            }
+                            opd:command received-routes {
+                               opd:help "Show BGP IPv4 unicast neighbor received routes";
+                               opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast neighbors $7 received-routes"';
+                               opd:privileged true;
+                            }
+                            opd:command routes {
+                               opd:help "Show BGP IPv4 unicast neighbor routes";
+                               opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast neighbors $7 routes"';
+                               opd:privileged true;
+                            }
+                        }
+                    }
+                    opd:argument prefix {
+                        opd:help "Show BGP IPv4 unicast prefix";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast $6"';
+                        type types:ip-address;
+                        opd:privileged true;
+                    }
+                    opd:command prefix-list {
+                        opd:help "Show BGP IPv4 unicast prefix-list";
+                        opd:argument prefix-list-name {
+                            opd:help "Show BGP IPv4 unicast prefix-list name";
+                            opd:allowed "allowed-nodes policy route prefix-list";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast prefix-list $7"';
+                            type string;
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command regexp {
+                        opd:help "Show BGP IPv4 unicast AS path filtered by regular expression";
+                        opd:argument regexp-string {
+                            opd:help "Show BGP IPv4 unicast using regular expression";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast regexp $7"';
+                            type string;
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command route-map {
+                        opd:help "Show BGP IPv4 unicast filtered by route-map";
+                        opd:argument route-map-name {
+                            opd:help "Show BGP IPv4 unicast route-map name";
+                            opd:allowed "allowed-nodes policy route route-map";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast route-map $7"';
+                            type string;
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command summary {
+                        opd:help "Show BGP IPv4 unicast summary";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast summary"';
+                        opd:privileged true;
+                    }
+                    opd:command update-groups {
+                        opd:help "Show BGP IPv4 unicast update groups";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv4 unicast update-groups"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command vpn {
+                    opd:help "Show BGP VPNv4 information";
+                    opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn"';
+                    opd:privileged true;
+
+                    opd:command dampening {
+                        opd:help "Show BGP VPNv4 dampening parameters";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn dampening parameters"';
+                        opd:privileged true;
+
+                        opd:command dampened-paths {
+                            opd:help "Show BGP VPNv4 dampened paths";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn dampening dampened-paths"';
+                            opd:privileged true;
+                        }
+                        opd:command flap-statistics {
+                            opd:help "Show BGP VPNv4 flap statistics";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn dampening flap-statistics"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:argument prefix {
+                        opd:help "Show BGP VPNv4 prefix";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn $6"';
+                        opd:privileged true;
+                        type types:ip-address;
+                    }
+                    opd:command prefix-list {
+                        opd:help "Show BGP VPNv4 prefix-list";
+                        opd:argument prefix-list-name {
+                            opd:help "Show BGP VPNv4 prefix-list name";
+                            opd:allowed "allowed-nodes policy route prefix-list";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn prefix-list $7"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command neighbors {
+                        opd:help "Show BGP VPNv4 neighbors";
+                        opd:argument ip-address {
+                            opd:help "Show BGP VPNv4 neighbor address";
+                            opd:allowed 'local -a vals
+                                eval "bgp_as=$(cli-shell-api listActiveNodes protocols bgp)"
+                                eval "vals=($(cli-shell-api listActiveNodes protocols bgp $bgp_as neighbor))"
+                                echo -n ${vals[@]}';
+                            type types:ip-address;
+                            opd:command advertised-routes {
+                               opd:help "Show BGP VPNv4 neighbor advertised routes";
+                               opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn neighbors $7 advertised-routes"';
+                               opd:privileged true;
+                            }
+                            opd:command received-routes {
+                               opd:help "Show BGP VPNv4 neighbor received routes";
+                               opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn neighbors $7 received-routes"';
+                               opd:privileged true;
+                            }
+                            opd:command routes {
+                               opd:help "Show BGP VPNv4 neighbor routes";
+                               opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn neighbors $7 routes"';
+                               opd:privileged true;
+                            }
+                        }
+                    }
+                    opd:command summary {
+                        opd:help "Show BGP VPNv4 summary";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn summary"';
+                        opd:privileged true;
+                    }
+                    opd:command update-groups {
+                        opd:help "Show BGP VPNv4 update groups";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv4 vpn update-groups"';
+                        opd:privileged true;
+                    }
+                }
+            }
+            opd:command ipv6 {
+                opd:help "Show BGP address family IPv6 information";
+                opd:command unicast {
+                    opd:help "Show BGP IPv6 unicast information";
+                    opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast"';
+                    opd:privileged true;
+
+                    opd:command as-path-list {
+                        opd:help "Show BGP IPv6 unicast filter with as-path-list";
+                        opd:argument filter-list-name {
+                            opd:help "Show BGP IPv6 unicast filtered by as-path-list";
+                            opd:allowed "allowed-nodes policy route as-path-list";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast filter-list $7"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command community-list {
+                        opd:help "Show BGP IPv6 unicast filtered by community list";
+                        opd:argument community {
+                            opd:help "Show BGP IPv6 unicast filtered by community-list";
+                            opd:allowed "allowed-nodes policy route community-list standard";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast community-list $7"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command dampening {
+                        opd:help "Show BGP IPv6 unicast dampening parameters";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast dampening parameters"';
+                        opd:privileged true;
+
+                        opd:command dampened-paths {
+                            opd:help "Show BGP IPv6 unicast dampened paths";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast dampening dampened-paths"';
+                            opd:privileged true;
+                        }
+                        opd:command flap-statistics {
+                            opd:help "Show BGP IPv6 unicast flap statistics";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast dampening flap-statistics"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command labels {
+                        opd:help "Show BGP IPv6 unicast MPLS labels";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast labels"';
+                        opd:privileged true;
+                    }
+                    opd:command neighbors {
+                        opd:help "Show BGP IPv6 unicast neighbors";
+                        opd:argument ip-address {
+                            opd:help "Show BGP ipv6 unicast neighbor address";
+                            opd:allowed 'local -a vals
+                                eval "bgp_as=$(cli-shell-api listActiveNodes protocols bgp)"
+                                eval "vals=($(cli-shell-api listActiveNodes protocols bgp $bgp_as neighbor))"
+                                echo -n ${vals[@]}';
+                            type types:ip-address;
+                            opd:command advertised-routes {
+                               opd:help "Show BGP IPv6 unicast neighbor advertised routes";
+                               opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast neighbors $7 advertised-routes"';
+                               opd:privileged true;
+                            }
+                            opd:command received-routes {
+                               opd:help "Show BGP IPv6 unicast neighbor received routes";
+                               opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast neighbors $7 received-routes"';
+                               opd:privileged true;
+                            }
+                            opd:command routes {
+                               opd:help "Show BGP IPv6 unicast neighbor routes";
+                               opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast neighbors $7 routes"';
+                               opd:privileged true;
+                            }
+                        }
+                    }
+                    opd:argument prefix {
+                        opd:help "Show BGP IPv6 unicast prefix";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast $6"';
+                        opd:privileged true;
+                        type types:ip-address;
+                    }
+                    opd:command prefix-list {
+                        opd:help "Show BGP IPv6 unicast prefix-list";
+                        opd:argument prefix-list-name {
+                            opd:help "Show BGP IPv6 unicast prefix-list name";
+                            opd:allowed "allowed-nodes policy route prefix-list6";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast prefix-list $7"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command regexp {
+                        opd:help "Show BGP IPv6 unicast AS path filtered by regular expression";
+                        opd:argument regexp-string {
+                            opd:help "Show BGP IPv6 unicast using regular expression";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast regexp $7"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command route-map {
+                        opd:help "Show BGP IPv6 unicast filtered by route-map";
+                        opd:argument route-map-name {
+                            opd:help "Show BGP IPv6 unicast route-map name";
+                            opd:allowed "allowed-nodes policy route route-map";
+                            opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast route-map $7"';
+                            opd:privileged true;
+                            type string;
+                        }
+                    }
+                    opd:command summary {
+                        opd:help "Show BGP IPv6 unicast summary";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast summary"';
+                        opd:privileged true;
+                    }
+                    opd:command update-groups {
+                        opd:help "Show BGP IPv6 unicast update groups";
+                        opd:on-enter 'vtysh -c "show ip bgp ipv6 unicast update-groups"';
+                        opd:privileged true;
+                    }
+                }
+            }
+        }
+    }
+    opd:augment /op-reset:reset/op-reset-protocols:protocols {
+        opd:command bgp {
+            opd:help "Reset BGP information";
+
+            opd:command all {
+                opd:help "Reset BGP information";
+
+                opd:command neighbor {
+                    opd:help "Reset BGP neighbor";
+                    opd:on-enter 'vtysh -c "clear ip bgp *"';
+                    opd:privileged true;
+
+                    opd:argument ip-address {
+                        opd:help "Reset BGP neighbor address";
+                        opd:on-enter 'vtysh -c "clear ip bgp $6"';
+                        opd:privileged true;
+                        type types:ip-address;
+                    }
+                }
+            }
+            opd:command ipv4 {
+                opd:help "Reset BGP address family IPv4 information";
+
+                opd:command unicast {
+                    opd:help "Reset BGP IPv4 unicast information";
+                    opd:on-enter 'vtysh -c "clear ip bgp ipv4 unicast *"';
+                    opd:privileged true;
+
+                    opd:command external {
+                        opd:help "Reset BGP IPv4 unicast external neighbors";
+
+                        opd:on-enter 'vtysh -c "clear ip bgp ipv4 unicast external soft"';
+                        opd:privileged true;
+
+                        opd:option soft-in {
+                            opd:help "Reset BGP IPv4 unicast external soft inbound";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv4 unicast external soft in"';
+                            opd:privileged true;
+                            type empty;
+                        }
+                        opd:option soft-out {
+                            opd:help "Reset BGP IPv4 unicast external soft outbound";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv4 unicast external soft out"';
+                            opd:privileged true;
+                            type empty;
+                        }
+                    }
+                    opd:command neighbor {
+                        opd:help "Reset BGP IPv4 unicast neighbor";
+
+                        opd:on-enter 'vtysh -c "clear ip bgp ipv4 unicast *"';
+                        opd:privileged true;
+                        opd:option as-number {
+                            opd:help "Reset BGP IPv4 neighbors belonging to the specified AS";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv4 unicast $7"';
+                            opd:privileged true;
+                            type uint32 {
+                                range 1..65535;
+                            }
+                        }
+                        opd:argument ip-address {
+                            opd:help "Reset BGP IPv4 neighbor address";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv4 unicast $7"';
+                            opd:privileged true;
+                            type types:ip-address;
+                        }
+                    }
+                    opd:command peer-group {
+                        opd:help "Reset BGP IPv4 unicast peer-group";
+
+                        opd:argument peer-group-name {
+                            opd:help "Reset BGP IPv4 unicast peer-group";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv4 unicast peer-group $7 soft"';
+                            opd:allowed 'local -a vals
+                                eval "bgp_as=$(cli-shell-api listActiveNodes protocols bgp)"
+                                eval "vals=($(cli-shell-api listActiveNodes protocols bgp $bgp_as peer-group))"
+                                echo -n ${vals[@]}';
+                            opd:privileged true;
+                            type string;
+
+                            opd:option soft-in {
+                                opd:help "Reset BGP IPv4 unicast peer-group soft inbound";
+                                opd:on-enter 'vtysh -c "clear ip bgp ipv4 unicast peer-group $7 soft in"';
+                                opd:privileged true;
+                                type empty;
+                            }
+                            opd:option soft-out {
+                                opd:help "Reset BGP IPv4 unicast peer-group soft outbound";
+                                opd:on-enter 'vtysh -c "clear ip bgp ipv4 unicast bgp peer-group $7 soft out"';
+                                opd:privileged true;
+                                type empty;
+                            }
+                        }
+                    }
+                }
+                opd:command vpn {
+                    opd:help "Reset BGP VPNv4 information";
+
+                    opd:command neighbor {
+                        opd:help "Reset BGP VPNv4 neighbor";
+
+                        opd:on-enter 'vtysh -c "clear ip bgp ipv4 vpn *"';
+                        opd:privileged true;
+                        opd:option as-number {
+                            opd:help "Reset BGP VPNv4 neighbors belonging to the specified AS";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv4 vpn $7"';
+                            opd:privileged true;
+                            type uint32 {
+                                range 1..65535;
+                            }
+                        }
+                        opd:argument ip-address {
+                            opd:help "Reset BGP VPNv4 neighbor address";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv4 vpn $7"';
+                            opd:privileged true;
+                            type types:ip-address;
+                        }
+                    }
+                    opd:command soft-in {
+                        opd:help "Reset BGP VPNv4 soft inbound updates";
+                        opd:on-enter 'vtysh -c "clear ip bgp ipv4 vpn * in"';
+                        opd:privileged true;
+                    }
+                    opd:command soft-out {
+                        opd:help "Reset BGP VPNv4 soft outbound updates";
+                        opd:on-enter 'vtysh -c "clear ip bgp ipv4 vpn * out"';
+                        opd:privileged true;
+                    }
+                    opd:command soft-both {
+                        opd:help "Reset BGP VPNv4 soft inbound and outbound";
+                        opd:on-enter 'vtysh -c "clear ip bgp ipv4 vpn * soft"';
+                        opd:privileged true;
+                    }
+                }
+            }
+            opd:command ipv6 {
+                opd:help "Reset BGP address family IPv6 information";
+
+                opd:command unicast {
+                    opd:help "Reset BGP IPv6 unicast information";
+                    opd:on-enter 'vtysh -c "clear ip bgp ipv6 unicast *"';
+                    opd:privileged true;
+
+                    opd:command external {
+                        opd:help "Reset BGP IPv6 unicast external neighbors";
+
+                        opd:on-enter 'vtysh -c "clear ip bgp ipv6 unicast external soft"';
+                        opd:privileged true;
+
+                        opd:option soft-in {
+                            opd:help "Reset BGP IPv6 unicast external soft inbound";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv6 unicast external soft in"';
+                            opd:privileged true;
+                            type empty;
+                        }
+                        opd:option soft-out {
+                            opd:help "Reset BGP IPv6 unicast external soft outbound";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv6 unicast external soft out"';
+                            opd:privileged true;
+                            type empty;
+                        }
+                    }
+                    opd:command neighbor {
+                        opd:help "Reset BGP IPv6 unicast neighbor";
+
+                        opd:on-enter 'vtysh -c "clear ip bgp ipv6 unicast *"';
+                        opd:privileged true;
+                        opd:option as-number {
+                            opd:help "Reset BGP IPv6 neighbors belonging to the specified AS";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv6 unicast $7"';
+                            opd:privileged true;
+                            type uint32 {
+                                range 1..65535;
+                            }
+                        }
+                        opd:argument ip-address {
+                            opd:help "Reset BGP IPv6 neighbor address";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv6 unicast $7"';
+                            opd:privileged true;
+                            type types:ip-address;
+                        }
+                    }
+                    opd:command peer-group {
+                        opd:help "Reset BGP IPv6 unicast peer-group";
+
+                        opd:argument peer-group-name {
+                            opd:help "Reset BGP IPv6 unicast peer-group name";
+                            opd:on-enter 'vtysh -c "clear ip bgp ipv6 unicast peer-group $7 soft"';
+                            opd:allowed 'local -a vals
+                                eval "bgp_as=$(cli-shell-api listActiveNodes protocols bgp)"
+                                eval "vals=($(cli-shell-api listActiveNodes protocols bgp $bgp_as peer-group))"
+                                echo -n ${vals[@]}';
+                            opd:privileged true;
+                            type string;
+
+                            opd:option soft-in {
+                                opd:help "Reset BGP IPv6 unicast peer-group soft inbound";
+                                opd:on-enter 'vtysh -c "clear ip bgp ipv6 unicast peer-group $7 soft in"';
+                                opd:privileged true;
+                                type empty;
+                            }
+                            opd:option soft-out {
+                                opd:help "Reset BGP IPv6 unicast peer-group soft outbound";
+                                opd:on-enter 'vtysh -c "clear ip bgp ipv6 unicast peer-group $7 soft out"';
+                                opd:privileged true;
+                                type empty;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    opd:augment /op-monitor:monitor/op-monitor-protocols:protocol {
+        opd:command bgp {
+            opd:help "Monitor BGP information";
+
+            opd:command enable {
+                opd:help "Enable BGP monitor";
+
+                opd:command bestpath {
+                    opd:help "Monitor BGP bestpath";
+                    opd:on-enter 'vtysh -c "debug bgp bestpath"';
+                    opd:privileged true;
+                }
+                opd:command keepalives {
+                    opd:help "Monitor BGP keepalives";
+                    opd:on-enter 'vtysh -c "debug bgp keepalives"';
+                    opd:privileged true;
+                }
+                opd:command labelpool {
+                    opd:help "Monitor BGP labelpool";
+                    opd:on-enter 'vtysh -c "debug bgp labelpool"';
+                    opd:privileged true;
+                }
+                opd:command neighbor {
+                    opd:help "Monitor BGP neighbor events";
+                    opd:on-enter 'vtysh -c "debug bgp neighbor-events"';
+                    opd:privileged true;
+                }
+                opd:command update-groups {
+                    opd:help "Monitor BGP update groups";
+                    opd:on-enter 'vtysh -c "debug bgp update-groups"';
+                    opd:privileged true;
+                }
+                opd:command updates {
+                    opd:help "Monitor BGP Updates";
+                    opd:on-enter 'vtysh -c "debug bgp updates"';
+                    opd:privileged true;
+                }
+                opd:command vpn {
+                    opd:help "Monitor BGP VPN";
+                    opd:on-enter 'vtysh -c "debug bgp vpn"';
+                    opd:privileged true;
+                }
+                opd:command zebra {
+                    opd:help "Monitor BGP zebra";
+                    opd:on-enter 'vtysh -c "debug bgp zebra"';
+                    opd:privileged true;
+                }
+            }
+            opd:command disable {
+                opd:help "Disable BGP monitor";
+
+                opd:command bestpath {
+                    opd:help "Monitor BGP bestpath";
+                    opd:on-enter 'vtysh -c "no debug bgp bestpath"';
+                    opd:privileged true;
+                }
+                opd:command keepalives {
+                    opd:help "Monitor BGP keepalives";
+                    opd:on-enter 'vtysh -c "no debug bgp keepalives"';
+                    opd:privileged true;
+                }
+                opd:command labelpool {
+                    opd:help "Monitor BGP labelpool";
+                    opd:on-enter 'vtysh -c "no debug bgp labelpool"';
+                    opd:privileged true;
+                }
+                opd:command neighbor {
+                    opd:help "Monitor BGP neighbor events";
+                    opd:on-enter 'vtysh -c "no debug bgp neighbor-events"';
+                    opd:privileged true;
+                }
+                opd:command update-groups {
+                    opd:help "Monitor BGP update groups";
+                    opd:on-enter 'vtysh -c "no debug bgp update-groups"';
+                    opd:privileged true;
+                }
+                opd:command updates {
+                    opd:help "Monitor BGP Updates";
+                    opd:on-enter 'vtysh -c "no debug bgp updates"';
+                    opd:privileged true;
+                }
+                opd:command vpn {
+                    opd:help "Monitor BGP VPN";
+                    opd:on-enter 'vtysh -c "no debug bgp vpn"';
+                    opd:privileged true;
+                }
+                opd:command zebra {
+                    opd:help "Monitor BGP zebra";
+                    opd:on-enter 'vtysh -c "no debug bgp zebra"';
+                    opd:privileged true;
+                }
+            }
+        }
+    }
+}
diff --git a/yang/vyatta-op-protocols-frr-ldp-v1.yang b/yang/vyatta-op-protocols-frr-ldp-v1.yang
new file mode 100644
index 0000000..ef29445
--- /dev/null
+++ b/yang/vyatta-op-protocols-frr-ldp-v1.yang
@@ -0,0 +1,300 @@
+module vyatta-op-protocols-frr-ldp-v1 {
+	namespace "urn:vyatta.com:mgmt:vyatta-op-ldp-1";
+	prefix vyatta-op-protocols-frr-ldp-v1;
+
+	import vyatta-types-v1 {
+		prefix types;
+	}
+	import vyatta-opd-extensions-v1 {
+		prefix opd;
+	}
+	import vyatta-op-show-v1 {
+		prefix op-show;
+	}
+	import vyatta-op-show-protocols-v1 {
+		prefix op-show-protocols;
+	}
+	import vyatta-op-reset-v1 {
+		prefix op-reset;
+	}
+	import vyatta-op-reset-protocols-v1 {
+		prefix op-reset-protocols;
+	}
+	import vyatta-op-monitor-v1 {
+		prefix op-monitor;
+	}
+	import vyatta-op-monitor-protocols-v1 {
+		prefix op-monitor-protocols;
+	}
+
+	organization "AT&T, Inc.";
+	contact
+		"AT&T
+		 Postal: 208 S. Akard Street
+		 Dallas, TX 25202
+		 Web: www.att.com";
+
+	description
+		"Copyright (c) 2018-2019, AT&T Intellectual Property.
+		 All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+		 This module implements the LDP operational CLI.";
+
+	revision 2018-10-23 {
+		description "Initial revision";
+	}
+
+	opd:augment /op-show:show/op-show-protocols:protocols {
+		opd:command mpls-ldp {
+			opd:help "Show MPLS LDP information";
+			opd:command ipv4 {
+				opd:help "IPv4 Address Family";
+
+				opd:command binding {
+					opd:help "Label bindings";
+					opd:on-enter 'vtysh -c "show mpls ldp ipv4 binding"';
+					opd:privileged true;
+
+					opd:command detail {
+						opd:help "Show detailed information";
+						opd:on-enter 'vtysh -c "show mpls ldp ipv4 binding detail"';
+						opd:privileged true;
+					}
+
+					opd:argument ipv4-prefix {
+						opd:help "Destination prefix";
+						opd:on-enter 'vtysh -c "show mpls ldp ipv4 binding $6"';
+						opd:privileged true;
+						type types:ipv4-prefix;
+
+						opd:command detail {
+							opd:help "Show detailed information";
+							opd:on-enter 'vtysh -c "show mpls ldp ipv4 binding $6 detail"';
+							opd:privileged true;
+						}
+					}
+
+					opd:command neighbor {
+						opd:help "Display labels from LDP neighbor";
+						opd:argument ipv4-address {
+							opd:help "Neighbor LSR-ID";
+							opd:on-enter 'vtysh -c "show mpls ldp ipv4 binding neighbor $7"';
+							opd:privileged true;
+							type types:ipv4-address;
+
+							opd:command detail {
+								opd:help "Show detailed information";
+								opd:on-enter 'vtysh -c "show mpls ldp ipv4 binding neighbor $7 detail"';
+								opd:privileged true;
+							}
+						}
+					}
+				}
+				opd:command discovery {
+					opd:help "Discovery hello information";
+					opd:on-enter 'vtysh -c "show mpls ldp ipv4 discovery"';
+					opd:privileged true;
+
+					opd:command detail {
+						opd:help "Show detailed information";
+						opd:on-enter 'vtysh -c "show mpls ldp ipv4 discovery detail"';
+						opd:privileged true;
+					}
+				}
+				opd:command interface {
+					opd:help "Interface information";
+					opd:on-enter 'vtysh -c "show mpls ldp ipv4 interface"';
+					opd:privileged true;
+				}
+			}
+			opd:command neighbor {
+				opd:help "Neighbor information";
+				opd:on-enter 'vtysh -c "show mpls ldp neighbor"';
+				opd:privileged true;
+
+				opd:command detail {
+					opd:help "Show detailed information";
+					opd:on-enter 'vtysh -c "show mpls ldp neighbor detail"';
+					opd:privileged true;
+				}
+
+				opd:argument ipv4-address {
+					opd:help "Neighbor LSR-ID";
+					opd:on-enter 'vtysh -c "show mpls ldp neighbor $5"';
+					opd:privileged true;
+					type types:ipv4-address;
+
+					opd:command detail {
+						opd:help "Show detailed information";
+						opd:on-enter 'vtysh -c "show mpls ldp neighbor $5 detail"';
+						opd:privileged true;
+					}
+				}
+			}
+		}
+	}
+
+	opd:augment /op-reset:reset/op-reset-protocols:protocols {
+		opd:command mpls-ldp {
+			opd:help "Reset LDP state";
+
+			opd:command neighbor {
+				opd:help "Reset LDP neighbor sessions";
+				opd:on-enter 'vtysh -c "clear mpls ldp neighbor"';
+				opd:privileged true;
+
+				opd:argument ip-address {
+					opd:help "Neighbor address";
+					opd:on-enter 'vtysh -c "clear mpls ldp neighbor $5"';
+					opd:privileged true;
+					type types:ip-address;
+				}
+			}
+		}
+	}
+
+	opd:augment /op-monitor:monitor/op-monitor-protocols:protocol {
+		opd:command mpls-ldp {
+			opd:help "Monitor MPLS LDP information";
+			opd:command enable {
+				opd:help "Enable LDP monitor";
+
+				opd:command discovery {
+					opd:help "Discovery messages";
+
+					opd:command hello {
+						opd:help "Discovery hello messages";
+						opd:command received {
+							opd:help "Received messages";
+							opd:on-enter 'vtysh -c "debug mpls ldp discovery hello recv"';
+							opd:privileged true;
+						}
+						opd:command sent {
+							opd:help "Sent messages";
+							opd:on-enter 'vtysh -c "debug mpls ldp discovery hello sent"';
+							opd:privileged true;
+						}
+					}
+				}
+				opd:command errors {
+					opd:help "Errors";
+					opd:on-enter 'vtysh -c "debug mpls ldp errors"';
+					opd:privileged true;
+				}
+				opd:command event {
+					opd:help "Event information";
+					opd:on-enter 'vtysh -c "debug mpls ldp event"';
+					opd:privileged true;
+				}
+				opd:command labels {
+					opd:help "Label allocation information";
+					opd:on-enter 'vtysh -c "debug mpls ldp labels"';
+					opd:privileged true;
+				}
+				opd:command messages {
+					opd:help "Messages";
+
+					opd:command received {
+						opd:help "Received messages, excluding keep-alives";
+						opd:on-enter 'vtysh -c "debug mpls ldp messages recv"';
+						opd:privileged true;
+					}
+					opd:command sent {
+						opd:help "Sent messages, excluding keep-alives";
+						opd:on-enter 'vtysh -c "debug mpls ldp messages sent"';
+						opd:privileged true;
+					}
+				}
+				opd:command zebra {
+					opd:help "Zebra information";
+					opd:on-enter 'vtysh -c "debug mpls ldp zebra"';
+					opd:privileged true;
+				}
+			}
+			opd:command disable {
+				opd:help "Disable LDP monitor";
+
+				opd:command discovery {
+					opd:help "Discovery messages";
+
+					opd:command hello {
+						opd:help "Discovery hello messages";
+						opd:command received {
+							opd:help "Received messages";
+							opd:on-enter 'vtysh -c "no debug mpls ldp discovery hello recv"';
+							opd:privileged true;
+						}
+						opd:command sent {
+							opd:help "Sent messages";
+							opd:on-enter 'vtysh -c "no debug mpls ldp discovery hello sent"';
+							opd:privileged true;
+						}
+					}
+				}
+				opd:command errors {
+					opd:help "Errors";
+					opd:on-enter 'vtysh -c "no debug mpls ldp errors"';
+					opd:privileged true;
+				}
+				opd:command event {
+					opd:help "Event information";
+					opd:on-enter 'vtysh -c "no debug mpls ldp event"';
+					opd:privileged true;
+				}
+				opd:command labels {
+					opd:help "Label allocation information";
+					opd:on-enter 'vtysh -c "no debug mpls ldp labels"';
+					opd:privileged true;
+				}
+				opd:command messages {
+					opd:help "Messages";
+
+					opd:command received {
+						opd:help "Received messages, excluding keep-alives";
+						opd:on-enter 'vtysh -c "no debug mpls ldp messages recv"';
+						opd:privileged true;
+					}
+					opd:command sent {
+						opd:help "Sent messages, excluding keep-alives";
+						opd:on-enter 'vtysh -c "no debug mpls ldp messages sent"';
+						opd:privileged true;
+					}
+				}
+				opd:command zebra {
+					opd:help "Zebra information";
+					opd:on-enter 'vtysh -c "no debug mpls ldp zebra"';
+					opd:privileged true;
+				}
+			}
+		}
+	}
+}
diff --git a/yang/vyatta-op-protocols-frr-ospf-routing-instance-v1.yang b/yang/vyatta-op-protocols-frr-ospf-routing-instance-v1.yang
new file mode 100644
index 0000000..91c0e3a
--- /dev/null
+++ b/yang/vyatta-op-protocols-frr-ospf-routing-instance-v1.yang
@@ -0,0 +1,112 @@
+module vyatta-op-protocols-frr-ospf-routing-instance-v1 {
+    namespace "urn:vyatta.com:mgmt:vyatta-op-protocols-frr-ospf-routing-instance:1";
+    prefix vyatta-op-protocols-frr-ospf-routing-instance;
+
+    import vyatta-opd-extensions-v1 {
+        prefix opd;
+    }
+    import vyatta-op-routing-instance-v1 {
+        prefix op-routing-instance;
+    }
+    import vyatta-op-show-v1 {
+        prefix op-show;
+    }
+    import vyatta-op-show-protocols-v1 {
+        prefix op-show-protocols;
+    }
+    import vyatta-op-protocols-frr-ospf-v1 {
+        prefix op-protocols-ospf;
+    }
+    import vyatta-routing-v1 {
+        prefix routing;
+    }
+
+    organization "AT&T, Inc.";
+    contact
+        "AT&T
+         Postal: 208 S. Akard Street
+                 Dallas, TX 25202
+         Web: www.att.com";
+
+    description
+        "Copyright (c) 2018-2019, AT&T Intellectual Property.
+         All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+         This module implements the OSPF routing instance operational CLI";
+
+    revision 2018-10-22 {
+        description "Initial revision";
+    }
+
+    opd:augment /op-show:show/op-show-protocols:protocols/op-protocols-ospf:ospf {
+        opd:option routing-instance {
+            opd:help "Show OSPF routing instance";
+            type routing:routing-instance-name;
+            opd:allowed "allowed-nodes routing routing-instance";
+            opd:on-enter 'vtysh -c "show ip ospf vrf vrf$5"';
+            opd:privileged true;
+
+            opd:command border-routers {
+                opd:help "Show OSPF routing instance border routers";
+                opd:on-enter 'vtysh -c "show ip ospf vrf vrf$5 border-routers"';
+                opd:privileged true;
+            }
+            opd:command database {
+                opd:help "Show OSPF routing instance database";
+                opd:on-enter 'vtysh -c "show ip ospf vrf vrf$5 database"';
+                opd:privileged true;
+            }
+            opd:command interface {
+                opd:help "Show OSPF routing instance interface";
+                opd:on-enter 'vtysh -c "show ip ospf vrf vrf$5 interface"';
+                opd:privileged true;
+                opd:argument interface {
+                    opd:help "Show OSPF routing instance interface";
+                    opd:on-enter 'vtysh -c "show ip ospf vrf vrf$5 interface $7"';
+                    opd:allowed "allowed-nodes interfaces dataplane";
+                    opd:privileged true;
+                    type string;
+                }
+            }
+            opd:command neighbor {
+                opd:help "Show OSPF routing instance neighbor";
+                opd:on-enter 'vtysh -c "show ip ospf vrf vrf$5 neighbor"';
+                opd:privileged true;
+            }
+            opd:command route {
+                opd:help "Show OSPF routing instance route";
+                opd:on-enter 'vtysh -c "show ip ospf vrf vrf$5 route"';
+                opd:privileged true;
+            }
+        }
+    }
+}
diff --git a/yang/vyatta-op-protocols-frr-ospf-v1.yang b/yang/vyatta-op-protocols-frr-ospf-v1.yang
new file mode 100644
index 0000000..98eda43
--- /dev/null
+++ b/yang/vyatta-op-protocols-frr-ospf-v1.yang
@@ -0,0 +1,463 @@
+module vyatta-op-protocols-frr-ospf-v1 {
+    namespace "urn:vyatta.com:mgmt:vyatta-op-protocols-frr-ospf:1";
+    prefix vyatta-op-protocols-frr-ospf-v1;
+
+    import vyatta-types-v1 {
+        prefix types;
+    }
+    import vyatta-opd-extensions-v1 {
+        prefix opd;
+    }
+    import vyatta-op-show-v1 {
+        prefix op-show;
+    }
+    import vyatta-op-show-protocols-v1 {
+        prefix op-show-protocols;
+    }
+    import vyatta-op-reset-v1 {
+        prefix op-reset;
+    }
+    import vyatta-op-reset-protocols-v1 {
+        prefix op-reset-protocols;
+    }
+    import vyatta-op-monitor-v1 {
+        prefix op-monitor;
+    }
+    import vyatta-op-monitor-protocols-v1 {
+        prefix op-monitor-protocols;
+    }
+
+    organization "AT&T, Inc.";
+    contact
+        "AT&T
+         Postal: 208 S. Akard Street
+         Dallas, TX 25202
+         Web: www.att.com";
+
+    description
+        "Copyright (c) 2018-2019, AT&T Intellectual Property.
+         All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+         This module implements the OSPF operational CLI.";
+
+    revision 2018-11-22 {
+        description "Initial revision";
+    }
+    opd:augment /op-show:show/op-show-protocols:protocols {
+        opd:command ospf {
+            opd:help "Show OSPF information";
+            opd:on-enter 'vtysh -c "show ip ospf"';
+            opd:privileged true;
+
+            opd:command database {
+                opd:help "Show OSPF database information";
+                opd:on-enter 'vtysh -c "show ip ospf database"';
+                opd:privileged true;
+
+                opd:command asbr-summary {
+                    opd:help "Show OSPF ASBR summary link states";
+                    opd:on-enter 'vtysh -c "show ip ospf database asbr-summary"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        opd:on-enter 'vtysh -c "show ip ospf database asbr-summary $6"';
+                        opd:privileged true;
+                        type types:ipv4-address;
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPF database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ip ospf database asbr-summary adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originate {
+                        opd:help "Show OSPF database ASBR self originate information";
+                        opd:on-enter 'vtysh -c "show ip ospf database asbr-summary self-originate"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command external {
+                    opd:help "Show OSPF database External link states";
+                    opd:on-enter 'vtysh -c "show ip ospf database external"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        opd:on-enter 'vtysh -c "show ip ospf database external $6"';
+                        opd:privileged true;
+                        type types:ipv4-address;
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPF database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ip ospf database external adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originate {
+                        opd:help "Show OSPF database self originated link states";
+                        opd:on-enter 'vtysh -c "show ip ospf database external self-originate"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command max-age {
+                    opd:help "Show OSPF Max age information";
+                    opd:on-enter 'vtysh -c "show ip ospf database max-age"';
+                    opd:privileged true;
+                }
+                opd:command network {
+                    opd:help "Show OSPF network link states";
+                    opd:on-enter 'vtysh -c "show ip ospf database network"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        opd:on-enter 'vtysh -c "show ip ospf database network $6"';
+                        opd:privileged true;
+                        type types:ipv4-address;
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPF database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ip ospf database network adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originate {
+                        opd:help "Show OSPF database self originate information";
+                        opd:on-enter 'vtysh -c "show ip ospf database network self-originate"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command nssa-external {
+                    opd:help "Show OSPF database NSSA external link states";
+                    opd:on-enter 'vtysh -c "show ip ospf database nssa-external"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        opd:on-enter 'vtysh -c "show ip ospf database nssa-external $6"';
+                        opd:privileged true;
+                        type types:ipv4-address;
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPF database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ip ospf database nssa-external adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originate {
+                        opd:help "Show OSPF database self originate information";
+                        opd:on-enter 'vtysh -c "show ip ospf database nssa-external self-originate"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command opaque-area {
+                    opd:help "Show OSPF database Link area Opaque LSA";
+                    opd:on-enter 'vtysh -c "show ip ospf database opaque-area"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        opd:on-enter 'vtysh -c "show ip ospf database opaque-area $6"';
+                        opd:privileged true;
+                        type types:ipv4-address;
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPF database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ip ospf database opaque-area adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originate {
+                        opd:help "Show OSPF database self originate information";
+                        opd:on-enter 'vtysh -c "show ip ospf database opaque-area self-originate"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command opaque-as {
+                    opd:help "Show OSPF database Link AS Opaque LSA";
+                    opd:on-enter 'vtysh -c "show ip ospf database opaque-as"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        opd:on-enter 'vtysh -c "show ip ospf database opaque-as $6"';
+                        opd:privileged true;
+                        type types:ipv4-address;
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPF database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ip ospf database opaque-as adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originate {
+                        opd:help "Show OSPF database self originate information";
+                        opd:on-enter 'vtysh -c "show ip ospf database opaque-as self-originate"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command opaque-link {
+                    opd:help "Show OSPF database Link local Opaque LSA";
+                    opd:on-enter 'vtysh -c "show ip ospf database opaque-link"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        opd:on-enter 'vtysh -c "show ip ospf database opaque-link $6"';
+                        opd:privileged true;
+                        type types:ipv4-address;
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPF database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ip ospf database opaque-link adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originate {
+                        opd:help "Show OSPF database self originate information";
+                        opd:on-enter 'vtysh -c "show ip ospf database opaque-link self-originate"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command self-originate {
+                    opd:help "Show self originated link states";
+                    opd:on-enter 'vtysh -c "show ip ospf database self-originate"';
+                    opd:privileged true;
+                }
+            }
+            opd:command interface {
+                opd:help "Show OSPF interface information";
+                opd:on-enter 'vtysh -c "show ip ospf interface"';
+                opd:privileged true;
+
+                opd:argument interface {
+                    opd:help "Show OSPF interface";
+                    opd:on-enter 'vtysh -c "show ip ospf interface $5"';
+                    opd:allowed "allowed-nodes interfaces dataplane";
+                    opd:privileged true;
+                    type string;
+                }
+            }
+            opd:command json {
+                opd:help "Show OSPF json information";
+                opd:on-enter 'vtysh -c "show ip ospf json"';
+                opd:privileged true;
+            }
+            opd:command neighbor {
+                opd:help "Show OSPF neighbor information";
+                opd:on-enter 'vtysh -c "show ip ospf neighbor"';
+                opd:privileged true;
+
+                opd:argument interface {
+                    opd:help "Show OSPF database neighbor interface information";
+                    opd:on-enter 'vtysh -c "show ip ospf neighbor $5"';
+                    opd:allowed "allowed-nodes interfaces dataplane";
+                    opd:privileged true;
+                    type string;
+                }
+                opd:command all {
+                    opd:help "Show OSPF neighbor information";
+                    opd:on-enter 'vtysh -c "show ip ospf neighbor all"';
+                    opd:privileged true;
+                }
+                opd:command detail {
+                    opd:help "Show OSPF neighbor detail information";
+                    opd:on-enter 'vtysh -c "show ip ospf neighbor detail"';
+                    opd:privileged true;
+                }
+            }
+            opd:command route {
+                opd:help "Show OSPF route information";
+                opd:on-enter 'vtysh -c "show ip ospf route"';
+                opd:privileged true;
+            }
+        }
+    }
+    opd:augment /op-reset:reset/op-reset-protocols:protocols {
+        opd:command ospf {
+            opd:help "Reset OSPF information";
+            opd:on-enter 'vtysh -c "clear ip ospf interface"';
+            opd:privileged true;
+
+            opd:argument interface {
+                opd:help "Reset OSPF information";
+                opd:on-enter 'vtysh -c "clear ip ospf interface $4"';
+                opd:allowed "allowed-nodes interfaces dataplane";
+                opd:privileged true;
+                type string;
+            }
+        }
+    }
+    opd:augment /op-monitor:monitor/op-monitor-protocols:protocol {
+        opd:command ospf {
+            opd:help "Monitor OSPF information";
+            opd:inherit "Using vtysh requires raised privileges" {
+                opd:privileged true;
+            }
+
+            opd:command enable {
+                opd:help "Enable OSPF monitor";
+
+                opd:command event {
+                    opd:help "Monitor OSPF events";
+                    opd:on-enter 'vtysh -c "debug ospf event"';
+                }
+                opd:command ism {
+                    opd:help "Monitor OSPF Interface State Machine";
+                    opd:on-enter 'vtysh -c "debug ospf ism"';
+                }
+                opd:command lsa {
+                    opd:help "Monitor OSPF Link State Advertisements";
+                    opd:on-enter 'vtysh -c "debug ospf lsa"';
+                }
+                opd:command nsm {
+                    opd:help "Monitor OSPF Neighbor State Machine";
+                    opd:on-enter 'vtysh -c "debug ospf nsm"';
+                }
+                opd:command nssa {
+                    opd:help "Monitor OSPF NSSA information";
+                    opd:on-enter 'vtysh -c "debug ospf nssa"';
+                }
+                opd:command packet {
+                    opd:help "Monitor OSPF packets";
+
+                    opd:command all {
+                        opd:help "Monitor all OSPF packet types";
+                        opd:on-enter 'vtysh -c "debug ospf packet all"';
+                    }
+                    opd:command dd {
+                        opd:help "Monitor OSPF Database Description packets";
+                        opd:on-enter 'vtysh -c "debug ospf packet dd"';
+                    }
+                    opd:command hello {
+                        opd:help "Monitor OSPF Hello packets";
+                        opd:on-enter 'vtysh -c "debug ospf packet hello"';
+                    }
+                    opd:command ls-ack {
+                        opd:help "Monitor OSPF Link State Acknowledgement packets";
+                        opd:on-enter 'vtysh -c "debug ospf packet ls-ack"';
+                    }
+                    opd:command ls-request {
+                        opd:help "Monitor OSPF Link State Request packets";
+                        opd:on-enter 'vtysh -c "debug ospf packet ls-request"';
+                    }
+                    opd:command ls-update {
+                        opd:help "Monitor OSPF Link State Update packets";
+                        opd:on-enter 'vtysh -c "debug ospf packet ls-update"';
+                    }
+                }
+                opd:command zebra {
+                    opd:help "Monitor OSPF zebra";
+                    opd:on-enter 'vtysh -c "debug ospf zebra"';
+                }
+            }
+            opd:command disable {
+                opd:help "Disable OSPF monitor";
+
+                opd:command event {
+                    opd:help "Monitor OSPF events";
+                    opd:on-enter 'vtysh -c "no debug ospf event"';
+                }
+                opd:command ism {
+                    opd:help "Monitor OSPF Interface State Machine";
+                    opd:on-enter 'vtysh -c "no debug ospf ism"';
+                }
+                opd:command lsa {
+                    opd:help "Monitor OSPF Link State Advertisements";
+                    opd:on-enter 'vtysh -c "no debug ospf lsa"';
+                }
+                opd:command nsm {
+                    opd:help "Monitor OSPF Neighbor State Machine";
+                    opd:on-enter 'vtysh -c "no debug ospf nsm"';
+                }
+                opd:command nssa {
+                    opd:help "Monitor OSPF NSSA information";
+                    opd:on-enter 'vtysh -c "no debug ospf nssa"';
+                }
+                opd:command packet {
+                    opd:help "Monitor OSPF packets";
+
+                    opd:command all {
+                        opd:help "Monitor all OSPF packet types";
+                        opd:on-enter 'vtysh -c "no debug ospf packet all"';
+                    }
+                    opd:command dd {
+                        opd:help "Monitor OSPF Database Description packets";
+                        opd:on-enter 'vtysh -c "no debug ospf packet dd"';
+                    }
+                    opd:command hello {
+                        opd:help "Monitor OSPF Hello packets";
+                        opd:on-enter 'vtysh -c "no debug ospf packet hello"';
+                    }
+                    opd:command ls-ack {
+                        opd:help "Monitor OSPF Link State Acknowledgement packets";
+                        opd:on-enter 'vtysh -c "no debug ospf packet ls-ack"';
+                    }
+                    opd:command ls-request {
+                        opd:help "Monitor OSPF Link State Request packets";
+                        opd:on-enter 'vtysh -c "no debug ospf packet ls-request"';
+                    }
+                    opd:command ls-update {
+                        opd:help "Monitor OSPF Link State Update packets";
+                        opd:on-enter 'vtysh -c "no debug ospf packet ls-update"';
+                    }
+                }
+                opd:command zebra {
+                    opd:help "Monitor OSPF zebra";
+                    opd:on-enter 'vtysh -c "no debug ospf zebra"';
+                }
+            }
+        }
+    }
+}
diff --git a/yang/vyatta-op-protocols-frr-ospfv3-v1.yang b/yang/vyatta-op-protocols-frr-ospfv3-v1.yang
new file mode 100644
index 0000000..969d82a
--- /dev/null
+++ b/yang/vyatta-op-protocols-frr-ospfv3-v1.yang
@@ -0,0 +1,589 @@
+module vyatta-op-protocols-frr-ospfv3-v1 {
+    namespace "urn:vyatta.com:mgmt:vyatta-op-protocols-frr-ospfv3:1";
+    prefix vyatta-op-protocols-frr-ospfv3-v1;
+
+    import vyatta-types-v1 {
+        prefix types;
+    }
+    import vyatta-opd-extensions-v1 {
+        prefix opd;
+    }
+    import vyatta-op-show-v1 {
+        prefix op-show;
+    }
+    import vyatta-op-show-protocols-v1 {
+        prefix op-show-protocols;
+    }
+    import vyatta-op-reset-v1 {
+        prefix op-reset;
+    }
+    import vyatta-op-reset-protocols-v1 {
+        prefix op-reset-protocols;
+    }
+    import vyatta-op-monitor-v1 {
+        prefix op-monitor;
+    }
+    import vyatta-op-monitor-protocols-v1 {
+        prefix op-monitor-protocols;
+    }
+
+    organization "AT&T, Inc.";
+    contact
+        "AT&T
+         Postal: 208 S. Akard Street
+         Dallas, TX 25202
+         Web: www.att.com";
+
+    description
+        "Copyright (c) 2018-2019, AT&T Intellectual Property.
+         All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+         This module implements the OSPFv3 operational CLI.";
+
+    revision 2018-11-01 {
+        description "Initial revision";
+    }
+    opd:augment /op-show:show/op-show-protocols:protocols {
+        opd:command ospfv3 {
+            opd:help "Show OSPFv3 information";
+            opd:on-enter 'vtysh -c "show ipv6 ospf6"';
+            opd:privileged true;
+
+            opd:command border-routers {
+                opd:help "Show OSPFv3 Border and Boundary Router information";
+                opd:on-enter 'vtysh -c "show ipv6 ospf6 border-routers"';
+                opd:privileged true;
+            }
+            opd:command database {
+                opd:help "Show OSPFv3 database information";
+                opd:on-enter 'vtysh -c "show ipv6 ospf6 database"';
+                opd:privileged true;
+
+                opd:command adv-router {
+                    opd:help "Advertising Router LSA";
+
+                    opd:argument ipv4-address {
+                        opd:help "Advertising router ID";
+                        type types:ipv4-address;
+
+                        opd:command linkstate-id {
+                            opd:help "Search by Link state ID";
+
+                            opd:argument ipv4-address {
+                                opd:help "Link state ID";
+                                opd:on-enter 'vtysh -c "show ipv6 ospf6 database adv-router $6 linkstate-id $8"';
+                                opd:privileged true;
+                                type types:ipv4-address;
+                            }
+                        }
+                    }
+                }
+                opd:command as-external {
+                    opd:help "Show OSPFv3 database AS-external-LSA information";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 database as-external"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        type types:ipv4-address;
+                        opd:argument ipv4-address {
+                            opd:help "Advertising Router ID";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database as-external $6 $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                        opd:command self-originated {
+                            opd:help "Self-originated LSAs";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database as-external $6 self-originated"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPFv3 database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database as-external adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originated {
+                        opd:help "Show OSPFv3 database self originated link states";
+                        opd:on-enter 'vtysh -c "show ipv6 ospf6 database as-external self-originated"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command inter-prefix {
+                    opd:help "Show OSPFv3 database Inter-Prefix-LSA information";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 database inter-prefix"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        type types:ipv4-address;
+                        opd:argument ipv4-address {
+                            opd:help "Advertising Router ID";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database inter-prefix $6 $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                        opd:command self-originated {
+                            opd:help "Self-originated LSAs";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database inter-prefix $6 self-originated"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPFv3 database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database inter-prefix adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originated {
+                        opd:help "Show OSPFv3 database self originated link states";
+                        opd:on-enter 'vtysh -c "show ipv6 ospf6 database inter-prefix self-originated"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command inter-router {
+                    opd:help "Show OSPFv3 database Inter-Router-LSA information";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 database inter-router"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        type types:ipv4-address;
+                        opd:argument ipv4-address {
+                            opd:help "Advertising Router ID";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database inter-router $6 $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                        opd:command self-originated {
+                            opd:help "Self-originated LSAs";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database inter-router $6 self-originated"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPFv3 database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database inter-router adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originated {
+                        opd:help "Show OSPFv3 database self originated link states";
+                        opd:on-enter 'vtysh -c "show ipv6 ospf6 database inter-router self-originated"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command intra-prefix {
+                    opd:help "Show OSPFv3 database Intra-Prefix-LSA information";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 database intra-prefix"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        type types:ipv4-address;
+                        opd:argument ipv4-address {
+                            opd:help "Advertising Router ID";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database intra-prefix $6 $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                        opd:command self-originated {
+                            opd:help "Self-originated LSAs";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database intra-prefix $6 self-originated"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPFv3 database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database intra-prefix adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originated {
+                        opd:help "Show OSPFv3 database self originated link states";
+                        opd:on-enter 'vtysh -c "show ipv6 ospf6 database intra-prefix self-originated"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command link {
+                    opd:help "Show OSPFv3 database Link-LSA information";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 database link"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        type types:ipv4-address;
+                        opd:argument ipv4-address {
+                            opd:help "Advertising Router ID";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database link $6 $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                        opd:command self-originated {
+                            opd:help "Self-originated LSAs";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database link $6 self-originated"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPFv3 database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database link adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originated {
+                        opd:help "Show OSPFv3 database self originated link states";
+                        opd:on-enter 'vtysh -c "show ipv6 ospf6 database link self-originated"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command network {
+                    opd:help "Show OSPFv3 database Network-LSA information";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 database network"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        type types:ipv4-address;
+                        opd:argument ipv4-address {
+                            opd:help "Advertising Router ID";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database network $6 $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                        opd:command self-originated {
+                            opd:help "Self-originated LSAs";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database network $6 self-originated"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPFv3 database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database network adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originated {
+                        opd:help "Show OSPFv3 database self originate information";
+                        opd:on-enter 'vtysh -c "show ipv6 ospf6 database network self-originated"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command router {
+                    opd:help "Show OSPFv3 database router-LSA information";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 database router"';
+                    opd:privileged true;
+
+                    opd:argument ipv4-address {
+                        opd:help "Link state ID";
+                        type types:ipv4-address;
+                        opd:argument ipv4-address {
+                            opd:help "Advertising Router ID";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database router $6 $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                        opd:command self-originated {
+                            opd:help "Self-originated LSAs";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database router $6 self-originated"';
+                            opd:privileged true;
+                        }
+                    }
+                    opd:command adv-router {
+                        opd:help "Show OSPFv3 database Advertising Router link states";
+                        opd:argument ipv4-address {
+                            opd:help "Address of advertising router";
+                            opd:on-enter 'vtysh -c "show ipv6 ospf6 database router adv-router $7"';
+                            opd:privileged true;
+                            type types:ipv4-address;
+                        }
+                    }
+                    opd:command self-originated {
+                        opd:help "Show OSPFv3 database self originate information";
+                        opd:on-enter 'vtysh -c "show ipv6 ospf6 database router self-originated"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command self-originated {
+                    opd:help "Show self originated link states";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 database self-originated"';
+                    opd:privileged true;
+                }
+            }
+            opd:command interface {
+                opd:help "Show OSPFv3 interface information";
+                opd:on-enter 'vtysh -c "show ipv6 ospf6 interface"';
+                opd:privileged true;
+
+                opd:argument interface {
+                    opd:help "Show OSPFv3 interface";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 interface $5"';
+                    opd:allowed "allowed-nodes interfaces dataplane";
+                    opd:privileged true;
+                    type string;
+                }
+            }
+            opd:command neighbor {
+                opd:help "Show OSPFv3 neighbor information";
+                opd:on-enter 'vtysh -c "show ipv6 ospf6 neighbor"';
+                opd:privileged true;
+
+                opd:argument ipv4-address {
+                    opd:help "Router-ID of neighbor";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 neighbor $5"';
+                    opd:privileged true;
+                    type types:ipv4-address;
+                }
+                opd:command detail {
+                    opd:help "Show OSPFv3 neighbor detail information";
+                    opd:on-enter 'vtysh -c "show ipv6 ospf6 neighbor detail"';
+                    opd:privileged true;
+                }
+            }
+            opd:command route {
+                opd:help "Show OSPFv3 route information";
+                opd:on-enter 'vtysh -c "show ipv6 ospf6 route"';
+                opd:privileged true;
+            }
+        }
+    }
+    opd:augment /op-reset:reset/op-reset-protocols:protocols {
+        opd:command ospfv3 {
+            opd:help "Reset OSPFv3 information";
+            opd:on-enter 'vtysh -c "clear ipv6 ospf6 interface"';
+            opd:privileged true;
+
+            opd:argument interface {
+                opd:help "Reset OSPFv3 information";
+                opd:on-enter 'vtysh -c "clear ipv6 ospf6 interface $4"';
+                opd:allowed "allowed-nodes interfaces dataplane";
+                opd:privileged true;
+                type string;
+            }
+        }
+    }
+    opd:augment /op-monitor:monitor/op-monitor-protocols:protocol {
+        opd:command ospfv3 {
+            opd:help "Monitor OSPFv3 information";
+
+            opd:command enable {
+                opd:help "Enable OSPFv3 monitor";
+
+                opd:command lsa {
+                    opd:help "Monitor OSPFv3 Link State Advertisements";
+                    opd:command as-external {
+                        opd:help "Monitor OSPFv3 as-external Link State Advertisements";
+                        opd:on-enter 'vtysh -c "debug ospf6 as-external"';
+                        opd:privileged true;
+                    }
+                    opd:command inter-prefix {
+                        opd:help "Monitor OSPFv3 inter-prefix Link State Advertisements";
+                        opd:on-enter 'vtysh -c "debug ospf6 lsa inter-prefix"';
+                        opd:privileged true;
+                    }
+                    opd:command inter-router {
+                        opd:help "Monitor OSPFv3 inter-router Link State Advertisements";
+                        opd:on-enter 'vtysh -c "debug ospf6 lsa inter-router"';
+                        opd:privileged true;
+                    }
+                    opd:command intra-prefix {
+                        opd:help "Monitor OSPFv3 intra-prefix Link State Advertisements";
+                        opd:on-enter 'vtysh -c "debug ospf6 lsa intra-prefix"';
+                        opd:privileged true;
+                    }
+                    opd:command link {
+                        opd:help "Monitor OSPFv3 link Link State Advertisements";
+                        opd:on-enter 'vtysh -c "debug ospf6 lsa link"';
+                        opd:privileged true;
+                    }
+                    opd:command network {
+                        opd:help "Monitor OSPFv3 network Link State Advertisements";
+                        opd:on-enter 'vtysh -c "debug ospf6 lsa network"';
+                        opd:privileged true;
+                    }
+                    opd:command router {
+                        opd:help "Monitor OSPFv3 router Link State Advertisements";
+                        opd:on-enter 'vtysh -c "debug ospf6 lsa router"';
+                        opd:privileged true;
+                    }
+                    opd:command unknown {
+                        opd:help "Monitor OSPFv3 unknown Link State Advertisements";
+                        opd:on-enter 'vtysh -c "debug ospf6 lsa unknown"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command interface {
+                    opd:help "Monitor OSPFv3 interface";
+                    opd:on-enter 'vtysh -c "debug ospf6 interface"';
+                    opd:privileged true;
+                }
+                opd:command neighbor {
+                    opd:help "Monitor OSPFv3 Neighbor";
+                    opd:on-enter 'vtysh -c "debug ospf6 neighbor"';
+                    opd:privileged true;
+                }
+                opd:command route {
+                    opd:help "Monitor OSPFv3 route information";
+                    opd:command inter-area {
+                        opd:help "Monitor OSPFv3 inter-area route information";
+                        opd:on-enter 'vtysh -c "debug ospf6 route inter-area"';
+                        opd:privileged true;
+                    }
+                    opd:command intra-area {
+                        opd:help "Monitor OSPFv3 intra-area route information";
+                        opd:on-enter 'vtysh -c "debug ospf6 route intra-area"';
+                        opd:privileged true;
+                    }
+                    opd:command memory {
+                        opd:help "Monitor OSPFv3 route memory information";
+                        opd:on-enter 'vtysh -c "debug ospf6 route memory"';
+                        opd:privileged true;
+                    }
+                    opd:command table {
+                        opd:help "Monitor OSPFv3 route table information";
+                        opd:on-enter 'vtysh -c "debug ospf6 route table"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command zebra {
+                    opd:help "Monitor OSPFv3 zebra";
+                    opd:on-enter 'vtysh -c "debug ospf6 zebra"';
+                    opd:privileged true;
+                }
+            }
+            opd:command disable {
+                opd:help "Disable OSPFv3 monitor";
+
+                opd:command lsa {
+                    opd:help "Disable monitoring OSPFv3 Link State Advertisements";
+                    opd:command as-external {
+                        opd:help "Disable monitor OSPFv3 as-external Link State Advertisements";
+                        opd:on-enter 'vtysh -c "no debug ospf6 as-external"';
+                        opd:privileged true;
+                    }
+                    opd:command inter-prefix {
+                        opd:help "Disable monitoring OSPFv3 inter-prefix Link State Advertisements";
+                        opd:on-enter 'vtysh -c "no debug ospf6 lsa inter-prefix"';
+                        opd:privileged true;
+                    }
+                    opd:command inter-router {
+                        opd:help "Disable monitoring OSPFv3 inter-router Link State Advertisements";
+                        opd:on-enter 'vtysh -c "no debug ospf6 lsa inter-router"';
+                        opd:privileged true;
+                    }
+                    opd:command intra-prefix {
+                        opd:help "Disable monitoring OSPFv3 intra-prefix Link State Advertisements";
+                        opd:on-enter 'vtysh -c "no debug ospf6 lsa intra-prefix"';
+                        opd:privileged true;
+                    }
+                    opd:command link {
+                        opd:help "Disable monitoring OSPFv3 link Link State Advertisements";
+                        opd:on-enter 'vtysh -c "no debug ospf6 lsa link"';
+                        opd:privileged true;
+                    }
+                    opd:command network {
+                        opd:help "Disable monitoring OSPFv3 network Link State Advertisements";
+                        opd:on-enter 'vtysh -c "no debug ospf6 lsa network"';
+                        opd:privileged true;
+                    }
+                    opd:command router {
+                        opd:help "Disable monitoring OSPFv3 router Link State Advertisements";
+                        opd:on-enter 'vtysh -c "no debug ospf6 lsa router"';
+                        opd:privileged true;
+                    }
+                    opd:command unknown {
+                        opd:help "Disable monitoring OSPFv3 unknown Link State Advertisements";
+                        opd:on-enter 'vtysh -c "no debug ospf6 lsa unknown"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command interface {
+                    opd:help "Disable monitor OSPFv3 interface";
+                    opd:on-enter 'vtysh -c "no debug ospf6 interface"';
+                    opd:privileged true;
+                }
+                opd:command neighbor {
+                    opd:help "Disable monitor OSPFv3 Neighbor";
+                    opd:on-enter 'vtysh -c "no debug ospf6 neighbor"';
+                    opd:privileged true;
+                }
+                opd:command route {
+                    opd:help "Disable monitor OSPFv3 route information";
+                    opd:command inter-area {
+                        opd:help "Disable monitoring OSPFv3 inter-area route information";
+                        opd:on-enter 'vtysh -c "no debug ospf6 route inter-area"';
+                        opd:privileged true;
+                    }
+                    opd:command intra-area {
+                        opd:help "Disable monitoring OSPFv3 intra-area route information";
+                        opd:on-enter 'vtysh -c "no debug ospf6 route intra-area"';
+                        opd:privileged true;
+                    }
+                    opd:command memory {
+                        opd:help "Disable monitoring OSPFv3 route memory information";
+                        opd:on-enter 'vtysh -c "no debug ospf6 route memory"';
+                        opd:privileged true;
+                    }
+                    opd:command table {
+                        opd:help "Disable monitoring OSPFv3 route table information";
+                        opd:on-enter 'vtysh -c "no debug ospf6 route table"';
+                        opd:privileged true;
+                    }
+                }
+                opd:command zebra {
+                    opd:help "Disable monitor OSPFv3 zebra";
+                    opd:on-enter 'vtysh -c "no debug ospf6 zebra"';
+                    opd:privileged true;
+                }
+            }
+        }
+    }
+}
diff --git a/yang/vyatta-op-protocols-frr-zebra-v1.yang b/yang/vyatta-op-protocols-frr-zebra-v1.yang
new file mode 100644
index 0000000..556c4a0
--- /dev/null
+++ b/yang/vyatta-op-protocols-frr-zebra-v1.yang
@@ -0,0 +1,227 @@
+module vyatta-op-protocols-frr-zebra-v1 {
+    namespace "urn:vyatta.com:mgmt:vyatta-op-protocols-frr-zebra:1";
+    prefix vyatta-op-protocols-frr-zebra;
+
+    import vyatta-opd-extensions-v1 {
+        prefix opd;
+    }
+    import vyatta-op-monitor-v1 {
+        prefix op-mon;
+    }
+    import vyatta-op-monitor-protocols-v1 {
+        prefix op-mon-protocols;
+    }
+
+    organization "AT&T, Inc.";
+    contact
+        "AT&T
+         Postal: 208 S. Akard Street
+                 Dallas, TX 25202
+         Web: www.att.com";
+
+    description
+        "Copyright (c) 2018-2019, AT&T Intellectual Property.
+         All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+         This module implements the Zebra operational CLI";
+
+    revision 2018-11-22 {
+        description "Initial revision";
+    }
+
+    opd:augment /op-mon:monitor/op-mon-protocols:protocol {
+        opd:command zebra {
+            opd:help "Monitor Zebra information";
+            opd:inherit "Using vtysh requires raised privileges" {
+                opd:privileged true;
+            }
+
+            opd:command enable {
+                opd:help "Enable Zebra monitoring";
+
+                opd:command events {
+                    opd:help "Monitor Zebra events";
+                    opd:on-enter "vtysh -c 'debug zebra events'";
+                }
+                opd:command fpm {
+                    opd:help "Monitor Zebra FPM";
+                    opd:on-enter "vtysh -c 'debug zebra fpm'";
+                }
+                opd:command kernel {
+                    opd:help "Monitor Zebra kernel interaction";
+                    opd:on-enter "vtysh -c 'debug zebra kernel'";
+
+                    opd:command messages {
+                        opd:help "Monitor netlink messages between Zebra and kernel";
+                        opd:on-enter "vtysh -c 'debug zebra kernel msgdump'";
+
+                        opd:command receive {
+                            opd:help "Monitor netlink messages sent to Zebra";
+                            opd:on-enter "vtysh -c 'debug zebra kernel msgdump recv'";
+                        }
+                        opd:command send {
+                            opd:help "Monitor netlink messages sent from Zebra";
+                            opd:on-enter "vtysh -c 'debug zebra kernel msgdump send'";
+                        }
+                    }
+                }
+                opd:command mpls {
+                    opd:help "Monitor Zebra MPLS operations";
+                    opd:on-enter "vtysh -c 'debug zebra mpls'";
+                }
+                opd:command nht {
+                    opd:help "Monitor Zebra next hop tracking";
+                    opd:on-enter "vtysh -c 'debug zebra nht'";
+                }
+                opd:command packet {
+                    opd:help "Monitor Zebra packet events";
+                    opd:on-enter "vtysh -c 'debug zebra packet'";
+
+                    opd:command detail {
+                        opd:help "Monitor detailed Zebra packet events";
+                        opd:on-enter "vtysh -c 'debug zebra packet detail'";
+                    }
+                    opd:command receive {
+                        opd:help "Monitor packets received by Zebra";
+                        opd:on-enter "vtysh -c 'debug zebra packet recv'";
+
+                        opd:command detail {
+                            opd:help "Monitor detailed Zebra packet events";
+                            opd:on-enter "vtysh -c 'debug zebra packet recv detail'";
+                        }
+                    }
+                    opd:command send {
+                        opd:help "Monitor packets sent by Zebra";
+                        opd:on-enter "vtysh -c 'debug zebra packet send'";
+
+                        opd:command detail {
+                            opd:help "Monitor detailed Zebra packet events";
+                            opd:on-enter "vtysh -c 'debug zebra packet send detail'";
+                        }
+                    }
+                }
+                opd:command pseudowires {
+                    opd:help "Monitor Zebra pseudowires";
+                    opd:on-enter "vtysh -c 'debug zebra pseudowires'";
+                }
+                opd:command rib {
+                    opd:help "Monitor Zebra RIB operations";
+                    opd:on-enter "vtysh -c 'debug zebra rib'";
+
+                    opd:command detail {
+                        opd:help "Monitor detailed Zebra RIB operations";
+                        opd:on-enter "vtysh -c 'debug zebra rib detailed'";
+                    }
+                }
+            }
+
+            opd:command disable {
+                opd:help "Disable Zebra monitoring";
+
+                opd:command events {
+                    opd:help "Monitor Zebra events";
+                    opd:on-enter "vtysh -c 'no debug zebra events'";
+                }
+                opd:command fpm {
+                    opd:help "Monitor Zebra FPM";
+                    opd:on-enter "vtysh -c 'no debug zebra fpm'";
+                }
+                opd:command kernel {
+                    opd:help "Monitor Zebra kernel interaction";
+                    opd:on-enter "vtysh -c 'no debug zebra kernel'";
+
+                    opd:command messages {
+                        opd:help "Monitor netlink messages between Zebra and kernel";
+                        opd:on-enter "vtysh -c 'no debug zebra kernel msgdump'";
+
+                        opd:command receive {
+                            opd:help "Monitor netlink messages sent to Zebra";
+                            opd:on-enter "vtysh -c 'no debug zebra kernel msgdump recv'";
+                        }
+                        opd:command send {
+                            opd:help "Monitor netlink messages sent from Zebra";
+                            opd:on-enter "vtysh -c 'no debug zebra kernel msgdump send'";
+                        }
+                    }
+                }
+                opd:command mpls {
+                    opd:help "Monitor Zebra MPLS operations";
+                    opd:on-enter "vtysh -c 'no debug zebra mpls'";
+                }
+                opd:command nht {
+                    opd:help "Monitor Zebra next hop tracking";
+                    opd:on-enter "vtysh -c 'no debug zebra nht'";
+                }
+                opd:command packet {
+                    opd:help "Monitor Zebra packet events";
+                    opd:on-enter "vtysh -c 'no debug zebra packet'";
+
+                    opd:command detail {
+                        opd:help "Monitor detailed Zebra packet events";
+                        opd:on-enter "vtysh -c 'no debug zebra packet detail'";
+                    }
+                    opd:command receive {
+                        opd:help "Monitor packets received by Zebra";
+                        opd:on-enter "vtysh -c 'no debug zebra packet recv'";
+
+                        opd:command detail {
+                            opd:help "Monitor detailed Zebra packet events";
+                            opd:on-enter "vtysh -c 'no debug zebra packet recv detail'";
+                        }
+                    }
+                    opd:command send {
+                        opd:help "Monitor packets sent by Zebra";
+                        opd:on-enter "vtysh -c 'no debug zebra packet send'";
+
+                        opd:command detail {
+                            opd:help "Monitor detailed Zebra packet events";
+                            opd:on-enter "vtysh -c 'no debug zebra packet send detail'";
+                        }
+                    }
+                }
+                opd:command pseudowires {
+                    opd:help "Monitor Zebra pseudowires";
+                    opd:on-enter "vtysh -c 'no debug zebra pseudowires'";
+                }
+                opd:command rib {
+                    opd:help "Monitor Zebra RIB operations";
+                    opd:on-enter "vtysh -c 'no debug zebra rib'";
+
+                    opd:command detail {
+                        opd:help "Monitor detailed Zebra RIB operations";
+                        opd:on-enter "vtysh -c 'no debug zebra rib detailed'";
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/yang/vyatta-op-show-ip-ipv6-route-frr-v1.yang b/yang/vyatta-op-show-ip-ipv6-route-frr-v1.yang
new file mode 100644
index 0000000..428761d
--- /dev/null
+++ b/yang/vyatta-op-show-ip-ipv6-route-frr-v1.yang
@@ -0,0 +1,96 @@
+module vyatta-op-show-ip-ipv6-route-frr-v1 {
+    namespace "urn:vyatta.com:mgmt:vyatta-op-show-ip-ipv6-route-frr:1";
+    prefix vyatta-op-show-ip-ipv6-route-frr-v1;
+
+    import vyatta-opd-extensions-v1 {
+        prefix opd;
+    }
+    import vyatta-op-show-v1 {
+        prefix op-show;
+    }
+    import vyatta-op-show-ip-ipv6-v1 {
+        prefix op-show-ip-ipv6;
+    }
+    import vyatta-op-show-ip-ipv6-route-v1 {
+        prefix op-show-ip-ipv6-route;
+    }
+    import vyatta-protocols-static-v1 {
+        prefix static;
+    }
+
+    organization "AT&T, Inc.";
+    contact
+        "AT&T
+         Postal: 208 S. Akard Street
+                 Dallas, TX 25202
+         Web: www.att.com";
+
+    description
+        "Copyright (c) 2018-2019, AT&T Intellectual Property.
+         All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+         This module implements additional routing table show CLI for FRR";
+
+    revision 2018-11-27 {
+        description "Initial revision";
+    }
+
+    grouping show-route-table-commands {
+        opd:command table {
+            opd:on-enter "";
+            opd:argument table-id {
+                opd:help "Policy table ID";
+                type uint8 {
+                    range 1..128;
+                }
+            }
+        }
+    }
+
+    opd:augment /op-show:show/op-show-ip-ipv6:ip/op-show-ip-ipv6-route:route {
+        if-feature static:static-pbr-tables;
+        uses show-route-table-commands {
+            refine table {
+                opd:help "Show IP routes in policy table";
+            }
+        }
+    }
+
+    opd:augment /op-show:show/op-show-ip-ipv6:ipv6/op-show-ip-ipv6-route:route {
+        if-feature static:static-pbr-tables;
+        uses show-route-table-commands {
+            refine table {
+                opd:help "Show IPv6 routes in policy table";
+            }
+        }
+    }
+}
diff --git a/yang/vyatta-op-show-monitoring-protocols-frr-v1.yang b/yang/vyatta-op-show-monitoring-protocols-frr-v1.yang
new file mode 100644
index 0000000..3a9e10e
--- /dev/null
+++ b/yang/vyatta-op-show-monitoring-protocols-frr-v1.yang
@@ -0,0 +1,68 @@
+module vyatta-op-show-monitoring-protocols-frr-v1 {
+	namespace "urn:vyatta.com:mgmt:vyatta-op-show-monitoring-protocols-frr:1";
+	prefix vyatta-op-show-monitoring-protocols-frr-v1;
+
+	import vyatta-opd-extensions-v1 {
+		prefix opd;
+	}
+	import vyatta-op-show-v1 {
+		prefix op-show;
+	}
+	import vyatta-op-show-monitoring-v1 {
+		prefix op-show-monitoring;
+	}
+
+	organization "AT&T, Inc.";
+	contact
+		"AT&T
+		 Postal: 208 S. Akard Street
+				 Dallas, TX 25202
+		 Web: www.att.com";
+
+	description
+		"Copyright (c) 2018-2019, AT&T Intellectual Property.
+		 All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+		 This module implements the 'show monitoring protocols' operational CLI";
+
+	revision 2018-11-07 {
+		description "Initial version";
+	}
+
+	opd:augment /op-show:show/op-show-monitoring:monitoring {
+		opd:command protocols {
+			opd:help "Show routing protocol debugging flags";
+			opd:privileged true;
+			opd:on-enter "vtysh -c 'show debugging'";
+		}
+	}
+}
diff --git a/yang/vyatta-protocols-frr-bgp-routing-instance-v1.yang b/yang/vyatta-protocols-frr-bgp-routing-instance-v1.yang
new file mode 100644
index 0000000..422f10d
--- /dev/null
+++ b/yang/vyatta-protocols-frr-bgp-routing-instance-v1.yang
@@ -0,0 +1,220 @@
+module vyatta-protocols-frr-bgp-routing-instance-v1 {
+	namespace "urn:vyatta.com:mgmt:vyatta-protocols-frr-bgp-routing-instance:1";
+	prefix vyatta-protocols-frr-bgp-routing-instance-v1;
+
+	import vyatta-protocols-v1 {
+		prefix protocols;
+	}
+	import vyatta-protocols-frr-bgp-v1 {
+		prefix protocols-bgp;
+	}
+	import configd-v1 {
+		prefix configd;
+	}
+	import vyatta-routing-v1 {
+		prefix routing-instance;
+	}
+
+	organization "AT&T, Inc.";
+	contact
+		"AT&T
+		 Postal: 208 S. Akard Street
+		         Dallas, TX 25202
+		 Web: www.att.com";
+
+	description
+		"Copyright (c) 2018-2019, AT&T Intellectual Property. All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+		 The YANG module for vyatta-protocols-frr-bgp-routing-instance-v1";
+
+	revision 2018-11-02 {
+		description "Initial revision";
+	}
+
+	typedef rt-rd {
+		type union {
+			type string {
+				//ASN:NN format. Allowing 2-byte:4-byte (65535:4294967295)
+				pattern '([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])'
+					+ ':'
+					+ '([0-9]|[1-9]\d{1,8}|[1-3]\d{9}|4[0-1]\d{8}|42[0-8]\d{7}|429[0-3]\d{6}|4294[0-8]\d{5}|'
+					+ '42949[0-5]\d{4}|429496[0-6]\d{3}|4294967[0-1]\d{2}|42949672[0-8]\d|429496729[0-5])';
+			}
+			type string {
+				//ASN:NN format. Allowing 4-byte:2-byte (4294967295:65535)
+				pattern '([0-9]|[1-9]\d{1,8}|[1-3]\d{9}|4[0-1]\d{8}|42[0-8]\d{7}|429[0-3]\d{6}|4294[0-8]\d{5}|'
+					+ '42949[0-5]\d{4}|429496[0-6]\d{3}|4294967[0-1]\d{2}|42949672[0-8]\d|429496729[0-5])'
+					+ ':'
+					+ '([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])';
+			}
+			type string {
+				//IPAddress:NN format. Allowing IpAddress:2-byte
+				pattern '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+					+  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+					+ ':'
+					+ '([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])';
+			}
+		}
+	}
+
+	/* Confederation identifier can be configured only in default routing-instance */
+	grouping bgp-params-global-confederation-vrf {
+		container confederation {
+			description "AS confederation parameters for Non-default BGP Routing Instance";
+			presence "BGP Confederation config";
+			configd:help "AS confederation parameters";
+			uses protocols-bgp:bgp-params-global-confederation-peers;
+		} /*confederation*/
+	}
+
+	/* BGP Global parameters supported under routing-instance, limited set */
+	grouping bgp-params-global-vrf {
+		container parameters {
+			description "BGP Global parameters that can be configured under Non-default BGP Routing Instance";
+			presence "Enables BGP parameters";
+			configd:help "BGP parameters";
+			uses protocols-bgp:bgp-params-global-always-compare-med;
+			uses protocols-bgp:bgp-params-global-default;
+			uses protocols-bgp:bgp-params-global-confederation;
+			uses protocols-bgp:bgp-params-global-bestpath;
+			uses protocols-bgp:bgp-params-global-cluster-id;
+			uses protocols-bgp:bgp-params-global-log-neighbor-changes;
+			uses protocols-bgp:bgp-params-global-med-out-delay;
+			uses protocols-bgp:bgp-params-global-no-client-to-client-reflection;
+			uses protocols-bgp:bgp-params-global-deterministic-med;
+			uses protocols-bgp:bgp-params-global-router-id;
+			uses protocols-bgp:bgp-params-global-graceful-restart;
+		}
+		uses protocols-bgp:bgp-params-timers;
+	}
+
+	grouping bgp-routing-instance {
+		list bgp {
+			configd:priority "730";
+			description "BGP configuration parameters under Non-default Routing Instance";
+			configd:help "Border Gateway Protocol (BGP) parameters";
+			must "count(../bgp/tagnode) <= 1" {
+				error-message "Another BGP instance is already running" ;
+			}
+			/* Default BGP configuration is mandatory */
+			must "(/protocols:protocols/protocols-bgp:bgp)" {
+				error-message "Global BGP is not configured";
+			}
+			/*
+				'asnumber' will be a more meaningful name for the key field than
+				'tagnode'. But protocol-bgp module has few groups which are reused here
+				and those groups refer to this field as 'tagnode'. 'list bgp' key field
+				is named as 'tagnode' in protocol-bgp module. We cannot change that name
+				at present because it breaks backward compatibility.
+			*/
+			key "tagnode";
+			leaf tagnode {
+				description "BGP AS Number";
+				type uint32 {
+					range 1..max;
+				}
+				configd:help "Border Gateway Protocol (BGP) parameters";
+
+				//ASN should be same as Global BGP
+				must "(current() = /protocols:protocols/protocols-bgp:bgp/protocols-bgp:tagnode)" {
+					error-message "AS Number must be same as the Global BGP";
+				}
+			}
+
+			uses bgp-params-global-vrf;
+			uses protocols-bgp:bgp-params-peer-group;
+			uses protocols-bgp:bgp-params-neighbor;
+			uses protocols-bgp:bgp-params-address-family;
+		}
+	}
+
+	/* BGP specific routing instance parameters */
+	grouping bgp-routing-instance-params {
+		leaf route-distinguisher {
+			configd:priority "720";
+			type rt-rd;
+			description "Configure Route Distinguisher in ASN:NN or IPAddress:NN format";
+			configd:help "Route Distinguisher in ASN:NN or IPAddress:NN format";
+
+			must "count(/routing-instance:routing/routing-instance:routing-instance[route-distinguisher = current()]) <= 1" {
+				error-message "Route Distinguisher must be unique across the Routing Instances";
+			}
+		}
+		list route-target {
+			configd:priority "720";
+			description "Configure Route-Target in ASN:NN or IPAddress:NN format";
+			configd:help "Route Target in ASN:NN or IPAddress:NN format";
+			key "rt";
+			leaf rt {
+				type rt-rd;
+				description "Configure Route-Target in ASN:NN or IPAddress:NN format";
+				configd:help "Route-target"; 
+			}
+			leaf type {
+				type enumeration {
+					enum "import" {
+						configd:help "import routes with this route-target";
+						description "import routes with this route-target";
+					}
+					enum "export" {
+						configd:help "export routes with this route-target";
+						description "export routes with this route-target";
+					}
+					enum "both" {
+						configd:help "export and import routes with this route-target";
+						description "export and import routes with this route-target";
+					}
+				}
+				mandatory true;
+				description "Configure Route-Target Type";
+				configd:help "Route-target type";
+			}
+		}
+	}
+
+	/* Augmenting to protocols - routing-instance - VRF */
+	augment /routing-instance:routing/routing-instance:routing-instance/routing-instance:protocols {
+		uses bgp-routing-instance;
+	}
+
+	/* Augmenting to routing-instance protocols bgp address-family
+	   ipv4-unicast */
+	augment /routing-instance:routing/routing-instance:routing-instance/routing-instance:protocols/bgp/address-family/ipv4-unicast {
+		uses bgp-routing-instance-params;
+	}
+
+	/* Augmenting to routing-instance protocols bgp address-family
+	   ipv6-unicast */
+	augment /routing-instance:routing/routing-instance:routing-instance/routing-instance:protocols/bgp/address-family/ipv6-unicast {
+		uses bgp-routing-instance-params;
+	}
+
+}
diff --git a/yang/vyatta-protocols-frr-bgp-v1.yang b/yang/vyatta-protocols-frr-bgp-v1.yang
new file mode 100644
index 0000000..6552eed
--- /dev/null
+++ b/yang/vyatta-protocols-frr-bgp-v1.yang
@@ -0,0 +1,1695 @@
+module vyatta-protocols-frr-bgp-v1 {
+	namespace "urn:vyatta.com:mgmt:vyatta-protocols-frr-bgp:1";
+	prefix vyatta-protocols-frr-bgp-v1;
+
+	import vyatta-types-v1 {
+		prefix types;
+	}
+	import vyatta-protocols-v1 {
+		prefix protocols;
+	}
+	import vyatta-services-v1 {
+		prefix service;
+	}
+	import vyatta-service-snmp-v1 {
+		prefix service-snmp;
+	}
+	import configd-v1 {
+		prefix configd;
+	}
+	import vyatta-policy-v1 {
+		prefix policy;
+	}
+	import vyatta-policy-route-v1 {
+		prefix policy-route;
+	}
+
+	organization "AT&T, Inc.";
+	contact
+		"AT&T
+		 Postal: 208 S. Akard Street
+		         Dallas, TX 25202
+		 Web: www.att.com";
+
+	description
+		"Copyright (c) 2018-2019, AT&T Intellectual Property. All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+		 The YANG module package for vyatta-protocols-frr-bgp-v1";
+
+	revision 2018-10-30 {
+		description "Inital version.";
+	}
+
+	grouping route-map-group {
+		leaf route-map {
+			description "Route-map for filtering";
+			configd:help "Route-map for filtering";
+			type leafref {
+				path "/policy:policy/policy-route:route/policy-route:route-map/policy-route:tagnode";
+			}
+		}
+	}
+	/* This grouping contains relative path to nodes outside the group scope. It can only be used
+	   at a specific config level matching the relative path.
+	*/
+	grouping neighbor-route-map {
+		container route-map {
+			description "Route-map to filter route updates to/from this entity (neighbor or peer-group)";
+			configd:help "Route-map to filter route updates to/from this entity (neighbor or peer-group)";
+			leaf export {
+				description "Route-map to filter outgoing route updates to this peer-group";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:route-map/policy-route:tagnode";
+				}
+				configd:help "Route-map to filter outgoing route updates to this peer-group";
+			}
+			leaf import {
+				description "Route-map to filter incoming route updates from this entity (neighbor or peer-group)";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:route-map/policy-route:tagnode";
+				}
+				configd:help "Route-map to filter incoming route updates from this entity (neighbor or peer-group)";
+			}
+		}
+	}
+	grouping neighbor-vrrp-failover {
+		list interface {
+			description "This list is added to link the BGP VRRP group with interface VRRP group";
+			max-elements "1";
+			configd:help "VRRP Interface";
+			configd:allowed "/opt/vyatta/sbin/vyatta-interfaces.pl --show all";
+			key "ifname";
+			leaf ifname {
+				description "VRRP Interface Name";
+				configd:help "VRRP Interface Name";
+				type types:interface-ifname;
+			}
+		}
+	}
+	grouping ipv4-aggregate-address {
+		list aggregate-address {
+			description "BGP aggregate network";
+			configd:help "BGP aggregate network";
+			key "tagnode";
+			leaf tagnode {
+				description "BGP aggregate network";
+				type types:ipv4-prefix {
+					configd:normalize "normalize ipv4-prefix";
+				}
+				configd:help "BGP aggregate network";
+			}
+			leaf as-set {
+				description "Generate AS-set path information for this aggregate address";
+				type empty;
+				configd:help "Generate AS-set path information for this aggregate address";
+			}
+			leaf summary-only {
+				description "Announce the aggregate summary network only";
+				type empty;
+				configd:help "Announce the aggregate summary network only";
+			}
+		}
+	}
+	grouping ipv6-aggregate-address {
+		list aggregate-address {
+			description "BGP aggregate network";
+			configd:help "BGP aggregate network";
+			key "tagnode";
+			leaf tagnode {
+				description "IPv6 address";
+				type types:ipv6-prefix {
+					configd:normalize "normalize ipv6-prefix";
+				}
+				configd:help "BGP IPv6 aggregate network";
+			}
+			leaf as-set {
+				description "Generate AS-set path information for this aggregate address";
+				type empty;
+				configd:help "Generate AS-set path information for this aggregate address";
+			}
+			leaf summary-only {
+				description "Announce the aggregate summary network only";
+				type empty;
+				configd:help "Announce the aggregate summary network only";
+			}
+		}
+	}
+
+	grouping parameters-distance {
+		container distance {
+			description "Administrative distance for BGP routes";
+			presence "Enables administrative distance for BGP routes";
+			configd:help "Administrative distance for BGP routes";
+			container global {
+				description "Global administrative distances for BGP routes";
+				presence "Enables global administrative distance for BGP";
+				configd:help "Global administrative distances for BGP routes";
+				leaf local {
+					description "Administrative distance for local BGP routes";
+					type uint32 {
+						range 1..255;
+					}
+					configd:help "Administrative distance for local BGP routes";
+					default "200";
+				}
+				leaf internal {
+					description "Administrative distance for internal BGP routes";
+					type uint32 {
+						range 1..255;
+					}
+					configd:help "Administrative distance for internal BGP routes";
+					default "200";
+				}
+				leaf external {
+					description "Administrative distance for external BGP routes";
+					type uint32 {
+						range 1..255;
+					}
+					configd:help "Administrative distance for external BGP routes";
+					default "20";
+				}
+			}
+		}
+	}
+	grouping parameters-dampening {
+		container dampening {
+			description "Enable route-flap dampening";
+			presence "Enables route-flap dampening";
+			configd:help "Enable route-flap dampening";
+			leaf half-life {
+				description "Half-life time for dampening [REQUIRED]";
+				type uint32 {
+					range 1..45;
+				}
+				default "15";
+				units minutes;
+				configd:help "Half-life time for dampening [REQUIRED]";
+			}
+		}
+	}
+
+	grouping network-ipv4 {
+		list network {
+			description "BGP network";
+			configd:help "BGP network";
+			key "tagnode";
+			leaf tagnode {
+				description "BGP network";
+				type types:ipv4-prefix {
+					configd:normalize "normalize ipv4-prefix";
+				}
+				configd:help "BGP network";
+			}
+			leaf backdoor {
+				description "Network as a backdoor route";
+				type empty;
+				configd:help "Network as a backdoor route";
+			}
+			uses route-map-group {
+				refine route-map {
+					must "not(../backdoor)" {
+						error-message "You may configure route-map or backdoor, not both";
+                                        }
+					configd:help "Route-map to modify route attributes";
+				}
+			}
+		}
+	}
+
+	grouping redistribute-ipv4 {
+		container redistribute {
+			description "Redistribute routes from other protocols into BGP";
+			presence "Enables IPv4 redistribution";
+			configd:help "Redistribute routes from other protocols into BGP";
+			container kernel {
+				description "Redistribute kernel routes into BGP";
+				presence "Enables redistribution of kernel routes into BGP";
+				configd:help "Redistribute kernel routes into BGP";
+				uses route-map-group {
+					refine route-map {
+						configd:help "Route map to filter redistributed routes";
+					}
+				}
+			}
+			container rip {
+				description "Redistribute RIP routes into BGP";
+				presence "Enables redistribution of RIP routes into BGP";
+				configd:help "Redistribute RIP routes into BGP";
+				uses route-map-group {
+					refine route-map {
+						configd:help "Route map to filter redistributed routes";
+					}
+				}
+			}
+			container connected {
+				description "Redistribute connected routes into BGP";
+				presence "Enables redistribution of connected routes into BGP";
+				configd:help "Redistribute connected routes into BGP";
+				uses route-map-group {
+					refine route-map {
+						configd:help "Route map to filter redistributed routes";
+					}
+				}
+			}
+			container static {
+				description "Redistribute static routes into BGP";
+				presence "Enables redistribution of static routes into BGP";
+				configd:help "Redistribute static routes into BGP";
+				uses route-map-group {
+					refine route-map {
+						configd:help "Route map to filter redistributed routes";
+					}
+				}
+			}
+			container ospf {
+				description "Redistribute OSPF routes into BGP";
+				presence "Enables redistribution of OSPF routes into BGP";
+				configd:help "Redistribute OSPF routes into BGP";
+				uses route-map-group {
+					refine route-map {
+						configd:help "Route map to filter redistributed routes";
+					}
+				}
+			}
+		}
+	}
+
+	grouping network-ipv6 {
+		list network {
+			description "BGP IPv6 network";
+			configd:help "BGP IPv6 network";
+			key "tagnode";
+			leaf tagnode {
+				description "BGP IPv6 network";
+				type types:ipv6-prefix {
+					configd:normalize "normalize ipv6-prefix";
+				}
+				configd:help "BGP IPv6 network";
+			}
+			uses route-map-group {
+				refine route-map {
+					configd:help "Route-map to modify route attributes";
+				}
+			}
+		}
+	}
+
+	grouping redistribute-ipv6 {
+		container redistribute {
+			description "Redistribute routes from other protocols into BGP";
+			presence "Enables IPv6 Redistribution";
+			configd:help "Redistribute routes from other protocols into BGP";
+			container kernel {
+				description "Redistribute kernel routes into BGP";
+				presence "Enables redistribution of kernel routes into BGP";
+				configd:help "Redistribute kernel routes into BGP";
+				uses route-map-group {
+					refine route-map {
+						configd:help "Route map to filter redistributed routes";
+					}
+				}
+			}
+			container ripng {
+				description "Redistribute RIP routes into BGP";
+				presence "Enables redistribution of RIP routes into BGP";
+				configd:help "Redistribute RIP routes into BGP";
+				uses route-map-group {
+					refine route-map {
+						configd:help "Route map to filter redistributed routes";
+					}
+				}
+			}
+			container connected {
+				description "Redistribute connected routes into BGP";
+				presence "Enables redistribution of connected routes into BGP";
+				configd:help "Redistribute connected routes into BGP";
+				uses route-map-group {
+					refine route-map {
+						configd:help "Route map to filter redistributed routes";
+					}
+				}
+			}
+			container static {
+				description "Redistribute static routes into BGP";
+				presence "Enables redistribution of static routes into BGP";
+				configd:help "Redistribute static routes into BGP";
+				uses route-map-group {
+					refine route-map {
+						configd:help "Route map to filter redistributed routes";
+					}
+				}
+			}
+			container ospfv3 {
+				description "Redistribute OSPF routes into BGP";
+				presence "Enables redistribution of OSPF routes into BGP";
+				configd:help "Redistribute OSPF routes into BGP";
+				uses route-map-group {
+					refine route-map {
+						configd:help "Route map to filter redistributed routes";
+					}
+				}
+			}
+		}
+	}
+
+	/* This grouping contains relative path to nodes outside the group scope. It can only be used
+	   at a specific config level matching the relative path.
+	*/
+	grouping neigh_peer_grp_ipv4_lists {
+		container prefix-list {
+			description "Prefix-list to filter route updates to/from this entity (neighbor or peer-group)";
+			configd:help "Prefix-list to filter route updates to/from this entity (neighbor or peer-group)";
+			presence "Enables prefix-list";
+			must "count(*) > 0" {
+				error-message "prefix-list cannot be empty";
+			}
+            		/* This and distribute-list are mutually exclusive */
+			leaf export {
+				description "Prefix-list to filter outgoing route updates to this peer-group";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:prefix-list/policy-route:tagnode";
+				}
+				configd:help "Prefix-list to filter outgoing route updates to this peer-group";
+				must "not(../../peer-group)" {
+					error-message "You may not configure prefix-list export for a neighbor in peer-group\n";
+				}
+			}
+			leaf import {
+				description "Prefix-list to filter incoming route updates from this peer-group";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:prefix-list/policy-route:tagnode";
+				}
+				configd:help "Prefix-list to filter incoming route updates from this peer-group";
+			}
+		}
+		container distribute-list {
+			description "Access-list to filter route updates to/from this entity (peer-group or neighbor)";
+			configd:help "Access-list to filter route updates to/from this entity (peer-group or neighbor)";
+			presence "Enables distribute-list";
+			must "count(*) > 0" {
+				error-message "distribute-list cannot be empty";
+			}
+			must "not(../prefix-list)" {
+				error-message "You may not configure both prefix-list and distribute-list";
+			}
+			must "not(../peer-group)" {
+				error-message "You may not configure distribute-list for a neighbor in peer-group\n";
+			}
+			leaf export {
+				description "Access-list to filter outgoing route updates to this entity (peer-group or neighbor)";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:access-list/policy-route:tagnode";
+				}
+				configd:help "Access-list to filter outgoing route updates to this entity (peer-group or neighbor)";
+			}
+			leaf import {
+				description "Access-list to filter incoming route updates from this entity (peer-group or neighbor)";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:access-list/policy-route:tagnode";
+				}
+				configd:help "Access-list to filter incoming route updates from this entity (peer-group or neighbor)";
+			}
+		}
+	}
+
+	/* This grouping contains relative path to nodes outside the group scope. It can only be used
+	   at a specific config level matching the relative path.
+	*/
+	grouping neigh_peer_grp_ipv6_lists {
+		container prefix-list {
+			description "Prefix-list to filter route updates to/from this entity (neighbor or peer-group)";
+			presence "Enables IPv6 prefix-list";
+			configd:help "Prefix-list to filter route updates to/from this entity (neighbor or peer-group)";
+			/* This and distribute-list are mutually exclusive */
+			leaf export {
+				description "Prefix-list to filter outgoing route updates to this peer-group";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:prefix-list6/policy-route:tagnode";
+				}
+				configd:help "Prefix-list to filter outgoing route updates to this peer-group";
+				must "not(../../peer-group)" {
+					error-message "You may not configure prefix-list export for a neighbor in peer-group\n";
+				}
+			}
+			leaf import {
+				description "Prefix-list to filter incoming route updates from this peer-group";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:prefix-list6/policy-route:tagnode";
+				}
+				configd:help "Prefix-list to filter incoming route updates from this peer-group";
+			}
+		}
+		container distribute-list {
+			description "Access-list to filter route updates to/from this entity (peer-group or neighbor)";
+			presence "Enables IPv6 access-list";
+			configd:help "Access-list to filter route updates to/from this entity (peer-group or neighbor)";
+			must "not(../prefix-list)" {
+				error-message "You may not configure both prefix-list and distribute-list";
+			}
+			must "not(../peer-group)" {
+				error-message "You may not configure distribute-list for a neighbor in peer-group\n";
+			}
+			leaf export {
+				description "Access-list to filter outgoing route updates to this entity (peer-group or neighbor)";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:access-list6/policy-route:tagnode";
+				}
+				configd:help "Access-list to filter outgoing route updates to this entity (peer-group or neighbor)";
+			}
+			leaf import {
+				description "Access-list to filter incoming route updates from this entity (peer-group or neighbor)";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:access-list6/policy-route:tagnode";
+				}
+				configd:help "Access-list to filter incoming route updates from this entity (peer-group or neighbor)";
+			}
+		}
+	}
+
+	grouping neigh_filter_list {
+		container filter-list {
+			description "As-path-list to filter route updates to/from this entity (peer-group or neighbor)";
+			presence "Enables applying as-path-list to filter route updates";
+			configd:help "As-path-list to filter route updates to/from this entity (peer-group or neighbor)";
+			leaf export {
+				description "As-path-list to filter outgoing route updates to this entity (peer-group or neighbor)";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:as-path-list/policy-route:tagnode";
+				}
+				configd:help "As-path-list to filter outgoing route updates to this entity (peer-group or neighbor)";
+			}
+			leaf import {
+				description "As-path-list to filter incoming route updates from this entity (peer-group or neighbor)";
+				type leafref {
+					path "/policy:policy/policy-route:route/policy-route:as-path-list/policy-route:tagnode";
+				}
+				configd:help "As-path-list to filter incoming route updates from this entity (peer-group or neighbor)";
+			}
+		}
+	}
+
+	grouping neigh_maximum_prefix {
+		list maximum-prefix {
+			description "Maximum number of prefixes to accept from this entity (neighbor or peer-group)";
+			max-elements "1";
+			configd:help "Maximum number of prefixes to accept from this entity (neighbor or peer-group)";
+			key "tagnode";
+			leaf tagnode {
+				description "Maximum number of prefixes to accept from this entity (neighbor or peer-group)";
+				type uint32 {
+					range 1..max;
+				}
+				configd:help "Maximum number of prefixes to accept from this entity (neighbor or peer-group)";
+			}
+			list threshold {
+				description "Threshold value (percentage) at which to generate a warning msg";
+				max-elements "1";
+				configd:help "Threshold value (percentage) at which to generate a warning msg";
+				key "tagnode";
+				leaf tagnode {
+					description "Threshold value (percentage) at which to generate a warning msg";
+					type uint32 {
+						range 1..100;
+					}
+					configd:help "Threshold value (percentage) at which to generate a warning msg";
+				}
+				leaf warning-only {
+					description "Only give warning message when limit is exceeded";
+					type empty;
+					configd:help "Only give warning message when limit is exceeded";
+				}
+			}
+		}
+	}
+
+
+	/* BGP Global parameters
+	bgp <as-num> parameters
+	   - cluster-id <text>
+	   - always-compare-med
+	   - default local-pref <0-4294967295>
+	   - confederation  (identifier <1-65535> | peer  <1-65535>)
+	   - graceful-restart [graceful-reset | restart-time <1-3600> | stalepath-time <1-3600>]
+	   - bestpath (as-path (confed | ignore) | compare-routerid |
+	                med (confed | missing-as-worst))
+	   - log-neighbor-changes
+	   - no-client-to-client-reflection
+	   - deterministic-med
+	   - router-id <x.x.x.x>
+	*/
+
+	grouping bgp-params-global-cluster-id {
+		leaf cluster-id {
+			description "Route-reflector cluster-id";
+			type types:ipv4-address;
+			must "(not(starts-with(current(), '127.')))" {
+				error-message "Invalid cluster-id (cannot configure a loopback address) ";
+			}
+			must "(current() != '0.0.0.0')" {
+				error-message "Invalid cluster-id (value cannot be 0.0.0.0)";
+			}
+			configd:help "Route-reflector cluster-id";
+		}
+	}
+
+	grouping bgp-params-global-always-compare-med {
+		leaf always-compare-med {
+			description "Always compare MEDs from different neighbors";
+			type empty;
+			configd:help "Always compare MEDs from different neighbors";
+		}
+	}
+
+	grouping bgp-params-global-default {
+		container default {
+			description "BGP defaults";
+			presence "Enables BGP defaults";
+			configd:help "BGP defaults";
+			leaf local-pref {
+				description "Default local preference (higher=more preferred)";
+				type uint32;
+				configd:help "Default local preference (higher=more preferred)";
+			}
+		}
+	}
+
+	grouping bgp-params-global-confederation-identifier {
+		leaf identifier {
+			description "Confederation AS identifier";
+			type uint32 {
+				range 1..max;
+			}
+			configd:help "Confederation AS identifier";
+		}
+	}
+
+	grouping bgp-params-global-confederation-peers {
+		leaf-list peers {
+			description "Peer ASes in the BGP confederation";
+			type uint32 {
+				range 1..max;
+			}
+			ordered-by "user";
+			configd:help "Peer ASes in the BGP confederation";
+			must "(../identifier)" {
+				error-message "You must set the confederation identifier";
+			}
+			must "(current() != ../../../tagnode)" {
+				error-message "Cannot set confederation peer ASN to local ASN";
+			}
+			must "(current() != (../identifier))" {
+				error-message "Confederation peer ASN cannot be equal to Confederation identifier";
+			}
+		}
+	}
+
+	/* This grouping contains relative path to nodes outside the group scope. It can only be used
+	   at a specific config level matching the relative path.
+	*/
+	grouping bgp-params-global-confederation {
+		container confederation {
+			description "AS confederation parameters";
+			presence "BGP Confederation config";
+			configd:help "AS confederation parameters";
+			uses bgp-params-global-confederation-identifier;
+			uses bgp-params-global-confederation-peers;
+		} /*confederation*/
+	}
+
+	grouping bgp-params-global-graceful-restart {
+		container graceful-restart {
+			description "Graceful restart capability parameters";
+			presence "Enables BGP Graceful-restart";
+			configd:help "Graceful restart capability parameters";
+			leaf graceful-reset {
+				description "Enable graceful reset capability";
+				type empty;
+				configd:help "Enable graceful reset capability";
+			}
+			leaf restart-time {
+				description "Max time needed for Neighbor(s) to restart";
+				type uint32 {
+					range 1..3600;
+				}
+				default "90";
+				configd:help "Max time needed for Neighbor(s) to restart";
+			}
+			leaf stalepath-time {
+				description "Maximum time to hold onto restarting peer's stale paths";
+				type uint32 {
+					range 1..3600;
+				}
+				default "360";
+				configd:help "Maximum time to hold onto restarting peer's stale paths";
+			}
+		} /*graceful-restart*/
+	}
+
+	grouping bgp-params-global-bestpath {
+		container bestpath {
+			description "Default bestpath selection mechanism";
+			presence "Enables bestpath selection mechanism";
+			configd:help "Default bestpath selection mechanism";
+			container med {
+				description "MED attribute comparison parameters";
+				presence "Enables MED attribute comparison";
+				configd:help "MED attribute comparison parameters";
+				container confed {
+					description "Compare MEDs among confederation paths";
+					presence "Compare MEDs among confederation paths";
+					configd:help "Compare MEDs among confederation paths";
+					leaf missing-as-worst {
+						description "Treat missing route as a MED as the least preferred one";
+						type empty;
+						configd:help "Treat missing route as a MED as the least preferred one";
+					}
+				}
+				leaf missing-as-worst {
+					description "Treat missing route as a MED as the least preferred one";
+					type empty;
+					configd:help "Treat missing route as a MED as the least preferred one";
+				}
+			}
+			container as-path {
+				description "AS-path attribute comparison parameters";
+				presence "Enables AS-path attribute comparison";
+				configd:help "AS-path attribute comparison parameters";
+				leaf ignore {
+					description "Ignore AS-path length in selecting a route";
+					type empty;
+					configd:help "Ignore AS-path length in selecting a route";
+				}
+				leaf confed {
+					description "Compare AS-path lengths including confederation sets & sequences";
+					type empty;
+					configd:help "Compare AS-path lengths including confederation sets & sequences";
+				}
+			}
+			leaf compare-routerid {
+				description "Compare the router-id for identical eBGP paths";
+				type empty;
+				configd:help "Compare the router-id for identical eBGP paths";
+			}
+		} /*bestpath*/
+	}
+
+	grouping bgp-params-global-log-neighbor-changes {
+		leaf log-neighbor-changes {
+			description "Log neighbor up/down changes and reset reason";
+			type empty;
+			configd:help "Log neighbor up/down changes and reset reason";
+		}
+	}
+
+	grouping bgp-params-global-med-out-delay {
+		leaf med-out-delay {
+			description "Max time to defer MED updates";
+			type uint32 {
+				range 10..600;
+			}
+			configd:help "Max time to defer MED updates";
+		}
+	}
+
+	grouping bgp-params-global-no-client-to-client-reflection {
+		container no-client-to-client-reflection {
+			description "Disable client to client route reflection";
+			configd:help "Disable client to client route reflection";
+			leaf all {
+				description "Disable all client to client route reflection";
+				type empty;
+				configd:help "Disable all client to client route reflection";
+			}
+			leaf-list cluster-id {
+				description "Configure intra-cluster reflection";
+				configd:help "Configure intra-cluster reflection";
+				type union {
+					type types:ipv4-address;
+					type enumeration {
+						enum "any";
+						configd:help "Configure intra-cluster reflection for any cluster id";
+					}
+				}
+				must "(not(starts-with(current(), '127.')))" {
+					error-message "Invalid cluster-id (cannot configure a loopback address) ";
+				}
+				must "(current() != '0.0.0.0')" {
+					error-message "Invalid cluster-id (value cannot be 0.0.0.0)";
+				}
+			}
+		}
+	}
+
+	grouping bgp-params-global-deterministic-med {
+		leaf deterministic-med {
+			description "Compare MEDs between different peers in the same AS";
+			type empty;
+			configd:help "Compare MEDs between different peers in the same AS";
+		}
+	}
+
+	grouping bgp-params-global-router-id {
+		leaf router-id {
+			description "BGP router id";
+			type types:ipv4-address;
+			must "(not((substring-before(., '.') >= 224) and " +
+				"(substring-before(string(current()), '.') <= 239)))" {
+				error-message "Invalid router-id (cannot be a multicast address)";
+			}
+			must "(not((substring-before(., '.') >= 240) and " +
+				"(substring-before(string(current()), '.') <= 255)))" {
+				error-message "Invalid router-id";
+			}
+			must "(not(starts-with(current(), '127.')))" {
+				error-message "Invalid router-id (cannot configure a loopback address) ";
+			}
+			must "(current() != '0.0.0.0')" {
+				error-message "Invalid router-id (value cannot be 0.0.0.0)";
+			}
+			configd:help "BGP router id";
+		}
+	}
+
+	grouping bgp-params-timers {
+		container timers {
+			description "BGP protocol timers";
+			presence "Enables BGP protocol timers";
+			configd:help "BGP protocol timers";
+			must "((holdtime = 0) or ((holdtime != 0) and (holdtime > keepalive)))" {
+				error-message "Hold time can be 0; or should be greater than keepalive time";
+			}
+			leaf holdtime {
+				description "BGP holdtime interval";
+				type uint32 {
+					range "0 | 3..65535";
+				}
+				configd:help "BGP holdtime interval";
+				default "90";
+			}
+			leaf keepalive {
+				description "Keepalive interval";
+				type uint32 {
+					range 0..65535;
+				}
+				default "30";
+				configd:help "Keepalive interval";
+			}
+		}
+	}
+
+	/*Peer-group and neighbor common settings (no families)
+	   - advertisement-interval <0-65535>
+	   - capability dynamic
+	   - disable-capability-negotiation
+	   - description <text>
+	   - ebgp-multihop [ max-hop <1-255>]
+	   - enforce-multihop
+           - enforce-first-as
+	   - local-as <1-4294967295>
+	   - passive
+	   - port <1-65535>
+	   - remote-as <1-4294967295>
+	   - shutdown
+	   - timers (holdtime <0|3-65535>  keepalive <0-65535>)
+	   - ttl-security <1-255>
+	   - update-source <text>
+	   - override-capability
+	   - password
+	   - strict-capability-match
+	   - vrrp-failover
+	   - cluster-id*/
+	/* This grouping contains relative path to nodes outside the group scope. It can only be used
+	   at a specific config level matching the relative path.
+	*/
+	grouping peer-grp-neighbor-common-options {
+		uses neighbor-vrrp-failover;
+		leaf strict-capability-match {
+			description "Enable strict capability negotiation";
+			type empty;
+			configd:help "Enable strict capability negotiation";
+			must "not(../override-capability)" {
+				error-message "You may not configure both strict-capability-match and override-capability";
+			}
+		}
+		leaf password {
+			description "BGP MD5 password";
+			type string {
+				length 1..80;
+			}
+			configd:secret "true";
+			configd:help "BGP MD5 password";
+		}
+		leaf override-capability {
+			description "Ignore capability negotiation with specified neighbor";
+            		/* This and strict-capability-match are mutually exclusive */
+			type empty;
+			configd:help "Ignore capability negotiation with specified neighbor";
+		}
+		list local-as {
+			max-elements "1";
+			description "Local AS to allow customization of AS number";
+			configd:help "Local AS to allow customization of AS number";
+			key "tagnode";
+			leaf tagnode {
+				type uint32 {
+					range 1..max;
+				}
+			}
+			must "not(../remote-as = ../../tagnode)" {
+				error-message "You may not configure local-as for an iBGP neighbor/peer-group";
+			}
+			must "not(tagnode = ../../tagnode)" {
+				error-message "You may not configure local-as the same as the true local AS";
+			}
+		}
+		container ttl-security {
+			description "Ttl security mechanism for this entity (neighbor or peer-group)";
+			presence "Enables TTL security";
+			configd:help "Ttl security mechanism for this entity (neighbor or peer-group)";
+			leaf hops {
+				description "Number of the maximum number of hops to the BGP peer";
+				type uint32 {
+					range 1..254;
+				}
+				configd:help "Number of the maximum number of hops to the BGP peer";
+			}
+			must "not(../remote-as = ../../tagnode)" {
+				error-message "You may not configure ttl-security for an iBGP neighbor/peer-group";
+			}
+		}
+		container capability {
+			description "Advertise capabilities to this entity (neighbor or peer-group)";
+			presence "Enables BGP capabilities";
+			configd:help "Advertise capabilities to this entity (neighbor or peer-group)";
+			leaf dynamic {
+				description "Advertise dynamic capability to this entity (neighbor or peer-group)";
+				type empty;
+				configd:help "Advertise dynamic capability to this entity (neighbor or peer-group)";
+			}
+		}
+		leaf disable-capability-negotiation {
+			description "Disable capability negotiation with this entity (neighbor or peer-group)";
+			type empty;
+			configd:help "Disable capability negotiation with this entity (neighbor or peer-group)";
+		}
+		leaf enforce-first-as {
+			description "Enforce first AS for eBGP neighbors";
+			type empty;
+			configd:help "Enforce that the first ASN belongs to the eBGP neighbor";
+			must "not(../remote-as = ../../tagnode)" {
+				error-message "You may not configure enforce-first-as for an iBGP neighbor/peer-group";
+			}
+		}
+		leaf enforce-multihop {
+			description "Enforce multihop for eBGP neighbors";
+			type empty;
+			configd:help "Enforce multihop for eBGP neighbors";
+			must "not(../remote-as = ../../tagnode)" {
+				error-message "You may not configure enforce-multihop for an iBGP neighbor/peer-group";
+			}
+		}
+		leaf description {
+			description "Description for this entity (neighbor or peer-group)";
+			type string {
+				length 1..80;
+			}
+			configd:help "Description for this entity (neighbor or peer-group)";
+		}
+		leaf update-source {
+			description "Source address or interface of routing updates";
+			type union {
+				type types:ipv4-address;
+				type types:ipv6-address;
+				type types:interface-ifname;
+			}
+			configd:help "Source address or interface of routing updates";
+		}
+		leaf advertisement-interval {
+			description "Minimum interval for sending routing updates";
+			type uint32 {
+				range 0..65535;
+			}
+			configd:help "Minimum interval for sending routing updates";
+		}
+		leaf passive {
+			description "Do not initiate a session with this entity (neighbor or peer-group)";
+			type empty;
+			configd:help "Do not initiate a session with this entity (neighbor or peer-group)";
+		}
+		leaf port {
+			description "Neighbor's/Peer-group's BGP port";
+			type uint32 {
+				range 1..65535;
+			}
+			configd:help "Neighbor's/Peer-group's BGP port";
+		}
+		leaf shutdown {
+			description "Administratively shut down neighbor";
+			type empty;
+			configd:help "Administratively shut down neighbor";
+		}
+		container timers {
+			description "Neighbor/Peer-group timers";
+			presence "Enables BGP timers";
+			configd:help "Neighbor/Peer-group timers";
+			must "((holdtime = 0) or ((holdtime != 0) and (holdtime > keepalive)))" {
+				error-message "Hold time can be 0; or should be greater than keepalive time";
+			}
+			leaf connect {
+				description "BGP connect timer for this entity (neighbor or peer-group)";
+				type uint32 {
+					range 1..65535;
+				}
+				configd:help "BGP connect timer for this entity (neighbor or peer-group)";
+			}
+			leaf holdtime {
+				description "BGP hold timer for this entity (neighbor or peer-group)";
+				type uint32 {
+					range "0 | 3..65535";
+				}
+				default "90";
+				configd:help "BGP hold timer for this entity (neighbor or peer-group)";
+			}
+			leaf keepalive {
+				description "BGP keepalive interval for this neighbor";
+				type uint32 {
+					range 0..65535;
+				}
+				default "30";
+				configd:help "BGP keepalive interval for this neighbor";
+			}
+		}
+		leaf ebgp-multihop {
+			description "Allow this eBGP neighbor to not be on a directly connected network";
+			type uint32 {
+				range 1..255;
+			}
+			configd:help "Allow this eBGP neighbor to not be on a directly connected network";
+			must "not(../remote-as = ../../tagnode)" {
+				error-message "You may not configure ebgp-multihop for an iBGP neighbor/peer-group";
+			}
+			must "not(../ttl-security)" {
+				error-message "You may not configure both ttl-security hops and ebgp-multihop";
+			}
+		}
+		leaf remote-as {
+			description "BGP AS number of neighbor or peer-group";
+			type uint32 {
+				range 1..max;
+			}
+			configd:help "Entity (peer-group or neighbor) BGP AS number [REQUIRED]";
+		}
+	}
+
+	/*Peer-group & neighbor common parameters
+	neighbor (<x.x.x.x>| <h:h:h:h:h:h:h:h>) | peer-group <text> [address-family (ipv4-unicast| ipv6-unicast)
+	   - allowas-in [number <1-10>]
+	   - attribute-unchanged [as-path]|[next-hop]|[med]
+	   - filter-list (import <text> | export <text>)
+	   - maximum-prefix <1-4294967295> [threshold | warning-only]
+	   - remove-private-as
+	   - route-reflector-client
+	   - disable-send-community (extended | standard)
+	   - weight <1-65535>
+	   - route-map (import <text> | export <text>)
+	   - default-originate [route-map <text>]
+	   - soft-reconfiguration inbound
+	   - unsuppress-map
+	   - capability orf prefix-list (both|receive|send))
+	   - route-server-client
+	   - nexthop-self*/
+	/*
+       This grouping contains relative path to nodes outside the group scope.
+       It can only be used at a specific config level matching the relative path.
+       Also, there are few config nodes like 'route-reflector-client' which is
+       referring to bgp AS number as 'tagnode'. So if this group has to be used in a
+       bgp instance model, we have to make sure that the instance model uses 'tagnode'
+       as the name for AS number. Please see comment in bgp routing-instance specific
+       Yang file in this regard.
+	*/
+	grouping peer-grp-neighbor-afi-common-settings {
+		uses neighbor-route-map;
+		uses neigh_filter_list;
+		container attribute-unchanged {
+			description "BGP attributes are sent unchanged";
+			configd:help "BGP attributes are sent unchanged";
+			presence "Enables attribute-unchanged";
+			must "count(*) > 0" {
+				error-message "attribute-unchanged cannot be empty";
+			}
+			leaf next-hop {
+				description "Send nexthop unchanged";
+				type empty;
+				must "(../../../../ebgp-multihop)" {
+					error-message "Nexthop unchanged can be configured only on multihop eBGP peers";
+				}
+				configd:help "Send nexthop unchanged";
+			}
+			leaf med {
+				description "Send multi-exit discriminator unchanged";
+				type empty;
+				configd:help "Send multi-exit discriminator unchanged";
+			}
+			leaf as-path {
+				description "Send AS path unchanged";
+				type empty;
+				configd:help "Send AS path unchanged";
+			}
+		}
+		leaf remove-private-as {
+			description "Remove private AS numbers from AS path in outbound route updates";
+			type empty;
+			configd:help "Remove private AS numbers from AS path in outbound route updates";
+			must "not(../../../remote-as = ../../../../tagnode)" {
+				error-message "You may not configure remove-private-as for an iBGP neighbor/peer-group";
+			}
+		}
+		leaf route-reflector-client {
+			description "Peer-group as a route reflector client";
+			type empty;
+			configd:help "Peer-group as a route reflector client";
+			must "not(../../../remote-as) or (../../../remote-as) = (../../../../tagnode)" {
+				error-message "You may not configure route-reflector-client for an eBGP neighbor/peer-group";
+			}
+		}
+		uses neigh_maximum_prefix;
+		container allowas-in {
+			description "Accept a route that contains the local-AS in the as-path";
+			presence "Enables allowas-in feature";
+			configd:help "Accept a route that contains the local-AS in the as-path";
+			leaf number {
+				description "Number of occurrences of AS number";
+				type uint32 {
+					range 1..10;
+				}
+				configd:help "Number of occurrences of AS number";
+			}
+		}
+
+		leaf weight {
+			description "Default weight for routes from this entity (neighbor or peer-group)";
+			type uint32 {
+				range 1..65535;
+			}
+			configd:help "Default weight for routes from this entity (neighbor or peer-group)";
+		}
+
+		container disable-send-community {
+			description "Disable sending community attributes to this peer-group";
+			configd:help "Disable sending community attributes to this peer-group";
+			presence "Enables disable-send-community";
+			must "count(*) > 0" {
+				error-message "disable-send-community cannot be empty";
+			}
+			leaf extended {
+				description "Disable sending extended community attributes to this entity (neighbor or peer-group)";
+				type empty;
+				configd:help "Disable sending extended community attributes to this entity (neighbor or peer-group)";
+			}
+			leaf standard {
+				description "Disable sending standard community attributes to this entity (neighbor or peer-group)";
+				type empty;
+				configd:help "Disable sending standard community attributes to this entity (neighbor or peer-group)";
+			}
+		}
+
+		container capability {
+			description "Advertise capabilities to this entity (neighbor or peer-group)";
+			presence "Enables BGP neighbor/peer-group AFI capabilities";
+			configd:help "Advertise capabilities to this entity (neighbor or peer-group)";
+			container orf {
+				description "Advertise ORF capability to this neighbor";
+				presence "Enables ORF capability at neighbor/peer-group AFI level";
+				configd:help "Advertise ORF capability to this neighbor";
+				container prefix-list {
+					description "Advertise prefix-list ORF capability to this entity (neighbor or peer-group)";
+					presence "Enables advertising prefix-list ORF capability";
+					configd:help "Advertise prefix-list ORF capability to this entity (neighbor or peer-group)";
+					leaf receive {
+						description "Capability to receive the ORF";
+						type empty;
+						configd:help "Capability to receive the ORF";
+					}
+					leaf send {
+						description "Capability to send the ORF";
+						type empty;
+						configd:help "Capability to send the ORF";
+					}
+				}
+			}
+		}
+
+		container soft-reconfiguration {
+			description "Soft reconfiguration for neighbor";
+			configd:help "Soft reconfiguration for neighbor";
+			leaf inbound {
+				description "Inbound soft reconfiguration for this entity (neighbor or peer-group) [REQUIRED]";
+				type empty;
+				configd:help "Inbound soft reconfiguration for this entity (neighbor or peer-group) [REQUIRED]";
+			}
+		}
+
+		container default-originate {
+			description "Send default route to this neighbor";
+			presence "Enables default-originate at neighbor/peer-group AFI level";
+			configd:help "Send default route to this neighbor";
+			uses route-map-group {
+				refine route-map {
+					configd:help "Route-map to specify criteria of the default";
+				}
+			}
+		}
+
+		leaf unsuppress-map {
+			description "Route-map to selectively unsuppress suppressed routes";
+			type leafref {
+				path "/policy:policy/policy-route:route/policy-route:route-map/policy-route:tagnode";
+			}
+			configd:help "Route-map to selectively unsuppress suppressed routes";
+		}
+
+		leaf nexthop-self {
+			description "Nexthop for routes sent to this peer-group to be the local router";
+			type empty;
+			configd:help "Nexthop for routes sent to this peer-group to be the local router";
+		}
+
+		leaf route-server-client {
+			description "Peer-group as route server client";
+			type empty;
+			configd:help "Peer-group as route server client";
+		}
+	}
+
+	/* BGP Global parameters supported under default VRF */
+	grouping bgp-params-global-default-vrf {
+		container parameters {
+			description "BGP Global parameters that can be configured under Default BGP Routing Instance";
+			presence "Enables BGP parameters";
+			configd:help "BGP parameters";
+			uses bgp-params-global-cluster-id;
+			uses bgp-params-global-always-compare-med;
+			uses bgp-params-global-default;
+			uses bgp-params-global-confederation;
+			uses bgp-params-global-graceful-restart;
+			uses bgp-params-global-bestpath;
+			uses bgp-params-global-log-neighbor-changes;
+			uses bgp-params-global-med-out-delay;
+			uses bgp-params-global-no-client-to-client-reflection;
+			uses bgp-params-global-deterministic-med;
+			uses bgp-params-global-router-id;
+		}
+		uses bgp-params-timers;
+	}
+
+
+	grouping bgp-params-peer-group {
+			list peer-group {
+				description "BGP Peer-group parameters";
+				configd:help "BGP peer-group";
+				key "tagnode";
+				leaf tagnode {
+					description "BGP peer-group";
+					type string;
+					configd:help "BGP peer-group";
+				}
+				uses peer-grp-neighbor-common-options {
+					refine local-as {
+						must "not(../../neighbor[address-family/*/peer-group = current()/../tagnode]/remote-as = ../../tagnode)" {
+							error-message "You may not configure local-as for a peer-group with iBGP member";
+						}
+						must "not(../../neighbor[address-family/*/peer-group = current()/../tagnode]/remote-as = current())" {
+							error-message "You may not configure local-as the same as a member's remote-as";
+						}
+					}
+					refine ttl-security {
+						must "not(../../neighbor[address-family/*/peer-group = current()/../tagnode]/remote-as = ../../tagnode)" {
+							error-message "You may not configure ttl-security for a peer-group with iBGP member";
+						}
+					}
+					refine enforce-multihop {
+						must "not(../../neighbor[address-family/*/peer-group = current()/../tagnode]/remote-as = ../../tagnode)" {
+							error-message "You may not configure enforce-multihop for a peer-group with iBGP member";
+						}
+					}
+					refine ebgp-multihop {
+						must "not(../../neighbor[address-family/*/peer-group = current()/../tagnode]/remote-as = ../../tagnode)" {
+							error-message "You may not configure ebgp-multihop for a peer-group with iBGP member";
+						}
+					}
+				}
+				container address-family {
+					description "BGP peer-group address-family parameters";
+					presence "Enables BGP peer-group address-family";
+					configd:help "BGP peer-group address-family parameters";
+					container ipv4-unicast {
+						description "BGP peer-group IPv4 unicast parameters";
+						presence "Enables BGP peer-group IPv4 unicast parameters";
+						configd:help "BGP peer-group IPv4 unicast parameters";
+						uses peer-grp-neighbor-afi-common-settings {
+							refine remove-private-as {
+								must "not(../../../../neighbor[address-family/*/peer-group = current()/../../../tagnode]/remote-as "+
+									 " = ../../../../../bgp/tagnode)" {
+									 error-message "You may not configure remove-private-as for a peer-group with iBGP member";
+								}
+							}
+							refine route-reflector-client {
+								must "not (../../../../neighbor[address-family/*/peer-group = current()/../../../tagnode]/remote-as) or "+
+									"(../../../../neighbor[address-family/*/peer-group = current()/../../../tagnode]/remote-as "+
+									" = ../../../../../bgp/tagnode)" {
+									error-message "You may not configure route-reflector-client for a peer-group with eBGP member";
+								}
+							}
+						}
+						uses neigh_peer_grp_ipv4_lists;
+					}
+					container ipv6-unicast {
+						description "BGP peer-group IPv6 unicast parameters";
+						presence "Enables BGP peer-group IPv6 unicast parameters";
+						configd:help "BGP peer-group IPv6 unicast parameters";
+						uses peer-grp-neighbor-afi-common-settings {
+							refine remove-private-as {
+								must "not(../../../../neighbor[address-family/*/peer-group = current()/../../../tagnode]/remote-as "+
+									 " = ../../../../../bgp/tagnode)" {
+									 error-message "You may not configure remove-private-as for a peer-group with iBGP member";
+								}
+							}
+							refine route-reflector-client {
+								must "not (../../../../neighbor[address-family/*/peer-group = current()/../../../tagnode]/remote-as) or "+
+									"(../../../../neighbor[address-family/*/peer-group = current()/../../../tagnode]/remote-as "+
+									" = ../../../../../bgp/tagnode)" {
+									error-message "You may not configure route-reflector-client for a peer-group with eBGP member";
+								}
+							}
+						}
+						uses neigh_peer_grp_ipv6_lists;
+					}
+
+				}
+				must "not(((address-family/*/route-reflector-client)) and" +
+				     "    (ebgp-multihop or enforce-multihop or ttl-security or local-as or (address-family/*/remove-private-as)))" {
+					error-message "You may not configure both eBGP and iBGP type parameters";
+				}
+			}
+	}
+
+	/* Neighbor adddress grouping - validation scripts to be added during refine */
+	grouping peer-address {
+		leaf tagnode {
+			type union {
+				type types:ipv4-address;
+				type types:ipv6-address;
+			}
+			configd:help "BGP neighbor";
+			must "not((starts-with(current(), 'fe8')) or (starts-with(current(), 'fe9')) or " +
+				  "(starts-with(current(), 'fea')) or (starts-with(current(), 'feb'))) or " +
+				 "(../update-source) or " +
+				 "(../../peer-group[tagnode = current()/../address-family/*/peer-group]/update-source)" {
+				 error-message "You must configure update-source for IPv6 link-local neighbors\n";
+			}
+			must "not((starts-with(current(), 'fe8')) or (starts-with(current(), 'fe9')) or " +
+				  "(starts-with(current(), 'fea')) or (starts-with(current(), 'feb'))) or " +
+				 "(not(../ebgp-multihop) and " +
+				 " not(../../peer-group[tagnode = current()/../address-family/*/peer-group]/ebgp-multihop))" {
+				 error-message "You may not configure ebgp-multihop for IPv6 link-local neighbor\n";
+			}
+			must "not((starts-with(current(), 'fe8')) or (starts-with(current(), 'fe9')) or " +
+				  "(starts-with(current(), 'fea')) or (starts-with(current(), 'feb'))) or " +
+				 "(not(../ttl-security) and " +
+				 " not(../../peer-group[tagnode = current()/../address-family/*/peer-group]/ttl-security))" {
+				 error-message "You may not configure ttl-security for IPv6 link-local neighbor\n";
+			}
+		}
+	}
+
+	/* This grouping contains relative path to nodes outside the group scope. It can only be used
+	   at a specific config level matching the relative path.
+	*/
+	grouping bgp-params-neighbor {
+			list neighbor {
+				description "BGP neighbor level configuration parameters";
+				configd:help "BGP neighbor";
+				key "tagnode";
+				uses peer-address;
+				uses peer-grp-neighbor-common-options {
+					refine strict-capability-match {
+						must "not(../../peer-group[tagnode = current()/../address-family/*/peer-group]/override-capability)" {
+							error-message "You may not configure strict-capability-match when override-capability is set in peer-group";
+						}
+					}
+					refine override-capability {
+						must "not(../../peer-group[tagnode = current()/../address-family/*/peer-group]/strict-capability-match)" {
+							error-message "You may not configure override-capability when strict-capability-match is set in peer-group";
+						}
+					}
+					refine local-as {
+						must "not(../address-family/*/peer-group)" {
+							error-message "You may not configure local-as for a neighbor in peer-group\n";
+						}
+					}
+					refine ttl-security {
+						must "not(../address-family/*/peer-group) or " +
+							 "not(../../peer-group[tagnode = current()/../address-family/*/peer-group]/remote-as = ../../tagnode)" {
+							error-message "You may not configure ttl-security for a neighbor in iBGP peer-group";
+						}
+						must "not(../../peer-group[tagnode = current()/../address-family/*/peer-group]/ebgp-multihop) or " +
+							 "((../../peer-group[tagnode = current()/../address-family/*/peer-group]/ebgp-multihop) = 1)" {
+							error-message "You may not configure ttl-security hop when ebgp-multihop is set in peer-group";
+						}
+					}
+					refine enforce-multihop {
+						must "not(../address-family/*/peer-group) or " +
+							 "not(../../peer-group[tagnode = current()/../address-family/*/peer-group]/remote-as = ../../tagnode)" {
+							error-message "You may not configure enforce-multihop for a neighbor in an iBGP peer-group";
+						}
+					}
+					refine port {
+						must "not(../address-family/*/peer-group)" {
+							error-message "You may not configure port for a neighbor in peer-group\n";
+						}
+					}
+					refine timers {
+						must "not(../address-family/*/peer-group)" {
+							error-message "You may not configure timer for a neighbor in peer-group\n";
+						}
+					}
+					refine ebgp-multihop {
+						must "not(../../peer-group[tagnode = current()/../address-family/*/peer-group]/remote-as = ../../tagnode)" {
+							error-message "You may not configure ebgp-multihop for a neighbor in an iBGP peer-group";
+						}
+						must "not(../../peer-group[tagnode = current()/../address-family/*/peer-group]/ttl-security)" {
+							error-message "You may not configure ebgp-multihop when ttl-security hop is set in peer-group";
+						}
+					}
+					refine remote-as {
+						must "not(current()/../address-family/*/peer-group) or " +
+							"(   (" +
+									"(current() = ../../tagnode) and " +
+									"not(../../neighbor[address-family/*/peer-group = current()/../address-family/*/peer-group]/remote-as != ../../tagnode)" +
+								") or " +
+								"(" +
+									"(current() != ../../tagnode) and " +
+									"not(../../neighbor[address-family/*/peer-group = current()/../address-family/*/peer-group]/remote-as = ../../tagnode)" +
+								")" +
+							")" {
+							error-message "All members of a peer-group must be either iBGP or eBGP";
+						}
+					}
+				}
+				must "(not(address-family) or remote-as or (../peer-group[tagnode = current()/address-family/*/peer-group]/remote-as))" {
+					error-message "remote-as must be configured either in neighbor or in peer-group";
+				}
+				must "not(remote-as and (../peer-group[tagnode = current()/address-family/*/peer-group]/remote-as))" {
+					error-message "You may not configure remote-as both in neighbor and peer-group";
+				}
+				container address-family {
+					description "Parameters relating to IPv4 or IPv6 routes";
+					presence "Enables BGP neighbor address-family";
+					configd:help "Parameters relating to IPv4 or IPv6 routes";
+					container ipv4-unicast {
+						description "BGP neighbor parameters";
+						presence "Enables BGP neighbor IPv4 parameters";
+						configd:help "BGP neighbor parameters";
+						uses peer-grp-neighbor-afi-common-settings {
+							refine filter-list/export {
+								must "not(../../peer-group)" {
+									error-message "You may not configure filter-list export for a neighbor in peer-group\n";
+								}
+							}
+							refine route-map/export {
+								must "not(../../peer-group)" {
+									error-message "You may not configure route-map export for a neighbor in peer-group\n";
+								}
+							}
+							refine attribute-unchanged {
+								must "not(../peer-group)" {
+									error-message "You may not configure attribute-unchanged for a neighbor in peer-group\n";
+								}
+							}
+							refine remove-private-as {
+								must "not(../peer-group)" {
+									error-message "You may not configure remove-private-as for a neighbor in peer-group\n";
+								}
+							}
+							refine route-reflector-client {
+								must "not(../peer-group)" {
+									error-message "You may not configure route-reflector-client for a neighbor in peer-group\n";
+								}
+							}
+							refine disable-send-community {
+								must "not(../peer-group)" {
+									error-message "You may not configure disable-send-community for a neighbor in peer-group\n";
+								}
+							}
+							refine capability/orf {
+								must "not(../../peer-group)" {
+									error-message "You may not configure capability orf for a neighbor in peer-group";
+								}
+							}
+							refine default-originate {
+								must "not(../peer-group)" {
+									error-message "You may not configure default-originate for a neighbor in peer-group\n";
+								}
+							}
+							refine unsuppress-map {
+								must "not(../peer-group)" {
+									error-message "You may not configure unsuppress-map for a neighbor in peer-group\n";
+								}
+							}
+							refine nexthop-self {
+								must "not(../peer-group)" {
+									error-message "You may not configure nexthop-self for a neighbor in peer-group\n";
+								}
+							}
+							refine route-server-client {
+								must "not(../peer-group)" {
+									error-message "You may not configure route-server-client for a neighbor in peer-group\n";
+								}
+							}
+						}
+						uses neigh_peer_grp_ipv4_lists {
+							refine distribute-list {
+								must "not(../../../../peer-group[tagnode = current()/../peer-group]/address-family/ipv4-unicast/prefix-list)" {
+									error-message "You may not configure distribute-list when prefix-list is set in peer-group";
+								}
+							}
+							refine prefix-list {
+								must "not(../../../../peer-group[tagnode = current()/../peer-group]/address-family/ipv4-unicast/distribute-list)" {
+									error-message "You may not configure prefix-list when distribute-list is set in peer-group";
+								}
+							}
+						}
+						leaf peer-group {
+							description "IPv4 peer group for this peer";
+							type leafref {
+							    path "../../../../peer-group/tagnode";
+							}
+							configd:help "IPv4 peer group for this peer";
+							must "../../../../peer-group[tagnode=current()]/address-family/ipv4-unicast" {
+								error-message 'You must configure address-family ipv4-unicast in peer-group';
+							}
+							must "not(../../ipv6-unicast/peer-group) or (current() = ../../ipv6-unicast/peer-group)" {
+								error-message 'You must configure same peer-group for all address-families';
+							}
+						}
+                                        }
+					container ipv6-unicast {
+						description "BGP neighbor parameters";
+						presence "Enables BGP neighbor IPv6 parameters";
+						configd:help "BGP neighbor parameters";
+						uses peer-grp-neighbor-afi-common-settings {
+							refine filter-list/export {
+								must "not(../../peer-group)" {
+									error-message "You may not configure filter-list export for a neighbor in peer-group\n";
+								}
+							}
+							refine route-map/export {
+								must "not(../../peer-group)" {
+									error-message "You may not configure route-map export for a neighbor in peer-group\n";
+								}
+							}
+							refine attribute-unchanged {
+								must "not(../peer-group)" {
+									error-message "You may not configure attribute-unchanged for a neighbor in peer-group\n";
+								}
+							}
+							refine remove-private-as {
+								must "not(../peer-group)" {
+									error-message "You may not configure remove-private-as for a neighbor in peer-group\n";
+								}
+							}
+							refine route-reflector-client {
+								must "not(../peer-group)" {
+									error-message "You may not configure route-reflector-client for a neighbor in peer-group\n";
+								}
+							}
+							refine disable-send-community {
+								must "not(../peer-group)" {
+									error-message "You may not configure disable-send-community for a neighbor in peer-group\n";
+								}
+							}
+							refine capability/orf {
+								must "not(../../peer-group)" {
+									error-message "You may not configure capability orf for a neighbor in peer-group";
+								}
+							}
+							refine default-originate {
+								must "not(../peer-group)" {
+									error-message "You may not configure default-originate for a neighbor in peer-group\n";
+								}
+							}
+							refine unsuppress-map {
+								must "not(../peer-group)" {
+									error-message "You may not configure unsuppress-map for a neighbor in peer-group\n";
+								}
+							}
+							refine nexthop-self {
+								must "not(../peer-group)" {
+									error-message "You may not configure nexthop-self for a neighbor in peer-group\n";
+								}
+							}
+							refine route-server-client {
+								must "not(../peer-group)" {
+									error-message "You may not configure route-server-client for a neighbor in peer-group\n";
+								}
+							}
+						}
+						uses neigh_peer_grp_ipv6_lists {
+							refine distribute-list {
+								must "not(../../../../peer-group[tagnode = current()/../peer-group]/address-family/ipv6-unicast/prefix-list)" {
+									error-message "You may not configure distribute-list when prefix-list is set in peer-group";
+								}
+							}
+							refine prefix-list {
+								must "not(../../../../peer-group[tagnode = current()/../peer-group]/address-family/ipv6-unicast/distribute-list)" {
+									error-message "You may not configure distribute-list when distribute-list is set in peer-group";
+								}
+							}
+						}
+						leaf peer-group {
+							description "IPv6 peer group for this peer";
+							type leafref {
+							    path "../../../../peer-group/tagnode";
+							}
+							must "../../../../peer-group[tagnode=current()]/address-family/ipv6-unicast" {
+								error-message "Please set address-family ipv6-unicast in peer-group";
+							}
+							configd:help "IPv6 peer group for this peer";
+						}
+					}
+                                }
+
+                        }
+        }
+
+	grouping bgp-params-address-family {
+			container address-family {
+				description "BGP address-level configuration parameters";
+				presence "Enables BGP address-family parameter";
+				configd:help "BGP address-family parameters";
+				container ipv4-unicast {
+					description "BGP IPv4 settings";
+					presence "Enables BGP IPv4 settings";
+					configd:help "BGP IPv4 settings";
+					container parameters {
+						description "BGP parameters for the ipv4-unicast address family";
+						presence "Enables BGP parameters for the ipv4-unicast address family";
+						configd:help "BGP parameters for the ipv4-unicast address family";
+						uses parameters-distance;
+						uses parameters-dampening;
+					}
+					uses ipv4-aggregate-address;
+					uses network-ipv4;
+					uses redistribute-ipv4;
+				}
+				container ipv6-unicast {
+					description "Enable BGP IPv6 settings";
+					presence "Enables BGP IPv6 settings";
+					configd:help "BGP IPv6 settings";
+					container parameters {
+						description "BGP parameters for the ipv6-unicast address family";
+						presence "Enables BGP parameters for the ipv6-unicast address family";
+						configd:help "BGP parameters for the ipv6-unicast address family";
+						uses parameters-distance;
+						uses parameters-dampening;
+					}
+					uses ipv6-aggregate-address;
+					uses network-ipv6;
+					uses redistribute-ipv6;
+				}
+			}
+	}
+
+	grouping bgp-protocol {
+		list bgp {
+			configd:priority "710";
+			description "BGP configuration parameters";
+			configd:help "Border Gateway Protocol (BGP) parameters";
+			must "(tagnode != 23456)" {
+				error-message "Invalid AS Number, 23456 (Reserved)";
+			}
+			must "count(../bgp/tagnode) <= 1" {
+				error-message "Another BGP instance is already running" ;
+			}
+			key "tagnode";
+			leaf tagnode {
+				description "BGP AS Number";
+				type uint32 {
+					range 1..max;
+				}
+				configd:help "Border Gateway Protocol (BGP) parameters";
+			}
+
+		uses bgp-params-global-default-vrf;
+		uses bgp-params-peer-group;
+		uses bgp-params-neighbor;
+		uses bgp-params-address-family;
+		}
+	}
+
+	/* Augmenting to protocols - default VRF */
+	augment /protocols:protocols {
+		uses bgp-protocol;
+	}
+
+	/* Augmenting trap notifications */
+	augment /service:service/service-snmp:snmp/service-snmp:notification {
+		container bgp {
+			description "BGP Notifications";
+			configd:help "BGP Notifications";
+			leaf all {
+				description "Enable BGP Notifications";
+				type empty;
+				configd:help "BGP Notifications";
+			}
+		}
+	}
+}
diff --git a/yang/vyatta-protocols-frr-ldp-v1.yang b/yang/vyatta-protocols-frr-ldp-v1.yang
new file mode 100644
index 0000000..92881be
--- /dev/null
+++ b/yang/vyatta-protocols-frr-ldp-v1.yang
@@ -0,0 +1,277 @@
+module vyatta-protocols-frr-ldp-v1 {
+	namespace "urn:vyatta.com:mgmt:vyatta-protocols-frr-ldp:1";
+	prefix protocols-frr-ldp;
+
+	import configd-v1 {
+		prefix configd;
+	}
+
+	import vyatta-types-v1 {
+		prefix types;
+	}
+
+	import vyatta-policy-v1 {
+		prefix policy;
+	}
+
+	import vyatta-policy-route-v1 {
+		prefix policy-route;
+	}
+
+	import vyatta-protocols-v1 {
+		 prefix protocols;
+	}
+
+	import vyatta-protocols-interface-validation-mpls-v1 {
+		prefix if-validation;
+	}
+
+	organization "AT&T, Inc.";
+	contact
+		"AT&T
+		 Postal: 208 S. Akard Street
+			 Dallas, TX 25202
+		 Web: www.att.com";
+
+	description
+		"Copyright (c) 2018-2019, AT&T Intellectual Property.
+		 All rights reserved.
+
+		 Copyright (c) 2016 IETF Trust and the persons identified
+		 as authors of the code.  All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, is permitted pursuant to, and subject
+		 to the license terms contained in, the Simplified BSD License
+		 set forth in Section 4.c of the IETF Trust's Legal Provisions
+		 Relating to IETF Documents
+		 (http://trustee.ietf.org/license-info).
+
+		 Parts of this YANG module are derived from IETF Draft
+		 draft-raza-mpls-ldp-mldp-yang-03.";
+
+	revision 2018-11-27 {
+		description "initial revision of version 1";
+	}
+
+	/*
+	 * Typedefs
+	 */
+
+	typedef access-list-ref {
+		type leafref {
+			path "/policy:policy/policy-route:route/policy-route:access-list/policy-route:tagnode";
+		}
+		description "A type for reference to an access list.";
+	}
+
+	/*
+	 * Groupings
+	 */
+
+	grouping basic-discovery-timers {
+		configd:help
+			"Basic discovery timer attributes.";
+		leaf hello-holdtime {
+			type uint16 {
+				range 15..3600;
+			}
+			units seconds;
+			default 15;
+			configd:help "LDP link Hello hold time (seconds)";
+			description
+				"The time interval for which a LDP link Hello adjacency
+				is maintained in the absence of link Hello messages from
+				the LDP neighbor";
+		}
+		leaf hello-interval {
+			type uint16 {
+				range 5..1200;
+			}
+			units seconds;
+			default 5;
+			configd:help "LDP link Hello interval (seconds)";
+			description
+				"The interval between consecutive LDP link Hello messages
+				used in basic LDP discovery";
+		}
+	} // basic-discovery-timers
+
+	grouping neighbor-attributes {
+		description "Neighbor configuration attributes.";
+		leaf session-ka-holdtime {
+			type uint16 {
+				range 30..3600;
+			}
+			units seconds;
+			default 30;
+			configd:help "LDP session keepalive hold time (seconds)";
+			description
+				"The time interval after which an inactive LDP session
+				terminates and the corresponding TCP session closes.
+				Inactivity is defined as not receiving LDP packets from the
+				neighbor.";
+		}
+	} // neighbor-attributes
+
+	grouping neighbor-authentication {
+		description "Neighbor authentication attributes.";
+		leaf md5-password {
+			type string {
+				length "1..80";
+			}
+			configd:secret "true";
+			configd:help "Assigns an encrypted MD5 password to an LDP neighbor";
+		} // md5-password
+	} // neighbor-authentication
+
+	grouping access-list-ref {
+		leaf access-list {
+			configd:help "Prefixes matching access-list";
+			description "Prefixes matching access-list.";
+			type access-list-ref;
+		}
+	}
+
+	grouping label-policy-advertise-attributes {
+		container advertise {
+			configd:help "Label advertising policies.";
+			container explicit-null {
+				presence "Send Explicit Null Label.";
+				configd:help "Send Explicit Null Label";
+				description
+					"Enables an egress router to advertise an
+					explicit null label (value 0) in place of an
+					implicit null label (value 3) to the
+					penultimate hop router.";
+			}
+			container for {
+				configd:help "Advertise specific prefixes";
+				description "Advertise specific prefixes.";
+				uses access-list-ref;
+			}
+		}
+	}
+
+	grouping label-policy-allocate-attributes {
+		container allocate {
+			configd:help "Label allocation policies.";
+			description "Label allocation policies.";
+			must "count(*) = 1" {
+				error-message "Exactly one allocation policy must be defined";
+			}
+			container for {
+				configd:help "Allocate for specific prefixes";
+				description "Allocate for specific prefixes.";
+				uses access-list-ref;
+			}
+			leaf host-routes {
+				configd:help "Allocate for host routes only";
+				description "Allocate for host routes only.";
+				type empty;
+			}
+		}
+	}
+
+	grouping policy-attributes {
+		description "LDP policy attributes.";
+		container label-policy {
+			configd:help "Label policy attributes.";
+			uses label-policy-advertise-attributes;
+			uses label-policy-allocate-attributes;
+		} // label-policy
+	} // policy-attributes
+
+	grouping discovery-attributes {
+		description "LDP discovery attributes.";
+		container discovery {
+			configd:help "Neighbor discovery configuration.";
+			container interfaces {
+				configd:help "A list of interfaces for basic discovery.";
+				list interface {
+					key "interface";
+					configd:help "List of LDP interfaces.";
+					uses if-validation:interface-mpls;
+					uses basic-discovery-timers;
+					must "hello-holdtime >= (hello-interval * 3)" {
+						error-message "Interface hello-holdtime must be at least 3x hello-interval.";
+					}
+				} // list interface
+			} // interfaces
+		} // discovery
+	} // discovery-attributes
+
+	/*
+	 * Configuration data nodes
+	 */
+	augment /protocols:protocols {
+		description "LDP augmentation.";
+		container mpls-ldp {
+			configd:help "MPLS Label Distribution Protocol (LDP)";
+			presence "Present for MPLS LDP configuration.";
+
+			leaf lsr-id {
+				type types:ipv4-address;
+				configd:help "Router ID.";
+			}
+			container address-family {
+				configd:help "Per-vrf per-af params.";
+				container ipv4 {
+					configd:help
+						"IPv4 address family.";
+					uses discovery-attributes;
+					uses neighbor-attributes;
+					uses policy-attributes;
+					leaf transport-address {
+						type types:ipv4-address;
+						configd:help
+							"The transport address advertised in LDP Hello messages.";
+					}
+				} // ipv4
+			}
+			container neighbors {
+				configd:help "Neighbors configuration attributes.";
+				list neighbor {
+					key "lsr-id";
+					configd:help "List of neighbors.";
+
+					leaf lsr-id {
+						type types:ipv4-address;
+						configd:help "List of neighbors.";
+					}
+					uses neighbor-authentication;
+					uses neighbor-attributes;
+				}
+			} // neighbors
+		} // container ldp
+	}
+}
diff --git a/yang/vyatta-protocols-frr-ospf-routing-instance-v1.yang b/yang/vyatta-protocols-frr-ospf-routing-instance-v1.yang
new file mode 100644
index 0000000..71e017a
--- /dev/null
+++ b/yang/vyatta-protocols-frr-ospf-routing-instance-v1.yang
@@ -0,0 +1,93 @@
+module vyatta-protocols-frr-ospf-routing-instance-v1 {
+	namespace "urn:vyatta.com:mgmt:vyatta-protocols-frr-ospf-routing-instance:1";
+	prefix vyatta-protocols-frr-ospf-routing-instance-v1;
+
+	import vyatta-protocols-v1 {
+		prefix protocols;
+	}
+	import configd-v1 {
+		prefix configd;
+	}
+	import vyatta-routing-v1 {
+		prefix routing-instance;
+	}
+	import vyatta-protocols-interface-validation-routing-instance-v1 {
+		prefix if-validation-routing-inst;
+	}
+	import vyatta-protocols-frr-ospf-v1 {
+		prefix ospf;
+	}
+
+	organization "AT&T, Inc.";
+	contact
+		"AT&T
+		Postal: 208 S. Akard Street
+		        Dallas, TX 25202
+		Web: www.att.com";
+
+	description
+		"Copyright (c) 2018-2019, AT&T Intellectual Property.
+		 All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+		 The YANG module package for vyatta-protocols-ospf-routing-instance-v1";
+
+	revision 2018-11-08 {
+		description "Initial revision of version 1";
+	}
+
+	augment /routing-instance:routing/routing-instance:routing-instance/routing-instance:protocols {
+		container ospf {
+			presence "OSPFv2 is enabled in a routing instance";
+			description "OSPFv2 support for VRF";
+			configd:help "OSPFv2 support for VRF";
+			uses ospf:ospf-parameters {
+				refine parameters/router-id {
+					must "count(/protocols:protocols/ospf:ospf/ospf:parameters[ospf:router-id = current()] | " +
+						"/routing-instance:routing/routing-instance:routing-instance/routing-instance:protocols/ospf/parameters[router-id = current()]) <= 1" {
+							error-message "Router-id is used by another process in router";
+					}
+				}
+			}
+			uses ospf:ospf-parameters-all;
+			uses if-validation-routing-inst:ospf-passive-intf-routing-inst {
+				refine passive-interface {
+					must 'not(starts-with(current(), "ers"))' {
+						error-message "Can't configure passive-interface on erspan interfaces";
+					}
+					configd:help "Suppress routing updates on an interface";
+					description "Suppress routing updates on an interface";
+					configd:allowed "/opt/vyatta/sbin/vyatta-interfaces.pl --show all --filter-out ^ers";
+				}
+			}
+		}
+	}
+}
diff --git a/yang/vyatta-protocols-frr-ospf-v1.yang b/yang/vyatta-protocols-frr-ospf-v1.yang
new file mode 100644
index 0000000..87a49a2
--- /dev/null
+++ b/yang/vyatta-protocols-frr-ospf-v1.yang
@@ -0,0 +1,1050 @@
+module vyatta-protocols-frr-ospf-v1 {
+	namespace "urn:vyatta.com:mgmt:vyatta-protocols-frr-ospf:1";
+	prefix vyatta-protocols-frr-ospf-v1;
+
+	import vyatta-protocols-v1 {
+		prefix protocols;
+	}
+	import vyatta-services-v1 {
+		prefix service;
+	}
+	import vyatta-service-snmp-v1 {
+		prefix service-snmp;
+	}
+	import vyatta-types-v1 {
+		prefix types;
+	}
+	import configd-v1 {
+		prefix configd;
+	}
+	import vyatta-interfaces-v1 {
+		prefix if;
+	}
+	import vyatta-interfaces-bridge-v1 {
+		prefix interfaces-bridge;
+	}
+	import vyatta-interfaces-dataplane-v1 {
+		prefix interfaces-dataplane;
+	}
+	import vyatta-interfaces-dataplane-unnumbered-v1 {
+		prefix interfaces-dataplane-unnumbered;
+	}
+	import vyatta-interfaces-l2tpeth-v1 {
+		prefix interfaces-l2tpeth;
+	}
+	import vyatta-interfaces-loopback-v1 {
+		prefix interfaces-loopback;
+	}
+	import vyatta-interfaces-openvpn-v1 {
+		prefix interfaces-openvpn;
+	}
+	import vyatta-interfaces-tunnel-v1 {
+		prefix interfaces-tunnel;
+	}
+	import vyatta-interfaces-vti-v1 {
+		prefix interfaces-vti;
+	}
+	import vyatta-interfaces-bonding-v1 {
+		prefix interfaces-bonding;
+	}
+	import vyatta-policy-v1 {
+		prefix policy;
+	}
+	import vyatta-policy-route-v1 {
+		prefix policy-route;
+	}
+	import vyatta-protocols-interface-validation-v1 {
+		prefix if-validation;
+	}
+
+	organization "AT&T, Inc.";
+	contact
+		"AT&T
+		Postal: 208 S. Akard Street
+		        Dallas, TX 25202
+		Web: www.att.com";
+	
+	description
+		"Copyright (c) 2018-2019, AT&T Intellectual Property.
+		 All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+		 The YANG module package for vyatta-protocols-frr-ospf-v1";
+
+	revision 2018-11-15 {
+		description "Initial revision of version 1";
+	}
+
+	typedef metric {
+		type uint32 {
+			range 0..16777214;
+		}
+	}
+
+	typedef metric-type {
+		type enumeration {
+			enum "1";
+			enum "2";
+		}
+	}
+
+	typedef distance {
+		type uint32 {
+			range 1..255;
+		}
+	}
+
+	typedef timer-val {
+		type uint32 {
+			range 1..65535;
+		}
+	}
+
+	typedef cost {
+		type uint32 {
+			range 0..16777214;
+		}
+	}
+
+	typedef abr-type {
+		type enumeration {
+			enum "cisco" {
+				configd:help "Cisco ABR type (default)";
+				description "Cisco ABR type (default)";
+			}
+			enum "ibm" {
+				configd:help "IBM ABR type";
+				description "IBM ABR type";
+			}
+			enum "shortcut" {
+				configd:help "Shortcut ABR type";
+				description "Shortcut ABR type";
+			}
+			enum "standard" {
+				configd:help "Standard ABR type";
+				description "Standard ABR type";
+			}
+		}
+	}
+
+	typedef network-type {
+		type enumeration {
+			enum "broadcast" {
+				configd:help "Broadcast network type";
+				description "Broadcast network type";
+			}
+			enum "non-broadcast" {
+				configd:help "Non-broadcast network type";
+				description "Non-broadcast network type";
+			}
+			enum "point-to-multipoint" {
+				configd:help "Point-to-multipoint network type";
+				description "Point-to-multipoint network type";
+			}
+			enum "point-to-point" {
+				configd:help "Point-to-point network type";
+				description "Point-to-point network type";
+			}
+		}
+	}
+	
+	typedef nssa-translate-role {
+		type enumeration {
+			enum "always" {
+				configd:help "NSSA-ABR to always translate";
+				description "NSSA-ABR to always translate";
+			}
+			enum "candidate" {
+				configd:help "NSSA-ABR for translate election (default)";
+				description "NSSA-ABR for translate election (default)";
+			}
+			enum "never" {
+				configd:help "NSSA-ABR do not translate";
+				description "NSSA-ABR do not translate";
+			}
+		}
+	}
+
+	grouping parameters-redistribute {
+		leaf metric-type {
+			type uint32 {
+				range 1..2;
+			}
+			configd:help "Metric type for redistributed routes";
+			description "Metric type for redistributed routes";
+			default "2";
+		}
+		leaf route-map {
+			type leafref {
+				path "/policy:policy/policy-route:route/policy-route:route-map/policy-route:tagnode";
+			}
+			configd:help "Route map reference";
+			description "Route map reference";
+		}
+		leaf metric {
+			type metric;
+			configd:help "Metric for redistributed routes";
+			description "Metric for redistributed routes";
+		}
+	}
+
+	grouping ospf-redistribute {
+		container redistribute {
+			configd:help "Redistribute information from another routing protocol";
+			description "Redistribute information from another routing protocol";
+			container bgp {
+				presence "true";
+				configd:help "Redistribute bgp routes";
+				description "Redistribute bgp routes";
+				uses parameters-redistribute;
+			}
+			container kernel {
+				presence "true";
+				configd:help "Redistribute kernel routes";
+				description "Redistribute kernel routes";
+				uses parameters-redistribute;
+			}
+			container rip {
+				presence "true";
+				configd:help "Redistribute RIPNG routes";
+				description "Redistribute RIPNG routes";
+				uses parameters-redistribute;
+			}
+			container connected {
+				presence "true";
+				configd:help "Redistribute connected routes";
+				description "Redistribute connected routes";
+				uses parameters-redistribute;
+			}
+			container static {
+				presence "true";
+				configd:help "Redistribute static routes";
+				description "Redistribute static routes";
+				uses parameters-redistribute;
+			}
+		}
+	}
+
+	grouping ospf-parameters {
+		container parameters {
+			presence "true";
+			configd:help "OSPF specific parameters";
+			leaf opaque-lsa {
+				type empty;
+				configd:help "Enable the Opaque-LSA capability (rfc2370)";
+				description "Enable the Opaque-LSA capability (rfc2370)";
+			}
+			leaf abr-type {
+				type abr-type;
+				configd:help "OSPF ABR type";
+				description "OSPF ABR type";
+				default "cisco";
+			}
+			leaf router-id {
+				type types:ipv4-address;
+				configd:help "Override the default router identifier";
+				description "Override the default router identifier";
+				must "(not(current() = '0.0.0.0'))" {
+					error-message "Invalid Router-ID";
+				}
+			}
+			leaf rfc1583-compatibility {
+				type empty;
+				configd:help "Enable rfc1583 criteria for handling AS external routes";
+				description "Enable rfc1583 criteria for handling AS external routes";
+			}
+		}
+	}
+
+	typedef access-list-ref {
+		type leafref {
+			path "/policy:policy/policy-route:route/policy-route:access-list/policy-route:tagnode";
+		}
+	}
+
+	grouping ospf-distribute-list {
+		container distribute-list {
+			configd:help "Filter networks in routing updates using access lists";
+			description "Filter networks in routing updates using access lists";
+			container export {
+				configd:help "Filter for outgoing routing updates";
+				description "Filter for outgoing routing updates";
+				leaf bgp {
+					type access-list-ref;
+					configd:help "Filter for outgoing routing updates for BGP routes";
+					description "Filter for outgoing routing updates for BGP routes";
+				}
+				leaf connected {
+					type access-list-ref;
+					configd:help "Filter for outgoing routing updates for connected routes";
+					description "Filter for outgoing routing updates for connected routes";
+				}
+				leaf kernel {
+					type access-list-ref;
+					configd:help "Filter for outgoing routing updates for kernel routes";
+					description "Filter for outgoing routing updates for kernel routes";
+				}
+				leaf rip {
+					type access-list-ref;
+					configd:help "Filter for outgoing routing updates for RIP routes";
+					description "Filter for outgoing routing updates for RIP routes";
+				}
+				leaf static {
+					type access-list-ref;
+					configd:help "Filter for outgoing routing updates for static routes";
+					description "Filter for outgoing routing updates for static routes";
+				}
+			}
+		}
+	}
+
+	grouping ospf-generic-parameters {
+		leaf default-metric {
+			type uint32 {
+				range 1..16777214;
+			}
+			configd:help "Metric of redistributed routes";
+			description "Metric of redistributed routes";
+		}
+		container refresh {
+			presence "true";
+			configd:help "Adjust refresh parameters";
+			description "Adjust refresh parameters";
+			leaf timers {
+				type uint32 {
+					range 10..1800;
+				}
+				default 10;
+				configd:help "Refresh timer";
+				description "Refresh timer";
+			}
+		}
+		container timers {
+			configd:help "Adjust timer parameters";
+			description "Adjust timer parameters";
+			container lsa {
+				configd:help "Adjust lsa timers";
+				description "Adjust lsa timers";
+				leaf arrival {
+					configd:help "Minimum delay that must pass between acceptance of the same LSA arriving from neighbors";
+					description "Minimum delay that must pass between acceptance of the same LSA arriving from neighbors";
+					default 1000;
+					type uint32 {
+						range 0..600000;
+					}
+					units "milliseconds";
+				}
+			}
+			container throttle {
+				configd:help "Adjust throttling parameters";
+				description "Adjust throttling parameters";
+				container lsa {
+					configd:help "Adjust LSA throttling parameters";
+					description "Adjust LSA throttling parameters";
+					leaf delay {
+						default 0;
+						type uint32 {
+							range 0..600000;
+						}
+						units "milliseconds";
+						configd:help "Initial delay";
+						description "Initial delay";
+					}
+				}
+				container spf {
+					configd:help "Adjust SPF throttling parameters";
+					description "Adjust SPF throttling parameters";
+					leaf delay {
+						default 500;
+						type uint32 {
+							range 0..600000;
+						}
+						units "milliseconds";
+						configd:help "Initial delay to schedule an SPF calculation after a topology change";
+						description "Initial delay to schedule an SPF calculation after a topology change";
+					}
+					leaf min-wait {
+						default 500;
+						type uint32 {
+							range 1..600000;
+						}
+						units "milliseconds";
+						configd:help "Minimum wait time between two SPF calculations";
+						description "Minimum wait time between two SPF calculations";
+					}
+					leaf max-wait {
+						default 50000;
+						type uint32 {
+							range 1..600000;
+						}
+						units "milliseconds";
+						configd:help "Maximum wait time between two SPF calculations";
+						description "Maximum wait time between two SPF calculations";
+					}
+					must "max-wait >= delay and max-wait >= min-wait" {
+						error-message "max-wait must be greater than or equal to both delay and min-wait";
+					}
+				}
+			}
+		}
+	}
+
+	grouping ospf-auto-cost {
+		container auto-cost {
+			presence "true";
+			configd:help "Calculate OSPF interface cost according to bandwidth";
+			description "Calculate OSPF interface cost according to bandwidth";
+			leaf reference-bandwidth {
+				type uint32 {
+					range 1..4294967;
+				}
+				configd:help "Reference bandwidth method to assign OSPF cost";
+				description "Reference bandwidth method to assign OSPF cost";
+				default "100";
+			}
+		}
+	}
+
+	grouping ospf-neighbor {
+		list neighbor {
+			configd:help "Neighbor IP address";
+			description "Neighbor IP address";
+			key "tagnode";
+			leaf tagnode {
+				type types:ipv4-address;
+				configd:help "Neighbor IP address";
+				description "Neighbor IP address";
+			}
+			leaf priority {
+				type uint32 {
+					range 0..255;
+				}
+				configd:help "Neighbor priority in seconds";
+				description "Neighbor priority in seconds";
+				default "0";
+			}
+			leaf poll-interval {
+				type timer-val;
+				configd:help "Dead neighbor polling interval";
+				description "Dead neighbor polling interval";
+				default "120";
+			}
+		}
+	}
+
+	grouping ospf-distance {
+		container distance {
+			presence "true";
+			configd:help "Administrative distance";
+			description "Administrative distance";
+			leaf global {
+				type distance;
+				configd:help "OSPF administrative distance";
+				description "OSPF administrative distance";
+			}
+			container ospf {
+				presence "true";
+				configd:help "OSPF administrative distance";
+				description "OSPF administrative distance";
+				leaf external {
+					type distance;
+					configd:help "Distance for external routes";
+					description "Distance for external routes";
+				}
+				leaf inter-area {
+					type distance;
+					configd:help "Distance for inter-area routes";
+					description "Distance for inter-area routes";
+				}
+				leaf intra-area {
+					type distance;
+					configd:help "Distance for intra-area routes";
+					description "Distance for intra-area routes";
+				}
+			}
+		}
+	}
+
+	grouping ospf-summary-address {
+		list summary-address {
+			configd:help "Summary network and mask";
+			description "Summary network and mask";
+			key "tagnode";
+			leaf tagnode {
+				type types:ipv4-prefix;
+				configd:help "Summary network and mask";
+				description "Summary network and mask";
+			}
+			container advertise {
+				presence "true";
+				configd:help "Summary address to be advertised.";
+				description "Summary address to be advertised.";
+				leaf tag {
+					type uint32;
+					configd:help "OSPF tag identifier for summary address.";
+					description "OSPF tag identifier for summary address.";
+				}
+				must "not(../not-advertise)" {
+					error-message "Can't configure both advertise and not-advertise for summary-address";
+				}
+			}
+			leaf not-advertise {
+				type empty;
+				configd:help "Summary address which shouldn't be advertised.";
+				description "Summary address which shouldn't be advertised.";
+				must "not(../advertise)" {
+					error-message "Can't configure both advertise and not-advertise for summary-address";
+				}
+			}
+		}
+	}
+
+	grouping ospf-default-information {
+		container default-information {
+			configd:help "Control distribution of default information";
+			description "Control distribution of default information";
+			container originate {
+				presence "true";
+				configd:help "Distribute a default route";
+				description "Distribute a default route";
+				leaf metric-type {
+					type metric-type;
+					default "2";
+					configd:help "OSPF metric type for default routes";
+					description "OSPF metric type for default routes";
+				}
+				leaf always {
+					type empty;
+					configd:help "Always advertise default route";
+					description "Always advertise default route";
+				}
+				leaf route-map {
+					type leafref {
+						path "/policy:policy/policy-route:route/policy-route:route-map/policy-route:tagnode";
+					}
+					configd:help "Route map reference";
+					description "Route map reference";
+				}
+				leaf metric {
+					type metric;
+					configd:help "OSPF default metric";
+					description "OSPF default metric";
+				}
+			}
+		}
+	}
+
+	grouping ospf-authentication {
+		container authentication {
+			presence "true";
+			configd:help "OSPF area or interface Authentication";
+			description "OSPF area or interface Authentication";
+			leaf plaintext-password {
+				type string {
+					length "1..8";
+					pattern '[^\t\n\r ]+' {
+						error-message "Plain-text key should not contain whitespace characters";
+					}
+				}
+				configd:secret "true";
+				configd:help "Plain text password";
+				description "Plain text password";
+			}
+			leaf plaintext {
+				type empty;
+				configd:help "Plain text authentication";
+				description "Plain text authentication";
+			}
+			leaf md5 {
+				type empty;
+				configd:help "MD5 key id";
+				description "MD5 key id";
+			}
+			list md5-key-id {
+				configd:help "MD5 key id";
+				description "MD5 key id";
+				key "tagnode";
+				leaf tagnode {
+					type uint32 {
+						range 1..255;
+					}
+					configd:help "MD5 key id";
+					description "MD5 key id";
+				}
+				leaf md5-key {
+					mandatory true;
+					type string {
+						length "1..16";
+						pattern '[^\t\n\r ]+' {
+							error-message "MD5 key should not contain whitespace characters";
+						}
+					}
+					configd:secret "true";
+					configd:help "MD5 key";
+					description "MD5 key";
+				}
+			}
+		}
+	}
+
+	grouping ospf-timers {
+		leaf dead-interval {
+			type timer-val;
+			configd:help "Interval after which a neighbor is declared dead";
+			description "Interval after which a neighbor is declared dead";
+			default "40";
+		}
+		leaf hello-interval {
+			type timer-val;
+			configd:help "Interval between hello packets";
+			description "Interval between hello packets";
+			default "10";
+		}
+		leaf retransmit-interval {
+			type timer-val;
+			configd:help "Interval between retransmitting lost link state advertisements";
+			description "Interval between retransmitting lost link state advertisements";
+			default "5";
+		}
+		leaf transmit-delay {
+			type timer-val;
+			configd:help "Link state transmit delay";
+			description "Link state transmit delay";
+			default "1";
+		}
+	}
+
+	grouping ospf-stub {
+		container stub {
+			presence "true";
+			configd:help "Stub OSPF area";
+			description "Stub OSPF area";
+			leaf default-cost {
+				type cost;
+				configd:help "Summary-default cost of stub area";
+				description "Summary-default cost of stub area";
+			}
+			leaf no-summary {
+				type empty;
+				configd:help "Do not inject inter-area routes into stub";
+				description "Do not inject inter-area routes into stub";
+			}
+		}
+	}
+
+	grouping ospf-nssa {
+		container nssa {
+			presence "true";
+			configd:help "Nssa OSPF area";
+			description "Nssa OSPF area";
+			leaf default-cost {
+				type cost;
+				configd:help "Summary-default cost of nssa area";
+				description "Summary-default cost of nssa area";
+			}
+			leaf translate {
+				type nssa-translate-role;
+				default "candidate";
+				configd:help "Nssa-abr";
+				description "Nssa-abr";
+			}
+			leaf no-summary {
+				type empty;
+				configd:help "Do not inject inter-area routes into stub";
+				description "Do not inject inter-area routes into stub";
+			}
+		}
+	}
+
+	grouping ospf-area {
+		list area {
+			configd:help "OSPF Area";
+			description "OSPF Area";
+			key "tagnode";
+			leaf tagnode {
+				type union {
+					type types:ipv4-address;
+					type uint32;
+				}
+				configd:help "OSPF Area";
+				description "OSPF Area";
+			}
+			must "not((virtual-link or area-type/*) and ((tagnode = '0') or (tagnode = '0.0.0.0')))" {
+				error-message "Cannot configure area 0 (0.0.0.0) with virtual link, nor as nssa or stub area type";
+			}
+
+			must "(count(area-type/* | virtual-link) <= 1) or (count(area-type/*) = 0)" {
+				error-message "Can only specify one of nssa, stub, or virtual-link";
+			}
+			leaf authentication {
+				type enumeration {
+					enum "plaintext" {
+						configd:help "Use plain-text authentication";
+						description "Use plain-text authentication";
+					}
+					enum "md5" {
+						configd:help "Use md5 authentication";
+						description "Use md5 authentication";
+					}
+				}
+				configd:help "OSPF area authentication type";
+				description "OSPF area authentication type";
+			}
+			list virtual-link {
+				configd:help "Virtual link";
+				description "Virtual link";
+				key "tagnode";
+				leaf tagnode {
+					type types:ipv4-address;
+					configd:help "Virtual link";
+					description "Virtual link";
+				}
+				uses ospf-authentication {
+					refine authentication/plaintext-password {
+						must "not(../md5)" {
+							error-message "md5 password is already set";
+						}
+					}
+					refine authentication/plaintext {
+						must "not(../md5)" {
+							error-message "md5 password is already set";
+						}
+					}
+					refine authentication/md5 {
+						must "not(../plaintext-password)" {
+							error-message "plaintext-password is already set";
+						}
+					}
+				}
+				uses ospf-timers;
+			}
+			container area-type {
+				presence "true";
+				configd:help "Area type";
+				description "Area type";
+				uses ospf-stub;
+				uses ospf-nssa;
+			}
+			leaf shortcut {
+				type enumeration {
+					enum "default" {
+						configd:help "Set default";
+						description "Set default";
+					}
+					enum "disable" {
+						configd:help "Disable shortcutting mode";
+						description "Disable shortcutting mode";
+					}
+					enum "enable" {
+						configd:help "Enable shortcutting mode";
+						description "Enable shortcutting mode";
+					}
+				}
+				configd:help "Area's shortcut mode";
+				description "Area's shortcut mode";
+			}
+			list range {
+				configd:help "Summarize routes matching prefix (border routers only)";
+				description "Summarize routes matching prefix (border routers only)";
+				key "tagnode";
+				leaf tagnode {
+					type types:ipv4-prefix {
+						configd:normalize "normalize ipv4-prefix";
+					}
+					configd:help "Summarize routes matching prefix (border routers only)";
+					description "Summarize routes matching prefix (border routers only)";
+				}
+				leaf not-advertise {
+					type empty;
+					configd:help "Do not advertise this range";
+					description "Do not advertise this range";
+					must "not(../metric)" {
+						error-message "Can't configure both not-advertise and metric for range";
+					}
+				}
+				leaf metric {
+					type metric;
+					configd:help "Metric to advertise for range";
+					description "Metric to advertise for range";
+					must "not(../not-advertise)" {
+						error-message "Can't configure both not-advertise and metric for range";
+					}
+				}
+			}
+			leaf-list network {
+				type types:ipv4-prefix {
+					configd:normalize "normalize ipv4-prefix";
+				}
+				ordered-by "user";
+				configd:help "OSPF network [REQUIRED]";
+				description "OSPF network [REQUIRED]";
+				must "count(../../area[network = current()]) <= 1" {
+					error-message "Network enabled in another area";
+				}
+			}
+		}
+	}
+
+	grouping ospf-overflow {
+		container overflow {
+			configd:help "Configure OSPF Overflow handling capabilities.";
+			description "Configure OSPF Overflow handling capabilities.";
+			container database {
+				configd:help "configure type of ospf overflow protection";
+				description "configure type of ospf overflow protection";
+				container hard {
+					configd:help "Hard limit on number of LSAs, instance will shut down if limit exceeded";
+					description "Hard limit on number of LSAs, instance will shut down if limit exceeded";
+					leaf limit {
+						type uint32 {
+							range 0..4294967294;
+						}
+						configd:help "Max LSAs in database.";
+						description "Max LSAs in database.";
+						must "not(../../soft/limit)" {
+							error-message "You cannot configure both a soft limit and hard limit concurrently. Please deconfigure one.";
+						}
+					}
+				}
+				container external {
+					presence "true";
+					configd:help "Max AS-External LSAs in database.";
+					description "Max AS-External LSAs in database.";
+					list limit {
+						configd:help "Max LSAs in database.";
+						description "Max LSAs in database.";
+						max-elements "1";
+						key "tagnode";
+						leaf tagnode {
+							type uint32 {
+								range 0..2147483647;
+							}
+							configd:help "Max LSAs in database.";
+							description "Max LSAs in database.";
+						}
+						leaf recovery {
+							type uint32 {
+								range 0..65535;
+							}
+							configd:help "Time to recover (0 implies no recovery)";
+							description "Time to recover (0 implies no recovery)";
+							default "0";
+						}
+					}
+				}
+				container soft {
+					configd:help "Soft limit on number of LSAs in database, will warn if exceeded";
+					description "Soft limit on number of LSAs in database, will warn if exceeded";
+					leaf limit {
+						type uint32 {
+							range 0..4294967294;
+						}
+						configd:help "Max LSAs in database.";
+						description "Max LSAs in database.";
+						must "not(../../hard/limit)" {
+							error-message "Please unconfigure hard limit first";
+						}
+					}
+				}
+			}
+		}
+	}
+
+	grouping ospf-parameters-all {
+		uses ospf-distribute-list;
+		uses ospf-generic-parameters;
+		uses ospf-auto-cost;
+		uses ospf-neighbor;
+		uses ospf-redistribute;
+		uses ospf-distance;
+		uses ospf-summary-address;
+		uses ospf-default-information;
+		uses ospf-area;
+		uses ospf-overflow;
+	}
+
+	grouping ospf-traffic-engineering {
+		leaf traffic-engineering {
+			type empty;
+			configd:help "Enable traffic engineering (rfc3630)";
+			description "Enable traffic engineering (rfc3630) for this process";
+		}
+	}
+
+	grouping itf-ip-ospf {
+		container ospf {
+			configd:help "Open Shortest Path First (OSPF) parameters";
+			description "Open Shortest Path First (OSPF) parameters";
+			presence "true";
+			must "not(../interfaces-dataplane-unnumbered:unnumbered) or ( network = 'point-to-point')" {
+				error-message "OSPF network type should be configured as point-to-point for unnumbered interfaces";
+			}
+			leaf priority {
+				type uint32 {
+					range 0..255;
+				}
+				configd:help "Router priority";
+				description "Router priority";
+				default "1";
+			}
+			uses ospf-authentication {
+				refine  authentication/plaintext-password {
+				}
+				refine authentication/plaintext {
+				}
+				refine  authentication/md5 {
+				}
+				refine authentication/md5-key-id/md5-key {
+				}
+			}
+			leaf mtu-ignore {
+				type empty;
+				configd:help "Disable Maximum Transmission Unit (MTU) mismatch detection";
+				description "Disable Maximum Transmission Unit (MTU) mismatch detection";
+			}
+			leaf dead-interval {
+				type timer-val;
+				configd:help "Interval after which neighbor is dead";
+				description "Interval after which neighbor is dead";
+				default "40";
+			}
+			leaf hello-interval {
+				type timer-val;
+				configd:help "Interval between hello packets";
+				description "Interval between hello packets";
+			}
+			leaf retransmit-interval {
+				type timer-val;
+				configd:help "Interval between retransmitting lost link state advertisements";
+				description "Interval between retransmitting lost link state advertisements";
+				default "5";
+			}
+			leaf cost {
+				type uint32 {
+					range 1..65535;
+				}
+				configd:help "Interface cost";
+				description "Interface cost";
+			}
+			leaf network {
+				type network-type;
+				configd:help "Network type";
+				description "Network type";
+				must "not(../../../interfaces-loopback:tagnode) or (current() = 'point-to-point')" {
+					error-message "Only point-to-point network is valid for loopback interfaces";
+				}
+			}
+			leaf transmit-delay {
+				type timer-val;
+				configd:help "Link state transmit delay";
+				description "Link state transmit delay";
+				default "1";
+			}
+		}
+	}
+
+	augment /protocols:protocols {
+		container ospf {
+			presence "Enable OSPF";
+			configd:help "Open Shortest Path First protocol (OSPF) parameters";
+			description "Open Shortest Path First protocol (OSPF) parameters";
+			uses ospf-parameters;
+			uses ospf-distribute-list;
+			uses if-validation:igp-passive-interface {
+				refine passive-interface {
+					configd:help "Suppress routing updates on an interface";
+					description "Suppress routing updates on an interface";
+				}
+			}
+			uses ospf-generic-parameters;
+			uses ospf-neighbor;
+			uses ospf-redistribute;
+			uses ospf-distance;
+			uses ospf-summary-address;
+			uses ospf-default-information;
+			uses ospf-area;
+			uses ospf-auto-cost;
+			uses ospf-overflow;
+			uses ospf-traffic-engineering {
+				refine traffic-engineering {
+					description "Enable traffic engineering (rfc3630) for the default process";
+				}
+			}
+		}
+	}
+	
+	/* Augmenting trap notifications */
+	augment /service:service/service-snmp:snmp/service-snmp:notification {
+		container ospf {
+			configd:help "OSPF Notifications";
+			description "OSPF Notifications";
+			leaf all {
+				type empty;
+				configd:help "OSPF Notifications";
+				description "OSPF Notifications";
+			}
+		}
+	}
+
+	augment /if:interfaces/interfaces-bridge:bridge/interfaces-bridge:ip {
+		uses itf-ip-ospf;
+	}
+	augment /if:interfaces/interfaces-dataplane:dataplane/interfaces-dataplane:ip {
+		uses itf-ip-ospf;
+	}
+	augment /if:interfaces/interfaces-dataplane:dataplane/interfaces-dataplane:vif/interfaces-dataplane:ip {
+		uses itf-ip-ospf;
+	}
+	augment /if:interfaces/interfaces-l2tpeth:l2tpeth/interfaces-l2tpeth:ip {
+		uses itf-ip-ospf;
+	}
+	augment /if:interfaces/interfaces-l2tpeth:l2tpeth/interfaces-l2tpeth:vif/interfaces-l2tpeth:ip {
+		uses itf-ip-ospf;
+	}
+	augment /if:interfaces/interfaces-loopback:loopback/interfaces-loopback:ip {
+		uses itf-ip-ospf;
+	}
+	augment /if:interfaces/interfaces-openvpn:openvpn/interfaces-openvpn:ip {
+		uses itf-ip-ospf;
+	}
+	augment /if:interfaces/interfaces-tunnel:tunnel/interfaces-tunnel:ip {
+		uses itf-ip-ospf;
+	}
+	augment /if:interfaces/interfaces-vti:vti/interfaces-vti:ip {
+		uses itf-ip-ospf;
+	}
+	augment /if:interfaces/interfaces-bonding:bonding/interfaces-bonding:ip {
+		uses itf-ip-ospf;
+	}
+	augment /if:interfaces/interfaces-bonding:bonding/interfaces-bonding:vif/interfaces-bonding:ip {
+		uses itf-ip-ospf;
+	}
+}
diff --git a/yang/vyatta-protocols-frr-ospfv3-v1.yang b/yang/vyatta-protocols-frr-ospfv3-v1.yang
new file mode 100644
index 0000000..21d1306
--- /dev/null
+++ b/yang/vyatta-protocols-frr-ospfv3-v1.yang
@@ -0,0 +1,520 @@
+module vyatta-protocols-frr-ospfv3-v1 {
+	namespace "urn:vyatta.com:mgmt:vyatta-protocols-frr-ospfv3:1";
+	prefix vyatta-protocols-frr-ospfv3-v1;
+
+	import vyatta-types-v1 {
+		prefix types;
+	}
+	import vyatta-protocols-v1 {
+		prefix protocols;
+	}
+	import configd-v1 {
+		prefix configd;
+	}
+	import vyatta-policy-v1 {
+		prefix policy;
+	}
+	import vyatta-policy-route-v1 {
+		prefix policy-route;
+	}
+	import vyatta-interfaces-v1 {
+		prefix if;
+	}
+	import vyatta-interfaces-bridge-v1 {
+		prefix if-bridge;
+	}
+	import vyatta-interfaces-dataplane-v1 {
+		prefix if-dataplane;
+	}
+	import vyatta-interfaces-l2tpeth-v1 {
+		prefix if-l2tpeth;
+	}
+	import vyatta-interfaces-loopback-v1 {
+		prefix if-loopback;
+	}
+	import vyatta-interfaces-openvpn-v1 {
+		prefix if-openvpn;
+	}
+	import vyatta-interfaces-tunnel-v1 {
+		prefix if-tunnel;
+	}
+	import vyatta-interfaces-vti-v1 {
+		prefix if-vti;
+	}
+	import vyatta-interfaces-bonding-v1 {
+		prefix if-bonding;
+	}
+
+	organization "AT&T, Inc.";
+	contact
+		"AT&T
+		 Postal: 208 S. Akard Street
+		         Dallas, TX 25202
+		 Web: www.att.com";
+
+	description
+		"Copyright (c) 2018-2019, AT&T Intellectual Property.
+		 All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+		 The YANG module package for vyatta-protocols-ospfv3-v1";
+
+	revision 2018-09-20 {
+		description "Initial version";
+	}
+
+	typedef metric {
+		type uint32 {
+			range 0..16777214;
+		}
+	}
+
+	typedef distance {
+		type uint32 {
+			range 1..254;
+		}
+	}
+
+	typedef timer-val {
+		type uint32 {
+			range 1..65535;
+		}
+	}
+
+	typedef spf-and-stability-interval {
+		type uint32 {
+			range 0..2147483647;
+		}
+	}
+
+	typedef cost {
+		type uint32 {
+			range 1..65535;
+		}
+	}
+
+	typedef network-type {
+		type enumeration {
+			enum "broadcast" {
+				configd:help "Broadcast network type";
+				description "Broadcast network type";
+			}
+			enum "point-to-point" {
+				configd:help "Point-to-point network type";
+				description "Point-to-point network type";
+			}
+		}
+	}
+
+	grouping parameters_redistribute {
+		leaf route-map {
+			type leafref {
+				path "/policy:policy/policy-route:route/policy-route:route-map/policy-route:tagnode";
+			}
+			configd:help "Route map reference";
+			description "Route map reference";
+		}
+	}
+
+	grouping redistribute-protocols {
+		container bgp {
+			presence "true";
+			configd:help "Redistribute bgp routes";
+			description "Redistribute bgp routes";
+			uses parameters_redistribute;
+		}
+		container kernel {
+			presence "true";
+			configd:help "Redistribute kernel routes";
+			description "Redistribute kernel routes";
+			uses parameters_redistribute;
+		}
+		container rip {
+			presence "true";
+			configd:help "Redistribute RIPNG routes";
+			description "Redistribute RIPNG routes";
+			uses parameters_redistribute;
+		}
+		container connected {
+			presence "true";
+			configd:help "Redistribute connected routes";
+			description "Redistribute connected routes";
+			uses parameters_redistribute;
+		}
+		container static {
+			presence "true";
+			configd:help "Redistribute static routes";
+			description "Redistribute static routes";
+			uses parameters_redistribute;
+		}
+	}
+
+	grouping ospfv3-redistribute {
+		container redistribute {
+			presence "true";
+			configd:help "Redistribute information from another routing protocol";
+			description "Redistribute information from another routing protocol";
+			uses redistribute-protocols;
+		}
+	}
+
+	grouping spf-timers {
+		container timers {
+			presence "true";
+			configd:help "OSPFv3 protocol configuration for timers";
+			description "OSPFv3 protocol configuration for timers";
+			container spf {
+				presence "true";
+				configd:help "OSPFv3 protocol configuration for SPF calculation";
+				description "OSPFv3 protocol configuration for SPF calculation";
+				container exp {
+					presence "true";
+					configd:help "OSPFv3 protocol configuration for exp backoff delays";
+					description "OSPFv3 protocol configuration for exp backoff delays";
+					must "(min <= max)" {
+						error-message "Max delay must be greater or equal to Min delay value";
+					}
+					leaf max {
+						type spf-and-stability-interval;
+						configd:help "Maximum delay between receiving change to SPF calculation";
+						description "Maximum delay between receiving change to SPF calculation";
+						default "50000";
+					}
+					leaf min {
+						type spf-and-stability-interval;
+						configd:help "Minimum delay between receiving change to SPF calculation";
+						description "Minimum delay between receiving change to SPF calculation";
+						default "500";
+					}
+				}
+			}
+		}
+	}
+
+	grouping ospfv3-generic-parameters {
+		leaf default-metric {
+			type uint32 {
+				range 1..16777214;
+			}
+			configd:help "default-metric";
+			description "default-metric";
+		}
+	}
+
+	grouping ospfv3-generic-parameters-1 {
+		container auto-cost {
+			presence "true";
+			configd:help "Set reference bandwidth";
+			description "Set reference bandwidth";
+			leaf reference-bandwidth {
+				type uint32 {
+					range 1..4294967;
+				}
+				configd:help "Reference bandwidth method to assign OSPF cost";
+				description "Reference bandwidth method to assign OSPF cost";
+				default "100";
+			}
+		}
+		leaf router-id {
+			type types:ipv4-address;
+			configd:help "Router identifier";
+			description "Router identifier";
+			must "(not(current() = '0.0.0.0'))" {
+				error-message "Invalid Router-ID";
+			}
+		}
+	}
+
+	grouping ospfv3-distance {
+		container distance {
+			presence "true";
+			configd:help "Administrative distance";
+			description "Administrative distance";
+			leaf global {
+				type distance;
+				configd:help "OSPF administrative distance";
+				description "OSPF administrative distance";
+			}
+			container ospfv3 {
+				presence "true";
+				configd:help "OSPF administrative distance";
+				description "OSPF administrative distance";
+				leaf external {
+					type distance;
+					configd:help "Distance for external routes";
+					description "Distance for external routes";
+				}
+				leaf inter-area {
+					type distance;
+					configd:help "Distance for inter-area routes";
+					description "Distance for inter-area routes";
+				}
+				leaf intra-area {
+					type distance;
+					configd:help "Distance for intra-area routes";
+					description "Distance for intra-area routes";
+				}
+			}
+		}
+	}
+
+	grouping ospfv3-timers {
+		leaf dead-interval {
+			type timer-val;
+			configd:help "Interval after which a neighbor is declared dead";
+			description "Interval after which a neighbor is declared dead";
+		}
+		leaf hello-interval {
+			type timer-val;
+			configd:help "Interval between hello packets";
+			description "Interval between hello packets";
+		}
+		leaf retransmit-interval {
+			type timer-val;
+			configd:help "Interval between retransmitting lost link state advertisements";
+			description "Interval between retransmitting lost link state advertisements";
+		}
+		leaf transmit-delay {
+			type timer-val;
+			configd:help "Link state transmit delay";
+			description "Link state transmit delay";
+		}
+	}
+
+	grouping ospfv3-stub {
+		container stub {
+			presence "true";
+			configd:help "Stub area";
+			description "Stub area";
+			leaf no-summary {
+				type empty;
+				configd:help "Do not inject inter-area routes into stub";
+				description "Do not inject inter-area routes into stub";
+			}
+		}
+	}
+
+	grouping ospfv3-range {
+		list range {
+			configd:help "Area address range";
+			description "Area address range";
+			key "tagnode";
+			leaf tagnode {
+				type types:ipv6-prefix {
+					configd:normalize "normalize ipv6-prefix";
+				}
+				configd:help "Area address range";
+				description "Area address range";
+			}
+			leaf advertise {
+				type empty;
+				configd:help "Advertise this range";
+				description "Advertise this range";
+				must "not(../not-advertise)" {
+					error-message "advertise and not-advertise cannot co-exist";
+				}
+			}
+			leaf not-advertise {
+				type empty;
+				configd:help "Do not advertise this range";
+				description "Do not advertise this range";
+			}
+			leaf metric {
+				type metric;
+				configd:help "Metric to advertise for range";
+				description "Metric to advertise for range";
+				must "not(../not-advertise)" {
+					error-message "metric and not-advertise cannot co-exist";
+				}
+			}
+		}
+	}
+
+	grouping ospfv3-area {
+		list area {
+			configd:help "OSPFv3 Area";
+			description "OSPFv3 Area";
+			key "tagnode";
+			leaf tagnode {
+				type union {
+					type types:ipv4-address;
+					type uint32;
+				}
+				must "not(current() = '0.0.0.0' or current() = 0) or not(../stub)" {
+					error-message "Cannot configure area 0 (0.0.0.0) with stub area type";
+				}
+				configd:help "OSPFv3 Area";
+				description "OSPFv3 Area";
+			}
+			uses ospfv3-stub;
+			uses ospfv3-range;
+                        list interface {
+                                configd:help "Enable interface in area";
+                                description "Enable interface in area";
+                                key tagnode;
+                                leaf tagnode {
+                                        type string;
+                                        must "(current() = /if:interfaces/*/*[(local-name(.) = 'tagnode') or (local-name(.) = 'ifname')] "
+                                                + "or /if:interfaces/*/*[local-name(.) = 'vif'][./../* = substring-before(current(), '.')]"
+                                                + "/*[(local-name(.) = 'tagnode') or (local-name(.) = 'ifname')][. = substring-after(current(), '.')])" {
+                                                error-message "Interface name must refer to an existing interface name";
+                                        }
+                                }
+                        }
+		}
+	}
+
+	augment /protocols:protocols {
+		container ospfv3 {
+			presence "true";
+			configd:help "Open Shortest Path First version 3 protocol (OSPFv3) parameters";
+			description "Open Shortest Path First version 3 protocol (OSPFv3) parameters";
+			uses spf-timers;
+			uses ospfv3-redistribute;
+			uses ospfv3-distance;
+			uses ospfv3-area;
+			uses ospfv3-generic-parameters-1;
+		}
+	}
+
+	grouping ospfv3-itf-parameters {
+		leaf priority {
+			type uint32 {
+				range 0..255;
+			}
+			configd:help "Router priority (default 1)";
+			description "Router priority (default 1)";
+		}
+	}
+
+	grouping ospfv3-itf-timers {
+		leaf dead-interval {
+			type timer-val;
+			configd:help "Interval after which neighbor is declared dead (default 40)";
+			description "Interval after which neighbor is declared dead (default 40)";
+		}
+		leaf hello-interval {
+			type timer-val;
+			configd:help "Interval between hello packets (default 10)";
+			description "Interval between hello packets (default 10)";
+		}
+		leaf retransmit-interval {
+			type uint32 {
+				range 3..65535;
+			}
+			configd:help "Interval between retransmitting lost link state advertisements (default 5)";
+			description "Interval between retransmitting lost link state advertisements (default 5)";
+		}
+	}
+
+	grouping ospfv3-itf-parameters-1 {
+		leaf cost {
+			type cost;
+			configd:help "Interface cost";
+			description "Interface cost";
+		}
+		list network {
+			max-elements "1";
+			configd:help "Network type";
+			description "Network type";
+			key "tagnode";
+			leaf tagnode {
+				type network-type;
+				configd:help "Network type";
+				description "Network type";
+			}
+		}
+		leaf transmit-delay {
+			type timer-val;
+			configd:help "Link state transmit delay (default 1)";
+			description "Link state transmit delay (default 1)";
+		}
+	}
+
+	grouping ospfv3-itf-mtu-ignore {
+		leaf mtu-ignore {
+			type empty;
+			configd:help "Disable Maximum Transmission Unit mismatch detection";
+			description "Disable Maximum Transmission Unit mismatch detection";
+		}
+	}
+
+	grouping itf-ipv6-ospfv3 {
+		container ospfv3 {
+			configd:help "Set OSPFv3 instance parameters";
+			description "Set OSPFv3 instance parameters";
+			uses ospfv3-itf-parameters;
+			uses ospfv3-itf-mtu-ignore;
+			uses ospfv3-itf-timers;
+			uses ospfv3-itf-parameters-1 {
+				refine network {
+					must "not(../../../if-loopback:tagnode) or (current() = 'point-to-point')" {
+						error-message "Only point-to-point network is valid for loopback interfaces";
+					}
+				}
+			}
+		}
+	}
+
+	augment /if:interfaces/if-bridge:bridge/if-bridge:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+	augment /if:interfaces/if-dataplane:dataplane/if-dataplane:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+	augment /if:interfaces/if-dataplane:dataplane/if-dataplane:vif/if-dataplane:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+	augment /if:interfaces/if-l2tpeth:l2tpeth/if-l2tpeth:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+	augment /if:interfaces/if-l2tpeth:l2tpeth/if-l2tpeth:vif/if-l2tpeth:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+	augment /if:interfaces/if-loopback:loopback/if-loopback:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+	augment /if:interfaces/if-openvpn:openvpn/if-openvpn:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+	augment /if:interfaces/if-tunnel:tunnel/if-tunnel:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+	augment /if:interfaces/if-vti:vti/if-vti:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+	augment /if:interfaces/if-bonding:bonding/if-bonding:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+	augment /if:interfaces/if-bonding:bonding/if-bonding:vif/if-bonding:ipv6 {
+		uses itf-ipv6-ospfv3;
+	}
+}
diff --git a/yang/vyatta-protocols-frr-switch-vif-ospf-v1.yang b/yang/vyatta-protocols-frr-switch-vif-ospf-v1.yang
new file mode 100644
index 0000000..237a1a7
--- /dev/null
+++ b/yang/vyatta-protocols-frr-switch-vif-ospf-v1.yang
@@ -0,0 +1,64 @@
+module vyatta-protocols-frr-switch-vif-ospf-v1 {
+	namespace "urn:vyatta.com:mgmt:vyatta-protocols-frr-switch-vif-ospf:1";
+	prefix vyatta-protocols-switch-vif-ospf-v1;
+
+	import vyatta-interfaces-v1 {
+		prefix if;
+	}
+	import vyatta-interfaces-switch-v1 {
+		prefix interfaces-switch;
+	}
+	import vyatta-protocols-frr-ospf-v1 {
+		prefix protocols-ospf;
+	}
+
+	organization "AT&T, Inc.";
+	contact
+		"AT&T
+		Postal: 208 S. Akard Street
+		        Dallas, TX 25202
+		Web: www.att.com";
+
+	description
+		"Copyright (c) 2018-2019, AT&T Intellectual Property.
+		 All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+		 The YANG module for enabling ospf on switch VLAN interfaces.";
+
+	revision 2018-11-09 {
+		description "Initial version";
+	}
+
+	augment /if:interfaces/interfaces-switch:switch/interfaces-switch:vif/interfaces-switch:ip {
+		uses protocols-ospf:itf-ip-ospf;
+	}
+}
diff --git a/yang/vyatta-protocols-frr-switch-vif-ospfv3-v1.yang b/yang/vyatta-protocols-frr-switch-vif-ospfv3-v1.yang
new file mode 100644
index 0000000..2e58a7a
--- /dev/null
+++ b/yang/vyatta-protocols-frr-switch-vif-ospfv3-v1.yang
@@ -0,0 +1,64 @@
+module vyatta-protocols-frr-switch-vif-ospfv3-v1 {
+	namespace "urn:vyatta.com:mgmt:vyatta-protocols-frr-switch-vif-ospfv3:1";
+	prefix vyatta-protocols-frr-switch-vif-ospfv3-v1;
+
+	import vyatta-interfaces-v1 {
+		prefix if;
+	}
+	import vyatta-interfaces-switch-v1 {
+		prefix interfaces-switch;
+	}
+	import vyatta-protocols-frr-ospfv3-v1 {
+		prefix protocols-ospfv3;
+	}
+
+	organization "AT&T, Inc.";
+	contact
+		"AT&T
+		Postal: 208 S. Akard Street
+		        Dallas, TX 25202
+		Web: www.att.com";
+
+	description
+		"Copyright (c) 2018-2019, AT&T Intellectual Property.
+		 All rights reserved.
+
+		 Redistribution and use in source and binary forms, with or
+		 without modification, are permitted provided that the following
+		 conditions are met:
+
+		 1. Redistributions of source code must retain the above copyright
+			notice, this list of conditions and the following disclaimer.
+		 2. Redistributions in binary form must reproduce the above
+			copyright notice, this list of conditions and the following
+			disclaimer in the documentation and/or other materials provided
+			with the distribution.
+		 3. Neither the name of the copyright holder nor the names of its
+			contributors may be used to endorse or promote products derived
+			from this software without specific prior written permission.
+
+		 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+		 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+		 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+		 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+		 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+		 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+		 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+		 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+		 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+		 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+		 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+		 POSSIBILITY OF SUCH DAMAGE.
+
+		 SPDX-License-Identifier: BSD-3-Clause
+
+		 The YANG module for enabling ospfv3 on switch VLAN interfaces.";
+
+	revision 2018-11-09 {
+		description "Initial version";
+	}
+
+	augment /if:interfaces/interfaces-switch:switch/interfaces-switch:vif/interfaces-switch:ipv6 {
+		uses protocols-ospfv3:itf-ipv6-ospfv3;
+	}
+}