diff --git a/gaussianparser/metainfo/__init__.py b/gaussianparser/metainfo/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..9491b9a833e0319d32f563fc7f95b8edbe4ead49
--- /dev/null
+++ b/gaussianparser/metainfo/__init__.py
@@ -0,0 +1,13 @@
+import sys
+from nomad.metainfo import Environment
+from nomad.metainfo.legacy import LegacyMetainfoEnvironment
+import gaussianparser.metainfo.gaussian
+import nomad.datamodel.metainfo.common
+import nomad.datamodel.metainfo.public
+import nomad.datamodel.metainfo.general
+
+m_env = LegacyMetainfoEnvironment()
+m_env.m_add_sub_section(Environment.packages, sys.modules['gaussianparser.metainfo.gaussian'].m_package)  # type: ignore
+m_env.m_add_sub_section(Environment.packages, sys.modules['nomad.datamodel.metainfo.common'].m_package)  # type: ignore
+m_env.m_add_sub_section(Environment.packages, sys.modules['nomad.datamodel.metainfo.public'].m_package)  # type: ignore
+m_env.m_add_sub_section(Environment.packages, sys.modules['nomad.datamodel.metainfo.general'].m_package)  # type: ignore
diff --git a/gaussianparser/metainfo/gaussian.py b/gaussianparser/metainfo/gaussian.py
new file mode 100644
index 0000000000000000000000000000000000000000..bcb5f51c68747e3c52d255a953160ae655e6f65d
--- /dev/null
+++ b/gaussianparser/metainfo/gaussian.py
@@ -0,0 +1,1632 @@
+import numpy as np            # pylint: disable=unused-import
+import typing                 # pylint: disable=unused-import
+from nomad.metainfo import (  # pylint: disable=unused-import
+    MSection, MCategory, Category, Package, Quantity, Section, SubSection, SectionProxy,
+    Reference
+)
+from nomad.metainfo.legacy import LegacyDefinition
+
+from nomad.datamodel.metainfo import public
+
+m_package = Package(
+    name='gaussian_nomadmetainfo_json',
+    description='None',
+    a_legacy=LegacyDefinition(name='gaussian.nomadmetainfo.json'))
+
+
+class x_gaussian_configuration_core(MCategory):
+    '''
+    Properties defining the current configuration.
+    '''
+
+    m_def = Category(
+        a_legacy=LegacyDefinition(name='x_gaussian_configuration_core'))
+
+
+class x_gaussian_atom_forces_type(MCategory):
+    '''
+    Some forces on the atoms (i.e. minus derivatives of some energy with respect to the
+    atom position).
+    '''
+
+    m_def = Category(
+        a_legacy=LegacyDefinition(name='x_gaussian_atom_forces_type'))
+
+
+class x_gaussian_scf_info(MCategory):
+    '''
+    Information on the self-consistent field (SCF) procedure.
+    '''
+
+    m_def = Category(
+        a_legacy=LegacyDefinition(name='x_gaussian_scf_info'))
+
+
+class x_gaussian_section_geometry(MSection):
+    '''
+    section that contains Cartesian coordinates of the system for a given geometry
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_geometry'))
+
+    x_gaussian_atomic_number = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        atomic number for atoms
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_atomic_number'))
+
+    x_gaussian_atom_x_coord = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='meter',
+        description='''
+        x coordinate for the atoms
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_atom_x_coord'))
+
+    x_gaussian_atom_y_coord = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='meter',
+        description='''
+        y coordinate for the atoms
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_atom_y_coord'))
+
+    x_gaussian_atom_z_coord = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='meter',
+        description='''
+        z coordinate for the atoms
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_atom_z_coord'))
+
+
+class x_gaussian_section_hybrid_coeffs(MSection):
+    '''
+    section that contains coefficients for the hybrid DFT functionals
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_hybrid_coeffs'))
+
+    hybrid_xc_coeff1 = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Coefficient for Hartree-Fock exchange in hybrid DFT functionals
+        ''',
+        a_legacy=LegacyDefinition(name='hybrid_xc_coeff1'))
+
+    hybrid_xc_coeff2 = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Coefficients for Slater exchange, non-local exchange, local correlation, and non-
+        local correlation, respectively, in hybrid DFT functionals
+        ''',
+        a_legacy=LegacyDefinition(name='hybrid_xc_coeff2'))
+
+    x_gaussian_hybrid_xc_hfx = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Hartree-Fock exchange
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_hybrid_xc_hfx'))
+
+    x_gaussian_hybrid_xc_slater = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Slater exchange
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_hybrid_xc_slater'))
+
+    x_gaussian_hybrid_xc_nonlocalex = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Slater exchange
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_hybrid_xc_nonlocalex'))
+
+    x_gaussian_hybrid_xc_localcorr = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Slater exchange
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_hybrid_xc_localcorr'))
+
+    x_gaussian_hybrid_xc_nonlocalcorr = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Slater exchange
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_hybrid_xc_nonlocalcorr'))
+
+
+class x_gaussian_section_total_scf_one_geometry(MSection):
+    '''
+    Check for SCF convergence and writes the total energy value to backend
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_total_scf_one_geometry'))
+
+
+class x_gaussian_section_times(MSection):
+    '''
+    section that contains the execution times of the run
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_times'))
+
+    x_gaussian_program_termination_date = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        -
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_program_termination_date'))
+
+    x_gaussian_program_cpu_time = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        -
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_program_cpu_time'))
+
+
+class x_gaussian_section_atom_forces(MSection):
+    '''
+    section that contains Cartesian coordinates of the system for a given geometry
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_atom_forces'))
+
+    x_gaussian_atom_x_force = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='newton',
+        description='''
+        -
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_atom_x_force'))
+
+    x_gaussian_atom_y_force = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='newton',
+        description='''
+        -
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_atom_y_force'))
+
+    x_gaussian_atom_z_force = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='newton',
+        description='''
+        -
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_atom_z_force'))
+
+
+class x_gaussian_section_molecular_multipoles(MSection):
+    '''
+    Section describing multipoles (charges, dipoles,...).
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_molecular_multipoles'))
+
+    charge = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the total charge of the system (in electronic units).
+        ''',
+        a_legacy=LegacyDefinition(name='charge'))
+
+    dipole_moment_x = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the x component of the dipole moment (Debye).
+        ''',
+        a_legacy=LegacyDefinition(name='dipole_moment_x'))
+
+    dipole_moment_y = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the y component of the dipole moment (Debye).
+        ''',
+        a_legacy=LegacyDefinition(name='dipole_moment_y'))
+
+    dipole_moment_z = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the z component of the dipole moment (Debye).
+        ''',
+        a_legacy=LegacyDefinition(name='dipole_moment_z'))
+
+    quadrupole_moment_xx = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xx component of the quadrupole moment (Debye-Ang).
+        ''',
+        a_legacy=LegacyDefinition(name='quadrupole_moment_xx'))
+
+    quadrupole_moment_yy = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the yy component of the quadrupole moment (Debye-Ang).
+        ''',
+        a_legacy=LegacyDefinition(name='quadrupole_moment_yy'))
+
+    quadrupole_moment_zz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the zz component of the quadrupole moment (Debye-Ang).
+        ''',
+        a_legacy=LegacyDefinition(name='quadrupole_moment_zz'))
+
+    quadrupole_moment_xy = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xy component of the quadrupole moment (Debye-Ang).
+        ''',
+        a_legacy=LegacyDefinition(name='quadrupole_moment_xy'))
+
+    quadrupole_moment_xz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xz component of the quadrupole moment (Debye-Ang).
+        ''',
+        a_legacy=LegacyDefinition(name='quadrupole_moment_xz'))
+
+    quadrupole_moment_yz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the yz component of the quadrupole moment (Debye-Ang).
+        ''',
+        a_legacy=LegacyDefinition(name='quadrupole_moment_yz'))
+
+    octapole_moment_xxx = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xxx component of the octapole moment (Debye-Ang**2).
+        ''',
+        a_legacy=LegacyDefinition(name='octapole_moment_xxx'))
+
+    octapole_moment_yyy = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the yyy component of the octapole moment (Debye-Ang**2).
+        ''',
+        a_legacy=LegacyDefinition(name='octapole_moment_yyy'))
+
+    octapole_moment_zzz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the zzz component of the octapole moment (Debye-Ang**2).
+        ''',
+        a_legacy=LegacyDefinition(name='octapole_moment_zzz'))
+
+    octapole_moment_xyy = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xyy component of the octapole moment (Debye-Ang**2).
+        ''',
+        a_legacy=LegacyDefinition(name='octapole_moment_xyy'))
+
+    octapole_moment_xxy = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xxy component of the octapole moment (Debye-Ang**2).
+        ''',
+        a_legacy=LegacyDefinition(name='octapole_moment_xxy'))
+
+    octapole_moment_xxz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xxz component of the octapole moment (Debye-Ang**2).
+        ''',
+        a_legacy=LegacyDefinition(name='octapole_moment_xxz'))
+
+    octapole_moment_xzz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xzz component of the octapole moment (Debye-Ang**2).
+        ''',
+        a_legacy=LegacyDefinition(name='octapole_moment_xzz'))
+
+    octapole_moment_yzz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the yzz component of the octapole moment (Debye-Ang**2).
+        ''',
+        a_legacy=LegacyDefinition(name='octapole_moment_yzz'))
+
+    octapole_moment_yyz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the yyz component of the octapole moment (Debye-Ang**2).
+        ''',
+        a_legacy=LegacyDefinition(name='octapole_moment_yyz'))
+
+    octapole_moment_xyz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xyz component of the octapole moment (Debye-Ang**2).
+        ''',
+        a_legacy=LegacyDefinition(name='octapole_moment_xyz'))
+
+    hexadecapole_moment_xxxx = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xxxx component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_xxxx'))
+
+    hexadecapole_moment_yyyy = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the yyyy component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_yyyy'))
+
+    hexadecapole_moment_zzzz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the zzzz component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_zzzz'))
+
+    hexadecapole_moment_xxxy = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xxxy component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_xxxy'))
+
+    hexadecapole_moment_xxxz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xxxz component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_xxxz'))
+
+    hexadecapole_moment_yyyx = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the yyyx component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_yyyx'))
+
+    hexadecapole_moment_yyyz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the yyyz component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_yyyz'))
+
+    hexadecapole_moment_zzzx = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the zzzx component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_zzzx'))
+
+    hexadecapole_moment_zzzy = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the zzzy component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_zzzy'))
+
+    hexadecapole_moment_xxyy = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xxyy component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_xxyy'))
+
+    hexadecapole_moment_xxzz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xxzz component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_xxzz'))
+
+    hexadecapole_moment_yyzz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the yyzz component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_yyzz'))
+
+    hexadecapole_moment_xxyz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the xxyz component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_xxyz'))
+
+    hexadecapole_moment_yyxz = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the yyxz component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_yyxz'))
+
+    hexadecapole_moment_zzxy = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Value of the zzxy component of the hexadecapole moment (Debye-Ang**3).
+        ''',
+        a_legacy=LegacyDefinition(name='hexadecapole_moment_zzxy'))
+
+    x_gaussian_molecular_multipole_lm = Quantity(
+        type=np.dtype(np.int32),
+        shape=['x_gaussian_number_of_lm_molecular_multipoles', 2],
+        description='''
+        Tuples of $l$ and $m$ values for which the molecular multipoles (including the
+        electric charge, dipole, etc.) are given. The meaning of the integer number $l$ is
+        monopole/charge for $l=0$, dipole for $l=1$, quadrupole for $l=2$, etc. The
+        meaning of the integer numbers $m$ is specified by molecular_multipole_m_kind.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_molecular_multipole_lm'))
+
+    x_gaussian_molecular_multipole_m_kind = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        String describing what the integer numbers $m$ in molecular_multipole_lm mean.
+        Allowed values (for atomic multipoles) are listed in the [m\\_kind wiki
+        page](https://gitlab.rzg.mpg.de/nomad-lab/nomad-meta-info/wikis/metainfo/m-kind).
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_molecular_multipole_m_kind'))
+
+    x_gaussian_molecular_multipole_values = Quantity(
+        type=np.dtype(np.float64),
+        shape=['x_gaussian_number_of_lm_molecular_multipoles'],
+        description='''
+        Value of the multipoles (including the monopole/charge for $l$ = 0, the dipole for
+        $l$ = 1, etc.).
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_molecular_multipole_values'))
+
+    x_gaussian_number_of_lm_molecular_multipoles = Quantity(
+        type=int,
+        shape=[],
+        description='''
+        Number of $l,m$ combinations for which molecular multipoles are given.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_number_of_lm_molecular_multipoles'))
+
+
+class x_gaussian_section_geometry_optimization_info(MSection):
+    '''
+    Specifies whether a geometry optimization is converged.
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_geometry_optimization_info'))
+
+    x_gaussian_geometry_optimization_converged = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Specifies whether a geometry optimization is converged.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_geometry_optimization_converged'))
+
+
+class x_gaussian_section_frequencies(MSection):
+    '''
+    section for the values of the frequencies, reduced masses and normal mode vectors
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_frequencies'))
+
+    x_gaussian_frequency_values = Quantity(
+        type=str,
+        shape=['number_of_frequency_rows'],
+        description='''
+        values of frequencies, in cm-1
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_frequency_values'))
+
+    x_gaussian_frequencies = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_frequencies'],
+        description='''
+        values of frequencies, in cm-1
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_frequencies'))
+
+    x_gaussian_reduced_masses = Quantity(
+        type=str,
+        shape=['number_of_reduced_masses_rows'],
+        description='''
+        values of normal mode reduced masses
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_reduced_masses'))
+
+    x_gaussian_red_masses = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_frequencies'],
+        description='''
+        values of normal mode reduced masses
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_red_masses'))
+
+    x_gaussian_normal_modes = Quantity(
+        type=str,
+        shape=['number_of_normal_modes_rows'],
+        description='''
+        normal mode vectors
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_normal_modes'))
+
+    x_gaussian_normal_mode_values = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_frequencies', 'number_of_atoms', 3],
+        description='''
+        normal mode vectors
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_normal_mode_values'))
+
+
+class x_gaussian_section_thermochem(MSection):
+    '''
+    section for thermochemical quantities
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_thermochem'))
+
+    x_gaussian_temperature = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Value of temperature for thermochemical values
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_temperature'))
+
+    x_gaussian_pressure = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Value of pressure for thermochemical values
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_pressure'))
+
+    x_gaussian_moment_of_inertia_X = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        X component of moment of inertia
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_moment_of_inertia_X'))
+
+    x_gaussian_moment_of_inertia_Y = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Y component of moment of inertia
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_moment_of_inertia_Y'))
+
+    x_gaussian_moment_of_inertia_Z = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Z component of moment of inertia
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_moment_of_inertia_Z'))
+
+    x_gaussian_moments = Quantity(
+        type=np.dtype(np.float64),
+        shape=[3],
+        description='''
+        Values of moments of inertia
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_moments'))
+
+    x_gaussian_zero_point_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Value of zero-point energy
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_zero_point_energy'))
+
+    x_gaussian_thermal_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Value of thermal correction to total energy
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_thermal_correction_energy'))
+
+    x_gaussian_thermal_correction_enthalpy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Value of thermal correction to enthalpy
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_thermal_correction_enthalpy'))
+
+    x_gaussian_thermal_correction_free_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Value of thermal correction to Gibbs free energy
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_thermal_correction_free_energy'))
+
+
+class x_gaussian_section_force_constant_matrix(MSection):
+    '''
+    section for force constant matrix in Cartesians. Units are mdyne.Angstrom
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_force_constant_matrix'))
+
+    x_gaussian_force_constants = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Force constant matrix elements
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_force_constants'))
+
+    x_gaussian_force_constant_values = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_degrees_of_freedom', 'number_of_degrees_of_freedom'],
+        description='''
+        Force constant matrix element values
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_force_constant_values'))
+
+
+class x_gaussian_section_orbital_symmetries(MSection):
+    '''
+    section for the symmetry of the MOs
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_orbital_symmetries'))
+
+    x_gaussian_alpha_occ_symmetry_values = Quantity(
+        type=str,
+        shape=['number_of_alpha_occ_rows'],
+        description='''
+        symmetry of the alpha occupied MOs
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_alpha_occ_symmetry_values'))
+
+    x_gaussian_alpha_vir_symmetry_values = Quantity(
+        type=str,
+        shape=['number_of_alpha_vir_rows'],
+        description='''
+        symmetry of the alpha virtual MOs
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_alpha_vir_symmetry_values'))
+
+    x_gaussian_beta_occ_symmetry_values = Quantity(
+        type=str,
+        shape=['number_of_beta_occ_rows'],
+        description='''
+        symmetry of the beta occupied MOs
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_beta_occ_symmetry_values'))
+
+    x_gaussian_beta_vir_symmetry_values = Quantity(
+        type=str,
+        shape=['number_of_beta_vir_rows'],
+        description='''
+        symmetry of the beta virtual MOs
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_beta_vir_symmetry_values'))
+
+    x_gaussian_alpha_symmetries = Quantity(
+        type=str,
+        shape=['number_of_alpha_mos'],
+        description='''
+        symmetry of the alpha MOs
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_alpha_symmetries'))
+
+    x_gaussian_beta_symmetries = Quantity(
+        type=str,
+        shape=['number_of_beta_mos'],
+        description='''
+        symmetry of the beta MOs
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_beta_symmetries'))
+
+
+class x_gaussian_section_symmetry(MSection):
+    '''
+    section for the symmetry of the electronic state
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_symmetry'))
+
+    x_gaussian_elstate_symmetry = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        symmetry group of the electronic state
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_elstate_symmetry'))
+
+
+class x_gaussian_section_elstruc_method(MSection):
+    '''
+    Section containing electronic structure method.
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_elstruc_method'))
+
+    x_gaussian_electronic_structure_method = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Name of electronic structure method.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_electronic_structure_method'))
+
+
+class x_gaussian_section_energy_components(MSection):
+    '''
+    Section containing total energy components
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_energy_components'))
+
+
+class x_gaussian_section_moller_plesset(MSection):
+    '''
+    Perturbative Moller-Plesset energies.
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_moller_plesset'))
+
+    x_gaussian_mp2_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Difference between SCF and MP2 energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_mp2_correction_energy'))
+
+    x_gaussian_mp3_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Difference between SCF and MP3 energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_mp3_correction_energy'))
+
+    x_gaussian_mp4dq_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Difference between SCF and MP4(DQ) energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_mp4dq_correction_energy'))
+
+    x_gaussian_mp4sdq_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Difference between SCF and MP4(SDQ) energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_mp4sdq_correction_energy'))
+
+    x_gaussian_mp4sdtq_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Difference between SCF and MP4(SDTQ) energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_mp4sdtq_correction_energy'))
+
+    x_gaussian_mp5_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Difference between SCF and MP5 energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_mp5_correction_energy'))
+
+
+class x_gaussian_section_coupled_cluster(MSection):
+    '''
+    Coupled cluster energies.
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_coupled_cluster'))
+
+    x_gaussian_ccsd_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Difference between SCF and CCSD energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_ccsd_correction_energy'))
+
+
+class x_gaussian_section_quadratic_ci(MSection):
+    '''
+    Quadratic CI energies.
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_quadratic_ci'))
+
+    x_gaussian_qcisd_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Difference between SCF and QCISD energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_qcisd_correction_energy'))
+
+    x_gaussian_qcisdtq_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Difference between SCF and QCISD(TQ) energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_qcisdtq_correction_energy'))
+
+
+class x_gaussian_section_ci(MSection):
+    '''
+    CI energies.
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_ci'))
+
+    x_gaussian_ci_correction_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Difference between SCF and CI energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_ci_correction_energy'))
+
+
+class x_gaussian_section_semiempirical(MSection):
+    '''
+    semiempirical convergence cycles and energies.
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_semiempirical'))
+
+    x_gaussian_semiempirical_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        semiempirical energies.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_semiempirical_energy'))
+
+    x_gaussian_semiempirical_method = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        semiempirical method.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_semiempirical_method'))
+
+
+class x_gaussian_section_molmech(MSection):
+    '''
+    molecular mechanics method and energies.
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_molmech'))
+
+    x_gaussian_molmech_method = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        molecular mechanics method.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_molmech_method'))
+
+
+class x_gaussian_section_models(MSection):
+    '''
+    composite model chemistries.
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_models'))
+
+
+class x_gaussian_section_excited_initial(MSection):
+    '''
+    Excited state energies and properties
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_excited_initial'))
+
+
+class x_gaussian_section_excited(MSection):
+    '''
+    CI singles, TDDFT/TDHF, ZINDO or EOMCCSD excited state energies and properties
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_excited'))
+
+    x_gaussian_excited_state_number = Quantity(
+        type=np.dtype(np.int32),
+        shape=[],
+        description='''
+        CIS, TDDFT/TDHF, ZINDO or EOMCCSD excited state number
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_excited_state_number'))
+
+    x_gaussian_excited_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        CIS, TDDFT/TDHF, ZINDO or EOMCCSD excited state energy
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_excited_energy'))
+
+    x_gaussian_excited_oscstrength = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        CIS, TDDFT/TDHF, ZINDO or EOMCCSD excited state oscillator strength
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_excited_oscstrength'))
+
+    x_gaussian_excited_spin_squared = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        CIS, TDDFT/TDHF, ZINDO or EOMCCSD excited state spin squared value
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_excited_spin_squared'))
+
+    x_gaussian_excited_transition = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        CIS, TDDFT/TDHF, ZINDO or EOMCCSD excited state MOs involved in transitions and
+        their coefficients
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_excited_transition'))
+
+
+class x_gaussian_section_casscf(MSection):
+    '''
+    CASSCF energies and properties
+    '''
+
+    m_def = Section(validate=False, a_legacy=LegacyDefinition(name='x_gaussian_section_casscf'))
+
+    x_gaussian_casscf_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        CASSCF energy
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_casscf_energy'))
+
+    x_gaussian_casscf_determinant = Quantity(
+        type=np.dtype(np.int32),
+        shape=[],
+        description='''
+        CASSCF determinant number
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_casscf_determinant'))
+
+    x_gaussian_casscf_coefficient = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        CASSCF determinant coefficient
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_casscf_coefficient'))
+
+
+class section_system(public.section_system):
+
+    m_def = Section(validate=False, extends_base_section=True, a_legacy=LegacyDefinition(name='section_system'))
+
+    x_gaussian_number_of_atoms = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        number of atoms of the system
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_number_of_atoms'))
+
+    x_gaussian_atomic_masses = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        atomic masses for atoms
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_atomic_masses'))
+
+    x_gaussian_total_charge = Quantity(
+        type=np.dtype(np.int32),
+        shape=[],
+        description='''
+        Total charge of the system.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_total_charge'))
+
+    x_gaussian_spin_target_multiplicity = Quantity(
+        type=np.dtype(np.int32),
+        shape=[],
+        description='''
+        Target (user-imposed) value of the spin multiplicity $M=2S+1$, where $S$ is the
+        total spin. It is an integer value. This value is not necessarly the value
+        obtained at the end of the calculation. See spin_S2 for the converged value of the
+        spin moment.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_spin_target_multiplicity'))
+
+    x_gaussian_geometry_lattice_vector_x = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        x component of lattice vector
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_geometry_lattice_vector_x'))
+
+    x_gaussian_geometry_lattice_vector_y = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        y component of lattice vector
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_geometry_lattice_vector_y'))
+
+    x_gaussian_geometry_lattice_vector_z = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        z component of lattice vector
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_geometry_lattice_vector_z'))
+
+    x_gaussian_masses = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_atoms'],
+        description='''
+        values of atomic masses
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_masses'))
+
+
+class section_single_configuration_calculation(public.section_single_configuration_calculation):
+
+    m_def = Section(validate=False, extends_base_section=True, a_legacy=LegacyDefinition(name='section_single_configuration_calculation'))
+
+    x_gaussian_atom_forces = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_atoms', 3],
+        unit='newton',
+        description='''
+        Forces acting on the atoms, calculated as minus gradient of energy_total.
+        ''',
+        categories=[x_gaussian_atom_forces_type],
+        a_legacy=LegacyDefinition(name='x_gaussian_atom_forces'))
+
+    x_gaussian_energy_total_scf_converged = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        SCF total energy converged for a given geometry.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_energy_total_scf_converged'))
+
+    x_gaussian_number_of_scf_iterations = Quantity(
+        type=int,
+        shape=[],
+        description='''
+        Number of performed self-consistent field (SCF) iterations at DFT level.
+        ''',
+        categories=[x_gaussian_scf_info],
+        a_legacy=LegacyDefinition(name='x_gaussian_number_of_scf_iterations'))
+
+    x_gaussian_section_hybrid_coeffs = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_hybrid_coeffs'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_hybrid_coeffs'))
+
+    x_gaussian_section_total_scf_one_geometry = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_total_scf_one_geometry'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_total_scf_one_geometry'))
+
+    x_gaussian_section_atom_forces = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_atom_forces'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_atom_forces'))
+
+    x_gaussian_section_molecular_multipoles = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_molecular_multipoles'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_molecular_multipoles'))
+
+    x_gaussian_section_energy_components = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_energy_components'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_energy_components'))
+
+    x_gaussian_section_moller_plesset = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_moller_plesset'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_moller_plesset'))
+
+    x_gaussian_section_coupled_cluster = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_coupled_cluster'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_coupled_cluster'))
+
+    x_gaussian_section_quadratic_ci = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_quadratic_ci'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_quadratic_ci'))
+
+    x_gaussian_section_ci = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_ci'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_ci'))
+
+    x_gaussian_section_semiempirical = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_semiempirical'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_semiempirical'))
+
+    x_gaussian_section_molmech = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_molmech'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_molmech'))
+
+    x_gaussian_section_models = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_models'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_models'))
+
+    x_gaussian_section_excited_initial = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_excited_initial'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_excited_initial'))
+
+    x_gaussian_section_excited = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_excited'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_excited'))
+
+    x_gaussian_section_casscf = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_casscf'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_casscf'))
+
+
+class section_run(public.section_run):
+
+    m_def = Section(validate=False, extends_base_section=True, a_legacy=LegacyDefinition(name='section_run'))
+
+    x_gaussian_chk_file = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        binary file with detailed output information
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_chk_file'))
+
+    x_gaussian_memory = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        total memory for the run
+        ''',
+        categories=[public.settings_run],
+        a_legacy=LegacyDefinition(name='x_gaussian_memory'))
+
+    x_gaussian_number_of_processors = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        number of processors used
+        ''',
+        categories=[public.settings_run, public.parallelization_info, public.accessory_info],
+        a_legacy=LegacyDefinition(name='x_gaussian_number_of_processors'))
+
+    x_gaussian_program_execution_date = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        -
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_program_execution_date'))
+
+    x_gaussian_program_release_date = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        -
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_program_release_date'))
+
+    x_gaussian_program_implementation = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        -
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_program_implementation'))
+
+    x_gaussian_atom_positions = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_atoms', 3],
+        unit='meter',
+        description='''
+        Positions of all the atoms, in Cartesian coordinates. This metadata defines a
+        configuration and is therefore required.
+        ''',
+        categories=[x_gaussian_configuration_core],
+        a_legacy=LegacyDefinition(name='x_gaussian_atom_positions'))
+
+    x_gaussian_atom_labels = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Labels of the atoms. These strings identify the atom kind and conventionally start
+        with the symbol of the atomic species, possibly followed by a number. The same
+        atomic species can be labelled with more than one atom_labels in order to
+        distinguish, e.g., atoms of the same species assigned to different atom-centered
+        basis sets or pseudopotentials, or simply atoms in different locations in the
+        structure (e.g., bulk and surface). These labels can also be used for *particles*
+        that do not correspond to physical atoms (e.g., ghost atoms in some codes using
+        atom-centered basis sets). This metadata defines a configuration and is therefore
+        required.
+        ''',
+        categories=[x_gaussian_configuration_core],
+        a_legacy=LegacyDefinition(name='x_gaussian_atom_labels'))
+
+    x_gaussian_section_geometry = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_geometry'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_geometry'))
+
+    x_gaussian_section_times = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_times'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_times'))
+
+    x_gaussian_section_geometry_optimization_info = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_geometry_optimization_info'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_geometry_optimization_info'))
+
+    x_gaussian_section_frequencies = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_frequencies'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_frequencies'))
+
+    x_gaussian_section_thermochem = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_thermochem'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_thermochem'))
+
+    x_gaussian_section_force_constant_matrix = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_force_constant_matrix'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_force_constant_matrix'))
+
+    x_gaussian_section_orbital_symmetries = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_orbital_symmetries'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_orbital_symmetries'))
+
+    x_gaussian_section_symmetry = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_symmetry'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_symmetry'))
+
+
+class section_scf_iteration(public.section_scf_iteration):
+
+    m_def = Section(validate=False, extends_base_section=True, a_legacy=LegacyDefinition(name='section_scf_iteration'))
+
+    x_gaussian_energy_total_scf_iteration = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Total energy calculated with a given method during the self-consistent field (SCF)
+        iterations.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_energy_total_scf_iteration'))
+
+    x_gaussian_delta_energy_total_scf_iteration = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Total energy increment calculated with a given method during the self-consistent
+        field (SCF) iterations.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_delta_energy_total_scf_iteration'))
+
+    x_gaussian_single_configuration_calculation_converged = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Determines whether a single configuration calculation is converged.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_single_configuration_calculation_converged'))
+
+    x_gaussian_spin_S2 = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Real value of spin squared.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_spin_S2'))
+
+    x_gaussian_after_annihilation_spin_S2 = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        description='''
+        Real value of spin squared resulting from the annihilation of the first spin
+        contaminant.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_after_annihilation_spin_S2'))
+
+    x_gaussian_energy_scf = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Value of the SCF total energy, either HF or DFT.
+        ''',
+        categories=[public.energy_value, public.energy_total_potential, public.energy_component],
+        a_legacy=LegacyDefinition(name='x_gaussian_energy_scf'))
+
+    x_gaussian_perturbation_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Value of the perturbation energy for double hybrids
+        ''',
+        categories=[public.energy_value, public.energy_total_potential, public.energy_component],
+        a_legacy=LegacyDefinition(name='x_gaussian_perturbation_energy'))
+
+    x_gaussian_hf_detect = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        Determine if the SCF method is one of RHF, UHF, or ROHF
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_hf_detect'))
+
+    x_gaussian_energy_electrostatic = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Total electrostatic energy (nuclei + electrons), defined consistently with
+        calculation_method.
+        ''',
+        categories=[public.energy_value, public.energy_component],
+        a_legacy=LegacyDefinition(name='x_gaussian_energy_electrostatic'))
+
+    x_gaussian_energy_error = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Error in the total energy. Defined consistently with XC_method.
+        ''',
+        categories=[public.error_estimate_contribution, public.energy_value],
+        a_legacy=LegacyDefinition(name='x_gaussian_energy_error'))
+
+    x_gaussian_electronic_kinetic_energy = Quantity(
+        type=np.dtype(np.float64),
+        shape=[],
+        unit='joule',
+        description='''
+        Self-consistent electronic kinetic energy as defined in XC_method.
+        ''',
+        categories=[public.energy_value, public.energy_component],
+        a_legacy=LegacyDefinition(name='x_gaussian_electronic_kinetic_energy'))
+
+
+class section_eigenvalues(public.section_eigenvalues):
+
+    m_def = Section(validate=False, extends_base_section=True, a_legacy=LegacyDefinition(name='section_eigenvalues'))
+
+    x_gaussian_alpha_occ_eigenvalues_values = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        values of eigenenergies for occupied alpha MOs
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_alpha_occ_eigenvalues_values'))
+
+    x_gaussian_alpha_vir_eigenvalues_values = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        values of eigenenergies for virtual alpha MOs
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_alpha_vir_eigenvalues_values'))
+
+    x_gaussian_beta_occ_eigenvalues_values = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        values of eigenenergies for occupied beta MOs
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_beta_occ_eigenvalues_values'))
+
+    x_gaussian_beta_vir_eigenvalues_values = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        values of eigenenergies for virtual beta MOs
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_beta_vir_eigenvalues_values'))
+
+    x_gaussian_alpha_eigenvalues = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_alpha_mos'],
+        description='''
+        values of eigenenergies, alpha occ
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_alpha_eigenvalues'))
+
+    x_gaussian_beta_eigenvalues = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_beta_mos'],
+        description='''
+        values of eigenenergies, beta occ
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_beta_eigenvalues'))
+
+    x_gaussian_alpha_occupations = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_alpha_mos'],
+        description='''
+        values of eigenenergies, alpha occ
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_alpha_occupations'))
+
+    x_gaussian_beta_occupations = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_beta_mos'],
+        description='''
+        values of eigenenergies, beta occ
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_beta_occupations'))
+
+    x_gaussian_eigenvalues_occupation = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_spin_channels', 'number_of_eigenvalues_kpoints', 'number_of_eigenvalues'],
+        description='''
+        Occupation of the eigenstates whose (energy) eigenvalues are given in
+        eigenvalues_values.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_eigenvalues_occupation'))
+
+    x_gaussian_eigenvalues_values = Quantity(
+        type=np.dtype(np.float64),
+        shape=['number_of_spin_channels', 'number_of_eigenvalues_kpoints', 'number_of_eigenvalues'],
+        unit='joule',
+        description='''
+        Values of the (electronic-energy) eigenvalues. Their occupations are given in
+        eigenvalues_occupation.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_eigenvalues_values'))
+
+
+class section_method(public.section_method):
+
+    m_def = Section(validate=False, extends_base_section=True, a_legacy=LegacyDefinition(name='section_method'))
+
+    x_gaussian_settings = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        electronic structure method, basis set, etc.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_settings'))
+
+    x_gaussian_settings_corrected = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        electronic structure method, basis set, etc.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_settings_corrected'))
+
+    x_gaussian_method = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        String identifying in an unique way the electronic structure method used for the
+        final wavefunctions.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_method'))
+
+    x_gaussian_xc = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        String identifying in an unique way the XC method used for the final
+        wavefunctions.
+        ''',
+        a_legacy=LegacyDefinition(name='x_gaussian_xc'))
+
+    x_gaussian_section_elstruc_method = SubSection(
+        sub_section=SectionProxy('x_gaussian_section_elstruc_method'),
+        repeats=True,
+        a_legacy=LegacyDefinition(name='x_gaussian_section_elstruc_method'))
+
+
+m_package.__init_metainfo__()
diff --git a/gaussianparser/parser_gaussian.py b/gaussianparser/parser_gaussian.py
index bb5c8cc7b3c09eb634fd42777d9dd8ab3d4f5cf5..16c83930641d00e0225a8e91154d5967511e43e5 100644
--- a/gaussianparser/parser_gaussian.py
+++ b/gaussianparser/parser_gaussian.py
@@ -826,7 +826,7 @@ class GaussianParserContext(object):
              for k in range(i+1,dim):
                  cartforceconst[i,k] = cartforceconst[k,i]
 
-          cartforceconst = convert_unit(cartforceconst, "forceAu / bohr", "J / (meter**2)")
+          cartforceconst = convert_unit(cartforceconst, "hartree / (bohr ** 2)", "J / (meter**2)")
 
           backend.addArrayValues("x_gaussian_force_constant_values", cartforceconst)
 
diff --git a/parser/parser-gaussian/parser_gaussian.py b/parser/parser-gaussian/parser_gaussian.py
index c2fc4c321578c186c5d7d51e4fb58e847c83fc9d..5d236fd16a58a2b26bc7eeaa1afa34bcfde6e8d7 100644
--- a/parser/parser-gaussian/parser_gaussian.py
+++ b/parser/parser-gaussian/parser_gaussian.py
@@ -1,11 +1,11 @@
 # Copyright 2015-2018 Rosendo Valero, Fawzi Mohamed, Ankit Kariryaa
-# 
+#
 #   Licensed under the Apache License, Version 2.0 (the "License");
 #   you may not use this file except in compliance with the License.
 #   You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 #   Unless required by applicable law or agreed to in writing, software
 #   distributed under the License is distributed on an "AS IS" BASIS,
 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -37,7 +37,7 @@ logger = logging.getLogger("nomad.GaussianParser")
 mainFileDescription = SM(
     name = 'root',
     weak = True,
-    forwardMatch = True, 
+    forwardMatch = True,
     startReStr = "",
     subMatchers = [
         SM(name = 'newRun',
@@ -220,7 +220,7 @@ mainFileDescription = SM(
                      ]
                     )
                    ]
-               ),  
+               ),
                   SM(name = 'CASSCFStates',
                    sections = ['x_gaussian_section_casscf'],
                    startReStr = r"\s*EIGENVALUES AND\s*",
@@ -247,7 +247,7 @@ mainFileDescription = SM(
                 startReStr = r"\s+Population analysis",
                 subFlags = SM.SubFlags.Sequenced,
                 subMatchers = [
-                      SM(r"\s*Orbital symmetries"), 
+                      SM(r"\s*Orbital symmetries"),
                       SM(r"\s*Alpha Orbitals"),
                       SM(r"\s*Occupied\s+(?P<x_gaussian_alpha_occ_symmetry_values>\((.+)\))?"),
                       SM(r"\s+(?P<x_gaussian_alpha_occ_symmetry_values>\((.+)\)?)", repeats = True),
@@ -274,7 +274,7 @@ mainFileDescription = SM(
                 forwardMatch = True,
                 subFlags = SM.SubFlags.Sequenced,
                 subMatchers = [
-                      SM(r"\s*Alpha  occ. eigenvalues --\s+(?P<x_gaussian_alpha_occ_eigenvalues_values>-?[^\s.-]+\s+|(\-?\d*\.\d*)\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?)", repeats = True), 
+                      SM(r"\s*Alpha  occ. eigenvalues --\s+(?P<x_gaussian_alpha_occ_eigenvalues_values>-?[^\s.-]+\s+|(\-?\d*\.\d*)\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?)", repeats = True),
                       SM(r"\s*Alpha virt. eigenvalues --\s+(?P<x_gaussian_alpha_vir_eigenvalues_values>-?[^\s.-]+\s+|(\-?\d*\.\d*)\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?)", repeats = True),
                       SM(r"\s*Beta  occ. eigenvalues --\s+(?P<x_gaussian_beta_occ_eigenvalues_values>-?[^\s.-]+\s+|(\-?\d*\.\d*)\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?)", repeats = True),
                       SM(r"\s*Beta virt. eigenvalues --\s+(?P<x_gaussian_beta_vir_eigenvalues_values>-?[^\s.-]+\s+|(\-?\d*\.\d*)\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?\s+(\-?\d*\.\d*)?)", repeats = True),
@@ -297,10 +297,10 @@ mainFileDescription = SM(
                   forwardMatch = False,
                   subMatchers = [
                       SM(r"\s*Charge=(?P<charge>\s*[-0-9.]+)"),
-                      SM(r"\s*Dipole moment "), 
+                      SM(r"\s*Dipole moment "),
                       SM(r"\s+\w+=\s+(?P<dipole_moment_x>[-+0-9EeDd.]+)\s+\w+=\s+(?P<dipole_moment_y>[-+0-9EeDd.]+)\s+\w+=\s+(?P<dipole_moment_z>[-+0-9EeDd.]+)"),
-                      SM(r"\s*Quadrupole moment"), 
-                      SM(r"\s+\w+=\s+(?P<quadrupole_moment_xx>[0-9-.]+)\s+\w+=\s+(?P<quadrupole_moment_yy>[0-9-.]+)\s+\w+=\s+(?P<quadrupole_moment_zz>[0-9-.]+)"), 
+                      SM(r"\s*Quadrupole moment"),
+                      SM(r"\s+\w+=\s+(?P<quadrupole_moment_xx>[0-9-.]+)\s+\w+=\s+(?P<quadrupole_moment_yy>[0-9-.]+)\s+\w+=\s+(?P<quadrupole_moment_zz>[0-9-.]+)"),
                       SM(r"\s+\w+=\s+(?P<quadrupole_moment_xy>[0-9-.]+)\s+\w+=\s+(?P<quadrupole_moment_xz>[0-9-.]+)\s+\w+=\s+(?P<quadrupole_moment_yz>[0-9-.]+)"),
                       SM(r"\s*Traceless Quadrupole moment"),
                       SM(r"\s+\w+=\s+[0-9-.]+\s+\w+=\s+[0-9-.]+\s+\w+=\s+[0-9-.]+"),
@@ -315,7 +315,7 @@ mainFileDescription = SM(
                       SM(r"\s+\w+=\s+(?P<hexadecapole_moment_zzzy>[-+0-9EeDd.]+)\s+\w+=\s+(?P<hexadecapole_moment_xxyy>[-+0-9EeDd.]+)\s+\w+=\s+(?P<hexadecapole_moment_xxzz>[-+0-9EeDd.]+)\s+\w+=\s+(?P<hexadecapole_moment_yyzz>[-+0-9EeDd.]+)"),
                       SM(r"\s+\w+=\s+(?P<hexadecapole_moment_xxyz>[-+0-9EeDd.]+)\s+\w+=\s+(?P<hexadecapole_moment_yyxz>[-+0-9EeDd.]+)\s+\w+=\s+(?P<hexadecapole_moment_zzxy>[-+0-9EeDd.]+)")
                       ]
-             ),    
+             ),
                 SM (name = 'Frequencies',
                      sections = ['x_gaussian_section_frequencies'],
                      startReStr = r"\s*Frequencies --\s+(?:(?:[-]?[0-9]+\.\d*)\s*(?:[-]?[-0-9]+\.\d*)?\s*(?:[-]?[-0-9]+\.\d*)?)",
@@ -347,9 +347,9 @@ mainFileDescription = SM(
                       SM(r"\s*Zero-point correction=\s*(?P<x_gaussian_zero_point_energy__hartree>[0-9.]+)"),
                       SM(r"\s*Thermal correction to Energy=\s*(?P<x_gaussian_thermal_correction_energy__hartree>[0-9.]+)"),
                       SM(r"\s*Thermal correction to Enthalpy=\s*(?P<x_gaussian_thermal_correction_enthalpy__hartree>[0-9.]+)"),
-                      SM(r"\s*Thermal correction to Gibbs Free Energy=\s*(?P<x_gaussian_thermal_correction_free_energy__hartree>[0-9.]+)"), 
+                      SM(r"\s*Thermal correction to Gibbs Free Energy=\s*(?P<x_gaussian_thermal_correction_free_energy__hartree>[0-9.]+)"),
                       ]
-             ),       
+             ),
                 SM(name = 'Forceconstantmatrix',
                 sections = ['x_gaussian_section_force_constant_matrix'],
                 startReStr = r"\s*Force constants in Cartesian coordinates",
@@ -632,12 +632,12 @@ class GaussianParserContext(object):
 
           symmetry = [str(f) for f in symoccalpha[1:].replace(",","").replace("(","").replace(")","").replace("]","").replace("'A","A").replace("\\'","'").replace("A''","A'").replace("'E","E").replace("G'","G").replace("\"A'\"","A'").split()]
           sym1 = []
-          sym1 = np.append(sym1, symmetry)  
+          sym1 = np.append(sym1, symmetry)
           symmetry = [str(f) for f in symviralpha[1:].replace(",","").replace("(","").replace(")","").replace("]","").replace("'A","A").replace("\\'","'").replace("A''","A'").replace("\"A'\"","A'").replace("'E","E").replace("G'","G").split()]
           sym2 = []
           sym2 = np.append(sym2, symmetry)
           symmetrycon = np.concatenate((sym1, sym2), axis=0)
-          backend.addArrayValues("x_gaussian_alpha_symmetries", symmetrycon) 
+          backend.addArrayValues("x_gaussian_alpha_symmetries", symmetrycon)
 
           if(section["x_gaussian_beta_occ_symmetry_values"]):
              symmetry = [str(f) for f in symoccbeta[1:].replace(",","").replace("(","").replace(")","").replace("]","").replace("'A","A").replace("\\'","'").replace("A''","A'").replace("\"A'\"","A'").replace("'E","E").replace("G'","G").split()]
@@ -677,7 +677,7 @@ class GaussianParserContext(object):
             quadyz = section["quadrupole_moment_yz"]
             quadzz = section["quadrupole_moment_zz"]
             quad = str([quadxx, quadxy, quadyy, quadxz, quadyz, quadzz])
-            quadrupoles = [float(f) for f in quad[1:].replace("-."," -0.").replace("'."," 0.").replace("'","").replace("[","").replace("]","").replace(",","").split()] 
+            quadrupoles = [float(f) for f in quad[1:].replace("-."," -0.").replace("'."," 0.").replace("'","").replace("[","").replace("]","").replace(",","").split()]
             quadrupoles = convert_unit(quadrupoles, "debye * angstrom", "coulomb * meter**2")
 
           if(section["octapole_moment_xxx"]):
@@ -719,7 +719,7 @@ class GaussianParserContext(object):
           if(section["quadrupole_moment_xx"]):
              multipoles = np.hstack((charge, dipoles, quadrupoles, octapoles, hexadecapoles))
           else:
-             multipoles = np.hstack((charge, dipoles)) 
+             multipoles = np.hstack((charge, dipoles))
 
           x_gaussian_molecular_multipole_values = np.resize(multipoles, (x_gaussian_number_of_lm_molecular_multipoles))
 
@@ -746,12 +746,12 @@ class GaussianParserContext(object):
           disps = [float(s) for s in vibdisps[1:].replace("'","").replace(",","").replace("]","").replace("one","").replace("\\n","").replace(" ."," 0.").replace(" -."," -0.").split()]
           dispsnew = np.zeros(len(disps), dtype = float)
 
-#  Reorder disps 
+#  Reorder disps
 
           if len(vibfreqs) % 3 == 0:
              k = 0
              for p in range(0,len(vibfreqs) // 3):
-                M = int(len(disps)/len(vibfreqs)) * (p+1) 
+                M = int(len(disps)/len(vibfreqs)) * (p+1)
                 for m in range(3):
                   for n in range(M - int(len(disps) / len(vibfreqs)),M,3):
                     for l in range(3):
@@ -782,9 +782,9 @@ class GaussianParserContext(object):
           forceconst = str(section["x_gaussian_force_constants"])
           numbers = [float(s) for s in forceconst[1:].replace("'","").replace(",","").replace("]","").replace("\\n","").replace("D","E").replace(" ."," 0.").replace(" -."," -0.").split()]
           length = len(numbers)
-          dim = int(((1 + 8 * length)**0.5 - 1) / 2) 
+          dim = int(((1 + 8 * length)**0.5 - 1) / 2)
           cartforceconst = np.zeros([dim, dim])
-          forcecnstvalues = np.append(forcecnstvalues, numbers) 
+          forcecnstvalues = np.append(forcecnstvalues, numbers)
           if dim > 6:
              l = 0
              for i in range(0,5):
@@ -795,7 +795,7 @@ class GaussianParserContext(object):
                 for k in range(0,5):
                    l = l + 1
                    cartforceconst[i,k] = forcecnstvalues[l-1]
-             for i in range(5,dim-2): 
+             for i in range(5,dim-2):
                 for k in range(5,i+1):
                    l = l + 1
                    cartforceconst[i,k] = forcecnstvalues[l-1]
@@ -821,14 +821,14 @@ class GaussianParserContext(object):
                 for k in range(i,dim):
                    l = l + 1
                    cartforceconst[i,k] = forcecnstvalues[l-1]
- 
+
           for i in range(0,dim):
              for k in range(i+1,dim):
                  cartforceconst[i,k] = cartforceconst[k,i]
 
-          cartforceconst = convert_unit(cartforceconst, "forceAu / bohr", "J / (meter**2)")
+          cartforceconst = convert_unit(cartforceconst, "hartree / (bohr ** 2)", "J / (meter**2)")
 
-          backend.addArrayValues("x_gaussian_force_constant_values", cartforceconst) 
+          backend.addArrayValues("x_gaussian_force_constant_values", cartforceconst)
 
       def onOpen_section_method(self, backend, gIndex, section):
         # keep track of the latest method section
@@ -844,7 +844,7 @@ class GaussianParserContext(object):
               'XA':	    [{'name': 'X_ALPHA'}],
               'VWN':        [{'name': 'LDA_C_VWN'}],
               'VWN3':       [{'name': 'LDA_C_VWN_3'}],
-              'LSDA':       [{'name': 'LDA_X'}, {'name': 'LDA_C_VWN'}], 
+              'LSDA':       [{'name': 'LDA_X'}, {'name': 'LDA_C_VWN'}],
               'B':          [{'name': 'GGA_X_B88'}],
               'BLYP':       [{'name': 'GGA_C_LYP'}, {'name': 'GGA_X_B88'}],
               'PBEPBE':     [{'name': 'GGA_C_PBE'}, {'name': 'GGA_X_PBE'}],
@@ -877,9 +877,9 @@ class GaussianParserContext(object):
               'V5LYP':      [{'name': 'GGA_C_V5LYP'}],
               'THCTH':      [{'name': 'MGGA_XC_TAU_HCTH'}],
               'TPSSTPSS':   [{'name': 'MGGA_C_TPSS'}, {'name': 'MGGA_X_TPSS'}],
-              'B3LYP':      [{'name': 'HYB_GGA_XC_B3LYP'}], 
+              'B3LYP':      [{'name': 'HYB_GGA_XC_B3LYP'}],
               'B3PW91':     [{'name': 'HYB_GGA_XC_B3PW91'}],
-              'B3P86':      [{'name': 'HYB_GGA_XC_B3P86'}], 
+              'B3P86':      [{'name': 'HYB_GGA_XC_B3P86'}],
               'B1B95':      [{'name': 'HYB_GGA_XC_B1B95'}],
               'MPW1PW91':   [{'name': 'HYB_GGA_XC_MPW1PW91'}],
               'MPW1LYP':    [{'name': 'HYB_GGA_XC_MPW1LYP'}],
@@ -888,7 +888,7 @@ class GaussianParserContext(object):
               'B98':        [{'name': 'HYB_GGA_XC_B98'}],
               'B971':       [{'name': 'HYB_GGA_XC_B971'}],
               'B972':       [{'name': 'HYB_GGA_XC_B972'}],
-              'O3LYP':      [{'name': 'HYB_GGA_XC_O3LYP'}], 
+              'O3LYP':      [{'name': 'HYB_GGA_XC_O3LYP'}],
               'TPSSH':      [{'name': 'HYB_GGA_XC_TPSSh'}],
               'BMK':        [{'name': 'HYB_MGGA_XC_BMK'}],
               'X3LYP':      [{'name': 'HYB_GGA_XC_X3LYP'}],
@@ -925,7 +925,7 @@ class GaussianParserContext(object):
               'MPW2PLYP':   [{'name': 'MPW2PLYP'}],
               'B2PLYPD':    [{'name': 'B2PLYPD'}],
               'MPW2PLYPD':  [{'name': 'MPW2PLYPD'}],
-              'B97D3':      [{'name': 'B97D3'}], 
+              'B97D3':      [{'name': 'B97D3'}],
               'B2PLYPD3':   [{'name': 'B2PLYPD3'}],
               'MPW2PLYPD3': [{'name': 'MPW2PLYPD3'}],
               'LC-':        [{'name': 'LONG-RANGE CORRECTED'}],
@@ -1017,7 +1017,7 @@ class GaussianParserContext(object):
               'SV':          [{'name': 'SV'}],
               'SVP':         [{'name': 'SVP'}],
               'TZV':         [{'name': 'TZV'}],
-              'TZVP':        [{'name': 'TZVP'}],              
+              'TZVP':        [{'name': 'TZVP'}],
               'DEF2SV':      [{'name': 'Def2SV'}],
               'DEF2SVP':     [{'name': 'Def2SVP'}],
               'DEF2SVPP':    [{'name': 'Def2SVPP'}],
@@ -1031,12 +1031,12 @@ class GaussianParserContext(object):
               'MIDIX':       [{'name': 'MidiX'}],
               'EPR-II':      [{'name': 'EPR-II'}],
               'EPR-III':     [{'name': 'EPR-III'}],
-              'UGBS':        [{'name': 'UGBS'}],     
+              'UGBS':        [{'name': 'UGBS'}],
               'MTSMALL':     [{'name': 'MTSmall'}],
               'DGDZVP':      [{'name': 'DGDZVP'}],
               'DGDZVP2':     [{'name': 'DGDZVP2'}],
               'DGTZVP':      [{'name': 'DGTZVP'}],
-              'CBSB3':       [{'name': 'CBSB3'}],  
+              'CBSB3':       [{'name': 'CBSB3'}],
               'CBSB7':       [{'name': 'CBSB7'}],
               'SHC':         [{'name': 'SHC'}],
               'SEC':         [{'name': 'SHC'}],
@@ -1046,7 +1046,7 @@ class GaussianParserContext(object):
               'LANL1':       [{'name': 'LANL1'}],
               'LANL2':       [{'name': 'LANL2'}],
               'SDD':         [{'name': 'SDD'}],
-              'OLDSDD':      [{'name': 'OldSDD'}], 
+              'OLDSDD':      [{'name': 'OldSDD'}],
               'SDDALL':      [{'name': 'SDDAll'}],
               'GEN':         [{'name': 'General'}],
               'GENECP':      [{'name': 'General ECP'}],
@@ -1070,7 +1070,7 @@ class GaussianParserContext(object):
         methodWrite = False
         basissetWrite = False
         methodreal = None
-        basissetreal = None 
+        basissetreal = None
         methodprefix = None
         exc = None
         corr = None
@@ -1088,7 +1088,7 @@ class GaussianParserContext(object):
         method1 = settings.replace("['#p ","").replace("['#P ","").replace("['#","")
         method1 = method1.upper()
 
-        if 'ONIOM' not in method1: 
+        if 'ONIOM' not in method1:
           if settings.find("/") >= 0:
                method1 = settings.split('/')[0].replace("['#p ","").replace("['#P ","").replace("['#","")
                method1 = method1.upper()
@@ -1096,7 +1096,7 @@ class GaussianParserContext(object):
                   method2 = str(x)
                   if method2 != 'RHF' and method2 != 'UHF' and method2 != 'ROHF' and method2 != 'UFF':
                      if (method2[0] == 'R' and method2[0:2] != 'RO') or method2[0] == 'U':
-                        methodprefix = method2[0] 
+                        methodprefix = method2[0]
                         method2 = method2[1:]
                      elif method2[0:2] == 'RO':
                         methodprefix = method2[0:2]
@@ -1130,7 +1130,7 @@ class GaussianParserContext(object):
                   if method2 in xcDict.keys():
                      xc = method2
                      xcWrite= True
-                     methodWrite = True 
+                     methodWrite = True
                      method = 'DFT'
                   if method2 in methodDict.keys():
                      method = method2
@@ -1152,7 +1152,7 @@ class GaussianParserContext(object):
                           methodWrite = True
                           methodreal = method2
                rest = settings.split('/')[1].replace("'","").replace("]","")
-               rest = rest.upper() 
+               rest = rest.upper()
                for x in rest.split():
                   if x in basissetDict.keys():
                      basisset = x
@@ -1206,7 +1206,7 @@ class GaussianParserContext(object):
                        if z in basissetDict.keys():
                          basisset = z
                     basissetWrite = True
-                    if (len(rest2.split('/')) == 2): 
+                    if (len(rest2.split('/')) == 2):
                        if(basisset is not None):
                           basissetreal = rest2.split('/')[1] + '/' + basisset
                        else:
@@ -1215,15 +1215,15 @@ class GaussianParserContext(object):
                        pass
           else:
                method1 = settings.split()
-               for x in method1: 
+               for x in method1:
                   method2 = str(x)
-                  method2 = method2.upper() 
+                  method2 = method2.upper()
                   if method2 != 'RHF' and method2 != 'UHF' and method2 != 'ROHF' and method2 != 'UFF':
                     if (method2[0] == 'R' and method2[0:2] != 'RO') or method2[0] == 'U':
-                      methodprefix = method2[0] 
+                      methodprefix = method2[0]
                       method2 = method2[1:]
                     elif method2[0:2] == 'RO':
-                      methodprefix = method2[0:2] 
+                      methodprefix = method2[0:2]
                       method2 = method2[2:]
                   if method2[0:2] == 'SV' or method2[0] == 'B' or method2[0] == 'O':
                     if method2[0] in xcDict.keys() and method2[1:] in xcDict.keys():
@@ -1250,12 +1250,12 @@ class GaussianParserContext(object):
                    exccorr = method2[3:]
                    if exccorr in xcDict.keys():
                       xc = 'LC-' + xcDict.get([exccorr][-1])
-                  if method2 in xcDict.keys(): 
+                  if method2 in xcDict.keys():
                    xc = method2
                    xcWrite= True
                    method = 'DFT'
                   if method2 in methodDict.keys():
-                   method = method2 
+                   method = method2
                    methodWrite = True
                    methodreal = method2
                   else:
@@ -1300,7 +1300,7 @@ class GaussianParserContext(object):
 
 # special options for ONIOM calculations
         else:
-          method = 'ONIOM'       
+          method = 'ONIOM'
           methodWrite = True
           method1 = settings.split()
           for x in method1:
@@ -1308,7 +1308,7 @@ class GaussianParserContext(object):
              method2 = method2.upper()
              if 'ONIOM' in method2:
                 methodreal = method2
-        
+
 # functionals where hybrid_xc_coeff are written
 
         if xc is not None:
@@ -1415,7 +1415,7 @@ class GaussianParserContext(object):
               unit_cell = []
               for i in ['x', 'y', 'z']:
                   uci = str(section['x_gaussian_geometry_lattice_vector_' + i])
-                  uci = uci.split() 
+                  uci = uci.split()
                   for i in range(len(uci)):
                     uci[i] = str(uci[i]).replace("[","").replace("'","").replace("]","").replace("\"","").replace(",","")
                     if uci[i] is not None:
@@ -1460,11 +1460,11 @@ cachingLevelForMetaName = {
         "x_gaussian_number_of_atoms": CachingLevel.ForwardAndCache,
         "section_scf_iteration": CachingLevel.Forward,
         "energy_total_scf_iteration": CachingLevel.ForwardAndCache,
-        "x_gaussian_delta_energy_total_scf_iteration": CachingLevel.ForwardAndCache, 
+        "x_gaussian_delta_energy_total_scf_iteration": CachingLevel.ForwardAndCache,
         "energy_total": CachingLevel.ForwardAndCache,
         "x_gaussian_energy_error": CachingLevel.ForwardAndCache,
         "x_gaussian_electronic_kinetic_energy": CachingLevel.ForwardAndCache,
-        "x_gaussian_energy_electrostatic": CachingLevel.ForwardAndCache, 
+        "x_gaussian_energy_electrostatic": CachingLevel.ForwardAndCache,
         "x_gaussian_section_frequencies": CachingLevel.Forward,
         "x_gaussian_frequency_values": CachingLevel.Cache,
         "x_gaussian_frequencies": CachingLevel.ForwardAndCache,
@@ -1472,25 +1472,25 @@ cachingLevelForMetaName = {
         "x_gaussian_red_masses": CachingLevel.ForwardAndCache,
         "x_gaussian_normal_modes": CachingLevel.Cache,
         "x_gaussian_normal_mode_values": CachingLevel.ForwardAndCache,
-        "x_gaussian_atomic_masses": CachingLevel.ForwardAndCache, 
+        "x_gaussian_atomic_masses": CachingLevel.ForwardAndCache,
         "x_gaussian_section_force_constant_matrix": CachingLevel.Forward,
         "x_gaussian_force_constant_values": CachingLevel.ForwardAndCache,
         "x_gaussian_force_constants": CachingLevel.Cache,
         "section_eigenvalues": CachingLevel.Forward,
-        "eigenvalues_values": CachingLevel.ForwardAndCache, 
+        "eigenvalues_values": CachingLevel.ForwardAndCache,
         "eigenvalues_occupation": CachingLevel.ForwardAndCache,
         "x_gaussian_section_orbital_symmetries": CachingLevel.Forward,
         "x_gaussian_alpha_occ_symmetry_values":CachingLevel.Cache,
         "x_gaussian_alpha_vir_symmetry_values":CachingLevel.Cache,
         "x_gaussian_beta_occ_symmetry_values":CachingLevel.Cache,
-        "x_gaussian_beta_vir_symmetry_values":CachingLevel.Cache,  
+        "x_gaussian_beta_vir_symmetry_values":CachingLevel.Cache,
         "x_gaussian_alpha_symmetries": CachingLevel.ForwardAndCache,
         "x_gaussian_beta_symmetries": CachingLevel.ForwardAndCache,
         "x_gaussian_section_molecular_multipoles": CachingLevel.Forward,
         "dipole_moment_x": CachingLevel.Cache,
         "dipole_moment_y": CachingLevel.Cache,
         "dipole_moment_z": CachingLevel.Cache,
-        "quadrupole_moment_xx": CachingLevel.Cache,  
+        "quadrupole_moment_xx": CachingLevel.Cache,
         "quadrupole_moment_yy": CachingLevel.Cache,
         "quadrupole_moment_zz": CachingLevel.Cache,
         "quadrupole_moment_xy": CachingLevel.Cache,
@@ -1520,7 +1520,7 @@ cachingLevelForMetaName = {
         "hexadecapole_moment_yyzz": CachingLevel.Cache,
         "hexadecapole_moment_xxyz": CachingLevel.Cache,
         "hexadecapole_moment_yyxz": CachingLevel.Cache,
-        "hexadecapole_moment_zzxy": CachingLevel.Cache, 
+        "hexadecapole_moment_zzxy": CachingLevel.Cache,
         "x_gaussian_molecular_multipole_values": CachingLevel.ForwardAndCache,
         "single_configuration_calculation_converged": CachingLevel.ForwardAndCache,
         "x_gaussian_single_configuration_calculation_converged": CachingLevel.ForwardAndCache,
@@ -1531,7 +1531,7 @@ cachingLevelForMetaName = {
         "section_method": CachingLevel.Forward,
         "x_gaussian_section_elstruc_method": CachingLevel.Forward,
         "x_gaussian_electronic_structure_method": CachingLevel.ForwardAndCache,
-        "XC_functional_name": CachingLevel.ForwardAndCache, 
+        "XC_functional_name": CachingLevel.ForwardAndCache,
         "basis_set_atom_centered_short_name": CachingLevel.Forward,
         "x_gaussian_settings": CachingLevel.Cache,
         "x_gaussian_settings_corrected": CachingLevel.ForwardAndCache,