diff --git a/utils/misc/src/main/java/org/onlab/util/Bandwidth.java b/utils/misc/src/main/java/org/onlab/util/Bandwidth.java
index 6080656..ab07b71 100644
--- a/utils/misc/src/main/java/org/onlab/util/Bandwidth.java
+++ b/utils/misc/src/main/java/org/onlab/util/Bandwidth.java
@@ -17,28 +17,21 @@
 
 import com.google.common.collect.ComparisonChain;
 
-import java.util.Objects;
-
 /**
  * Representation of bandwidth.
  * Use the static factory method corresponding to the unit (like Kbps) you desire on instantiation.
  */
-public final class Bandwidth implements RichComparable<Bandwidth> {
-
-    private final double bps;
+public interface Bandwidth extends RichComparable<Bandwidth> {
 
     /**
      * Creates a new instance with given bandwidth.
      *
-     * @param bps bandwidth value to be assigned
+     * @param v         bandwidth value
+     * @param unit      {@link DataRateUnit} of {@code v}
+     * @return {@link Bandwidth} instance with given bandwidth
      */
-    private Bandwidth(double bps) {
-        this.bps = bps;
-    }
-
-    // Constructor for serialization
-    private Bandwidth() {
-        this.bps = 0;
+    static Bandwidth of(long v, DataRateUnit unit) {
+        return new LongBandwidth(unit.toBitsPerSecond(v));
     }
 
     /**
@@ -48,8 +41,8 @@
      * @param unit      {@link DataRateUnit} of {@code v}
      * @return {@link Bandwidth} instance with given bandwidth
      */
-    public static Bandwidth of(double v, DataRateUnit unit) {
-        return new Bandwidth(unit.toBitsPerSecond(v));
+    static Bandwidth of(double v, DataRateUnit unit) {
+        return new DoubleBandwidth(unit.toBitsPerSecond(v));
     }
 
     /**
@@ -58,8 +51,18 @@
      * @param bps bandwidth value to be assigned
      * @return {@link Bandwidth} instance with given bandwidth
      */
-    public static Bandwidth bps(double bps) {
-        return new Bandwidth(bps);
+    static Bandwidth bps(long bps) {
+        return new LongBandwidth(bps);
+    }
+
+    /**
+     * Creates a new instance with given bandwidth in bps.
+     *
+     * @param bps bandwidth value to be assigned
+     * @return {@link Bandwidth} instance with given bandwidth
+     */
+    static Bandwidth bps(double bps) {
+        return new DoubleBandwidth(bps);
     }
 
     /**
@@ -68,7 +71,17 @@
      * @param kbps bandwidth value to be assigned
      * @return {@link Bandwidth} instance with given bandwidth
      */
-    public static Bandwidth kbps(double kbps) {
+    static Bandwidth kbps(long kbps) {
+        return bps(kbps * 1_000L);
+    }
+
+    /**
+     * Creates a new instance with given bandwidth in Kbps.
+     *
+     * @param kbps bandwidth value to be assigned
+     * @return {@link Bandwidth} instance with given bandwidth
+     */
+    static Bandwidth kbps(double kbps) {
         return bps(kbps * 1_000L);
     }
 
@@ -78,7 +91,17 @@
      * @param mbps bandwidth value to be assigned
      * @return {@link Bandwidth} instance with given bandwidth
      */
-    public static Bandwidth mbps(double mbps) {
+    static Bandwidth mbps(long mbps) {
+        return bps(mbps * 1_000_000L);
+    }
+
+    /**
+     * Creates a new instance with given bandwidth in Mbps.
+     *
+     * @param mbps bandwidth value to be assigned
+     * @return {@link Bandwidth} instance with given bandwidth
+     */
+    static Bandwidth mbps(double mbps) {
         return bps(mbps * 1_000_000L);
     }
 
@@ -88,7 +111,17 @@
      * @param gbps bandwidth value to be assigned
      * @return {@link Bandwidth} instance with given bandwidth
      */
-    public static Bandwidth gbps(double gbps) {
+    static Bandwidth gbps(long gbps) {
+        return bps(gbps * 1_000_000_000L);
+    }
+
+    /**
+     * Creates a new instance with given bandwidth in Gbps.
+     *
+     * @param gbps bandwidth value to be assigned
+     * @return {@link Bandwidth} instance with given bandwidth
+     */
+    static Bandwidth gbps(double gbps) {
         return bps(gbps * 1_000_000_000L);
     }
 
@@ -97,9 +130,7 @@
      *
      * @return bandwidth in bps.
      */
-    public double bps() {
-        return bps;
-    }
+    double bps();
 
     /**
      * Returns a Bandwidth whose value is (this + value).
@@ -107,8 +138,8 @@
      * @param value value to be added to this Frequency
      * @return this + value
      */
-    public Bandwidth add(Bandwidth value) {
-        return bps(this.bps + value.bps);
+    default Bandwidth add(Bandwidth value) {
+        return bps(this.bps() + value.bps());
     }
 
     /**
@@ -117,33 +148,14 @@
      * @param value value to be added to this Frequency
      * @return this - value
      */
-    public Bandwidth subtract(Bandwidth value) {
-        return bps(this.bps - value.bps);
+    default Bandwidth subtract(Bandwidth value) {
+        return bps(this.bps() - value.bps());
     }
 
     @Override
-    public int compareTo(Bandwidth other) {
+    default int compareTo(Bandwidth other) {
         return ComparisonChain.start()
-                .compare(this.bps, other.bps)
+                .compare(this.bps(), other.bps())
                 .result();
     }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof Bandwidth) {
-            Bandwidth that = (Bandwidth) obj;
-            return Objects.equals(this.bps, that.bps);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Long.hashCode(Double.doubleToLongBits(bps));
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf(this.bps);
-    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/util/DoubleBandwidth.java b/utils/misc/src/main/java/org/onlab/util/DoubleBandwidth.java
new file mode 100644
index 0000000..69f2529
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/util/DoubleBandwidth.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2016 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.onlab.util;
+
+import java.util.Objects;
+
+/**
+ * Representation of bandwidth.
+ * Use the static factory method corresponding to the unit (like Kbps) you desire on instantiation.
+ */
+final class DoubleBandwidth implements Bandwidth {
+
+    private final double bps;
+
+    /**
+     * Creates a new instance with given bandwidth.
+     *
+     * @param bps bandwidth value to be assigned
+     */
+    DoubleBandwidth(double bps) {
+        this.bps = bps;
+    }
+
+    // Constructor for serialization
+    private DoubleBandwidth() {
+        this.bps = 0;
+    }
+    /**
+     * Returns bandwidth in bps.
+     *
+     * @return bandwidth in bps.
+     */
+    public double bps() {
+        return bps;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+
+        if (!(obj instanceof DoubleBandwidth)) {
+            return false;
+        }
+
+        DoubleBandwidth that = (DoubleBandwidth) obj;
+        return Objects.equals(this.bps, that.bps);
+    }
+
+    @Override
+    public int hashCode() {
+        return Long.hashCode(Double.doubleToLongBits(bps));
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(this.bps);
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/util/LongBandwidth.java b/utils/misc/src/main/java/org/onlab/util/LongBandwidth.java
new file mode 100644
index 0000000..d45f715
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/util/LongBandwidth.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2016 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.onlab.util;
+
+import com.google.common.collect.ComparisonChain;
+
+/**
+ * Representation of bandwidth.
+ * Use the static factory method corresponding to the unit (like Kbps) you desire on instantiation.
+ */
+final class LongBandwidth implements Bandwidth {
+
+    private final long bps;
+
+    /**
+     * Creates a new instance with given bandwidth.
+     *
+     * @param bps bandwidth value to be assigned
+     */
+    LongBandwidth(long bps) {
+        this.bps = bps;
+    }
+
+    // Constructor for serialization
+    private LongBandwidth() {
+        this.bps = 0;
+    }
+    /**
+     * Returns bandwidth in bps.
+     *
+     * @return bandwidth in bps.
+     */
+    public double bps() {
+        return bps;
+    }
+
+    /**
+     * Returns a Bandwidth whose value is (this + value).
+     *
+     * @param value value to be added to this Frequency
+     * @return this + value
+     */
+    public Bandwidth add(Bandwidth value) {
+        if (value instanceof LongBandwidth) {
+            return Bandwidth.bps(this.bps + ((LongBandwidth) value).bps);
+        }
+        return Bandwidth.bps(this.bps + value.bps());
+    }
+
+    /**
+     * Returns a Bandwidth whose value is (this - value).
+     *
+     * @param value value to be added to this Frequency
+     * @return this - value
+     */
+    public Bandwidth subtract(Bandwidth value) {
+        if (value instanceof LongBandwidth) {
+            return Bandwidth.bps(this.bps - ((LongBandwidth) value).bps);
+        }
+        return Bandwidth.bps(this.bps - value.bps());
+    }
+
+    @Override
+    public int compareTo(Bandwidth other) {
+        if (other instanceof LongBandwidth) {
+            return ComparisonChain.start()
+                    .compare(this.bps, ((LongBandwidth) other).bps)
+                    .result();
+        }
+        return ComparisonChain.start()
+                .compare(this.bps, other.bps())
+                .result();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+
+        if (obj instanceof Bandwidth) {
+            return this.compareTo((Bandwidth) obj) == 0;
+        }
+
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Long.hashCode(bps);
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(this.bps);
+    }
+}
