diff --git a/mpesparser/__init__.py b/mpesparser/__init__.py
index 4a4d00250177ee39ec96f6e9e618393a64d37267..1f7f6fd1975093f7992c84cbf3a3333dd8dc6b76 100644
--- a/mpesparser/__init__.py
+++ b/mpesparser/__init__.py
@@ -19,16 +19,14 @@ import re
 import numpy as np
 from datetime import datetime
 
-from .metainfo import m_env
-from .metainfo import mpes as mmpes
-from nomad.parsing.parser import MatchingParser
-from nomad.datamodel.metainfo.general_experimental import section_experiment as msection_experiment
-from nomad.datamodel.metainfo.general_experimental import section_data as msection_data
-from nomad.datamodel.metainfo.general_experimental_method import section_method as msection_method
-from nomad.datamodel.metainfo.general_experimental_sample import section_sample as msection_sample
+from nomad.parsing.parser import FairdiParser
+from nomad.datamodel.metainfo.general_experimental import section_experiment as SectionExperiment
+from nomad.datamodel.metainfo.general_experimental import section_data as SectionData
+from nomad.datamodel.metainfo.general_experimental_method import section_method as SectionMethod
+from nomad.datamodel.metainfo.general_experimental_sample import section_sample as SectionSample
 
 
-class MPESParser(MatchingParser):
+class MPESParser(FairdiParser):
     def __init__(self):
         super().__init__(
             name='parsers/mpes', code_name='mpes', code_homepage='https://github.com/mpes-kit/mpes',
@@ -36,13 +34,11 @@ class MPESParser(MatchingParser):
             mainfile_contents_re=(r'"data_repository_name": "zenodo.org"')
         )
 
-    def run(self, filepath, logger=None):
-        self._metainfo_env = m_env
-
+    def parse(self, filepath, archive, logger=None):
         with open(filepath, 'rt') as f:
             data = json.load(f)
 
-        section_experiment = msection_experiment()
+        section_experiment = archive.m_create(SectionExperiment)
 
         # Read general experimental parameters
         # section_experiment.experiment_location = ', '.join(reversed(re.findall(r"[\w']+", data.get('experiment_location'))))
@@ -61,13 +57,13 @@ class MPESParser(MatchingParser):
         section_experiment.experiment_facility_name = data.get('facility_name')
 
         # Read data parameters
-        section_data = section_experiment.m_create(msection_data)
+        section_data = section_experiment.m_create(SectionData)
         section_data.data_repository_name = data.get('data_repository_name')
         section_data.data_repository_url = data.get('data_repository_url')
         section_data.data_preview_url = 'preview.png'
 
         # Read method parameters
-        section_method = section_experiment.m_create(msection_method)
+        section_method = section_experiment.m_create(SectionMethod)
         section_method.experiment_method_name = data.get('experiment_method')
         section_method.experiment_method_abbreviation = data.get('experiment_method_abbrv')
         section_method.equipment_description = data.get('equipment_description')
@@ -125,7 +121,7 @@ class MPESParser(MatchingParser):
         section_method.detector_energy_resolution = np.array(data.get('energy_resolution'))
 
         # Read parameters related to sample
-        section_sample = section_experiment.m_create(msection_sample)
+        section_sample = section_experiment.m_create(SectionSample)
         section_sample.sample_description = data.get('sample_description')
         section_sample.sample_id = data.get('sample_id')
         section_sample.sample_state_of_matter = data.get('sample_state')
@@ -152,5 +148,3 @@ class MPESParser(MatchingParser):
         # TODO sample classification
         section_sample.sample_microstructure = 'bulk sample, polycrystalline'
         section_sample.sample_constituents = 'multi phase'
-
-        return section_experiment
diff --git a/mpesparser/__main__.py b/mpesparser/__main__.py
index 02973c90c5b2a52e3af79865dce4ac274e1b8a43..d7e04da1c6b94fe1bb5720e89add49f31abacf50 100644
--- a/mpesparser/__main__.py
+++ b/mpesparser/__main__.py
@@ -12,15 +12,10 @@
 #   limitations under the License.
 
 import sys
+import json
 
-from nomad.parsing import LocalBackend
-from mpesparser import MPESParserInterface
+from mpesparser import MPESParser
 
 if __name__ == "__main__":
-    # instantiate the parser via its interface with a LocalBackend
-    parser = MPESParserInterface(backend=LocalBackend)
-    # call the actual parsing with the given mainfile
-    parser.parse(sys.argv[1])
-    # print the results stored in the LocalBackend
-    parser.parser_context.super_backend.write_json(
-        sys.stdout, pretty=True, root_sections=['section_experiment'])
+    archive = MPESParser.main(sys.argv[1])
+    json.dump(archive.m_to_dict(), sys.stdout, indent=2)