diff --git a/extensions/openpower-pels/mtms.cpp b/extensions/openpower-pels/mtms.cpp
new file mode 100644
index 0000000..355431f
--- /dev/null
+++ b/extensions/openpower-pels/mtms.cpp
@@ -0,0 +1,80 @@
+#include "mtms.hpp"
+
+namespace openpower
+{
+namespace pels
+{
+
+MTMS::MTMS()
+{
+    memset(_machineTypeAndModel.data(), 0, mtmSize);
+    memset(_serialNumber.data(), 0, snSize);
+}
+
+MTMS::MTMS(const std::string& typeModel, const std::string& serialNumber)
+{
+    memset(_machineTypeAndModel.data(), 0, mtmSize);
+    memset(_serialNumber.data(), 0, snSize);
+
+    // Copy in as much as the fields as possible
+    for (size_t i = 0; i < mtmSize; i++)
+    {
+        if (typeModel.size() > i)
+        {
+            _machineTypeAndModel[i] = typeModel[i];
+        }
+    }
+
+    for (size_t i = 0; i < snSize; i++)
+    {
+        if (serialNumber.size() > i)
+        {
+            _serialNumber[i] = serialNumber[i];
+        }
+    }
+}
+
+MTMS::MTMS(Stream& stream)
+{
+    for (size_t i = 0; i < mtmSize; i++)
+    {
+        stream >> _machineTypeAndModel[i];
+    }
+
+    for (size_t i = 0; i < snSize; i++)
+    {
+        stream >> _serialNumber[i];
+    }
+}
+
+Stream& operator<<(Stream& s, MTMS& mtms)
+{
+    for (size_t i = 0; i < MTMS::mtmSize; i++)
+    {
+        s << mtms.machineTypeAndModel()[i];
+    }
+
+    for (size_t i = 0; i < MTMS::snSize; i++)
+    {
+        s << mtms.machineSerialNumber()[i];
+    }
+
+    return s;
+}
+
+Stream& operator>>(Stream& s, MTMS& mtms)
+{
+    for (size_t i = 0; i < MTMS::mtmSize; i++)
+    {
+        s >> mtms.machineTypeAndModel()[i];
+    }
+
+    for (size_t i = 0; i < MTMS::snSize; i++)
+    {
+        s >> mtms.machineSerialNumber()[i];
+    }
+
+    return s;
+}
+} // namespace pels
+} // namespace openpower
diff --git a/extensions/openpower-pels/mtms.hpp b/extensions/openpower-pels/mtms.hpp
new file mode 100644
index 0000000..fe8723d
--- /dev/null
+++ b/extensions/openpower-pels/mtms.hpp
@@ -0,0 +1,128 @@
+#pragma once
+
+#include "stream.hpp"
+
+#include <string>
+
+namespace openpower
+{
+namespace pels
+{
+
+/** @class MTMS
+ *
+ * (M)achine (T)ype-(M)odel (S)erialNumber
+ *
+ * Represents the PEL's Machine Type / Model / Serial Number
+ * structure, which shows up in multiple places in a PEL.
+ *
+ * It holds 8 bytes for the Type+Model, and 12 for the SN.
+ * Unused bytes are set to 0s.
+ *
+ * The type and model are combined into a single field.
+ */
+class MTMS
+{
+  public:
+    MTMS(const MTMS&) = default;
+    MTMS& operator=(const MTMS&) = default;
+    MTMS(MTMS&&) = default;
+    MTMS& operator=(MTMS&&) = default;
+    ~MTMS() = default;
+
+    enum
+    {
+        mtmSize = 8,
+        snSize = 12
+    };
+
+    /**
+     * @brief Constructor
+     */
+    MTMS();
+
+    /**
+     * @brief Constructor
+     *
+     * @param[in] typeModel - The machine type+model
+     * @param[in] serialNumber - The machine serial number
+     */
+    MTMS(const std::string& typeModel, const std::string& serialNumber);
+
+    /**
+     * @brief Constructor
+     *
+     * Fills in this class's data fields from the stream.
+     *
+     * @param[in] pel - the PEL data stream
+     */
+    explicit MTMS(Stream& stream);
+
+    /**
+     * @brief Returns the machine type/model value
+     *
+     * @return std::array<uint8_t, mtmSize>&  - The TM value
+     */
+    std::array<uint8_t, mtmSize>& machineTypeAndModel()
+    {
+        return _machineTypeAndModel;
+    }
+
+    /**
+     * @brief Returns the machine serial number value
+     *
+     * @return std::array<uint8_t, snSize>& - The SN value
+     */
+    std::array<uint8_t, snSize>& machineSerialNumber()
+    {
+        return _serialNumber;
+    }
+
+    /**
+     * @brief Returns the size of the data when flattened
+     *
+     * @return size_t - The size of the data
+     */
+    static constexpr size_t flattenedSize()
+    {
+        return mtmSize + snSize;
+    }
+
+  private:
+    /**
+     * @brief The type+model value
+     *
+     *     Of the form TTTT-MMM where:
+     *        TTTT = machine type
+     *        MMM = machine model
+     */
+    std::array<uint8_t, mtmSize> _machineTypeAndModel;
+
+    /**
+     * @brief Machine Serial Number
+     */
+    std::array<uint8_t, snSize> _serialNumber;
+};
+
+/**
+ * @brief Stream extraction operator for MTMS
+ *
+ * @param[in] s - the stream
+ * @param[out] mtms - the MTMS object
+ *
+ * @return Stream&
+ */
+Stream& operator>>(Stream& s, MTMS& mtms);
+
+/**
+ * @brief Stream insertion operator for MTMS
+ *
+ * @param[out] s - the stream
+ * @param[in] mtms - the MTMS object
+ *
+ * @return Stream&
+ */
+Stream& operator<<(Stream& s, MTMS& mtms);
+
+} // namespace pels
+} // namespace openpower
diff --git a/extensions/openpower-pels/openpower-pels.mk b/extensions/openpower-pels/openpower-pels.mk
index def28a1..6a58db8 100644
--- a/extensions/openpower-pels/openpower-pels.mk
+++ b/extensions/openpower-pels/openpower-pels.mk
@@ -3,6 +3,7 @@
 	extensions/openpower-pels/entry_points.cpp \
 	extensions/openpower-pels/log_id.cpp \
 	extensions/openpower-pels/manager.cpp \
+	extensions/openpower-pels/mtms.cpp \
 	extensions/openpower-pels/paths.cpp \
 	extensions/openpower-pels/pel.cpp \
 	extensions/openpower-pels/private_header.cpp \
