diff --git a/src/test/java/net/floodlightcontroller/util/OFMessageDamperMockSwitch.java b/src/test/java/net/floodlightcontroller/util/OFMessageDamperMockSwitch.java
deleted file mode 100644
index 545753d..0000000
--- a/src/test/java/net/floodlightcontroller/util/OFMessageDamperMockSwitch.java
+++ /dev/null
@@ -1,485 +0,0 @@
-package net.floodlightcontroller.util;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Future;
-
-import net.floodlightcontroller.core.FloodlightContext;
-import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IFloodlightProviderService.Role;
-import net.floodlightcontroller.core.IOFSwitch;
-import net.floodlightcontroller.debugcounter.IDebugCounterService;
-import net.floodlightcontroller.debugcounter.IDebugCounterService.CounterException;
-import net.floodlightcontroller.threadpool.IThreadPoolService;
-
-import org.jboss.netty.channel.Channel;
-import org.projectfloodlight.openflow.protocol.OFActionType;
-import org.projectfloodlight.openflow.protocol.OFCapabilities;
-import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
-import org.projectfloodlight.openflow.protocol.OFFactory;
-import org.projectfloodlight.openflow.protocol.OFMessage;
-import org.projectfloodlight.openflow.protocol.OFPortDesc;
-import org.projectfloodlight.openflow.protocol.OFPortStatus;
-import org.projectfloodlight.openflow.protocol.OFStatsReply;
-import org.projectfloodlight.openflow.protocol.OFStatsRequest;
-import org.projectfloodlight.openflow.protocol.OFVersion;
-import org.projectfloodlight.openflow.types.U64;
-
-/**
- * A mock implementation of IFOSwitch we use for {@link OFMessageDamper}
- * <p/>
- * We need to mock equals() and hashCode() but alas, EasyMock doesn't support
- * this. Sigh. And of course this happens to be the interface with the most
- * methods.
- *
- * @author gregor
- */
-public class OFMessageDamperMockSwitch implements IOFSwitch {
-    OFMessage writtenMessage;
-    FloodlightContext writtenContext;
-
-    public OFMessageDamperMockSwitch() {
-        reset();
-    }
-
-    /* reset this mock. I.e., clear the stored message previously written */
-    public void reset() {
-        writtenMessage = null;
-        writtenContext = null;
-    }
-
-    /* assert that a message was written to this switch and that the
-     * written message and context matches the expected values
-     * @param expected
-     * @param expectedContext
-     */
-    public void assertMessageWasWritten(OFMessage expected,
-            FloodlightContext expectedContext) {
-        assertNotNull("No OFMessage was written", writtenMessage);
-        assertEquals(expected, writtenMessage);
-        assertEquals(expectedContext, writtenContext);
-    }
-
-    /*
-     * assert that no message was written
-     */
-    public void assertNoMessageWritten() {
-        assertNull("OFMessage was written but didn't expect one",
-                writtenMessage);
-        assertNull("There was a context but didn't expect one",
-                writtenContext);
-    }
-
-    /*
-     * use hashCode() and equals() from Object
-     */
-
-    @Override
-    public void write(OFMessage m,
-            FloodlightContext bc) throws IOException {
-        assertNull("write() called but already have message", writtenMessage);
-        assertNull("write() called but already have context", writtenContext);
-        writtenContext = bc;
-        writtenMessage = m;
-
-    }
-
-    @Override
-    public void write(List<OFMessage> msglist,
-            FloodlightContext bc) throws IOException {
-        assertTrue("Unexpected method call", false);
-    }
-
-    // @Override
-    // public void setFeaturesReply(OFFeaturesReply featuresReply) {
-    // assertTrue("Unexpected method call", false);
-    // }
-
-    // @Override
-    // public void setSwitchProperties(OFDescriptionStatistics description) {
-    // assertTrue("Unexpected method call", false);
-    // // TODO Auto-generated method stub
-    // }
-
-    @Override
-    public Collection<OFPortDesc> getEnabledPorts() {
-        assertTrue("Unexpected method call", false);
-        return null;
-    }
-
-    @Override
-    public Collection<Integer> getEnabledPortNumbers() {
-        assertTrue("Unexpected method call", false);
-        return null;
-    }
-
-    // @Override
-    // public OFPhysicalPort getPort(short portNumber) {
-    // assertTrue("Unexpected method call", false);
-    // return null;
-    // }
-
-    @Override
-    public OFPortDesc getPort(String portName) {
-        assertTrue("Unexpected method call", false);
-        return null;
-    }
-
-    // @Override
-    // public void setPort(OFPhysicalPort port) {
-    // assertTrue("Unexpected method call", false);
-    // }
-
-    // @Override
-    // public void deletePort(short portNumber) {
-    // assertTrue("Unexpected method call", false);
-    // }
-
-    // @Override
-    // public void deletePort(String portName) {
-    // assertTrue("Unexpected method call", false);
-    // }
-
-    @Override
-    public Collection<OFPortDesc> getPorts() {
-        assertTrue("Unexpected method call", false);
-        return null;
-    }
-
-    // @Override
-    // public boolean portEnabled(short portName) {
-    // assertTrue("Unexpected method call", false);
-    // return false;
-    // }
-
-    @Override
-    public boolean portEnabled(String portName) {
-        assertTrue("Unexpected method call", false);
-        return false;
-    }
-
-    // @Override
-    // public boolean portEnabled(OFPhysicalPort port) {
-    // assertTrue("Unexpected method call", false);
-    // return false;
-    // }
-
-    @Override
-    public long getId() {
-        assertTrue("Unexpected method call", false);
-        return 0;
-    }
-
-    @Override
-    public String getStringId() {
-        assertTrue("Unexpected method call", false);
-        return null;
-    }
-
-    @Override
-    public Map<Object, Object> getAttributes() {
-        assertTrue("Unexpected method call", false);
-        return null;
-    }
-
-    @Override
-    public Date getConnectedSince() {
-        assertTrue("Unexpected method call", false);
-        return null;
-    }
-
-    @Override
-    public int getNextTransactionId() {
-        assertTrue("Unexpected method call", false);
-        return 0;
-    }
-
-    // @Override
-    // public Future<List<OFStatistics>>
-    // getStatistics(OFStatisticsRequest request) throws IOException {
-    // assertTrue("Unexpected method call", false);
-    // return null;
-    // }
-
-    @Override
-    public boolean isConnected() {
-        assertTrue("Unexpected method call", false);
-        return false;
-    }
-
-    @Override
-    public void setConnected(boolean connected) {
-        assertTrue("Unexpected method call", false);
-    }
-
-    @Override
-    public Role getRole() {
-        assertTrue("Unexpected method call", false);
-        return null;
-    }
-
-    // @Override
-    // public boolean isActive() {
-    // assertTrue("Unexpected method call", false);
-    // return false;
-    // }
-
-    // @Override
-    // public void deliverStatisticsReply(OFMessage reply) {
-    // assertTrue("Unexpected method call", false);
-    // }
-
-    @Override
-    public void cancelStatisticsReply(int transactionId) {
-        assertTrue("Unexpected method call", false);
-    }
-
-    @Override
-    public void cancelAllStatisticsReplies() {
-        assertTrue("Unexpected method call", false);
-    }
-
-    @Override
-    public boolean hasAttribute(String name) {
-        assertTrue("Unexpected method call", false);
-        return false;
-    }
-
-    @Override
-    public Object getAttribute(String name) {
-        assertTrue("Unexpected method call", false);
-        return null;
-    }
-
-    @Override
-    public void setAttribute(String name, Object value) {
-        assertTrue("Unexpected method call", false);
-    }
-
-    @Override
-    public Object removeAttribute(String name) {
-        assertTrue("Unexpected method call", false);
-        return null;
-    }
-
-    @Override
-    public void clearAllFlowMods() {
-        assertTrue("Unexpected method call", false);
-    }
-
-    // @Override
-    // public boolean updateBroadcastCache(Long entry, Short port) {
-    // assertTrue("Unexpected method call", false);
-    // return false;
-    // }
-
-    // @Override
-    // public Map<Short, Long> getPortBroadcastHits() {
-    // assertTrue("Unexpected method call", false);
-    // return null;
-    // }
-
-    // @Override
-    // public void sendStatsQuery(OFStatisticsRequest request, int xid,
-    // IOFMessageListener caller)
-    // throws IOException {
-    // assertTrue("Unexpected method call", false);
-    // }
-
-    @Override
-    public void flush() {
-        assertTrue("Unexpected method call", false);
-    }
-
-    // @Override
-    // public void deliverOFFeaturesReply(OFMessage reply) {
-    // // TODO Auto-generated method stub
-    //
-    // }
-
-    @Override
-    public void cancelFeaturesReply(int transactionId) {
-        // TODO Auto-generated method stub
-
-    }
-
-    // @Override
-    // public int getBuffers() {
-    // // TODO Auto-generated method stub
-    // return 0;
-    // }
-
-    @Override
-    public Set<OFActionType> getActions() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Set<OFCapabilities> getCapabilities() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    // @Override
-    // public byte getTables() {
-    // // TODO Auto-generated method stub
-    // return 0;
-    // }
-
-    @Override
-    public void disconnectSwitch() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void setChannel(Channel channel) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public int getNumBuffers() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public byte getNumTables() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public OFDescStatsReply getSwitchDescription() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void setOFVersion(OFVersion ofv) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public OFVersion getOFVersion() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public OFPortDesc getPort(int portNumber) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public OrderedCollection<PortChangeEvent> processOFPortStatus(OFPortStatus ps) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean portEnabled(int portName) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public OrderedCollection<PortChangeEvent> comparePorts(Collection<OFPortDesc> ports) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public OrderedCollection<PortChangeEvent> setPorts(Collection<OFPortDesc> ports) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void deliverStatisticsReply(OFMessage reply) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public Future<List<OFStatsReply>> getStatistics(OFStatsRequest<?> request)
-            throws IOException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void setRole(Role role) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public U64 getNextGenerationId() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void setFloodlightProvider(IFloodlightProviderService controller) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void setThreadPoolService(IThreadPoolService threadPool) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void setDebugCounterService(IDebugCounterService debugCounter)
-            throws CounterException {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void startDriverHandshake() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public boolean isDriverHandshakeComplete() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public void processDriverHandshakeMessage(OFMessage m) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void setTableFull(boolean isFull) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public OFFactory getFactory() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/java/net/floodlightcontroller/util/OFMessageDamperTest10.java b/src/test/java/net/floodlightcontroller/util/OFMessageDamperTest10.java
deleted file mode 100644
index 97c8509..0000000
--- a/src/test/java/net/floodlightcontroller/util/OFMessageDamperTest10.java
+++ /dev/null
@@ -1,143 +0,0 @@
-package net.floodlightcontroller.util;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.util.EnumSet;
-
-import net.floodlightcontroller.core.FloodlightContext;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.projectfloodlight.openflow.protocol.OFFactories;
-import org.projectfloodlight.openflow.protocol.OFFactory;
-import org.projectfloodlight.openflow.protocol.OFType;
-import org.projectfloodlight.openflow.protocol.OFEchoRequest;
-import org.projectfloodlight.openflow.protocol.OFHello;
-import org.projectfloodlight.openflow.protocol.OFMessage;
-import org.projectfloodlight.openflow.protocol.OFVersion;
-
-public class OFMessageDamperTest10 {
-
-    /*
-        OFFactory factory10 = OFFactories.getFactory(OFVersion.OF_10);
-        OFMessageDamper damper;
-        FloodlightContext cntx;
-
-        OFMessageDamperMockSwitch sw1;
-        OFMessageDamperMockSwitch sw2;
-
-        OFEchoRequest echoRequst1;
-        OFEchoRequest echoRequst1Clone;
-        OFEchoRequest echoRequst2;
-        OFHello hello1;
-        OFHello hello2;
-
-        @Before
-        public void setUp() throws IOException {
-            cntx = new FloodlightContext();
-
-            sw1 = new OFMessageDamperMockSwitch();
-            sw2 = new OFMessageDamperMockSwitch();
-
-            echoRequst1 = factory10.buildEchoRequest()
-                    .setData(new byte[] {1}).build();
-            echoRequst1Clone = factory10.buildEchoRequest()
-                    .setData(new byte[] {1}).build();
-            echoRequst2 = factory10.buildEchoRequest()
-                    .setData(new byte[] {2}).build();
-
-            hello1 = factory10.buildHello()
-                    .setXid(1).build();
-            hello2 = factory10.buildHello()
-                    .setXid(2).build();
-
-        }
-
-        protected void doWrite(boolean expectWrite,
-                OFMessageDamperMockSwitch sw,
-                OFMessage msg,
-                FloodlightContext cntx) throws IOException {
-
-            boolean result;
-            sw.reset();
-            result = damper.write(sw, msg, cntx);
-
-            if (expectWrite) {
-                assertEquals(true, result);
-                sw.assertMessageWasWritten(msg, cntx);
-            } else {
-                assertEquals(false, result);
-                sw.assertNoMessageWritten();
-            }
-        }
-
-        @Test
-        public void testOneMessageType() throws IOException, InterruptedException {
-            int timeout = 50;
-            int sleepTime = 60;
-            damper = new OFMe ssageDamper(100,
-                    EnumSet.of(OFType.ECHO_REQUEST),
-                    timeout);
-
-            // echo requests should be dampened
-            doWrite(true, sw1, echoRequst1, cntx);
-            doWrite(false, sw1, echoRequst1, cntx);
-            doWrite(false, sw1, echoRequst1Clone, cntx);
-            doWrite(true, sw1, echoRequst2, cntx);
-            doWrite(false, sw1, echoRequst2, cntx);
-
-            // we don't dampen hellos. All should succeed
-            doWrite(true, sw1, hello1, cntx);
-            doWrite(true, sw1, hello1, cntx);
-            doWrite(true, sw1, hello1, cntx);
-
-            // echo request should also be dampened on sw2
-            doWrite(true, sw2, echoRequst1, cntx);
-            doWrite(false, sw2, echoRequst1, cntx);
-            doWrite(true, sw2, echoRequst2, cntx);
-
-            Thread.sleep(sleepTime);
-            doWrite(true, sw1, echoRequst1, cntx);
-            doWrite(true, sw2, echoRequst1, cntx);
-
-        }
-
-        @Test
-        public void testTwoMessageTypes() throws IOException, InterruptedException {
-            int timeout = 50;
-            int sleepTime = 60;
-            damper = new OFMessageDamper(100,
-                    EnumSet.of(OFType.ECHO_REQUEST,
-                            OFType.HELLO),
-                    timeout);
-
-            // echo requests should be dampened
-            doWrite(true, sw1, echoRequst1, cntx);
-            doWrite(false, sw1, echoRequst1, cntx);
-            doWrite(false, sw1, echoRequst1Clone, cntx);
-            doWrite(true, sw1, echoRequst2, cntx);
-            doWrite(false, sw1, echoRequst2, cntx);
-
-            // hello should be dampened as well
-            doWrite(true, sw1, hello1, cntx);
-            doWrite(false, sw1, hello1, cntx);
-            doWrite(false, sw1, hello1, cntx);
-
-            doWrite(true, sw1, hello2, cntx);
-            doWrite(false, sw1, hello2, cntx);
-            doWrite(false, sw1, hello2, cntx);
-
-            // echo request should also be dampened on sw2
-            doWrite(true, sw2, echoRequst1, cntx);
-            doWrite(false, sw2, echoRequst1, cntx);
-            doWrite(true, sw2, echoRequst2, cntx);
-
-            Thread.sleep(sleepTime);
-            doWrite(true, sw1, echoRequst1, cntx);
-            doWrite(true, sw2, echoRequst1, cntx);
-            doWrite(true, sw1, hello1, cntx);
-            doWrite(true, sw1, hello2, cntx);
-        }
-    */
-}
diff --git a/src/test/java/net/floodlightcontroller/util/TimedCacheTest.java b/src/test/java/net/floodlightcontroller/util/TimedCacheTest.java
deleted file mode 100644
index 331e0e6..0000000
--- a/src/test/java/net/floodlightcontroller/util/TimedCacheTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package net.floodlightcontroller.util;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class TimedCacheTest {
-    public static class CacheEntry {
-        public int key;
-
-        public CacheEntry(int key) {
-            this.key = key;
-        }
-
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + key;
-            return result;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj)
-                return true;
-            if (obj == null)
-                return false;
-            if (getClass() != obj.getClass())
-                return false;
-            CacheEntry other = (CacheEntry) obj;
-            if (key != other.key)
-                return false;
-            return true;
-        }
-    }
-
-    protected TimedCache<CacheEntry> cache;
-
-    @Before
-    public void setUp() {
-        // 
-    }
-
-
-    @Test
-    public void testCaching() throws InterruptedException {
-        int timeout = 50;
-        int timeToSleep = 60;
-        cache = new TimedCache<TimedCacheTest.CacheEntry>(100, timeout);
-
-        CacheEntry e1a = new CacheEntry(1);
-        CacheEntry e1b = new CacheEntry(1);
-        CacheEntry e1c = new CacheEntry(1);
-        CacheEntry e2 = new CacheEntry(2);
-
-        assertEquals(false, cache.update(e1a));
-        assertEquals(true, cache.update(e1a));
-        assertEquals(true, cache.update(e1b));
-        assertEquals(true, cache.update(e1c));
-        assertEquals(false, cache.update(e2));
-        assertEquals(true, cache.update(e2));
-
-        Thread.sleep(timeToSleep);
-        assertEquals(false, cache.update(e1a));
-        assertEquals(false, cache.update(e2));
-    }
-
-    @Test
-    public void testCapacity() throws InterruptedException {
-        int timeout = 5000;
-        cache = new TimedCache<TimedCacheTest.CacheEntry>(2, timeout);
-
-        // Testing the capacity is tricky since the capacity can be 
-        // exceeded for short amounts of time, so we try to flood the cache
-        // to make sure the first entry is expired
-        CacheEntry e1 = new CacheEntry(1);
-        for (int i = 0; i < 100; i++) {
-            CacheEntry e = new CacheEntry(i);
-            cache.update(e);
-        }
-
-        // entry 1 should have been expired due to capacity limits 
-        assertEquals(false, cache.update(e1));
-    }
-
-
-}
diff --git a/src/test/java/net/onrc/onos/core/flowprogrammer/FlowPusherTest.java b/src/test/java/net/onrc/onos/core/flowprogrammer/FlowPusherTest.java
index 28b445c..ab11188 100644
--- a/src/test/java/net/onrc/onos/core/flowprogrammer/FlowPusherTest.java
+++ b/src/test/java/net/onrc/onos/core/flowprogrammer/FlowPusherTest.java
@@ -52,7 +52,7 @@
     private OFFactory factory10 = OFFactories.getFactory(OFVersion.OF_10);
 
     /**
-     * Test single OFMessage is correctly sent to single switch via MessageDamper.
+     * Test single OFMessage is correctly sent to single switch.
      */
     @Test
     public void testAddMessage() {
@@ -95,7 +95,7 @@
     }
 
     /**
-     * Test bunch of OFMessages are correctly sent to single switch via MessageDamper.
+     * Test bunch of OFMessages are correctly sent to single switch.
      */
     @Test
     public void testMassiveAddMessage() {
