diff --git a/src/main/java/net/floodlightcontroller/core/web/OFGroupDescStatsEntryMod.java b/src/main/java/net/floodlightcontroller/core/web/OFGroupDescStatsEntryMod.java
new file mode 100644
index 0000000..e7ca358
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/OFGroupDescStatsEntryMod.java
@@ -0,0 +1,24 @@
+package net.floodlightcontroller.core.web;
+
+import org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import net.floodlightcontroller.core.web.serializers.OFGroupDescStatsEntryModSerializer;
+
+@JsonSerialize(using = OFGroupDescStatsEntryModSerializer.class)
+
+public class OFGroupDescStatsEntryMod {
+        private OFGroupDescStatsEntry GroupDescStatsEntry = null;
+
+        public OFGroupDescStatsEntryMod() {
+        }
+
+        public OFGroupDescStatsEntryMod(OFGroupDescStatsEntry GroupStatsEntry) {
+            this.GroupDescStatsEntry = GroupStatsEntry;
+        }
+
+        public OFGroupDescStatsEntry getGroupDescStatsEntry() {
+            return this.GroupDescStatsEntry;
+        }
+
+}
diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
index 5f7b94d..c7dd69a 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
@@ -27,6 +27,8 @@
 import net.floodlightcontroller.core.annotations.LogMessageDoc;
 
 import org.projectfloodlight.openflow.protocol.OFFeaturesReply;
+import org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry;
+import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
 import org.projectfloodlight.openflow.protocol.OFMatchV3;
 import org.projectfloodlight.openflow.protocol.OFOxmList;
 import org.projectfloodlight.openflow.protocol.OFPortStatsEntry;
@@ -45,7 +47,7 @@
 
 /**
  * Base class for server resources related to switches
- * 
+ *
  * @author readams
  */
 
@@ -67,13 +69,14 @@
             message = "Failure retrieving statistics from switch {switch}",
             explanation = "An error occurred while retrieving statistics" +
                     "from the switch",
-            recommendation = LogMessageDoc.CHECK_SWITCH + " " +
-                    LogMessageDoc.GENERIC_ACTION)
-    protected List<OFStatsReply> getSwitchStatistics(long switchId,
+                    recommendation = LogMessageDoc.CHECK_SWITCH + " " +
+                            LogMessageDoc.GENERIC_ACTION)
+
+    protected List<?> getSwitchStatistics(long switchId,
             OFStatsType statType) {
         IFloodlightProviderService floodlightProvider =
                 (IFloodlightProviderService) getContext().getAttributes().
-                        get(IFloodlightProviderService.class.getCanonicalName());
+                get(IFloodlightProviderService.class.getCanonicalName());
 
         IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
         Future<List<OFStatsReply>> future;
@@ -91,7 +94,57 @@
                         .setOutPort(OFPort.ANY)
                         .setTableId(TableId.ALL)
                         .setXid(sw.getNextTransactionId()).build();
-            } /*else if (statType == OFStatisticsType.AGGREGATE) {
+            } 
+            else if (statType == OFStatsType.PORT){
+                log.debug("Switch Port Stats: req sent for all "
+                        + "ports in switch {}", sw.getStringId());
+                List<OFPortStatsEntryMod> portStats = null;
+                req = sw.getFactory()
+                        .buildPortStatsRequest()
+                        .setPortNo(OFPort.ANY).setXid
+                        (sw.getNextTransactionId()).build();
+                try {
+                    future = sw.getStatistics(req);
+                    values = future.get(10, TimeUnit.SECONDS);
+                    portStats = new ArrayList<OFPortStatsEntryMod>();
+                    for (OFPortStatsEntry entry : ((OFPortStatsReply)values.get(0)).getEntries()) {
+                        OFPortStatsEntryMod entryMod = new OFPortStatsEntryMod(entry);
+                        portStats.add(entryMod);
+                    }
+                    log.debug("Switch Port Stats Entries from switch {} are {}",
+                            sw.getStringId(), portStats);
+                } catch (Exception e) {
+                    log.error("Failure retrieving statistics from switch " + sw, e);
+                }
+                return portStats;
+            }
+            else if (statType == OFStatsType.GROUP){
+                log.debug("Switch Group Stats: req sent for all "
+                        + "ports in switch {}", sw.getStringId());
+                req = sw.getFactory().buildGroupStatsRequest().setXid
+                        (sw.getNextTransactionId()).build();
+            }
+            else if (statType == OFStatsType.GROUP_DESC){
+                log.debug("Switch Group Desc Stats: req sent for all "
+                        + "ports in switch {}", sw.getStringId());
+                List<OFGroupDescStatsEntryMod> GroupDescStats= new ArrayList<OFGroupDescStatsEntryMod>();
+                req = sw.getFactory().buildGroupDescStatsRequest().setXid
+                        (sw.getNextTransactionId()).build();
+                try {
+                    future = sw.getStatistics(req);
+                    values = future.get(10, TimeUnit.SECONDS);
+                    for (OFGroupDescStatsEntry entry : ((OFGroupDescStatsReply)values.get(0)).getEntries()) {
+                        OFGroupDescStatsEntryMod entryMod = new OFGroupDescStatsEntryMod(entry);
+                        GroupDescStats.add(entryMod);
+                    }
+                    log.debug("Switch Group_Desc Stats Entries from switch {} are {}",
+                            sw.getStringId(), GroupDescStats);
+                } catch (Exception e) {
+                    log.error("Failure retrieving statistics from switch " + sw, e);
+                }
+                return GroupDescStats;
+            }
+            /*else if (statType == OFStatisticsType.AGGREGATE) {
                 OFAggregateStatisticsRequest specificReq = new OFAggregateStatisticsRequest();
                 OFMatch match = new OFMatch();
                 match.setWildcards(0xffffffff);
@@ -100,7 +153,7 @@
                 specificReq.setTableId((byte) 0xff);
                 req.setStatistics(Collections.singletonList((OFStatistics) specificReq));
                 requestLength += specificReq.getLength();
-              } /*else if (statType == OFStatisticsType.QUEUE) {
+            } /*else if (statType == OFStatisticsType.QUEUE) {
                 OFQueueStatisticsRequest specificReq = new OFQueueStatisticsRequest();
                 specificReq.setPortNumber(OFPort.OFPP_ALL.getValue());
                 // LOOK! openflowj does not define OFPQ_ALL! pulled this from openflow.h
@@ -108,10 +161,10 @@
                 specificReq.setQueueId(0xffffffff);
                 req.setStatistics(Collections.singletonList((OFStatistics) specificReq));
                 requestLength += specificReq.getLength();
-              } else if (statType == OFStatisticsType.DESC ||
+            } else if (statType == OFStatisticsType.DESC ||
                     statType == OFStatisticsType.TABLE) {
                 // pass - nothing todo besides set the type above
-              }*/
+            }*/
             // XXX S fix when we fix stats
             try {
                 future = sw.getStatistics(req);
@@ -123,43 +176,6 @@
         return values;
     }
 
-    protected List<OFPortStatsEntryMod> getSwitchPortStatistics(long switchId) {
-        IFloodlightProviderService floodlightProvider =
-                (IFloodlightProviderService) getContext().getAttributes().
-                        get(IFloodlightProviderService.class.getCanonicalName());
-
-        IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
-        Future<List<OFStatsReply>> future;
-        List<OFStatsReply> values = null;
-        List<OFPortStatsEntryMod> portStats = null;
-
-        if (sw != null) {
-            log.debug("Switch Port Stats: req sent for all "
-                    + "ports in switch {}", sw.getStringId());
-            OFPortStatsRequest req = sw.getFactory()
-                    .buildPortStatsRequest()
-                    .setPortNo(OFPort.ANY).setXid
-                    (sw.getNextTransactionId()).build();
-
-            try {
-                future = sw.getStatistics(req);
-                values = future.get(10, TimeUnit.SECONDS);
-                portStats = new ArrayList<OFPortStatsEntryMod>();
-                for (OFPortStatsEntry entry : ((OFPortStatsReply) values.get(0))
-                        .getEntries()) {
-                    OFPortStatsEntryMod entryMod = new OFPortStatsEntryMod(entry);
-                    portStats.add(entryMod);
-                }
-                log.debug("Switch Port Stats Entries from switch {} are {}",
-                        sw.getStringId(), portStats);
-            } catch (Exception e) {
-                log.error("Failure retrieving statistics from switch " + sw, e);
-            }
-        }
-
-        return portStats;
-    }
-
     protected Object getSwitchStatistics(String switchId, OFStatsType statType) {
         return getSwitchStatistics(HexString.toLong(switchId), statType);
     }
@@ -167,16 +183,16 @@
     protected OFFeaturesReply getSwitchFeaturesReply(long switchId) {
         IFloodlightProviderService floodlightProvider =
                 (IFloodlightProviderService) getContext().getAttributes().
-                        get(IFloodlightProviderService.class.getCanonicalName());
+                get(IFloodlightProviderService.class.getCanonicalName());
 
         IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
-        // uture<OFFeaturesReply> future;
+        //uture<OFFeaturesReply> future;
         OFFeaturesReply featuresReply = null;
         if (sw != null) {
             // XXX S fix when we fix stats
             try {
-                // future = sw.getFeaturesReplyFromSwitch();
-                // featuresReply = future.get(10, TimeUnit.SECONDS);
+                //future = sw.getFeaturesReplyFromSwitch();
+                //featuresReply = future.get(10, TimeUnit.SECONDS);
             } catch (Exception e) {
                 log.error("Failure getting features reply from switch" + sw, e);
             }
diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java b/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java
index 28be9a4..4f45463 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java
@@ -20,14 +20,14 @@
 import java.util.HashMap;
 
 import org.projectfloodlight.openflow.protocol.OFStatsType;
-import org.projectfloodlight.openflow.util.HexString;
 import org.restlet.resource.Get;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+
 /**
  * Return switch statistics information for specific switches
- * 
+ *
  * @author readams
  */
 public class SwitchStatisticsResource extends SwitchResourceBase {
@@ -43,7 +43,7 @@
         String statType = (String) getRequestAttributes().get("statType");
 
         if (statType.equals("port")) {
-            values = getSwitchPortStatistics(HexString.toLong(switchId));
+            values = getSwitchStatistics(switchId, OFStatsType.PORT);
         } else if (statType.equals("queue")) {
             values = getSwitchStatistics(switchId, OFStatsType.QUEUE);
         } else if (statType.equals("flow")) {
@@ -56,10 +56,13 @@
             values = getSwitchStatistics(switchId, OFStatsType.TABLE);
         } else if (statType.equals("features")) {
             values = getSwitchFeaturesReply(switchId);
+        }else if (statType.equals("groupDesc")) {
+            values = getSwitchStatistics(switchId, OFStatsType.GROUP_DESC);
+        }else if (statType.equals("groupStats")) {
+            values = getSwitchStatistics(switchId, OFStatsType.GROUP);
         }
 
         result.put(switchId, values);
         return result;
-        // return toRepresentation(result, null);
     }
 }
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupDescStatsEntryModSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupDescStatsEntryModSerializer.java
new file mode 100644
index 0000000..097290b
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/serializers/OFGroupDescStatsEntryModSerializer.java
@@ -0,0 +1,54 @@
+package net.floodlightcontroller.core.web.serializers;
+import java.io.IOException;
+import java.util.List;
+
+import net.floodlightcontroller.core.web.OFGroupDescStatsEntryMod;
+
+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.OFActionType;
+import org.projectfloodlight.openflow.protocol.OFBucket;
+import org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry;
+import org.projectfloodlight.openflow.protocol.action.OFAction;
+import org.projectfloodlight.openflow.protocol.action.*;
+public class OFGroupDescStatsEntryModSerializer extends SerializerBase<OFGroupDescStatsEntryMod>{
+
+
+
+    protected OFGroupDescStatsEntryModSerializer(){
+        super(OFGroupDescStatsEntryMod.class);
+    }
+
+    @Override
+    public void serialize(OFGroupDescStatsEntryMod GroupDescStatsModEntry, JsonGenerator jGen,
+            SerializerProvider sp) throws IOException,
+            JsonGenerationException {
+        OFGroupDescStatsEntry GroupStatsEntryMod = GroupDescStatsModEntry.getGroupDescStatsEntry();
+        List<OFBucket> Buckets = GroupStatsEntryMod.getBuckets();
+        jGen.writeStartObject();
+        jGen.writeNumberField("groupId", GroupStatsEntryMod.getGroup().getGroupNumber());
+        jGen.writeStringField("groupType", GroupStatsEntryMod.getGroupType().name());
+        for (OFBucket bucket : Buckets){
+            List<OFAction> actions = bucket.getActions();
+            for (OFAction action : actions ){
+                if(action.getType().compareTo(OFActionType.SET_FIELD) == 0){
+                    //TODO: Need better if condition.
+                    if (((OFActionSetField)action).getField().toString().contains("OFOxmEthSrcVer13")){
+                        jGen.writeStringField("SET_DL_SRC", ((OFActionSetField)action).getField().getValue().toString());
+                    }
+                    else if (((OFActionSetField)action).getField().toString().contains("OFOxmEthDstVer13")){
+                        jGen.writeStringField("SET_DL_DST", ((OFActionSetField)action).getField().getValue().toString());
+                    }
+                }
+                else if(action.getType().compareTo(OFActionType.OUTPUT) == 0){
+                    jGen.writeNumberField("OUTPPUT", ((OFActionOutput)action).getPort().getPortNumber());
+                }
+            }
+        }
+        jGen.writeEndObject();
+        
+    }
+
+}
