non-thrift changes
diff --git a/storm-server/src/main/java/org/apache/storm/daemon/nimbus/Nimbus.java b/storm-server/src/main/java/org/apache/storm/daemon/nimbus/Nimbus.java
index a3b7575..957d27b 100644
--- a/storm-server/src/main/java/org/apache/storm/daemon/nimbus/Nimbus.java
+++ b/storm-server/src/main/java/org/apache/storm/daemon/nimbus/Nimbus.java
@@ -2895,6 +2895,7 @@
         if (resources != null) {
             ret.set_used_mem(resources.getUsedMem());
             ret.set_used_cpu(resources.getUsedCpu());
+            ret.set_used_generic_resources(resources.getUsedGenericResources());
             if (isFragmented(resources)) {
                 final double availableCpu = resources.getAvailableCpu();
                 if (availableCpu < 0) {
@@ -2994,9 +2995,11 @@
                 summary.set_requested_memonheap(resources.getRequestedMemOnHeap());
                 summary.set_requested_memoffheap(resources.getRequestedMemOffHeap());
                 summary.set_requested_cpu(resources.getRequestedCpu());
+                summary.set_requested_generic_resources(resources.getRequestedGenericResources());
                 summary.set_assigned_memonheap(resources.getAssignedMemOnHeap());
                 summary.set_assigned_memoffheap(resources.getAssignedMemOffHeap());
                 summary.set_assigned_cpu(resources.getAssignedCpu());
+                summary.set_assigned_generic_resources(resources.getAssignedGenericResources());
             }
             try {
                 summary.set_replication_count(getBlobReplicationCount(ConfigUtils.masterStormCodeKey(topoId)));
@@ -4206,6 +4209,8 @@
                 topoPageInfo.set_assigned_regular_off_heap_memory(resources.getAssignedNonSharedMemOffHeap());
                 topoPageInfo.set_assigned_shared_on_heap_memory(resources.getAssignedSharedMemOnHeap());
                 topoPageInfo.set_assigned_regular_on_heap_memory(resources.getAssignedNonSharedMemOnHeap());
+                topoPageInfo.set_assigned_generic_resources(resources.getAssignedGenericResources());
+                topoPageInfo.set_requested_generic_resources(resources.getRequestedGenericResources());
             }
             int launchTimeSecs = common.launchTimeSecs;
             topoPageInfo.set_name(topoName);
diff --git a/storm-server/src/main/java/org/apache/storm/daemon/nimbus/TopologyResources.java b/storm-server/src/main/java/org/apache/storm/daemon/nimbus/TopologyResources.java
index f0db842..6a0c3fb 100644
--- a/storm-server/src/main/java/org/apache/storm/daemon/nimbus/TopologyResources.java
+++ b/storm-server/src/main/java/org/apache/storm/daemon/nimbus/TopologyResources.java
@@ -13,13 +13,16 @@
 package org.apache.storm.daemon.nimbus;
 
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Map;
+
 import org.apache.storm.generated.Assignment;
 import org.apache.storm.generated.NodeInfo;
 import org.apache.storm.generated.WorkerResources;
 import org.apache.storm.scheduler.SchedulerAssignment;
 import org.apache.storm.scheduler.TopologyDetails;
 import org.apache.storm.scheduler.WorkerSlot;
+import org.apache.storm.scheduler.resource.normalization.NormalizedResourceRequest;
 
 public final class TopologyResources {
     private final double requestedMemOnHeap;
@@ -29,6 +32,7 @@
     private final double requestedNonSharedMemOnHeap;
     private final double requestedNonSharedMemOffHeap;
     private final double requestedCpu;
+    private Map<String, Double> requestedGenericResources;
     private double assignedMemOnHeap;
     private double assignedMemOffHeap;
     private double assignedSharedMemOnHeap;
@@ -36,6 +40,7 @@
     private double assignedNonSharedMemOnHeap;
     private double assignedNonSharedMemOffHeap;
     private double assignedCpu;
+    private Map<String, Double> assignedGenericResources;
 
     private TopologyResources(TopologyDetails td, Collection<WorkerResources> workers,
                               Map<String, Double> nodeIdToSharedOffHeapNode) {
@@ -46,6 +51,7 @@
         requestedNonSharedMemOnHeap = td.getRequestedNonSharedOnHeap();
         requestedNonSharedMemOffHeap = td.getRequestedNonSharedOffHeap();
         requestedCpu = td.getTotalRequestedCpu();
+        requestedGenericResources = td.getTotalRequestedGenericResources();
         assignedMemOnHeap = 0.0;
         assignedMemOffHeap = 0.0;
         assignedSharedMemOnHeap = 0.0;
@@ -53,6 +59,7 @@
         assignedNonSharedMemOnHeap = 0.0;
         assignedNonSharedMemOffHeap = 0.0;
         assignedCpu = 0.0;
+        assignedGenericResources = new HashMap<>();
 
         if (workers != null) {
             for (WorkerResources resources : workers) {
@@ -72,6 +79,7 @@
                     assignedNonSharedMemOffHeap -= resources.get_shared_mem_off_heap();
                 }
             }
+            assignedGenericResources = computeAssignedGenericResources(workers);
         }
 
         if (nodeIdToSharedOffHeapNode != null) {
@@ -81,6 +89,15 @@
         }
     }
 
+    private Map<String, Double> computeAssignedGenericResources(Collection<WorkerResources> workers) {
+        Map<String, Double> genericResources = new HashMap<>();
+        for (WorkerResources worker : workers) {
+            genericResources = NormalizedResourceRequest.addResourceMap(genericResources, worker.get_resources());
+        }
+        NormalizedResourceRequest.filterGenericResources(genericResources);
+        return genericResources;
+    }
+
     public TopologyResources(TopologyDetails td, SchedulerAssignment assignment) {
         this(td, getWorkerResources(assignment), getNodeIdToSharedOffHeapNode(assignment));
     }
@@ -90,7 +107,7 @@
     }
 
     public TopologyResources() {
-        this(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this(0, 0, 0, 0, 0, 0, 0, new HashMap<>(), 0, 0, 0, 0, 0, 0, 0, new HashMap<>());
     }
 
     protected TopologyResources(
@@ -101,13 +118,15 @@
         double requestedNonSharedMemOnHeap,
         double requestedNonSharedMemOffHeap,
         double requestedCpu,
+        Map<String, Double> requestedGenericResources,
         double assignedMemOnHeap,
         double assignedMemOffHeap,
         double assignedSharedMemOnHeap,
         double assignedSharedMemOffHeap,
         double assignedNonSharedMemOnHeap,
         double assignedNonSharedMemOffHeap,
-        double assignedCpu) {
+        double assignedCpu,
+        Map<String, Double> assignedGenericResources) {
         this.requestedMemOnHeap = requestedMemOnHeap;
         this.requestedMemOffHeap = requestedMemOffHeap;
         this.requestedSharedMemOnHeap = requestedSharedMemOnHeap;
@@ -115,6 +134,7 @@
         this.requestedNonSharedMemOnHeap = requestedNonSharedMemOnHeap;
         this.requestedNonSharedMemOffHeap = requestedNonSharedMemOffHeap;
         this.requestedCpu = requestedCpu;
+        this.requestedGenericResources = requestedGenericResources;
         this.assignedMemOnHeap = assignedMemOnHeap;
         this.assignedMemOffHeap = assignedMemOffHeap;
         this.assignedSharedMemOnHeap = assignedSharedMemOnHeap;
@@ -122,6 +142,7 @@
         this.assignedNonSharedMemOnHeap = assignedNonSharedMemOnHeap;
         this.assignedNonSharedMemOffHeap = assignedNonSharedMemOffHeap;
         this.assignedCpu = assignedCpu;
+        this.assignedGenericResources = assignedGenericResources;
     }
 
     private static Collection<WorkerResources> getWorkerResources(SchedulerAssignment assignment) {
@@ -246,6 +267,14 @@
         this.assignedNonSharedMemOffHeap = assignedNonSharedMemOffHeap;
     }
 
+    public Map<String, Double> getAssignedGenericResources() {
+        return new HashMap<>(assignedGenericResources);
+    }
+
+    public Map<String, Double> getRequestedGenericResources() {
+        return new HashMap<>(requestedGenericResources);
+    }
+
     /**
      * Add the values in other to this and return a combined resources object.
      * @param other the other resources to add to this
@@ -260,12 +289,14 @@
             requestedNonSharedMemOnHeap + other.requestedNonSharedMemOnHeap,
             requestedNonSharedMemOffHeap + other.requestedNonSharedMemOffHeap,
             requestedCpu + other.requestedCpu,
+            NormalizedResourceRequest.addResourceMap(requestedGenericResources, other.requestedGenericResources),
             assignedMemOnHeap + other.assignedMemOnHeap,
             assignedMemOffHeap + other.assignedMemOffHeap,
             assignedSharedMemOnHeap + other.assignedSharedMemOnHeap,
             assignedSharedMemOffHeap + other.assignedSharedMemOffHeap,
             assignedNonSharedMemOnHeap + other.assignedNonSharedMemOnHeap,
             assignedNonSharedMemOffHeap + other.assignedNonSharedMemOffHeap,
-            assignedCpu + other.assignedCpu);
+            assignedCpu + other.assignedCpu,
+            NormalizedResourceRequest.addResourceMap(assignedGenericResources, other.assignedGenericResources));
     }
 }
diff --git a/storm-server/src/main/java/org/apache/storm/scheduler/Cluster.java b/storm-server/src/main/java/org/apache/storm/scheduler/Cluster.java
index 04f0960..f51eae1 100644
--- a/storm-server/src/main/java/org/apache/storm/scheduler/Cluster.java
+++ b/storm-server/src/main/java/org/apache/storm/scheduler/Cluster.java
@@ -27,7 +27,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.apache.storm.Config;
 import org.apache.storm.Constants;
@@ -955,7 +954,8 @@
     public Map<String, SupervisorResources> getSupervisorsResourcesMap() {
         Map<String, SupervisorResources> ret = new HashMap<>();
         for (SupervisorDetails sd : supervisors.values()) {
-            ret.put(sd.getId(), new SupervisorResources(sd.getTotalMemory(), sd.getTotalCpu(), 0, 0));
+            ret.put(sd.getId(), new SupervisorResources(sd.getTotalMemory(), sd.getTotalCpu(), sd.getTotalGenericResources(),
+                0, 0, new HashMap<>()));
         }
         for (SchedulerAssignmentImpl assignment : assignments.values()) {
             for (Entry<WorkerSlot, WorkerResources> entry :
@@ -963,7 +963,9 @@
                 String id = entry.getKey().getNodeId();
                 SupervisorResources sr = ret.get(id);
                 if (sr == null) {
-                    sr = new SupervisorResources(0, 0, 0, 0);
+                    sr = new SupervisorResources(0, 0, new HashMap<>(),
+                        0, 0, new HashMap<>());
+
                 }
                 sr = sr.add(entry.getValue());
                 ret.put(id, sr);
@@ -974,7 +976,8 @@
                     String id = entry.getKey();
                     SupervisorResources sr = ret.get(id);
                     if (sr == null) {
-                        sr = new SupervisorResources(0, 0, 0, 0);
+                        sr = new SupervisorResources(0, 0, new HashMap<>(),
+                            0, 0, new HashMap<>());
                     }
                     sr = sr.addMem(entry.getValue());
                     ret.put(id, sr);
diff --git a/storm-server/src/main/java/org/apache/storm/scheduler/SupervisorDetails.java b/storm-server/src/main/java/org/apache/storm/scheduler/SupervisorDetails.java
index 2700871..8daf142 100644
--- a/storm-server/src/main/java/org/apache/storm/scheduler/SupervisorDetails.java
+++ b/storm-server/src/main/java/org/apache/storm/scheduler/SupervisorDetails.java
@@ -17,6 +17,7 @@
 import java.util.Map;
 import java.util.Set;
 import org.apache.storm.scheduler.resource.normalization.NormalizedResourceOffer;
+import org.apache.storm.scheduler.resource.normalization.NormalizedResourceRequest;
 import org.apache.storm.scheduler.resource.normalization.ResourceMetrics;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -153,6 +154,15 @@
         return totalResources.getTotalCpu();
     }
 
+    /*
+     * Get the total Generic resources on this supervisor.
+     */
+    public Map<String, Double> getTotalGenericResources() {
+        Map<String, Double> genericResources = totalResources.toNormalizedMap();
+        NormalizedResourceRequest.filterGenericResources(genericResources);
+        return genericResources;
+    }
+
     /**
      * Get all resources for this Supervisor.
      */
diff --git a/storm-server/src/main/java/org/apache/storm/scheduler/SupervisorResources.java b/storm-server/src/main/java/org/apache/storm/scheduler/SupervisorResources.java
index 8ee686f..612896e 100644
--- a/storm-server/src/main/java/org/apache/storm/scheduler/SupervisorResources.java
+++ b/storm-server/src/main/java/org/apache/storm/scheduler/SupervisorResources.java
@@ -18,27 +18,38 @@
 
 package org.apache.storm.scheduler;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.storm.generated.WorkerResources;
+import org.apache.storm.scheduler.resource.normalization.NormalizedResourceRequest;
 
 public class SupervisorResources {
     private final double totalMem;
     private final double totalCpu;
     private final double usedMem;
     private final double usedCpu;
+    private Map<String, Double> totalGenericResources;
+    private Map<String, Double> usedGenericResources;
 
     /**
      * Constructor for a Supervisor's resources.
      *
      * @param totalMem the total mem on the supervisor
      * @param totalCpu the total CPU on the supervisor
+     * @param totalGenericResources the total generic resources on the supervisor
      * @param usedMem  the used mem on the supervisor
      * @param usedCpu  the used CPU on the supervisor
+     * @param usedGenericResources the used generic resources on the supervisor
      */
-    public SupervisorResources(double totalMem, double totalCpu, double usedMem, double usedCpu) {
+    public SupervisorResources(double totalMem, double totalCpu, Map<String, Double> totalGenericResources,
+                               double usedMem, double usedCpu, Map<String, Double> usedGenericResources) {
         this.totalMem = totalMem;
         this.totalCpu = totalCpu;
         this.usedMem = usedMem;
         this.usedCpu = usedCpu;
+        this.totalGenericResources = totalGenericResources != null ? totalGenericResources : new HashMap<>();
+        this.usedGenericResources = usedGenericResources != null ? usedGenericResources : new HashMap<>();
     }
 
     public double getUsedMem() {
@@ -65,15 +76,29 @@
         return totalMem - usedMem;
     }
 
-    SupervisorResources add(WorkerResources wr) {
+    public Map<String, Double> getTotalGenericResources() {
+        return new HashMap<>(totalGenericResources);
+    }
+
+    public Map<String, Double> getUsedGenericResources() {
+        return new HashMap<>(usedGenericResources);
+    }
+
+    public SupervisorResources add(WorkerResources wr) {
+        usedGenericResources = NormalizedResourceRequest.addResourceMap(usedGenericResources, wr.get_resources());
+        NormalizedResourceRequest.filterGenericResources(usedGenericResources);
+
         return new SupervisorResources(
-            totalMem,
-            totalCpu,
-            usedMem + wr.get_mem_off_heap() + wr.get_mem_on_heap(),
-            usedCpu + wr.get_cpu());
+                totalMem,
+                totalCpu,
+                getTotalGenericResources(),
+                usedMem + wr.get_mem_off_heap() + wr.get_mem_on_heap(),
+                usedCpu + wr.get_cpu(),
+                getUsedGenericResources());
     }
 
     public SupervisorResources addMem(Double value) {
-        return new SupervisorResources(totalMem, totalCpu, usedMem + value, usedCpu);
+        return new SupervisorResources(totalMem, totalCpu, getTotalGenericResources(),
+                usedMem + value, usedCpu, getUsedGenericResources());
     }
 }
diff --git a/storm-server/src/main/java/org/apache/storm/scheduler/TopologyDetails.java b/storm-server/src/main/java/org/apache/storm/scheduler/TopologyDetails.java
index 29f06e2..180b5f9 100644
--- a/storm-server/src/main/java/org/apache/storm/scheduler/TopologyDetails.java
+++ b/storm-server/src/main/java/org/apache/storm/scheduler/TopologyDetails.java
@@ -455,6 +455,12 @@
         return totalCpu;
     }
 
+    public Map<String, Double> getTotalRequestedGenericResources() {
+        Map<String, Double> map = getApproximateTotalResources().toNormalizedMap();
+        NormalizedResourceRequest.filterGenericResources(map);
+        return map;
+    }
+
     /**
      * get the resources requirements for a executor.
      *
diff --git a/storm-server/src/main/java/org/apache/storm/scheduler/resource/normalization/NormalizedResourceRequest.java b/storm-server/src/main/java/org/apache/storm/scheduler/resource/normalization/NormalizedResourceRequest.java
index 478a8be..66aade8 100644
--- a/storm-server/src/main/java/org/apache/storm/scheduler/resource/normalization/NormalizedResourceRequest.java
+++ b/storm-server/src/main/java/org/apache/storm/scheduler/resource/normalization/NormalizedResourceRequest.java
@@ -178,6 +178,43 @@
         return ret;
     }
 
+    /*
+     * return map with non generic resources removded
+     */
+    public static void filterGenericResources(Map<String, Double> map) {
+        map.remove(Constants.COMMON_ONHEAP_MEMORY_RESOURCE_NAME);
+        map.remove(Constants.COMMON_OFFHEAP_MEMORY_RESOURCE_NAME);
+        map.remove(Constants.COMMON_TOTAL_MEMORY_RESOURCE_NAME);
+        map.remove(Constants.COMMON_CPU_RESOURCE_NAME);
+    }
+
+    /*
+     * return a map that is the sum of resources1 + resources2
+     */
+    public static Map<String, Double> addResourceMap(Map<String, Double> resources1, Map<String, Double> resources2) {
+        Map<String,Double> sum = new HashMap<>(resources1);
+        for (Map.Entry<String,Double> me : resources2.entrySet()) {
+            Double cur = sum.getOrDefault(me.getKey(), 0.0) + me.getValue();
+            sum.put(me.getKey(), cur);
+        }
+        return sum;
+    }
+
+    /*
+     * return a map that is the difference of resources1 - resources2
+     */
+    public static Map<String, Double> subtractResourceMap(Map<String, Double> resource1, Map<String, Double> resource2) {
+        if (resource1 == null || resource2 == null) {
+            return new HashMap<>();
+        }
+        Map<String, Double> difference = new HashMap<>(resource1);
+        for (Map.Entry<String,Double> me : resource2.entrySet()) {
+            Double sub = difference.getOrDefault(me.getKey(), 0.0) - me.getValue();
+            difference.put(me.getKey(), sub);
+        }
+        return difference;
+    }
+
     public double getOnHeapMemoryMb() {
         return onHeap;
     }
diff --git a/storm-webapp/src/main/java/org/apache/storm/daemon/ui/UIHelpers.java b/storm-webapp/src/main/java/org/apache/storm/daemon/ui/UIHelpers.java
index 4d37b64..658ed06 100644
--- a/storm-webapp/src/main/java/org/apache/storm/daemon/ui/UIHelpers.java
+++ b/storm-webapp/src/main/java/org/apache/storm/daemon/ui/UIHelpers.java
@@ -35,6 +35,7 @@
 import java.util.NavigableMap;
 import java.util.Objects;
 import java.util.Set;
+import java.util.TreeMap;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -85,6 +86,7 @@
 import org.apache.storm.generated.TopologySummary;
 import org.apache.storm.generated.WorkerSummary;
 import org.apache.storm.logging.filters.AccessLoggingFilter;
+import org.apache.storm.scheduler.resource.normalization.NormalizedResourceRequest;
 import org.apache.storm.stats.StatsUtil;
 import org.apache.storm.thrift.TException;
 import org.apache.storm.utils.IVersionInfo;
@@ -632,9 +634,32 @@
                 ? StatsUtil.floatStr((supervisorUsedCpu * 100.0) / supervisorTotalCpu) : "0.0");
         result.put("bugtracker-url", conf.get(DaemonConfig.UI_PROJECT_BUGTRACKER_URL));
         result.put("central-log-url", conf.get(DaemonConfig.UI_CENTRAL_LOGGING_URL));
+
+        Map<String, Double> usedGenericResources = new HashMap<>();
+        Map<String, Double> totalGenericResources = new HashMap<>();
+        for (SupervisorSummary ss : supervisorSummaries) {
+            usedGenericResources = NormalizedResourceRequest.addResourceMap(usedGenericResources, ss.get_used_generic_resources());
+            totalGenericResources = NormalizedResourceRequest.addResourceMap(totalGenericResources, ss.get_total_resources());
+        }
+        Map<String, Double> availGenericResources = NormalizedResourceRequest
+                .subtractResourceMap(totalGenericResources, usedGenericResources);
+        result.put("availGenerics", prettifyGenericResources(availGenericResources));
+        result.put("totalGenerics", prettifyGenericResources(totalGenericResources));
         return result;
     }
 
+    private static String prettifyGenericResources(Map<String, Double> resourceMap) {
+        if (resourceMap == null) {
+            return null;
+        }
+        TreeMap<String, Double> treeGenericResources = new TreeMap<>(); // use TreeMap for deterministic ordering
+        treeGenericResources.putAll(resourceMap);
+        NormalizedResourceRequest.filterGenericResources(treeGenericResources);
+        return treeGenericResources.toString()
+                .replaceAll("[{}]", "")
+                .replace(",", "");
+    }
+
     /**
      * Prettify OwnerResourceSummary.
      * @param ownerResourceSummary ownerResourceSummary
@@ -745,12 +770,14 @@
                 topologySummary.get_requested_memoffheap()
                         + topologySummary.get_assigned_memonheap());
         result.put("requestedCpu", topologySummary.get_requested_cpu());
+        result.put("requestedGenericResources", prettifyGenericResources(topologySummary.get_requested_generic_resources()));
         result.put("assignedMemOnHeap", topologySummary.get_assigned_memonheap());
         result.put("assignedMemOffHeap", topologySummary.get_assigned_memoffheap());
         result.put("assignedTotalMem",
                 topologySummary.get_assigned_memoffheap()
                         + topologySummary.get_assigned_memonheap());
         result.put("assignedCpu", topologySummary.get_assigned_cpu());
+        result.put("assignedGenericResources", prettifyGenericResources(topologySummary.get_assigned_generic_resources()));
         result.put("topologyVersion", topologySummary.get_topology_version());
         result.put("stormVersion", topologySummary.get_storm_version());
         return result;
@@ -909,6 +936,15 @@
         result.put("availMem", totalMemory - supervisorSummary.get_used_mem());
         result.put("availCpu", totalCpu - supervisorSummary.get_used_cpu());
         result.put("version", supervisorSummary.get_version());
+
+        Map<String, Double> totalGenericResources = new HashMap<>(totalResources);
+        result.put("totalGenericResources", prettifyGenericResources(totalGenericResources));
+        Map<String, Double> usedGenericResources = supervisorSummary.get_used_generic_resources();
+        result.put("usedGenericResources", prettifyGenericResources(usedGenericResources));
+        Map<String, Double> availGenericResources = NormalizedResourceRequest
+                .subtractResourceMap(totalGenericResources, usedGenericResources);
+        result.put("availGenericResources", prettifyGenericResources(availGenericResources));
+
         return result;
     }
 
@@ -1165,6 +1201,9 @@
             result.put(
                     "requestedCpu",
                     commonAggregateStats.get_resources_map().get(Constants.COMMON_CPU_RESOURCE_NAME));
+            result.put(
+                    "requestedGenericResourcesComp",
+                    prettifyGenericResources(commonAggregateStats.get_resources_map()));
         }
         return result;
     }
@@ -1546,10 +1585,12 @@
         result.put("requestedSharedOnHeapMem", topologyPageInfo.get_requested_shared_on_heap_memory());
         result.put("requestedRegularOffHeapMem", topologyPageInfo.get_requested_regular_off_heap_memory());
         result.put("requestedSharedOffHeapMem", topologyPageInfo.get_requested_shared_off_heap_memory());
+        result.put("requestedGenericResources", prettifyGenericResources(topologyPageInfo.get_requested_generic_resources()));
         result.put("assignedRegularOnHeapMem", topologyPageInfo.get_assigned_regular_on_heap_memory());
         result.put("assignedSharedOnHeapMem", topologyPageInfo.get_assigned_shared_on_heap_memory());
         result.put("assignedRegularOffHeapMem", topologyPageInfo.get_assigned_regular_off_heap_memory());
         result.put("assignedSharedOffHeapMem", topologyPageInfo.get_assigned_shared_off_heap_memory());
+        result.put("assignedGenericResources", prettifyGenericResources(topologyPageInfo.get_assigned_generic_resources()));
         result.put("topologyStats", getTopologyStatsMap(topologyPageInfo.get_topology_stats()));
         List<Map> workerSummaries = new ArrayList();
         if (topologyPageInfo.is_set_workers()) {
@@ -2025,6 +2066,8 @@
                 componentPageInfo.get_resources_map().get(Constants.COMMON_OFFHEAP_MEMORY_RESOURCE_NAME));
         result.put("requestedCpu",
                 componentPageInfo.get_resources_map().get(Constants.COMMON_CPU_RESOURCE_NAME));
+        result.put("requestedGenericResources",
+                prettifyGenericResources(componentPageInfo.get_resources_map()));
 
         result.put("schedulerDisplayResource", config.get(DaemonConfig.SCHEDULER_DISPLAY_RESOURCE));
         result.put("topologyId", id);
diff --git a/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/component-page-template.html b/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/component-page-template.html
index 21a5b3a..3862a03 100644
--- a/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/component-page-template.html
+++ b/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/component-page-template.html
@@ -55,6 +55,12 @@
             Requested CPU
           </span>
         </th>
+        <th>
+          <span data-toggle="tooltip" data-placement="above" title="The generic resources requested to run a single executor of this component.">
+            Requested Generic Resources
+          </span>
+        </th>
+
         {{/schedulerDisplayResource}}
         {{#eventLogLink}}
         <th>
@@ -75,6 +81,7 @@
         <td>{{requestedMemOnHeap}}</td>
         <td>{{requestedMemOffHeap}}</td>
         <td>{{requestedCpu}}</td>
+        <td>{{requestedGenericResources}}</td>
         {{/schedulerDisplayResource}}
         {{#eventLogLink}}
         <td><a href="{{eventLogLink}}">events</a></td>
diff --git a/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/index-page-template.html b/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/index-page-template.html
index a60e578..c0fb62f 100644
--- a/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/index-page-template.html
+++ b/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/index-page-template.html
@@ -169,7 +169,16 @@
              CPU Utilization (%)
             </span>
         </th>
-      </tr>
+        <th>
+        <span data-toggle="tooltip" data-placement="top" title="Total Generic Resources in Cluster.">
+             Total Generic Resources
+            </span>
+        </th>
+        <th>
+        <span data-toggle="tooltip" data-placement="top" title="Available Generic Resources in Cluster.">
+             Available Generic Resources
+            </span>
+        </th>
       </thead>
       <tbody>
       <tr>
@@ -181,6 +190,8 @@
         <td>{{availCpu}}</td>
         <td>{{fragmentedCpu}}</td>
         <td>{{cpuAssignedPercentUtil}}</td>
+        <td>{{totalGenerics}}</td>
+        <td>{{availGenerics}}</td>
       </tr>
       </tbody>
     </table>
@@ -307,6 +318,11 @@
         </th>
         {{/schedulerDisplayResource}}
         <th>
+          <span data-toggle="tooltip" data-placement="top" title="Assigned Generic Rescources by Scheduler.">
+            Assigned Generic Resources
+          </span>
+        </th>
+        <th>
           <span data-toggle="tooltip" data-placement="left" title="This shows information from the scheduler about the latest attempt to schedule the Topology on the cluster.">
             Scheduler Info
           </span>
@@ -338,6 +354,7 @@
         {{#schedulerDisplayResource}}
         <td>{{assignedCpu}}</td>
         {{/schedulerDisplayResource}}
+        <td>{{assignedGenericResources}}</td>
         <td>{{schedulerInfo}}</td>
         <td>{{topologyVersion}}</td>
         <td>{{stormVersion}}</td>
@@ -413,6 +430,23 @@
           Avail CPU (%)
         </span>
       </th>
+
+      <th>
+        <span data-toggle="tooltip" data-placement="left" title="The generic resources capacity of a supervisor.">
+          Total Generic Resources
+        </span>
+      </th>
+      <th>
+        <span data-toggle="tooltip" data-placement="left" title="The generic resources that have been allocated.">
+          Used Generic Resources
+        </span>
+      </th>
+      <th>
+        <span data-toggle="tooltip" data-placement="left" title="The generic resources that are available.">
+          Avail Generic Resources
+        </span>
+      </th>
+
       {{/schedulerDisplayResource}}
       <th>
         <span data-toggle="tooltip" data-placement="left" title="Version">
@@ -444,6 +478,9 @@
       <td>{{totalCpu}}</td>
       <td>{{usedCpu}}</td>
       <td>{{availCpu}}</td>
+      <td>{{totalGenericResources}}</td>
+      <td>{{usedGenericResources}}</td>
+      <td>{{availGenericResources}}</td>
       {{/schedulerDisplayResource}}
       <td>{{version}}</td>
       <td>{{blacklisted}}</td>
diff --git a/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/supervisor-page-template.html b/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/supervisor-page-template.html
index 3475f12..6e16e3a 100644
--- a/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/supervisor-page-template.html
+++ b/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/supervisor-page-template.html
@@ -76,6 +76,23 @@
               Avail CPU (%)
             </span>
           </th>
+
+          <th>
+            <span data-toggle="tooltip" data-placement="left" title="The generic resources capacity of a supervisor.">
+              Total Generic Resources
+            </span>
+          </th>
+          <th>
+            <span data-toggle="tooltip" data-placement="left" title="The generic resources that have been allocated.">
+              Used Generic Resources
+            </span>
+          </th>
+          <th>
+            <span data-toggle="tooltip" data-placement="left" title="The generic resources that are available.">
+              Avail Generic Resources
+            </span>
+          </th>
+
           {{/schedulerDisplayResource}}
           <th>
             <span data-toggle="tooltip" data-placement="top" title="Version">
@@ -106,6 +123,9 @@
             <td>{{totalCpu}}</td>
             <td>{{usedCpu}}</td>
             <td>{{availCpu}}</td>
+            <td>{{totalGenericResources}}</td>
+            <td>{{usedGenericResources}}</td>
+            <td>{{availGenericResources}}</td>
             {{/schedulerDisplayResource}}
             <td>{{version}}</td>
             <td>{{blacklisted}}</td>
diff --git a/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/topology-page-template.html b/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/topology-page-template.html
index 49cb314..b67e302 100644
--- a/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/topology-page-template.html
+++ b/storm-webapp/src/main/java/org/apache/storm/daemon/ui/WEB-INF/templates/topology-page-template.html
@@ -76,6 +76,11 @@
         </th>
         {{/schedulerDisplayResource}}
         <th>
+          <span data-toggle="tooltip" data-placement="top" title="Assigned Generic Rescources by Scheduler.">
+            Assigned Generic Resources
+          </span>
+        </th>
+        <th>
           <span data-toggle="tooltip" data-placement="left" title="This shows information from the scheduler about the latest attempt to schedule the Topology on the cluster.">
             Scheduler Info
           </span>
@@ -106,6 +111,7 @@
         <td>{{assignedTotalMem}}</td>
         {{#schedulerDisplayResource}}
         <td>{{assignedCpu}}</td>
+        <td>{{assignedGenericResources}}</td>
         {{/schedulerDisplayResource}}
         <td>{{schedulerInfo}}</td>
         <td>{{topologyVersion}}</td>
@@ -150,6 +156,11 @@
             Total CPU (%)
           </span>
         </th>
+        <th>
+          <span data-toggle="tooltip" data-placement="top" title="Total Generic Resources.">
+            Total Generic Resources
+          </span>
+        </th>
       </tr>
     </thead>
     <tbody>
@@ -161,6 +172,7 @@
         <td>{{requestedSharedOffHeapMem}}</td>
         <td>{{requestedTotalMem}}</td>
         <td>{{requestedCpu}}</td>
+        <td>{{requestedGenericResources}}</td>
       </tr>
       <tr>
         <td>Assigned</td>
@@ -170,6 +182,7 @@
         <td>{{assignedSharedOffHeapMem}}</td>
         <td>{{assignedTotalMem}}</td>
         <td>{{assignedCpu}}</td>
+        <td>{{assignedGenericResources}}</td>
       </tr>
     </tbody>
   </table>
@@ -375,6 +388,11 @@
             Req CPU
           </span>
         </th>
+        <th class="header table-num">
+          <span data-toggle="tooltip" data-placement="top" title="The generic resources requested to run a single executor of this component.">
+            Req Generic
+          </span>
+        </th>
         {{/schedulerDisplayResource}}
         <th class="header table-num">
           <span data-toggle="tooltip" data-placement="top" title="The number of Tuples emitted.">
@@ -417,6 +435,7 @@
         <td>{{requestedMemOnHeap}}</td>
         <td>{{requestedMemOffHeap}}</td>
         <td>{{requestedCpu}}</td>
+        <td>{{requestedGenericResourcesComp}}</td>
         {{/schedulerDisplayResource}}
         <td>{{emitted}}</td>
         <td>{{transferred}}</td>
@@ -472,6 +491,11 @@
             Req CPU
           </span>
         </th>
+        <th class="header table-num">
+          <span data-toggle="tooltip" data-placement="top" title="The generic resources requested to run a single executor of this component.">
+            Req Generic
+          </span>
+        </th>
         {{/schedulerDisplayResource}}
         <th class="header table-num">
           <span data-toggle="tooltip" data-placement="top" title="The number of Tuples emitted.">
@@ -528,6 +552,7 @@
         <td>{{requestedMemOnHeap}}</td>
         <td>{{requestedMemOffHeap}}</td>
         <td>{{requestedCpu}}</td>
+        <td>{{requestedGenericResourcesComp}}</td>
         {{/schedulerDisplayResource}}
         <td>{{emitted}}</td>
         <td>{{transferred}}</td>