diff --git a/api/pom.xml b/api/pom.xml
index 5915e72..30f6a3a 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -33,7 +33,7 @@
 
     <description>OLT application API</description>
     <properties>
-        <sadis.api.version>3.1.0</sadis.api.version>
+        <sadis.api.version>3.1.1-SNAPSHOT</sadis.api.version>
     </properties>
 
     <dependencies>
diff --git a/api/src/main/java/org/opencord/olt/AccessDeviceEvent.java b/api/src/main/java/org/opencord/olt/AccessDeviceEvent.java
index 3c189dd..3a4146c 100644
--- a/api/src/main/java/org/opencord/olt/AccessDeviceEvent.java
+++ b/api/src/main/java/org/opencord/olt/AccessDeviceEvent.java
@@ -29,21 +29,12 @@
 
     private final Optional<VlanId> sVlan;
     private final Optional<VlanId> cVlan;
+    private final Optional<Integer> tpId;
 
     private final Optional<Port> port;
 
     public enum Type {
         /**
-         * A subscriber was registered and provisioned.
-         */
-        SUBSCRIBER_REGISTERED,
-
-        /**
-         * A subscriber was unregistered and deprovisioned.
-         */
-        SUBSCRIBER_UNREGISTERED,
-
-        /**
          * An access device connected.
          */
         DEVICE_CONNECTED,
@@ -61,55 +52,87 @@
         /**
          * An existing UNI port was removed.
          */
-        UNI_REMOVED
+        UNI_REMOVED,
+
+        /**
+         * A uniTag (one service) was registered and provisioned.
+         */
+        SUBSCRIBER_UNI_TAG_REGISTERED,
+
+        /**
+         * A uniTag (one service) was unregistered and deprovisioned.
+         */
+        SUBSCRIBER_UNI_TAG_UNREGISTERED,
+
+        /**
+         * A uniTag (one service) was failed while registration.
+         */
+        SUBSCRIBER_UNI_TAG_REGISTRATION_FAILED,
+
+        /**
+         * A uniTag (one service) was failed while unregistration.
+         */
+        SUBSCRIBER_UNI_TAG_UNREGISTRATION_FAILED
     }
 
     /**
+     * Creates an event of a given type and for the specified device, port,
+     * along with the cVlanId, sVlanId, and tpId. The vlan fields may not be provisioned
+     * if the event is related to the access device (dis)connection.
      *
+     * @param type     the event type
+     * @param deviceId the device id
+     * @param port     the device port
+     * @param sVlanId  the service vlan
+     * @param cVlanId  the customer vlan
+     * @param tpId     the technology profile
+     */
+    public AccessDeviceEvent(Type type, DeviceId deviceId,
+                             Port port,
+                             VlanId sVlanId,
+                             VlanId cVlanId,
+                             Integer tpId) {
+        super(type, deviceId);
+        this.port = Optional.ofNullable(port);
+        this.sVlan = Optional.ofNullable(sVlanId);
+        this.cVlan = Optional.ofNullable(cVlanId);
+        this.tpId = Optional.ofNullable(tpId);
+    }
+
+    /**
      * Creates an event of a given type and for the specified device,
      * along with the cVlanId and sVlanId. The vlan fields may not be provisioned
      * if the event is related to the access device (dis)connection.
      *
-     * @param type the event type
+     * @param type     the event type
      * @param deviceId the device id
-     * @param sVlanId the service vlan
-     * @param cVlanId the customer vlan
+     * @param sVlanId  the service vlan
+     * @param cVlanId  the customer vlan
+     * @param tpId     the technology profile id
      */
     public AccessDeviceEvent(Type type, DeviceId deviceId,
                              VlanId sVlanId,
-                             VlanId cVlanId) {
+                             VlanId cVlanId,
+                             Integer tpId) {
         super(type, deviceId);
         this.sVlan = Optional.ofNullable(sVlanId);
         this.cVlan = Optional.ofNullable(cVlanId);
+        this.tpId = Optional.ofNullable(tpId);
         this.port = Optional.empty();
     }
 
     /**
+     * Creates an event of a given type and for the specified device and port.
      *
-     * Creates an event of a given type and for the specified device, and timestamp
-     * along with the cVlanId and sVlanId. The vlan fields may not be provisioned
-     * if the event is related to the access device (dis)connection.
-     *
-     * @param type the event type
+     * @param type     the event type
      * @param deviceId the device id
-     * @param time a timestamp
-     * @param sVlanId the service vlan
-     * @param cVlanId the customer vlan
+     * @param port     the device port
      */
-    protected AccessDeviceEvent(Type type, DeviceId deviceId, long time,
-                                VlanId sVlanId,
-                                VlanId cVlanId) {
-        super(type, deviceId, time);
-        this.sVlan = Optional.ofNullable(sVlanId);
-        this.cVlan = Optional.ofNullable(cVlanId);
-        this.port = Optional.empty();
-
-    }
-
     public AccessDeviceEvent(Type type, DeviceId deviceId, Port port) {
         super(type, deviceId);
         this.sVlan = Optional.empty();
         this.cVlan = Optional.empty();
+        this.tpId = Optional.empty();
         this.port = Optional.ofNullable(port);
     }
 
@@ -125,4 +148,8 @@
         return port;
     }
 
+    public Optional<Integer> tpId() {
+        return tpId;
+    }
+
 }
diff --git a/api/src/main/java/org/opencord/olt/AccessDeviceService.java b/api/src/main/java/org/opencord/olt/AccessDeviceService.java
index 32c2ed0..06c5188 100644
--- a/api/src/main/java/org/opencord/olt/AccessDeviceService.java
+++ b/api/src/main/java/org/opencord/olt/AccessDeviceService.java
@@ -16,20 +16,17 @@
 
 package org.opencord.olt;
 
-import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 
-import com.google.common.collect.ImmutableSet;
 import org.onlab.packet.VlanId;
 import org.onosproject.event.ListenerService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
-import org.onosproject.net.meter.MeterKey;
-import org.opencord.sadis.SubscriberAndDeviceInformation;
 
 import com.google.common.collect.ImmutableMap;
+import org.opencord.sadis.UniTagInformation;
 
 /**
  * Service for interacting with an access device (OLT).
@@ -39,6 +36,7 @@
 
     /**
      * Provisions connectivity for a subscriber on an access device.
+     * Installs flows for all uni tag information
      *
      * @param port subscriber's connection point
      * @return true if successful false otherwise
@@ -47,6 +45,7 @@
 
     /**
      * Removes provisioned connectivity for a subscriber from an access device.
+     * Removes flows for all uni tag information
      *
      * @param port subscriber's connection point
      * @return true if successful false otherwise
@@ -54,31 +53,32 @@
     boolean removeSubscriber(ConnectPoint port);
 
     /**
-     * Provisions flows for the specific subscriber.
+     * Provisions a uni tag information for the specific subscriber.
+     * It finds the related uni tag information from the subscriber uni tag list
+     * and installs it
      *
      * @param subscriberId Identification of the subscriber
-     * @param sTag additional outer tag on this port
-     * @param cTag additional inner tag on this port
+     * @param sTag         additional outer tag on this port
+     * @param cTag         additional inner tag on this port
+     * @param tpId         additional technology profile id
      * @return true if successful false otherwise
      */
-    boolean provisionSubscriber(AccessSubscriberId subscriberId, Optional<VlanId> sTag, Optional<VlanId> cTag);
+    boolean provisionSubscriber(AccessSubscriberId subscriberId, Optional<VlanId> sTag,
+                                Optional<VlanId> cTag, Optional<Integer> tpId);
 
     /**
-     * Removes flows for the specific subscriber.
+     * Removes a uni tag information for the specific subscriber.
+     * It finds the related uni tag information from the subscriber uni tag list
+     * and remove it
      *
      * @param subscriberId Identification of the subscriber
-     * @param sTag additional outer tag on this port
-     * @param cTag additional inner tag on this port
+     * @param sTag         additional outer tag on this port
+     * @param cTag         additional inner tag on this port
+     * @param tpId         additional technology profile id
      * @return true if successful false otherwise
      */
-    boolean removeSubscriber(AccessSubscriberId subscriberId, Optional<VlanId> sTag, Optional<VlanId> cTag);
-
-    /**
-     * Returns information about the provisioned subscribers.
-     *
-     * @return subscribers
-     */
-    Collection<Map.Entry<ConnectPoint, Map.Entry<VlanId, VlanId>>> getSubscribers();
+    boolean removeSubscriber(AccessSubscriberId subscriberId, Optional<VlanId> sTag,
+                             Optional<VlanId> cTag, Optional<Integer> tpId);
 
     /**
      * Returns the list of active OLTs.
@@ -89,26 +89,11 @@
 
     /**
      * Returns information about subscribers that have been programmed in the
-     * data-plane.
+     * data-plane. It shows all uni tag information list of the subscribers even if
+     * these have not been programmed.
      *
      * @return an immutable map of locations and subscriber information
      */
-    ImmutableMap<ConnectPoint, SubscriberAndDeviceInformation> getProgSubs();
-
-    /**
-     * Returns information about device-meter mappings that have been programmed in the
-     * data-plane.
-     *
-     * @return an immutable set of device-meter mappings
-     */
-    ImmutableSet<MeterKey> getProgMeters();
-
-    /**
-     * Returns information about bandwidthProfile-meterKey (device / meter) mappings
-     * that have been programmed in the data-plane.
-     *
-     * @return an immutable map of bandwidthProfile-meterKey (device / meter) mappings
-     */
-    ImmutableMap<String, List<MeterKey>> getBpMeterMappings();
+    ImmutableMap<ConnectPoint, Set<UniTagInformation>> getProgSubs();
 
 }
