added treatment support and conversion to an instruction

moved to meter api to onos-api

Change-Id: I0504f06fdc503953fa7696224d97edda43596d6e
diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
index 06c49ba..2dad08b 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
@@ -28,6 +28,7 @@
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions;
+import org.onosproject.net.meter.MeterId;
 
 import java.util.Collections;
 import java.util.List;
@@ -50,6 +51,7 @@
 
     private static final DefaultTrafficTreatment EMPTY
             = new DefaultTrafficTreatment(Collections.emptyList());
+    private final Instructions.MeterInstruction meter;
 
     /**
      * Creates a new traffic treatment from the specified list of instructions.
@@ -63,6 +65,7 @@
         this.hasClear = false;
         this.table = null;
         this.meta = null;
+        this.meter = null;
     }
 
     /**
@@ -77,7 +80,8 @@
                                    List<Instruction> immediate,
                                    Instructions.TableTypeTransition table,
                                    boolean clear,
-                                   Instructions.MetadataInstruction meta) {
+                                   Instructions.MetadataInstruction meta,
+                                   Instructions.MeterInstruction meter) {
         this.immediate = ImmutableList.copyOf(checkNotNull(immediate));
         this.deferred = ImmutableList.copyOf(checkNotNull(deferred));
         this.all = new ImmutableList.Builder<Instruction>()
@@ -87,6 +91,7 @@
         this.table = table;
         this.meta = meta;
         this.hasClear = clear;
+        this.meter = meter;
     }
 
     @Override
@@ -119,6 +124,11 @@
         return meta;
     }
 
+    @Override
+    public Instructions.MeterInstruction metered() {
+        return meter;
+    }
+
     /**
      * Returns a new traffic treatment builder.
      *
@@ -193,12 +203,16 @@
 
         Instructions.MetadataInstruction meta;
 
+        Instructions.MeterInstruction meter;
+
         List<Instruction> deferred = Lists.newLinkedList();
 
         List<Instruction> immediate = Lists.newLinkedList();
 
         List<Instruction> current = immediate;
 
+
+
         // Creates a new builder
         private Builder() {
         }
@@ -233,6 +247,8 @@
                 case METADATA:
                     meta = (Instructions.MetadataInstruction) instruction;
                     break;
+                case METER:
+                    meter = (Instructions.MeterInstruction) instruction;
                 default:
                     throw new IllegalArgumentException("Unknown instruction type: " +
                                                                instruction.type());
@@ -343,6 +359,11 @@
         }
 
         @Override
+        public TrafficTreatment.Builder meter(MeterId meterId) {
+            return add(Instructions.meterTraffic(meterId));
+        }
+
+        @Override
         public Builder popVlan() {
             return add(Instructions.popVlan());
         }
@@ -420,7 +441,7 @@
             //        && table == null && !clear) {
             //    drop();
             //}
-            return new DefaultTrafficTreatment(deferred, immediate, table, clear, meta);
+            return new DefaultTrafficTreatment(deferred, immediate, table, clear, meta, meter);
         }
 
     }
diff --git a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
index d125a9f..042aeaf 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
@@ -24,6 +24,7 @@
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions;
+import org.onosproject.net.meter.MeterId;
 
 import java.util.List;
 
@@ -75,6 +76,13 @@
     Instructions.MetadataInstruction writeMetadata();
 
     /**
+     * Returns the meter instruction if there is one.
+     *
+     * @return a meter instruction that may be null
+     */
+    Instructions.MeterInstruction metered();
+
+    /**
      * Builder of traffic treatment entities.
      */
     interface Builder {
@@ -243,6 +251,13 @@
          */
         Builder group(GroupId groupId);
 
+        /**
+         * Sets a meter to be used by this flow.
+         *
+         * @param meterId a meter id
+         * @return a treatment builder
+         */
+        Builder meter(MeterId meterId);
 
         /**
          * Sets the next table type to transition to.
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instruction.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instruction.java
index 7496e97..6f2cac6 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instruction.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instruction.java
@@ -40,6 +40,11 @@
         GROUP,
 
         /**
+         * Signifies that traffic should be metered according to a meter.
+         */
+        METER,
+
+        /**
          * Signifies that the traffic should be modified in L0 way.
          */
         L0MODIFICATION,
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
index 3cacfa5..cd9ec96 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
@@ -34,6 +34,7 @@
 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModTtlInstruction;
 import org.onosproject.net.flow.instructions.L4ModificationInstruction.L4SubType;
 import org.onosproject.net.flow.instructions.L4ModificationInstruction.ModTransportPortInstruction;
+import org.onosproject.net.meter.MeterId;
 
 import java.util.Objects;
 
@@ -81,6 +82,11 @@
         return new GroupInstruction(groupId);
     }
 
+    public static MeterInstruction meterTraffic(final MeterId meterId) {
+        checkNotNull(meterId, "meter id cannot be null");
+        return new MeterInstruction(meterId);
+    }
+
     /**
      * Creates a l0 modification.
      *
@@ -528,6 +534,50 @@
     }
 
     /**
+     * A meter instruction.
+     */
+    public static final class MeterInstruction implements Instruction {
+        private final MeterId meterId;
+
+        private MeterInstruction(MeterId meterId) {
+            this.meterId = meterId;
+        }
+
+        public MeterId meterId() {
+            return meterId;
+        }
+
+        @Override
+        public Type type() {
+            return Type.METER;
+        }
+
+        @Override
+        public String toString() {
+            return toStringHelper(type().toString())
+                    .add("meter ID", meterId.id()).toString();
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(type().ordinal(), meterId);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj instanceof MeterInstruction) {
+                MeterInstruction that = (MeterInstruction) obj;
+                return Objects.equals(meterId, that.meterId);
+
+            }
+            return false;
+        }
+    }
+
+    /**
      *  Transition instruction.
      */
     public static class TableTypeTransition implements Instruction {
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/Band.java b/core/api/src/main/java/org/onosproject/net/meter/Band.java
similarity index 98%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/Band.java
rename to core/api/src/main/java/org/onosproject/net/meter/Band.java
index 1342a22..2bfafad 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/Band.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/Band.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 /**
  * Represents a band used within a meter.
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/BandEntry.java b/core/api/src/main/java/org/onosproject/net/meter/BandEntry.java
similarity index 95%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/BandEntry.java
rename to core/api/src/main/java/org/onosproject/net/meter/BandEntry.java
index 369e1cc..03145e9 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/BandEntry.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/BandEntry.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 /**
  * Represents a stored band.
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/DefaultBand.java b/core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java
similarity index 98%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/DefaultBand.java
rename to core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java
index 669dc0d..a3a4fc2 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/DefaultBand.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/DefaultMeter.java b/core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java
similarity index 98%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/DefaultMeter.java
rename to core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java
index 177688c..611a23e 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/DefaultMeter.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.DeviceId;
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/Meter.java b/core/api/src/main/java/org/onosproject/net/meter/Meter.java
similarity index 98%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/Meter.java
rename to core/api/src/main/java/org/onosproject/net/meter/Meter.java
index 37c1105..5181c92 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/Meter.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/Meter.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.DeviceId;
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterContext.java b/core/api/src/main/java/org/onosproject/net/meter/MeterContext.java
similarity index 95%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterContext.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterContext.java
index b112b9a..005c41c 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterContext.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterContext.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 /**
  * A context permitting the application to be notified when the
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterEntry.java b/core/api/src/main/java/org/onosproject/net/meter/MeterEntry.java
similarity index 96%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterEntry.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterEntry.java
index 6157578..178a564 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterEntry.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterEntry.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 /**
  * Represents a stored meter.
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterEvent.java b/core/api/src/main/java/org/onosproject/net/meter/MeterEvent.java
similarity index 96%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterEvent.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterEvent.java
index 808a3e8..72f0a53 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterEvent.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterEvent.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import org.onosproject.event.AbstractEvent;
 
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterFailReason.java b/core/api/src/main/java/org/onosproject/net/meter/MeterFailReason.java
similarity index 96%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterFailReason.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterFailReason.java
index d98e44a..8683e2a 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterFailReason.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterFailReason.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 /**
  * Enum used to represent a meter failure condition.
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterId.java b/core/api/src/main/java/org/onosproject/net/meter/MeterId.java
similarity index 97%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterId.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterId.java
index 8619e14..f479ac5 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterId.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterId.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterListener.java b/core/api/src/main/java/org/onosproject/net/meter/MeterListener.java
similarity index 94%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterListener.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterListener.java
index 1cb667a..0a5e203 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterListener.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterListener.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import org.onosproject.event.EventListener;
 
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterOperation.java b/core/api/src/main/java/org/onosproject/net/meter/MeterOperation.java
similarity index 97%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterOperation.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterOperation.java
index 8354888..50e6fe9 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterOperation.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterOperation.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import com.google.common.base.MoreObjects;
 
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterOperations.java b/core/api/src/main/java/org/onosproject/net/meter/MeterOperations.java
similarity index 96%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterOperations.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterOperations.java
index 8dbad89..92b0c3a 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterOperations.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterOperations.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import com.google.common.collect.ImmutableList;
 
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterProvider.java b/core/api/src/main/java/org/onosproject/net/meter/MeterProvider.java
similarity index 96%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterProvider.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterProvider.java
index d8a743c1..4655e23 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterProvider.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterProvider.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.Provider;
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterProviderRegistry.java b/core/api/src/main/java/org/onosproject/net/meter/MeterProviderRegistry.java
similarity index 94%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterProviderRegistry.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterProviderRegistry.java
index b20e918..019ca19 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterProviderRegistry.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterProviderRegistry.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 
 import org.onosproject.net.provider.ProviderRegistry;
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterProviderService.java b/core/api/src/main/java/org/onosproject/net/meter/MeterProviderService.java
similarity index 96%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterProviderService.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterProviderService.java
index c1dd30cb1..85c0c43 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterProviderService.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterProviderService.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.ProviderService;
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterService.java b/core/api/src/main/java/org/onosproject/net/meter/MeterService.java
similarity index 96%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterService.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterService.java
index c7eb93a..eaa2a50 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterService.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterService.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import org.onosproject.event.ListenerService;
 
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterState.java b/core/api/src/main/java/org/onosproject/net/meter/MeterState.java
similarity index 95%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterState.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterState.java
index a910d6d..3b93609 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterState.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterState.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 /**
  * Represents the state of the meter as seen by the store.
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterStore.java b/core/api/src/main/java/org/onosproject/net/meter/MeterStore.java
similarity index 97%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterStore.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterStore.java
index 54e5658..c5d57d5 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterStore.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterStore.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import org.onosproject.store.Store;
 
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterStoreDelegate.java b/core/api/src/main/java/org/onosproject/net/meter/MeterStoreDelegate.java
similarity index 94%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterStoreDelegate.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterStoreDelegate.java
index facb453..9bfeb42 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterStoreDelegate.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterStoreDelegate.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import org.onosproject.store.StoreDelegate;
 
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterStoreResult.java b/core/api/src/main/java/org/onosproject/net/meter/MeterStoreResult.java
similarity index 96%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterStoreResult.java
rename to core/api/src/main/java/org/onosproject/net/meter/MeterStoreResult.java
index 8ad5aa6..7a26746 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/MeterStoreResult.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterStoreResult.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.incubator.net.meter;
+package org.onosproject.net.meter;
 
 import java.util.Optional;
 
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/package-info.java b/core/api/src/main/java/org/onosproject/net/meter/package-info.java
similarity index 93%
rename from incubator/api/src/main/java/org/onosproject/incubator/net/meter/package-info.java
rename to core/api/src/main/java/org/onosproject/net/meter/package-info.java
index b1cb85e..258634d 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/meter/package-info.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/package-info.java
@@ -17,4 +17,4 @@
 /**
  * Flow meter model and related services.
  */
-package org.onosproject.incubator.net.meter;
\ No newline at end of file
+package org.onosproject.net.meter;
\ No newline at end of file
diff --git a/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java b/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
index 550406f..ac4ecff 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
@@ -124,6 +124,11 @@
         public MetadataInstruction writeMetadata() {
             return null;
         }
+
+        @Override
+        public Instructions.MeterInstruction metered() {
+            return null;
+        }
     }
 
     /**
diff --git a/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java b/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java
index afd9a90..7ef8762 100644
--- a/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java
@@ -610,6 +610,11 @@
             return null;
         }
 
+        @Override
+        public Instructions.MeterInstruction metered() {
+            return null;
+        }
+
     }
 
     public class TestApplicationId extends DefaultApplicationId {
diff --git a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
index 212d4a0..556038a 100644
--- a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
+++ b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
@@ -160,6 +160,7 @@
 import org.onosproject.net.intent.constraint.PartialFailureConstraint;
 import org.onosproject.net.intent.constraint.WaypointConstraint;
 import org.onosproject.net.link.DefaultLinkDescription;
+import org.onosproject.net.meter.MeterId;
 import org.onosproject.net.newresource.ResourceAllocation;
 import org.onosproject.net.newresource.ResourcePath;
 import org.onosproject.net.packet.DefaultOutboundPacket;
@@ -271,6 +272,8 @@
             .register(MISC)
             .nextId(KryoNamespace.INITIAL_ID + 30 + 10)
             .register(
+                    Instructions.MeterInstruction.class,
+                    MeterId.class,
                     Version.class,
                     ControllerNode.State.class,
                     ApplicationState.class,
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
index 47450c7..a0c1dfc 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
@@ -22,21 +22,21 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.TriConsumer;
-import org.onosproject.incubator.net.meter.DefaultMeter;
-import org.onosproject.incubator.net.meter.Meter;
-import org.onosproject.incubator.net.meter.MeterEvent;
-import org.onosproject.incubator.net.meter.MeterFailReason;
-import org.onosproject.incubator.net.meter.MeterId;
-import org.onosproject.incubator.net.meter.MeterListener;
-import org.onosproject.incubator.net.meter.MeterOperation;
-import org.onosproject.incubator.net.meter.MeterProvider;
-import org.onosproject.incubator.net.meter.MeterProviderRegistry;
-import org.onosproject.incubator.net.meter.MeterProviderService;
-import org.onosproject.incubator.net.meter.MeterService;
-import org.onosproject.incubator.net.meter.MeterState;
-import org.onosproject.incubator.net.meter.MeterStore;
-import org.onosproject.incubator.net.meter.MeterStoreDelegate;
-import org.onosproject.incubator.net.meter.MeterStoreResult;
+import org.onosproject.net.meter.DefaultMeter;
+import org.onosproject.net.meter.Meter;
+import org.onosproject.net.meter.MeterEvent;
+import org.onosproject.net.meter.MeterFailReason;
+import org.onosproject.net.meter.MeterId;
+import org.onosproject.net.meter.MeterListener;
+import org.onosproject.net.meter.MeterOperation;
+import org.onosproject.net.meter.MeterProvider;
+import org.onosproject.net.meter.MeterProviderRegistry;
+import org.onosproject.net.meter.MeterProviderService;
+import org.onosproject.net.meter.MeterService;
+import org.onosproject.net.meter.MeterState;
+import org.onosproject.net.meter.MeterStore;
+import org.onosproject.net.meter.MeterStoreDelegate;
+import org.onosproject.net.meter.MeterStoreResult;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
index 6477e68..ed7c9bf 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
@@ -23,16 +23,16 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
-import org.onosproject.incubator.net.meter.DefaultMeter;
-import org.onosproject.incubator.net.meter.Meter;
-import org.onosproject.incubator.net.meter.MeterEvent;
-import org.onosproject.incubator.net.meter.MeterFailReason;
-import org.onosproject.incubator.net.meter.MeterId;
-import org.onosproject.incubator.net.meter.MeterOperation;
-import org.onosproject.incubator.net.meter.MeterState;
-import org.onosproject.incubator.net.meter.MeterStore;
-import org.onosproject.incubator.net.meter.MeterStoreDelegate;
-import org.onosproject.incubator.net.meter.MeterStoreResult;
+import org.onosproject.net.meter.DefaultMeter;
+import org.onosproject.net.meter.Meter;
+import org.onosproject.net.meter.MeterEvent;
+import org.onosproject.net.meter.MeterFailReason;
+import org.onosproject.net.meter.MeterId;
+import org.onosproject.net.meter.MeterOperation;
+import org.onosproject.net.meter.MeterState;
+import org.onosproject.net.meter.MeterStore;
+import org.onosproject.net.meter.MeterStoreDelegate;
+import org.onosproject.net.meter.MeterStoreResult;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.store.AbstractStore;
 import org.onosproject.store.serializers.KryoNamespaces;
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/MeterData.java b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/MeterData.java
index cfc1402..c72bc2e 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/MeterData.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/MeterData.java
@@ -16,8 +16,8 @@
 package org.onosproject.incubator.store.meter.impl;
 
 import org.onosproject.cluster.NodeId;
-import org.onosproject.incubator.net.meter.Meter;
-import org.onosproject.incubator.net.meter.MeterFailReason;
+import org.onosproject.net.meter.Meter;
+import org.onosproject.net.meter.MeterFailReason;
 
 import java.util.Optional;
 
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
index 58c19ad..483eca9 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
@@ -161,6 +161,9 @@
         if (treatment.writeMetadata() != null) {
             instructions.add(buildMetadata(treatment.writeMetadata()));
         }
+        if (treatment.metered() != null) {
+            instructions.add(buildMeter(treatment.metered()));
+        }
 
         long cookie = flowRule().id().value();
 
@@ -263,6 +266,11 @@
         return instruction;
     }
 
+    private OFInstruction buildMeter(Instructions.MeterInstruction metered) {
+        return factory().instructions().meter(metered.meterId().id());
+    }
+
+
     private OFAction buildL0Modification(Instruction i) {
         L0ModificationInstruction l0m = (L0ModificationInstruction) i;
         switch (l0m.subtype()) {
diff --git a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java
index 00ad8ef..930042b 100644
--- a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java
+++ b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java
@@ -15,9 +15,9 @@
  */
 package org.onosproject.provider.of.meter.impl;
 
-import org.onosproject.incubator.net.meter.Band;
-import org.onosproject.incubator.net.meter.Meter;
-import org.onosproject.incubator.net.meter.MeterId;
+import org.onosproject.net.meter.Band;
+import org.onosproject.net.meter.Meter;
+import org.onosproject.net.meter.MeterId;
 import org.projectfloodlight.openflow.protocol.OFFactory;
 import org.projectfloodlight.openflow.protocol.OFMeterFlags;
 import org.projectfloodlight.openflow.protocol.OFMeterMod;
diff --git a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/OpenFlowMeterProvider.java b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/OpenFlowMeterProvider.java
index e56a54c..2e1611d 100644
--- a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/OpenFlowMeterProvider.java
+++ b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/OpenFlowMeterProvider.java
@@ -28,17 +28,17 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onosproject.core.CoreService;
-import org.onosproject.incubator.net.meter.Band;
-import org.onosproject.incubator.net.meter.DefaultBand;
-import org.onosproject.incubator.net.meter.DefaultMeter;
-import org.onosproject.incubator.net.meter.Meter;
-import org.onosproject.incubator.net.meter.MeterFailReason;
-import org.onosproject.incubator.net.meter.MeterOperation;
-import org.onosproject.incubator.net.meter.MeterOperations;
-import org.onosproject.incubator.net.meter.MeterProvider;
-import org.onosproject.incubator.net.meter.MeterProviderRegistry;
-import org.onosproject.incubator.net.meter.MeterProviderService;
-import org.onosproject.incubator.net.meter.MeterState;
+import org.onosproject.net.meter.Band;
+import org.onosproject.net.meter.DefaultBand;
+import org.onosproject.net.meter.DefaultMeter;
+import org.onosproject.net.meter.Meter;
+import org.onosproject.net.meter.MeterFailReason;
+import org.onosproject.net.meter.MeterOperation;
+import org.onosproject.net.meter.MeterOperations;
+import org.onosproject.net.meter.MeterProvider;
+import org.onosproject.net.meter.MeterProviderRegistry;
+import org.onosproject.net.meter.MeterProviderService;
+import org.onosproject.net.meter.MeterState;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;