-GroupDesc/GroupStats Supports
-Removed tabs
-refactored SwitchStatisticResource.java.
-Added Serializer for groupDescStats
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();
+        
+    }
+
+}