diff --git a/src/main/java/net/floodlightcontroller/core/web/OFFlowStatsEntryMod.java b/src/main/java/net/floodlightcontroller/core/web/OFFlowStatsEntryMod.java
new file mode 100644
index 0000000..ead1aff
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/OFFlowStatsEntryMod.java
@@ -0,0 +1,22 @@
+package net.floodlightcontroller.core.web;
+
+import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+//@JsonSerialize(using = OFFlowStatsEntryModSerializer.class)
+public class OFFlowStatsEntryMod {
+    private OFFlowStatsEntry FlowStatsEntry = null;
+
+    public  OFFlowStatsEntryMod() {
+    }
+
+    public  OFFlowStatsEntryMod(OFFlowStatsEntry FlowStatsEntry) {
+        this.FlowStatsEntry = FlowStatsEntry;
+    }
+
+    public OFFlowStatsEntry getFlowStatsEntr() {
+        return this.FlowStatsEntry;
+    }
+
+}
diff --git a/src/main/java/net/floodlightcontroller/core/web/OFGroupStatsEntryMod.java b/src/main/java/net/floodlightcontroller/core/web/OFGroupStatsEntryMod.java
new file mode 100644
index 0000000..6ddb430
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/OFGroupStatsEntryMod.java
@@ -0,0 +1,21 @@
+package net.floodlightcontroller.core.web;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import org.projectfloodlight.openflow.protocol.OFGroupStatsEntry;
+import net.floodlightcontroller.core.web.serializers.OFGroupStatsEntryModSerializer;
+
+@JsonSerialize(using = OFGroupStatsEntryModSerializer.class)
+public class OFGroupStatsEntryMod {
+    private OFGroupStatsEntry GroupStatsEntry = null;
+
+    public  OFGroupStatsEntryMod() {
+    }
+
+    public  OFGroupStatsEntryMod(OFGroupStatsEntry GroupStatsEntry) {
+        this.GroupStatsEntry = GroupStatsEntry;
+    }
+
+    public OFGroupStatsEntry getGroupStatsEntry() {
+        return this.GroupStatsEntry;
+    }
+}
diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
index c7dd69a..def6a7d 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
@@ -29,6 +29,8 @@
 import org.projectfloodlight.openflow.protocol.OFFeaturesReply;
 import org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry;
 import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
+import org.projectfloodlight.openflow.protocol.OFGroupStatsEntry;
+import org.projectfloodlight.openflow.protocol.OFGroupStatsReply;
 import org.projectfloodlight.openflow.protocol.OFMatchV3;
 import org.projectfloodlight.openflow.protocol.OFOxmList;
 import org.projectfloodlight.openflow.protocol.OFPortStatsEntry;
@@ -123,6 +125,20 @@
                         + "ports in switch {}", sw.getStringId());
                 req = sw.getFactory().buildGroupStatsRequest().setXid
                         (sw.getNextTransactionId()).build();
+                List<OFGroupStatsEntryMod> groupStats = new ArrayList<OFGroupStatsEntryMod>();
+                try {
+                    future = sw.getStatistics(req);
+                    values = future.get(10, TimeUnit.SECONDS);
+                    for (OFGroupStatsEntry entry : ((OFGroupStatsReply)values.get(0)).getEntries()) {
+                        OFGroupStatsEntryMod entryMod = new OFGroupStatsEntryMod(entry);
+                        groupStats.add(entryMod);
+                    }
+                    log.debug("Switch Group Stats Entries from switch {} are {}",
+                            sw.getStringId(), groupStats);
+                } catch (Exception e) {
+                    log.error("Failure retrieving statistics from switch " + sw, e);
+                }
+                return groupStats;
             }
             else if (statType == OFStatsType.GROUP_DESC){
                 log.debug("Switch Group Desc Stats: req sent for all "
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/OFFlowStatsEntryModSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/OFFlowStatsEntryModSerializer.java
new file mode 100644
index 0000000..2cce2d8
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/serializers/OFFlowStatsEntryModSerializer.java
@@ -0,0 +1,25 @@
+package net.floodlightcontroller.core.web.serializers;
+
+import java.io.IOException;
+
+import net.floodlightcontroller.core.web.OFFlowStatsEntryMod;
+
+import org.codehaus.jackson.JsonGenerationException;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.codehaus.jackson.map.ser.std.SerializerBase;
+
+public class OFFlowStatsEntryModSerializer extends SerializerBase<OFFlowStatsEntryMod> {
+    
+    protected OFFlowStatsEntryModSerializer(){
+        super(OFFlowStatsEntryMod.class);
+    }
+
+    @Override
+    public void serialize(OFFlowStatsEntryMod FlowStatsEntryMod, JsonGenerator jGen,
+            SerializerProvider sp) throws IOException,
+            JsonGenerationException {
+        
+    }
+
+}
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupDescStatsEntryModSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupDescStatsEntryModSerializer.java
index 097290b..b4bddc7 100644
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupDescStatsEntryModSerializer.java
+++ b/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupDescStatsEntryModSerializer.java
@@ -22,15 +22,17 @@
     }
 
     @Override
-    public void serialize(OFGroupDescStatsEntryMod GroupDescStatsModEntry, JsonGenerator jGen,
+    public void serialize(OFGroupDescStatsEntryMod groupDescStatsModEntry, JsonGenerator jGen,
             SerializerProvider sp) throws IOException,
             JsonGenerationException {
-        OFGroupDescStatsEntry GroupStatsEntryMod = GroupDescStatsModEntry.getGroupDescStatsEntry();
-        List<OFBucket> Buckets = GroupStatsEntryMod.getBuckets();
+        OFGroupDescStatsEntry groupDescStatsEntryMod = groupDescStatsModEntry.getGroupDescStatsEntry();
+        List<OFBucket> Buckets = groupDescStatsEntryMod.getBuckets();
         jGen.writeStartObject();
-        jGen.writeNumberField("groupId", GroupStatsEntryMod.getGroup().getGroupNumber());
-        jGen.writeStringField("groupType", GroupStatsEntryMod.getGroupType().name());
+        jGen.writeNumberField("groupId", groupDescStatsEntryMod.getGroup().getGroupNumber());
+        jGen.writeStringField("groupType", groupDescStatsEntryMod.getGroupType().name());
+        jGen.writeArrayFieldStart("bucketsActions");
         for (OFBucket bucket : Buckets){
+            jGen.writeStartObject();
             List<OFAction> actions = bucket.getActions();
             for (OFAction action : actions ){
                 if(action.getType().compareTo(OFActionType.SET_FIELD) == 0){
@@ -46,7 +48,9 @@
                     jGen.writeNumberField("OUTPPUT", ((OFActionOutput)action).getPort().getPortNumber());
                 }
             }
+            jGen.writeEndObject();
         }
+        jGen.writeEndArray();
         jGen.writeEndObject();
         
     }
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupStatsEntryModSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupStatsEntryModSerializer.java
new file mode 100644
index 0000000..8b2bb72
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupStatsEntryModSerializer.java
@@ -0,0 +1,43 @@
+package net.floodlightcontroller.core.web.serializers;
+import java.io.IOException;
+import java.util.List;
+
+import net.floodlightcontroller.core.web.OFGroupStatsEntryMod;
+
+import org.codehaus.jackson.JsonGenerationException;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.codehaus.jackson.map.ser.std.SerializerBase;
+import org.projectfloodlight.openflow.protocol.OFBucketCounter;
+import org.projectfloodlight.openflow.protocol.OFGroupStatsEntry;
+
+public class OFGroupStatsEntryModSerializer extends SerializerBase<OFGroupStatsEntryMod>{
+    
+    protected OFGroupStatsEntryModSerializer(){
+        super(OFGroupStatsEntryMod.class);
+    }
+
+    @Override
+    public void serialize(OFGroupStatsEntryMod groupStatsEntryMod, JsonGenerator jGen,
+            SerializerProvider sp) throws IOException,
+            JsonGenerationException {
+        OFGroupStatsEntry groupStatsModEntry = groupStatsEntryMod.getGroupStatsEntry();
+        List<OFBucketCounter> bucketCounters = groupStatsModEntry.getBucketStats();
+        jGen.writeStartObject();
+        jGen.writeNumberField("groupId", groupStatsModEntry.getGroup().getGroupNumber());
+        jGen.writeNumberField("packetCount", groupStatsModEntry.getPacketCount().getValue());
+        jGen.writeNumberField("byteCount", groupStatsModEntry.getByteCount().getValue());
+        jGen.writeNumberField("durationNsec", groupStatsModEntry.getDurationNsec());
+        jGen.writeNumberField("durationSec", groupStatsModEntry.getDurationSec());
+        jGen.writeArrayFieldStart("bucketStats");
+        for (OFBucketCounter bucketCouter : bucketCounters){
+            jGen.writeStartObject();
+            jGen.writeNumberField("pktCount", bucketCouter.getPacketCount().getValue());
+            jGen.writeNumberField("byteCount", bucketCouter.getByteCount().getValue());
+            jGen.writeEndObject();
+        }
+        jGen.writeEndArray();
+        jGen.writeEndObject();
+    }
+
+}
