diff --git a/monitor/json_parser.cpp b/monitor/json_parser.cpp
new file mode 100644
index 0000000..61c8e80
--- /dev/null
+++ b/monitor/json_parser.cpp
@@ -0,0 +1,116 @@
+/**
+ * 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 "json_parser.hpp"
+
+#include "json_config.hpp"
+#include "nonzero_speed_trust.hpp"
+#include "types.hpp"
+
+#include <nlohmann/json.hpp>
+#include <phosphor-logging/log.hpp>
+
+#include <algorithm>
+#include <map>
+#include <memory>
+#include <vector>
+
+namespace phosphor::fan::monitor
+{
+
+using json = nlohmann::json;
+using namespace phosphor::logging;
+
+namespace tClass
+{
+
+// Get a constructed trust group class for a non-zero speed group
+CreateGroupFunction
+    getNonZeroSpeed(const std::vector<trust::GroupDefinition>& group)
+{
+    return [group]() {
+        return std::make_unique<trust::NonzeroSpeed>(std::move(group));
+    };
+}
+
+} // namespace tClass
+
+const std::map<std::string, trustHandler> trusts = {
+    {"nonzerospeed", tClass::getNonZeroSpeed}};
+
+const std::vector<CreateGroupFunction> getTrustGrps(const json& obj)
+{
+    std::vector<CreateGroupFunction> grpFuncs;
+
+    if (obj.contains("sensor_trust_groups"))
+    {
+        for (auto& stg : obj["sensor_trust_groups"])
+        {
+            if (!stg.contains("class") || !stg.contains("group"))
+            {
+                // Log error on missing required parameters
+                log<level::ERR>(
+                    "Missing required fan monitor trust group parameters",
+                    entry("REQUIRED_PARAMETERS=%s", "{class, group}"));
+                throw std::runtime_error(
+                    "Missing required fan trust group parameters");
+            }
+            auto tgClass = stg["class"].get<std::string>();
+            std::vector<trust::GroupDefinition> group;
+            for (auto& member : stg["group"])
+            {
+                // Construct list of group members
+                if (!member.contains("name"))
+                {
+                    // Log error on missing required parameter
+                    log<level::ERR>(
+                        "Missing required fan monitor trust group member name",
+                        entry("CLASS=%s", tgClass.c_str()));
+                    throw std::runtime_error(
+                        "Missing required fan monitor trust group member name");
+                }
+                auto in_trust = true;
+                if (member.contains("in_trust"))
+                {
+                    in_trust = member["in_trust"].get<bool>();
+                }
+                group.emplace_back(trust::GroupDefinition{
+                    member["name"].get<std::string>(), in_trust});
+            }
+            // The class for fan sensor trust groups
+            // (Must have a supported function within the tClass namespace)
+            std::transform(tgClass.begin(), tgClass.end(), tgClass.begin(),
+                           tolower);
+            auto handler = trusts.find(tgClass);
+            if (handler != trusts.end())
+            {
+                // Call function for trust group class
+                grpFuncs.emplace_back(handler->second(group));
+            }
+            else
+            {
+                // Log error on unsupported trust group class
+                log<level::ERR>("Invalid fan monitor trust group class",
+                                entry("CLASS=%s", tgClass.c_str()));
+                throw std::runtime_error(
+                    "Invalid fan monitor trust group class");
+            }
+        }
+    }
+
+    return grpFuncs;
+}
+
+} // namespace phosphor::fan::monitor
diff --git a/monitor/json_parser.hpp b/monitor/json_parser.hpp
index d632d1b..f8d1f4a 100644
--- a/monitor/json_parser.hpp
+++ b/monitor/json_parser.hpp
@@ -16,6 +16,8 @@
 #pragma once
 
 #include "json_config.hpp"
+#include "trust_group.hpp"
+#include "types.hpp"
 
 #include <nlohmann/json.hpp>
 #include <sdbusplus/bus.hpp>
@@ -28,6 +30,10 @@
 constexpr auto confAppName = "monitor";
 constexpr auto confFileName = "config.json";
 
+// Trust group class handler function
+using trustHandler = std::function<CreateGroupFunction(
+    const std::vector<trust::GroupDefinition>&)>;
+
 /**
  * @brief Get the JSON object
  *
@@ -42,4 +48,13 @@
         fan::JsonConfig::getConfFile(bus, confAppName, confFileName));
 }
 
+/**
+ * @brief Get any configured trust groups
+ *
+ * @param[in] obj - JSON object to parse from
+ *
+ * @return List of functions applied on trust groups
+ */
+const std::vector<CreateGroupFunction> getTrustGrps(const json& obj);
+
 } // namespace phosphor::fan::monitor
diff --git a/monitor/main.cpp b/monitor/main.cpp
index e8b736b..52d5bdb 100644
--- a/monitor/main.cpp
+++ b/monitor/main.cpp
@@ -66,6 +66,10 @@
 #ifdef MONITOR_USE_JSON
     // Get JSON object from monitor JSON config file
     const auto& jsonObj = getJsonObj(bus);
+
+    // Retrieve and set trust groups within the trust manager
+    auto trust =
+        std::make_unique<phosphor::fan::trust::Manager>(getTrustGrps(jsonObj));
 #else
     auto trust = std::make_unique<phosphor::fan::trust::Manager>(trustGroups);
 
