diff --git a/gui/tests/artifacts.js b/gui/tests/artifacts.js
index 198e68c5366575df7f6c5be2d720124e12d25bdd..18cac03931652cee506428e9381df5d4766fc29b 100644
--- a/gui/tests/artifacts.js
+++ b/gui/tests/artifacts.js
@@ -1271,6 +1271,153 @@ window.nomadArtifacts = {
       ],
       "aggregatable": false
     },
+    "results.material.elemental_composition.element": {
+      "name": "element",
+      "description": "The symbol of the element, e.g. 'Pb'.",
+      "type": {
+        "type_kind": "Enum",
+        "type_data": [
+          "H",
+          "He",
+          "Li",
+          "Be",
+          "B",
+          "C",
+          "N",
+          "O",
+          "F",
+          "Ne",
+          "Na",
+          "Mg",
+          "Al",
+          "Si",
+          "P",
+          "S",
+          "Cl",
+          "Ar",
+          "K",
+          "Ca",
+          "Sc",
+          "Ti",
+          "V",
+          "Cr",
+          "Mn",
+          "Fe",
+          "Co",
+          "Ni",
+          "Cu",
+          "Zn",
+          "Ga",
+          "Ge",
+          "As",
+          "Se",
+          "Br",
+          "Kr",
+          "Rb",
+          "Sr",
+          "Y",
+          "Zr",
+          "Nb",
+          "Mo",
+          "Tc",
+          "Ru",
+          "Rh",
+          "Pd",
+          "Ag",
+          "Cd",
+          "In",
+          "Sn",
+          "Sb",
+          "Te",
+          "I",
+          "Xe",
+          "Cs",
+          "Ba",
+          "La",
+          "Ce",
+          "Pr",
+          "Nd",
+          "Pm",
+          "Sm",
+          "Eu",
+          "Gd",
+          "Tb",
+          "Dy",
+          "Ho",
+          "Er",
+          "Tm",
+          "Yb",
+          "Lu",
+          "Hf",
+          "Ta",
+          "W",
+          "Re",
+          "Os",
+          "Ir",
+          "Pt",
+          "Au",
+          "Hg",
+          "Tl",
+          "Pb",
+          "Bi",
+          "Po",
+          "At",
+          "Rn",
+          "Fr",
+          "Ra",
+          "Ac",
+          "Th",
+          "Pa",
+          "U",
+          "Np",
+          "Pu",
+          "Am",
+          "Cm",
+          "Bk",
+          "Cf",
+          "Es",
+          "Fm",
+          "Md",
+          "No",
+          "Lr",
+          "Rf",
+          "Db",
+          "Sg",
+          "Bh",
+          "Hs",
+          "Mt",
+          "Ds",
+          "Rg",
+          "Cn",
+          "Nh",
+          "Fl",
+          "Mc",
+          "Lv",
+          "Ts",
+          "Og"
+        ]
+      },
+      "aggregatable": true,
+      "suggestion": true
+    },
+    "results.material.elemental_composition.atomic_fraction": {
+      "name": "atomic_fraction",
+      "description": "The atomic fraction of the element in the system it is contained within.\nPer definition a positive value less than or equal to 1.",
+      "type": {
+        "type_kind": "numpy",
+        "type_data": "float64"
+      },
+      "aggregatable": false
+    },
+    "results.material.elemental_composition.mass_fraction": {
+      "name": "mass_fraction",
+      "description": "The mass fraction of the element in the system it is contained within.\nPer definition a positive value less than or equal to 1.",
+      "type": {
+        "type_kind": "numpy",
+        "type_data": "float64"
+      },
+      "aggregatable": false
+    },
     "results.material.symmetry.bravais_lattice": {
       "name": "bravais_lattice",
       "description": "Identifier for the Bravais lattice in Pearson notation. The first lowercase letter\nidentifies the crystal family and can be one of the following: a (triclinic), b\n(monoclinic), o (orthorhombic), t (tetragonal), h (hexagonal) or c (cubic). The\nsecond uppercase letter identifies the centring and can be one of the following: P\n(primitive), S (face centred), I (body centred), R (rhombohedral centring) or F\n(all faces centred).",
@@ -1827,6 +1974,153 @@ window.nomadArtifacts = {
       "shape": [],
       "aggregatable": false
     },
+    "results.material.topology.elemental_composition.element": {
+      "name": "element",
+      "description": "The symbol of the element, e.g. 'Pb'.",
+      "type": {
+        "type_kind": "Enum",
+        "type_data": [
+          "H",
+          "He",
+          "Li",
+          "Be",
+          "B",
+          "C",
+          "N",
+          "O",
+          "F",
+          "Ne",
+          "Na",
+          "Mg",
+          "Al",
+          "Si",
+          "P",
+          "S",
+          "Cl",
+          "Ar",
+          "K",
+          "Ca",
+          "Sc",
+          "Ti",
+          "V",
+          "Cr",
+          "Mn",
+          "Fe",
+          "Co",
+          "Ni",
+          "Cu",
+          "Zn",
+          "Ga",
+          "Ge",
+          "As",
+          "Se",
+          "Br",
+          "Kr",
+          "Rb",
+          "Sr",
+          "Y",
+          "Zr",
+          "Nb",
+          "Mo",
+          "Tc",
+          "Ru",
+          "Rh",
+          "Pd",
+          "Ag",
+          "Cd",
+          "In",
+          "Sn",
+          "Sb",
+          "Te",
+          "I",
+          "Xe",
+          "Cs",
+          "Ba",
+          "La",
+          "Ce",
+          "Pr",
+          "Nd",
+          "Pm",
+          "Sm",
+          "Eu",
+          "Gd",
+          "Tb",
+          "Dy",
+          "Ho",
+          "Er",
+          "Tm",
+          "Yb",
+          "Lu",
+          "Hf",
+          "Ta",
+          "W",
+          "Re",
+          "Os",
+          "Ir",
+          "Pt",
+          "Au",
+          "Hg",
+          "Tl",
+          "Pb",
+          "Bi",
+          "Po",
+          "At",
+          "Rn",
+          "Fr",
+          "Ra",
+          "Ac",
+          "Th",
+          "Pa",
+          "U",
+          "Np",
+          "Pu",
+          "Am",
+          "Cm",
+          "Bk",
+          "Cf",
+          "Es",
+          "Fm",
+          "Md",
+          "No",
+          "Lr",
+          "Rf",
+          "Db",
+          "Sg",
+          "Bh",
+          "Hs",
+          "Mt",
+          "Ds",
+          "Rg",
+          "Cn",
+          "Nh",
+          "Fl",
+          "Mc",
+          "Lv",
+          "Ts",
+          "Og"
+        ]
+      },
+      "aggregatable": true,
+      "suggestion": true
+    },
+    "results.material.topology.elemental_composition.atomic_fraction": {
+      "name": "atomic_fraction",
+      "description": "The atomic fraction of the element in the system it is contained within.\nPer definition a positive value less than or equal to 1.",
+      "type": {
+        "type_kind": "numpy",
+        "type_data": "float64"
+      },
+      "aggregatable": false
+    },
+    "results.material.topology.elemental_composition.mass_fraction": {
+      "name": "mass_fraction",
+      "description": "The mass fraction of the element in the system it is contained within.\nPer definition a positive value less than or equal to 1.",
+      "type": {
+        "type_kind": "numpy",
+        "type_data": "float64"
+      },
+      "aggregatable": false
+    },
     "results.material.topology.system_relation.type": {
       "name": "type",
       "description": "The type of relation between a system and it's parent.\n\n| Value | Description |\n| --------- | ----------------------- |\n| `'root'` | System representing the entire structure, has no parent system. |\n| `'subsystem'` | A single logical entity extracted from the parent system. |\n| `'group'` | A logical group of subsystems within the parent, e.g. a group of molecules in MD. |\n| `'primitive_cell'` | The conventional cell from which the parent is constructed from. |\n| `'conventional_cell'` | The primitive cell from which the parent is constructed from. |",
@@ -3779,10 +4073,16 @@ window.nomadArtifacts = {
     },
     "results.material": {
       "name": "material",
-      "description": "\n        Contains information that is specific to bulk crystalline materials.\n        ",
+      "description": "\n        Section containing information on the material composition and structure.\n        ",
       "nested": false,
       "repeats": false
     },
+    "results.material.elemental_composition": {
+      "name": "elemental_composition",
+      "description": "\n        Section containing information about the concentration of an element,\n        given by its atomic and mass fraction within the system or material.\n        ",
+      "nested": true,
+      "repeats": true
+    },
     "results.material.symmetry": {
       "name": "symmetry",
       "description": "\n        Section containing information about the symmetry of the material. All\n        of these properties are derived by running a symmetry analysis on a\n        representative geometry from the original data. This original geometry\n        is stored in results.properties together with the primitive and\n        conventional structures.\n        ",
@@ -3801,6 +4101,12 @@ window.nomadArtifacts = {
       "nested": false,
       "repeats": true
     },
+    "results.material.topology.elemental_composition": {
+      "name": "elemental_composition",
+      "description": "\n        Section containing information about the concentration of an element,\n        given by its atomic and mass fraction within the system or material.\n        ",
+      "nested": true,
+      "repeats": true
+    },
     "results.material.topology.system_relation": {
       "name": "system_relation",
       "description": "Contains information about the relation between two different systems.",
@@ -12116,6 +12422,198 @@ window.nomadArtifacts = {
             "m_def": "nomad.metainfo.metainfo.Section",
             "m_parent_index": 2,
             "m_parent_sub_section": "section_definitions",
+            "name": "ElementalComposition",
+            "description": "\n        Section containing information about the concentration of an element,\n        given by its atomic and mass fraction within the system or material.\n        ",
+            "more": {
+              "label_quantity": "element"
+            },
+            "quantities": [
+              {
+                "m_def": "nomad.metainfo.metainfo.Quantity",
+                "m_parent_index": 0,
+                "m_parent_sub_section": "quantities",
+                "m_annotations": {
+                  "elasticsearch": [
+                    "results.material.topology.elemental_composition.element",
+                    "results.material.topology.elemental_composition.element__suggestion.suggestion"
+                  ]
+                },
+                "name": "element",
+                "description": "The symbol of the element, e.g. 'Pb'.",
+                "type": {
+                  "type_kind": "Enum",
+                  "type_data": [
+                    "H",
+                    "He",
+                    "Li",
+                    "Be",
+                    "B",
+                    "C",
+                    "N",
+                    "O",
+                    "F",
+                    "Ne",
+                    "Na",
+                    "Mg",
+                    "Al",
+                    "Si",
+                    "P",
+                    "S",
+                    "Cl",
+                    "Ar",
+                    "K",
+                    "Ca",
+                    "Sc",
+                    "Ti",
+                    "V",
+                    "Cr",
+                    "Mn",
+                    "Fe",
+                    "Co",
+                    "Ni",
+                    "Cu",
+                    "Zn",
+                    "Ga",
+                    "Ge",
+                    "As",
+                    "Se",
+                    "Br",
+                    "Kr",
+                    "Rb",
+                    "Sr",
+                    "Y",
+                    "Zr",
+                    "Nb",
+                    "Mo",
+                    "Tc",
+                    "Ru",
+                    "Rh",
+                    "Pd",
+                    "Ag",
+                    "Cd",
+                    "In",
+                    "Sn",
+                    "Sb",
+                    "Te",
+                    "I",
+                    "Xe",
+                    "Cs",
+                    "Ba",
+                    "La",
+                    "Ce",
+                    "Pr",
+                    "Nd",
+                    "Pm",
+                    "Sm",
+                    "Eu",
+                    "Gd",
+                    "Tb",
+                    "Dy",
+                    "Ho",
+                    "Er",
+                    "Tm",
+                    "Yb",
+                    "Lu",
+                    "Hf",
+                    "Ta",
+                    "W",
+                    "Re",
+                    "Os",
+                    "Ir",
+                    "Pt",
+                    "Au",
+                    "Hg",
+                    "Tl",
+                    "Pb",
+                    "Bi",
+                    "Po",
+                    "At",
+                    "Rn",
+                    "Fr",
+                    "Ra",
+                    "Ac",
+                    "Th",
+                    "Pa",
+                    "U",
+                    "Np",
+                    "Pu",
+                    "Am",
+                    "Cm",
+                    "Bk",
+                    "Cf",
+                    "Es",
+                    "Fm",
+                    "Md",
+                    "No",
+                    "Lr",
+                    "Rf",
+                    "Db",
+                    "Sg",
+                    "Bh",
+                    "Hs",
+                    "Mt",
+                    "Ds",
+                    "Rg",
+                    "Cn",
+                    "Nh",
+                    "Fl",
+                    "Mc",
+                    "Lv",
+                    "Ts",
+                    "Og"
+                  ]
+                }
+              },
+              {
+                "m_def": "nomad.metainfo.metainfo.Quantity",
+                "m_parent_index": 1,
+                "m_parent_sub_section": "quantities",
+                "name": "mass",
+                "description": "The (average) mass of the element.",
+                "type": {
+                  "type_kind": "numpy",
+                  "type_data": "float64"
+                },
+                "unit": "kilogram"
+              },
+              {
+                "m_def": "nomad.metainfo.metainfo.Quantity",
+                "m_parent_index": 2,
+                "m_parent_sub_section": "quantities",
+                "m_annotations": {
+                  "elasticsearch": [
+                    "results.material.topology.elemental_composition.atomic_fraction"
+                  ]
+                },
+                "name": "atomic_fraction",
+                "description": "The atomic fraction of the element in the system it is contained within.\nPer definition a positive value less than or equal to 1.",
+                "type": {
+                  "type_kind": "numpy",
+                  "type_data": "float64"
+                }
+              },
+              {
+                "m_def": "nomad.metainfo.metainfo.Quantity",
+                "m_parent_index": 3,
+                "m_parent_sub_section": "quantities",
+                "m_annotations": {
+                  "elasticsearch": [
+                    "results.material.topology.elemental_composition.mass_fraction"
+                  ]
+                },
+                "name": "mass_fraction",
+                "description": "The mass fraction of the element in the system it is contained within.\nPer definition a positive value less than or equal to 1.",
+                "type": {
+                  "type_kind": "numpy",
+                  "type_data": "float64"
+                }
+              }
+            ]
+          },
+          {
+            "m_def": "nomad.metainfo.metainfo.Section",
+            "m_parent_index": 3,
+            "m_parent_sub_section": "section_definitions",
             "name": "LatticeParameters",
             "description": "\n        Lattice parameters of a cell.\n        ",
             "quantities": [
@@ -12225,7 +12723,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 3,
+            "m_parent_index": 4,
             "m_parent_sub_section": "section_definitions",
             "name": "WyckoffSet",
             "description": "\n        Section for storing Wyckoff set information. Only available for\n        conventional cells that have undergone symmetry analysis.\n        ",
@@ -12303,7 +12801,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 4,
+            "m_parent_index": 5,
             "m_parent_sub_section": "section_definitions",
             "name": "Structure",
             "description": "\n        Describes an atomistic structure.\n        ",
@@ -12464,21 +12962,21 @@ window.nomadArtifacts = {
                 "m_parent_index": 1,
                 "m_parent_sub_section": "sub_sections",
                 "name": "lattice_parameters",
-                "sub_section": "/packages/5/section_definitions/2"
+                "sub_section": "/packages/5/section_definitions/3"
               },
               {
                 "m_def": "nomad.metainfo.metainfo.SubSection",
                 "m_parent_index": 2,
                 "m_parent_sub_section": "sub_sections",
                 "name": "wyckoff_sets",
-                "sub_section": "/packages/5/section_definitions/3",
+                "sub_section": "/packages/5/section_definitions/4",
                 "repeats": true
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 5,
+            "m_parent_index": 6,
             "m_parent_sub_section": "section_definitions",
             "name": "Structures",
             "description": "\n        Contains full atomistic representations of the material in different\n        forms.\n        ",
@@ -12489,7 +12987,7 @@ window.nomadArtifacts = {
                 "m_parent_sub_section": "sub_sections",
                 "name": "structure_original",
                 "description": "Contains a selected representative structure from the the original\ndata.",
-                "sub_section": "/packages/5/section_definitions/4",
+                "sub_section": "/packages/5/section_definitions/5",
                 "repeats": false
               },
               {
@@ -12498,7 +12996,7 @@ window.nomadArtifacts = {
                 "m_parent_sub_section": "sub_sections",
                 "name": "structure_conventional",
                 "description": "Contains the conventional structure that is derived from\nstructure_original. This conventional stucture has been idealized and\nthe conventions employed by spglib are used.",
-                "sub_section": "/packages/5/section_definitions/4",
+                "sub_section": "/packages/5/section_definitions/5",
                 "repeats": false
               },
               {
@@ -12507,14 +13005,14 @@ window.nomadArtifacts = {
                 "m_parent_sub_section": "sub_sections",
                 "name": "structure_primitive",
                 "description": "Contains the primitive structure that is derived from\nstructure_original. This primitive stucture has been idealized and the\nconventions employed by spglib are used.",
-                "sub_section": "/packages/5/section_definitions/4",
+                "sub_section": "/packages/5/section_definitions/5",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 6,
+            "m_parent_index": 7,
             "m_parent_sub_section": "section_definitions",
             "name": "Symmetry",
             "description": "\n        Section containing information about the symmetry of the material. All\n        of these properties are derived by running a symmetry analysis on a\n        representative geometry from the original data. This original geometry\n        is stored in results.properties together with the primitive and\n        conventional structures.\n        ",
@@ -12755,7 +13253,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 7,
+            "m_parent_index": 8,
             "m_parent_sub_section": "section_definitions",
             "name": "Cell",
             "description": "\n        Properties of a unit cell.\n        ",
@@ -12936,7 +13434,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 8,
+            "m_parent_index": 9,
             "m_parent_sub_section": "section_definitions",
             "name": "Prototype",
             "description": "Information on the prototype corresponding to the current section.",
@@ -13020,7 +13518,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 9,
+            "m_parent_index": 10,
             "m_parent_sub_section": "section_definitions",
             "name": "SymmetryNew",
             "description": "\n        Section containing information about the symmetry properties of a\n        conventional cell related to a system.\n        ",
@@ -13258,7 +13756,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 10,
+            "m_parent_index": 11,
             "m_parent_sub_section": "section_definitions",
             "name": "Relation",
             "description": "Contains information about the relation between two different systems.",
@@ -13290,7 +13788,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 11,
+            "m_parent_index": 12,
             "m_parent_sub_section": "section_definitions",
             "name": "System",
             "description": "\n        Describes a a structural part that has been identified within the entry.\n        May be related to other systems.\n        ",
@@ -13916,42 +14414,55 @@ window.nomadArtifacts = {
                 "m_def": "nomad.metainfo.metainfo.SubSection",
                 "m_parent_index": 1,
                 "m_parent_sub_section": "sub_sections",
+                "m_annotations": {
+                  "elasticsearch": [
+                    "elemental_composition"
+                  ]
+                },
+                "name": "elemental_composition",
+                "sub_section": "/packages/5/section_definitions/2",
+                "repeats": true
+              },
+              {
+                "m_def": "nomad.metainfo.metainfo.SubSection",
+                "m_parent_index": 2,
+                "m_parent_sub_section": "sub_sections",
                 "name": "system_relation",
-                "sub_section": "/packages/5/section_definitions/10",
+                "sub_section": "/packages/5/section_definitions/11",
                 "repeats": false
               },
               {
                 "m_def": "nomad.metainfo.metainfo.SubSection",
-                "m_parent_index": 2,
+                "m_parent_index": 3,
                 "m_parent_sub_section": "sub_sections",
                 "name": "cell",
-                "sub_section": "/packages/5/section_definitions/7",
+                "sub_section": "/packages/5/section_definitions/8",
                 "repeats": false
               },
               {
                 "m_def": "nomad.metainfo.metainfo.SubSection",
-                "m_parent_index": 3,
+                "m_parent_index": 4,
                 "m_parent_sub_section": "sub_sections",
                 "name": "symmetry",
-                "sub_section": "/packages/5/section_definitions/9",
+                "sub_section": "/packages/5/section_definitions/10",
                 "repeats": false
               },
               {
                 "m_def": "nomad.metainfo.metainfo.SubSection",
-                "m_parent_index": 4,
+                "m_parent_index": 5,
                 "m_parent_sub_section": "sub_sections",
                 "name": "prototype",
-                "sub_section": "/packages/5/section_definitions/8",
+                "sub_section": "/packages/5/section_definitions/9",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 12,
+            "m_parent_index": 13,
             "m_parent_sub_section": "section_definitions",
             "name": "Material",
-            "description": "\n        Contains information that is specific to bulk crystalline materials.\n        ",
+            "description": "\n        Section containing information on the material composition and structure.\n        ",
             "quantities": [
               {
                 "m_def": "nomad.metainfo.metainfo.Quantity",
@@ -14383,13 +14894,26 @@ window.nomadArtifacts = {
                 "m_def": "nomad.metainfo.metainfo.SubSection",
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
+                "m_annotations": {
+                  "elasticsearch": [
+                    "elemental_composition"
+                  ]
+                },
+                "name": "elemental_composition",
+                "sub_section": "/packages/5/section_definitions/2",
+                "repeats": true
+              },
+              {
+                "m_def": "nomad.metainfo.metainfo.SubSection",
+                "m_parent_index": 1,
+                "m_parent_sub_section": "sub_sections",
                 "name": "symmetry",
-                "sub_section": "/packages/5/section_definitions/6",
+                "sub_section": "/packages/5/section_definitions/7",
                 "repeats": false
               },
               {
                 "m_def": "nomad.metainfo.metainfo.SubSection",
-                "m_parent_index": 1,
+                "m_parent_index": 2,
                 "m_parent_sub_section": "sub_sections",
                 "m_annotations": {
                   "elasticsearch": [
@@ -14397,14 +14921,14 @@ window.nomadArtifacts = {
                   ]
                 },
                 "name": "topology",
-                "sub_section": "/packages/5/section_definitions/11",
+                "sub_section": "/packages/5/section_definitions/12",
                 "repeats": true
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 13,
+            "m_parent_index": 14,
             "m_parent_sub_section": "section_definitions",
             "name": "HubbardKanamoriModel",
             "description": "Setup of the Hubbard model used in DFT+U",
@@ -14503,7 +15027,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 14,
+            "m_parent_index": 15,
             "m_parent_sub_section": "section_definitions",
             "name": "DFT",
             "description": "\n        Methodology for a DFT calculation.\n        ",
@@ -14784,14 +15308,14 @@ window.nomadArtifacts = {
                   ]
                 },
                 "name": "hubbard_kanamori_model",
-                "sub_section": "/packages/5/section_definitions/13",
+                "sub_section": "/packages/5/section_definitions/14",
                 "repeats": true
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 15,
+            "m_parent_index": 16,
             "m_parent_sub_section": "section_definitions",
             "name": "Projection",
             "description": "\n        Methodology for a Projection calculation.\n        ",
@@ -14841,7 +15365,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 16,
+            "m_parent_index": 17,
             "m_parent_sub_section": "section_definitions",
             "name": "ExcitedStateMethodology",
             "description": "\n        Methodology for a Excited-State calculation.\n        ",
@@ -14957,12 +15481,12 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 17,
+            "m_parent_index": 18,
             "m_parent_sub_section": "section_definitions",
             "name": "GW",
             "description": "\n        Methodology for a GW calculation.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/16"
+              "/packages/5/section_definitions/17"
             ],
             "quantities": [
               {
@@ -14996,12 +15520,12 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 18,
+            "m_parent_index": 19,
             "m_parent_sub_section": "section_definitions",
             "name": "BSE",
             "description": "\n        Methodology for a BSE calculation.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/16"
+              "/packages/5/section_definitions/17"
             ],
             "quantities": [
               {
@@ -15081,7 +15605,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 19,
+            "m_parent_index": 20,
             "m_parent_sub_section": "section_definitions",
             "name": "DMFT",
             "description": "\n        Methodology for a DMFT calculation.\n        ",
@@ -15210,7 +15734,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 20,
+            "m_parent_index": 21,
             "m_parent_sub_section": "section_definitions",
             "name": "QuantumCircuit",
             "quantities": [
@@ -15251,7 +15775,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 21,
+            "m_parent_index": 22,
             "m_parent_sub_section": "section_definitions",
             "name": "QuantumCMS",
             "quantities": [
@@ -15325,13 +15849,13 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "quantum_circuit",
-                "sub_section": "/packages/5/section_definitions/20"
+                "sub_section": "/packages/5/section_definitions/21"
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 22,
+            "m_parent_index": 23,
             "m_parent_sub_section": "section_definitions",
             "name": "Precision",
             "description": "\n        Contains parameters for controlling or evaluating the convergence of the electronic structure.\n        ",
@@ -15353,7 +15877,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 23,
+            "m_parent_index": 24,
             "m_parent_sub_section": "section_definitions",
             "name": "Simulation",
             "description": "\n        Contains method details for a simulation entry.\n        ",
@@ -15401,7 +15925,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "dft",
-                "sub_section": "/packages/5/section_definitions/14",
+                "sub_section": "/packages/5/section_definitions/15",
                 "repeats": false
               },
               {
@@ -15409,7 +15933,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 1,
                 "m_parent_sub_section": "sub_sections",
                 "name": "projection",
-                "sub_section": "/packages/5/section_definitions/15",
+                "sub_section": "/packages/5/section_definitions/16",
                 "repeats": false
               },
               {
@@ -15417,7 +15941,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 2,
                 "m_parent_sub_section": "sub_sections",
                 "name": "gw",
-                "sub_section": "/packages/5/section_definitions/17",
+                "sub_section": "/packages/5/section_definitions/18",
                 "repeats": false
               },
               {
@@ -15425,7 +15949,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 3,
                 "m_parent_sub_section": "sub_sections",
                 "name": "bse",
-                "sub_section": "/packages/5/section_definitions/18",
+                "sub_section": "/packages/5/section_definitions/19",
                 "repeats": false
               },
               {
@@ -15433,7 +15957,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 4,
                 "m_parent_sub_section": "sub_sections",
                 "name": "dmft",
-                "sub_section": "/packages/5/section_definitions/19",
+                "sub_section": "/packages/5/section_definitions/20",
                 "repeats": false
               },
               {
@@ -15441,7 +15965,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 5,
                 "m_parent_sub_section": "sub_sections",
                 "name": "quantum_cms",
-                "sub_section": "/packages/5/section_definitions/21",
+                "sub_section": "/packages/5/section_definitions/22",
                 "repeats": false
               },
               {
@@ -15449,14 +15973,14 @@ window.nomadArtifacts = {
                 "m_parent_index": 6,
                 "m_parent_sub_section": "sub_sections",
                 "name": "precision",
-                "sub_section": "/packages/5/section_definitions/22",
+                "sub_section": "/packages/5/section_definitions/23",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 24,
+            "m_parent_index": 25,
             "m_parent_sub_section": "section_definitions",
             "name": "Method",
             "description": "\n        Contains a summary of the methodology that has been used in this entry.\n        This methodology applies to all of the reported properties and\n        determines the result of a single energy evalution. The individual\n        properties may be further methodological details affect e.g. the\n        sampling.\n        ",
@@ -15555,14 +16079,14 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "simulation",
-                "sub_section": "/packages/5/section_definitions/23",
+                "sub_section": "/packages/5/section_definitions/24",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 25,
+            "m_parent_index": 26,
             "m_parent_sub_section": "section_definitions",
             "name": "MolecularDynamics",
             "description": "\n        Methodology for molecular dynamics.\n        ",
@@ -15611,7 +16135,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 26,
+            "m_parent_index": 27,
             "m_parent_sub_section": "section_definitions",
             "name": "MDProvenance",
             "description": "\n        Contains provenance information for properties derived from molecular\n        dynamics simulations.\n        ",
@@ -15624,14 +16148,14 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "molecular_dynamics",
-                "sub_section": "/packages/5/section_definitions/25",
+                "sub_section": "/packages/5/section_definitions/26",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 27,
+            "m_parent_index": 28,
             "m_parent_sub_section": "section_definitions",
             "name": "MDPropertySection",
             "description": "\n        Base class for referring to molecular dynamics properties.\n        ",
@@ -15644,14 +16168,14 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "provenance",
-                "sub_section": "/packages/5/section_definitions/26",
+                "sub_section": "/packages/5/section_definitions/27",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 28,
+            "m_parent_index": 29,
             "m_parent_sub_section": "section_definitions",
             "name": "DOS",
             "description": "\n        Base class for density of states information.\n        ",
@@ -15685,22 +16209,22 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 29,
+            "m_parent_index": 30,
             "m_parent_sub_section": "section_definitions",
             "name": "DOSPhonon",
             "description": "\n        Contains the total phonon density of states.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/28"
+              "/packages/5/section_definitions/29"
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 30,
+            "m_parent_index": 31,
             "m_parent_sub_section": "section_definitions",
             "name": "DOSElectronic",
             "description": "\n        Contains the total electronic density of states.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/28"
+              "/packages/5/section_definitions/29"
             ],
             "quantities": [
               {
@@ -15762,7 +16286,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 31,
+            "m_parent_index": 32,
             "m_parent_sub_section": "section_definitions",
             "name": "BandStructure",
             "description": "\n        Base class for band structure information.\n        ",
@@ -15819,22 +16343,22 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 32,
+            "m_parent_index": 33,
             "m_parent_sub_section": "section_definitions",
             "name": "BandStructurePhonon",
             "description": "\n        This section stores information on a vibrational band structure\n        evaluation along one-dimensional pathways in the reciprocal space.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/31"
+              "/packages/5/section_definitions/32"
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 33,
+            "m_parent_index": 34,
             "m_parent_sub_section": "section_definitions",
             "name": "BandStructureElectronic",
             "description": "\n        This section stores information on a electonic band structure\n        evaluation along one-dimensional pathways in the reciprocal space.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/31"
+              "/packages/5/section_definitions/32"
             ],
             "quantities": [
               {
@@ -15885,7 +16409,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 34,
+            "m_parent_index": 35,
             "m_parent_sub_section": "section_definitions",
             "name": "GreensFunctionsElectronic",
             "description": "\n        Base class for Green's functions information.\n        ",
@@ -16011,7 +16535,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 35,
+            "m_parent_index": 36,
             "m_parent_sub_section": "section_definitions",
             "name": "HeatCapacityConstantVolume",
             "description": "\n        Contains the values of the specific (per mass) and isochoric (constant\n        volume) heat capacity at different temperatures.\n        ",
@@ -16043,7 +16567,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 36,
+            "m_parent_index": 37,
             "m_parent_sub_section": "section_definitions",
             "name": "EnergyFreeHelmholtz",
             "description": "\n        Contains the values of the Helmholtz free energy per atom at constant\n        volume and at different temperatures.\n        ",
@@ -16075,7 +16599,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 37,
+            "m_parent_index": 38,
             "m_parent_sub_section": "section_definitions",
             "name": "VibrationalProperties",
             "description": "\n        Vibrational properties.\n        ",
@@ -16085,7 +16609,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "band_structure_phonon",
-                "sub_section": "/packages/5/section_definitions/32",
+                "sub_section": "/packages/5/section_definitions/33",
                 "repeats": false
               },
               {
@@ -16093,7 +16617,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 1,
                 "m_parent_sub_section": "sub_sections",
                 "name": "dos_phonon",
-                "sub_section": "/packages/5/section_definitions/29",
+                "sub_section": "/packages/5/section_definitions/30",
                 "repeats": false
               },
               {
@@ -16101,7 +16625,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 2,
                 "m_parent_sub_section": "sub_sections",
                 "name": "heat_capacity_constant_volume",
-                "sub_section": "/packages/5/section_definitions/35",
+                "sub_section": "/packages/5/section_definitions/36",
                 "repeats": false
               },
               {
@@ -16109,14 +16633,14 @@ window.nomadArtifacts = {
                 "m_parent_index": 3,
                 "m_parent_sub_section": "sub_sections",
                 "name": "energy_free_helmholtz",
-                "sub_section": "/packages/5/section_definitions/36",
+                "sub_section": "/packages/5/section_definitions/37",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 38,
+            "m_parent_index": 39,
             "m_parent_sub_section": "section_definitions",
             "name": "EnergyVolumeCurve",
             "description": "\n        Energy volume curve.\n        ",
@@ -16182,7 +16706,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 39,
+            "m_parent_index": 40,
             "m_parent_sub_section": "section_definitions",
             "name": "BulkModulus",
             "description": "\n        Contains bulk modulus values calculated with different methodologies.\n        ",
@@ -16238,7 +16762,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 40,
+            "m_parent_index": 41,
             "m_parent_sub_section": "section_definitions",
             "name": "ShearModulus",
             "description": "\n        Contains shear modulus values calculated with different methodologies.\n        ",
@@ -16285,7 +16809,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 41,
+            "m_parent_index": 42,
             "m_parent_sub_section": "section_definitions",
             "name": "GeometryOptimization",
             "description": "\n        Geometry optimization results and settings.\n        ",
@@ -16430,14 +16954,14 @@ window.nomadArtifacts = {
                 "m_parent_sub_section": "sub_sections",
                 "name": "structure_optimized",
                 "description": "Contains a structure that is the result of a geometry optimization.",
-                "sub_section": "/packages/5/section_definitions/4",
+                "sub_section": "/packages/5/section_definitions/5",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 42,
+            "m_parent_index": 43,
             "m_parent_sub_section": "section_definitions",
             "name": "MechanicalProperties",
             "description": "\n        Mechanical properties.\n        ",
@@ -16447,7 +16971,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "energy_volume_curve",
-                "sub_section": "/packages/5/section_definitions/38",
+                "sub_section": "/packages/5/section_definitions/39",
                 "repeats": true
               },
               {
@@ -16460,7 +16984,7 @@ window.nomadArtifacts = {
                   ]
                 },
                 "name": "bulk_modulus",
-                "sub_section": "/packages/5/section_definitions/39",
+                "sub_section": "/packages/5/section_definitions/40",
                 "repeats": true
               },
               {
@@ -16473,14 +16997,14 @@ window.nomadArtifacts = {
                   ]
                 },
                 "name": "shear_modulus",
-                "sub_section": "/packages/5/section_definitions/40",
+                "sub_section": "/packages/5/section_definitions/41",
                 "repeats": true
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 43,
+            "m_parent_index": 44,
             "m_parent_sub_section": "section_definitions",
             "name": "ElectronicProperties",
             "description": "\n        Electronic properties.\n        ",
@@ -16503,7 +17027,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 1,
                 "m_parent_sub_section": "sub_sections",
                 "name": "dos_electronic",
-                "sub_section": "/packages/5/section_definitions/30",
+                "sub_section": "/packages/5/section_definitions/31",
                 "repeats": true
               },
               {
@@ -16511,7 +17035,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 2,
                 "m_parent_sub_section": "sub_sections",
                 "name": "band_structure_electronic",
-                "sub_section": "/packages/5/section_definitions/33",
+                "sub_section": "/packages/5/section_definitions/34",
                 "repeats": true
               },
               {
@@ -16519,14 +17043,14 @@ window.nomadArtifacts = {
                 "m_parent_index": 3,
                 "m_parent_sub_section": "sub_sections",
                 "name": "greens_functions_electronic",
-                "sub_section": "/packages/5/section_definitions/34",
+                "sub_section": "/packages/5/section_definitions/35",
                 "repeats": true
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 44,
+            "m_parent_index": 45,
             "m_parent_sub_section": "section_definitions",
             "name": "QuantityDynamic",
             "description": "\n        Contains the values for a quantity at different times.\n        ",
@@ -16572,12 +17096,12 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 45,
+            "m_parent_index": 46,
             "m_parent_sub_section": "section_definitions",
             "name": "VolumeDynamic",
             "description": "\n        Contains volume values evaluated at different times.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/44"
+              "/packages/5/section_definitions/45"
             ],
             "quantities": [
               {
@@ -16597,12 +17121,12 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 46,
+            "m_parent_index": 47,
             "m_parent_sub_section": "section_definitions",
             "name": "PressureDynamic",
             "description": "\n        Contains pressure values evaluated at different times.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/44"
+              "/packages/5/section_definitions/45"
             ],
             "quantities": [
               {
@@ -16622,12 +17146,12 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 47,
+            "m_parent_index": 48,
             "m_parent_sub_section": "section_definitions",
             "name": "TemperatureDynamic",
             "description": "\n        Contains temperature values evaluated at different times.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/44"
+              "/packages/5/section_definitions/45"
             ],
             "quantities": [
               {
@@ -16647,12 +17171,12 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 48,
+            "m_parent_index": 49,
             "m_parent_sub_section": "section_definitions",
             "name": "EnergyDynamic",
             "description": "\n        Contains energy values evaluated at different times.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/44"
+              "/packages/5/section_definitions/45"
             ],
             "quantities": [
               {
@@ -16672,12 +17196,12 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 49,
+            "m_parent_index": 50,
             "m_parent_sub_section": "section_definitions",
             "name": "Trajectory",
             "description": "\n        Thermodynamic properties reported for an ensemble evolving in time.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/27"
+              "/packages/5/section_definitions/28"
             ],
             "quantities": [
               {
@@ -16711,7 +17235,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "temperature",
-                "sub_section": "/packages/5/section_definitions/47",
+                "sub_section": "/packages/5/section_definitions/48",
                 "repeats": false
               },
               {
@@ -16719,7 +17243,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 1,
                 "m_parent_sub_section": "sub_sections",
                 "name": "pressure",
-                "sub_section": "/packages/5/section_definitions/46",
+                "sub_section": "/packages/5/section_definitions/47",
                 "repeats": false
               },
               {
@@ -16727,7 +17251,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 2,
                 "m_parent_sub_section": "sub_sections",
                 "name": "volume",
-                "sub_section": "/packages/5/section_definitions/45",
+                "sub_section": "/packages/5/section_definitions/46",
                 "repeats": false
               },
               {
@@ -16735,14 +17259,14 @@ window.nomadArtifacts = {
                 "m_parent_index": 3,
                 "m_parent_sub_section": "sub_sections",
                 "name": "energy_potential",
-                "sub_section": "/packages/5/section_definitions/48",
+                "sub_section": "/packages/5/section_definitions/49",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 50,
+            "m_parent_index": 51,
             "m_parent_sub_section": "section_definitions",
             "name": "ThermodynamicProperties",
             "description": "\n        Thermodynamic properties.\n        ",
@@ -16757,20 +17281,20 @@ window.nomadArtifacts = {
                   ]
                 },
                 "name": "trajectory",
-                "sub_section": "/packages/5/section_definitions/49",
+                "sub_section": "/packages/5/section_definitions/50",
                 "repeats": true
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 51,
+            "m_parent_index": 52,
             "m_parent_sub_section": "section_definitions",
             "name": "RadiusOfGyration",
             "description": "\n        Contains Radius of Gyration values as a trajectory.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/44",
-              "/packages/5/section_definitions/27"
+              "/packages/5/section_definitions/45",
+              "/packages/5/section_definitions/28"
             ],
             "quantities": [
               {
@@ -16840,12 +17364,12 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 52,
+            "m_parent_index": 53,
             "m_parent_sub_section": "section_definitions",
             "name": "RadialDistributionFunction",
             "description": "\n        Radial distribution function.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/27"
+              "/packages/5/section_definitions/28"
             ],
             "quantities": [
               {
@@ -16956,7 +17480,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 53,
+            "m_parent_index": 54,
             "m_parent_sub_section": "section_definitions",
             "name": "StructuralProperties",
             "description": "\n        Structural properties.\n        ",
@@ -16971,7 +17495,7 @@ window.nomadArtifacts = {
                   ]
                 },
                 "name": "radial_distribution_function",
-                "sub_section": "/packages/5/section_definitions/52",
+                "sub_section": "/packages/5/section_definitions/53",
                 "repeats": true
               },
               {
@@ -16984,19 +17508,19 @@ window.nomadArtifacts = {
                   ]
                 },
                 "name": "radius_of_gyration",
-                "sub_section": "/packages/5/section_definitions/51",
+                "sub_section": "/packages/5/section_definitions/52",
                 "repeats": true
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 54,
+            "m_parent_index": 55,
             "m_parent_sub_section": "section_definitions",
             "name": "MeanSquaredDisplacement",
             "description": "\n        Mean Squared Displacements.\n        ",
             "base_sections": [
-              "/packages/5/section_definitions/27"
+              "/packages/5/section_definitions/28"
             ],
             "quantities": [
               {
@@ -17169,7 +17693,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 55,
+            "m_parent_index": 56,
             "m_parent_sub_section": "section_definitions",
             "name": "DynamicalProperties",
             "description": "\n        Dynamical properties.\n        ",
@@ -17184,14 +17708,14 @@ window.nomadArtifacts = {
                   ]
                 },
                 "name": "mean_squared_displacement",
-                "sub_section": "/packages/5/section_definitions/54",
+                "sub_section": "/packages/5/section_definitions/55",
                 "repeats": true
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 56,
+            "m_parent_index": 57,
             "m_parent_sub_section": "section_definitions",
             "name": "SolarCell",
             "description": "\n        Properties of solar cells.\n        ",
@@ -17463,7 +17987,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 57,
+            "m_parent_index": 58,
             "m_parent_sub_section": "section_definitions",
             "name": "OptoelectronicProperties",
             "description": "\n        Optoelectronic properties.\n        ",
@@ -17473,14 +17997,14 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "solar_cell",
-                "sub_section": "/packages/5/section_definitions/56",
+                "sub_section": "/packages/5/section_definitions/57",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 58,
+            "m_parent_index": 59,
             "m_parent_sub_section": "section_definitions",
             "name": "SpectroscopyProperties",
             "description": "\n        Spectroscopic properties.\n        ",
@@ -17499,7 +18023,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 59,
+            "m_parent_index": 60,
             "m_parent_sub_section": "section_definitions",
             "name": "Properties",
             "description": "\n        Contains the physical properties that have been calculated or used in\n        this entry.\n        ",
@@ -17548,7 +18072,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "structural",
-                "sub_section": "/packages/5/section_definitions/53",
+                "sub_section": "/packages/5/section_definitions/54",
                 "repeats": false
               },
               {
@@ -17556,7 +18080,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 1,
                 "m_parent_sub_section": "sub_sections",
                 "name": "dynamical",
-                "sub_section": "/packages/5/section_definitions/55",
+                "sub_section": "/packages/5/section_definitions/56",
                 "repeats": false
               },
               {
@@ -17564,7 +18088,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 2,
                 "m_parent_sub_section": "sub_sections",
                 "name": "structures",
-                "sub_section": "/packages/5/section_definitions/5",
+                "sub_section": "/packages/5/section_definitions/6",
                 "repeats": false
               },
               {
@@ -17572,7 +18096,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 3,
                 "m_parent_sub_section": "sub_sections",
                 "name": "vibrational",
-                "sub_section": "/packages/5/section_definitions/37",
+                "sub_section": "/packages/5/section_definitions/38",
                 "repeats": false
               },
               {
@@ -17580,7 +18104,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 4,
                 "m_parent_sub_section": "sub_sections",
                 "name": "electronic",
-                "sub_section": "/packages/5/section_definitions/43",
+                "sub_section": "/packages/5/section_definitions/44",
                 "repeats": false
               },
               {
@@ -17588,7 +18112,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 5,
                 "m_parent_sub_section": "sub_sections",
                 "name": "optoelectronic",
-                "sub_section": "/packages/5/section_definitions/57",
+                "sub_section": "/packages/5/section_definitions/58",
                 "repeats": false
               },
               {
@@ -17596,7 +18120,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 6,
                 "m_parent_sub_section": "sub_sections",
                 "name": "mechanical",
-                "sub_section": "/packages/5/section_definitions/42",
+                "sub_section": "/packages/5/section_definitions/43",
                 "repeats": false
               },
               {
@@ -17604,7 +18128,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 7,
                 "m_parent_sub_section": "sub_sections",
                 "name": "thermodynamic",
-                "sub_section": "/packages/5/section_definitions/50",
+                "sub_section": "/packages/5/section_definitions/51",
                 "repeats": false
               },
               {
@@ -17612,7 +18136,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 8,
                 "m_parent_sub_section": "sub_sections",
                 "name": "spectroscopy",
-                "sub_section": "/packages/5/section_definitions/58",
+                "sub_section": "/packages/5/section_definitions/59",
                 "repeats": false
               },
               {
@@ -17620,14 +18144,14 @@ window.nomadArtifacts = {
                 "m_parent_index": 9,
                 "m_parent_sub_section": "sub_sections",
                 "name": "geometry_optimization",
-                "sub_section": "/packages/5/section_definitions/41",
+                "sub_section": "/packages/5/section_definitions/42",
                 "repeats": false
               }
             ]
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 60,
+            "m_parent_index": 61,
             "m_parent_sub_section": "section_definitions",
             "name": "ELN",
             "quantities": [
@@ -17769,7 +18293,7 @@ window.nomadArtifacts = {
           },
           {
             "m_def": "nomad.metainfo.metainfo.Section",
-            "m_parent_index": 61,
+            "m_parent_index": 62,
             "m_parent_sub_section": "section_definitions",
             "name": "Results",
             "description": "\n        Contains a summary of the entry contents.\n        ",
@@ -17779,7 +18303,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 0,
                 "m_parent_sub_section": "sub_sections",
                 "name": "material",
-                "sub_section": "/packages/5/section_definitions/12",
+                "sub_section": "/packages/5/section_definitions/13",
                 "repeats": false
               },
               {
@@ -17787,7 +18311,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 1,
                 "m_parent_sub_section": "sub_sections",
                 "name": "method",
-                "sub_section": "/packages/5/section_definitions/24",
+                "sub_section": "/packages/5/section_definitions/25",
                 "repeats": false
               },
               {
@@ -17795,7 +18319,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 2,
                 "m_parent_sub_section": "sub_sections",
                 "name": "properties",
-                "sub_section": "/packages/5/section_definitions/59",
+                "sub_section": "/packages/5/section_definitions/60",
                 "repeats": false
               },
               {
@@ -17803,7 +18327,7 @@ window.nomadArtifacts = {
                 "m_parent_index": 3,
                 "m_parent_sub_section": "sub_sections",
                 "name": "eln",
-                "sub_section": "/packages/5/section_definitions/60",
+                "sub_section": "/packages/5/section_definitions/61",
                 "repeats": false
               }
             ]
@@ -55115,6 +55639,9 @@ window.nomadArtifacts = {
             "more": {
               "label_quantity": "element"
             },
+            "base_sections": [
+              "/packages/16/section_definitions/0"
+            ],
             "quantities": [
               {
                 "m_def": "nomad.metainfo.metainfo.Quantity",
@@ -55123,7 +55650,7 @@ window.nomadArtifacts = {
                 "m_annotations": {
                   "eln": [
                     {
-                      "component": "EnumEditQuantity"
+                      "component": "AutocompleteEditQuantity"
                     }
                   ]
                 },
@@ -55270,6 +55797,24 @@ window.nomadArtifacts = {
                   "type_kind": "numpy",
                   "type_data": "float64"
                 }
+              },
+              {
+                "m_def": "nomad.metainfo.metainfo.Quantity",
+                "m_parent_index": 2,
+                "m_parent_sub_section": "quantities",
+                "m_annotations": {
+                  "eln": [
+                    {
+                      "component": "NumberEditQuantity"
+                    }
+                  ]
+                },
+                "name": "mass_fraction",
+                "description": "The mass fraction of the element in the system it is contained within.\nPer definition a positive value less than or equal to 1.",
+                "type": {
+                  "type_kind": "numpy",
+                  "type_data": "float64"
+                }
               }
             ]
           },
@@ -61891,7 +62436,7 @@ window.nomadArtifacts = {
                 "categories": [
                   "/packages/17/category_definitions/0"
                 ],
-                "sub_section": "/packages/5/section_definitions/61"
+                "sub_section": "/packages/5/section_definitions/62"
               },
               {
                 "m_def": "nomad.metainfo.metainfo.SubSection",
diff --git a/nomad/atomutils.py b/nomad/atomutils.py
index a7fd98a28544448f92ab9a781bc54902672aed36..15e0fa0df323a5b5417a650785aeb3d1cb6f8815 100644
--- a/nomad/atomutils.py
+++ b/nomad/atomutils.py
@@ -53,8 +53,15 @@ from nomad.aflow_prototypes import aflow_prototypes
 from nomad.constants import atomic_masses
 from nomad.units import ureg
 
+
+valid_elements = set(ase.data.chemical_symbols[1:])
+
 if TYPE_CHECKING:
-    from nomad.datamodel.results import Material
+    from nomad.datamodel.results import (
+        Material,
+        System,
+        ElementalComposition
+    )
 
 
 def get_summed_atomic_mass(atomic_numbers: NDArray[Any]) -> float:
@@ -772,7 +779,8 @@ class Formula():
         return sorted(self.count().keys())
 
     def atomic_fractions(self) -> Dict[str, float]:
-        '''Returns dictionary that maps chemical symbol to atomic fraction.
+        '''
+        Returns dictionary that maps chemical symbol to atomic fraction.
 
         Returns:
             Dict[str, float]: Dictionary with chemical symbol as key and the atomic
@@ -783,29 +791,87 @@ class Formula():
         atomic_fractions = {key: value / total_count for key, value in count.items()}
         return atomic_fractions
 
-    def populate_material(self, material: Material,
-                          descriptive_format: Union[str, None] = 'original') -> None:
-        '''Populates the supplied material object with the list of elements as well as the
-        formulae in the formats: hill, reduced, iupac, anonymous and descriptive.
+    def mass_fractions(self) -> Dict[str, float]:
+        '''
+        Returns a dictionary that maps chemical symbol to mass fraction.
+
+        Returns:
+            Dict[str, float]: Dictionary with chemical symbol as key and the mass
+            fraction as value.
+        '''
+        count = self.count()
+        masses = {
+            element: atomic_masses[ase.data.atomic_numbers[element]] * count
+            for element, count in count.items()
+        }
+        total_mass = sum(masses.values())
+        mass_fractions = {element: mass / total_mass for element, mass in masses.items()}
+        return mass_fractions
+
+    def elemental_composition(self) -> List[ElementalComposition]:
+        '''
+        Returns the atomic and mass fractions as a list of
+        `ElementalComposition` objects. Any unknown elements are ignored.
+
+        Returns:
+            List[ElementalComposition]: The list of `ElementalComposition` objects.
+        '''
+        from nomad.datamodel.results import ElementalComposition
+        atomic_fractions = self.atomic_fractions()
+        mass_fractions = self.mass_fractions()
+        elemental_composition = [
+            ElementalComposition(
+                element=element,
+                atomic_fraction=atomic_fraction,
+                mass_fraction=mass_fractions[element],
+                mass=atomic_masses[ase.data.atomic_numbers[element]],
+            )
+            for element, atomic_fraction in atomic_fractions.items() if element in valid_elements
+        ]
+        return elemental_composition
+
+    def populate(self, section: Union[Material, System],
+                 descriptive_format: Union[str, None] = 'original') -> None:
+        '''
+        Populates the supplied section with the list of elements and elemental
+        compositions as well as the formulae in the formats: hill, reduced, iupac,
+        anonymous and descriptive.
         The descriptive formula defaults to the originally supplied formula but can be
         changed to any other format by supplying the `descriptive_format` argument as:
-        'hill', 'reduced', 'iupac' or 'anonymous'. If descriptive_format is None, no
-        descriptive formula will be added to the material.
+        'hill', 'reduced', 'iupac', 'anonymous' or 'descriptive'. If descriptive_format is
+        None, no descriptive formula will be added to the section.
 
         Args:
-            material (Material): The material object to be populated with elements and
-            formulae.
-            descriptive_format (Union[str, None], optional): The format used for the
-            descriptive formula (see `format` method for details). If None, the materials
-            descriptive formula is not set. Defaults to 'original'.
+            section: The section to be populated with elements and formulae.
+            descriptive_format: The format used for the
+                descriptive formula (see `format` method for details). If None,
+                the materials descriptive formula is not set. Defaults to
+                'original'.
+
+        Raises:
+            ValueError if any of the populated metainfo already exist and would be
+            overwritten.
         '''
-        material.elements = self.elements()
-        material.chemical_formula_hill = self.format('hill')
-        material.chemical_formula_reduced = self.format('reduced')
-        material.chemical_formula_iupac = self.format('iupac')
-        material.chemical_formula_anonymous = self.format('anonymous')
+        for quantity in [
+            'elements',
+            'elemental_composition',
+            'chemical_formula_hill',
+            'chemical_formula_reduced',
+            'chemical_formula_iupac',
+            'chemical_formula_anonymous',
+            'chemical_formula_descriptive',
+        ]:
+            if getattr(section, quantity):
+                raise ValueError(f'Could not populate compositional data as "{quantity}" is already defined.')
+
+        section.elements = self.elements()
+        section.elemental_composition = self.elemental_composition()
+        section.chemical_formula_hill = self.format('hill')
+        section.chemical_formula_reduced = self.format('reduced')
+        section.chemical_formula_iupac = self.format('iupac')
+        section.chemical_formula_anonymous = self.format('anonymous')
         if descriptive_format:
-            material.chemical_formula_descriptive = self.format(descriptive_format)
+            section.chemical_formula_descriptive = self.format(descriptive_format)
 
     def _remove_parentheses(self, formula: str) -> str:
         '''Used to remove parentheses from a formula. E.g. C(2)O(1) becomes C2O1
diff --git a/nomad/datamodel/metainfo/eln/__init__.py b/nomad/datamodel/metainfo/eln/__init__.py
index 048b707ce57bb701e3155d2e0dbb261db71a203a..4d01ab4e8622887a1287d6a8b63de3a81560c975 100644
--- a/nomad/datamodel/metainfo/eln/__init__.py
+++ b/nomad/datamodel/metainfo/eln/__init__.py
@@ -25,6 +25,7 @@ from nomad.units import ureg
 from nomad.datamodel.data import EntryData, ArchiveSection, author_reference, BasicElnCategory
 from nomad.metainfo.metainfo import MSection, MProxy, MEnum, Category, MCategory
 from nomad.datamodel.results import ELN, Results, Material
+from nomad.datamodel.results import ElementalComposition as ResultsElementalComposition
 from nomad.metainfo import Package, Quantity, Datetime, Reference, Section, SubSection
 from ase.data import chemical_symbols, atomic_numbers, atomic_masses
 from nomad.datamodel.metainfo.eln.perovskite_solar_cell_database import (
@@ -185,7 +186,7 @@ class Activity(ElnBaseSection):
             archive.results.eln.methods.append(self.m_def.name)
 
 
-class ElementalComposition(MSection):
+class ElementalComposition(ArchiveSection):
     '''A section for describing the elemental composition of a system, i.e. the element
     and its atomic fraction.
     '''
@@ -195,7 +196,7 @@ class ElementalComposition(MSection):
         description='''
         The symbol of the element, e.g. 'Pb'.
         ''',
-        a_eln=dict(component='EnumEditQuantity'))
+        a_eln=dict(component='AutocompleteEditQuantity'))
     atomic_fraction = Quantity(
         type=np.float64,
         description='''
@@ -204,6 +205,59 @@ class ElementalComposition(MSection):
         ''',
         a_eln=dict(component='NumberEditQuantity')
     )
+    mass_fraction = Quantity(
+        type=np.float64,
+        description='''
+        The mass fraction of the element in the system it is contained within.
+        Per definition a positive value less than or equal to 1.
+        ''',
+        a_eln=dict(component='NumberEditQuantity')
+    )
+
+    def normalize(self, archive, logger: Any) -> None:
+        '''
+        The normalizer for the `ElementalComposition` class. Will add a
+        results.material subsection if none exists. Will append the element to the
+        elements property of that subsection and a
+        nomad.datamodel.results.ElementalComposition instances to the
+        elemental_composition property  using the element and atomic fraction from this
+        section.
+
+        Args:
+            archive (EntryArchive): The archive containing the section that is being
+            normalized.
+            logger (Any): A structlog logger.
+        '''
+        super(ElementalComposition, self).normalize(archive, logger)
+
+        if self.element:
+            if not archive.results:
+                archive.results = Results()
+            if not archive.results.material:
+                archive.results.material = Material()
+
+            if self.element not in chemical_symbols:
+                logger.warn(
+                    f"'{self.element}' is not a valid element symbol and this "
+                    "elemental_composition section will be ignored.")
+            elif self.element not in archive.results.material.elements:
+                archive.results.material.elements += [self.element]
+            if self.atomic_fraction or self.mass_fraction:
+                comp_result_section = archive.results.material.elemental_composition
+                result_composition = ResultsElementalComposition(
+                    element=self.element,
+                    atomic_fraction=self.atomic_fraction,
+                    mass_fraction=self.mass_fraction,
+                    mass=atomic_masses[atomic_numbers[self.element]] * ureg.amu,
+                )
+                existing_elements = [comp.element for comp in comp_result_section]
+                if self.element in existing_elements:
+                    index = existing_elements.index(self.element)
+                    comp_result_section[index].atomic_fraction = self.atomic_fraction
+                    comp_result_section[index].mass_fraction = self.mass_fraction
+                    comp_result_section[index].mass = atomic_masses[atomic_numbers[self.element]] * ureg.amu
+                else:
+                    comp_result_section.append(result_composition)
 
 
 class System(Entity):
@@ -217,10 +271,68 @@ class System(Entity):
         section_def=ElementalComposition,
         repeats=True)
 
+    def _fill_fractions(self, archive, logger: Any) -> None:
+        '''
+        Private method for attempting to fill missing fractions (atomic or mass) in the
+        `ElementalComposition` objects listed in elemental_composition.
+        If a single fraction (of mass or atomic) is left blank it will be calculated from
+        the others. If after this check, all atomic fractions are filled and no mass
+        fractions are, the mass fractions will be calculated from the atomic fractions.
+        similarly, the atomic fractions are calculated from the mass ones if all mass and
+        no atomic fractions are filled.
+
+        Args:
+            archive (EntryArchive): The archive containing the section that is being
+            normalized.
+            logger (Any): A structlog logger.
+
+        Raises:
+            ValueError: If an unknown element is present.
+        '''
+        atomic_fractions = []
+        mass_fractions = []
+        element_masses = []
+        for comp in self.elemental_composition:
+            atomic_fractions.append(comp.atomic_fraction)
+            mass_fractions.append(comp.mass_fraction)
+            if comp.element is None:
+                return
+            elif comp.element not in atomic_numbers:
+                raise ValueError(f'Unknown element symbol: {comp.element}')
+            element_masses.append(atomic_masses[atomic_numbers[comp.element]])
+        atomic_blanks = atomic_fractions.count(None)
+        mass_blanks = mass_fractions.count(None)
+        if atomic_blanks == 1:
+            index = atomic_fractions.index(None)
+            balance = 1 - np.nansum(np.array(atomic_fractions, dtype=np.float64))
+            self.elemental_composition[index].atomic_fraction = balance
+            self.elemental_composition[index].normalize(archive, logger)
+            atomic_fractions[index] = balance
+            atomic_blanks = 0
+        if mass_blanks == 1:
+            index = mass_fractions.index(None)
+            balance = 1 - np.nansum(np.array(mass_fractions, dtype=np.float64))
+            self.elemental_composition[index].mass_fraction = balance
+            self.elemental_composition[index].normalize(archive, logger)
+            mass_fractions[index] = balance
+            mass_blanks = 0
+        if atomic_blanks == 0 and mass_blanks == len(mass_fractions):
+            masses = np.array(atomic_fractions) * np.array(element_masses)
+            mass_fractions = masses / masses.sum()
+            for index, mass_fraction in enumerate(mass_fractions):
+                self.elemental_composition[index].mass_fraction = mass_fraction
+                self.elemental_composition[index].normalize(archive, logger)
+        if mass_blanks == 0 and atomic_blanks == len(atomic_fractions):
+            atoms = np.array(mass_fractions) / np.array(element_masses)
+            atomic_fractions = atoms / atoms.sum()
+            for index, atomic_fraction in enumerate(atomic_fractions):
+                self.elemental_composition[index].atomic_fraction = atomic_fraction
+                self.elemental_composition[index].normalize(archive, logger)
+
     def normalize(self, archive, logger: Any) -> None:
-        '''The normalizer for the `System` class. Will add a results.material subsection
-        if none exists. Will populate the elements property of that subsection with a
-        uniques list of element symbols retrieved from the system elemental_composition.
+        '''
+        The normalizer for the `System` class. Will attempt to fill mass fractions or
+        atomic fractions if left blank.
 
         Args:
             archive (EntryArchive): The archive containing the section that is being
@@ -228,17 +340,9 @@ class System(Entity):
             logger (Any): A structlog logger.
         '''
         super(System, self).normalize(archive, logger)
-        if not archive.results.material:
-            archive.results.material = Material()
-        elements = set()
-        for comp in self.elemental_composition:
-            if comp.element not in chemical_symbols:
-                logger.warn(
-                    f"'{comp.element}' is not a valid element symbol and this "
-                    "elemental_composition section will be ignored.")
-            else:
-                elements.add(comp.element)
-        archive.results.material.elements = list(elements)
+
+        if len(self.elemental_composition) > 0:
+            self._fill_fractions(archive, logger)
 
 
 class Instrument(ElnBaseSection):
@@ -294,7 +398,8 @@ class Component(ArchiveSection):
 
 
 class Ensemble(System):
-    '''A base class for an ensemble of material systems. Each component of the ensemble is
+    '''
+    A base class for an ensemble of material systems. Each component of the ensemble is
     of a (sub)type of `System`.'''
     components = SubSection(
         description='''
@@ -306,7 +411,8 @@ class Ensemble(System):
 
     @staticmethod
     def _atomic_to_mass(composition: List[ElementalComposition], mass: float) -> Dict[str, float]:
-        '''Private static method for converting list of ElementalComposition objects to
+        '''
+        Private static method for converting list of ElementalComposition objects to
         dictionary of element masses with the element symbol as key and mass as value.
 
         Args:
@@ -342,7 +448,8 @@ class Ensemble(System):
 
     @staticmethod
     def _mass_to_atomic(mass_dict: Dict[str, float]) -> List[ElementalComposition]:
-        '''Private static method for converting ditctionary of elements with their masses
+        '''
+        Private static method for converting dictionary of elements with their masses
         to a list of ElementalComposition objects containing atomic fractions.
 
         Args:
@@ -370,7 +477,8 @@ class Ensemble(System):
                 for atomic_fraction, symbol in zip(atomic_fractions, elements)]
 
     def normalize(self, archive, logger: Any) -> None:
-        '''The normalizer for the `Ensemble` class. If the elemental composition list is
+        '''
+        The normalizer for the `Ensemble` class. If the elemental composition list is
         empty, the normalizer will iterate over the components and extract all the
         elements for populating the elemental composition list. If masses are provided for
         all components and the elemental composition of all components contain atomic
@@ -403,6 +511,8 @@ class Ensemble(System):
                     else:
                         mass_dict[element] = mass
             self.elemental_composition = self._mass_to_atomic(mass_dict)
+        for comp in self.elemental_composition:
+            comp.normalize(archive, logger)
 
         super(Ensemble, self).normalize(archive, logger)
 
@@ -708,11 +818,17 @@ class Substance(System):
 
             try:
                 formula = Formula(self.molecular_formula)
-                formula.populate_material(material=archive.results.material)
+                formula.populate(archive.results.material)
                 if not self.elemental_composition:
+                    mass_fractions = formula.mass_fractions()
                     for element, fraction in formula.atomic_fractions().items():
-                        self.elemental_composition.append(ElementalComposition.m_from_dict({
-                            "element": element, "atomic_fraction": fraction}))
+                        self.elemental_composition.append(
+                            ElementalComposition(
+                                element=element,
+                                atomic_fraction=fraction,
+                                mass_fraction=mass_fractions[element],
+                            )
+                        )
             except Exception as e:
                 logger.warn('Could not analyse chemical formula.', exc_info=e)
 
@@ -958,12 +1074,15 @@ class ElnWithFormulaBaseSection(ElnBaseSection):
                 archive.results = Results()
             if not archive.results.material:
                 archive.results.material = Material()
-
             try:
                 formula = Formula(self.chemical_formula)
-                formula.populate_material(material=archive.results.material)
             except Exception as e:
                 logger.warn('could not analyse chemical formula', exc_info=e)
+            else:
+                try:
+                    formula.populate(archive.results.material)
+                except ValueError as e:
+                    logger.info('composition information already defined, skipping populating it based on formula', exc_info=e)
 
 
 class Chemical(ElnWithFormulaBaseSection):
diff --git a/nomad/datamodel/metainfo/eln/perovskite_solar_cell_database/__init__.py b/nomad/datamodel/metainfo/eln/perovskite_solar_cell_database/__init__.py
index 5a45846191ab5418e1751f66c19a140472daec85..12c5354c88f2f602424eaf4fb4d62ba32ca1c3a4 100644
--- a/nomad/datamodel/metainfo/eln/perovskite_solar_cell_database/__init__.py
+++ b/nomad/datamodel/metainfo/eln/perovskite_solar_cell_database/__init__.py
@@ -1607,16 +1607,13 @@ Ozone
 
             formula_cleaner = PerovskiteFormulaNormalizer(self.composition_long_form)
             final_formula = formula_cleaner.clean_formula()
-            chemical_formula_reduced = final_formula[0]
-            archive.results.material.elements = final_formula[1]
             try:
-                archive.results.material.chemical_formula_hill = Formula(chemical_formula_reduced).format('hill')
-                archive.results.material.chemical_formula_reduced = Formula(chemical_formula_reduced).format('reduced')
-                archive.results.material.chemical_formula_iupac = Formula(chemical_formula_reduced).format('iupac')
-                archive.results.material.chemical_formula_anonymous = Formula(chemical_formula_reduced).format('anonymous')
+                formula = Formula(final_formula[0])
+                formula.populate(archive.results.material)
                 archive.results.material.chemical_formula_descriptive = formula_cleaner.pre_process_formula()
             except Exception as e:
                 logger.warn('could not analyse chemical formula', exc_info=e)
+            archive.results.material.elements = final_formula[1]
 
 
 class PerovskiteDeposition(MSection):
diff --git a/nomad/datamodel/results.py b/nomad/datamodel/results.py
index 3589fc916e23ba284f6678736cc2bce6f505fda5..86992170d865a9c378a5be571abc98d8442ef699 100644
--- a/nomad/datamodel/results.py
+++ b/nomad/datamodel/results.py
@@ -273,6 +273,49 @@ class BandGap(CalcBandGap):
     type.m_annotations['elasticsearch'] = [Elasticsearch(material_entry_type)]
 
 
+class ElementalComposition(MSection):
+    m_def = Section(
+        description='''
+        Section containing information about the concentration of an element,
+        given by its atomic and mass fraction within the system or material.
+        ''',
+        label_quantity='element',
+    )
+    element = Quantity(
+        type=MEnum(chemical_symbols[1:]),
+        description='''
+        The symbol of the element, e.g. 'Pb'.
+        ''',
+        a_elasticsearch=[
+            Elasticsearch(material_type),
+            Elasticsearch(suggestion='simple')
+        ],
+    )
+    mass = Quantity(
+        type=np.float64,
+        unit='kg',
+        description='''
+        The (average) mass of the element.
+        ''',
+    )
+    atomic_fraction = Quantity(
+        type=np.float64,
+        description='''
+        The atomic fraction of the element in the system it is contained within.
+        Per definition a positive value less than or equal to 1.
+        ''',
+        a_elasticsearch=Elasticsearch(material_type),
+    )
+    mass_fraction = Quantity(
+        type=np.float64,
+        description='''
+        The mass fraction of the element in the system it is contained within.
+        Per definition a positive value less than or equal to 1.
+        ''',
+        a_elasticsearch=Elasticsearch(material_type),
+    )
+
+
 class LatticeParameters(MSection):
     m_def = Section(
         description='''
@@ -1245,6 +1288,11 @@ class System(MSection):
         the original system. Each row represents a new instance.
         '''
     )
+    elemental_composition = SubSection(
+        sub_section=ElementalComposition.m_def,
+        repeats=True,
+        a_elasticsearch=Elasticsearch(material_type, nested=True)
+    )
     system_relation = SubSection(sub_section=Relation.m_def, repeats=False)
     cell = SubSection(sub_section=Cell.m_def, repeats=False)
     symmetry = SubSection(sub_section=SymmetryNew.m_def, repeats=False)
@@ -1257,7 +1305,7 @@ class System(MSection):
 class Material(MSection):
     m_def = Section(
         description='''
-        Contains information that is specific to bulk crystalline materials.
+        Section containing information on the material composition and structure.
         '''
     )
     material_id = Quantity(
@@ -1417,6 +1465,11 @@ class Material(MSection):
         ''',
         a_elasticsearch=Elasticsearch(material_type, mapping=Text(multi=True)),
     )
+    elemental_composition = SubSection(
+        sub_section=ElementalComposition.m_def,
+        repeats=True,
+        a_elasticsearch=Elasticsearch(material_type, nested=True)
+    )
     symmetry = SubSection(sub_section=Symmetry.m_def, repeats=False)
     topology = SubSection(
         sub_section=System.m_def,
diff --git a/nomad/normalizing/material.py b/nomad/normalizing/material.py
index 75a1869e0e37fc7588eb9abf6d2aa5d1fa4f630b..9d47f91e3dabae90a1d8d5c5f9da8f3c5490f715 100644
--- a/nomad/normalizing/material.py
+++ b/nomad/normalizing/material.py
@@ -61,12 +61,7 @@ class MaterialNormalizer():
         if self.repr_system:
             try:
                 formula = Formula(self.repr_system.chemical_composition_hill)
-                material.elements = formula.elements()
-                material.chemical_formula_hill = formula.format('hill')
-                material.chemical_formula_iupac = formula.format('iupac')
-                material.chemical_formula_reduced = formula.format('reduced')
-                material.chemical_formula_anonymous = formula.format('anonymous')
-                material.chemical_formula_descriptive = formula.format('descriptive')
+                formula.populate(material, descriptive_format='descriptive')
                 self.structural_type = self.repr_system.type
                 material.structural_type = self.repr_system.type
                 dimensionality_map = {
diff --git a/nomad/normalizing/results.py b/nomad/normalizing/results.py
index 1c6ae1a1b1995d18d749e8bc39ce8ea9b70c6ebd..0ba39b42579e6f0a78067ed3605b0fd6179cd40c 100644
--- a/nomad/normalizing/results.py
+++ b/nomad/normalizing/results.py
@@ -117,11 +117,8 @@ class ResultsNormalizer(Normalizer):
             self.normalize_measurement(measurement)
 
     def normalize_sample(self, sample) -> None:
-        results = self.entry_archive.results
+        material = self.entry_archive.m_setdefault("results.material")
 
-        if results.material is None:
-            results.material = Material()
-        material = results.material
         if sample.elements and len(sample.elements) > 0:
             material.elements = sample.elements
         else:
@@ -141,12 +138,13 @@ class ResultsNormalizer(Normalizer):
         try:
             if material.chemical_formula_descriptive:
                 formula = Formula(material.chemical_formula_descriptive)
+                if not material.elements:
+                    material.elements = formula.elements()
+                material.elemental_composition = formula.elemental_composition()
                 material.chemical_formula_hill = formula.format('hill')
                 material.chemical_formula_reduced = formula.format('reduced')
                 material.chemical_formula_iupac = formula.format('iupac')
                 material.chemical_formula_descriptive = formula.format('descriptive')
-                if not material.elements:
-                    material.elements = formula.elements()
         except Exception as e:
             self.logger.warn('could not normalize material', exc_info=e)
 
diff --git a/nomad/normalizing/topology.py b/nomad/normalizing/topology.py
index a7f08211f1b5829b5b5074491ca185d15c533f97..f0a5f2673e2937bc5f4668458a047687b0e13807 100644
--- a/nomad/normalizing/topology.py
+++ b/nomad/normalizing/topology.py
@@ -58,7 +58,7 @@ def get_topology_id(index: int) -> str:
     return f'results/material/topology/{index}'
 
 
-def get_topology_original(material: Material, atoms: NOMADAtoms = None) -> System:
+def get_topology_original(atoms: NOMADAtoms = None) -> System:
     '''
     Creates a new topology item for the original structure.
     '''
@@ -66,13 +66,8 @@ def get_topology_original(material: Material, atoms: NOMADAtoms = None) -> Syste
         method='parser',
         label='original',
         description='A representative system chosen from the original simulation.',
-        chemical_formula_hill=material.chemical_formula_hill,
-        chemical_formula_iupac=material.chemical_formula_iupac,
-        chemical_formula_anonymous=material.chemical_formula_anonymous,
-        chemical_formula_reduced=material.chemical_formula_reduced,
-        elements=material.elements,
-        atoms_ref=atoms,
         system_relation=Relation(type='root'),
+        atoms_ref=atoms
     )
 
     return original
@@ -115,18 +110,7 @@ def add_system_info(system: System, topologies: Dict[str, System]) -> None:
         except Exception:
             pass
         else:
-            if system.chemical_formula_hill is None:
-                system.chemical_formula_hill = formula.format('hill')
-            if system.chemical_formula_iupac is None:
-                system.chemical_formula_iupac = formula.format('iupac')
-            if system.chemical_formula_reduced is None:
-                system.chemical_formula_reduced = formula.format('reduced')
-            if system.chemical_formula_anonymous is None:
-                system.chemical_formula_anonymous = formula.format('anonymous')
-            if system.chemical_formula_descriptive is None:
-                system.chemical_formula_descriptive = formula.format('descriptive')
-            if not system.elements:
-                system.elements = formula.elements()
+            formula.populate(system, descriptive_format='descriptive')
 
 
 def add_system(system: System, topologies: Dict[str, System], parent: Optional[System] = None) -> None:
@@ -156,7 +140,7 @@ class TopologyNormalizer():
         '''Returns a dictionary that contains all of the topologies mapped by
         topology id.'''
         # Use the calculation topology primarily
-        topology_calc = self.topology_calculation(material)
+        topology_calc = self.topology_calculation()
         if topology_calc:
             return topology_calc
         with utils.timer(self.logger, 'calculating topology with matid'):
@@ -166,7 +150,7 @@ class TopologyNormalizer():
 
         return None
 
-    def topology_calculation(self, material: Material) -> Optional[List[System]]:
+    def topology_calculation(self) -> Optional[List[System]]:
         '''Extracts the system topology as defined in the original calculation.
         This topology typically comes from e.g. classical force fields that
         define a topology for the system.
@@ -185,7 +169,7 @@ class TopologyNormalizer():
             return None
 
         topology: Dict[str, System] = {}
-        original = get_topology_original(material, atoms)
+        original = get_topology_original(atoms)
         add_system(original, topology)
         label_to_indices: Dict[str, list] = defaultdict(list)
 
@@ -280,7 +264,7 @@ class TopologyNormalizer():
             return None
 
         topology: Dict[str, System] = {}
-        original = get_topology_original(material, nomad_atoms)
+        original = get_topology_original(nomad_atoms)
         add_system(original, topology)
         add_system_info(original, topology)
 
diff --git a/tests/normalizing/test_material.py b/tests/normalizing/test_material.py
index ce5270f130210684ad91917912e6ef6253776fd7..14ee12110a474ce66897358e1cdca1aa90e89fd5 100644
--- a/tests/normalizing/test_material.py
+++ b/tests/normalizing/test_material.py
@@ -26,6 +26,7 @@ from nomad.units import ureg
 from nomad import atomutils
 from nomad.utils import hash
 from nomad.normalizing.common import ase_atoms_from_nomad_atoms, ase_atoms_from_structure
+from nomad.datamodel.results import ElementalComposition
 from tests.normalizing.conftest import get_template_for_structure
 
 
@@ -571,3 +572,28 @@ def test_conventional_structure(atoms, expected, monkeypatch):
     assert np.allclose(conv.get_positions(), expected.get_positions())
     assert np.array_equal(conv.get_chemical_symbols(), expected.get_chemical_symbols())
     assert np.allclose(conv.get_cell(), expected.get_cell())
+
+
+@pytest.mark.parametrize(
+    'archive, expected',
+    [
+        pytest.param(
+            get_template_for_structure(ase.build.molecule("H2O")),
+            [
+                ElementalComposition(element='H', atomic_fraction=2 / 3, mass_fraction=0.111898, mass=1.00794 * ureg.amu),
+                ElementalComposition(element='O', atomic_fraction=1 / 3, mass_fraction=0.888101, mass=15.9994 * ureg.amu),
+            ],
+            id='simulation, molecule'
+        ),
+    ]
+)
+def test_elemental_composition(archive, expected):
+    result = archive.results.material.elemental_composition
+    assert len(expected) == len(result)
+    composition_map = {x.element: x for x in result}
+    for comp_expected in expected:
+        comp_result = composition_map[comp_expected.element]
+        assert comp_result.element == comp_expected.element
+        assert comp_result.mass.magnitude == pytest.approx(comp_expected.mass.magnitude, abs=0, rel=1e-5)
+        assert comp_result.mass_fraction == pytest.approx(comp_expected.mass_fraction, abs=0, rel=1e-5)
+        assert comp_result.atomic_fraction == pytest.approx(comp_expected.atomic_fraction, abs=0, rel=1e-5)
diff --git a/tests/normalizing/test_topology.py b/tests/normalizing/test_topology.py
index dc6fd8d56b0c32fad844261ca1e090352b05b788..8429d5559b63989f305fdcece3a93c46fc3f7246 100644
--- a/tests/normalizing/test_topology.py
+++ b/tests/normalizing/test_topology.py
@@ -57,6 +57,12 @@ def assert_topology(topology):
         assert top.chemical_formula_hill is not None
         assert top.chemical_formula_reduced is not None
         assert top.chemical_formula_anonymous is not None
+        assert top.elemental_composition
+        for comp in top.elemental_composition:
+            assert comp.element
+            assert comp.mass
+            assert comp.mass_fraction
+            assert comp.atomic_fraction
         if top.parent_system:
             child_map_determined[top.parent_system].append(top.system_id)
         if top.child_systems:
diff --git a/tests/test_atomutils.py b/tests/test_atomutils.py
index 6287aecb1e422d45a53f9aeb59fb658ad1398dbc..ae1d0a076696d848a96f041c4497c9bb1cb730ae 100644
--- a/tests/test_atomutils.py
+++ b/tests/test_atomutils.py
@@ -17,7 +17,7 @@
 #
 import pytest
 from nomad.atomutils import Formula
-from nomad.datamodel.results import Material
+from nomad.datamodel.results import Material, ElementalComposition
 
 
 @pytest.mark.parametrize('format, formula, expected_formula', [
@@ -76,10 +76,10 @@ def test_formula_atomic_fraction(formula, expected_fractions):
     pytest.param('I2Pb', 'original', 'I2Pb', ['Pb', 'I'], id='original descriptive formula'),
     pytest.param('I2Pb', None, None, ['Pb', 'I'], id='no descriptive formula'),
 ])
-def test_formula_material_population(formula, descriptive_format, expected_formula, elements):
+def test_formula_populate(formula, descriptive_format, expected_formula, elements):
     material = Material()
     formula_object = Formula(formula)
-    formula_object.populate_material(material=material, descriptive_format=descriptive_format)
+    formula_object.populate(material, descriptive_format=descriptive_format)
 
     assert material.chemical_formula_descriptive == expected_formula
     assert sorted(material.elements) == sorted(elements)
@@ -87,3 +87,17 @@ def test_formula_material_population(formula, descriptive_format, expected_formu
     assert material.chemical_formula_reduced is not None
     assert material.chemical_formula_iupac is not None
     assert material.chemical_formula_anonymous is not None
+
+
+@pytest.mark.parametrize('formula, material', [
+    pytest.param('Si', Material(elements=['Si']), id='elements'),
+    pytest.param('Si2', Material(elemental_composition=[ElementalComposition(element='Si')]), id='elemental_composition'),
+    pytest.param('Si2', Material(chemical_formula_hill='Si'), id='chemical_formula_hill'),
+    pytest.param('Si2', Material(chemical_formula_reduced='Si'), id='chemical_formula_reduced'),
+    pytest.param('Si2', Material(chemical_formula_iupac='Si'), id='chemical_formula_iupac'),
+    pytest.param('Si2', Material(chemical_formula_anonymous='Si'), id='chemical_formula_anonymous'),
+])
+def test_formula_populate_overwrite_exception(formula, material):
+    formula_object = Formula(formula)
+    with pytest.raises(ValueError):
+        formula_object.populate(material, descriptive_format='original')