diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..a6cb8b615eb7a44af58c9563596ab6264ef6dbe6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,54 @@
+# use glob syntax.
+syntax: glob
+*.ser
+*.class
+*~
+*.bak
+#*.off
+*.old
+*.pyc
+*.bk
+*.swp
+.DS_Store
+
+# logging files
+detailed.log
+
+# eclipse conf file
+.settings
+.classpath
+.project
+.manager
+.scala_dependencies
+
+# idea
+.idea
+*.iml
+
+# building
+target
+build
+null
+tmp*
+temp*
+dist
+test-output
+build.log
+
+# other scm
+.svn
+.CVS
+.hg*
+
+# switch to regexp syntax.
+#  syntax: regexp
+#  ^\.pc/
+
+#SHITTY output not in target directory
+build.log
+
+#emacs TAGS
+TAGS
+
+lib/
+env/
diff --git a/parser/parser-elk/parser_elk.py b/parser/parser-elk/parser_elk.py
new file mode 100644
index 0000000000000000000000000000000000000000..845d11fb6a1cce0eac890195e03bcc55a77cbc9b
--- /dev/null
+++ b/parser/parser-elk/parser_elk.py
@@ -0,0 +1,69 @@
+from builtins import object
+import setup_paths
+from nomadcore.simple_parser import mainFunction, AncillaryParser, CachingLevel
+from nomadcore.simple_parser import SimpleMatcher as SM
+from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
+import os, sys, json
+
+class ElkContext(object):
+    """context for elk parser"""
+
+    def __init__(self):
+        self.parser = None
+
+    def initialize_values(self):
+        """allows to reset values if the same superContext is used to parse different files"""
+        self.metaInfoEnv = self.parser.parserBuilder.metaInfoEnv
+
+    def startedParsing(self, path, parser):
+        """called when parsing starts"""
+        self.parser = parser
+        # allows to reset values if the same superContext is used to parse different files
+        self.initialize_values()
+
+# description of the input
+mainFileDescription = SM(
+    name = 'root',
+    weak = True,
+    startReStr = "",
+    subMatchers = [
+        SM(name = 'newRun',
+           startReStr = r"\s*:LABEL[0-9]+: using WIEN2k_(?:[0-9.]+) \(Release (?:[0-9/.]+)\) in ",
+           repeats = True,
+           required = True,
+           forwardMatch = True,
+           sections   = ['section_run', 'section_method', 'section_system', 'section_single_configuration_calculation'],
+           subMatchers = [
+               SM(
+                   name = 'header',
+                   startReStr = r"\s*:LABEL[0-9]+: using WIEN2k_(?P<x_wien2k_version>[0-9.]+) \(Release (?P<x_wien2k_release_date>[0-9/.]+)\) in ",
+                   sections=["x_wien2k_header"],
+                   fixedStartValues={'program_name': 'WIEN2k', 'program_basis_set_type': '(L)APW+lo' }
+              ), SM(
+                  name = "scf iteration",
+                  startReStr = r"\s*:ITE(?P<x_wien2k_iteration_number>[0-9]+):\s*[0-9]*. ITERATION",
+                  sections=["section_scf_iteration"],
+                  repeats = True,
+                  subMatchers=[
+                      SM(r":NATO :\s*(?P<x_wien2k_number_of_independent_atoms>[0-9]+)INDEPENDENT AND\s*(?P<x_wien2k_total_atoms>[0-9]+)\s*TOTAL ATOMS IN UNITCELL"),
+                      SM(r"\s*SUBSTANCE: (?P<x_wien2k_system_name>.*)"),
+                      SM(r":POT\s*:\s*POTENTIAL OPTION\s*(?P<x_wien2k_potential_option>[0-9]+)"),
+                      SM(r":VOL\s*:\s*UNIT CELL VOLUME\s*=\s*(?P<x_wien2k_unit_cell_volume__angstrom3>[0-9.]+)")
+                  ]
+              )
+           ]
+       )
+    ])
+
+# loading metadata from nomad-meta-info/meta_info/nomad_meta_info/fhi_aims.nomadmetainfo.json
+
+parserInfo = {
+  "name": "Elk"
+}
+
+metaInfoPath = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../../../../nomad-meta-info/meta_info/nomad_meta_info/elk.nomadmetainfo.json"))
+metaInfoEnv, warnings = loadJsonFile(filePath = metaInfoPath, dependencyLoader = None, extraArgsHandling = InfoKindEl.ADD_EXTRA_ARGS, uri = None)
+
+if __name__ == "__main__":
+    superContext = ElkContext()
+    mainFunction(mainFileDescription, metaInfoEnv, parserInfo, superContext = superContext)
diff --git a/parser/parser-elk/setup_paths.py b/parser/parser-elk/setup_paths.py
new file mode 100644
index 0000000000000000000000000000000000000000..e0a0fb009256a0d4056e81c12e82d15bfd3ea7c4
--- /dev/null
+++ b/parser/parser-elk/setup_paths.py
@@ -0,0 +1,6 @@
+import sys, os, os.path
+baseDir = os.path.dirname(os.path.abspath(__file__))
+commonDir = os.path.normpath(os.path.join(baseDir,"../../../../python-common/common/python"))
+
+if not commonDir in sys.path:
+    sys.path.insert(0, commonDir)
diff --git a/src/main/scala/eu/nomad_lab/parsers/ElkParser.scala b/src/main/scala/eu/nomad_lab/parsers/ElkParser.scala
new file mode 100644
index 0000000000000000000000000000000000000000..be23be364c45d5d3f9d8b528161ca9c6c1420260
--- /dev/null
+++ b/src/main/scala/eu/nomad_lab/parsers/ElkParser.scala
@@ -0,0 +1,42 @@
+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 ElkParser extends SimpleExternalParserGenerator(
+  name = "ElkParser",
+  parserInfo = jn.JObject(
+    ("name" -> jn.JString("Elk")) ::
+      ("parserId" -> jn.JString("Elk" + lab.ElkVersionInfo.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.ElkVersionInfo.toMap.map {
+            case (key, value) =>
+              (key -> jn.JString(value.toString))
+          }(breakOut): List[(String, jn.JString)])
+      )) :: Nil
+  ),
+  mainFileTypes = Seq("text/.*"),
+  mainFileRe = """:LABEL[0-9]+: using WIEN2k_(?<version>[0-9.]+) \(Release (?<release>[0-9/.]+)\) in """.r,
+  cmd = Seq(DefaultPythonInterpreter.pythonExe(), "${envDir}/parsers/elk/parser/parser-elk/parser_elk.py",
+    "--uri", "${mainFileUri}", "${mainFilePath}"),
+  resList = Seq(
+    "parser-elk/parser_elk.py",
+    "parser-elk/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/elk.nomadmetainfo.json"
+  ) ++ DefaultPythonInterpreter.commonFiles(),
+  dirMap = Map(
+    "parser-elk" -> "parsers/elk/parser/parser-elk",
+    "nomad_meta_info" -> "nomad-meta-info/meta_info/nomad_meta_info",
+    "python" -> "python-common/common/python/nomadcore"
+  ) ++ DefaultPythonInterpreter.commonDirMapping(),
+  metaInfoEnv = Some(lab.meta.KnownMetaInfoEnvs.elk)
+)
diff --git a/src/test/scala/eu/nomad_lab/parsers/ElkParserSpec.scala b/src/test/scala/eu/nomad_lab/parsers/ElkParserSpec.scala
new file mode 100644
index 0000000000000000000000000000000000000000..eccb4117560d7c015e6a754b07fab5d233cb16f7
--- /dev/null
+++ b/src/test/scala/eu/nomad_lab/parsers/ElkParserSpec.scala
@@ -0,0 +1,14 @@
+package eu.nomad_lab.parsers
+
+import org.specs2.mutable.Specification
+
+object ElkTests extends Specification {
+  "ElkParserTest" >> {
+    "test with json-events" >> {
+      ParserRun.parse(Wien2kParser, "parsers/elk/test/examples/ok/ok.scf", "json-events") must_== ParseResult.ParseSuccess
+    }
+    "test with json" >> {
+      ParserRun.parse(Wien2kParser, "parsers/elk/test/examples/ok/ok.scf", "json") must_== ParseResult.ParseSuccess
+    }
+  }
+}
diff --git a/test/examples/README.md b/test/examples/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..aee68a4b42fbe40eef7063285ab0f6a905d4d89c
--- /dev/null
+++ b/test/examples/README.md
@@ -0,0 +1 @@
+sample files to test the parser