diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..f8a741c2a8ce3f971ee76c289fc6eaf67f0c7f6c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*parser.egg-info/
\ No newline at end of file
diff --git a/openkimparser/__init__.py b/openkimparser/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e79d95f7821222c40037b374e9f5dafbd8aea5bb
--- /dev/null
+++ b/openkimparser/__init__.py
@@ -0,0 +1 @@
+from .parser_openkim import OpenKIMParser
\ No newline at end of file
diff --git a/openkimparser/__pycache__/__init__.cpython-36.pyc b/openkimparser/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..afac27cc12e18943d3d21a233a0a3104db5bc557
Binary files /dev/null and b/openkimparser/__pycache__/__init__.cpython-36.pyc differ
diff --git a/openkimparser/__pycache__/parser_openkim.cpython-36.pyc b/openkimparser/__pycache__/parser_openkim.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bdc360c9e13533a789ea5cbb447689e7d21c00d8
Binary files /dev/null and b/openkimparser/__pycache__/parser_openkim.cpython-36.pyc differ
diff --git a/openkimparser/metainfo/__init__.py b/openkimparser/metainfo/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..4991a626815853e6d7b76d14a402e4c596c552bf
--- /dev/null
+++ b/openkimparser/metainfo/__init__.py
@@ -0,0 +1,13 @@
+import sys
+from nomad.metainfo import Environment
+from nomad.metainfo.legacy import LegacyMetainfoEnvironment
+import openkimparser.metainfo.openkim
+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['openkimparser.metainfo.openkim'].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/openkimparser/metainfo/__pycache__/__init__.cpython-36.pyc b/openkimparser/metainfo/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..83bdcafc28e6ef4a0522f65167dc907c0d06055b
Binary files /dev/null and b/openkimparser/metainfo/__pycache__/__init__.cpython-36.pyc differ
diff --git a/openkimparser/metainfo/__pycache__/openkim.cpython-36.pyc b/openkimparser/metainfo/__pycache__/openkim.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4c8737249232ec897c3e526fa0907f38eef8c921
Binary files /dev/null and b/openkimparser/metainfo/__pycache__/openkim.cpython-36.pyc differ
diff --git a/openkimparser/metainfo/openkim.py b/openkimparser/metainfo/openkim.py
new file mode 100644
index 0000000000000000000000000000000000000000..d2d3c196ca986967140b8590ce8d474e4d6d5e20
--- /dev/null
+++ b/openkimparser/metainfo/openkim.py
@@ -0,0 +1,53 @@
+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='openkim_nomadmetainfo_json',
+    description='None',
+    a_legacy=LegacyDefinition(name='openkim.nomadmetainfo.json'))
+
+
+class section_run(public.section_run):
+
+    m_def = Section(validate=False, extends_base_section=True, a_legacy=LegacyDefinition(name='section_run'))
+
+    openkim_build_date = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        build date as string
+        ''',
+        categories=[public.accessory_info, public.program_info],
+        a_legacy=LegacyDefinition(name='openkim_build_date'))
+
+    openkim_src_date = Quantity(
+        type=str,
+        shape=[],
+        description='''
+        date of last modification of the source as string
+        ''',
+        categories=[public.accessory_info, public.program_info],
+        a_legacy=LegacyDefinition(name='openkim_src_date'))
+
+
+class section_method(public.section_method):
+
+    m_def = Section(validate=False, extends_base_section=True, a_legacy=LegacyDefinition(name='section_method'))
+
+    x_openkim_atom_kind_refs = Quantity(
+        type=public.section_method_atom_kind,
+        shape=['number_of_atoms'],
+        description='''
+        reference to the atom kinds of each atom
+        ''',
+        a_legacy=LegacyDefinition(name='x_openkim_atom_kind_refs'))
+
+
+m_package.__init_metainfo__()
diff --git a/parser/parser-openkim/openkim_tool.py b/openkimparser/openkim_tool.py
similarity index 100%
rename from parser/parser-openkim/openkim_tool.py
rename to openkimparser/openkim_tool.py
diff --git a/parser/parser-openkim/parser_openkim.py b/openkimparser/parser_openkim.py
similarity index 94%
rename from parser/parser-openkim/parser_openkim.py
rename to openkimparser/parser_openkim.py
index 4707a8c4bb2fd6bd07db62431f2e720eab59d29e..6927d8eaf7f8497519aa04cfb4a8671221733214 100644
--- a/parser/parser-openkim/parser_openkim.py
+++ b/openkimparser/parser_openkim.py
@@ -4,10 +4,8 @@ from builtins import map
 from builtins import range
 from builtins import object
 import logging, sys, bisect
-import setup_paths
 from datetime import datetime
-import os, logging, re, traceback
-from nomadcore.parser_backend import JsonParseEventsWriterBackend
+import re, traceback
 from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
 import numpy as np
 from nomadcore.unit_conversion.unit_conversion import convert_unit_function
@@ -138,7 +136,7 @@ class OpenkimContext(object):
         self.cell = None
         self.labels = None
         celltype = None
-        if('basis-atom-coordinates.source-value' in querydict and 
+        if('basis-atom-coordinates.source-value' in querydict and
            ('a.si-value' in querydict) or
            ('b.si-value' in querydict) or
            ('c.si-value' in querydict) or
@@ -164,9 +162,9 @@ class OpenkimContext(object):
                 else:
                     lat_a = float(a_si_val)
                 si_conv = convert_unit_function("m", "angstrom")
-                cellAtoms = Atoms( 
-                        positions=basis, 
-                        cell=[si_conv(lat_a), 
+                cellAtoms = Atoms(
+                        positions=basis,
+                        cell=[si_conv(lat_a),
                               si_conv(lat_a),
                               si_conv(lat_a)],
                         pbc=True)
@@ -293,7 +291,8 @@ class KIMParser(object):
         backend.startedParsingSession(
             mainFileUri = mainFileUri,
             parserInfo = self.parserInfo)
-        self.superContext.startedParsing(self)
+        superContext = self.superContext
+        superContext.startedParsing(self)
         QueryList = KIMQueryReader(self.fIn)
         try:
             for qi, qdict in enumerate(QueryList):
@@ -338,13 +337,19 @@ parserInfo = {
   "version": "1.0"
 }
 
-if __name__ == "__main__":
-    """
-       This code is modified from parser-vasprun to work for OpenKIM
-    """
-    metaInfoPath = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../../../../nomad-meta-info/meta_info/nomad_meta_info/openkim.nomadmetainfo.json"))
-    metaInfoEnv, warnings = loadJsonFile(filePath = metaInfoPath, dependencyLoader = None, extraArgsHandling = InfoKindEl.ADD_EXTRA_ARGS, uri = None)
-    superContext =  OpenkimContext()
-    parser = KIMParser(parserInfo, superContext)
-    backend = JsonParseEventsWriterBackend(metaInfoEnv, sys.stdout)
-    parser.parse(sys.argv[1], sys.argv[2], backend)
+
+class OpenKIMParser():
+   """ A proper class envolop for running this parser from within python. """
+   def __init__(self, backend, **kwargs):
+       self.backend_factory = backend
+
+   def parse(self, mainfile):
+       logging.info('turbomole parser started')
+       logging.getLogger('nomadcore').setLevel(logging.WARNING)
+       backend = self.backend_factory("openkim.nomadmetainfo.json")
+       parserInfo = {'name': 'parser_openkim', 'version': '1.0'}
+       context = OpenkimContext()
+       parser = KIMParser(parserInfo, context)
+       parser.parse('nmd://uri', mainfile, backend)
+
+       return backend
diff --git a/parser/parser-openkim/setup_paths.py b/parser/parser-openkim/setup_paths.py
deleted file mode 100644
index f823d43b987767343f5ab8b64bb085113066f391..0000000000000000000000000000000000000000
--- a/parser/parser-openkim/setup_paths.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import sys
-import os
-import os.path
-
-basedir = os.path.dirname(os.path.abspath(__file__))
-commondir = os.path.normpath(os.path.join(basedir,"../../../../python-common/common/python"))
-parserdir = os.path.normpath(os.path.join(basedir, ".."))
-
-if commondir not in sys.path:
-    sys.path.insert(1, commondir)
-if parserdir not in sys.path:
-    sys.path.insert(1, parserdir)
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..e0af2ae5bc616bb3ae8b4d1e1b1cad18e563bc71
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,34 @@
+# Copyright 2015-2018 Berk Onat
+#
+#   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.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+from setuptools import setup, find_packages
+
+
+def main():
+    setup(
+        name='openkimparser',
+        version='0.1',
+        description='NOMAD parser implementation for OpenKIM.',
+        license='MIT',
+        package_dir={'': './'},
+        packages=find_packages(),
+        install_requires=[
+            'nomadcore',
+            'nomad'
+        ],
+    )
+
+
+if __name__ == '__main__':
+    main()
diff --git a/src/main/scala/eu/nomad_lab/parsers/OpenkimParser.scala b/src/main/scala/eu/nomad_lab/parsers/OpenkimParser.scala
deleted file mode 100644
index 27698c686f583e2f7e3708077da4ae290a3b7887..0000000000000000000000000000000000000000
--- a/src/main/scala/eu/nomad_lab/parsers/OpenkimParser.scala
+++ /dev/null
@@ -1,43 +0,0 @@
-package eu.nomad_lab.parsers
-
-import eu.nomad_lab
-import eu.nomad_lab.DefaultPythonInterpreter
-import org.{ json4s => jn }
-import eu.{ nomad_lab => lab }
-import scala.collection.breakOut
-
-object OpenkimParser extends SimpleExternalParserGenerator(
-  name = "OpenkimParser",
-  parserInfo = jn.JObject(
-    ("name" -> jn.JString("OpenkimParser")) ::
-      ("parserId" -> jn.JString("OpenkimParser" + lab.OpenkimVersionInfo.version)) ::
-      ("versionInfo" -> jn.JObject(
-        ("nomadCoreVersion" -> jn.JObject(lab.NomadCoreVersionInfo.toMap.map {
-          case (k, v) => k -> jn.JString(v.toString)
-        }(breakOut): List[(String, jn.JString)])) ::
-          (lab.OpenkimVersionInfo.toMap.map {
-            case (key, value) =>
-              (key -> jn.JString(value.toString))
-          }(breakOut): List[(String, jn.JString)])
-      )) :: Nil
-  ),
-  mainFileTypes = Seq("text/.*"),
-  mainFileRe = """\s*OPENKIM_QUERY_OUTPUT\s*""".r,
-  cmd = Seq(DefaultPythonInterpreter.pythonExe(), "${envDir}/parsers/openkim/parser/parser-openkim/parser-openkim.py",
-    "${mainFilePath}", "${mainFilePath}/data.json"),
-  resList = Seq(
-    "parser-openkim/parser-openkim.py",
-    "parser-openkim/setup_paths.py",
-    "nomad_meta_info/public.nomadmetainfo.json",
-    "nomad_meta_info/common.nomadmetainfo.json",
-    "nomad_meta_info/meta_types.nomadmetainfo.json",
-    "nomad_meta_info/openkim.nomadmetainfo.json"
-  ) ++ DefaultPythonInterpreter.commonFiles(),
-  dirMap = Map(
-    "parser-openkim" -> "parsers/openkim/parser/parser-openkim",
-    "nomad_meta_info" -> "nomad-meta-info/meta_info/nomad_meta_info",
-    "python" -> "python-common/common/python/nomadcore"
-  ) ++ DefaultPythonInterpreter.commonDirMapping(),
-  metaInfoEnv = Some(lab.meta.KnownMetaInfoEnvs.openkim)
-)
-
diff --git a/src/test/scala/eu/nomad_lab/parsers/OpenkimParserSpec.scala b/src/test/scala/eu/nomad_lab/parsers/OpenkimParserSpec.scala
deleted file mode 100644
index b74f1e4b86528a4313bd467e9617072f7dcb73a4..0000000000000000000000000000000000000000
--- a/src/test/scala/eu/nomad_lab/parsers/OpenkimParserSpec.scala
+++ /dev/null
@@ -1,14 +0,0 @@
-package eu.nomad_lab.parsers
-
-import org.specs2.mutable.Specification
-
-object OpenkimParserTests extends Specification {
-  "OpenkimParserTest" >> {
-    "[OpenKIM Query with 3767 entries] test with json-events" >> {
-      ParserRun.parse(OpenkimParser, "parsers/openkim/test/examples/data.json", "json-events") must_== ParseResult.ParseSuccess
-    }
-    "[OpenKIM Query with 3767 entries] test with json" >> {
-      ParserRun.parse(OpenkimParser, "parsers/openkim/test/examples/data.json", "json") must_== ParseResult.ParseSuccess
-    }
-  }
-}