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));
+    }
+
+}
