diff --git a/apps/cpman/api/src/test/java/org/onosproject/cpman/message/ControlMessageEventTest.java b/apps/cpman/api/src/test/java/org/onosproject/cpman/message/ControlMessageEventTest.java
new file mode 100644
index 0000000..c504f5a
--- /dev/null
+++ b/apps/cpman/api/src/test/java/org/onosproject/cpman/message/ControlMessageEventTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.onosproject.cpman.message;
+
+import org.junit.Test;
+import org.onosproject.cpman.ControlMessage;
+import org.onosproject.cpman.DefaultControlMessage;
+import org.onosproject.event.AbstractEventTest;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import static org.onosproject.cpman.ControlMessage.Type.*;
+
+/**
+ * Tests of the control message event.
+ */
+public class ControlMessageEventTest extends AbstractEventTest {
+
+    private ControlMessage createControlMessage(ControlMessage.Type type) {
+        return new DefaultControlMessage(type, 0L, 0L, 0L, 0L);
+    }
+
+    private Collection<ControlMessage> createControlMessages() {
+        Collection<ControlMessage> controlMessages = new ArrayList<>();
+        controlMessages.add(createControlMessage(INBOUND_PACKET));
+        controlMessages.add(createControlMessage(OUTBOUND_PACKET));
+        return controlMessages;
+    }
+
+    @Override
+    @Test
+    public void withoutTime() {
+        Collection<ControlMessage> cms = createControlMessages();
+        long before = System.currentTimeMillis();
+        ControlMessageEvent event =
+                new ControlMessageEvent(ControlMessageEvent.Type.STATS_UPDATE, cms);
+        long after = System.currentTimeMillis();
+        validateEvent(event, ControlMessageEvent.Type.STATS_UPDATE, cms, before, after);
+    }
+}
\ No newline at end of file
diff --git a/apps/cpman/api/src/test/java/org/onosproject/cpman/message/ControlMessageServiceAdaptor.java b/apps/cpman/api/src/test/java/org/onosproject/cpman/message/ControlMessageServiceAdaptor.java
new file mode 100644
index 0000000..23976c4
--- /dev/null
+++ b/apps/cpman/api/src/test/java/org/onosproject/cpman/message/ControlMessageServiceAdaptor.java
@@ -0,0 +1,29 @@
+/*
+ * 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.onosproject.cpman.message;
+
+/**
+ * Test adapter for control message service.
+ */
+public class ControlMessageServiceAdaptor implements ControlMessageService {
+    @Override
+    public void addListener(ControlMessageListener listener) {
+    }
+
+    @Override
+    public void removeListener(ControlMessageListener listener) {
+    }
+}
diff --git a/apps/cpman/api/src/test/java/org/onosproject/cpman/message/DefaultControlMessageTest.java b/apps/cpman/api/src/test/java/org/onosproject/cpman/message/DefaultControlMessageTest.java
new file mode 100644
index 0000000..1bc114f
--- /dev/null
+++ b/apps/cpman/api/src/test/java/org/onosproject/cpman/message/DefaultControlMessageTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.onosproject.cpman.message;
+
+import org.junit.Test;
+import org.onosproject.cpman.DefaultControlMessage;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass;
+import static org.onosproject.cpman.ControlMessage.Type.INBOUND_PACKET;
+
+/**
+ * Unit tests for the default control message class.
+ */
+public class DefaultControlMessageTest {
+
+    /**
+     * Checks that the DefaultControlMessage class is immutable but can be
+     * inherited from.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutableBaseClass(DefaultControlMessage.class);
+    }
+
+    /**
+     * Tests creation of a DefaultControlMessage using a regular constructor.
+     */
+    @Test
+    public void testBasic() {
+        final DefaultControlMessage cm =
+                new DefaultControlMessage(INBOUND_PACKET, 0L, 1L, 2L, 3L);
+        assertThat(cm.type(), is(INBOUND_PACKET));
+        assertThat(cm.load(), is(0L));
+        assertThat(cm.rate(), is(1L));
+        assertThat(cm.count(), is(2L));
+        assertThat(cm.timeStamp(), is(3L));
+    }
+}
