diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2398357401ede836962ddff646a27842ea7243fd
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,19 @@
+stages:
+  - test
+
+testing:
+  stage: test
+  script:
+    - cd .. && rm -rf nomad-lab-base
+    - git clone --recursive git@gitlab.mpcdf.mpg.de:nomad-lab/nomad-lab-base.git
+    - cd nomad-lab-base
+    - git submodule foreach git checkout master
+    - git submodule foreach git pull
+    - sbt dftbPlus/test
+    - export PYTHONEXE=/labEnv/bin/python
+    - sbt dftbPlus/test
+  only:
+    - master
+  tags:
+    - test
+    - spec2
diff --git a/src/main/scala/eu/nomad_lab/parsers/DftbPlusParser.scala b/src/main/scala/eu/nomad_lab/parsers/DftbPlusParser.scala
new file mode 100644
index 0000000000000000000000000000000000000000..469ffeaaffee691c326499b9bc28032146c4d550
--- /dev/null
+++ b/src/main/scala/eu/nomad_lab/parsers/DftbPlusParser.scala
@@ -0,0 +1,44 @@
+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 DftbPlusParser extends SimpleExternalParserGenerator(
+  name = "DftbPlusParser",
+  parserInfo = jn.JObject(
+    ("name" -> jn.JString("DftbPlus")) ::
+      ("parserId" -> jn.JString("DftbPlus" + lab.DftbPlusVersionInfo.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.DftbPlusVersionInfo.toMap.map {
+            case (key, value) =>
+              (key -> jn.JString(value.toString))
+          }(breakOut): List[(String, jn.JString)])
+      )) :: Nil
+  ),
+  mainFileTypes = Seq("text/.*"),
+  mainFileRe = """ Fermi distribution function
+
+""".r,
+  cmd = Seq(DefaultPythonInterpreter.pythonExe(), "${envDir}/parsers/dftb-plus/parser/parser-dftb-plus/dftb-plus_parser.py",
+    "--uri", "${mainFileUri}", "${mainFilePath}"),
+  resList = Seq(
+    "parser-dftb+/parser_dftb+.py",
+    "parser-dftb+/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/dftb_plus.nomadmetainfo.json"
+  ) ++ DefaultPythonInterpreter.commonFiles(),
+  dirMap = Map(
+    "parser-dftb-plus" -> "parsers/dftb-plus/parser/parser-dftb-plus",
+    "nomad_meta_info" -> "nomad-meta-info/meta_info/nomad_meta_info",
+    "python" -> "python-common/common/python/nomadcore"
+  ) ++ DefaultPythonInterpreter.commonDirMapping(),
+  metaInfoEnv = Some(lab.meta.KnownMetaInfoEnvs.dftbPlus)
+)
diff --git a/src/test/scala/eu/nomad_lab/parsers/DftbPlusParserSpec.scala b/src/test/scala/eu/nomad_lab/parsers/DftbPlusParserSpec.scala
new file mode 100644
index 0000000000000000000000000000000000000000..0e0dcf39b2ae98e1eef34bb4036ed72c9eb088a2
--- /dev/null
+++ b/src/test/scala/eu/nomad_lab/parsers/DftbPlusParserSpec.scala
@@ -0,0 +1,14 @@
+package eu.nomad_lab.parsers
+
+import org.specs2.mutable.Specification
+
+object DftbPlusTests extends Specification {
+  "DftbPlusParserTest" >> {
+    "test with json-events" >> {
+      ParserRun.parse(DftbPlusParser, "parsers/dftbPlus/test/examples/detailed.out", "json-events") must_== ParseResult.ParseSuccess
+    }
+    "test with json" >> {
+      ParserRun.parse(DftbPlusParser, "parsers/dftbPlus/test/examples/detailed.out", "json") must_== ParseResult.ParseSuccess
+    }
+  }
+}