diff --git a/configure.ac b/configure.ac
index e5f2d81..f3dee4a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -164,6 +164,10 @@
             nlohmann/json.hpp,
             [],
             [AC_MSG_ERROR([Could not find nlohmann/json.hpp])]])
+       [AC_CHECK_HEADER(
+            fifo_map.hpp,
+            [],
+            [AC_MSG_ERROR([Could not find fifo_map.hpp])]])
 )
 
 AC_CONFIG_HEADERS([config.h])
diff --git a/extensions/openpower-pels/openpower-pels.mk b/extensions/openpower-pels/openpower-pels.mk
index d974e06..f028293 100644
--- a/extensions/openpower-pels/openpower-pels.mk
+++ b/extensions/openpower-pels/openpower-pels.mk
@@ -1,7 +1,8 @@
 phosphor_log_manager_SOURCES += \
 	extensions/openpower-pels/entry_points.cpp \
 	extensions/openpower-pels/manager.cpp \
-	extensions/openpower-pels/repository.cpp
+	extensions/openpower-pels/repository.cpp \
+	extensions/openpower-pels/user_data.cpp
 
 phosphor_log_manager_LDADD = \
 	libpel.la
@@ -32,7 +33,6 @@
 	extensions/openpower-pels/src.cpp \
 	extensions/openpower-pels/section_factory.cpp \
 	extensions/openpower-pels/severity.cpp \
-	extensions/openpower-pels/user_data.cpp \
 	extensions/openpower-pels/user_header.cpp
 
 libpel_ldflags =  \
@@ -56,5 +56,9 @@
 
 bin_PROGRAMS += peltool
 
-peltool_SOURCES = extensions/openpower-pels/tools/peltool.cpp
+peltool_SOURCES = \
+	extensions/openpower-pels/tools/peltool.cpp \
+	extensions/openpower-pels/user_data.cpp \
+	extensions/openpower-pels/user_data_json.cpp
 peltool_LDADD = libpel.la
+peltool_CXXFLAGS = "-DPELTOOL"
diff --git a/extensions/openpower-pels/pel.cpp b/extensions/openpower-pels/pel.cpp
index 74d46bd..262865f 100644
--- a/extensions/openpower-pels/pel.cpp
+++ b/extensions/openpower-pels/pel.cpp
@@ -214,7 +214,8 @@
 
 } // namespace util
 
-void PEL::printSectionInJSON(const Section& section, std::string& buf) const
+void PEL::printSectionInJSON(const Section& section, std::string& buf,
+                             std::map<uint16_t, size_t>& pluralSections) const
 {
     char tmpB[5];
     uint8_t id[] = {static_cast<uint8_t>(section.header().id >> 8),
@@ -224,6 +225,15 @@
     std::string sectionName = pv::sectionTitles.count(sectionID)
                                   ? pv::sectionTitles.at(sectionID)
                                   : "Unknown Section";
+
+    // Add a count if there are multiple of this type of section
+    auto count = pluralSections.find(section.header().id);
+    if (count != pluralSections.end())
+    {
+        sectionName += " " + std::to_string(count->second);
+        count->second++;
+    }
+
     if (section.valid())
     {
         auto json = section.getJSON();
@@ -248,14 +258,46 @@
     }
 }
 
+std::map<uint16_t, size_t> PEL::getPluralSections() const
+{
+    std::map<uint16_t, size_t> sectionCounts;
+
+    for (const auto& section : optionalSections())
+    {
+        if (sectionCounts.find(section->header().id) == sectionCounts.end())
+        {
+            sectionCounts[section->header().id] = 1;
+        }
+        else
+        {
+            sectionCounts[section->header().id]++;
+        }
+    }
+
+    std::map<uint16_t, size_t> sections;
+    for (const auto& [id, count] : sectionCounts)
+    {
+        if (count > 1)
+        {
+            // Start with 0 here and printSectionInJSON()
+            // will increment it as it goes.
+            sections.emplace(id, 0);
+        }
+    }
+
+    return sections;
+}
+
 void PEL::toJSON() const
 {
+    auto sections = getPluralSections();
+
     std::string buf = "{";
-    printSectionInJSON(*(_ph.get()), buf);
-    printSectionInJSON(*(_uh.get()), buf);
+    printSectionInJSON(*(_ph.get()), buf, sections);
+    printSectionInJSON(*(_uh.get()), buf, sections);
     for (auto& section : this->optionalSections())
     {
-        printSectionInJSON(*(section.get()), buf);
+        printSectionInJSON(*(section.get()), buf, sections);
     }
     buf += "}";
     std::size_t found = buf.rfind(",");
diff --git a/extensions/openpower-pels/pel.hpp b/extensions/openpower-pels/pel.hpp
index 139fda8..ccbef91 100644
--- a/extensions/openpower-pels/pel.hpp
+++ b/extensions/openpower-pels/pel.hpp
@@ -286,6 +286,14 @@
     void checkRulesAndFix();
 
     /**
+     * @brief Returns a map of the section IDs that appear more than once
+     *        in the PEL.  The data value for each entry will be set to 0.
+     *
+     * @return std::map<uint16_t, size_t>
+     */
+    std::map<uint16_t, size_t> getPluralSections() const;
+
+    /**
      * @brief The PEL Private Header section
      */
     std::unique_ptr<PrivateHeader> _ph;
@@ -304,8 +312,11 @@
      * @brief helper function for printing PELs.
      * @param[in] Section& - section object reference
      * @param[in] std::string - PEL string
+     * @param[in|out] pluralSections - Map used to track sections counts for
+     *                                 when there is more than 1.
      */
-    void printSectionInJSON(const Section& section, std::string& buf) const;
+    void printSectionInJSON(const Section& section, std::string& buf,
+                            std::map<uint16_t, size_t>& pluralSections) const;
 };
 
 namespace util
diff --git a/extensions/openpower-pels/user_data.cpp b/extensions/openpower-pels/user_data.cpp
index 8036131..70acbbb 100644
--- a/extensions/openpower-pels/user_data.cpp
+++ b/extensions/openpower-pels/user_data.cpp
@@ -15,7 +15,12 @@
  */
 #include "user_data.hpp"
 
+#include "json_utils.hpp"
 #include "pel_types.hpp"
+#include "user_data_formats.hpp"
+#ifdef PELTOOL
+#include "user_data_json.hpp"
+#endif
 
 #include <phosphor-logging/log.hpp>
 
@@ -90,5 +95,14 @@
     }
 }
 
+std::optional<std::string> UserData::getJSON() const
+{
+#ifdef PELTOOL
+    return user_data::getJSON(_header.componentID, _header.subType,
+                              _header.version, _data);
+#endif
+    return std::nullopt;
+}
+
 } // namespace pels
 } // namespace openpower
diff --git a/extensions/openpower-pels/user_data.hpp b/extensions/openpower-pels/user_data.hpp
index ce691b8..3594849 100644
--- a/extensions/openpower-pels/user_data.hpp
+++ b/extensions/openpower-pels/user_data.hpp
@@ -80,6 +80,14 @@
         return _data;
     }
 
+    /**
+     * @brief Get the section contents in JSON
+     *
+     * @return The JSON as a string if a parser was found,
+     *         otherwise std::nullopt.
+     */
+    std::optional<std::string> getJSON() const override;
+
   private:
     /**
      * @brief Fills in the object from the stream data
diff --git a/extensions/openpower-pels/user_data_json.cpp b/extensions/openpower-pels/user_data_json.cpp
new file mode 100644
index 0000000..a86ccb3
--- /dev/null
+++ b/extensions/openpower-pels/user_data_json.cpp
@@ -0,0 +1,153 @@
+/**
+ * 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 "user_data_json.hpp"
+
+#include "pel_types.hpp"
+#include "user_data_formats.hpp"
+
+#include <fifo_map.hpp>
+#include <iomanip>
+#include <nlohmann/json.hpp>
+#include <phosphor-logging/log.hpp>
+#include <sstream>
+
+namespace openpower::pels::user_data
+{
+
+using namespace phosphor::logging;
+
+// Use fifo_map as nlohmann::json's map. We are just ignoring the 'less'
+// compare.  With this map the keys are kept in FIFO order.
+template <class K, class V, class dummy_compare, class A>
+using fifoMap = nlohmann::fifo_map<K, V, nlohmann::fifo_map_compare<K>, A>;
+using fifoJSON = nlohmann::basic_json<fifoMap>;
+
+/**
+ * @brief Returns a JSON string for use by PEL::printSectionInJSON().
+ *
+ * The returning string will contain a JSON object, but without
+ * the outer {}.  If the input JSON isn't a JSON object (dict), then
+ * one will be created with the input added to a 'Data' key.
+ *
+ * @param[in] json - The JSON to convert to a string
+ *
+ * @return std::string - The JSON string
+ */
+std::string prettyJSON(uint16_t componentID, uint8_t subType, uint8_t version,
+                       const fifoJSON& json)
+{
+    fifoJSON output;
+    output["Section Version"] = std::to_string(version);
+    output["Sub-section type"] = std::to_string(subType);
+
+    char value[10];
+    sprintf(value, "0x%04X", componentID);
+    output["Created by"] = std::string{value};
+
+    if (!json.is_object())
+    {
+        output["Data"] = json;
+    }
+    else
+    {
+        for (const auto& [key, value] : json.items())
+        {
+            output[key] = value;
+        }
+    }
+
+    // Let nlohmann do the pretty printing.
+    std::stringstream stream;
+    stream << std::setw(4) << output;
+
+    auto jsonString = stream.str();
+
+    // Now it looks like:
+    // {
+    //     "Section Version": ...
+    //     ...
+    // }
+
+    // Since PEL::printSectionInJSON() will supply the outer { }s,
+    // remove the existing ones.
+
+    // Replace the { and the following newline, and the } and its
+    // preceeding newline.
+    jsonString.erase(0, 2);
+
+    auto pos = jsonString.find_last_of('}');
+    jsonString.erase(pos - 1);
+
+    return jsonString;
+}
+
+/**
+ * @brief Convert to an appropriate JSON string as the data is one of
+ *        the formats that we natively support.
+ *
+ * @param[in] componentID - The comp ID from the UserData section header
+ * @param[in] subType - The subtype from the UserData section header
+ * @param[in] version - The version from the UserData section header
+ * @param[in] data - The data itself
+ *
+ * @return std::optional<std::string> - The JSON string if it could be created,
+ *                                      else std::nullopt.
+ */
+std::optional<std::string>
+    getBuiltinFormatJSON(uint16_t componentID, uint8_t subType, uint8_t version,
+                         const std::vector<uint8_t>& data)
+{
+    switch (subType)
+    {
+        case static_cast<uint8_t>(UserDataFormat::json):
+        {
+            std::string jsonString{data.begin(), data.begin() + data.size()};
+
+            fifoJSON json = nlohmann::json::parse(jsonString);
+
+            return prettyJSON(componentID, subType, version, json);
+        }
+        default:
+            break;
+    }
+    return std::nullopt;
+}
+
+std::optional<std::string> getJSON(uint16_t componentID, uint8_t subType,
+                                   uint8_t version,
+                                   const std::vector<uint8_t>& data)
+{
+    try
+    {
+        switch (componentID)
+        {
+            case static_cast<uint16_t>(ComponentID::phosphorLogging):
+                return getBuiltinFormatJSON(componentID, subType, version,
+                                            data);
+            default:
+                break;
+        }
+    }
+    catch (std::exception& e)
+    {
+        log<level::ERR>("Failed parsing UserData", entry("ERROR=%s", e.what()));
+    }
+
+    return std::nullopt;
+}
+
+} // namespace openpower::pels::user_data
diff --git a/extensions/openpower-pels/user_data_json.hpp b/extensions/openpower-pels/user_data_json.hpp
new file mode 100644
index 0000000..64fac79
--- /dev/null
+++ b/extensions/openpower-pels/user_data_json.hpp
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <optional>
+#include <string>
+#include <vector>
+
+namespace openpower::pels::user_data
+{
+
+/**
+ * @brief  Returns the UserData contents as a formatted JSON string.
+ *
+ * @param[in] componentID - The comp ID from the UserData section header
+ * @param[in] subType - The subtype from the UserData section header
+ * @param[in] version - The version from the UserData section header
+ * @param[in] data - The section data
+ *
+ * @return std::optional<std::string> - The JSON string if it could be created,
+ *                                      else std::nullopt.
+ */
+std::optional<std::string> getJSON(uint16_t componentID, uint8_t subType,
+                                   uint8_t version,
+                                   const std::vector<uint8_t>& data);
+
+} // namespace openpower::pels::user_data
