diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbQos.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbQos.java
new file mode 100644
index 0000000..467ccfc
--- /dev/null
+++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbQos.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright 2017-present 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.controller;
+
+import com.google.common.collect.Maps;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.behaviour.QosDescription;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.CBS;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.CIR;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.MAX_RATE;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.QOS_EGRESS_POLICER;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.QOS_EXTERNAL_ID_KEY;
+import static org.onosproject.ovsdb.controller.OvsdbConstant.QOS_TYPE_PREFIX;
+
+/**
+ * The class representing an OVSDB Qos.
+ * This class is immutable.
+ */
+public final class OvsdbQos {
+
+    private final String type;
+    private Optional<Map<Long, String>> queues;
+    private Map<String, String> otherConfigs;
+    private Map<String, String> externalIds;
+
+    /**
+     * Creates an OvsdbQos using the given inputs.
+     *
+     * @param type the type of the qos
+     * @param queues rate queues
+     * @param otherConfigs Key-value pairs for configuring rarely used features
+     * @param externalIds Key-value pairs for use by external frameworks, rather than by OVS itself
+     */
+    private OvsdbQos(String type, Optional<Map<Long, String>> queues,
+                     Map<String, String> otherConfigs,
+                     Map<String, String> externalIds) {
+
+        this.type = checkNotNull(type);
+        this.queues = queues;
+        this.otherConfigs = otherConfigs;
+        this.externalIds = externalIds;
+    }
+
+    /**
+     * Returns the type of qos.
+     *
+     * @return the type of qos
+     */
+    public String qosType() {
+        return type;
+    }
+
+    /**
+     * Returns the map of queues.
+     *
+     * @return the queues.
+     */
+    public Optional<Map<Long, String>> qosQueues() {
+        return queues;
+    }
+
+    /**
+     * Returns other configurations of the qos.
+     *
+     * @return map of configurations
+     */
+    public Map<String, String> otherConfigs() {
+        return otherConfigs;
+    }
+
+    /**
+     * Returns the optional external ids.
+     *
+     * @return the external ids.
+     */
+    public Map<String, String> externalIds() {
+        return externalIds;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type, queues, externalIds);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbQos) {
+            final OvsdbQos other = (OvsdbQos) obj;
+            return Objects.equals(this.type, other.type) &&
+                    Objects.equals(this.otherConfigs, other.otherConfigs) &&
+                    Objects.equals(this.queues, other.queues) &&
+                    Objects.equals(this.externalIds, other.externalIds);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("qosType", qosType())
+                .add("qosQueues", qosQueues())
+                .add("otherConfigs", otherConfigs())
+                .add("externalIds", externalIds())
+                .toString();
+    }
+
+    /**
+     * Returns new OVSDB qos builder.
+     *
+     * @return ovsdb qos builder
+     */
+    public static OvsdbQos.Builder builder() {
+        return new OvsdbQos.Builder();
+    }
+
+    /**
+     * Returns new OVSDB qos builder with Qos description.
+     *
+     * @param qosDesc qos description
+     * @return ovsdb qos builder
+     */
+    public static Builder builder(QosDescription qosDesc) {
+        return new Builder(qosDesc);
+    }
+
+    /**
+     * Builder of OVSDB qos entities.
+     */
+    public static final class Builder {
+        private String type;
+        private Optional<Map<Long, String>> queues = Optional.empty();
+        private Map<String, String> otherConfigs = Maps.newHashMap();
+        private Map<String, String> externalIds = Maps.newHashMap();
+
+        /**
+         * Constructs an empty builder.
+         */
+        private Builder() {
+
+        }
+
+        /**
+         * Constructs a builder with a given Qos description.
+         *
+         * @param qosDesc Qos description
+         */
+        private Builder(QosDescription qosDesc) {
+            if (qosDesc.maxRate().isPresent()) {
+                otherConfigs.put(MAX_RATE, String.valueOf((long) qosDesc.maxRate().get().bps()));
+            }
+            if (qosDesc.cir().isPresent()) {
+                otherConfigs.put(CIR, qosDesc.cir().get().toString());
+            }
+            if (qosDesc.cbs().isPresent()) {
+                otherConfigs.put(CBS, qosDesc.cbs().get().toString());
+            }
+
+            if (qosDesc.queues().isPresent()) {
+                Map<Long, String> map = new HashMap();
+                qosDesc.queues().get().forEach((k, v) -> map.put(k, v.queueId().name()));
+                queues = Optional.ofNullable(map);
+            }
+            type = qosDesc.type() == QosDescription.Type.EGRESS_POLICER ?
+                    QOS_EGRESS_POLICER :
+                    QOS_TYPE_PREFIX.concat(qosDesc.type().name().toLowerCase());
+            externalIds.putAll(((DefaultAnnotations) qosDesc.annotations()).asMap());
+            externalIds.put(QOS_EXTERNAL_ID_KEY, qosDesc.qosId().name());
+        }
+
+        /**
+         * Returns new OVSDB qos.
+         *
+         * @return ovsdb qos
+         */
+        public OvsdbQos build() {
+            return new OvsdbQos(type, queues, otherConfigs, externalIds);
+        }
+
+        /**
+         * Returns OVSDB qos builder with a given type.
+         *
+         * @param type name of the qos
+         * @return ovsdb qos builder
+         */
+        public Builder qosType(String type) {
+            this.type = type;
+            return this;
+        }
+
+        /**
+         * Returns OVSDB qos builder with a given queues.
+         *
+         * @param queues the map of queue
+         * @return ovsdb qos builder
+         */
+        public Builder queues(Map<Long, String> queues) {
+            this.queues = Optional.ofNullable(queues);
+            return this;
+        }
+
+        /**
+         * Returns OVSDB qos builder with given configs.
+         *
+         * @param otherConfigs other configs
+         * @return ovsdb qos builder
+         */
+        public Builder otherConfigs(Map<String, String> otherConfigs) {
+            this.otherConfigs = Maps.newHashMap(otherConfigs);
+            return this;
+        }
+
+        /**
+         * Returns OVSDB qos builder with given external ids.
+         *
+         * @param ids the external ids
+         * @return ovsdb qos builder
+         */
+        public Builder externalIds(Map<String, String> ids) {
+            this.externalIds = ids;
+            return this;
+        }
+
+    }
+
+}
