diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/jsonrpc/JsonRpcResponse.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/jsonrpc/JsonRpcResponse.java
new file mode 100644
index 0000000..a2f4541
--- /dev/null
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/jsonrpc/JsonRpcResponse.java
@@ -0,0 +1,122 @@
+/*
+ * 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.jsonrpc;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+import java.util.Objects;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Json Rpc Response information that include id,error,result.
+ */
+public class JsonRpcResponse {
+
+    private final String id;
+    private final String error;
+    private final List<Object> result;
+
+    /**
+     * JsonRpcResponse Constructor.
+     * @param id the id node of response information
+     */
+    public JsonRpcResponse(String id) {
+        checkNotNull(id, "id cannot be null");
+        this.id = id;
+        this.error = null;
+        this.result = Lists.newArrayList();
+    }
+
+    /**
+     * JsonRpcResponse Constructor.
+     * @param id the id node of response information
+     * @param error the error node of response information
+     */
+    public JsonRpcResponse(String id, String error) {
+        checkNotNull(id, "id cannot be null");
+        checkNotNull(error, "error cannot be null");
+        this.id = id;
+        this.error = error;
+        this.result = Lists.newArrayList();
+    }
+
+    /**
+     * JsonRpcResponse Constructor.
+     * @param id the id node of response information
+     * @param error the error node of response information
+     * @param result the result node of response information
+     */
+    public JsonRpcResponse(String id, String error, List<Object> result) {
+        checkNotNull(id, "id cannot be null");
+        checkNotNull(error, "error cannot be null");
+        checkNotNull(result, "result cannot be null");
+        this.id = id;
+        this.error = error;
+        this.result = result;
+    }
+
+    /**
+     * Returns id.
+     * @return id
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Returns error.
+     * @return error
+     */
+    public String getError() {
+        return error;
+    }
+
+    /**
+     * Returns result.
+     * @return result
+     */
+    public List<Object> getResult() {
+        return result;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, error, result);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof JsonRpcResponse) {
+            final JsonRpcResponse other = (JsonRpcResponse) obj;
+            return Objects.equals(this.id, other.id)
+                    && Objects.equals(this.error, other.error)
+                    && Objects.equals(this.result, other.result);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("id", id).add("error", error)
+                .add("result", result).toString();
+    }
+}
