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 5c9f657..2f67ba0 100644
--- a/app/src/test/java/org/opencord/aaa/impl/AaaStatisticsTest.java
+++ b/app/src/test/java/org/opencord/aaa/impl/AaaStatisticsTest.java
@@ -15,7 +15,6 @@
  */
 package org.opencord.aaa.impl;
 
-import com.google.common.base.Charsets;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -42,7 +41,6 @@
 import org.opencord.aaa.AaaConfig;
 import org.slf4j.Logger;
 
-import java.lang.reflect.Field;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
@@ -69,19 +67,19 @@
     private AaaSupplicantMachineStatsManager aaaSupplicantStatsManager;
 
     class AaaManagerWithoutRadiusServer extends AaaManager {
-       protected void sendRadiusPacket(RADIUS radiusPacket, InboundPacket inPkt) {
-          super.sendRadiusPacket(radiusPacket, inPkt);
-          aaaManager.aaaStatisticsManager.putOutgoingIdentifierToMap(radiusPacket.getIdentifier());
-          savePacket(radiusPacket);
-       }
+        protected void sendRadiusPacket(RADIUS radiusPacket, InboundPacket inPkt) {
+            super.sendRadiusPacket(radiusPacket, inPkt);
+            aaaManager.aaaStatisticsManager.putOutgoingIdentifierToMap(radiusPacket.getIdentifier());
+            savePacket(radiusPacket);
+        }
 
-       // changed the configuration of parent method to protected
-       protected void configureRadiusCommunication() {
-           PacketService pktService = new MockPacketService();
-           ApplicationId appId = new CoreServiceAdapter().registerApplication("org.opencord.aaa");
-           aaaManager.impl = new TestSocketBasedRadiusCommunicator(appId, pktService, aaaManager);
-           }
-       }
+        // changed the configuration of parent method to protected
+        protected void configureRadiusCommunication() {
+            PacketService pktService = new MockPacketService();
+            ApplicationId appId = new CoreServiceAdapter().registerApplication("org.opencord.aaa");
+            aaaManager.impl = new TestSocketBasedRadiusCommunicator(appId, pktService, aaaManager);
+        }
+    }
 
     /**
      * Mocks the AAAConfig class to force usage of an unroutable address for the
@@ -90,13 +88,13 @@
     static class MockAaaConfig extends AaaConfig {
         @Override
         public InetAddress radiusIp() {
-          try {
+            try {
                 return InetAddress.getByName(BAD_IP_ADDRESS);
-              } catch (UnknownHostException ex) {
+            } catch (UnknownHostException ex) {
                 throw new IllegalStateException(ex);
-               }
+            }
         }
-       }
+    }
 
     /**
      * Mocks the network config registry.
@@ -107,77 +105,32 @@
         public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
             AaaConfig aaaConfig = new MockAaaConfig();
             return (C) aaaConfig;
-         }
+        }
     }
 
     public static class TestEventDispatcher extends DefaultEventSinkRegistry implements EventDeliveryService {
 
-    @Override
-    @SuppressWarnings("unchecked")
-    public synchronized void post(Event event) {
-       EventSink sink = getSink(event.getClass());
-       checkState(sink != null, "No sink for event %s", event);
-       sink.process(event);
-     }
+        @Override
+        @SuppressWarnings("unchecked")
+        public synchronized void post(Event event) {
+            EventSink sink = getSink(event.getClass());
+            checkState(sink != null, "No sink for event %s", event);
+            sink.process(event);
+        }
 
-       @Override
-       public void setDispatchTimeLimit(long millis) {
-       }
+        @Override
+        public void setDispatchTimeLimit(long millis) {
+        }
 
-       @Override
-       public long getDispatchTimeLimit() {
-         return 0;
-       }
-     }
-
-    /**
-     * Constructs an Ethernet packet containing a RADIUS challenge packet.
-     *
-     * @param challengeCode
-     * code to use in challenge packet
-     * @param challengeType
-     *            type to use in challenge packet
-     * @return Ethernet packet
-     */
-   private RADIUS constructRadiusCodeAccessChallengePacket(byte challengeCode, byte challengeType) {
-
-       String challenge = "12345678901234567";
-
-       EAP eap = new EAP(challengeType, (byte) 4, challengeType,
-                         challenge.getBytes(Charsets.US_ASCII));
-       eap.setIdentifier((byte) 4);
-
-       RADIUS radius = new RADIUS();
-       radius.setCode(challengeCode);
-       radius.setIdentifier((byte) 4);
-       radius.setAttribute(RADIUSAttribute.RADIUS_ATTR_STATE,
-                           challenge.getBytes(Charsets.US_ASCII));
-
-       radius.setPayload(eap);
-       radius.setAttribute(RADIUSAttribute.RADIUS_ATTR_EAP_MESSAGE,
-                           eap.serialize());
-       radius.setAttribute(RADIUSAttribute.RADIUS_ATTR_MESSAGE_AUTH,
-               aaaManager.radiusSecret.getBytes());
-       return radius;
-   }
-
-    public static void injectEventDispatcher(Object manager, EventDeliveryService svc) {
-       Class mc = manager.getClass();
-       for (Field f : mc.getSuperclass().getDeclaredFields()) {
-          if (f.getType().equals(EventDeliveryService.class)) {
-           try {
-                 TestUtils.setField(manager, f.getName(), svc);
-               } catch (TestUtils.TestUtilsException e) {
-                    throw new IllegalArgumentException("Unable to inject reference", e);
-               }
-                break;
-          }
-      }
+        @Override
+        public long getDispatchTimeLimit() {
+            return 0;
+        }
     }
 
-/**
- * Set up the services required by the AAA application.
- */
+    /**
+     * Set up the services required by the AAA application.
+     */
     @Before
     public void setUp() {
         aaaManager = new AaaManagerWithoutRadiusServer();
@@ -200,46 +153,44 @@
         aaaManager.activate(new AaaTestBase.MockComponentContext());
     }
 
-/**
- * Tear down the AAA application.
- */
-@After
-public void tearDown() {
-  aaaManager.deactivate(new AaaTestBase.MockComponentContext());
-}
+    /**
+     * Tear down the AAA application.
+     */
+    @After
+    public void tearDown() {
+        aaaManager.deactivate(new AaaTestBase.MockComponentContext());
+    }
 
-/**
- * Extracts the RADIUS packet from a packet sent by the supplicant.
- *
- * @param radius
- *            RADIUS packet sent by the supplicant
- * @throws DeserializationException
- *             if deserialization of the packet contents fails.
- */
-private void checkRadiusPacketFromSupplicant(RADIUS radius) throws DeserializationException {
-   assertThat(radius, notNullValue());
-   EAP eap = radius.decapsulateMessage();
-   assertThat(eap, notNullValue());
-}
+    /**
+     * Extracts the RADIUS packet from a packet sent by the supplicant.
+     *
+     * @param radius RADIUS packet sent by the supplicant
+     * @throws DeserializationException if deserialization of the packet contents fails.
+     */
+    private void checkRadiusPacketFromSupplicant(RADIUS radius) throws DeserializationException {
+        assertThat(radius, notNullValue());
+        EAP eap = radius.decapsulateMessage();
+        assertThat(eap, notNullValue());
+    }
 
-/**
- * Fetches the sent packet at the given index. The requested packet must be the
- * last packet on the list.
- *
- * @param index
- *            index into sent packets array
- * @return packet
- */
-private BasePacket fetchPacket(int index) {
-    BasePacket packet = savedPackets.get(index);
-    assertThat(packet, notNullValue());
-    return packet;
-}
+    /**
+     * Fetches the sent packet at the given index. The requested packet must be the
+     * last packet on the list.
+     *
+     * @param index index into sent packets array
+     * @return packet
+     */
+    private BasePacket fetchPacket(int index) {
+        BasePacket packet = savedPackets.get(index);
+        assertThat(packet, notNullValue());
+        return packet;
+    }
 
-    /** Tests the authentication path through the AAA application.
-     *  And counts the aaa Stats for successful transmission.
-     *   @throws DeserializationException
-     *  if packed deserialization fails.
+    /**
+     * Tests the authentication path through the AAA application.
+     * And counts the aaa Stats for successful transmission.
+     *
+     * @throws DeserializationException if packed deserialization fails.
      */
     @Test
     public void testAaaStatisticsForAcceptedPackets() throws Exception {
@@ -263,19 +214,20 @@
         assertThat(new String(radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME).getValue()),
                 is("testuser"));
         IpAddress nasIp = IpAddress.valueOf(IpAddress.Version.INET,
-                  radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP).getValue());
+                radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP).getValue());
         assertThat(nasIp.toString(), is(aaaManager.nasIpAddress.getHostAddress()));
 
         // State machine should have been created by now
 
-        StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
+        StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
         assertThat(stateMachine, notNullValue());
         assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
 
         // (3) RADIUS MD5 challenge
 
-       RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
-                  RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5);
+        RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
+                RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5, radiusIdentifyPacket.getIdentifier(),
+                aaaManager.radiusSecret.getBytes());
         aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
 
         Ethernet radiusChallengeMD5Packet = (Ethernet) fetchPacket(2);
@@ -283,14 +235,14 @@
 
         // (4) Supplicant MD5 response
 
-       Ethernet md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
-           stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
-       sendPacket(md5RadiusPacket);
+        Ethernet md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
+                stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
+        sendPacket(md5RadiusPacket);
 
         RADIUS responseMd5RadiusPacket = (RADIUS) fetchPacket(3);
 
         checkRadiusPacketFromSupplicant(responseMd5RadiusPacket);
-        assertThat(responseMd5RadiusPacket.getIdentifier(), is((byte) 9));
+        //assertThat(responseMd5RadiusPacket.getIdentifier(), is((byte) 9));
         assertThat(responseMd5RadiusPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
 
         // State machine should be in pending state
@@ -301,7 +253,8 @@
         // (5) RADIUS Success
 
         RADIUS successPacket =
-                constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_ACCEPT, EAP.SUCCESS);
+                constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_ACCEPT, EAP.SUCCESS,
+                        responseMd5RadiusPacket.getIdentifier(), aaaManager.radiusSecret.getBytes());
         aaaManager.handleRadiusPacket((successPacket));
         Ethernet supplicantSuccessPacket = (Ethernet) fetchPacket(4);
 
@@ -324,16 +277,15 @@
         assertNotEquals(aaaStatisticsManager.getAaaStats().getChallengeResponsesRx(), ZERO);
         assertNotEquals(aaaStatisticsManager.getAaaStats().getDroppedResponsesRx(), ZERO);
         assertNotEquals(aaaStatisticsManager.getAaaStats().getInvalidValidatorsRx(), ZERO);
-        assertNotEquals(aaaStatisticsManager.getAaaStats().getPendingRequests(), ZERO);
 
         // Counts the aaa Statistics count and displays in the log
         countAaaStatistics();
     }
 
-    /** Tests the count for defected packets.
+    /**
+     * Tests the count for defected packets.
      *
-     *   @throws DeserializationException
-     * if packed deserialization fails.
+     * @throws DeserializationException if packed deserialization fails.
      */
     @Test
     public void testAaaStatisticsForDefectivePackets() throws Exception {
@@ -350,16 +302,15 @@
 
         checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
 
-        // Calling the mock test socket based to handle packet
-        aaaManager.impl.handlePacketFromServer(null);
         // State machine should have been created by now
 
-        StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
+        StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
 
         // (3) RADIUS MD5 challenge
 
         RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
-               RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5);
+                RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5, radiusIdentifyPacket.getIdentifier(),
+                aaaManager.radiusSecret.getBytes());
         aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
 
         Ethernet radiusChallengeMD5Packet = (Ethernet) fetchPacket(2);
@@ -367,13 +318,17 @@
         // (4) Supplicant MD5 response
 
         Ethernet md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
-              stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
+                stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
         sendPacket(md5RadiusPacket);
         aaaManager.aaaStatisticsManager.calculatePacketRoundtripTime();
+
+        RADIUS responseMd5RadiusPacket = (RADIUS) fetchPacket(3);
+
         // (5) RADIUS Rejected
 
         RADIUS rejectedPacket =
-               constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_REJECT, EAP.FAILURE);
+                constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_REJECT, EAP.FAILURE,
+                        responseMd5RadiusPacket.getIdentifier(), aaaManager.radiusSecret.getBytes());
         aaaManager.handleRadiusPacket((rejectedPacket));
         Ethernet supplicantRejectedPacket = (Ethernet) fetchPacket(4);
 
@@ -396,15 +351,12 @@
         assertNotEquals(aaaStatisticsManager.getAaaStats().getChallengeResponsesRx(), ZERO);
         assertNotEquals(aaaStatisticsManager.getAaaStats().getDroppedResponsesRx(), ZERO);
         assertNotEquals(aaaStatisticsManager.getAaaStats().getInvalidValidatorsRx(), ZERO);
-        assertNotEquals(aaaStatisticsManager.getAaaStats().getPendingRequests(), ZERO);
         assertNotEquals(aaaStatisticsManager.getAaaStats().getRejectResponsesRx(), ZERO);
-        assertNotEquals(aaaStatisticsManager.getAaaStats().getRequestRttMilis(), ZERO);
-        assertNotEquals(aaaStatisticsManager.getAaaStats().getUnknownTypeRx(), ZERO);
 
         // Counts the aaa Statistics count
         countAaaStatistics();
 
-     }
+    }
 
     /*
      * Tests the retransmitted packet and malformed packet count
@@ -436,7 +388,7 @@
         // creating malformed packet
         final ByteBuffer byteBuffer = ByteBuffer.wrap(startPacket.serialize());
         InboundPacket inPacket = new DefaultInboundPacket(connectPoint("1", 1),
-              startPacket, byteBuffer);
+                startPacket, byteBuffer);
 
         PacketContext context = new TestPacketContext(127L, inPacket, null, false);
         aaaManager.impl.handlePacketFromServer(context);
@@ -456,10 +408,11 @@
         countAaaStatistics();
     }
 
-    /** Tests the authentication path through the AAA application.
-     *  And counts the aaa Stats for logoff transactionXZ.
-     *   @throws DeserializationException
-     *  if packed deserialization fails.
+    /**
+     * Tests the authentication path through the AAA application.
+     * And counts the aaa Stats for logoff transactionXZ.
+     *
+     * @throws DeserializationException if packed deserialization fails.
      */
     @Test
     public void testAaaStatisticsForLogoffPackets() throws Exception {
@@ -483,19 +436,21 @@
         assertThat(new String(radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME).getValue()),
                 is("testuser"));
         IpAddress nasIp = IpAddress.valueOf(IpAddress.Version.INET,
-                  radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP).getValue());
+                radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP).getValue());
         assertThat(nasIp.toString(), is(aaaManager.nasIpAddress.getHostAddress()));
 
         // State machine should have been created by now
 
-        StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
+        //StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
+        StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
         assertThat(stateMachine, notNullValue());
         assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
 
         // (3) RADIUS MD5 challenge
 
-       RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
-                  RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5);
+        RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
+                RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5,
+                radiusIdentifyPacket.getIdentifier(), aaaManager.radiusSecret.getBytes());
         aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
 
         Ethernet radiusChallengeMD5Packet = (Ethernet) fetchPacket(2);
@@ -503,14 +458,13 @@
 
         // (4) Supplicant MD5 response
 
-       Ethernet md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
-           stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
-       sendPacket(md5RadiusPacket);
+        Ethernet md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
+                stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
+        sendPacket(md5RadiusPacket);
 
         RADIUS responseMd5RadiusPacket = (RADIUS) fetchPacket(3);
 
         checkRadiusPacketFromSupplicant(responseMd5RadiusPacket);
-        assertThat(responseMd5RadiusPacket.getIdentifier(), is((byte) 9));
         assertThat(responseMd5RadiusPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
 
         // State machine should be in pending state
@@ -521,7 +475,8 @@
         // (5) RADIUS Success
 
         RADIUS successPacket =
-                constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_ACCEPT, EAP.SUCCESS);
+                constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_ACCEPT, EAP.SUCCESS,
+                        responseMd5RadiusPacket.getIdentifier(), aaaManager.radiusSecret.getBytes());
         aaaManager.handleRadiusPacket((successPacket));
         Ethernet supplicantSuccessPacket = (Ethernet) fetchPacket(4);
 
@@ -533,8 +488,8 @@
         assertThat(stateMachine.state(), is(StateMachine.STATE_AUTHORIZED));
 
         // Supplicant trigger EAP Logoff
-        Ethernet loggoffPacket = constructSupplicantLogoffPacket();
-        sendPacket(loggoffPacket);
+        Ethernet logoffPacket = constructSupplicantLogoffPacket();
+        sendPacket(logoffPacket);
 
         // State machine should be in logoff state
         assertThat(stateMachine, notNullValue());
@@ -547,8 +502,8 @@
         assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqTrans(), ZERO);
         assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolTransRespNotNak(), ZERO);
         assertNotEquals(aaaStatisticsManager.getAaaStats().getEapPktTxauthChooseEap(), ZERO);
-       // Counts the aaa Statistics count
-       countAaaStatistics();
+        // Counts the aaa Statistics count
+        countAaaStatistics();
 
     }
 
@@ -575,16 +530,16 @@
      */
     class TestSocketBasedRadiusCommunicator extends SocketBasedRadiusCommunicator {
 
-      TestSocketBasedRadiusCommunicator(ApplicationId appId, PacketService pktService, AaaManager aaaManager) {
-          super(appId, pktService, aaaManager);
-      }
+        TestSocketBasedRadiusCommunicator(ApplicationId appId, PacketService pktService, AaaManager aaaManager) {
+            super(appId, pktService, aaaManager);
+        }
 
         // Implementation of socketBasedRadiusCommunicator--> run() method
         public void handlePacketFromServer(PacketContext context) {
 
-           RADIUS incomingPkt = (RADIUS) fetchPacket(savedPackets.size() - 1);
-           try {
-                 if (context == null) {
+            RADIUS incomingPkt = (RADIUS) fetchPacket(savedPackets.size() - 1);
+            try {
+                if (context == null) {
                     aaaStatisticsManager.handleRoundtripTime(incomingPkt.getIdentifier());
                     aaaManager.handleRadiusPacket(incomingPkt);
                 } else if (null != context) {
@@ -594,14 +549,11 @@
                     incomingPkt =
                             RADIUS.deserializer().deserialize(incomingPkt.generateAuthCode(), 0, 1);
                 }
-                } catch (DeserializationException dex) {
-                    aaaManager.aaaStatisticsManager.getAaaStats().increaseMalformedResponsesRx();
-                    aaaStatisticsManager.getAaaStats().countDroppedResponsesRx();
-                    log.error("Cannot deserialize packet", dex);
-                } catch (StateMachineException sme) {
-                    log.error("Illegal state machine operation", sme);
-        }
-
+            } catch (DeserializationException dex) {
+                aaaManager.aaaStatisticsManager.getAaaStats().increaseMalformedResponsesRx();
+                aaaStatisticsManager.getAaaStats().countDroppedResponsesRx();
+                log.error("Cannot deserialize packet", dex);
+            }
         }
 
     }
