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"
+      }
+    }
+  }
+}
