diff --git a/src/renderers/MeasuringEquipmentRenderer.js b/src/renderers/MeasuringEquipmentRenderer.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d23e010ac179faeb6ad1f7e5cd5af42c3608a27
--- /dev/null
+++ b/src/renderers/MeasuringEquipmentRenderer.js
@@ -0,0 +1,189 @@
+// src/renderers/MeasuringEquipmentRenderer.js
+import { DCCRealListQuantity } from "../dccQuantity.js";
+
+export class MeasuringEquipmentRenderer {
+    constructor(equipmentData, language) {
+        // equipmentData may be a single object or an array of measuringEquipment elements
+        this.data = Array.isArray(equipmentData)
+            ? equipmentData
+            : [equipmentData];
+        this.language = language;
+    }
+
+    render() {
+        const container = document.createElement("div");
+        container.innerHTML = `<h3>Measuring Equipment</h3>`;
+        this.data.forEach((equip) => {
+            // Create collapsible section for each equipment
+            const details = document.createElement("details");
+            details.style.border = "1px solid #ccc";
+            details.style.padding = "8px";
+            details.style.marginBottom = "10px";
+
+            // Build the summary (collapsed view)
+            const summary = document.createElement("summary");
+            summary.style.fontWeight = "bold";
+            // Equipment name
+            const equipName = this._getText(equip["dcc:name"]);
+            // Manufacturer name (if available)
+            let manufacturerName = "";
+            if (equip["dcc:manufacturer"] && equip["dcc:manufacturer"]["dcc:name"]) {
+                manufacturerName = this._getText(equip["dcc:manufacturer"]["dcc:name"]);
+            }
+            // Model
+            const model = equip["dcc:model"] ? equip["dcc:model"].trim() : "";
+            // First identification (if available)
+            let firstId = "";
+            if (
+                equip["dcc:identifications"] &&
+                equip["dcc:identifications"]["dcc:identification"]
+            ) {
+                let ids = equip["dcc:identifications"]["dcc:identification"];
+                if (!Array.isArray(ids)) {
+                    ids = [ids];
+                }
+                const id0 = ids[0];
+                // Get identification name (small label) and value
+                const idName = this._getText(id0["dcc:name"]);
+                const idValue = id0["dcc:value"] ? id0["dcc:value"].trim() : "";
+                firstId = `<span style="font-size:smaller;">${idName}: ${idValue}</span>`;
+            }
+            summary.innerHTML = `${equipName} – ${manufacturerName} – ${model} ${firstId}`;
+            details.appendChild(summary);
+
+            // Expanded content
+            const contentDiv = document.createElement("div");
+            contentDiv.style.marginTop = "8px";
+            contentDiv.style.fontFamily = "sans-serif";
+
+            // Render full identifications table
+            if (equip["dcc:identifications"] && equip["dcc:identifications"]["dcc:identification"]) {
+                const ids = Array.isArray(equip["dcc:identifications"]["dcc:identification"])
+                    ? equip["dcc:identifications"]["dcc:identification"]
+                    : [equip["dcc:identifications"]["dcc:identification"]];
+                const idTable = document.createElement("table");
+                idTable.style.width = "100%";
+                idTable.style.borderCollapse = "collapse";
+                // Header row
+                const idHeaderRow = document.createElement("tr");
+                ["Identification", "Issuer", "Value"].forEach((text) => {
+                    const th = document.createElement("th");
+                    th.textContent = text;
+                    th.style.border = "1px solid #ccc";
+                    th.style.padding = "4px";
+                    idHeaderRow.appendChild(th);
+                });
+                idTable.appendChild(idHeaderRow);
+                // Data rows
+                ids.forEach((id) => {
+                    const tr = document.createElement("tr");
+                    // Identification name (small label)
+                    const tdName = document.createElement("td");
+                    tdName.style.border = "1px solid #ccc";
+                    tdName.style.padding = "4px";
+                    tdName.style.fontSize = "smaller";
+                    tdName.textContent = this._getText(id["dcc:name"]);
+                    tr.appendChild(tdName);
+                    // Issuer
+                    const tdIssuer = document.createElement("td");
+                    tdIssuer.style.border = "1px solid #ccc";
+                    tdIssuer.style.padding = "4px";
+                    tdIssuer.textContent = id["dcc:issuer"] ? id["dcc:issuer"].trim() : "";
+                    tr.appendChild(tdIssuer);
+                    // Value
+                    const tdValue = document.createElement("td");
+                    tdValue.style.border = "1px solid #ccc";
+                    tdValue.style.padding = "4px";
+                    tdValue.textContent = id["dcc:value"] ? id["dcc:value"].trim() : "";
+                    tr.appendChild(tdValue);
+                    idTable.appendChild(tr);
+                });
+                contentDiv.appendChild(idTable);
+            }
+
+            // Render measuring equipment quantities table (if available)
+            if (
+                equip["dcc:measuringEquipmentQuantities"] &&
+                equip["dcc:measuringEquipmentQuantities"]["dcc:measuringEquipmentQuantity"]
+            ) {
+                const qtys = Array.isArray(
+                    equip["dcc:measuringEquipmentQuantities"]["dcc:measuringEquipmentQuantity"]
+                )
+                    ? equip["dcc:measuringEquipmentQuantities"]["dcc:measuringEquipmentQuantity"]
+                    : [equip["dcc:measuringEquipmentQuantities"]["dcc:measuringEquipmentQuantity"]];
+                const qtyTable = document.createElement("table");
+                qtyTable.style.width = "100%";
+                qtyTable.style.borderCollapse = "collapse";
+                // Header row
+                const qtyHeaderRow = document.createElement("tr");
+                ["Quantity", "Value", "Unit", "Uncertainty"].forEach((text) => {
+                    const th = document.createElement("th");
+                    th.textContent = text;
+                    th.style.border = "1px solid #ccc";
+                    th.style.padding = "4px";
+                    qtyHeaderRow.appendChild(th);
+                });
+                qtyTable.appendChild(qtyHeaderRow);
+                // Data rows: use DCCRealListQuantity for each measuringEquipmentQuantity
+                qtys.forEach((q) => {
+                    const row = document.createElement("tr");
+                    // Quantity name
+                    const tdName = document.createElement("td");
+                    tdName.style.border = "1px solid #ccc";
+                    tdName.style.padding = "4px";
+                    tdName.textContent = this._getText(q["dcc:name"]);
+                    row.appendChild(tdName);
+                    // Value
+                    const tdValue = document.createElement("td");
+                    tdValue.style.border = "1px solid #ccc";
+                    tdValue.style.padding = "4px";
+                    // Create a DCCRealListQuantity instance to extract values, unit, uncertainty
+                    const realQty = new DCCRealListQuantity(q);
+                    const values = realQty.getValues();
+                    tdValue.textContent = values.join(" / ");
+                    row.appendChild(tdValue);
+                    // Unit
+                    const tdUnit = document.createElement("td");
+                    tdUnit.style.border = "1px solid #ccc";
+                    tdUnit.style.padding = "4px";
+                    const rawUnit = q["si:realListXMLList"] && q["si:realListXMLList"]["si:unitXMLList"]
+                        ? q["si:realListXMLList"]["si:unitXMLList"].trim()
+                        : "";
+                    if (rawUnit) {
+                        const unitObj = new DSIUnit(rawUnit);
+                        // Here we return plain text instead of HTML markup for the table cell
+                        tdUnit.textContent = unitObj.toString();
+                    }
+                    row.appendChild(tdUnit);
+                    // Uncertainty
+                    const tdUnc = document.createElement("td");
+                    tdUnc.style.border = "1px solid #ccc";
+                    tdUnc.style.padding = "4px";
+                    const uncValues = realQty.getUncertainty();
+                    tdUnc.textContent = uncValues.length ? uncValues.join(" / ") : "";
+                    row.appendChild(tdUnc);
+                    qtyTable.appendChild(row);
+                });
+                contentDiv.appendChild(qtyTable);
+            }
+
+            // Append expanded content to details
+            details.appendChild(contentDiv);
+            container.appendChild(details);
+        });
+        return container;
+    }
+
+    // Helper to extract language-specific text from a node
+    _getText(node) {
+        if (!node) return "";
+        const content = node["dcc:content"];
+        if (Array.isArray(content)) {
+            const match = content.find((item) => item.$ && item.$.lang === this.language) || content[0];
+            return match._ || match;
+        }
+        return content._ || content;
+    }
+
+    // (Optional) You can add additional helper methods to render other parts of the data
+}