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