netconf RPC message parsing utils

Change-Id: I23d0d1a95bff3f193601eaa792e7574b7cc621de
diff --git a/protocols/netconf/api/gen-rpc.sh b/protocols/netconf/api/gen-rpc.sh
new file mode 100755
index 0000000..c3bd4d7
--- /dev/null
+++ b/protocols/netconf/api/gen-rpc.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+# Generate code from XML schema
+# it would be better to specify path to latest xjc (e.g., one with JDK9)
+XJC=${XJC:-xjc}
+$XJC -p org.onosproject.netconf.rpc -d src/main/java -no-header https://www.iana.org/assignments/xml-registry/schema/netconf.xsd
+
+# Adding Copyright header + checkstyle ignore comment
+# patching javadoc syntax issue
+for s in src/main/java/org/onosproject/netconf/rpc/*.java ; do
+  ed -s $s << EOF
+H
+0a
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+.
+w
+,g/&lt;/s|>|\&gt;|
+.
+w
+EOF
+  chmod 444 $s
+done
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcError.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcError.java
new file mode 100644
index 0000000..874dccd
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcError.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.netconf;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.xml.bind.JAXBElement;
+
+import org.onosproject.netconf.rpc.ErrorInfoType;
+import org.onosproject.netconf.rpc.ErrorSeverity;
+import org.onosproject.netconf.rpc.ErrorTag;
+import org.onosproject.netconf.rpc.ErrorType;
+import org.onosproject.netconf.rpc.RpcErrorType;
+import org.onosproject.netconf.rpc.RpcErrorType.ErrorMessage;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Wrapper around {@link RpcErrorType} for ease of handling and logging.
+ *
+ * @see NetconfRpcParserUtil
+ */
+@Beta
+public class NetconfRpcError {
+
+    /**
+     * Protocol mandated error-info: {@value}.
+     */
+    public static final String BAD_ATTRIBUTE = "bad-attribute";
+    /**
+     * Protocol mandated error-info: {@value}.
+     */
+    public static final String BAD_ELEMENT = "bad-element";
+    /**
+     * Protocol mandated error-info: {@value}.
+     */
+    public static final String OK_ELEMENT = "ok-element";
+    /**
+     * Protocol mandated error-info: {@value}.
+     */
+    public static final String ERR_ELEMENT = "err-element";
+    /**
+     * Protocol mandated error-info: {@value}.
+     */
+    public static final String NOOP_ELEMENT = "noop-element";
+    /**
+     * Protocol mandated error-info: {@value}.
+     */
+    public static final String BAD_NAMESPACE = "bad-namespace";
+
+    private final RpcErrorType msg;
+
+
+    public static final NetconfRpcError wrap(RpcErrorType msg) {
+        return new NetconfRpcError(msg);
+    }
+
+    protected NetconfRpcError(RpcErrorType msg) {
+        this.msg = checkNotNull(msg);
+    }
+
+    /**
+     * Returns conceptual layer that the error occurred.
+     *
+     * @return the type
+     */
+    public ErrorType type() {
+        return msg.getErrorType();
+    }
+
+    /**
+     * Returns a tag identifying the error condition.
+     *
+     * @return the tag
+     */
+    public ErrorTag tag() {
+        return msg.getErrorTag();
+    }
+
+    /**
+     * Returns error severity.
+     *
+     * @return severity
+     */
+    public ErrorSeverity severity() {
+        return msg.getErrorSeverity();
+    }
+
+    /**
+     * Returns a string identifying the data-model-specific
+     * or implementation-specific error condition, if one exists.
+     *
+     * @return app tag
+     */
+    public Optional<String> appTag() {
+        return Optional.ofNullable(msg.getErrorAppTag());
+    }
+
+    /**
+     * Returns absolute XPath expression identifying the element path
+     * to the node that is associated with the error being reported.
+     *
+     * @return XPath expression
+     */
+    public Optional<String> path() {
+        return Optional.ofNullable(msg.getErrorPath());
+    }
+
+    /**
+     * Returns human readable error message.
+     *
+     * @return message
+     */
+    //@Nonnull
+    public String message() {
+        return Optional.ofNullable(msg.getErrorMessage())
+                    .map(ErrorMessage::getValue)
+                    .orElse("");
+    }
+
+    /**
+     * Returns session-id in error-info if any.
+     *
+     * @return session-id
+     */
+    public Optional<Long> infoSessionId() {
+        return Optional.ofNullable(msg.getErrorInfo())
+                    .map(ErrorInfoType::getSessionId);
+    }
+
+    /**
+     * Returns protocol-mandated contents if any.
+     *
+     * @return Map containing protocol-mandated contents
+     * <p>
+     * Possible Map keys:
+     * {@link #BAD_ATTRIBUTE},
+     * {@link #BAD_ELEMENT},
+     * {@link #OK_ELEMENT},
+     * {@link #ERR_ELEMENT},
+     * {@link #NOOP_ELEMENT},
+     * {@link #BAD_NAMESPACE}
+     */
+    @Beta
+    public Map<String, String> info() {
+        return Optional.ofNullable(msg.getErrorInfo())
+                .map(ErrorInfoType::getBadAttributeAndBadElementAndOkElement)
+                .map(Collection::stream)
+                .orElse(Stream.empty())
+                .collect(Collectors.<JAXBElement<? extends Serializable>,
+                                     String, String, Map<String, String>>
+                                    toMap(elm -> elm.getName().getLocalPart(),
+                                          elm -> String.valueOf(elm.getValue()),
+                                          (v1, v2) -> v1,
+                                          LinkedHashMap::new));
+    }
+
+    /**
+     * Returns any other elements if present.
+     *
+     * @return any other elements
+     */
+    @Beta
+    public List<Object> infoAny() {
+        return Optional.ofNullable(msg.getErrorInfo())
+                  .map(ErrorInfoType::getAny)
+                  .orElse(ImmutableList.of());
+    }
+
+    /**
+     * Returns protocol- or data-model-specific error content.
+     *
+     * @return error info
+     */
+    @Beta
+    public Optional<ErrorInfoType> rawInfo() {
+        return Optional.ofNullable(msg.getErrorInfo());
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("type", type())
+                .add("tag", tag())
+                .add("severity", severity())
+                .add("appTag", appTag().orElse(null))
+                .add("path", path().orElse(null))
+                .add("message", Strings.emptyToNull(message()))
+                .add("info-session-id", infoSessionId().orElse(null))
+                .add("info", info())
+                .omitNullValues()
+                .toString();
+    }
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcException.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcException.java
new file mode 100644
index 0000000..c5805d8
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcException.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.netconf;
+
+import java.util.List;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Represents class of errors related to NETCONF rpc messaging.
+ */
+@Beta
+public class NetconfRpcException extends RuntimeException {
+
+    private static final long serialVersionUID = -5947975698207522820L;
+
+    private final List<NetconfRpcError> error;
+
+    /**
+     * @param errors RPC error message body
+     */
+    public NetconfRpcException(List<NetconfRpcError> errors) {
+        super(getErrorMsg(errors));
+        this.error = ImmutableList.copyOf(errors);
+    }
+
+    /**
+     * @param errors RPC error message body
+     * @param message describing the error
+     */
+    public NetconfRpcException(List<NetconfRpcError> errors, String message) {
+        super(message);
+        this.error = ImmutableList.copyOf(errors);
+    }
+
+    /**
+     * @param errors RPC error message body
+     * @param cause of this exception
+     */
+    public NetconfRpcException(List<NetconfRpcError> errors, Throwable cause) {
+        super(getErrorMsg(errors), cause);
+        this.error = ImmutableList.copyOf(errors);
+    }
+
+    /**
+     * @param errors RPC error message body
+     * @param message describing the error
+     * @param cause of this exception
+     */
+    public NetconfRpcException(List<NetconfRpcError> errors, String message, Throwable cause) {
+        super(message, cause);
+        this.error = ImmutableList.copyOf(errors);
+    }
+
+    /**
+     * Retrieves rpc-error details.
+     *
+     * @return the rpc-errors
+     */
+    public List<NetconfRpcError> rpcErrors() {
+        return error;
+    }
+
+
+    @Override
+    public String toString() {
+        return super.toString() + " " + error;
+    }
+
+    /**
+     * Gets the first non-empty error message or {@code ""}.
+     * @param errors to fetch message from
+     * @return first non-empty error message or {@code ""}
+     */
+    private static String getErrorMsg(List<NetconfRpcError> errors) {
+        return errors.stream()
+            .map(NetconfRpcError::message)
+            .filter(s -> !s.isEmpty())
+            .findFirst().orElse("");
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcParserUtil.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcParserUtil.java
new file mode 100644
index 0000000..2d25637
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcParserUtil.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.netconf;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.io.IOException;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLEventReader;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stax.StAXSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.onosproject.netconf.rpc.RpcErrorType;
+import org.slf4j.Logger;
+import org.w3c.dom.Node;
+
+import com.google.common.annotations.Beta;
+import com.google.common.io.CharSource;
+import com.google.common.io.CharStreams;
+
+@Beta
+public final class NetconfRpcParserUtil {
+
+    private static final Logger log = getLogger(NetconfRpcParserUtil.class);
+
+    /**
+     * Parse first rpc-reply contained in the input.
+     *
+     * @param xml input
+     * @return {@link NetconfRpcReply} or null on error
+     */
+    public static NetconfRpcReply parseRpcReply(CharSequence xml) {
+        XMLInputFactory xif = XMLInputFactory.newFactory();
+        try {
+            XMLStreamReader xsr = xif.createXMLStreamReader(CharSource.wrap(xml).openStream());
+            return parseRpcReply(xsr);
+        } catch (XMLStreamException | IOException e) {
+            log.error("Exception thrown creating XMLStreamReader", e);
+            return null;
+        }
+    }
+
+    /**
+      * Parse first rpc-reply contained in the input.
+      *
+      * @param xsr input
+      * @return {@link NetconfRpcReply} or null on error
+      */
+    public static NetconfRpcReply parseRpcReply(XMLStreamReader xsr) {
+        try {
+            for ( ; xsr.hasNext(); xsr.next()) {
+                if (xsr.isStartElement() &&
+                    xsr.getName().getLocalPart().equals("rpc-reply")) {
+
+                    NetconfRpcReply.Builder builder = NetconfRpcReply.builder();
+                    String msgId = xsr.getAttributeValue(null, "message-id");
+                    builder.withMessageId(msgId);
+                    xsr.nextTag();
+
+                    return parseRpcReplyBody(builder, xsr);
+                }
+            }
+        } catch (XMLStreamException e) {
+            log.error("Exception thrown parsing rpc-reply", e);
+        }
+        return null;
+    }
+
+    private static NetconfRpcReply parseRpcReplyBody(NetconfRpcReply.Builder builder,
+                                                     XMLStreamReader xsr) {
+
+        try {
+            for ( ; xsr.hasNext(); xsr.next()) {
+                if (xsr.isStartElement()) {
+                    switch (xsr.getName().getLocalPart()) {
+                    case "ok":
+                        try {
+                            // skip to end of tag event
+                            xsr.getElementText();
+                        } catch (XMLStreamException e) {
+                            log.warn("Failed parsing ok", e);
+                        }
+                        // ok should be the only element
+                        return builder.buildOk();
+
+                    case "rpc-error":
+                        try {
+                            JAXBContext context = JAXBContext.newInstance(RpcErrorType.class);
+                            Unmarshaller unmarshaller = context.createUnmarshaller();
+                            JAXBElement<RpcErrorType> error = unmarshaller.unmarshal(xsr, RpcErrorType.class);
+                            builder.addError(NetconfRpcError.wrap(error.getValue()));
+                        } catch (JAXBException e) {
+                            log.warn("Failed parsing rpc-error", e);
+                        }
+                        break;
+
+                    default: // =rpc-response
+                        QName qName = xsr.getName();
+                        try {
+                            TransformerFactory tf = TransformerFactory.newInstance();
+                            Transformer t = tf.newTransformer();
+
+                            t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+                            StringBuilder sb = new StringBuilder();
+                            t.transform(new StAXSource(xsr),
+                                        new StreamResult(CharStreams.asWriter(sb)));
+                            builder.addResponses(sb.toString());
+                        } catch (TransformerException e) {
+                            log.warn("Failed parsing {}", qName, e);
+                        }
+                        break;
+                    }
+                }
+            }
+        } catch (XMLStreamException e) {
+            log.error("Exception thrown parsing rpc-reply body", e);
+        }
+
+        return builder.build();
+
+    }
+
+    /**
+     * Converts XML object into a String.
+     *
+     * @param xml Object (e.g., DOM {@link Node})
+     * @return String representation of {@code xml} or empty on error.
+     */
+    @Beta
+    public static String toString(Object xml) {
+        TransformerFactory tf = TransformerFactory.newInstance();
+        try {
+            Transformer t = tf.newTransformer();
+            t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+            Source xmlSource = null;
+            if (xml instanceof Node) {
+                xmlSource = new DOMSource((Node) xml);
+            } else if (xml instanceof XMLEventReader) {
+                xmlSource = new StAXSource((XMLEventReader) xml);
+            } else if (xml instanceof XMLStreamReader) {
+                xmlSource = new StAXSource((XMLStreamReader) xml);
+            } else {
+                log.warn("Unknown XML object type: {}, {}", xml.getClass(), xml);
+                return "";
+            }
+
+            StringBuilder sb = new StringBuilder();
+            t.transform(xmlSource, new StreamResult(CharStreams.asWriter(sb)));
+            return sb.toString();
+        } catch (TransformerException | XMLStreamException e) {
+            log.error("Exception thrown", e);
+            return "";
+        }
+    }
+
+    private NetconfRpcParserUtil() {}
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcReply.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcReply.java
new file mode 100644
index 0000000..7aa6e00
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfRpcReply.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.netconf;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Representation of rpc-reply.
+ *
+ * @see NetconfRpcParserUtil
+ */
+@Beta
+public class NetconfRpcReply {
+
+    private static final Logger log = getLogger(NetconfRpcReply.class);
+
+    public enum Type {
+        OK,
+        ERROR,
+        RESPONSE
+    }
+
+    private final Set<NetconfRpcReply.Type> replies;
+
+    private final String messageId;
+
+    // rpc-reply is ok or (0+ rpc-error and/or 0+ rpc-response)
+
+    private final List<NetconfRpcError> errors;
+    private final List<String> responses;
+
+    protected NetconfRpcReply(NetconfRpcReply.Builder builder) {
+        this.messageId = checkNotNull(builder.messageId);
+        this.replies = ImmutableSet.copyOf(builder.replies);
+        this.errors = ImmutableList.copyOf(builder.errors);
+        this.responses = ImmutableList.copyOf(builder.responses);
+    }
+
+    /**
+     * Returns message-id of this message.
+     *
+     * @return message-id
+     */
+    //@Nonnull
+    public String messageId() {
+        return messageId;
+    }
+
+    /**
+     * Returns true if ok reply.
+     *
+     * @return true if ok reply.
+     */
+    public boolean isOk() {
+        return replies.contains(Type.OK);
+    }
+
+    /**
+     * Returns true if reply contains rpc-error.
+     *
+     * @return true if reply contains rpc-error
+     */
+    public boolean hasError() {
+        return replies.contains(Type.ERROR);
+    }
+
+    /**
+     * Returns list of rpc-errors in rpc-reply.
+     *
+     * @return list of rpc-errors in rpc-reply.
+     */
+    public List<NetconfRpcError> errors() {
+        return errors;
+    }
+
+    /**
+     * Returns list of rpc responses in rpc-reply.
+     *
+     * @return list of rpc responses in rpc-reply.
+     */
+    public List<String> responses() {
+        return responses;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("messageId", messageId)
+                .add("replies", replies)
+                .add("errors", errors)
+                .add("responses", responses)
+                .toString();
+    }
+
+    /**
+     * Creates builder to build {@link NetconfRpcReply}.
+     * @return created builder
+     */
+    public static NetconfRpcReply.Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Builder to build {@link NetconfRpcReply}.
+     */
+    public static final class Builder {
+        private String messageId;
+        private Set<NetconfRpcReply.Type> replies = EnumSet.noneOf(NetconfRpcReply.Type.class);
+        private List<NetconfRpcError> errors = new ArrayList<>();
+        private List<String> responses = new ArrayList<>();
+
+        private Builder() {}
+
+        /**
+         * Builder method to set message-id.
+         *
+         * @param messageId field to set
+         * @return builder
+         */
+        public NetconfRpcReply.Builder withMessageId(String messageId) {
+            this.messageId = messageId;
+            return this;
+        }
+
+        /**
+         * Builder method to adding error parameter.
+         *
+         * @param error field to add
+         * @return builder
+         */
+        public NetconfRpcReply.Builder addError(NetconfRpcError error) {
+            this.replies.add(Type.ERROR);
+            this.errors.add(error);
+            return this;
+        }
+
+        /**
+         * Builder method for adding response parameter.
+         *
+         * @param response field to add
+         * @return builder
+         */
+        public NetconfRpcReply.Builder addResponses(String response) {
+            this.replies.add(Type.RESPONSE);
+            this.responses.add(response);
+            return this;
+        }
+
+        /**
+         * Builds ok reply message.
+         * @return ok
+         */
+        public NetconfRpcReply buildOk() {
+            if (!replies.isEmpty()) {
+                log.warn("Unexpected item in replies area: {}", replies);
+            }
+            this.replies.add(Type.OK);
+            return build();
+        }
+
+        /**
+         * Builder method of the builder.
+         *
+         * @return built class
+         */
+        public NetconfRpcReply build() {
+            if (replies.isEmpty()) {
+                log.warn("Empty rpc-reply?");
+            }
+            return new NetconfRpcReply(this);
+        }
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/EditOperationType.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/EditOperationType.java
new file mode 100644
index 0000000..d0b968a
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/EditOperationType.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import javax.xml.bind.annotation.XmlEnum;
+import javax.xml.bind.annotation.XmlEnumValue;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for editOperationType.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * <p>
+ * <pre>
+ * &lt;simpleType name="editOperationType"&gt;
+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string"&gt;
+ *     &lt;enumeration value="merge"/&gt;
+ *     &lt;enumeration value="replace"/&gt;
+ *     &lt;enumeration value="create"/&gt;
+ *     &lt;enumeration value="delete"/&gt;
+ *     &lt;enumeration value="remove"/&gt;
+ *   &lt;/restriction&gt;
+ * &lt;/simpleType&gt;
+ * </pre>
+ * 
+ */
+@XmlType(name = "editOperationType")
+@XmlEnum
+public enum EditOperationType {
+
+    @XmlEnumValue("merge")
+    MERGE("merge"),
+    @XmlEnumValue("replace")
+    REPLACE("replace"),
+    @XmlEnumValue("create")
+    CREATE("create"),
+    @XmlEnumValue("delete")
+    DELETE("delete"),
+    @XmlEnumValue("remove")
+    REMOVE("remove");
+    private final String value;
+
+    EditOperationType(String v) {
+        value = v;
+    }
+
+    public String value() {
+        return value;
+    }
+
+    public static EditOperationType fromValue(String v) {
+        for (EditOperationType c: EditOperationType.values()) {
+            if (c.value.equals(v)) {
+                return c;
+            }
+        }
+        throw new IllegalArgumentException(v);
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorInfoType.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorInfoType.java
new file mode 100644
index 0000000..d780fc1
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorInfoType.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementRefs;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for errorInfoType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="errorInfoType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;choice&gt;
+ *           &lt;element name="session-id" type="{urn:ietf:params:xml:ns:netconf:base:1.0}SessionIdOrZero"/&gt;
+ *           &lt;sequence maxOccurs="unbounded" minOccurs="0"&gt;
+ *             &lt;sequence&gt;
+ *               &lt;element name="bad-attribute" type="{http://www.w3.org/2001/XMLSchema}QName" minOccurs="0"/&gt;
+ *               &lt;element name="bad-element" type="{http://www.w3.org/2001/XMLSchema}QName" minOccurs="0"/&gt;
+ *               &lt;element name="ok-element" type="{http://www.w3.org/2001/XMLSchema}QName" minOccurs="0"/&gt;
+ *               &lt;element name="err-element" type="{http://www.w3.org/2001/XMLSchema}QName" minOccurs="0"/&gt;
+ *               &lt;element name="noop-element" type="{http://www.w3.org/2001/XMLSchema}QName" minOccurs="0"/&gt;
+ *               &lt;element name="bad-namespace" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *             &lt;/sequence&gt;
+ *           &lt;/sequence&gt;
+ *         &lt;/choice&gt;
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "errorInfoType", propOrder = {
+    "sessionId",
+    "badAttributeAndBadElementAndOkElement",
+    "any"
+})
+public class ErrorInfoType {
+
+    @XmlElement(name = "session-id")
+    @XmlSchemaType(name = "unsignedInt")
+    protected Long sessionId;
+    @XmlElementRefs({
+        @XmlElementRef(name = "bad-attribute", namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", type = JAXBElement.class, required = false),
+        @XmlElementRef(name = "bad-element", namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", type = JAXBElement.class, required = false),
+        @XmlElementRef(name = "ok-element", namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", type = JAXBElement.class, required = false),
+        @XmlElementRef(name = "err-element", namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", type = JAXBElement.class, required = false),
+        @XmlElementRef(name = "noop-element", namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", type = JAXBElement.class, required = false),
+        @XmlElementRef(name = "bad-namespace", namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", type = JAXBElement.class, required = false)
+    })
+    protected List<JAXBElement<? extends Serializable>> badAttributeAndBadElementAndOkElement;
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+
+    /**
+     * Gets the value of the sessionId property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Long }
+     *     
+     */
+    public Long getSessionId() {
+        return sessionId;
+    }
+
+    /**
+     * Sets the value of the sessionId property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Long }
+     *     
+     */
+    public void setSessionId(Long value) {
+        this.sessionId = value;
+    }
+
+    /**
+     * Gets the value of the badAttributeAndBadElementAndOkElement property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the badAttributeAndBadElementAndOkElement property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getBadAttributeAndBadElementAndOkElement().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link JAXBElement }{@code <}{@link QName }{@code >}
+     * {@link JAXBElement }{@code <}{@link QName }{@code >}
+     * {@link JAXBElement }{@code <}{@link QName }{@code >}
+     * {@link JAXBElement }{@code <}{@link QName }{@code >}
+     * {@link JAXBElement }{@code <}{@link QName }{@code >}
+     * {@link JAXBElement }{@code <}{@link String }{@code >}
+     * 
+     * 
+     */
+    public List<JAXBElement<? extends Serializable>> getBadAttributeAndBadElementAndOkElement() {
+        if (badAttributeAndBadElementAndOkElement == null) {
+            badAttributeAndBadElementAndOkElement = new ArrayList<JAXBElement<? extends Serializable>>();
+        }
+        return this.badAttributeAndBadElementAndOkElement;
+    }
+
+    /**
+     * Gets the value of the any property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Element }
+     * {@link Object }
+     * 
+     * 
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorSeverity.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorSeverity.java
new file mode 100644
index 0000000..ff7a7e7
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorSeverity.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import javax.xml.bind.annotation.XmlEnum;
+import javax.xml.bind.annotation.XmlEnumValue;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for ErrorSeverity.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * <p>
+ * <pre>
+ * &lt;simpleType name="ErrorSeverity"&gt;
+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string"&gt;
+ *     &lt;enumeration value="error"/&gt;
+ *     &lt;enumeration value="warning"/&gt;
+ *   &lt;/restriction&gt;
+ * &lt;/simpleType&gt;
+ * </pre>
+ * 
+ */
+@XmlType(name = "ErrorSeverity")
+@XmlEnum
+public enum ErrorSeverity {
+
+    @XmlEnumValue("error")
+    ERROR("error"),
+    @XmlEnumValue("warning")
+    WARNING("warning");
+    private final String value;
+
+    ErrorSeverity(String v) {
+        value = v;
+    }
+
+    public String value() {
+        return value;
+    }
+
+    public static ErrorSeverity fromValue(String v) {
+        for (ErrorSeverity c: ErrorSeverity.values()) {
+            if (c.value.equals(v)) {
+                return c;
+            }
+        }
+        throw new IllegalArgumentException(v);
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorTag.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorTag.java
new file mode 100644
index 0000000..fd69b8f
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorTag.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import javax.xml.bind.annotation.XmlEnum;
+import javax.xml.bind.annotation.XmlEnumValue;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for ErrorTag.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * <p>
+ * <pre>
+ * &lt;simpleType name="ErrorTag"&gt;
+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string"&gt;
+ *     &lt;enumeration value="in-use"/&gt;
+ *     &lt;enumeration value="invalid-value"/&gt;
+ *     &lt;enumeration value="too-big"/&gt;
+ *     &lt;enumeration value="missing-attribute"/&gt;
+ *     &lt;enumeration value="bad-attribute"/&gt;
+ *     &lt;enumeration value="unknown-attribute"/&gt;
+ *     &lt;enumeration value="missing-element"/&gt;
+ *     &lt;enumeration value="bad-element"/&gt;
+ *     &lt;enumeration value="unknown-element"/&gt;
+ *     &lt;enumeration value="unknown-namespace"/&gt;
+ *     &lt;enumeration value="access-denied"/&gt;
+ *     &lt;enumeration value="lock-denied"/&gt;
+ *     &lt;enumeration value="resource-denied"/&gt;
+ *     &lt;enumeration value="rollback-failed"/&gt;
+ *     &lt;enumeration value="data-exists"/&gt;
+ *     &lt;enumeration value="data-missing"/&gt;
+ *     &lt;enumeration value="operation-not-supported"/&gt;
+ *     &lt;enumeration value="operation-failed"/&gt;
+ *     &lt;enumeration value="partial-operation"/&gt;
+ *     &lt;enumeration value="malformed-message"/&gt;
+ *   &lt;/restriction&gt;
+ * &lt;/simpleType&gt;
+ * </pre>
+ * 
+ */
+@XmlType(name = "ErrorTag")
+@XmlEnum
+public enum ErrorTag {
+
+    @XmlEnumValue("in-use")
+    IN_USE("in-use"),
+    @XmlEnumValue("invalid-value")
+    INVALID_VALUE("invalid-value"),
+    @XmlEnumValue("too-big")
+    TOO_BIG("too-big"),
+    @XmlEnumValue("missing-attribute")
+    MISSING_ATTRIBUTE("missing-attribute"),
+    @XmlEnumValue("bad-attribute")
+    BAD_ATTRIBUTE("bad-attribute"),
+    @XmlEnumValue("unknown-attribute")
+    UNKNOWN_ATTRIBUTE("unknown-attribute"),
+    @XmlEnumValue("missing-element")
+    MISSING_ELEMENT("missing-element"),
+    @XmlEnumValue("bad-element")
+    BAD_ELEMENT("bad-element"),
+    @XmlEnumValue("unknown-element")
+    UNKNOWN_ELEMENT("unknown-element"),
+    @XmlEnumValue("unknown-namespace")
+    UNKNOWN_NAMESPACE("unknown-namespace"),
+    @XmlEnumValue("access-denied")
+    ACCESS_DENIED("access-denied"),
+    @XmlEnumValue("lock-denied")
+    LOCK_DENIED("lock-denied"),
+    @XmlEnumValue("resource-denied")
+    RESOURCE_DENIED("resource-denied"),
+    @XmlEnumValue("rollback-failed")
+    ROLLBACK_FAILED("rollback-failed"),
+    @XmlEnumValue("data-exists")
+    DATA_EXISTS("data-exists"),
+    @XmlEnumValue("data-missing")
+    DATA_MISSING("data-missing"),
+    @XmlEnumValue("operation-not-supported")
+    OPERATION_NOT_SUPPORTED("operation-not-supported"),
+    @XmlEnumValue("operation-failed")
+    OPERATION_FAILED("operation-failed"),
+    @XmlEnumValue("partial-operation")
+    PARTIAL_OPERATION("partial-operation"),
+    @XmlEnumValue("malformed-message")
+    MALFORMED_MESSAGE("malformed-message");
+    private final String value;
+
+    ErrorTag(String v) {
+        value = v;
+    }
+
+    public String value() {
+        return value;
+    }
+
+    public static ErrorTag fromValue(String v) {
+        for (ErrorTag c: ErrorTag.values()) {
+            if (c.value.equals(v)) {
+                return c;
+            }
+        }
+        throw new IllegalArgumentException(v);
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorType.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorType.java
new file mode 100644
index 0000000..3d86610
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ErrorType.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import javax.xml.bind.annotation.XmlEnum;
+import javax.xml.bind.annotation.XmlEnumValue;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for ErrorType.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * <p>
+ * <pre>
+ * &lt;simpleType name="ErrorType"&gt;
+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string"&gt;
+ *     &lt;enumeration value="transport"/&gt;
+ *     &lt;enumeration value="rpc"/&gt;
+ *     &lt;enumeration value="protocol"/&gt;
+ *     &lt;enumeration value="application"/&gt;
+ *   &lt;/restriction&gt;
+ * &lt;/simpleType&gt;
+ * </pre>
+ * 
+ */
+@XmlType(name = "ErrorType")
+@XmlEnum
+public enum ErrorType {
+
+    @XmlEnumValue("transport")
+    TRANSPORT("transport"),
+    @XmlEnumValue("rpc")
+    RPC("rpc"),
+    @XmlEnumValue("protocol")
+    PROTOCOL("protocol"),
+    @XmlEnumValue("application")
+    APPLICATION("application");
+    private final String value;
+
+    ErrorType(String v) {
+        value = v;
+    }
+
+    public String value() {
+        return value;
+    }
+
+    public static ErrorType fromValue(String v) {
+        for (ErrorType c: ErrorType.values()) {
+            if (c.value.equals(v)) {
+                return c;
+            }
+        }
+        throw new IllegalArgumentException(v);
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/Hello.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/Hello.java
new file mode 100644
index 0000000..220e8a8
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/Hello.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for anonymous complex type.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="capabilities"&gt;
+ *           &lt;complexType&gt;
+ *             &lt;complexContent&gt;
+ *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *                 &lt;sequence&gt;
+ *                   &lt;element name="capability" type="{http://www.w3.org/2001/XMLSchema}anyURI" maxOccurs="unbounded"/&gt;
+ *                 &lt;/sequence&gt;
+ *               &lt;/restriction&gt;
+ *             &lt;/complexContent&gt;
+ *           &lt;/complexType&gt;
+ *         &lt;/element&gt;
+ *         &lt;element name="session-id" type="{urn:ietf:params:xml:ns:netconf:base:1.0}SessionId" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+    "capabilities",
+    "sessionId"
+})
+@XmlRootElement(name = "hello")
+public class Hello {
+
+    @XmlElement(required = true)
+    protected Hello.Capabilities capabilities;
+    @XmlElement(name = "session-id")
+    @XmlSchemaType(name = "unsignedInt")
+    protected Long sessionId;
+
+    /**
+     * Gets the value of the capabilities property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Hello.Capabilities }
+     *     
+     */
+    public Hello.Capabilities getCapabilities() {
+        return capabilities;
+    }
+
+    /**
+     * Sets the value of the capabilities property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Hello.Capabilities }
+     *     
+     */
+    public void setCapabilities(Hello.Capabilities value) {
+        this.capabilities = value;
+    }
+
+    /**
+     * Gets the value of the sessionId property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Long }
+     *     
+     */
+    public Long getSessionId() {
+        return sessionId;
+    }
+
+    /**
+     * Sets the value of the sessionId property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Long }
+     *     
+     */
+    public void setSessionId(Long value) {
+        this.sessionId = value;
+    }
+
+
+    /**
+     * <p>Java class for anonymous complex type.
+     * 
+     * <p>The following schema fragment specifies the expected         content contained within this class.
+     * 
+     * <pre>
+     * &lt;complexType&gt;
+     *   &lt;complexContent&gt;
+     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+     *       &lt;sequence&gt;
+     *         &lt;element name="capability" type="{http://www.w3.org/2001/XMLSchema}anyURI" maxOccurs="unbounded"/&gt;
+     *       &lt;/sequence&gt;
+     *     &lt;/restriction&gt;
+     *   &lt;/complexContent&gt;
+     * &lt;/complexType&gt;
+     * </pre>
+     * 
+     * 
+     */
+    @XmlAccessorType(XmlAccessType.FIELD)
+    @XmlType(name = "", propOrder = {
+        "capability"
+    })
+    public static class Capabilities {
+
+        @XmlElement(required = true)
+        @XmlSchemaType(name = "anyURI")
+        protected List<String> capability;
+
+        /**
+         * Gets the value of the capability property.
+         * 
+         * <p>
+         * This accessor method returns a reference to the live list,
+         * not a snapshot. Therefore any modification you make to the
+         * returned list will be present inside the JAXB object.
+         * This is why there is not a <CODE>set</CODE> method for the capability property.
+         * 
+         * <p>
+         * For example, to add a new item, do as follows:
+         * <pre>
+         *    getCapability().add(newItem);
+         * </pre>
+         * 
+         * 
+         * <p>
+         * Objects of the following type(s) are allowed in the list
+         * {@link String }
+         * 
+         * 
+         */
+        public List<String> getCapability() {
+            if (capability == null) {
+                capability = new ArrayList<String>();
+            }
+            return this.capability;
+        }
+
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ObjectFactory.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ObjectFactory.java
new file mode 100644
index 0000000..2328f26
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/ObjectFactory.java
@@ -0,0 +1,277 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each 
+ * Java content interface and Java element interface 
+ * generated in the org.onosproject.netconf.rpc package. 
+ * <p>An ObjectFactory allows you to programatically 
+ * construct new instances of the Java representation 
+ * for XML content. The Java representation of XML 
+ * content can consist of schema derived interfaces 
+ * and classes representing the binding of schema 
+ * type definitions, element declarations and model 
+ * groups.  Factory methods for each of these are 
+ * provided in this class.
+ * 
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _Rpc_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "rpc");
+    private final static QName _RpcReply_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "rpc-reply");
+    private final static QName _RpcError_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "rpc-error");
+    private final static QName _RpcOperation_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "rpcOperation");
+    private final static QName _RpcResponse_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "rpcResponse");
+    private final static QName _ErrorInfoTypeBadAttribute_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "bad-attribute");
+    private final static QName _ErrorInfoTypeBadElement_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "bad-element");
+    private final static QName _ErrorInfoTypeOkElement_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "ok-element");
+    private final static QName _ErrorInfoTypeErrElement_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "err-element");
+    private final static QName _ErrorInfoTypeNoopElement_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "noop-element");
+    private final static QName _ErrorInfoTypeBadNamespace_QNAME = new QName("urn:ietf:params:xml:ns:netconf:base:1.0", "bad-namespace");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.onosproject.netconf.rpc
+     * 
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link Hello }
+     * 
+     */
+    public Hello createHello() {
+        return new Hello();
+    }
+
+    /**
+     * Create an instance of {@link RpcErrorType }
+     * 
+     */
+    public RpcErrorType createRpcErrorType() {
+        return new RpcErrorType();
+    }
+
+    /**
+     * Create an instance of {@link RpcType }
+     * 
+     */
+    public RpcType createRpcType() {
+        return new RpcType();
+    }
+
+    /**
+     * Create an instance of {@link RpcReplyType }
+     * 
+     */
+    public RpcReplyType createRpcReplyType() {
+        return new RpcReplyType();
+    }
+
+    /**
+     * Create an instance of {@link RpcOperationType }
+     * 
+     */
+    public RpcOperationType createRpcOperationType() {
+        return new RpcOperationType();
+    }
+
+    /**
+     * Create an instance of {@link RpcResponseType }
+     * 
+     */
+    public RpcResponseType createRpcResponseType() {
+        return new RpcResponseType();
+    }
+
+    /**
+     * Create an instance of {@link Hello.Capabilities }
+     * 
+     */
+    public Hello.Capabilities createHelloCapabilities() {
+        return new Hello.Capabilities();
+    }
+
+    /**
+     * Create an instance of {@link ErrorInfoType }
+     * 
+     */
+    public ErrorInfoType createErrorInfoType() {
+        return new ErrorInfoType();
+    }
+
+    /**
+     * Create an instance of {@link RpcErrorType.ErrorMessage }
+     * 
+     */
+    public RpcErrorType.ErrorMessage createRpcErrorTypeErrorMessage() {
+        return new RpcErrorType.ErrorMessage();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link RpcType }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link RpcType }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "rpc")
+    public JAXBElement<RpcType> createRpc(RpcType value) {
+        return new JAXBElement<RpcType>(_Rpc_QNAME, RpcType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link RpcReplyType }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link RpcReplyType }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "rpc-reply")
+    public JAXBElement<RpcReplyType> createRpcReply(RpcReplyType value) {
+        return new JAXBElement<RpcReplyType>(_RpcReply_QNAME, RpcReplyType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link RpcErrorType }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link RpcErrorType }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "rpc-error")
+    public JAXBElement<RpcErrorType> createRpcError(RpcErrorType value) {
+        return new JAXBElement<RpcErrorType>(_RpcError_QNAME, RpcErrorType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link RpcOperationType }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link RpcOperationType }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "rpcOperation")
+    public JAXBElement<RpcOperationType> createRpcOperation(RpcOperationType value) {
+        return new JAXBElement<RpcOperationType>(_RpcOperation_QNAME, RpcOperationType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link RpcResponseType }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link RpcResponseType }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "rpcResponse")
+    public JAXBElement<RpcResponseType> createRpcResponse(RpcResponseType value) {
+        return new JAXBElement<RpcResponseType>(_RpcResponse_QNAME, RpcResponseType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link QName }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link QName }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "bad-attribute", scope = ErrorInfoType.class)
+    public JAXBElement<QName> createErrorInfoTypeBadAttribute(QName value) {
+        return new JAXBElement<QName>(_ErrorInfoTypeBadAttribute_QNAME, QName.class, ErrorInfoType.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link QName }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link QName }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "bad-element", scope = ErrorInfoType.class)
+    public JAXBElement<QName> createErrorInfoTypeBadElement(QName value) {
+        return new JAXBElement<QName>(_ErrorInfoTypeBadElement_QNAME, QName.class, ErrorInfoType.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link QName }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link QName }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "ok-element", scope = ErrorInfoType.class)
+    public JAXBElement<QName> createErrorInfoTypeOkElement(QName value) {
+        return new JAXBElement<QName>(_ErrorInfoTypeOkElement_QNAME, QName.class, ErrorInfoType.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link QName }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link QName }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "err-element", scope = ErrorInfoType.class)
+    public JAXBElement<QName> createErrorInfoTypeErrElement(QName value) {
+        return new JAXBElement<QName>(_ErrorInfoTypeErrElement_QNAME, QName.class, ErrorInfoType.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link QName }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link QName }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "noop-element", scope = ErrorInfoType.class)
+    public JAXBElement<QName> createErrorInfoTypeNoopElement(QName value) {
+        return new JAXBElement<QName>(_ErrorInfoTypeNoopElement_QNAME, QName.class, ErrorInfoType.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link String }{@code >}
+     */
+    @XmlElementDecl(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", name = "bad-namespace", scope = ErrorInfoType.class)
+    public JAXBElement<String> createErrorInfoTypeBadNamespace(String value) {
+        return new JAXBElement<String>(_ErrorInfoTypeBadNamespace_QNAME, String.class, ErrorInfoType.class, value);
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcErrorType.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcErrorType.java
new file mode 100644
index 0000000..87490bb
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcErrorType.java
@@ -0,0 +1,339 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+
+
+/**
+ * <p>Java class for rpcErrorType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="rpcErrorType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="error-type" type="{urn:ietf:params:xml:ns:netconf:base:1.0}ErrorType"/&gt;
+ *         &lt;element name="error-tag" type="{urn:ietf:params:xml:ns:netconf:base:1.0}ErrorTag"/&gt;
+ *         &lt;element name="error-severity" type="{urn:ietf:params:xml:ns:netconf:base:1.0}ErrorSeverity"/&gt;
+ *         &lt;element name="error-app-tag" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="error-path" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="error-message" minOccurs="0"&gt;
+ *           &lt;complexType&gt;
+ *             &lt;simpleContent&gt;
+ *               &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema&gt;string"&gt;
+ *                 &lt;attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/&gt;
+ *               &lt;/extension&gt;
+ *             &lt;/simpleContent&gt;
+ *           &lt;/complexType&gt;
+ *         &lt;/element&gt;
+ *         &lt;element name="error-info" type="{urn:ietf:params:xml:ns:netconf:base:1.0}errorInfoType" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "rpcErrorType", propOrder = {
+    "errorType",
+    "errorTag",
+    "errorSeverity",
+    "errorAppTag",
+    "errorPath",
+    "errorMessage",
+    "errorInfo"
+})
+public class RpcErrorType {
+
+    @XmlElement(name = "error-type", required = true)
+    @XmlSchemaType(name = "string")
+    protected ErrorType errorType;
+    @XmlElement(name = "error-tag", required = true)
+    @XmlSchemaType(name = "string")
+    protected ErrorTag errorTag;
+    @XmlElement(name = "error-severity", required = true)
+    @XmlSchemaType(name = "string")
+    protected ErrorSeverity errorSeverity;
+    @XmlElement(name = "error-app-tag")
+    protected String errorAppTag;
+    @XmlElement(name = "error-path")
+    protected String errorPath;
+    @XmlElement(name = "error-message")
+    protected RpcErrorType.ErrorMessage errorMessage;
+    @XmlElement(name = "error-info")
+    protected ErrorInfoType errorInfo;
+
+    /**
+     * Gets the value of the errorType property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link ErrorType }
+     *     
+     */
+    public ErrorType getErrorType() {
+        return errorType;
+    }
+
+    /**
+     * Sets the value of the errorType property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link ErrorType }
+     *     
+     */
+    public void setErrorType(ErrorType value) {
+        this.errorType = value;
+    }
+
+    /**
+     * Gets the value of the errorTag property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link ErrorTag }
+     *     
+     */
+    public ErrorTag getErrorTag() {
+        return errorTag;
+    }
+
+    /**
+     * Sets the value of the errorTag property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link ErrorTag }
+     *     
+     */
+    public void setErrorTag(ErrorTag value) {
+        this.errorTag = value;
+    }
+
+    /**
+     * Gets the value of the errorSeverity property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link ErrorSeverity }
+     *     
+     */
+    public ErrorSeverity getErrorSeverity() {
+        return errorSeverity;
+    }
+
+    /**
+     * Sets the value of the errorSeverity property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link ErrorSeverity }
+     *     
+     */
+    public void setErrorSeverity(ErrorSeverity value) {
+        this.errorSeverity = value;
+    }
+
+    /**
+     * Gets the value of the errorAppTag property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getErrorAppTag() {
+        return errorAppTag;
+    }
+
+    /**
+     * Sets the value of the errorAppTag property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setErrorAppTag(String value) {
+        this.errorAppTag = value;
+    }
+
+    /**
+     * Gets the value of the errorPath property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getErrorPath() {
+        return errorPath;
+    }
+
+    /**
+     * Sets the value of the errorPath property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setErrorPath(String value) {
+        this.errorPath = value;
+    }
+
+    /**
+     * Gets the value of the errorMessage property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link RpcErrorType.ErrorMessage }
+     *     
+     */
+    public RpcErrorType.ErrorMessage getErrorMessage() {
+        return errorMessage;
+    }
+
+    /**
+     * Sets the value of the errorMessage property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link RpcErrorType.ErrorMessage }
+     *     
+     */
+    public void setErrorMessage(RpcErrorType.ErrorMessage value) {
+        this.errorMessage = value;
+    }
+
+    /**
+     * Gets the value of the errorInfo property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link ErrorInfoType }
+     *     
+     */
+    public ErrorInfoType getErrorInfo() {
+        return errorInfo;
+    }
+
+    /**
+     * Sets the value of the errorInfo property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link ErrorInfoType }
+     *     
+     */
+    public void setErrorInfo(ErrorInfoType value) {
+        this.errorInfo = value;
+    }
+
+
+    /**
+     * <p>Java class for anonymous complex type.
+     * 
+     * <p>The following schema fragment specifies the expected         content contained within this class.
+     * 
+     * <pre>
+     * &lt;complexType&gt;
+     *   &lt;simpleContent&gt;
+     *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema&gt;string"&gt;
+     *       &lt;attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/&gt;
+     *     &lt;/extension&gt;
+     *   &lt;/simpleContent&gt;
+     * &lt;/complexType&gt;
+     * </pre>
+     * 
+     * 
+     */
+    @XmlAccessorType(XmlAccessType.FIELD)
+    @XmlType(name = "", propOrder = {
+        "value"
+    })
+    public static class ErrorMessage {
+
+        @XmlValue
+        protected String value;
+        @XmlAttribute(name = "lang", namespace = "http://www.w3.org/XML/1998/namespace")
+        protected String lang;
+
+        /**
+         * Gets the value of the value property.
+         * 
+         * @return
+         *     possible object is
+         *     {@link String }
+         *     
+         */
+        public String getValue() {
+            return value;
+        }
+
+        /**
+         * Sets the value of the value property.
+         * 
+         * @param value
+         *     allowed object is
+         *     {@link String }
+         *     
+         */
+        public void setValue(String value) {
+            this.value = value;
+        }
+
+        /**
+         * Gets the value of the lang property.
+         * 
+         * @return
+         *     possible object is
+         *     {@link String }
+         *     
+         */
+        public String getLang() {
+            return lang;
+        }
+
+        /**
+         * Sets the value of the lang property.
+         * 
+         * @param value
+         *     allowed object is
+         *     {@link String }
+         *     
+         */
+        public void setLang(String value) {
+            this.lang = value;
+        }
+
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcOperationType.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcOperationType.java
new file mode 100644
index 0000000..4e6580f
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcOperationType.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for rpcOperationType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="rpcOperationType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "rpcOperationType")
+public class RpcOperationType {
+
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcReplyType.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcReplyType.java
new file mode 100644
index 0000000..83d30d9
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcReplyType.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+
+/**
+ * <p>Java class for rpcReplyType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="rpcReplyType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice&gt;
+ *         &lt;element name="ok" type="{http://www.w3.org/2001/XMLSchema}anyType"/&gt;
+ *         &lt;sequence&gt;
+ *           &lt;element ref="{urn:ietf:params:xml:ns:netconf:base:1.0}rpc-error" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *           &lt;element ref="{urn:ietf:params:xml:ns:netconf:base:1.0}rpcResponse" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *         &lt;/sequence&gt;
+ *       &lt;/choice&gt;
+ *       &lt;attribute name="message-id" type="{urn:ietf:params:xml:ns:netconf:base:1.0}messageIdType" /&gt;
+ *       &lt;anyAttribute processContents='lax'/&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "rpcReplyType", propOrder = {
+    "ok",
+    "rpcError",
+    "rpcResponse"
+})
+public class RpcReplyType {
+
+    protected Object ok;
+    @XmlElement(name = "rpc-error")
+    protected List<RpcErrorType> rpcError;
+    protected List<RpcResponseType> rpcResponse;
+    @XmlAttribute(name = "message-id")
+    protected String messageId;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the ok property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Object }
+     *     
+     */
+    public Object getOk() {
+        return ok;
+    }
+
+    /**
+     * Sets the value of the ok property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Object }
+     *     
+     */
+    public void setOk(Object value) {
+        this.ok = value;
+    }
+
+    /**
+     * Gets the value of the rpcError property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the rpcError property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getRpcError().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link RpcErrorType }
+     * 
+     * 
+     */
+    public List<RpcErrorType> getRpcError() {
+        if (rpcError == null) {
+            rpcError = new ArrayList<RpcErrorType>();
+        }
+        return this.rpcError;
+    }
+
+    /**
+     * Gets the value of the rpcResponse property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the rpcResponse property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getRpcResponse().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link RpcResponseType }
+     * 
+     * 
+     */
+    public List<RpcResponseType> getRpcResponse() {
+        if (rpcResponse == null) {
+            rpcResponse = new ArrayList<RpcResponseType>();
+        }
+        return this.rpcResponse;
+    }
+
+    /**
+     * Gets the value of the messageId property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getMessageId() {
+        return messageId;
+    }
+
+    /**
+     * Sets the value of the messageId property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setMessageId(String value) {
+        this.messageId = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     * 
+     * <p>
+     * the map is keyed by the name of the attribute and 
+     * the value is the string value of the attribute.
+     * 
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     * 
+     * 
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcResponseType.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcResponseType.java
new file mode 100644
index 0000000..edcf940
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcResponseType.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for rpcResponseType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="rpcResponseType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "rpcResponseType")
+public class RpcResponseType {
+
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcType.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcType.java
new file mode 100644
index 0000000..713438d
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/RpcType.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+
+package org.onosproject.netconf.rpc;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+
+/**
+ * <p>Java class for rpcType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected         content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="rpcType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{urn:ietf:params:xml:ns:netconf:base:1.0}rpcOperation"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="message-id" use="required" type="{urn:ietf:params:xml:ns:netconf:base:1.0}messageIdType" /&gt;
+ *       &lt;anyAttribute processContents='lax'/&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "rpcType", propOrder = {
+    "rpcOperation"
+})
+public class RpcType {
+
+    @XmlElement(required = true)
+    protected RpcOperationType rpcOperation;
+    @XmlAttribute(name = "message-id", required = true)
+    protected String messageId;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the rpcOperation property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link RpcOperationType }
+     *     
+     */
+    public RpcOperationType getRpcOperation() {
+        return rpcOperation;
+    }
+
+    /**
+     * Sets the value of the rpcOperation property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link RpcOperationType }
+     *     
+     */
+    public void setRpcOperation(RpcOperationType value) {
+        this.rpcOperation = value;
+    }
+
+    /**
+     * Gets the value of the messageId property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getMessageId() {
+        return messageId;
+    }
+
+    /**
+     * Sets the value of the messageId property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setMessageId(String value) {
+        this.messageId = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     * 
+     * <p>
+     * the map is keyed by the name of the attribute and 
+     * the value is the string value of the attribute.
+     * 
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     * 
+     * 
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/package-info.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/package-info.java
new file mode 100644
index 0000000..ff97d41
--- /dev/null
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/rpc/package-info.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.  You may obtain a copy
+ * of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// CHECKSTYLE:OFF
+@javax.xml.bind.annotation.XmlSchema(namespace = "urn:ietf:params:xml:ns:netconf:base:1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
+package org.onosproject.netconf.rpc;
diff --git a/protocols/netconf/api/src/test/java/org/onosproject/netconf/NetconfRpcParserUtilTest.java b/protocols/netconf/api/src/test/java/org/onosproject/netconf/NetconfRpcParserUtilTest.java
new file mode 100644
index 0000000..902651d
--- /dev/null
+++ b/protocols/netconf/api/src/test/java/org/onosproject/netconf/NetconfRpcParserUtilTest.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.netconf;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.onosproject.netconf.rpc.ErrorSeverity;
+import org.onosproject.netconf.rpc.ErrorTag;
+import org.onosproject.netconf.rpc.ErrorType;
+import org.w3c.dom.Node;
+
+public class NetconfRpcParserUtilTest {
+
+    static final String OK_DATA1 =
+    "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"3\">\n" +
+    "  <ok/>\n" +
+    "</rpc-reply>\n";
+
+    static final String ERROR_XPATH1 =
+    "/rpc/edit-config/config/oc-if:interfaces/oc-if:interface[oc-if:name='foo']/oc-if:config/oc-if:type";
+
+    static final String ERROR_DATA1 =
+    "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"4\">\n" +
+    "  <rpc-error>\n" +
+    "    <error-type>application</error-type>\n" +
+    "    <error-tag>invalid-value</error-tag>\n" +
+    "    <error-severity>error</error-severity>\n" +
+    "    <error-path xmlns:oc-if=\"http://openconfig.net/yang/interfaces\">\n" +
+    "    /rpc/edit-config/config/oc-if:interfaces/oc-if:interface[oc-if:name='foo']/oc-if:config/oc-if:type\n" +
+    "  </error-path>\n" +
+    "    <error-message xml:lang=\"en\">\"fastEther\" is not a valid value.</error-message>\n" +
+    "    <error-info>\n" +
+    "      <bad-element>type</bad-element>\n" +
+    "      <something>value</something>" +
+    "    </error-info>\n" +
+    "  </rpc-error>\n" +
+    "</rpc-reply>";
+
+    static final String RESPONSE_BODY1 =
+    "<data>\n" +
+    "    <interfaces xmlns=\"http://openconfig.net/yang/interfaces\">\n" +
+    "      <interface>\n" +
+    "        <name>foo</name>\n" +
+    "        <config>\n" +
+    "          <name>foo</name>\n" +
+    "          <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:fastEther</type>\n" +
+    "        </config>\n" +
+    "      </interface>\n" +
+    "    </interfaces>\n" +
+    "    <components xmlns=\"http://openconfig.net/yang/platform\">\n" +
+    "      <component>\n" +
+    "        <name>comp1</name>\n" +
+    "        <config>\n" +
+    "          <name>comp1</name>\n" +
+    "        </config>\n" +
+    "      </component>\n" +
+    "      <component>\n" +
+    "        <name>comp2</name>\n" +
+    "        <config>\n" +
+    "          <name>comp2</name>\n" +
+    "        </config>\n" +
+    "      </component>\n" +
+    "    </components>\n" +
+    "    <aaa xmlns=\"http://tail-f.com/ns/aaa/1.1\">\n" +
+    "      <authentication>\n" +
+    "        <users>\n" +
+    "          <user>\n" +
+    "            <name>admin</name>\n" +
+    "            <uid>9000</uid>\n" +
+    "            <gid>20</gid>\n" +
+    "            <password>$1$3iwdPGZ1$PBh0MaDjzSFf1jozKYJUI1</password>\n" +
+    "            <ssh_keydir>/var/confd/homes/admin/.ssh</ssh_keydir>\n" +
+    "            <homedir>/var/confd/homes/admin</homedir>\n" +
+    "          </user>\n" +
+    "          <user>\n" +
+    "            <name>oper</name>\n" +
+    "            <uid>9000</uid>\n" +
+    "            <gid>20</gid>\n" +
+    "            <password>$1$hJImrsyG$Ey294aLU/8wE.Y5vgjqzm/</password>\n" +
+    "            <ssh_keydir>/var/confd/homes/oper/.ssh</ssh_keydir>\n" +
+    "            <homedir>/var/confd/homes/oper</homedir>\n" +
+    "          </user>\n" +
+    "          <user>\n" +
+    "            <name>private</name>\n" +
+    "            <uid>9000</uid>\n" +
+    "            <gid>20</gid>\n" +
+    "            <password>$1$f85WqsO0$GdtqBqa0yAZXXm5sSCv/M/</password>\n" +
+    "            <ssh_keydir>/var/confd/homes/private/.ssh</ssh_keydir>\n" +
+    "            <homedir>/var/confd/homes/private</homedir>\n" +
+    "          </user>\n" +
+    "          <user>\n" +
+    "            <name>public</name>\n" +
+    "            <uid>9000</uid>\n" +
+    "            <gid>20</gid>\n" +
+    "            <password>$1$lYiRxyl.$0ofHPegBlwr7asbjz/a/Q.</password>\n" +
+    "            <ssh_keydir>/var/confd/homes/public/.ssh</ssh_keydir>\n" +
+    "            <homedir>/var/confd/homes/public</homedir>\n" +
+    "          </user>\n" +
+    "        </users>\n" +
+    "      </authentication>\n" +
+    "      <ios>\n" +
+    "        <level>\n" +
+    "          <nr>0</nr>\n" +
+    "          <prompt>\\h>\n" +
+    "          </prompt>\n" +
+    "        </level>\n" +
+    "        <level>\n" +
+    "          <nr>15</nr>\n" +
+    "          <prompt>\\h#\n" +
+    "          </prompt>\n" +
+    "        </level>\n" +
+    "        <privilege>\n" +
+    "          <mode>exec</mode>\n" +
+    "          <level>\n" +
+    "            <nr>0</nr>\n" +
+    "            <command>\n" +
+    "              <name>action</name>\n" +
+    "            </command>\n" +
+    "            <command>\n" +
+    "              <name>autowizard</name>\n" +
+    "            </command>\n" +
+    "            <command>\n" +
+    "              <name>enable</name>\n" +
+    "            </command>\n" +
+    "            <command>\n" +
+    "              <name>exit</name>\n" +
+    "            </command>\n" +
+    "            <command>\n" +
+    "              <name>help</name>\n" +
+    "            </command>\n" +
+    "            <command>\n" +
+    "              <name>startup</name>\n" +
+    "            </command>\n" +
+    "          </level>\n" +
+    "          <level>\n" +
+    "            <nr>15</nr>\n" +
+    "            <command>\n" +
+    "              <name>configure</name>\n" +
+    "            </command>\n" +
+    "          </level>\n" +
+    "        </privilege>\n" +
+    "      </ios>\n" +
+    "    </aaa>\n" +
+    "    <nacm xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-acm\">\n" +
+    "      <write-default>permit</write-default>\n" +
+    "      <groups>\n" +
+    "        <group>\n" +
+    "          <name>admin</name>\n" +
+    "          <user-name>admin</user-name>\n" +
+    "          <user-name>private</user-name>\n" +
+    "        </group>\n" +
+    "        <group>\n" +
+    "          <name>oper</name>\n" +
+    "          <user-name>oper</user-name>\n" +
+    "          <user-name>public</user-name>\n" +
+    "        </group>\n" +
+    "      </groups>\n" +
+    "      <rule-list>\n" +
+    "        <name>admin</name>\n" +
+    "        <group>admin</group>\n" +
+    "        <rule>\n" +
+    "          <name>any-access</name>\n" +
+    "          <action>permit</action>\n" +
+    "        </rule>\n" +
+    "      </rule-list>\n" +
+    "      <rule-list>\n" +
+    "        <name>any-group</name>\n" +
+    "        <group>*</group>\n" +
+    "        <rule>\n" +
+    "          <name>tailf-aaa-authentication</name>\n" +
+    "          <module-name>tailf-aaa</module-name>\n" +
+    "          <path>/aaa/authentication/users/user[name='$USER']</path>\n" +
+    "          <access-operations>read update</access-operations>\n" +
+    "          <action>permit</action>\n" +
+    "        </rule>\n" +
+    "        <rule>\n" +
+    "          <name>tailf-aaa-user</name>\n" +
+    "          <module-name>tailf-aaa</module-name>\n" +
+    "          <path>/user[name='$USER']</path>\n" +
+    "          <access-operations>create read update delete</access-operations>\n" +
+    "          <action>permit</action>\n" +
+    "        </rule>\n" +
+    "        <rule>\n" +
+    "          <name>tailf-webui-user</name>\n" +
+    "          <module-name>tailf-webui</module-name>\n" +
+    "          <path>/webui/data-stores/user-profile[username='$USER']</path>\n" +
+    "          <access-operations>create read update delete</access-operations>\n" +
+    "          <action>permit</action>\n" +
+    "        </rule>\n" +
+    "      </rule-list>\n" +
+    "    </nacm>\n" +
+    "  </data>";
+
+    static final String RESPONSE_DATA1 =
+    "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"5\">\n" +
+    "  " + RESPONSE_BODY1 + "\n" +
+    "</rpc-reply>";
+
+    static final String ERROR_DATA2 =
+    "<rpc-reply message-id=\"101\"\n" +
+    "       xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"\n" +
+    "       xmlns:xc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+    "       <rpc-error>\n" +
+    "         <error-type>application</error-type>\n" +
+    "         <error-tag>invalid-value</error-tag>\n" +
+    "         <error-severity>error</error-severity>\n" +
+    "         <error-path xmlns:t=\"http://example.com/schema/1.2/config\">\n" +
+    "           /t:top/t:interface[t:name=\"Ethernet0/0\"]/t:mtu\n" +
+    "         </error-path>\n" +
+    "         <error-message xml:lang=\"en\">\n" +
+    "           MTU value 25000 is not within range 256..9192\n" +
+    "         </error-message>\n" +
+    "       </rpc-error>\n" +
+    "       <rpc-error>\n" +
+    "         <error-type>application</error-type>" +
+    "         <error-tag>invalid-value</error-tag>\n" +
+    "         <error-severity>error</error-severity>\n" +
+    "         <error-path xmlns:t=\"http://example.com/schema/1.2/config\">\n" +
+    "           /t:top/t:interface[t:name=\"Ethernet1/0\"]/t:address/t:name\n" +
+    "         </error-path>\n" +
+    "         <error-message xml:lang=\"en\">\n" +
+    "           Invalid IP address for interface Ethernet1/0\n" +
+    "         </error-message>\n" +
+    "       </rpc-error>\n" +
+    "     </rpc-reply>";
+
+
+    @Test
+    public void testOkParse() {
+        NetconfRpcReply ok = NetconfRpcParserUtil.parseRpcReply(OK_DATA1);
+        assertThat(ok.isOk(), is(true));
+        assertThat(ok.messageId(), is("3"));
+    }
+
+    @Test
+    public void testErrorWithAnyParse() {
+
+        NetconfRpcReply reply = NetconfRpcParserUtil.parseRpcReply(ERROR_DATA1);
+
+        assertThat(reply.messageId(), is("4"));
+
+        List<NetconfRpcError> errs = reply.errors();
+        assertThat(errs, hasSize(1));
+
+        NetconfRpcError err = errs.get(0);
+        assertThat(err.type(), is(ErrorType.APPLICATION));
+        assertThat(err.tag(), is(ErrorTag.INVALID_VALUE));
+        assertThat(err.severity(), is(ErrorSeverity.ERROR));
+        assertThat(err.path().isPresent(), is(true));
+        assertThat(err.path().get().trim(), is(ERROR_XPATH1));
+        assertThat(err.message(), is(notNullValue()));
+        assertThat(err.message(), is("\"fastEther\" is not a valid value."));
+        assertThat(err.info().get(NetconfRpcError.BAD_ELEMENT), is(endsWith("type")));
+        assertThat(err.info().size(), is(1));
+        assertThat(err.infoAny(), hasSize(1));
+        assertThat(err.infoAny().get(0), is(instanceOf(Node.class)));
+        assertThat(NetconfRpcParserUtil.toString(err.infoAny().get(0)),
+                   is(both(startsWith("<something")).and(endsWith("</something>"))));
+
+        assertThat(err.appTag().isPresent(), is(false));
+    }
+
+    @Test
+    public void testErrorParse() {
+
+        NetconfRpcReply reply = NetconfRpcParserUtil.parseRpcReply(ERROR_DATA2);
+
+        assertThat(reply.messageId(), is("101"));
+
+        List<NetconfRpcError> errs = reply.errors();
+        assertThat(errs, hasSize(2));
+
+        NetconfRpcError err1 = errs.get(0);
+        assertThat(err1.type(), is(ErrorType.APPLICATION));
+        assertThat(err1.tag(), is(ErrorTag.INVALID_VALUE));
+        assertThat(err1.severity(), is(ErrorSeverity.ERROR));
+        assertThat(err1.path().isPresent(), is(true));
+        assertThat(err1.path().get().trim(), is("/t:top/t:interface[t:name=\"Ethernet0/0\"]/t:mtu"));
+        assertThat(err1.message(), is(notNullValue()));
+        assertThat(err1.message().trim(), is("MTU value 25000 is not within range 256..9192"));
+        assertThat(err1.info().size(), is(0));
+        assertThat(err1.infoAny(), hasSize(0));
+        assertThat(err1.appTag().isPresent(), is(false));
+
+        NetconfRpcError err2 = errs.get(1);
+        assertThat(err2.type(), is(ErrorType.APPLICATION));
+        assertThat(err2.tag(), is(ErrorTag.INVALID_VALUE));
+        assertThat(err2.severity(), is(ErrorSeverity.ERROR));
+        assertThat(err2.path().isPresent(), is(true));
+        assertThat(err2.path().get().trim(), is("/t:top/t:interface[t:name=\"Ethernet1/0\"]/t:address/t:name"));
+        assertThat(err2.message(), is(notNullValue()));
+        assertThat(err2.message().trim(), is("Invalid IP address for interface Ethernet1/0"));
+        assertThat(err2.info().size(), is(0));
+        assertThat(err2.infoAny(), hasSize(0));
+        assertThat(err2.appTag().isPresent(), is(false));
+    }
+
+    @Test
+    public void testGetResponseParse() {
+        NetconfRpcReply rep = NetconfRpcParserUtil.parseRpcReply(RESPONSE_DATA1);
+        assertThat(rep.isOk(), is(false));
+        assertThat(rep.messageId(), is("5"));
+
+        assertThat(rep.responses(), hasSize(1));
+        assertThat(rep.responses().get(0),
+                   is(both(startsWith("<data")).and(endsWith("</data>"))));
+        // Can't do below: response contains xmlns attribute for netconf base
+        //assertThat(rep.responses().get(0), is(RESPONSE_BODY1));
+    }
+
+}