diff --git a/app/src/main/java/org/opencord/aaa/impl/AaaStatisticsManager.java b/app/src/main/java/org/opencord/aaa/impl/AaaStatisticsManager.java
index b28d53e..31aad5b 100644
--- a/app/src/main/java/org/opencord/aaa/impl/AaaStatisticsManager.java
+++ b/app/src/main/java/org/opencord/aaa/impl/AaaStatisticsManager.java
@@ -19,7 +19,6 @@
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -39,21 +38,22 @@
 @Service
 @Component(immediate = true)
 public class AaaStatisticsManager
-        extends AbstractListenerManager<AuthenticationStatisticsEvent, AuthenticationStatisticsEventListener>
-        implements AuthenticationStatisticsService {
+extends AbstractListenerManager<AuthenticationStatisticsEvent, AuthenticationStatisticsEventListener>
+implements AuthenticationStatisticsService {
 
     private AuthenticationStatisticsDelegate statsDelegate;
 
+    @Override
     public AuthenticationStatisticsDelegate getStatsDelegate() {
         return statsDelegate;
     }
 
     private final Logger log = getLogger(getClass());
     private AaaStatistics aaaStats;
-    private LinkedList<Long> packetRoundTripTimeList = new LinkedList<Long>();
     public Map<Byte, Long> outgoingPacketMap = new HashMap<Byte, Long>();
     private static final int PACKET_COUNT_FOR_AVERAGE_RTT_CALCULATION = 5;
 
+    @Override
     public AaaStatistics getAaaStats() {
         return aaaStats;
     }
@@ -71,23 +71,31 @@
         eventDispatcher.removeSink(AuthenticationStatisticsEvent.class);
     }
 
+    @Override
     public void handleRoundtripTime(byte inPacketIdentifier) {
         long inTimeInMilis = System.currentTimeMillis();
         if (outgoingPacketMap.containsKey(inPacketIdentifier)) {
-            if (packetRoundTripTimeList.size() > PACKET_COUNT_FOR_AVERAGE_RTT_CALCULATION) {
-                packetRoundTripTimeList.removeFirst();
+            if (aaaStats.getPacketRoundTripTimeListSize() > PACKET_COUNT_FOR_AVERAGE_RTT_CALCULATION) {
+                aaaStats.getPacketRoundTripTimeListRemoveFirst();
             }
-            packetRoundTripTimeList.add(inTimeInMilis - outgoingPacketMap.get(inPacketIdentifier));
+            aaaStats.getPacketRoundTripTimeListAdd(inTimeInMilis - outgoingPacketMap.get(inPacketIdentifier));
         }
     }
 
+    @Override
+    public void resetAllCounters() {
+        aaaStats.resetAllCounters();
+    }
+
+    @Override
     public void calculatePacketRoundtripTime() {
-        if (packetRoundTripTimeList.size() > 0) {
-            long avg = (long) packetRoundTripTimeList.stream().mapToLong(i -> i).average().getAsDouble();
+        if (aaaStats.getPacketRoundTripTimeListSize() > 0) {
+            long avg = (long) aaaStats.getPacketRoundTripTimeList().stream().mapToLong(i -> i).average().getAsDouble();
             aaaStats.setRequestRttMilis(new AtomicLong(avg));
         }
     }
 
+    @Override
     public void putOutgoingIdentifierToMap(byte outPacketIdentifier) {
         outgoingPacketMap.put(outPacketIdentifier, System.currentTimeMillis());
     }
