diff --git a/app/src/test/java/org/opencord/aaa/impl/AaaManagerTest.java b/app/src/test/java/org/opencord/aaa/impl/AaaManagerTest.java
index 83d5c42..394f86d 100644
--- a/app/src/test/java/org/opencord/aaa/impl/AaaManagerTest.java
+++ b/app/src/test/java/org/opencord/aaa/impl/AaaManagerTest.java
@@ -18,6 +18,8 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.onlab.junit.TestUtils;
 import org.onlab.packet.BasePacket;
 import org.onlab.packet.DeserializationException;
@@ -58,8 +60,15 @@
 /**
  * Set of tests of the ONOS application component.
  */
+@RunWith(Parameterized.class)
 public class AaaManagerTest extends AaaTestBase {
 
+    // Change this to have more run with mvn
+    @Parameterized.Parameters
+    public static Object[][] data() {
+        return new Object[1][0];
+    }
+
     static final String BAD_IP_ADDRESS = "198.51.100.0";
 
     private final Logger log = getLogger(getClass());
diff --git a/app/src/test/java/org/opencord/aaa/impl/AaaStatisticsTest.java b/app/src/test/java/org/opencord/aaa/impl/AaaStatisticsTest.java
index 4ace459..bd68bfb 100644
--- a/app/src/test/java/org/opencord/aaa/impl/AaaStatisticsTest.java
+++ b/app/src/test/java/org/opencord/aaa/impl/AaaStatisticsTest.java
@@ -18,6 +18,8 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.onlab.junit.TestUtils;
 import org.onlab.packet.BasePacket;
 import org.onlab.packet.DeserializationException;
@@ -62,8 +64,15 @@
 /**
  * Set of tests of the ONOS application component for AAA Statistics.
  */
+@RunWith(Parameterized.class)
 public class AaaStatisticsTest extends AaaTestBase {
 
+    // Change this to have more run with mvn
+    @Parameterized.Parameters
+    public static Object[][] data() {
+        return new Object[1][0];
+    }
+
     static final String BAD_IP_ADDRESS = "198.51.100.0";
     static final Long ZERO = (long) 0;
 
diff --git a/app/src/test/java/org/opencord/aaa/impl/IdentifierManagerTest.java b/app/src/test/java/org/opencord/aaa/impl/IdentifierManagerTest.java
index 890f2c6..afc5ec2 100644
--- a/app/src/test/java/org/opencord/aaa/impl/IdentifierManagerTest.java
+++ b/app/src/test/java/org/opencord/aaa/impl/IdentifierManagerTest.java
@@ -19,19 +19,38 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.slf4j.Logger;
 
-import static org.junit.Assert.assertNotEquals;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import static org.junit.Assert.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
+@RunWith(Parameterized.class)
 public class IdentifierManagerTest {
 
+    // Change this to have more run with mvn
+    @Parameterized.Parameters
+    public static Object[][] data() {
+        return new Object[1][0];
+    }
+
     IdentifierManager idManager = null;
     private final Logger log = getLogger(getClass());
 
     @Before
     public void setUp() {
         System.out.print("Set up");
+        idManager.timeout = 1500;
+        idManager.pruningInterval = 1;
+        idManager.pollTimeout = 1;
         idManager = new IdentifierManager();
     }
 
@@ -54,4 +73,84 @@
             idManager.releaseIdentifier(id);
         }
     }
+
+    @Test(timeout = 3800)
+    public void testIdRelease() {
+        assertEquals(254, idManager.getAvailableIdentifiers());
+        for (int i = 0; i <= 253; i++) {
+            idManager.getNewIdentifier(Integer.toString(i));
+        }
+
+        assertEquals(0, idManager.getAvailableIdentifiers());
+
+        try {
+            TimeUnit.MILLISECONDS.sleep(3500);
+        } catch (InterruptedException e) {
+            log.error("Can't sleep");
+        }
+
+        // check that the queue has been emptied after the timeout occurred
+        assertEquals(254, idManager.getAvailableIdentifiers());
+
+        // check that I can get a new ID immediately (note the timeout in the test declaration)
+        idManager.getNewIdentifier(Integer.toString(254));
+    }
+
+    @Test(timeout = 5000)
+    public void unavailableIds() {
+
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+
+        Callable<Object> acquireId = () -> idManager.getNewIdentifier(Integer.toString(2));
+
+        // fill the queue
+        for (int i = 2; i <= 255; i++) {
+            idManager.getNewIdentifier(Integer.toString(i));
+        }
+
+        // try to acquire an id
+        Future<Object> futureAcquire = executor.submit(acquireId);
+
+        // wait for the threads to complete
+        RequestIdentifier id = null;
+        try {
+            id = (RequestIdentifier) futureAcquire.get();
+
+            // if we can't get the ID within 2
+            // seconds we'll drop the packet and we'll retry
+            assertNull(id);
+        } catch (InterruptedException | ExecutionException ex) {
+            log.error("Something failed");
+            assertNull(id);
+        }
+    }
+
+    @Test(timeout = 5000)
+    public void availableIds() {
+
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+
+        Callable<Object> acquireId = () -> idManager.getNewIdentifier(Integer.toString(2));
+
+        // fill the queue
+        for (int i = 2; i <= 255; i++) {
+            idManager.getNewIdentifier(Integer.toString(i));
+        }
+
+        // try to release an id
+        final RequestIdentifier id = new RequestIdentifier((byte) 2);
+        executor.submit(() -> idManager.releaseIdentifier(id));
+        // try to acquire an id
+        Future<Object> futureAcquire = executor.submit(acquireId);
+
+        // wait for the threads to complete
+        RequestIdentifier idGet = null;
+        try {
+            idGet = (RequestIdentifier) futureAcquire.get();
+            assertNotNull(idGet);
+        } catch (InterruptedException | ExecutionException ex) {
+            log.error("Something failed");
+            assertNull(idGet);
+        }
+    }
 }
diff --git a/app/src/test/java/org/opencord/aaa/impl/StateMachineTest.java b/app/src/test/java/org/opencord/aaa/impl/StateMachineTest.java
index e66a5f3..7415e2b 100644
--- a/app/src/test/java/org/opencord/aaa/impl/StateMachineTest.java
+++ b/app/src/test/java/org/opencord/aaa/impl/StateMachineTest.java
@@ -19,12 +19,22 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
 import java.util.concurrent.Executors;
 
 import static org.junit.Assert.assertEquals;
 
+@RunWith(Parameterized.class)
 public class StateMachineTest {
+
+    // Change this to have more run with mvn
+    @Parameterized.Parameters
+    public static Object[][] data() {
+        return new Object[1][0];
+    }
+
     StateMachine stateMachine = null;
 
     @Before
