diff --git a/TEST-README.md b/TEST-README.md
index 5dad130..41c49a0 100644
--- a/TEST-README.md
+++ b/TEST-README.md
@@ -27,7 +27,7 @@
 onos-app localhost install ~/voltha-projects/sadis/app/target/sadis-app-3.0.0.oar
 onos-app localhost activate org.opencord.sadis
 
-onos-app localhost install ~/voltha-projects/olt/app/target/olt-app-3.0.0-SNAPSHOT.oar
+onos-app localhost install ~/voltha-projects/olt/app/target/olt-app-3.0.1-SNAPSHOT.oar
 onos-app localhost activate org.opencord.olt
 ```
 
diff --git a/api/pom.xml b/api/pom.xml
index 2c6d6a9..f6d0f9e 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>olt</artifactId>
         <groupId>org.opencord</groupId>
-        <version>3.0.0-SNAPSHOT</version>
+        <version>3.0.1-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/app/pom.xml b/app/pom.xml
index e1b9bb0..0ee82ff 100644
--- a/app/pom.xml
+++ b/app/pom.xml
@@ -20,7 +20,7 @@
     <parent>
         <groupId>org.opencord</groupId>
         <artifactId>olt</artifactId>
-        <version>3.0.0-SNAPSHOT</version>
+        <version>3.0.1-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/app/src/main/java/org/opencord/olt/impl/Olt.java b/app/src/main/java/org/opencord/olt/impl/Olt.java
index a611723..1e00237 100644
--- a/app/src/main/java/org/opencord/olt/impl/Olt.java
+++ b/app/src/main/java/org/opencord/olt/impl/Olt.java
@@ -116,6 +116,8 @@
     private static final String APP_NAME = "org.opencord.olt";
 
     private static final short DEFAULT_VLAN = 0;
+    private static final int DEFAULT_TP_ID = 10;
+    private static final String DEFAULT_BP_ID = "Default";
     private static final String ADDITIONAL_VLANS = "additional-vlans";
 
     private final Logger log = getLogger(getClass());
@@ -169,6 +171,14 @@
             label = "Deleting Meters based on flow count statistics")
     protected boolean deleteMeters = false;
 
+    @Property(name = "defaultTechProfileId", intValue = DEFAULT_TP_ID,
+            label = "Default technology profile id that is used for authentication trap flows")
+    protected int defaultTechProfileId = DEFAULT_TP_ID;
+
+    @Property(name = "defaultBpId", value = DEFAULT_BP_ID,
+            label = "Default bandwidth profile id that is used for authentication trap flows")
+    protected String defaultBpId = DEFAULT_BP_ID;
+
     private final DeviceListener deviceListener = new InternalDeviceListener();
     private final MeterListener meterListener = new InternalMeterListener();
 
@@ -258,13 +268,19 @@
             }
 
             log.info("DHCP Settings [enableDhcpOnProvisioning: {}, enableDhcpV4: {}, enableDhcpV6: {}]",
-                     enableDhcpOnProvisioning, enableDhcpV4, enableDhcpV6);
+                    enableDhcpOnProvisioning, enableDhcpV4, enableDhcpV6);
 
             Boolean d = Tools.isPropertyEnabled(properties, "deleteMeters");
             if (d != null) {
                 deleteMeters = d;
             }
 
+            String tpId = get(properties, "defaultTechProfileId");
+            defaultTechProfileId = isNullOrEmpty(s) ? DEFAULT_TP_ID : Integer.parseInt(tpId.trim());
+
+            String bpId = get(properties, "defaultBpId");
+            defaultBpId = bpId;
+
         } catch (Exception e) {
             defaultVlan = DEFAULT_VLAN;
         }
@@ -415,7 +431,7 @@
             if (getOltInfo(d) == null) {
                 continue; // not an olt, or not configured in sadis
             }
-            for (Port p: deviceService.getPorts(d.id())) {
+            for (Port p : deviceService.getPorts(d.id())) {
                 if (isUniPort(d, p) && p.isEnabled()) {
                     ConnectPoint cp = new ConnectPoint(d.id(), p.number());
 
@@ -647,10 +663,8 @@
 
         meterBands.add(createMeterBand(bpInfo.committedInformationRate(), bpInfo.committedBurstSize()));
         meterBands.add(createMeterBand(bpInfo.exceededInformationRate(), bpInfo.exceededBurstSize()));
+        meterBands.add(createMeterBand(bpInfo.assuredInformationRate(), 0L));
 
-        if (bpInfo.assuredInformationRate() != 0) {
-            meterBands.add(createMeterBand(bpInfo.assuredInformationRate(), 0L));
-        }
         return meterBands;
     }
 
@@ -684,9 +698,7 @@
             downstreamTreatmentBuilder.meter(meterId);
         }
 
-        if (techProfId != -1) {
-            downstreamTreatmentBuilder.transition(techProfId);
-        }
+        downstreamTreatmentBuilder.writeMetadata(createMetadata(subscriberVlan, techProfId, subscriberPort), 0);
 
         return DefaultForwardingObjective.builder()
                 .withFlag(ForwardingObjective.Flag.VERSATILE)
@@ -729,10 +741,7 @@
             upstreamTreatmentBuilder.meter(meterId);
         }
 
-        if (technologyProfileId != -1) {
-            upstreamTreatmentBuilder.transition(technologyProfileId);
-
-        }
+        upstreamTreatmentBuilder.writeMetadata(createMetadata(deviceVlan, technologyProfileId, uplinkPort), 0L);
 
         return DefaultForwardingObjective.builder()
                 .withFlag(ForwardingObjective.Flag.VERSATILE)
@@ -742,6 +751,7 @@
                 .fromApp(appId)
                 .withTreatment(upstreamTreatmentBuilder.build());
     }
+
     private void provisionTransparentFlows(DeviceId deviceId, PortNumber uplinkPort,
                                            PortNumber subscriberPort,
                                            VlanId innerVlan,
@@ -905,11 +915,22 @@
             return;
         }
         DefaultFilteringObjective.Builder builder = DefaultFilteringObjective.builder();
+        TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
 
+        BandwidthProfileInformation defaultBpInfo = getBandwidthProfileInformation(defaultBpId);
+        if (defaultBpInfo != null) {
+            MeterId meterId = createMeter(devId, defaultBpInfo);
+            treatmentBuilder.meter(meterId);
+        } else {
+            log.warn("Default bandwidth profile is not found. Authentication flow will be installed without meter");
+        }
+
+        //Authentication trap flow uses only tech profile id as metadata
         FilteringObjective eapol = (install ? builder.permit() : builder.deny())
                 .withKey(Criteria.matchInPort(port))
                 .addCondition(Criteria.matchEthType(EthType.EtherType.EAPOL.ethType()))
-                .withMeta(DefaultTrafficTreatment.builder()
+                .withMeta(treatmentBuilder
+                        .writeMetadata((long) defaultTechProfileId << 32, 0)
                         .setOutput(PortNumber.CONTROLLER).build())
                 .fromApp(appId)
                 .withPriority(10000)
@@ -936,8 +957,8 @@
      * Installs trap filtering objectives for particular traffic types on an
      * NNI port.
      *
-     * @param devId device ID
-     * @param port port number
+     * @param devId   device ID
+     * @param port    port number
      * @param install true to install, false to remove
      */
     private void processNniFilteringObjectives(DeviceId devId, PortNumber port, boolean install) {
@@ -982,11 +1003,11 @@
     /**
      * Trap dhcp packets to the controller.
      *
-     * @param devId the device identifier
-     * @param port the port for which this trap flow is designated
-     * @param install true to install the flow, false to remove the flow
+     * @param devId    the device identifier
+     * @param port     the port for which this trap flow is designated
+     * @param install  true to install the flow, false to remove the flow
      * @param upstream true if trapped packets are flowing upstream towards
-     *            server, false if packets are flowing dowstream towards client
+     *                 server, false if packets are flowing dowstream towards client
      */
     private void processDhcpFilteringObjectives(DeviceId devId, PortNumber port,
                                                 boolean install,
@@ -1040,16 +1061,16 @@
                     @Override
                     public void onSuccess(Objective objective) {
                         log.info("DHCP {} filter for device {} on port {} {}.",
-                                 (ethType.equals(EthType.EtherType.IPV4.ethType())) ? "v4" : "v6",
-                                 devId, port, (install) ? "installed" : "removed");
+                                (ethType.equals(EthType.EtherType.IPV4.ethType())) ? "v4" : "v6",
+                                devId, port, (install) ? "installed" : "removed");
                     }
 
                     @Override
                     public void onError(Objective objective, ObjectiveError error) {
                         log.info("DHCP {} filter for device {} on port {} failed {} because {}",
-                                 (ethType.equals(EthType.EtherType.IPV4.ethType())) ? "v4" : "v6",
-                                 devId, port, (install) ? "installation" : "removal",
-                                 error);
+                                (ethType.equals(EthType.EtherType.IPV4.ethType())) ? "v4" : "v6",
+                                devId, port, (install) ? "installation" : "removal",
+                                error);
                     }
                 });
 
@@ -1121,7 +1142,7 @@
 
     /**
      * Get the uplink for of the OLT device.
-     *
+     * <p>
      * This assumes that the OLT has a single uplink port. When more uplink ports need to be supported
      * this logic needs to be changed
      *
@@ -1138,7 +1159,7 @@
             return null;
         }
         // Return the port that has been configured as the uplink port of this OLT in Sadis
-        for (Port p: deviceService.getPorts(dev.id())) {
+        for (Port p : deviceService.getPorts(dev.id())) {
             if (p.number().toLong() == deviceInfo.uplinkPort()) {
                 log.debug("getUplinkPort: Found port {}", p);
                 return p;
@@ -1162,6 +1183,23 @@
         return subsService.get(portName);
     }
 
+    /**
+     * Write metadata instruction value (metadata) is 8 bytes.
+     *
+     * MS 2 bytes: C Tag
+     * Next 2 bytes: Technology Profile Id
+     * Next 4 bytes: Port number (uni or nni)
+     */
+
+    private Long createMetadata(VlanId innerVlan, int techProfileId, PortNumber egressPort) {
+
+        if (techProfileId == -1) {
+            techProfileId = DEFAULT_TP_ID;
+        }
+
+        return ((long) (innerVlan.id()) << 48 | (long) techProfileId << 32) | egressPort.toLong();
+    }
+
     private boolean isUniPort(Device d, Port p) {
         Port ulPort = getUplinkPort(d);
         if (ulPort != null) {
diff --git a/app/src/main/resources/vlan_cfg_with_default.json b/app/src/main/resources/vlan_cfg_with_default.json
new file mode 100644
index 0000000..7cd792a
--- /dev/null
+++ b/app/src/main/resources/vlan_cfg_with_default.json
@@ -0,0 +1,70 @@
+{
+  "apps" : {
+    "org.opencord.sadis" : {
+      "sadis" : {
+        "integration" : {
+          "cache" : {
+            "enabled" : true,
+            "maxsize" : 60,
+            "ttl" : "PT1m"
+          }
+        },
+        "entries" : [ {
+          "id" : "s1-eth1",
+          "cTag" : 2,
+          "sTag" : 4,
+          "nasPortId" : "s1-eth1",
+          "technologyProfileId" : 10,
+          "upstreamBandwidthProfile" : "High-Speed-Internet",
+          "downstreamBandwidthProfile" : "User1-Specific"
+        }, {
+          "id" : "1",
+          "hardwareIdentifier" : "00:00:00:00:00:01",
+          "ipAddress" : "127.0.0.1",
+          "uplinkPort": "2"
+        } ]
+      },
+      "bandwidthprofile":{
+        "integration":{
+          "cache":{
+            "enabled":true,
+            "maxsize":40,
+            "ttl":"PT1m"
+          }
+        },
+        "entries":[
+          {
+            "id":"High-Speed-Internet",
+            "cir":200000000,
+            "cbs":348000,
+            "eir":10000000,
+            "ebs":348000,
+            "air":10000000
+          },
+          {
+            "id":"User1-Specific",
+            "cir":300000000,
+            "cbs":348000,
+            "eir":20000000,
+            "ebs":348000
+          },
+          {
+            "id":"Default",
+            "cir":0,
+            "cbs":0,
+            "eir":512,
+            "ebs":30,
+            "air":0
+          }
+        ]
+      }
+    }
+  },
+  "devices":{
+    "of:0000000000000001":{
+      "basic":{
+        "driver":"pmc-olt"
+      }
+    }
+  }
+}
diff --git a/pom.xml b/pom.xml
index b9d22a8..bcd8637 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,18 +22,18 @@
     <parent>
         <groupId>org.onosproject</groupId>
         <artifactId>onos-dependencies</artifactId>
-        <version>1.13.6</version>
+        <version>1.13.8</version>
         <relativePath></relativePath>
     </parent>
 
     <groupId>org.opencord</groupId>
     <artifactId>olt</artifactId>
-    <version>3.0.0-SNAPSHOT</version>
+    <version>3.0.1-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos.version>1.13.6</onos.version>
+        <onos.version>1.13.8</onos.version>
     </properties>
 
     <modules>
