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