diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/AbnormalSchemaException.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/AbnormalSchemaException.java
new file mode 100644
index 0000000..8a32ffd
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/AbnormalSchemaException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.error;
+
+/**
+ * AbnormalSchema exception is thrown when the received schema is invalid.
+ */
+public class AbnormalSchemaException extends RuntimeException {
+    private static final long serialVersionUID = 8328377718334680368L;
+
+    /**
+     * Constructs a AbnormalSchemaException object.
+     * @param message error message
+     */
+    public AbnormalSchemaException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a AbnormalSchemaException object.
+     * @param message error message
+     * @param cause Throwable
+     */
+    public AbnormalSchemaException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/ArgumentException.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/ArgumentException.java
new file mode 100644
index 0000000..d7d69d1
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/ArgumentException.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.error;
+
+/**
+ * This exception is thrown when the argument is not supported.
+ */
+public class ArgumentException extends RuntimeException {
+    private static final long serialVersionUID = 4950089877540156797L;
+
+    /**
+     * Constructs a ArgumentException object.
+     * @param message error message
+     */
+    public ArgumentException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a ArgumentException object.
+     * @param message error message
+     * @param cause Throwable
+     */
+    public ArgumentException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/ColumnSchemaNotFoundException.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/ColumnSchemaNotFoundException.java
new file mode 100644
index 0000000..acdbdf5
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/ColumnSchemaNotFoundException.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.error;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * This exception is thrown when a ColumnSchema cannot be found.
+ */
+public class ColumnSchemaNotFoundException extends RuntimeException {
+    private static final long serialVersionUID = -4325190659387339524L;
+
+    /**
+     * Constructs a ColumnSchemaNotFoundException object.
+     * @param message error message
+     */
+    public ColumnSchemaNotFoundException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a ColumnSchemaNotFoundException object.
+     * @param message error message
+     * @param cause Throwable
+     */
+    public ColumnSchemaNotFoundException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Create error message.
+     * @param columnName column name
+     * @param tableName table name
+     * @return message
+     */
+    public static String createMessage(String columnName, String tableName) {
+        String message = toStringHelper("ColumnSchemaNotFoundException")
+                .addValue("Could not find ColumnSchema for " + columnName
+                                  + " in " + tableName).toString();
+        return message;
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/JsonParsingException.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/JsonParsingException.java
new file mode 100644
index 0000000..e62a03f
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/JsonParsingException.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.error;
+
+/**
+ * The JsonParsingException is thrown when JSON could not be successfully
+ * parsed.
+ */
+public class JsonParsingException extends RuntimeException {
+    private static final long serialVersionUID = 1424752181911923235L;
+
+    /**
+     * Constructs a JsonParsingException object.
+     * @param message error message
+     */
+    public JsonParsingException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a JsonParsingException object.
+     * @param message error message
+     * @param cause Throwable
+     */
+    public JsonParsingException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Constructs a JsonParsingException object.
+     * @param cause Throwable
+     */
+    public JsonParsingException(Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * Constructs a JsonParsingException object.
+     * @param message error message
+     * @param cause Throwable
+     * @param enableSuppression enable Suppression
+     * @param writableStackTrace writable StackTrace
+     */
+    public JsonParsingException(String message, Throwable cause,
+                                boolean enableSuppression,
+                                boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/TableSchemaNotFoundException.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/TableSchemaNotFoundException.java
new file mode 100644
index 0000000..698e6e3
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/TableSchemaNotFoundException.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.error;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * This exception is thrown when a TableSchema cannot be found.
+ */
+public class TableSchemaNotFoundException extends RuntimeException {
+    private static final long serialVersionUID = 8431894450061740838L;
+
+    /**
+     * Constructs a TableSchemaNotFoundException object.
+     * @param message error message
+     */
+    public TableSchemaNotFoundException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a TableSchemaNotFoundException object.
+     * @param message error message
+     * @param cause Throwable
+     */
+    public TableSchemaNotFoundException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Create error message.
+     * @param tableName table name
+     * @param schemaName database name
+     * @return message
+     */
+    public static String createMessage(String tableName, String schemaName) {
+        String message = toStringHelper("TableSchemaNotFoundException")
+                .addValue("Can not find TableSchema for " + tableName + " in "
+                        + schemaName).toString();
+        return message;
+    }
+
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/TypedSchemaException.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/TypedSchemaException.java
new file mode 100644
index 0000000..59aea30
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/TypedSchemaException.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.error;
+
+/**
+ * This is a generic exception thrown by the Typed Schema utilities.
+ */
+public class TypedSchemaException extends RuntimeException {
+    private static final long serialVersionUID = -1452257990783176715L;
+
+    /**
+     * Constructs a TypedSchemaException object.
+     * @param message error message
+     */
+    public TypedSchemaException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a TypedSchemaException object.
+     * @param message error message
+     * @param cause Throwable
+     */
+    public TypedSchemaException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/UnknownResultException.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/UnknownResultException.java
new file mode 100644
index 0000000..ab30fb1
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/UnknownResultException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.error;
+
+/**
+ * This exception is thrown when a result does not meet any of the known formats
+ * in RFC7047.
+ */
+public class UnknownResultException extends RuntimeException {
+    private static final long serialVersionUID = 1377011546616825375L;
+
+    /**
+     * Constructs a UnknownResultException object.
+     * @param message error message
+     */
+    public UnknownResultException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a UnknownResultException object.
+     * @param message error message
+     * @param cause Throwable
+     */
+    public UnknownResultException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/UnsupportedEncodingException.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/UnsupportedEncodingException.java
new file mode 100644
index 0000000..6ba7fd5
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/UnsupportedEncodingException.java
@@ -0,0 +1,16 @@
+package org.onosproject.ovsdb.rfc.error;
+
+/**
+ * This exception is thrown when the encoding does not meet UTF-8 in RFC7047.
+ */
+public class UnsupportedEncodingException extends RuntimeException {
+    private static final long serialVersionUID = -4865311369828520666L;
+
+    /**
+     * Constructs a UnsupportedEncodingException object.
+     * @param message error message
+     */
+    public UnsupportedEncodingException(String message) {
+        super(message);
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/VersionMismatchException.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/VersionMismatchException.java
new file mode 100644
index 0000000..68d63b9
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/error/VersionMismatchException.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.error;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * This exception is used when the a table or row is accessed though a typed
+ * interface and the version requirements are not met.
+ */
+public class VersionMismatchException extends RuntimeException {
+    private static final long serialVersionUID = -8439624321110133595L;
+
+    /**
+     * Constructs a VersionMismatchException object.
+     * @param message error message
+     */
+    public VersionMismatchException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a VersionMismatchException object.
+     * @param message error message
+     * @param cause Throwable
+     */
+    public VersionMismatchException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Create error message.
+     * @param actualVersion the actual version
+     * @param fromVersion the initial version
+     * @return message
+     */
+    public static String createFromMessage(String actualVersion,
+                                           String fromVersion) {
+        String message = toStringHelper("VersionMismatchException")
+                .addValue("The fromVersion should less than the actualVersion.\n"
+                                  + "fromVersion: "
+                                  + fromVersion
+                                  + ".\n"
+                                  + "actualVersion: " + actualVersion)
+                .toString();
+        return message;
+    }
+
+    /**
+     * Create error message.
+     * @param actualVersion the actual version
+     * @param toVersion the end version
+     * @return message
+     */
+    public static String createToMessage(String actualVersion, String toVersion) {
+        String message = toStringHelper("VersionMismatchException")
+                .addValue("The toVersion should greater than the required version.\n"
+                                  + "toVersion: "
+                                  + toVersion
+                                  + ".\n"
+                                  + "Actual Version: " + actualVersion)
+                .toString();
+        return message;
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/MonitorRequest.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/MonitorRequest.java
new file mode 100644
index 0000000..e2176ae
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/MonitorRequest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.message;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+import java.util.Set;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+/**
+ * Monitor Requst information that need to monitor table.
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public final class MonitorRequest {
+    @JsonIgnore
+    private final String tableName;
+    private final Set<String> columns;
+    private final MonitorSelect select;
+
+    /**
+     * Constructs a MonitorRequest object.
+     * @param tableName table name
+     * @param columns a set of column name
+     * @param select monitor action
+     */
+    public MonitorRequest(String tableName, Set<String> columns,
+                          MonitorSelect select) {
+        checkNotNull(tableName, "tableName is not null");
+        checkNotNull(columns, "columns is not null");
+        checkNotNull(select, "select is not null");
+        this.tableName = tableName;
+        this.columns = columns;
+        this.select = select;
+    }
+
+    /**
+     * Returns tableName.
+     * @return tableName
+     */
+    public String getTableName() {
+        return tableName;
+    }
+
+    /**
+     * Returns select.
+     * @return select
+     */
+    public MonitorSelect getSelect() {
+        return select;
+    }
+
+    /**
+     * Returns columns.
+     * @return columns
+     */
+    public Set<String> getColumns() {
+        return columns;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(tableName, select, columns);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof MonitorRequest) {
+            final MonitorRequest other = (MonitorRequest) obj;
+            return Objects.equals(this.tableName, other.tableName)
+                    && Objects.equals(this.select, other.select)
+                    && Objects.equals(this.columns, other.columns);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("tableName", tableName)
+                .add("select", select).add("columns", columns).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/MonitorSelect.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/MonitorSelect.java
new file mode 100644
index 0000000..502fc4d
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/MonitorSelect.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.message;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * The contents of this object specify how the columns or table are to be
+ * monitored.
+ */
+public final class MonitorSelect {
+
+    private final boolean initial;
+    private final boolean insert;
+    private final boolean delete;
+    private final boolean modify;
+
+    /**
+     * Constructs a MonitorSelect object.
+     * @param initial whether monitor the initial action
+     * @param insert whether monitor the insert action
+     * @param delete whether monitor the delete action
+     * @param modify whether monitor the modify action
+     */
+    public MonitorSelect(boolean initial, boolean insert, boolean delete,
+                         boolean modify) {
+        this.initial = initial;
+        this.insert = insert;
+        this.delete = delete;
+        this.modify = modify;
+    }
+
+    /**
+     * Returns initial.
+     * @return initial
+     */
+    public boolean isInitial() {
+        return initial;
+    }
+
+    /**
+     * Returns insert.
+     * @return insert
+     */
+    public boolean isInsert() {
+        return insert;
+    }
+
+    /**
+     * Returns delete.
+     * @return delete
+     */
+    public boolean isDelete() {
+        return delete;
+    }
+
+    /**
+     * Returns modify.
+     * @return modify
+     */
+    public boolean isModify() {
+        return modify;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(initial, insert, delete, modify);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof MonitorSelect) {
+            final MonitorSelect other = (MonitorSelect) obj;
+            return Objects.equals(this.initial, other.initial)
+                    && Objects.equals(this.insert, other.insert)
+                    && Objects.equals(this.delete, other.delete)
+                    && Objects.equals(this.modify, other.modify);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("initial", initial)
+                .add("insert", insert).add("delete", delete)
+                .add("modify", modify).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/OperationResult.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/OperationResult.java
new file mode 100644
index 0000000..7f2cb6c
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/OperationResult.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.message;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.notation.UUID;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * All results of ovs table operations. refer to RFC7047 5.2.
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public final class OperationResult {
+    private int count;
+    @JsonIgnore
+    private UUID uuid;
+    private List<Row> rows;
+    private String error;
+    private String details;
+
+    /**
+     * Constructs a OperationResult object. When JsonNode is converted into
+     * OperationResult, need this constructor and also need setter method.
+     */
+    public OperationResult() {
+    }
+
+    /**
+     * Constructs a OperationResult object.
+     * @param rows List of Row entity
+     */
+    public OperationResult(List<Row> rows) {
+        checkNotNull(rows, "rows is not null");
+        this.rows = rows;
+    }
+
+    /**
+     * Constructs a OperationResult object.
+     * @param count the count node of result
+     * @param uuid UUID entity
+     * @param rows List of Row entity
+     * @param error error message
+     * @param details details of error message
+     */
+    public OperationResult(int count, UUID uuid, List<Row> rows, String error,
+                           String details) {
+        checkNotNull(uuid, "uuid is not null");
+        checkNotNull(rows, "rows is not null");
+        checkNotNull(error, "error is not null");
+        checkNotNull(details, "details is not null");
+        this.count = count;
+        this.uuid = uuid;
+        this.rows = rows;
+        this.error = error;
+        this.details = details;
+    }
+
+    /**
+     * Return count.
+     * @return count
+     */
+    public int getCount() {
+        return count;
+    }
+
+    /**
+     * Set count value.
+     * @param count the Operation message of count
+     */
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    /**
+     * Return uuid.
+     * @return uuid
+     */
+    @JsonProperty("uuid")
+    public UUID getUuid() {
+        return uuid;
+    }
+
+    /**
+     * Set uuid value.
+     * @param uuid the Operation message of uuid
+     */
+    public void setUuid(String uuid) {
+        checkNotNull(uuid, "uuid is not null");
+        this.uuid = UUID.uuid(uuid);
+    }
+
+    /**
+     * Return rows.
+     * @return List of Row
+     */
+    public List<Row> getRows() {
+        return rows;
+    }
+
+    /**
+     * Set rows value.
+     * @param rows the Operation message of rows
+     */
+    public void setRows(List<Row> rows) {
+        checkNotNull(rows, "rows is not null");
+        this.rows = rows;
+    }
+
+    /**
+     * Return error.
+     * @return error
+     */
+    public String getError() {
+        return error;
+    }
+
+    /**
+     * Set error value.
+     * @param error the Operation message of error
+     */
+    public void setError(String error) {
+        checkNotNull(error, "error is not null");
+        this.error = error;
+    }
+
+    /**
+     * Return details.
+     * @return details
+     */
+    public String getDetails() {
+        return details;
+    }
+
+    /**
+     * Set details value.
+     * @param details the Operation message of details
+     */
+    public void setDetails(String details) {
+        checkNotNull(details, "details is not null");
+        this.details = details;
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/RowUpdate.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/RowUpdate.java
new file mode 100644
index 0000000..db11edd
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/RowUpdate.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.message;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.notation.UUID;
+
+/**
+ * A TableUpdate is an object that maps from the row's UUID to a RowUpdate object.
+ * A RowUpdate is an object with the following members: "old": row, "new": row.
+ * Refer to RFC 7047 Section 4.1.6.
+ */
+public final class RowUpdate {
+    private final UUID uuid;
+    private final Row oldRow;
+    private final Row newRow;
+
+    /**
+     * Constructs a RowUpdate object.
+     * @param uuid UUID
+     * @param oldRow present for "delete" and "modify" updates
+     * @param newRow present for "initial", "insert", and "modify" updates
+     */
+    public RowUpdate(UUID uuid, Row oldRow, Row newRow) {
+        checkNotNull(uuid, "uuid is not null");
+        this.uuid = uuid;
+        this.oldRow = oldRow;
+        this.newRow = newRow;
+    }
+
+    /**
+     * Return uuid.
+     * @return uuid
+     */
+    public UUID uuid() {
+        return this.uuid;
+    }
+
+    /**
+     * Return oldRow.
+     * @return oldRow
+     */
+    public Row oldRow() {
+        return oldRow;
+    }
+
+    /**
+     * Return newRow.
+     * @return newRow
+     */
+    public Row newRow() {
+        return newRow;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(uuid, oldRow, newRow);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof RowUpdate) {
+            final RowUpdate other = (RowUpdate) obj;
+            return Objects.equals(this.uuid, other.uuid)
+                    && Objects.equals(this.oldRow, other.oldRow)
+                    && Objects.equals(this.newRow, other.newRow);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("uuid", uuid).add("oldRow", oldRow)
+                .add("newRow", newRow).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/TableUpdate.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/TableUpdate.java
new file mode 100644
index 0000000..5228490
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/TableUpdate.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.message;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Map;
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.notation.UUID;
+
+/**
+ * TableUpdate is an object that maps from the row's UUID to a RowUpdate object.
+ */
+public final class TableUpdate {
+
+    private final Map<UUID, RowUpdate> rows;
+
+    /**
+     * Constructs a TableUpdate object.
+     * @param rows the parameter of TableUpdate entity
+     */
+    private TableUpdate(Map<UUID, RowUpdate> rows) {
+        this.rows = rows;
+    }
+
+    /**
+     * Get TableUpdate entity.
+     * @param rows the parameter of TableUpdate entity
+     * @return TableUpdate entity
+     */
+    public static TableUpdate tableUpdate(Map<UUID, RowUpdate> rows) {
+        return new TableUpdate(rows);
+    }
+
+    /**
+     * Return old row.
+     * @param uuid the key of rows
+     * @return Row old row
+     */
+    public Row getOld(UUID uuid) {
+        RowUpdate rowUpdate = rows.get(uuid);
+        if (rowUpdate == null) {
+            return null;
+        }
+        return rowUpdate.oldRow();
+    }
+
+    /**
+     * Return new row.
+     * @param uuid the key of rows
+     * @return Row new row
+     */
+    public Row getNew(UUID uuid) {
+        RowUpdate rowUpdate = rows.get(uuid);
+        if (rowUpdate == null) {
+            return null;
+        }
+        return rowUpdate.newRow();
+    }
+
+    /**
+     * Return rows.
+     * @return rows
+     */
+    public Map<UUID, RowUpdate> rows() {
+        return rows;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(rows);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof TableUpdate) {
+            final TableUpdate other = (TableUpdate) obj;
+            return Objects.equals(this.rows, other.rows);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("rows", rows).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/TableUpdates.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/TableUpdates.java
new file mode 100644
index 0000000..46d3245
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/TableUpdates.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.message;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+/**
+ * TableUpdates is an object that maps from a table name to a TableUpdate.
+ */
+public final class TableUpdates {
+
+    private final Map<String, TableUpdate> result;
+
+    /**
+     * Constructs a TableUpdates object.
+     * @param result the parameter of TableUpdates entity
+     */
+    private TableUpdates(Map<String, TableUpdate> result) {
+        this.result = result;
+    }
+
+    /**
+     * Get TableUpdates.
+     * @param result the parameter of TableUpdates entity
+     * @return TableUpdates
+     */
+    public static TableUpdates tableUpdates(Map<String, TableUpdate> result) {
+        checkNotNull(result, "result is not null");
+        return new TableUpdates(result);
+    }
+
+    /**
+     * Return TableUpdate.
+     * @param table the TableSchema of TableUpdates
+     * @return TableUpdate
+     */
+    public TableUpdate tableUpdate(TableSchema table) {
+        return this.result.get(table.name());
+    }
+
+    /**
+     * Return the map of TableUpdate.
+     * @return result
+     */
+    public Map<String, TableUpdate> result() {
+        return result;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(result);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof TableUpdates) {
+            final TableUpdates other = (TableUpdates) obj;
+            return Objects.equals(this.result, other.result);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("result", result).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/UpdateNotification.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/UpdateNotification.java
new file mode 100644
index 0000000..c97396e
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/UpdateNotification.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.message;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.notation.json.UpdateNotificationConverter;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+/**
+ * The "update" notification is sent by the server to the client to report
+ * changes in tables that are being monitored following a "monitor" request. The
+ * "params" of the result JsonNode.
+ */
+@JsonDeserialize(converter = UpdateNotificationConverter.class)
+public final class UpdateNotification {
+    private final Object context;
+    private final JsonNode tbUpdatesJsonNode;
+
+    /**
+     * Constructs a UpdateNotification object.
+     * @param context the "json-value" in "params" of the result JsonNode
+     * @param tbUpdatesJsonNode the "table-updates" in "params" of the result JsonNode
+     */
+    public UpdateNotification(Object context, JsonNode tbUpdatesJsonNode) {
+        checkNotNull(context, "context is not null");
+        checkNotNull(tbUpdatesJsonNode, "tbUpdatesJsonNode is not null");
+        this.context = context;
+        this.tbUpdatesJsonNode = tbUpdatesJsonNode;
+    }
+
+    /**
+     * Return context.
+     * @return context
+     */
+    public Object context() {
+        return context;
+    }
+
+    /**
+     * Return tbUpdatesJsonNode.
+     * @return tbUpdatesJsonNode
+     */
+    public JsonNode tbUpdatesJsonNode() {
+        return tbUpdatesJsonNode;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(context, tbUpdatesJsonNode);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof UpdateNotification) {
+            final UpdateNotification other = (UpdateNotification) obj;
+            return Objects.equals(this.context, other.context)
+                    && Objects.equals(this.tbUpdatesJsonNode,
+                                      other.tbUpdatesJsonNode);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("context", context)
+                .add("tbUpdatesJsonNode", tbUpdatesJsonNode).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Column.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Column.java
new file mode 100644
index 0000000..e6e6a05
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Column.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * Column is the basic element of the OpenVswitch database.
+ */
+public final class Column {
+    @JsonIgnore
+    private final ColumnSchema schema;
+    private final Object data;
+
+    /**
+     * Column constructor.
+     * @param schema the column schema
+     * @param obj the data of the column
+     */
+    public Column(ColumnSchema schema, Object obj) {
+        checkNotNull(schema, "schema is not null");
+        checkNotNull(obj, "data is not null");
+        this.schema = schema;
+        this.data = obj;
+    }
+
+    /**
+     * Returns column data.
+     * @return column data
+     */
+    public Object data() {
+        return data;
+    }
+
+    /**
+     * Returns ColumnSchema.
+     * @return ColumnSchema
+     */
+    public ColumnSchema schema() {
+        return schema;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(schema, data);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof Column) {
+            final Column other = (Column) obj;
+            return Objects.equals(this.schema, other.schema)
+                    && Objects.equals(this.data, other.data);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("schema", schema).add("data", data)
+                .toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Condition.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Condition.java
new file mode 100644
index 0000000..40aab68
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Condition.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.notation.json.ConditionSerializer;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+/**
+ * Condition is a 3-element JSON array of the form [column, function, value]
+ * that represents a test on a column value.
+ */
+@JsonSerialize(using = ConditionSerializer.class)
+public final class Condition {
+    /**
+     * Function of Notation. Refer to RFC 7047 Section 5.1.
+     */
+    public enum Function {
+        LESS_THAN("<"), LESS_THAN_OR_EQUALS("<="), EQUALS("=="),
+        NOT_EQUALS("!="), GREATER_THAN(">"), GREATER_THAN_OR_EQUALS(">="),
+        INCLUDES("includes"), EXCLUDES("excludes");
+
+        private final String function;
+
+        private Function(String function) {
+            this.function = function;
+        }
+
+        /**
+         * Returns the function for Function.
+         * @return the function
+         */
+        public String function() {
+            return function;
+        }
+    }
+
+    private final String column;
+    private final Function function;
+    private final Object value;
+
+    /**
+     * Constructs a Condition object.
+     * @param column the column name
+     * @param function Function
+     * @param value column data
+     */
+    public Condition(String column, Function function, Object value) {
+        checkNotNull(column, "column is not null");
+        checkNotNull(function, "function is not null");
+        checkNotNull(value, "value is not null");
+        this.column = column;
+        this.function = function;
+        this.value = value;
+    }
+
+    /**
+     * Returns column name.
+     * @return column name
+     */
+    public String getColumn() {
+        return column;
+    }
+
+    /**
+     * Returns Function.
+     * @return Function
+     */
+    public Function getFunction() {
+        return function;
+    }
+
+    /**
+     * Returns column data.
+     * @return column data
+     */
+    public Object getValue() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(column, function, value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof Condition) {
+            final Condition other = (Condition) obj;
+            return Objects.equals(this.column, other.column)
+                    && Objects.equals(this.function, other.function)
+                    && Objects.equals(this.value, other.value);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("column", column)
+                .add("function", function).add("value", value).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Mutation.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Mutation.java
new file mode 100644
index 0000000..aaad796
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Mutation.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.notation.json.MutationSerializer;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+/**
+ * Mutation is s 3-element JSON array of the form [column, mutator, value] that
+ * represents a change to a column value.
+ */
+@JsonSerialize(using = MutationSerializer.class)
+public final class Mutation {
+    /**
+     * Mutator must be "+=", "-=", "*=", "/=", or (integer only) "%=". The value
+     * of column is changed to the sum, difference, product, quotient, or
+     * remainder, respectively, of column and value.
+     */
+    public enum Mutator {
+        SUM("+="), DIFFERENCE("-="), PRODUCT("*="), QUOTIENT("/="),
+        REMAINDER("%="), INSERT("insert"), DELETE("delete");
+
+        private final String mutator;
+
+        private Mutator(String mutator) {
+            this.mutator = mutator;
+        }
+
+        /**
+         * Returns the mutator for Mutator.
+         * @return the mutator
+         */
+        public String mutator() {
+            return mutator;
+        }
+    }
+
+    private final String column;
+    private final Mutator mutator;
+    private final Object value;
+
+    /**
+     * Mutation constructor.
+     * @param column the column name
+     * @param mutator Mutator
+     * @param value column data
+     */
+    public Mutation(String column, Mutator mutator, Object value) {
+        checkNotNull(column, "column is not null");
+        checkNotNull(mutator, "mutator is not null");
+        checkNotNull(value, "value is not null");
+        this.column = column;
+        this.mutator = mutator;
+        this.value = value;
+    }
+
+    /**
+     * Returns column name.
+     * @return column name
+     */
+    public String getColumn() {
+        return column;
+    }
+
+    /**
+     * Returns Mutator.
+     * @return Mutator
+     */
+    public Mutator getMutator() {
+        return mutator;
+    }
+
+    /**
+     * Returns column data.
+     * @return column data
+     */
+    public Object getValue() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(column, mutator, value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof Mutation) {
+            final Mutation other = (Mutation) obj;
+            return Objects.equals(this.column, other.column)
+                    && Objects.equals(this.mutator, other.mutator)
+                    && Objects.equals(this.value, other.value);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("column", column)
+                .add("mutator", mutator).add("value", value).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/OvsdbMap.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/OvsdbMap.java
new file mode 100644
index 0000000..beb9222
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/OvsdbMap.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.notation.json.OvsdbMapSerializer;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+/**
+ * OvsdbMap is a 2-element JSON array that represents a database map value.
+ */
+@JsonSerialize(using = OvsdbMapSerializer.class)
+public final class OvsdbMap {
+
+    private final Map map;
+
+    /**
+     * OvsdbMap constructor.
+     * @param map java.util.Map
+     */
+    private OvsdbMap(Map map) {
+        checkNotNull(map, "map is not null");
+        this.map = map;
+    }
+
+    /**
+     * Returns map.
+     * @return map
+     */
+    public Map map() {
+        return map;
+    }
+
+    /**
+     * convert Map into OvsdbMap.
+     * @param map java.util.Map
+     * @return OvsdbMap
+     */
+    public static OvsdbMap ovsdbMap(Map map) {
+        return new OvsdbMap(map);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(map);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbMap) {
+            final OvsdbMap other = (OvsdbMap) obj;
+            return Objects.equals(this.map, other.map);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("map", map).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/OvsdbSet.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/OvsdbSet.java
new file mode 100644
index 0000000..db54906
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/OvsdbSet.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+import java.util.Set;
+
+import org.onosproject.ovsdb.rfc.notation.json.OvsdbSetSerializer;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+/**
+ * OvsdbSet is either an atom, representing a set with exactly one element, or
+ * a 2-element JSON array that represents a database set value.
+ *
+ */
+@JsonSerialize(using = OvsdbSetSerializer.class)
+public final class OvsdbSet {
+
+    private final Set set;
+
+    /**
+     * OvsdbSet constructor.
+     * @param set java.util.Set
+     */
+    private OvsdbSet(Set set) {
+        checkNotNull(set, "set is not null");
+        this.set = set;
+    }
+
+    /**
+     * Returns set.
+     * @return set
+     */
+    public Set set() {
+        return set;
+    }
+
+    /**
+     * convert Set into OvsdbSet.
+     * @param set java.util.Set
+     * @return OvsdbSet
+     */
+    public static OvsdbSet ovsdbSet(Set set) {
+        return new OvsdbSet(set);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(set);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbSet) {
+            final OvsdbSet other = (OvsdbSet) obj;
+            return Objects.equals(this.set, other.set);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("set", set).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/RefTableRow.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/RefTableRow.java
new file mode 100644
index 0000000..c3a245d
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/RefTableRow.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * The RefTable type that can be expanded to Row. Refer to RFC 7047 Section 3.2.
+ */
+public final class RefTableRow {
+
+    private final String refTable;
+    private final JsonNode jsonNode;
+
+    /**
+     * RefTableRow constructor.
+     * @param refTable the refTable value of JsonNode
+     * @param jsonNode JsonNode
+     */
+    public RefTableRow(String refTable, JsonNode jsonNode) {
+        checkNotNull(refTable, "refTable is not null");
+        checkNotNull(jsonNode, "jsonNode is not null");
+        this.refTable = refTable;
+        this.jsonNode = jsonNode;
+    }
+
+    /**
+     * Returns JsonNode.
+     * @return JsonNode
+     */
+    public JsonNode jsonNode() {
+        return jsonNode;
+    }
+
+    /**
+     * Returns refTable.
+     * @return refTable
+     */
+    public String refTable() {
+        return refTable;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(refTable, jsonNode);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof RefTableRow) {
+            final RefTableRow other = (RefTableRow) obj;
+            return Objects.equals(this.refTable, other.refTable)
+                    && Objects.equals(this.jsonNode, other.jsonNode);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("refTable", refTable)
+                .add("jsonNode", jsonNode).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java
new file mode 100644
index 0000000..3c2e53d
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.google.common.collect.Maps;
+
+/**
+ * Row is the basic element of the OpenVswitch's table.
+ */
+public final class Row {
+    @JsonIgnore
+    private TableSchema tableSchema;
+    private Map<String, Column> columns;
+
+    /**
+     * Row constructor.
+     */
+    public Row() {
+        this.columns = Maps.newHashMap();
+    }
+
+    /**
+     * Row constructor.
+     * @param tableSchema TableSchema entity
+     */
+    public Row(TableSchema tableSchema) {
+        checkNotNull(tableSchema, "tableSchema is not null");
+        this.tableSchema = tableSchema;
+        this.columns = Maps.newHashMap();
+    }
+
+    /**
+     * Row constructor.
+     * @param tableSchema TableSchema entity
+     * @param columns List of Column entity
+     */
+    public Row(TableSchema tableSchema, List<Column> columns) {
+        checkNotNull(tableSchema, "tableSchema is not null");
+        checkNotNull(columns, "columns is not null");
+        this.tableSchema = tableSchema;
+        this.columns = Maps.newHashMap();
+        for (Column column : columns) {
+            this.columns.put(column.schema().name(), column);
+        }
+    }
+
+    /**
+     * Returns tableSchema.
+     * @return tableSchema
+     */
+    public TableSchema getTableSchema() {
+        return tableSchema;
+    }
+
+    /**
+     * Set tableSchema value.
+     * @param tableSchema TableSchema entity
+     */
+    public void setTableSchema(TableSchema tableSchema) {
+        this.tableSchema = tableSchema;
+    }
+
+    /**
+     * Returns Column by ColumnSchema.
+     * @param schema ColumnSchema entity
+     * @return Column
+     */
+    public Column getColumn(ColumnSchema schema) {
+        return (Column) columns.get(schema.name());
+    }
+
+    /**
+     * Returns Collection of Column.
+     * @return Collection of Column
+     */
+    public Collection<Column> getColumns() {
+        return columns.values();
+    }
+
+    /**
+     * add Column.
+     * @param columnName column name
+     * @param data Column entity
+     */
+    public void addColumn(String columnName, Column data) {
+        this.columns.put(columnName, data);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(tableSchema, columns);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof Row) {
+            final Row other = (Row) obj;
+            return Objects.equals(this.tableSchema, other.tableSchema)
+                    && Objects.equals(this.columns, other.columns);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("tableSchema", tableSchema).add("columns", columns).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/UUID.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/UUID.java
new file mode 100644
index 0000000..a0dd08e
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/UUID.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.notation.json.UUIDSerializer;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+/**
+ * Handles both uuid and named-uuid.
+ */
+@JsonSerialize(using = UUIDSerializer.class)
+public final class UUID {
+    private final String value;
+
+    /**
+     * UUID constructor.
+     * @param value UUID value
+     */
+    private UUID(String value) {
+        checkNotNull(value, "value is not null");
+        this.value = value;
+    }
+
+    /**
+     * Get UUID.
+     * @param value UUID value
+     * @return UUID
+     */
+    public static UUID uuid(String value) {
+        return new UUID(value);
+    }
+
+    /**
+     * Returns value.
+     * @return value
+     */
+    public String value() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof UUID) {
+            final UUID other = (UUID) obj;
+            return Objects.equals(this.value, other.value);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("value", value).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/ConditionSerializer.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/ConditionSerializer.java
new file mode 100644
index 0000000..551a66a
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/ConditionSerializer.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation.json;
+
+import java.io.IOException;
+
+import org.onosproject.ovsdb.rfc.notation.Condition;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+/**
+ * Condition Serializer.
+ */
+public class ConditionSerializer extends JsonSerializer<Condition> {
+    @Override
+    public void serialize(Condition condition, JsonGenerator generator,
+                          SerializerProvider provider)
+            throws IOException, JsonProcessingException {
+        generator.writeStartArray();
+        generator.writeString(condition.getColumn());
+        generator.writeString(condition.getFunction().function());
+        generator.writeObject(condition.getValue());
+        generator.writeEndArray();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/MutationSerializer.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/MutationSerializer.java
new file mode 100644
index 0000000..a18b9e7
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/MutationSerializer.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation.json;
+
+import java.io.IOException;
+
+import org.onosproject.ovsdb.rfc.notation.Mutation;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+/**
+ * Mutation Serializer.
+ */
+public class MutationSerializer extends JsonSerializer<Mutation> {
+    @Override
+    public void serialize(Mutation condition, JsonGenerator generator,
+                          SerializerProvider provider)
+            throws IOException, JsonProcessingException {
+        generator.writeStartArray();
+        generator.writeString(condition.getColumn());
+        generator.writeString(condition.getMutator().mutator());
+        generator.writeObject(condition.getValue());
+        generator.writeEndArray();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/OvsdbMapSerializer.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/OvsdbMapSerializer.java
new file mode 100644
index 0000000..60fd334
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/OvsdbMapSerializer.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation.json;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.onosproject.ovsdb.rfc.notation.OvsdbMap;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+/**
+ * OvsdbMap Serializer.
+ */
+public class OvsdbMapSerializer extends JsonSerializer<OvsdbMap> {
+    @Override
+    public void serialize(OvsdbMap map, JsonGenerator generator,
+                          SerializerProvider provider)
+            throws IOException, JsonProcessingException {
+        generator.writeStartArray();
+        generator.writeString("map");
+        generator.writeStartArray();
+        Map javaMap = map.map();
+        for (Object key : javaMap.keySet()) {
+            generator.writeStartArray();
+            generator.writeObject(key);
+            generator.writeObject(javaMap.get(key));
+            generator.writeEndArray();
+        }
+        generator.writeEndArray();
+        generator.writeEndArray();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/OvsdbSetSerializer.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/OvsdbSetSerializer.java
new file mode 100644
index 0000000..509b2c5
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/OvsdbSetSerializer.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation.json;
+
+import java.io.IOException;
+import java.util.Set;
+
+import org.onosproject.ovsdb.rfc.notation.OvsdbSet;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+/**
+ * OvsdbSet Serializer.
+ */
+public class OvsdbSetSerializer extends JsonSerializer<OvsdbSet> {
+    @Override
+    public void serialize(OvsdbSet set, JsonGenerator generator,
+                          SerializerProvider provider)
+            throws IOException, JsonProcessingException {
+        generator.writeStartArray();
+        generator.writeString("set");
+        generator.writeStartArray();
+        Set javaSet = set.set();
+        for (Object key : javaSet) {
+            generator.writeObject(key);
+        }
+        generator.writeEndArray();
+        generator.writeEndArray();
+    }
+}
\ No newline at end of file
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/UUIDSerializer.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/UUIDSerializer.java
new file mode 100644
index 0000000..ab2621d
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/UUIDSerializer.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation.json;
+
+import java.io.IOException;
+
+import org.onosproject.ovsdb.rfc.notation.UUID;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+/**
+ * UUID Serializer.
+ */
+public class UUIDSerializer extends JsonSerializer<UUID> {
+    @Override
+    public void serialize(UUID value, JsonGenerator generator,
+                          SerializerProvider provider)
+            throws IOException, JsonProcessingException {
+        generator.writeStartArray();
+        try {
+            java.util.UUID.fromString(value.value());
+            generator.writeString("uuid");
+        } catch (IllegalArgumentException ex) {
+            generator.writeString("named-uuid");
+        }
+        generator.writeString(value.value());
+        generator.writeEndArray();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/UpdateNotificationConverter.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/UpdateNotificationConverter.java
new file mode 100644
index 0000000..2bb1b63
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/UpdateNotificationConverter.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.notation.json;
+
+import org.onosproject.ovsdb.rfc.message.UpdateNotification;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.util.StdConverter;
+
+/**
+ * UpdateNotificationDeser Converter.
+ */
+public class UpdateNotificationConverter
+        extends StdConverter<JsonNode, UpdateNotification> {
+
+    @Override
+    public UpdateNotification convert(JsonNode value) {
+        return deserialize(value);
+    }
+
+    /**
+     * JsonNode convert into UpdateNotification.
+     * @param node the "params" node of UpdateNotification JsonNode
+     */
+    private UpdateNotification deserialize(JsonNode node) {
+        if (node.isArray()) {
+            if (node.size() == 2) {
+                return new UpdateNotification(node.get(0).asText(), node.get(1));
+            }
+        }
+        return null;
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Abort.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Abort.java
new file mode 100644
index 0000000..8751f70
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Abort.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.operations;
+
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+/**
+ * assert operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Abort implements Operation {
+
+    private final String op;
+
+    /**
+     * Constructs a Abort object.
+     */
+    public Abort() {
+        this.op = Operations.ABORT.op();
+    }
+
+    @Override
+    public String getOp() {
+        return op;
+    }
+
+    @Override
+    public TableSchema getTableSchema() {
+        return null;
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Assert.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Assert.java
new file mode 100644
index 0000000..7a2f454
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Assert.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+/**
+ * assert operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Assert implements Operation {
+
+    private final String op;
+    private final String lock;
+
+    /**
+     * Constructs a Assert object.
+     * @param lock the lock member of assert operation
+     */
+    public Assert(String lock) {
+        checkNotNull(lock, "lock is not null");
+        this.op = Operations.ASSERT.op();
+        this.lock = lock;
+    }
+
+    /**
+     * Returns the lock member of assert operation.
+     * @return the lock member of assert operation
+     */
+    public String getLock() {
+        return lock;
+    }
+
+    @Override
+    public String getOp() {
+        return op;
+    }
+
+    @Override
+    public TableSchema getTableSchema() {
+        return null;
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Comment.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Comment.java
new file mode 100644
index 0000000..c27de6b
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Comment.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+/**
+ * comment operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Comment implements Operation {
+
+    private final String op;
+    private final String comment;
+
+    /**
+     * Constructs a Comment object.
+     * @param comment the comment member of comment operation
+     */
+    public Comment(String comment) {
+        checkNotNull(comment, "comment is not null");
+        this.op = Operations.COMMENT.op();
+        this.comment = comment;
+    }
+
+    /**
+     * Returns the comment member of comment operation.
+     * @return the comment member of comment operation
+     */
+    public String getComment() {
+        return comment;
+    }
+
+    @Override
+    public String getOp() {
+        return op;
+    }
+
+    @Override
+    public TableSchema getTableSchema() {
+        return null;
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Commit.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Commit.java
new file mode 100644
index 0000000..f888986
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Commit.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+/**
+ * commit operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Commit implements Operation {
+
+    private final String op;
+    private final Boolean durable;
+
+    /**
+     * Constructs a Commit object.
+     * @param durable the durable member of commit operation
+     */
+    public Commit(Boolean durable) {
+        checkNotNull(durable, "durable is not null");
+        this.op = Operations.COMMIT.op();
+        this.durable = durable;
+    }
+
+    /**
+     * Returns the durable member of commit operation.
+     * @return the durable member of commit operation
+     */
+    public Boolean isDurable() {
+        return durable;
+    }
+
+    @Override
+    public String getOp() {
+        return op;
+    }
+
+    @Override
+    public TableSchema getTableSchema() {
+        return null;
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Delete.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Delete.java
new file mode 100644
index 0000000..2254aa0
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Delete.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import org.onosproject.ovsdb.rfc.notation.Condition;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * delete operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Delete implements Operation {
+
+    @JsonIgnore
+    private final TableSchema tableSchema;
+    private final String op;
+    private final List<Condition> where;
+
+    /**
+     * Constructs a Delete object.
+     * @param schema TableSchema entity
+     * @param where the List of Condition entity
+     */
+    public Delete(TableSchema schema, List<Condition> where) {
+        checkNotNull(schema, "TableSchema is not null");
+        checkNotNull(where, "where is not null");
+        this.tableSchema = schema;
+        this.op = Operations.DELETE.op();
+        this.where = where;
+    }
+
+    /**
+     * Returns the where member of delete operation.
+     * @return the where member of delete operation
+     */
+    public List<Condition> getWhere() {
+        return where;
+    }
+
+    @Override
+    public String getOp() {
+        return op;
+    }
+
+    @Override
+    public TableSchema getTableSchema() {
+        return tableSchema;
+    }
+
+    /**
+     * For the use of serialization.
+     * @return the table member of update operation
+     */
+    @JsonProperty
+    public String getTable() {
+        return (tableSchema == null) ? null : tableSchema.name();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Insert.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Insert.java
new file mode 100644
index 0000000..6b46195
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Insert.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.onosproject.ovsdb.rfc.notation.Column;
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+import org.onosproject.ovsdb.rfc.utils.TransValueUtil;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.Maps;
+
+/**
+ * insert operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Insert implements Operation {
+
+    @JsonIgnore
+    private final TableSchema tableSchema;
+    private final String op;
+    @JsonProperty("uuid-name")
+    private final String uuidName;
+    private final Map<String, Object> row;
+
+    /**
+     * Constructs a Insert object.
+     * @param schema TableSchema entity
+     * @param uuidName uuid-name
+     * @param row Row entity
+     */
+    public Insert(TableSchema schema, String uuidName, Row row) {
+        checkNotNull(schema, "TableSchema is not null");
+        checkNotNull(uuidName, "uuidName is not null");
+        checkNotNull(row, "row is not null");
+        this.tableSchema = schema;
+        this.op = Operations.INSERT.op();
+        this.uuidName = uuidName;
+        this.row = Maps.newHashMap();
+        generateOperationRow(row);
+    }
+
+    /**
+     * Row entity convert into the row format of insert operation. Refer to RFC
+     * 7047 Section 5.2.
+     * @param row Row entity
+     */
+    private void generateOperationRow(Row row) {
+        Collection<Column> columns = row.getColumns();
+        for (Column column : columns) {
+            ColumnSchema columnSchema = column.schema();
+            Object value = column.data();
+            Object untypedValue = TransValueUtil.getFormatData(value);
+            this.row.put(columnSchema.name(), untypedValue);
+        }
+    }
+
+    /**
+     * Returns the uuid-name member of insert operation.
+     * @return the uuid-name member of insert operation
+     */
+    public String getUuidName() {
+        return uuidName;
+    }
+
+    /**
+     * Returns the row member of insert operation.
+     * @return the row member of insert operation
+     */
+    public Map<String, Object> getRow() {
+        return row;
+    }
+
+    @Override
+    public String getOp() {
+        return op;
+    }
+
+    @Override
+    public TableSchema getTableSchema() {
+        return tableSchema;
+    }
+
+    /**
+     * For the use of serialization.
+     * @return the table member of update operation
+     */
+    @JsonProperty
+    public String getTable() {
+        return (tableSchema == null) ? null : tableSchema.name();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Mutate.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Mutate.java
new file mode 100644
index 0000000..fd077e2
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Mutate.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import org.onosproject.ovsdb.rfc.notation.Condition;
+import org.onosproject.ovsdb.rfc.notation.Mutation;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * mutate operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Mutate implements Operation {
+
+    @JsonIgnore
+    private final TableSchema tableSchema;
+    private final String op;
+    private final List<Condition> where;
+    private final List<Mutation> mutations;
+
+    /**
+     * Constructs a Mutate object.
+     * @param schema TableSchema entity
+     * @param where the List of Condition entity
+     * @param mutations the List of Mutation entity
+     */
+    public Mutate(TableSchema schema, List<Condition> where,
+                  List<Mutation> mutations) {
+        checkNotNull(schema, "TableSchema is not null");
+        checkNotNull(mutations, "mutations is not null");
+        checkNotNull(where, "where is not null");
+        this.tableSchema = schema;
+        this.op = Operations.MUTATE.op();
+        this.where = where;
+        this.mutations = mutations;
+    }
+
+    /**
+     * Returns the mutations member of mutate operation.
+     * @return the mutations member of mutate operation
+     */
+    public List<Mutation> getMutations() {
+        return mutations;
+    }
+
+    /**
+     * Returns the where member of mutate operation.
+     * @return the where member of mutate operation
+     */
+    public List<Condition> getWhere() {
+        return where;
+    }
+
+    @Override
+    public String getOp() {
+        return op;
+    }
+
+    @Override
+    public TableSchema getTableSchema() {
+        return tableSchema;
+    }
+
+    /**
+     * For the use of serialization.
+     * @return the table member of update operation
+     */
+    @JsonProperty
+    public String getTable() {
+        return (tableSchema == null) ? null : tableSchema.name();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Operation.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Operation.java
new file mode 100644
index 0000000..3e2dff1
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Operation.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.operations;
+
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+/**
+ * Operation interface.
+ */
+public interface Operation {
+
+    /**
+     * Returns the op member of update operation.
+     * @return the op member of update operation
+     */
+    String getOp();
+
+    /**
+     * Returns TableSchema entity.
+     * @return TableSchema entity
+     */
+    TableSchema getTableSchema();
+
+    /**
+     * Operations must be "insert", "select", "update", "mutate", "delete",
+     * "commit", "abort", "comment", "assert". Refer to RFC 7047 Section 5.2.
+     */
+    public enum Operations {
+        INSERT("insert"), SELECT("select"), UPDATE("update"), MUTATE("mutate"),
+        DELETE("delete"), COMMIT("commit"), ABORT("abort"), COMMENT("comment"),
+        ASSERT("assert");
+
+        private String op;
+
+        private Operations(String op) {
+            this.op = op;
+        }
+
+        /**
+         * Returns the op for Operations.
+         * @return the op
+         */
+        public String op() {
+            return op;
+        }
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Select.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Select.java
new file mode 100644
index 0000000..cb73ea7
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Select.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import org.onosproject.ovsdb.rfc.notation.Condition;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * select operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Select implements Operation {
+
+    @JsonIgnore
+    private final TableSchema tableSchema;
+    private final String op;
+    private final List<Condition> where;
+    private final List<String> columns;
+
+    /**
+     * Constructs a Select object.
+     * @param schema TableSchema entity
+     * @param where the List of Condition entity
+     * @param columns the List of column name
+     */
+    public Select(TableSchema schema, List<Condition> where, List<String> columns) {
+        checkNotNull(schema, "TableSchema is not null");
+        checkNotNull(where, "where is not null");
+        checkNotNull(columns, "columns is not null");
+        this.tableSchema = schema;
+        this.op = Operations.SELECT.op();
+        this.where = where;
+        this.columns = columns;
+    }
+
+    /**
+     * Returns the columns member of select operation.
+     * @return the columns member of select operation
+     */
+    public List<String> getColumns() {
+        return columns;
+    }
+
+    /**
+     * Returns the where member of select operation.
+     * @return the where member of select operation
+     */
+    public List<Condition> getWhere() {
+        return where;
+    }
+
+    @Override
+    public String getOp() {
+        return op;
+    }
+
+    @Override
+    public TableSchema getTableSchema() {
+        return tableSchema;
+    }
+
+    /**
+     * For the use of serialization.
+     * @return the table member of update operation
+     */
+    @JsonProperty
+    public String getTable() {
+        return (tableSchema == null) ? null : tableSchema.name();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Update.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Update.java
new file mode 100644
index 0000000..61e7e6f
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Update.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.onosproject.ovsdb.rfc.notation.Column;
+import org.onosproject.ovsdb.rfc.notation.Condition;
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+import org.onosproject.ovsdb.rfc.utils.TransValueUtil;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.Maps;
+
+/**
+ * update operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Update implements Operation {
+
+    @JsonIgnore
+    private final TableSchema tableSchema;
+    private final String op;
+    private final Map<String, Object> row;
+    private final List<Condition> where;
+
+    /**
+     * Constructs a Update object.
+     * @param schema TableSchema entity
+     * @param row Row entity
+     * @param where the List of Condition entity
+     */
+    public Update(TableSchema schema, Row row, List<Condition> where) {
+        checkNotNull(schema, "TableSchema is not null");
+        checkNotNull(row, "row is not null");
+        checkNotNull(where, "where is not null");
+        this.tableSchema = schema;
+        this.op = Operations.UPDATE.op();
+        this.row = Maps.newHashMap();
+        this.where = where;
+        generateOperationRow(row);
+    }
+
+    /**
+     * Row entity convert into the row format of update operation. Refer to RFC
+     * 7047 Section 5.2.
+     * @param row Row entity
+     */
+    private void generateOperationRow(Row row) {
+        Collection<Column> columns = row.getColumns();
+        for (Column column : columns) {
+            ColumnSchema columnSchema = column.schema();
+            Object value = column.data();
+            Object untypedValue = TransValueUtil.getFormatData(value);
+            this.row.put(columnSchema.name(), untypedValue);
+        }
+    }
+
+    /**
+     * Returns the row member of update operation.
+     * @return the row member of update operation
+     */
+    public Map<String, Object> getRow() {
+        return row;
+    }
+
+    /**
+     * Returns the where member of update operation.
+     * @return the where member of update operation
+     */
+    public List<Condition> getWhere() {
+        return where;
+    }
+
+    @Override
+    public String getOp() {
+        return op;
+    }
+
+    @Override
+    public TableSchema getTableSchema() {
+        return tableSchema;
+    }
+
+    /**
+     * For the use of serialization.
+     * @return the table member of update operation
+     */
+    @JsonProperty
+    public String getTable() {
+        return (tableSchema == null) ? null : tableSchema.name();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/ColumnSchema.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/ColumnSchema.java
new file mode 100644
index 0000000..2997bae
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/ColumnSchema.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.schema.type.ColumnType;
+
+/**
+ * A schema for the column represented by column-schema.
+ */
+public final class ColumnSchema {
+    private final String name;
+    private final ColumnType type;
+
+    /**
+     * Constructs a ColumnSchema object.
+     * @param name the column name
+     * @param columnType the column type
+     */
+    public ColumnSchema(String name, ColumnType columnType) {
+        checkNotNull(name, "name is not null");
+        checkNotNull(columnType, "columnType is not null");
+        this.name = name;
+        this.type = columnType;
+    }
+
+    /**
+     * Returns the name of column.
+     * @return the name of column
+     */
+    public String name() {
+        return name;
+    }
+
+    /**
+     * Returns the type of column.
+     * @return the type of column
+     */
+    public ColumnType type() {
+        return type;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ColumnSchema) {
+            final ColumnSchema other = (ColumnSchema) obj;
+            return Objects.equals(this.name, other.name)
+                    && Objects.equals(this.type, other.type);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("name", name).add("type", type)
+                .toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/DatabaseSchema.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/DatabaseSchema.java
new file mode 100644
index 0000000..3c29139
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/DatabaseSchema.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * A schema for the database represented by database-schema, which consists of
+ * a set of tables.
+ */
+public final class DatabaseSchema {
+
+    private final String name;
+    private final String version;
+    private final Map<String, TableSchema> tableSchemas;
+
+    /**
+     * Constructs a DatabaseSchema object.
+     * @param name the name of database
+     * @param version the version of database
+     * @param tableSchemas a map of TableSchema
+     */
+    public DatabaseSchema(String name, String version,
+                          Map<String, TableSchema> tableSchemas) {
+        checkNotNull(name, "name is not null");
+        checkNotNull(version, "version is not null");
+        checkNotNull(tableSchemas, "tableSchemas is not null");
+        this.name = name;
+        this.version = version;
+        this.tableSchemas = tableSchemas;
+    }
+
+    /**
+     * Returns the name of database.
+     * @return the name of database
+     */
+    public String name() {
+        return name;
+    }
+
+    /**
+     * Returns the version of database.
+     * @return the version of database
+     */
+    public String version() {
+        return version;
+    }
+
+    /**
+     * Returns a map of TableSchema.
+     * @return a map of TableSchema
+     */
+    public Map<String, TableSchema> tableSchemas() {
+        return tableSchemas;
+    }
+
+    /**
+     * Returns a set of table name.
+     * @return a set of table name
+     */
+    public Set<String> getTableNames() {
+        return this.tableSchemas.keySet();
+    }
+
+    /**
+     * Determine whether contain the table.
+     * @param tableName table name
+     * @return boolean
+     */
+    public boolean hasTable(String tableName) {
+        return this.getTableNames().contains(tableName);
+    }
+
+    /**
+     * Returns the TableSchema whose name is the tableName.
+     * @param tableName table name
+     * @return TableSchema
+     */
+    public TableSchema getTableSchema(String tableName) {
+        TableSchema table = tableSchemas.get(tableName);
+        return table;
+    }
+
+    /**
+     * generate initialization columns in each table namely _uuid and _version.
+     */
+    public void generateInitializationColumns() {
+        for (TableSchema tableSchema : tableSchemas.values()) {
+            tableSchema.generateInitializationColumns();
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name, version, tableSchemas);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DatabaseSchema) {
+            final DatabaseSchema other = (DatabaseSchema) obj;
+            return Objects.equals(this.name, other.name)
+                    && Objects.equals(this.version, other.version)
+                    && Objects.equals(this.tableSchemas, other.tableSchemas);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("name", name).add("version", version)
+                .add("tableSchemas", tableSchemas).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/TableSchema.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/TableSchema.java
new file mode 100644
index 0000000..caec2ed
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/TableSchema.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+import org.onosproject.ovsdb.rfc.schema.type.AtomicColumnType;
+import org.onosproject.ovsdb.rfc.schema.type.UuidBaseType;
+
+/**
+ * A schema for the table represented by table-schema, which consists of a set
+ * of columns.
+ */
+public final class TableSchema {
+
+    private final String name;
+    private final Map<String, ColumnSchema> columnSchemas;
+
+    /**
+     * Constructs a TableSchema object.
+     * @param name the name of table
+     * @param columnSchemas a map of ColumnSchema
+     */
+    public TableSchema(String name, Map<String, ColumnSchema> columnSchemas) {
+        checkNotNull(name, "name is not null");
+        checkNotNull(columnSchemas, "columnSchemas is not null");
+        this.name = name;
+        this.columnSchemas = columnSchemas;
+    }
+
+    /**
+     * Returns the name of table.
+     * @return the name of table
+     */
+    public String name() {
+        return name;
+    }
+
+    /**
+     * Returns a map of ColumnSchema.
+     * @return a map of ColumnSchema
+     */
+    public Map<String, ColumnSchema> columnSchemas() {
+        return this.columnSchemas;
+    }
+
+    /**
+     * Returns a set of column name.
+     * @return a set of column name
+     */
+    public Set<String> getColumnNames() {
+        return this.columnSchemas.keySet();
+    }
+
+    /**
+     * Determine whether contain the column.
+     * @param columnName column name
+     * @return boolean
+     */
+    public boolean hasColumn(String columnName) {
+        return this.getColumnNames().contains(columnName);
+    }
+
+    /**
+     * Returns the ColumnSchema whose name is the columnName.
+     * @param columnName column name
+     * @return ColumnSchema
+     */
+    public ColumnSchema getColumnSchema(String columnName) {
+        return this.columnSchemas.get(columnName);
+    }
+
+    /**
+     * Refer to RFC 7047 Section 3.2. generate initialization columns in each
+     * table namely _uuid and _version.
+     */
+    public void generateInitializationColumns() {
+        columnSchemas
+                .put("_uuid",
+                     new ColumnSchema("_uuid",
+                                      new AtomicColumnType(new UuidBaseType())));
+        columnSchemas
+                .put("_version",
+                     new ColumnSchema("_version",
+                                      new AtomicColumnType(new UuidBaseType())));
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name, columnSchemas);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof TableSchema) {
+            final TableSchema other = (TableSchema) obj;
+            return Objects.equals(this.name, other.name)
+                    && Objects.equals(this.columnSchemas, other.columnSchemas);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("name", name)
+                .add("columnSchemas", columnSchemas).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/AtomicColumnType.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/AtomicColumnType.java
new file mode 100644
index 0000000..e083754
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/AtomicColumnType.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The "atomic-type" specifies the type of data stored in this column. Refer
+ * to RFC 7047 Section 3.2.
+ */
+public final class AtomicColumnType implements ColumnType {
+    private final BaseType baseType;
+    private final int min;
+    private final int max;
+
+    /**
+     * Constructs a AtomicColumnType object.
+     * @param baseType BaseType entity
+     */
+    public AtomicColumnType(BaseType baseType) {
+        checkNotNull(baseType, "BaseType is not null");
+        this.baseType = baseType;
+        this.min = 1;
+        this.max = 1;
+    }
+
+    /**
+     * Constructs a AtomicColumnType object.
+     * @param baseType BaseType entity
+     * @param min min constraint
+     * @param max max constraint
+     */
+    public AtomicColumnType(BaseType baseType, int min, int max) {
+        checkNotNull(baseType, "BaseType is not null");
+        this.baseType = baseType;
+        this.min = min;
+        this.max = max;
+    }
+
+    /**
+     * Get baseType.
+     * @return baseType
+     */
+    public BaseType baseType() {
+        return baseType;
+    }
+
+    /**
+     * Get min.
+     * @return min
+     */
+    public int min() {
+        return min;
+    }
+
+    /**
+     * Get max.
+     * @return max
+     */
+    public int max() {
+        return max;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(baseType, min, max);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof AtomicColumnType) {
+            final AtomicColumnType other = (AtomicColumnType) obj;
+            return Objects.equals(this.baseType, other.baseType)
+                    && Objects.equals(this.min, other.min)
+                    && Objects.equals(this.max, other.max);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("baseType", baseType).add("min", min)
+                .add("max", max).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BaseType.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BaseType.java
new file mode 100644
index 0000000..d2614c1
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BaseType.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+/**
+ * One of the strings "integer", "real", "boolean", "string", or "uuid",
+ * representing the specified scalar type. Refer to RFC 7047 Section 3.2.
+ */
+public interface BaseType {
+
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BaseTypeFactory.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BaseTypeFactory.java
new file mode 100644
index 0000000..e74d94f
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BaseTypeFactory.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+import java.util.Set;
+
+import org.onosproject.ovsdb.rfc.error.TypedSchemaException;
+import org.onosproject.ovsdb.rfc.schema.type.UuidBaseType.RefType;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.Sets;
+
+/**
+ * BaseType Factory class.
+ */
+public final class BaseTypeFactory {
+
+    /**
+     * Constructs a BaseTypeFactory object.
+     * This class should not be instantiated.
+     */
+    private BaseTypeFactory() {
+    }
+
+    /**
+     * Create a BaseType from the JsonNode.
+     * @param json the BaseType JsonNode
+     * @param keyorval the key node or value node
+     * @return BaseType
+     */
+    public static BaseType getBaseTypeFromJson(JsonNode json, String keyorval) {
+        if (json.isValueNode()) {
+            String type = json.asText().trim();
+            return fromTypeStr(type);
+        } else {
+            if (!json.has(keyorval)) {
+                throw new TypedSchemaException("not a type");
+            }
+            return fromJsonNode(json.get(keyorval));
+        }
+    }
+
+    /**
+     * Get BaseType by the type value of JsonNode.
+     * @param type the type value of JsonNode
+     * @return BaseType
+     */
+    private static BaseType fromTypeStr(String type) {
+        switch (type) {
+        case "boolean":
+            return new BooleanBaseType();
+        case "integer":
+            return new IntegerBaseType();
+        case "real":
+            return new RealBaseType();
+        case "string":
+            return new StringBaseType();
+        case "uuid":
+            return new UuidBaseType();
+        default:
+            return null;
+        }
+    }
+
+    /**
+     * json like "string" or json like {"type" : "string", "enum": ["set",
+     * ["access", "native-tagged"]]}" for key or value.
+     * @param type JsonNode
+     */
+    private static BaseType fromJsonNode(JsonNode type) {
+        if (type.isTextual()) {
+            return fromTypeStr(type.asText());
+        } else if (type.isObject() && type.has("type")) {
+            String typeStr = type.get("type").asText();
+            switch (typeStr) {
+            case "boolean":
+                return new BooleanBaseType();
+            case "integer":
+                return getIntegerBaseType(type);
+            case "real":
+                return getRealBaseType(type);
+            case "string":
+                return getStringBaseType(type);
+            case "uuid":
+                return getUuidBaseType(type);
+            default:
+                return null;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Get IntegerBaseType by the type value of JsonNode which contains the
+     * constraints.
+     * @param type the type value of JsonNode
+     * @return IntegerBaseType
+     */
+    private static IntegerBaseType getIntegerBaseType(JsonNode type) {
+        int min = Integer.MIN_VALUE;
+        int max = Integer.MAX_VALUE;
+        Set<Integer> enums = Sets.newHashSet();
+        JsonNode node = type.get("minInteger");
+        if (node != null) {
+            min = node.asInt();
+        }
+        node = type.get("maxInteger");
+        if (node != null) {
+            max = node.asInt();
+        }
+        if (node.has("enum")) {
+            JsonNode anEnum = node.get("enum").get(1);
+            for (JsonNode n : anEnum) {
+                enums.add(n.asInt());
+            }
+        }
+        return new IntegerBaseType(min, max, enums);
+    }
+
+    /**
+     * Get RealBaseType by the type value of JsonNode which contains the
+     * constraints.
+     * @param type the type value of JsonNode
+     * @return RealBaseType
+     */
+    private static RealBaseType getRealBaseType(JsonNode type) {
+        double min = Double.MIN_VALUE;
+        double max = Double.MAX_VALUE;
+        Set<Double> enums = Sets.newHashSet();
+        JsonNode node = type.get("minReal");
+        if (node != null) {
+            min = node.asDouble();
+        }
+        node = type.get("maxReal");
+        if (node != null) {
+            max = node.asDouble();
+        }
+        if (node.has("enum")) {
+            JsonNode anEnum = node.get("enum").get(1);
+            for (JsonNode n : anEnum) {
+                enums.add(n.asDouble());
+            }
+        }
+        return new RealBaseType(min, max, enums);
+    }
+
+    /**
+     * Get StringBaseType by the type value of JsonNode which contains the
+     * constraints.
+     * @param type the type value of JsonNode
+     * @return StringBaseType
+     */
+    private static StringBaseType getStringBaseType(JsonNode type) {
+        int minLength = Integer.MIN_VALUE;
+        int maxLength = Integer.MAX_VALUE;
+        Set<String> enums = Sets.newHashSet();
+        JsonNode node = type.get("minLength");
+        if (node != null) {
+            minLength = node.asInt();
+        }
+        node = type.get("maxLength");
+        if (node != null) {
+            maxLength = node.asInt();
+        }
+        if (node.has("enum")) {
+            JsonNode enumVal = node.get("enum");
+            if (enumVal.isArray()) {
+                JsonNode anEnum = enumVal.get(1);
+                for (JsonNode n : anEnum) {
+                    enums.add(n.asText());
+                }
+            } else if (enumVal.isTextual()) {
+                enums.add(enumVal.asText());
+            }
+        }
+        return new StringBaseType(minLength, maxLength, enums);
+    }
+
+    /**
+     * Get UuidBaseType by the type value of JsonNode which contains the
+     * constraints.
+     * @param type the type value of JsonNode
+     * @return UuidBaseType
+     */
+    private static UuidBaseType getUuidBaseType(JsonNode type) {
+        String refTable = null;
+        String refType = RefType.STRONG.refType();
+        JsonNode node = type.get("refTable");
+        if (node != null) {
+            refTable = node.asText();
+        }
+        node = type.get("refType");
+        if (node != null) {
+            refType = node.asText();
+        }
+        return new UuidBaseType(refTable, refType);
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BooleanBaseType.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BooleanBaseType.java
new file mode 100644
index 0000000..d42337a
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BooleanBaseType.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * One of the strings "integer", "real", "boolean", "string", or "uuid",
+ * representing the specified scalar type. Refer to RFC 7047 Section 3.2.
+ * Because BooleanBaseType has no constraint conditions, and in order to be
+ * consistent with other BaseType, so this class is empty except for the
+ * toString method.
+ */
+public final class BooleanBaseType implements BaseType {
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnType.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnType.java
new file mode 100644
index 0000000..20f1bba
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnType.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+/**
+ * The "type" specifies the type of data stored in this column. Refer to RFC
+ * 7047 Section 3.2.
+ */
+public interface ColumnType {
+
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java
new file mode 100644
index 0000000..8406802
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+import org.onosproject.ovsdb.rfc.error.TypedSchemaException;
+import org.onosproject.ovsdb.rfc.utils.ObjectMapperUtil;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * ColumnType Factory class.
+ */
+public final class ColumnTypeFactory {
+
+    /**
+     * Constructs a ColumnTypeFactory object.
+     * This class should not be instantiated.
+     */
+    private ColumnTypeFactory() {
+    }
+
+    /**
+     * Those Json's key/value pairs.
+     */
+    public enum Type {
+        KEY("key"), VALUE("value");
+
+        private final String type;
+
+        private Type(String type) {
+            this.type = type;
+        }
+
+        /**
+         * Returns the type for Type.
+         * @return the type
+         */
+        public String type() {
+            return type;
+        }
+    }
+
+    /**
+     * JsonNode like "flow_tables":{"type":{"key":{"maxInteger":254,"minInteger":0,"type":
+     * "integer"},"min":0,"value":{"type":"uuid","refTable":"Flow_Table"},"max":
+     * "unlimited"}}.
+     * @param json the ColumnType JsonNode
+     * @return ColumnType
+     */
+    public static ColumnType getColumnTypeFromJson(JsonNode json) {
+        if (json.isObject() && !json.has(Type.VALUE.type())) {
+            return createAtomicColumnType(json);
+        } else if (!json.isValueNode() && json.has(Type.VALUE.type())) {
+            return createKeyValuedColumnType(json);
+        }
+        throw new TypedSchemaException("could not find the right column type :"
+                + ObjectMapperUtil.convertToString(json));
+    }
+
+    /**
+     * Create AtomicColumnType entity.
+     * @param json JsonNode
+     * @return AtomicColumnType entity
+     */
+    private static AtomicColumnType createAtomicColumnType(JsonNode json) {
+        BaseType baseType = BaseTypeFactory
+                .getBaseTypeFromJson(json, Type.KEY.type());
+        int min = 1;
+        int max = 1;
+        JsonNode node = json.get("min");
+        if (node != null) {
+            min = node.asInt();
+        }
+        node = json.get("max");
+        if (node != null) {
+            if (node.isNumber()) {
+                max = node.asInt();
+            } else if (node.isTextual() && "unlimited".equals(node.asText())) {
+                max = Integer.MAX_VALUE;
+            }
+        }
+        return new AtomicColumnType(baseType, min, max);
+    }
+
+    /**
+     * Create KeyValuedColumnType entity.
+     * @param json JsonNode
+     * @return KeyValuedColumnType entity
+     */
+    private static KeyValuedColumnType createKeyValuedColumnType(JsonNode json) {
+        BaseType keyType = BaseTypeFactory.getBaseTypeFromJson(json,
+                                                               Type.KEY.type());
+        BaseType valueType = BaseTypeFactory
+                .getBaseTypeFromJson(json, Type.VALUE.type());
+        int min = 1;
+        int max = 1;
+        JsonNode node = json.get("min");
+        if (node != null) {
+            min = node.asInt();
+        }
+        node = json.get("max");
+        if (node != null) {
+            if (node.isNumber()) {
+                max = node.asInt();
+            } else if (node.isTextual() && "unlimited".equals(node.asText())) {
+                max = Integer.MAX_VALUE;
+            }
+        }
+        return new KeyValuedColumnType(keyType, valueType, min, max);
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/IntegerBaseType.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/IntegerBaseType.java
new file mode 100644
index 0000000..9193951
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/IntegerBaseType.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+import java.util.Set;
+
+import com.google.common.collect.Sets;
+
+/**
+ * One of the strings "integer", "real", "boolean", "string", or "uuid",
+ * representing the specified scalar type. Refer to RFC 7047 Section 3.2.
+ */
+public final class IntegerBaseType implements BaseType {
+    private final int min;
+    private final int max;
+    private final Set<Integer> enums;
+
+    /**
+     * Constructs a IntegerBaseType object.
+     */
+    public IntegerBaseType() {
+        this.min = Integer.MIN_VALUE;
+        this.max = Integer.MAX_VALUE;
+        this.enums = Sets.newHashSet();
+    }
+
+    /**
+     * Constructs a IntegerBaseType object.
+     * @param min min constraint
+     * @param max max constraint
+     * @param enums enums constraint
+     */
+    public IntegerBaseType(int min, int max, Set<Integer> enums) {
+        this.min = min;
+        this.max = max;
+        this.enums = enums;
+    }
+
+    /**
+     * Get min.
+     * @return min
+     */
+    public int min() {
+        return min;
+    }
+
+    /**
+     * Get max.
+     * @return max
+     */
+    public int max() {
+        return max;
+    }
+
+    /**
+     * Get enums.
+     * @return enums
+     */
+    public Set<Integer> enums() {
+        return enums;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(min, max, enums);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof IntegerBaseType) {
+            final IntegerBaseType other = (IntegerBaseType) obj;
+            return Objects.equals(this.enums, other.enums)
+                    && Objects.equals(this.min, other.min)
+                    && Objects.equals(this.max, other.max);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("min", min).add("max", max)
+                .add("enums", enums).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/KeyValuedColumnType.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/KeyValuedColumnType.java
new file mode 100644
index 0000000..2419cdd
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/KeyValuedColumnType.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * a JSON object that describes the type of a database column, with key and
+ * value. Refer to RFC 7047 Section 3.2.
+ */
+public final class KeyValuedColumnType implements ColumnType {
+    private final BaseType keyType;
+    private final BaseType valueType;
+    private final int min;
+    private final int max;
+
+    /**
+     * Constructs a KeyValuedColumnType object.
+     * @param keyType BaseType entity
+     * @param valueType BaseType entity
+     * @param min min constraint
+     * @param max max constraint
+     */
+    public KeyValuedColumnType(BaseType keyType, BaseType valueType, int min,
+                               int max) {
+        checkNotNull(keyType, "keyType is not null");
+        checkNotNull(valueType, "valueType is not null");
+        this.keyType = keyType;
+        this.valueType = valueType;
+        this.min = min;
+        this.max = max;
+    }
+
+    /**
+     * Get keyType.
+     * @return keyType
+     */
+    public BaseType keyType() {
+        return keyType;
+    }
+
+    /**
+     * Get valueType.
+     * @return valueType
+     */
+    public BaseType valueType() {
+        return valueType;
+    }
+
+    /**
+     * Get min.
+     * @return min
+     */
+    public int min() {
+        return min;
+    }
+
+    /**
+     * Get max.
+     * @return max
+     */
+    public int max() {
+        return max;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(keyType, valueType, min, max);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof KeyValuedColumnType) {
+            final KeyValuedColumnType other = (KeyValuedColumnType) obj;
+            return Objects.equals(this.keyType, other.keyType)
+                    && Objects.equals(this.valueType, other.valueType)
+                    && Objects.equals(this.min, other.min)
+                    && Objects.equals(this.max, other.max);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("keyType", keyType)
+                .add("valueType", valueType).add("min", min).add("max", max)
+                .toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/RealBaseType.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/RealBaseType.java
new file mode 100644
index 0000000..6704e30
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/RealBaseType.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+import java.util.Set;
+
+import com.google.common.collect.Sets;
+
+/**
+ * One of the strings "integer", "real", "boolean", "string", or "uuid",
+ * representing the specified scalar type. Refer to RFC 7047 Section 3.2.
+ */
+public final class RealBaseType implements BaseType {
+    private final double min;
+    private final double max;
+    private final Set<Double> enums;
+
+    /**
+     * Constructs a RealBaseType object.
+     */
+    public RealBaseType() {
+        this.min = Double.MIN_VALUE;
+        this.max = Double.MAX_VALUE;
+        this.enums = Sets.newHashSet();
+    }
+
+    /**
+     * Constructs a RealBaseType object.
+     * @param min min constraint
+     * @param max max constraint
+     * @param enums enums constraint
+     */
+    public RealBaseType(double min, double max, Set<Double> enums) {
+        this.min = min;
+        this.max = max;
+        this.enums = enums;
+    }
+
+    /**
+     * Get min.
+     * @return min
+     */
+    public double getMin() {
+        return min;
+    }
+
+    /**
+     * Get max.
+     * @return max
+     */
+    public double getMax() {
+        return max;
+    }
+
+    /**
+     * Get enums.
+     * @return enums
+     */
+    public Set<Double> getEnums() {
+        return enums;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(min, max, enums);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof RealBaseType) {
+            final RealBaseType other = (RealBaseType) obj;
+            return Objects.equals(this.enums, other.enums)
+                    && Objects.equals(this.min, other.min)
+                    && Objects.equals(this.max, other.max);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("min", min).add("max", max)
+                .add("enums", enums).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/StringBaseType.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/StringBaseType.java
new file mode 100644
index 0000000..96d2f73
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/StringBaseType.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+import java.util.Set;
+
+import com.google.common.collect.Sets;
+
+/**
+ * One of the strings "integer", "real", "boolean", "string", or "uuid",
+ * representing the specified scalar type. Refer to RFC 7047 Section 3.2.
+ */
+public final class StringBaseType implements BaseType {
+    private final int minLength;
+    private final int maxLength;
+    private final Set<String> enums;
+
+    /**
+     * Constructs a StringBaseType object.
+     */
+    public StringBaseType() {
+        this.minLength = Integer.MIN_VALUE;
+        this.maxLength = Integer.MAX_VALUE;
+        this.enums = Sets.newHashSet();
+    }
+
+    /**
+     * Constructs a StringBaseType object.
+     * @param minLength minLength constraint
+     * @param maxLength maxLength constraint
+     * @param enums enums constraint
+     */
+    public StringBaseType(int minLength, int maxLength, Set<String> enums) {
+        this.minLength = minLength;
+        this.maxLength = maxLength;
+        this.enums = enums;
+    }
+
+    /**
+     * Get minLength.
+     * @return minLength
+     */
+    public int getMinLength() {
+        return minLength;
+    }
+
+    /**
+     * Get maxLength.
+     * @return maxLength
+     */
+    public int getMaxLength() {
+        return maxLength;
+    }
+
+    /**
+     * Get enums.
+     * @return enums
+     */
+    public Set<String> getEnums() {
+        return enums;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(minLength, maxLength, enums);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof StringBaseType) {
+            final StringBaseType other = (StringBaseType) obj;
+            return Objects.equals(this.enums, other.enums)
+                    && Objects.equals(this.minLength, other.minLength)
+                    && Objects.equals(this.maxLength, other.maxLength);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("minLength", minLength)
+                .add("maxLength", maxLength).add("enums", enums).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/UuidBaseType.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/UuidBaseType.java
new file mode 100644
index 0000000..9824966
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/UuidBaseType.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.schema.type;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * One of the strings "integer", "real", "boolean", "string", or "uuid",
+ * representing the specified scalar type. Refer to RFC 7047 Section 3.2.
+ */
+public final class UuidBaseType implements BaseType {
+    /**
+     * RefType is strong or weak. refer to base-type of RFC 7047 Section 3.2.
+     */
+    public enum RefType {
+        STRONG("strong"), WEAK("weak");
+
+        private String refType;
+
+        private RefType(String refType) {
+            this.refType = refType;
+        }
+
+        /**
+         * Returns the refType for RefType.
+         * @return the refType
+         */
+        public String refType() {
+            return refType;
+        }
+    }
+
+    private final String refTable;
+    private final String refType;
+
+    /**
+     * Constructs a UuidBaseType object.
+     */
+    public UuidBaseType() {
+        this.refTable = null;
+        this.refType = RefType.STRONG.refType();
+    }
+
+    /**
+     * Constructs a UuidBaseType object.
+     * @param refTable refTable constraint
+     * @param refType refType constraint
+     */
+    public UuidBaseType(String refTable, String refType) {
+        this.refTable = refTable;
+        this.refType = refType;
+    }
+
+    /**
+     * Get refTable.
+     * @return refTable
+     */
+    public String getRefTable() {
+        return refTable;
+    }
+
+    /**
+     * Get refType.
+     * @return refType
+     */
+    public String getRefType() {
+        return refType;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(refTable, refType);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof UuidBaseType) {
+            final UuidBaseType other = (UuidBaseType) obj;
+            return Objects.equals(this.refTable, other.refTable)
+                    && Objects.equals(this.refType, other.refType);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("refTable", refTable)
+                .add("refType", refType).toString();
+    }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/ObjectMapperUtil.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/ObjectMapperUtil.java
new file mode 100644
index 0000000..bc92fe0
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/ObjectMapperUtil.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * ObjectMapper utility class.
+ */
+public final class ObjectMapperUtil {
+
+    private static final Logger log = LoggerFactory
+            .getLogger(ObjectMapperUtil.class);
+
+    /**
+     * Constructs a ObjectMapperUtil object. Utility classes should not have a
+     * public or default constructor, otherwise it will compile failed. This
+     * class should not be instantiated.
+     */
+    private ObjectMapperUtil() {
+    }
+
+    /**
+     * get ObjectMapper entity.
+     * @return ObjectMapper entity
+     */
+    public static ObjectMapper getObjectMapper() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper
+                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
+                           false);
+        objectMapper.setSerializationInclusion(Include.NON_NULL);
+        return objectMapper;
+    }
+
+    /**
+     * get ObjectMapper entity.
+     * @param flag configure
+     * @return ObjectMapper entity
+     */
+    public static ObjectMapper getObjectMapper(boolean flag) {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper
+                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
+                           flag);
+        return objectMapper;
+    }
+
+    /**
+     * get ObjectMapper entity.
+     * @param flag configure
+     * @param incl setSerializationInclusion
+     * @return ObjectMapper entity
+     */
+    public static ObjectMapper getObjectMapper(boolean flag, Include incl) {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper
+                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
+                           flag);
+        objectMapper.setSerializationInclusion(incl);
+        return objectMapper;
+    }
+
+    /**
+     * convert Object into String.
+     * @param obj Object
+     * @return String
+     */
+    public static String convertToString(Object obj) {
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            return objectMapper.writeValueAsString(obj);
+        } catch (JsonProcessingException e) {
+            log.error("JsonProcessingException while converting Entity into string", e);
+        }
+        return null;
+    }
+
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/TransValueUtil.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/TransValueUtil.java
new file mode 100644
index 0000000..62b9232
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/TransValueUtil.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.ovsdb.rfc.utils;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.onosproject.ovsdb.rfc.notation.OvsdbMap;
+import org.onosproject.ovsdb.rfc.notation.OvsdbSet;
+import org.onosproject.ovsdb.rfc.notation.RefTableRow;
+import org.onosproject.ovsdb.rfc.notation.UUID;
+import org.onosproject.ovsdb.rfc.schema.type.AtomicColumnType;
+import org.onosproject.ovsdb.rfc.schema.type.BaseType;
+import org.onosproject.ovsdb.rfc.schema.type.BooleanBaseType;
+import org.onosproject.ovsdb.rfc.schema.type.ColumnType;
+import org.onosproject.ovsdb.rfc.schema.type.IntegerBaseType;
+import org.onosproject.ovsdb.rfc.schema.type.KeyValuedColumnType;
+import org.onosproject.ovsdb.rfc.schema.type.RealBaseType;
+import org.onosproject.ovsdb.rfc.schema.type.StringBaseType;
+import org.onosproject.ovsdb.rfc.schema.type.UuidBaseType;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+/**
+ * Object value utility class.
+ */
+public final class TransValueUtil {
+
+    /**
+     * Constructs a TransValueUtil object. Utility classes should not have a
+     * public or default constructor, otherwise it will compile failed.
+     * This class should not be instantiated.
+     */
+    private TransValueUtil() {
+    }
+
+    /**
+     * if the type is Set, convert into OvsdbSet, if Map, convert into OvsdbMap.
+     * @param value Object
+     * @return Object
+     */
+    public static Object getFormatData(Object value) {
+        if (value instanceof Map) {
+            return OvsdbMap.ovsdbMap((Map) value);
+        } else if (value instanceof Set) {
+            return OvsdbSet.ovsdbSet((Set) value);
+        } else {
+            return value;
+        }
+    }
+
+    /**
+     * Transform JsonNode to corresponding value.
+     * @param json the ColumnType JsonNode
+     * @param columnType AtomicColumnType or KeyValuedColumnType
+     * @return Object OvsdbMap or OvsdbSet
+     */
+    public static Object getValueFromJson(JsonNode json, ColumnType columnType) {
+        if (columnType instanceof AtomicColumnType) {
+            AtomicColumnType atoType = (AtomicColumnType) columnType;
+            return getValueFromAtoType(json, atoType);
+        } else if (columnType instanceof KeyValuedColumnType) {
+            KeyValuedColumnType kvType = (KeyValuedColumnType) columnType;
+            return getValueFromKvType(json, kvType);
+        }
+        return null;
+    }
+
+    // Convert AtomicColumnType JsonNode into OvsdbSet value
+    private static Object getValueFromAtoType(JsonNode json,
+                                              AtomicColumnType atoType) {
+        BaseType baseType = atoType.baseType();
+        // If "min" or "max" is not specified, If "min" is not 1 or "max" is not
+        // 1,
+        // or both, and "value" is not specified, the type is a set of scalar
+        // type "key".
+        // Refer to RFC 7047, Section 3.2 <type>.
+        if (atoType.min() != atoType.max()) {
+            Set set = Sets.newHashSet();
+            if (json.isArray()) {
+                if (json.size() == 2) {
+                    if (json.get(0).isTextual()
+                            && "set".equals(json.get(0).asText())) {
+                        for (JsonNode node : json.get(1)) {
+                            set.add(TransValueUtil.transToValue(node, baseType));
+                        }
+                    } else {
+                        set.add(TransValueUtil.transToValue(json, baseType));
+                    }
+                }
+            } else {
+                set.add(TransValueUtil.transToValue(json, baseType));
+            }
+            return OvsdbSet.ovsdbSet(set);
+        } else {
+            return TransValueUtil.transToValue(json, baseType);
+        }
+    }
+
+    // Convert KeyValuedColumnType JsonNode into OvsdbMap value
+    private static Object getValueFromKvType(JsonNode json,
+                                             KeyValuedColumnType kvType) {
+        if (json.isArray()) {
+            if (json.size() == 2) {
+                if (json.get(0).isTextual()
+                        && "map".equals(json.get(0).asText())) {
+                    Map map = Maps.newHashMap();
+                    for (JsonNode pairNode : json.get(1)) {
+                        if (pairNode.isArray() && json.size() == 2) {
+                            Object key = TransValueUtil.transToValue(pairNode
+                                    .get(0), kvType.keyType());
+                            Object value = TransValueUtil.transToValue(pairNode
+                                    .get(1), kvType.valueType());
+                            map.put(key, value);
+                        }
+                    }
+                    return OvsdbMap.ovsdbMap(map);
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * convert into value.
+     * @param valueNode the BaseType JsonNode
+     * @param baseType BooleanBaseType or IntegerBaseType or RealBaseType or
+     *            StringBaseType or UuidBaseType
+     * @return Object the value of JsonNode
+     */
+    public static Object transToValue(JsonNode valueNode, BaseType baseType) {
+        if (baseType instanceof BooleanBaseType) {
+            return valueNode.asBoolean();
+        } else if (baseType instanceof IntegerBaseType) {
+            return valueNode.asInt();
+        } else if (baseType instanceof RealBaseType) {
+            return valueNode.asDouble();
+        } else if (baseType instanceof StringBaseType) {
+            return valueNode.asText();
+        } else if (baseType instanceof UuidBaseType) {
+            if (valueNode.isArray()) {
+                if (valueNode.size() == 2) {
+                    if (valueNode.get(0).isTextual()
+                            && "uuid".equals(valueNode.get(0).asText())
+                            || "named-uuid".equals(valueNode.get(0).asText())) {
+                        return UUID.uuid(valueNode.get(1).asText());
+                    }
+                }
+            } else {
+                return new RefTableRow(((UuidBaseType) baseType).getRefTable(),
+                                       valueNode);
+            }
+        }
+        return null;
+    }
+}
