diff --git a/control/json/Makefile.am b/control/json/Makefile.am
index a367767..5f480f5 100644
--- a/control/json/Makefile.am
+++ b/control/json/Makefile.am
@@ -15,4 +15,5 @@
 	manager.cpp \
 	profile.cpp \
 	fan.cpp \
-	zone.cpp
+	zone.cpp \
+	group.cpp
diff --git a/control/json/group.cpp b/control/json/group.cpp
new file mode 100644
index 0000000..a022338
--- /dev/null
+++ b/control/json/group.cpp
@@ -0,0 +1,65 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "group.hpp"
+
+#include <nlohmann/json.hpp>
+#include <phosphor-logging/log.hpp>
+#include <sdbusplus/bus.hpp>
+
+namespace phosphor::fan::control::json
+{
+
+using json = nlohmann::json;
+using namespace phosphor::logging;
+
+Group::Group(sdbusplus::bus::bus& bus, const json& jsonObj) :
+    ConfigBase(jsonObj), _service("")
+{
+    if (jsonObj.contains("profiles"))
+    {
+        for (const auto& profile : jsonObj["profiles"])
+        {
+            _profiles.emplace_back(profile.get<std::string>());
+        }
+    }
+    setMembers(jsonObj);
+    // Setting the group's service name is optional
+    if (jsonObj.contains("service"))
+    {
+        setService(jsonObj);
+    }
+}
+
+void Group::setMembers(const json& jsonObj)
+{
+    if (!jsonObj.contains("members"))
+    {
+        log<level::ERR>("Missing required group's members",
+                        entry("JSON=%s", jsonObj.dump().c_str()));
+        throw std::runtime_error("Missing required group's members");
+    }
+    for (const auto& member : jsonObj["members"])
+    {
+        _members.emplace_back(member.get<std::string>());
+    }
+}
+
+void Group::setService(const json& jsonObj)
+{
+    _service = jsonObj["service"].get<std::string>();
+}
+
+} // namespace phosphor::fan::control::json
diff --git a/control/json/group.hpp b/control/json/group.hpp
new file mode 100644
index 0000000..7cc84e9
--- /dev/null
+++ b/control/json/group.hpp
@@ -0,0 +1,113 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "config_base.hpp"
+
+#include <nlohmann/json.hpp>
+#include <sdbusplus/bus.hpp>
+
+namespace phosphor::fan::control::json
+{
+
+using json = nlohmann::json;
+
+/**
+ * @class Group - Represents a group of dbus objects for configured events
+ *
+ * A group contains a list of dbus objects that are logically grouped together
+ * to be used within one-or-more configured fan control events. An event object
+ * is configured to apply a set of actions against a list of groups that could
+ * result in a fan control speed change. A group may also be configured against
+ * a list of profiles(OPTIONAL) and or denote a specific service(OPTIONAL) that
+ * serves the list of dbus objects in the group.
+ *
+ * (When no profile for a group is given, the group defaults to always be used
+ * within the events its included in)
+ *
+ */
+class Group : public ConfigBase
+{
+  public:
+    /* JSON file name for groups */
+    static constexpr auto confFileName = "groups.json";
+
+    Group() = delete;
+    Group(const Group&) = delete;
+    Group(Group&&) = delete;
+    Group& operator=(const Group&) = delete;
+    Group& operator=(Group&&) = delete;
+    ~Group() = default;
+
+    /**
+     * Constructor
+     * Parses and populates a configuration group from JSON object data
+     *
+     * @param[in] bus - sdbusplus bus object
+     * @param[in] jsonObj - JSON object
+     */
+    Group(sdbusplus::bus::bus& bus, const json& jsonObj);
+
+    /**
+     * @brief Get the members
+     *
+     * @return List of dbus paths representing the members of the group
+     */
+    inline const auto& getMembers() const
+    {
+        return _members;
+    }
+
+    /**
+     * @brief Get the service
+     *
+     * @return Service name serving the members of the group
+     */
+    inline const auto& getService() const
+    {
+        return _service;
+    }
+
+  private:
+    /* Members of the group */
+    std::vector<std::string> _members;
+
+    /* Service name serving all the members */
+    std::string _service;
+
+    /**
+     * @brief Parse and set the members list
+     *
+     * @param[in] jsonObj - JSON object for the group
+     *
+     * Sets the list of dbus paths making up the members of the group
+     */
+    void setMembers(const json& jsonObj);
+
+    /**
+     * @brief Parse and set the service name(OPTIONAL)
+     *
+     * @param[in] jsonObj - JSON object for the group
+     *
+     * Sets the service name serving the members. It is recommended this service
+     * name be provided for a group containing members served by the fan control
+     * application itself, otherwise they may not be mapped correctly into any
+     * configured events.
+     */
+    void setService(const json& jsonObj);
+};
+
+} // namespace phosphor::fan::control::json
diff --git a/control/json_parser.cpp b/control/json_parser.cpp
index 65773c1..b16bfc1 100644
--- a/control/json_parser.cpp
+++ b/control/json_parser.cpp
@@ -16,6 +16,7 @@
 #include "json_parser.hpp"
 
 #include "json/fan.hpp"
+#include "json/group.hpp"
 #include "json/manager.hpp"
 #include "json/profile.hpp"
 #include "json/zone.hpp"
@@ -36,6 +37,8 @@
     auto fans = getConfig<json::Fan>(bus);
     // Zones within the system
     auto zones = getConfig<json::Zone>(bus);
+    // Groups to include in events
+    auto groups = getConfig<json::Group>(bus);
 
     // TODO Create zone groups after loading all JSON config files
 
