diff --git a/parser/parser-cpmd/cpmdparser/versions/cpmd41/commonmatcher.py b/parser/parser-cpmd/cpmdparser/versions/cpmd41/commonparser.py
similarity index 79%
rename from parser/parser-cpmd/cpmdparser/versions/cpmd41/commonmatcher.py
rename to parser/parser-cpmd/cpmdparser/versions/cpmd41/commonparser.py
index 9ea4ee49fa11ca52432e93921666a31613406c3c..f168803b3fb590ef9ba75f4f5bb350a7c9456ec6 100644
--- a/parser/parser-cpmd/cpmdparser/versions/cpmd41/commonmatcher.py
+++ b/parser/parser-cpmd/cpmdparser/versions/cpmd41/commonparser.py
@@ -1,15 +1,15 @@
-from nomadcore.baseclasses import CommonMatcher
+from nomadcore.baseclasses import CommonParser
 
 
 #===============================================================================
-class CPMDCommonMatcher(CommonMatcher):
+class CPMDCommonParser(CommonParser):
     """
     This class is used to store and instantiate common parts of the
     hierarchical SimpleMatcher structure used in the parsing of a CPMD
     calculation.
     """
     def __init__(self, parser_context):
-        super(CPMDCommonMatcher, self).__init__(parser_context)
+        super(CPMDCommonParser, self).__init__(parser_context)
 
     #===========================================================================
     # onClose triggers
diff --git a/parser/parser-cpmd/cpmdparser/versions/cpmd41/inputparser.py b/parser/parser-cpmd/cpmdparser/versions/cpmd41/inputparser.py
index 1e9b3b7fb1c7b84d1638fb2bc35c9b0923d8254d..c1dfab6e6d0e62f5fb6f070fdce982a932d73122 100644
--- a/parser/parser-cpmd/cpmdparser/versions/cpmd41/inputparser.py
+++ b/parser/parser-cpmd/cpmdparser/versions/cpmd41/inputparser.py
@@ -1,43 +1,28 @@
 from __future__ import absolute_import
 from nomadcore.simple_parser import SimpleMatcher as SM
-from nomadcore.baseclasses import MainHierarchicalParser
-from nomadcore.caching_backend import CachingLevel
-from .commonmatcher import CommonMatcher
+from nomadcore.baseclasses import SubHierarchicalParser
+# from nomadcore.caching_backend import CachingLevel
 import logging
 logger = logging.getLogger("nomad")
 
 
 #===============================================================================
-class CPMDSinglePointParser(MainHierarchicalParser):
-    """The main parser class. Used to parse the CP2K calculation with run types:
-        -ENERGY
-        -ENERGY_FORCE
+class CPMDInputParser(SubHierarchicalParser):
+    """Parses the CPMD input file.
     """
     def __init__(self, file_path, parser_context):
         """
         """
-        super(CPMDSinglePointParser, self).__init__(file_path, parser_context)
-        self.setup_common_matcher(CommonMatcher(parser_context))
+        super(CPMDInputParser, self).__init__(file_path, parser_context)
 
         #=======================================================================
         # Cache levels
-        self.caching_level_for_metaname.update({
-            'x_cp2k_energy_total_scf_iteration': CachingLevel.ForwardAndCache,
-            'x_cp2k_energy_XC_scf_iteration': CachingLevel.ForwardAndCache,
-            'x_cp2k_energy_change_scf_iteration': CachingLevel.ForwardAndCache,
-            'x_cp2k_stress_tensor': CachingLevel.ForwardAndCache,
-            'x_cp2k_section_stress_tensor': CachingLevel.ForwardAndCache,
-        })
+        # self.caching_level_for_metaname.update({
+            # 'x_cp2k_energy_total_scf_iteration': CachingLevel.ForwardAndCache,
+        # })
 
         #=======================================================================
         # SimpleMatchers
         self.root_matcher = SM("",
             forwardMatch=True,
-            sections=['section_run', "section_single_configuration_calculation", "section_system", "section_method"],
-            otherMetaInfo=["atom_forces"],
-            subMatchers=[
-                self.cm.header(),
-                self.cm.quickstep_header(),
-                self.cm.quickstep_calculation(),
-            ]
         )
diff --git a/parser/parser-cpmd/cpmdparser/versions/cpmd41/mainparser.py b/parser/parser-cpmd/cpmdparser/versions/cpmd41/mainparser.py
index 39de580e9f4d5849ec6726471c34a9453521998b..e0a40df1b4bfe6f6a22215655d0f9cc9bbad1d30 100644
--- a/parser/parser-cpmd/cpmdparser/versions/cpmd41/mainparser.py
+++ b/parser/parser-cpmd/cpmdparser/versions/cpmd41/mainparser.py
@@ -1,11 +1,14 @@
 from __future__ import absolute_import
 from nomadcore.simple_parser import SimpleMatcher as SM
 from nomadcore.baseclasses import MainHierarchicalParser
+from nomadcore.unit_conversion.unit_conversion import convert_unit
 from nomadcore.caching_backend import CachingLevel
-from .commonmatcher import CPMDCommonMatcher
+from .commonparser import CPMDCommonParser
+from .inputparser import CPMDInputParser
 import re
 import logging
 import datetime
+import numpy as np
 logger = logging.getLogger("nomad")
 
 
@@ -18,7 +21,7 @@ class CPMDMainParser(MainHierarchicalParser):
         """
         """
         super(CPMDMainParser, self).__init__(file_path, parser_context)
-        self.setup_common_matcher(CPMDCommonMatcher(parser_context))
+        self.setup_common_matcher(CPMDCommonParser(parser_context))
 
         #=======================================================================
         # Cache levels
@@ -32,22 +35,240 @@ class CPMDMainParser(MainHierarchicalParser):
             forwardMatch=True,
             sections=['section_run', "section_single_configuration_calculation", "section_system", "section_method"],
             subMatchers=[
-                SM( " PROGRAM CPMD STARTED AT: (?P<x_cpmd_start_datetime>{})".format(self.regexs.regex_eol)),
-                SM( "\s+VERSION (?P<program_version>\d+\.\d+)"),
-                SM( " THE INPUT FILE IS:\s+(?P<x_cpmd_input_file>{})".format(self.regexs.regex_eol)),
-                SM( " THIS JOB RUNS ON:\s+(?P<x_cpmd_run_host_name>{})".format(self.regexs.regex_eol)),
-                SM( " THE JOB WAS SUBMITTED BY:\s+(?P<x_cpmd_run_user_name>{})".format(self.regexs.regex_eol)),
+                SM( " PROGRAM CPMD STARTED AT",
+                    forwardMatch=True,
+                    sections=["x_cpmd_section_start_information"],
+                    subMatchers=[
+                        SM( " PROGRAM CPMD STARTED AT: (?P<x_cpmd_start_datetime>{})".format(self.regexs.regex_eol)),
+                        SM( "\s+VERSION (?P<program_version>\d+\.\d+)"),
+                        SM( " THE INPUT FILE IS:\s+(?P<x_cpmd_input_filename>{})".format(self.regexs.regex_eol)),
+                        SM( " THIS JOB RUNS ON:\s+(?P<x_cpmd_run_host_name>{})".format(self.regexs.regex_eol)),
+                        SM( " THE PROCESS ID IS:\s+(?P<x_cpmd_process_id>{})".format(self.regexs.regex_i)),
+                        SM( " THE JOB WAS SUBMITTED BY:\s+(?P<x_cpmd_run_user_name>{})".format(self.regexs.regex_eol)),
+                    ]
+                ),
+                SM( " SINGLE POINT DENSITY OPTIMIZATION",
+                    sections=["x_cpmd_section_run_type_information"],
+                    subMatchers=[
+                        SM( " USING SEED\s+{}\s+TO INIT. PSEUDO RANDOM NUMBER GEN.".format(self.regexs.regex_i)),
+                        SM( " PATH TO THE RESTART FILES:\s+{}".format(self.regexs.regex_eol)),
+                        SM( " GRAM-SCHMIDT ORTHOGONALIZATION"),
+                        SM( " MAXIMUM NUMBER OF STEPS:\s+{} STEPS".format(self.regexs.regex_i)),
+                        SM( " MAXIMUM NUMBER OF ITERATIONS FOR SC:\s+{} STEPS".format(self.regexs.regex_i)),
+                        SM( " PRINT INTERMEDIATE RESULTS EVERY\s+{} STEPS".format(self.regexs.regex_i)),
+                        SM( " STORE INTERMEDIATE RESULTS EVERY\s+{} STEPS".format(self.regexs.regex_i)),
+                        SM( " NUMBER OF DISTINCT RESTART FILES:\s+{}".format(self.regexs.regex_i)),
+                        SM( " TEMPERATURE IS CALCULATED ASSUMING EXTENDED BULK BEHAVIOR"),
+                        SM( " FICTITIOUS ELECTRON MASS:\s+{}".format(self.regexs.regex_f)),
+                        SM( " TIME STEP FOR ELECTRONS:\s+{}".format(self.regexs.regex_f)),
+                        SM( " TIME STEP FOR IONS:\s+{}".format(self.regexs.regex_f)),
+                        SM( " CONVERGENCE CRITERIA FOR WAVEFUNCTION OPTIMIZATION:\s+{}".format(self.regexs.regex_f)),
+                        SM( " WAVEFUNCTION OPTIMIZATION BY PRECONDITIONED DIIS"),
+                        SM( " THRESHOLD FOR THE WF-HESSIAN IS\s+{}".format(self.regexs.regex_f)),
+                        SM( " MAXIMUM NUMBER OF VECTORS RETAINED FOR DIIS:\s+{}".format(self.regexs.regex_i)),
+                        SM( " STEPS UNTIL DIIS RESET ON POOR PROGRESS:\s+{}".format(self.regexs.regex_i)),
+                        SM( " FULL ELECTRONIC GRADIENT IS USED".format(self.regexs.regex_i)),
+                        SM( " SPLINE INTERPOLATION IN G-SPACE FOR PSEUDOPOTENTIAL FUNCTIONS",
+                            subMatchers=[
+                                SM( "    NUMBER OF SPLINE POINTS:\s+{}".format(self.regexs.regex_i)),
+                            ]
+                        ),
+                    ]
+                ),
+                SM( " EXCHANGE CORRELATION FUNCTIONALS",
+                    sections=["x_cpmd_section_xc_information"],
+                    subMatchers=[
+                        # SM( " PROGRAM CPMD STARTED AT: (?P<x_cpmd_start_datetime>{})".format(self.regexs.regex_eol)),
+                    ]
+                ),
+                SM( " ***************************** ATOMS ****************************".replace("*", "\*"),
+                    sections=["x_cpmd_section_system_information"],
+                    subMatchers=[
+                        SM( "   NR   TYPE        X(BOHR)        Y(BOHR)        Z(BOHR)     MBL".replace("(", "\(").replace(")", "\)"),
+                            adHoc=self.ad_hoc_atom_information()
+                        ),
+                        SM( " CHARGE:\s+(?P<total_charge>{})".format(self.regexs.regex_i)),
+                    ]
+                ),
+                SM( "    \|    Pseudopotential Report",
+                    sections=["x_cpmd_section_pseudopotential_information"],
+                    subMatchers=[
+                        # SM( " PROGRAM CPMD STARTED AT: (?P<x_cpmd_start_datetime>{})".format(self.regexs.regex_eol)),
+                    ]
+                ),
+                SM( " ************************** SUPERCELL ***************************".replace("*", "\*"),
+                    sections=["x_cpmd_section_supercell"],
+                    subMatchers=[
+                        SM( " SYMMETRY:\s+(?P<x_cpmd_cell_symmetry>{})".format(self.regexs.regex_eol)),
+                        SM( " LATTICE CONSTANT\(a\.u\.\):\s+(?P<x_cpmd_cell_lattice_constant>{})".format(self.regexs.regex_f)),
+                        SM( " CELL DIMENSION:\s+(?P<x_cpmd_cell_dimension>{})".format(self.regexs.regex_eol)),
+                        SM( " VOLUME\(OMEGA IN BOHR\^3\):\s+(?P<x_cpmd_cell_volume>{})".format(self.regexs.regex_f)),
+                        SM( " LATTICE VECTOR A1\(BOHR\):\s+(?P<x_cpmd_lattice_vector_A1>{})".format(self.regexs.regex_eol)),
+                        SM( " LATTICE VECTOR A2\(BOHR\):\s+(?P<x_cpmd_lattice_vector_A2>{})".format(self.regexs.regex_eol)),
+                        SM( " LATTICE VECTOR A3\(BOHR\):\s+(?P<x_cpmd_lattice_vector_A3>{})".format(self.regexs.regex_eol)),
+                        SM( " RECIP\. LAT\. VEC\. B1\(2Pi/BOHR\):\s+(?P<x_cpmd_reciprocal_lattice_vector_B1>{})".format(self.regexs.regex_eol)),
+                        SM( " RECIP\. LAT\. VEC\. B2\(2Pi/BOHR\):\s+(?P<x_cpmd_reciprocal_lattice_vector_B2>{})".format(self.regexs.regex_eol)),
+                        SM( " RECIP\. LAT\. VEC\. B3\(2Pi/BOHR\):\s+(?P<x_cpmd_reciprocal_lattice_vector_B3>{})".format(self.regexs.regex_eol)),
+                        SM( " RECIP\. LAT\. VEC\. B3\(2Pi/BOHR\):\s+(?P<x_cpmd_reciprocal_lattice_vector_B3>{})".format(self.regexs.regex_eol)),
+                        SM( " REAL SPACE MESH:\s+(?P<x_cpmd_real_space_mesh>{})".format(self.regexs.regex_eol)),
+                        SM( " WAVEFUNCTION CUTOFF\(RYDBERG\):\s+(?P<x_cpmd_wave_function_cutoff>{})".format(self.regexs.regex_f)),
+                        SM( " DENSITY CUTOFF\(RYDBERG\):          \(DUAL= 4\.00\)\s+(?P<x_cpmd_density_cutoff>{})".format(self.regexs.regex_f)),
+                        SM( " NUMBER OF PLANE WAVES FOR WAVEFUNCTION CUTOFF:\s+(?P<x_cpmd_number_of_planewaves_wave_function>{})".format(self.regexs.regex_i)),
+                        SM( " NUMBER OF PLANE WAVES FOR DENSITY CUTOFF:\s+(?P<x_cpmd_number_of_planewaves_density>{})".format(self.regexs.regex_i)),
+                    ]
+                ),
+                SM( " GENERATE ATOMIC BASIS SET",
+                    sections=["x_cpmd_section_wave_function_initialization"],
+                    subMatchers=[
+                        # SM( " PROGRAM CPMD STARTED AT: (?P<x_cpmd_start_datetime>{})".format(self.regexs.regex_eol)),
+                    ]
+                ),
+                SM( " NFI      GEMAX       CNORM           ETOT        DETOT      TCPU",
+                    sections=["x_cpmd_section_scf"],
+                    subMatchers=[
+                        SM( "\s+{0}\s+{1}\s+{1}\s+{1}\s+{1}\s+{1}".format(self.regexs.regex_i, self.regexs.regex_f),
+                            sections=["section_scf_iteration"],
+                            repeats=True,
+                        ),
+                    ]
+                ),
+                SM( " *                        FINAL RESULTS                         *".replace("*", "\*"),
+                    sections=["x_cpmd_section_final_results"],
+                    subMatchers=[
+                        SM( "   ATOM          COORDINATES            GRADIENTS \(-FORCES\)",
+                            adHoc=self.ad_hoc_atom_forces(),
+                        ),
+                        SM( " \(K\+E1\+L\+N\+X\)           TOTAL ENERGY =\s+(?P<energy_total__hartree>{}) A\.U\.".format(self.regexs.regex_f)),
+                        SM( " \(E1=A-S\+R\)     ELECTROSTATIC ENERGY =\s+(?P<energy_electrostatic__hartree>{}) A\.U\.".format(self.regexs.regex_f)),
+                        SM( " \(X\)     EXCHANGE-CORRELATION ENERGY =\s+(?P<energy_XC_potential__hartree>{}) A\.U\.".format(self.regexs.regex_f)),
+                    ]
+                ),
+                SM( " *                            TIMING                            *".replace("*", "\*"),
+                    sections=["x_cpmd_section_timing"],
+                    subMatchers=[
+                    ]
+                ),
+                SM( "       CPU TIME :",
+                    forwardMatch=True,
+                    sections=["x_cpmd_section_end_information"],
+                    subMatchers=[
+                        # SM( " PROGRAM CPMD STARTED AT: (?P<x_cpmd_start_datetime>{})".format(self.regexs.regex_eol)),
+                    ]
+                )
             ]
         )
 
     #=======================================================================
     # onClose triggers
-    def onClose_section_run(self, backend, gIndex, section):
+    def onClose_x_cpmd_section_start_information(self, backend, gIndex, section):
+        # Starting date and time
         start_datetime = section.get_latest_value("x_cpmd_start_datetime")
         start_date_stamp, start_wall_time = self.timestamp_from_string(start_datetime)
         backend.addValue("time_run_date_start", start_date_stamp)
         backend.addValue("time_run_wall_start", start_wall_time)
 
+        # Input file
+        input_filename = section.get_latest_value("x_cpmd_input_filename")
+        input_filepath = self.file_service.set_file_id(input_filename, "input")
+        if input_filepath is not None:
+            input_parser = CPMDInputParser(input_filepath, self.parser_context)
+            input_parser.parse()
+        else:
+            logger.warning("The input file for the calculation could not be found.")
+
+    def onClose_x_cpmd_section_supercell(self, backend, gIndex, section):
+        # Simulation cell
+        A1 = section.get_latest_value("x_cpmd_lattice_vector_A1")
+        A2 = section.get_latest_value("x_cpmd_lattice_vector_A2")
+        A3 = section.get_latest_value("x_cpmd_lattice_vector_A3")
+        A1_array = self.vector_from_string(A1)
+        A2_array = self.vector_from_string(A2)
+        A3_array = self.vector_from_string(A3)
+        cell = np.vstack((A1_array, A2_array, A3_array))
+        backend.addArrayValues("simulation_cell", cell, unit="bohr")
+
+        # Plane wave basis
+        cutoff = section.get_latest_value("x_cpmd_wave_function_cutoff")
+        si_cutoff = convert_unit(cutoff, "rydberg")
+        basis_id = backend.openSection("section_basis_set_cell_dependent")
+        backend.addValue("basis_set_cell_dependent_kind", "plane_waves")
+        backend.addValue("basis_set_cell_dependent_name", "PW_{}".format(cutoff))
+        backend.addValue("basis_set_planewave_cutoff", si_cutoff)
+        backend.closeSection("section_basis_set_cell_dependent", basis_id)
+
+    #=======================================================================
+    # adHoc
+    def debug(self):
+        def wrapper(parser):
+            print("DEBUG")
+        return wrapper
+
+    def ad_hoc_atom_information(self):
+        """Parses the atom labels and coordinates.
+        """
+        def wrapper(parser):
+            # Define the regex that extracts the information
+            regex_string = r"\s+({0})\s+({1})\s+({2})\s+({2})\s+({2})\s+({0})".format(self.regexs.regex_i, self.regexs.regex_word, self.regexs.regex_f)
+            regex_compiled = re.compile(regex_string)
+
+            match = True
+            coordinates = []
+            labels = []
+
+            while match:
+                line = parser.fIn.readline()
+                result = regex_compiled.match(line)
+
+                if result:
+                    match = True
+                    label = result.groups()[1]
+                    labels.append(label)
+                    coordinate = [float(x) for x in result.groups()[2:5]]
+                    coordinates.append(coordinate)
+                else:
+                    match = False
+
+            coordinates = np.array(coordinates)
+            labels = np.array(labels)
+
+            # If anything found, push the results to the correct section
+            if len(coordinates) != 0:
+                parser.backend.addArrayValues("atom_positions", coordinates, unit="bohr")
+                parser.backend.addArrayValues("atom_labels", labels)
+                parser.backend.addValue("number_of_atoms", coordinates.shape[0])
+
+        return wrapper
+
+    def ad_hoc_atom_forces(self):
+        """Parses the atomic forces from the final results.
+        """
+        def wrapper(parser):
+            # Define the regex that extracts the information
+            regex_string = r"\s+({0})\s+({1})\s+({2})\s+({2})\s+({2})\s+({2})\s+({2})\s+({2})".format(self.regexs.regex_i, self.regexs.regex_word, self.regexs.regex_f)
+            regex_compiled = re.compile(regex_string)
+
+            match = True
+            forces = []
+
+            while match:
+                line = parser.fIn.readline()
+                result = regex_compiled.match(line)
+
+                if result:
+                    match = True
+                    force = [float(x) for x in result.groups()[5:8]]
+                    forces.append(force)
+                else:
+                    match = False
+
+            forces = -np.array(forces)
+
+            # If anything found, push the results to the correct section
+            if len(forces) != 0:
+                parser.backend.addArrayValues("atom_forces", forces, unit="hartree/bohr")
+
+        return wrapper
+
     #=======================================================================
     # misc. functions
     def timestamp_from_string(self, timestring):
@@ -59,9 +280,10 @@ class CPMDMainParser(MainHierarchicalParser):
         wall_time = hour*3600+minute*60+second+0.001*msec
         return date_stamp, wall_time
 
-    #=======================================================================
-    # adHoc
-    def debug(self):
-        def wrapper(parser):
-            print("DEBUG")
-        return wrapper
+    def vector_from_string(self, vectorstr):
+        """Returns a numpy array from a string comprising of floating
+        point numbers.
+        """
+        vectorstr = vectorstr.strip().split()
+        vec_array = np.array([float(x) for x in vectorstr])
+        return vec_array
diff --git a/src/main/scala/eu/nomad_lab/parsers/CpmdParser.scala b/src/main/scala/eu/nomad_lab/parsers/CpmdParser.scala
index 8e2c8f1d89ee9ef447907afecd16733471e41be8..e76184e9f1abe95b4fcfcb465409f81c2ea68ef0 100644
--- a/src/main/scala/eu/nomad_lab/parsers/CpmdParser.scala
+++ b/src/main/scala/eu/nomad_lab/parsers/CpmdParser.scala
@@ -40,7 +40,7 @@ object CpmdParser extends SimpleExternalParserGenerator(
     "parser-cpmd/cpmdparser/generic/__init__.py",
     "parser-cpmd/cpmdparser/versions/__init__.py",
     "parser-cpmd/cpmdparser/versions/cpmd41/__init__.py",
-    "parser-cpmd/cpmdparser/versions/cpmd41/commonmatcher.py",
+    "parser-cpmd/cpmdparser/versions/cpmd41/commonparser.py",
     "parser-cpmd/cpmdparser/versions/cpmd41/mainparser.py",
     "parser-cpmd/cpmdparser/versions/cpmd41/inputparser.py",
     "nomad_meta_info/public.nomadmetainfo.json",
diff --git a/test/unittests/cpmd_4.1/run_tests.py b/test/unittests/cpmd_4.1/run_tests.py
index db6beca4eef353dcaedb643fa028129ca2edcad5..4d23902a50a6099b8f98dc581c747dc56d429aca 100644
--- a/test/unittests/cpmd_4.1/run_tests.py
+++ b/test/unittests/cpmd_4.1/run_tests.py
@@ -31,7 +31,7 @@ logging.basicConfig(
 logger = logging.getLogger("nomad")
 logger.setLevel(logging.CRITICAL)
 logging.getLogger("nomadcore.caching_backend").setLevel(logging.CRITICAL)
-logger = logging.getLogger("cp2kparser")
+logger = logging.getLogger("cpmdparser")
 logger.setLevel(logging.ERROR)
 
 
@@ -89,9 +89,76 @@ class TestSinglePoint(unittest.TestCase):
         result = self.results["time_run_wall_start"]
         self.assertEqual(result, 50706.851)
 
-    # def test_program_basis_set_type(self):
-        # result = self.results["program_basis_set_type"]
-        # self.assertEqual(result, "plane waves")
+    def test_program_basis_set_type(self):
+        result = self.results["program_basis_set_type"]
+        self.assertEqual(result, "plane waves")
+
+    def test_atom_label(self):
+        atom_labels = self.results["atom_labels"]
+        expected_labels = np.array(2*["H"])
+        self.assertTrue(np.array_equal(atom_labels, expected_labels))
+
+    def test_total_charge(self):
+        charge = self.results["total_charge"]
+        self.assertEqual(charge, 0)
+
+    def test_atom_positions(self):
+        atom_position = self.results["atom_positions"]
+        expected_position = convert_unit(np.array(
+            [
+                [8.259993, 7.558904, 7.558904],
+                [6.857816, 7.558904, 7.558904],
+            ]
+        ), "bohr")
+        self.assertTrue(np.array_equal(atom_position, expected_position))
+
+    def test_number_of_atoms(self):
+        n_atoms = self.results["number_of_atoms"]
+        self.assertEqual(n_atoms, 2)
+
+    def test_simulation_cell(self):
+        cell = self.results["simulation_cell"]
+        n_vectors = cell.shape[0]
+        n_dim = cell.shape[1]
+        self.assertEqual(n_vectors, 3)
+        self.assertEqual(n_dim, 3)
+        expected_cell = convert_unit(np.array([[15.1178, 0, 0], [0, 15.1178, 0], [0, 0, 15.1178]]), "bohr")
+        self.assertTrue(np.array_equal(cell, expected_cell))
+
+    def test_basis_set_cell_dependent(self):
+        kind = self.results["basis_set_cell_dependent_kind"]
+        name = self.results["basis_set_cell_dependent_name"]
+        cutoff = self.results["basis_set_planewave_cutoff"]
+
+        self.assertEqual(kind, "plane_waves")
+        self.assertEqual(name, "PW_70.0")
+        self.assertEqual(cutoff, convert_unit(70.00000, "rydberg"))
+
+    def test_atom_forces(self):
+        result = self.results["atom_forces"]
+        expected_result = convert_unit(
+            -np.array([
+                [1.780E-02, -1.104E-16, -9.425E-17],
+                [-1.780E-02, -1.867E-16, -1.490E-16],
+            ]),
+            "hartree/bohr"
+        )
+        self.assertTrue(np.array_equal(result, expected_result))
+
+    def test_energy_total(self):
+        result = self.results["energy_total"]
+        expected_result = convert_unit(np.array(-1.13245953), "hartree")
+        self.assertTrue(np.array_equal(result, expected_result))
+
+    def test_energy_electrostatic(self):
+        result = self.results["energy_electrostatic"]
+        expected_result = convert_unit(np.array(-0.47319176), "hartree")
+        self.assertTrue(np.array_equal(result, expected_result))
+
+    def test_energy_XC_potential(self):
+        result = self.results["energy_XC_potential"]
+        expected_result = convert_unit(np.array(-0.65031699), "hartree")
+        self.assertTrue(np.array_equal(result, expected_result))
 
     # def test_energy_total_scf_iteration(self):
         # result = self.results["energy_total_scf_iteration"]
@@ -128,56 +195,12 @@ class TestSinglePoint(unittest.TestCase):
         # expected_result = convert_unit(np.array(-9.4555961214), "hartree")
         # self.assertTrue(np.array_equal(result[0], expected_result))
 
-    # def test_energy_total(self):
-        # result = self.results["energy_total"]
-        # expected_result = convert_unit(np.array(-31.297885372811074), "hartree")
-        # self.assertTrue(np.array_equal(result, expected_result))
 
     # def test_electronic_kinetic_energy(self):
         # result = self.results["electronic_kinetic_energy"]
         # expected_result = convert_unit(np.array(13.31525592466419), "hartree")
         # self.assertTrue(np.array_equal(result, expected_result))
 
-    # def test_atom_forces(self):
-        # result = self.results["atom_forces"]
-        # expected_result = convert_unit(
-            # np.array([
-                # [0.00000000, 0.00000000, 0.00000000],
-                # [0.00000000, 0.00000001, 0.00000001],
-                # [0.00000001, 0.00000001, 0.00000000],
-                # [0.00000001, 0.00000000, 0.00000001],
-                # [-0.00000001, -0.00000001, -0.00000001],
-                # [-0.00000001, -0.00000001, -0.00000001],
-                # [-0.00000001, -0.00000001, -0.00000001],
-                # [-0.00000001, -0.00000001, -0.00000001],
-            # ]),
-            # "forceAu"
-        # )
-        # self.assertTrue(np.array_equal(result, expected_result))
-
-    # def test_atom_label(self):
-        # atom_labels = self.results["atom_labels"]
-        # expected_labels = np.array(8*["Si1"])
-        # self.assertTrue(np.array_equal(atom_labels, expected_labels))
-
-    # def test_simulation_cell(self):
-        # cell = self.results["simulation_cell"]
-        # n_vectors = cell.shape[0]
-        # n_dim = cell.shape[1]
-        # self.assertEqual(n_vectors, 3)
-        # self.assertEqual(n_dim, 3)
-        # expected_cell = convert_unit(np.array([[5.431, 0, 0], [0, 5.431, 0], [0, 0, 5.431]]), "angstrom")
-        # self.assertTrue(np.array_equal(cell, expected_cell))
-
-    # def test_number_of_atoms(self):
-        # n_atoms = self.results["number_of_atoms"]
-        # self.assertEqual(n_atoms, 8)
-
-    # def test_atom_position(self):
-        # atom_position = self.results["atom_positions"]
-        # expected_position = convert_unit(np.array([4.073023, 4.073023, 1.357674]), "angstrom")
-        # self.assertTrue(np.array_equal(atom_position[-1, :], expected_position))
-
     # def test_x_cp2k_filenames(self):
         # input_filename = self.results["x_cp2k_input_filename"]
         # expected_input = "si_bulk8.inp"
@@ -207,9 +230,6 @@ class TestSinglePoint(unittest.TestCase):
         # multiplicity = self.results["spin_target_multiplicity"]
         # self.assertEqual(multiplicity, 1)
 
-    # def test_total_charge(self):
-        # charge = self.results["total_charge"]
-        # self.assertEqual(charge, 0)
 
     # def test_section_basis_set_atom_centered(self):
         # basis = self.results["section_basis_set_atom_centered"][0]