diff --git a/utils/misc/src/test/java/org/onlab/util/FrequencyTest.java b/utils/misc/src/test/java/org/onlab/util/FrequencyTest.java
new file mode 100644
index 0000000..2c78f74
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/util/FrequencyTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2015 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.testing.EqualsTester;
+import org.junit.Test;
+import org.onlab.junit.ImmutableClassChecker;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+public class FrequencyTest {
+
+    private final Frequency frequency1 = Frequency.ofMHz(1000);
+    private final Frequency sameFrequency1 = Frequency.ofMHz(1000);
+    private final Frequency frequency2 = Frequency.ofGHz(1000);
+    private final Frequency sameFrequency2 = Frequency.ofGHz(1000);
+    private final Frequency moreSameFrequency2 = Frequency.ofTHz(1);
+    private final Frequency frequency3 = Frequency.ofTHz(193.1);
+    private final Frequency sameFrequency3 = Frequency.ofGHz(193100);
+
+    /**
+     * Tests immutability of Frequency.
+     */
+    @Test
+    public void testImmutability() {
+        ImmutableClassChecker.assertThatClassIsImmutable(Frequency.class);
+    }
+
+    /**
+     * Tests equality of Frequency instances.
+     */
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(frequency1, sameFrequency1)
+                .addEqualityGroup(frequency2, sameFrequency2, moreSameFrequency2)
+                .addEqualityGroup(frequency3, sameFrequency3)
+                .testEquals();
+    }
+
+    /**
+     * Tests add operation of two Frequencies.
+     */
+    @Test
+    public void testAdd() {
+        Frequency low = Frequency.ofMHz(100);
+        Frequency high = Frequency.ofGHz(1);
+        Frequency expected = Frequency.ofMHz(1100);
+
+        assertThat(low.add(high), is(expected));
+    }
+
+    /**
+     * Tests subtract operation of two Frequencies.
+     */
+    @Test
+    public void testSubtract() {
+        Frequency high = Frequency.ofGHz(1);
+        Frequency low = Frequency.ofMHz(100);
+        Frequency expected = Frequency.ofMHz(900);
+
+        assertThat(high.subtract(low), is(expected));
+    }
+
+    /**
+     * Tests multiply operation of Frequency.
+     */
+    @Test
+    public void testMultiply() {
+        Frequency frequency = Frequency.ofMHz(1000);
+        long factor = 5;
+        Frequency expected = Frequency.ofGHz(5);
+
+        assertThat(frequency.multiply(5), is(expected));
+    }
+}
