plugins types UPDATE plugin for edit-config inset keys predicate
diff --git a/models/yang@2022-06-16.yang b/models/yang@2022-06-16.yang
new file mode 100644
index 0000000..0d41360
--- /dev/null
+++ b/models/yang@2022-06-16.yang
@@ -0,0 +1,194 @@
+module yang {
+  namespace "urn:ietf:params:xml:ns:yang:1";
+  prefix yang;
+
+  import ietf-yang-metadata {
+    prefix md;
+    revision-date 2016-08-05;
+  }
+
+  organization
+    "libyang";
+
+  contact
+    "Web:    <https://github.com/CESNET/libyang/>
+     Author: Radek Krejci <rkrejci@cesnet.cz>
+     Author: Michal Vasko <mvasko@cesnet.cz>";
+
+  description
+    "This is a dummy module with no data formally supplying the definitions
+     of various metadata defined in RFC 6020 and RFC 7950. There are
+     additional metadata used in libyang diff data format.";
+
+  revision 2022-06-16 {
+    description
+      "Added typedef for key metadata type.";
+  }
+
+  revision 2021-04-07 {
+    description
+      "Added metadata for key-less list and state leaf-list diff.";
+  }
+
+  revision 2020-06-17 {
+    description
+      "Added metadata for diff.";
+  }
+
+  revision 2017-02-20 {
+    description
+      "Added metadata for NETCONF's edit-config manipulation with ordered
+       lists and leaf-lists.";
+    reference
+      "RFC 7950: The YANG 1.1 Data Modeling Language";
+  }
+
+  revision 2016-02-11 {
+    description
+      "Initial revision";
+    reference
+      "RFC 6020: YANG - A Data Modeling Language for
+       the Network Configuration Protocol (NETCONF)";
+  }
+
+  typedef instance-identifier-keys {
+    type string;
+    reference "RFC7950 section 7.8.6.";
+    description
+      "The key predicates of the full instance-identifier built-in type.";
+  }
+
+  md:annotation insert {
+    type enumeration {
+      enum first;
+      enum last;
+      enum before;
+      enum after;
+    }
+    reference "RFC7950 section 7.8.6. and section 7.7.9.";
+    description
+      "In user ordered leaf-list, this attribute can be used to control
+       where in the leaf-list the entry is inserted. It can be used during
+       the NETCONF <edit-config> \"create\" operations to insert a new list or
+       leaf-list entry, or during \"merge\" or \"replace\" operations to insert
+       a new list or leaf-list entry or move an existing one.
+
+       If the value is \"before\" or \"after\", the \"value\"/\"key\" attribute
+       MUST also be used to specify an existing entry in the list or leaf-list.
+
+       If no \"insert\" attribute is present in the \"create\" operation, it
+       defaults to \"last\".";
+  }
+
+  md:annotation value {
+    type string;
+    reference "RFC7950 section 7.7.9.";
+    description
+      "In user ordered leaf-list, this attribute must be used if the attribute
+       insert is used and specifies before/after which existing instance the
+       new instance should be inserted.";
+  }
+
+  md:annotation key {
+    type union {
+      type empty;
+      type instance-identifier-keys;
+    }
+    reference "RFC7950 section 7.8.6.";
+    description
+      "In user ordered list, this attribute must be used if the attribute
+       insert is used and specifies before/after which existing instance the
+       new instance should be inserted.";
+  }
+
+  md:annotation position {
+    type union {
+        type empty;
+        type uint32 {
+            range 1..max;
+        }
+    }
+    description
+      "In key-less list or state leaf-list, this attribute must be used if
+       the attribute insert is used and specifies the instance position
+       before/after which the new instance should be inserted.";
+  }
+
+  md:annotation operation {
+    type enumeration {
+      enum none {
+        description
+          "The node existed in both data trees but there is a nested node
+           with another operation. In case of a leaf, only its default
+           flag changed.";
+      }
+      enum create {
+        description
+          "The node did not exist in the first tree and was created in the
+           second tree.";
+      }
+      enum delete {
+        description
+          "The node existed in the first tree and was deleted in the second
+           tree.";
+      }
+      enum replace {
+        description
+          "The node value was changed or the node was moved for
+           leaves/anyxml/anydata and user-ordered lists/leaf-lists,
+           respectively.";
+      }
+    }
+    reference "RFC6241 section 7.2.";
+    description
+      "Operation of a node in a diff. If a node has no operation,
+       it is inherited from its nearest parent with an operation.
+       Top-level nodes must always have an operation.
+
+       User-ordered lists/leaf-lists with operation 'create' and
+       'replace' MUST also have the 'key', 'value', or 'position'
+       metadata defined. It specifies the preceding instance.
+       In case the value of this metadata is empty, the node was
+       created/moved on the first position.
+
+       All the operations keep the meaning of edit-config operations
+       with similar names but some are further restricted, meaning
+       they are used for only a subset of use-cases.";
+  }
+
+  md:annotation orig-default {
+    type boolean;
+    description
+      "Information about the previous default state of the node.";
+  }
+
+  md:annotation orig-value {
+    type string;
+    description
+      "Previous value of a changed leaf. Alternatively, its meaning
+       is the same as the \"value\" attribute but identifies the original
+       leaf-list instance rather than the new one.";
+  }
+
+  md:annotation orig-key {
+    type union {
+      type empty;
+      type instance-identifier-keys;
+    }
+    description
+      "Its meaning is the same as the \"key\" attribute but identifies
+       the original list instance rather than the new one.";
+  }
+
+  md:annotation orig-position {
+    type union {
+        type empty;
+        type uint32 {
+            range 1..max;
+        }
+    }
+    description
+      "Its meaning is the same as the \"position\" attribute but identifies
+       the original list instance rather than the new one.";
+  }
+}