diff --git a/src/main/scala/eu/nomad_lab/parsers/GulpParser.scala b/src/main/scala/eu/nomad_lab/parsers/GulpParser.scala
new file mode 100644
index 0000000000000000000000000000000000000000..0d9157ecb6d3dbcf87337e7c797fa35bfb517a9b
--- /dev/null
+++ b/src/main/scala/eu/nomad_lab/parsers/GulpParser.scala
@@ -0,0 +1,49 @@
+package eu.nomad_lab.parsers
+
+import eu.{ nomad_lab => lab }
+import eu.nomad_lab.DefaultPythonInterpreter
+import org.{ json4s => jn }
+import scala.collection.breakOut
+
+object GulpParser extends SimpleExternalParserGenerator(
+  name = "GulpParser",
+  parserInfo = jn.JObject(
+    ("name" -> jn.JString("GulpParser")) ::
+      ("parserId" -> jn.JString("GulpParser" + lab.GulpVersionInfo.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.GulpVersionInfo.toMap.map {
+            case (key, value) =>
+              (key -> jn.JString(value.toString))
+          }(breakOut): List[(String, jn.JString)])
+      )) :: Nil
+  ),
+  mainFileTypes = Seq("text/.*"),
+  mainFileRe = """\s*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\**\s*
+\s*\*\s*GENERAL UTILITY LATTICE PROGRAM\s*\*\s*
+\s*\*\s*Julian Gale\s*\*\s*
+\s*\*\s*Nanochemistry Research Institute\s*\*\s*
+\s*\*\s*Department of Chemistry\s*\*\s*
+\s*\*\s*Curtin University, Western Australia\s*\*\s*
+\s*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\**\s*
+""".r,
+  cmd = Seq(DefaultPythonInterpreter.pythonExe(), "${envDir}/parsers/gulp/parser/parser-gulp/main.py",
+    "--uri", "${mainFileUri}", "${mainFilePath}"),
+  resList = Seq(
+    "parser-gulp/main.py",
+    "parser-gulp/spacegroups.py",
+    "parser-gulp/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/gulp.nomadmetainfo.json"
+  ) ++ DefaultPythonInterpreter.commonFiles(),
+  dirMap = Map(
+    "parser-gulp" -> "parsers/gulp/parser/parser-gulp",
+    "nomad_meta_info" -> "nomad-meta-info/meta_info/nomad_meta_info",
+    "python" -> "python-common/common/python/nomadcore"
+  ) ++ DefaultPythonInterpreter.commonDirMapping(),
+  metaInfoEnv = Some(lab.meta.KnownMetaInfoEnvs.gulp)
+)
diff --git a/src/test/scala/eu/nomad_lab/parsers/GulpParserSpec.scala b/src/test/scala/eu/nomad_lab/parsers/GulpParserSpec.scala
new file mode 100644
index 0000000000000000000000000000000000000000..c2a41d80a3350e22c424321fc432190cf1eaee96
--- /dev/null
+++ b/src/test/scala/eu/nomad_lab/parsers/GulpParserSpec.scala
@@ -0,0 +1,27 @@
+package eu.nomad_lab.parsers
+
+import eu.nomad_lab.{ parsers, DefaultPythonInterpreter }
+import org.scalacheck.Properties
+import org.specs2.mutable.Specification
+import org.{ json4s => jn }
+
+object GulpParserSpec extends Specification {
+  "GulpParserTest" >> {
+    "test example1 " >> {
+      "test with json-events" >> {
+        ParserRun.parse(GulpParser, "parsers/gulp/test/examples/outputs/example1.got", "json-events") must_== ParseResult.ParseSuccess
+      }
+      "test with json" >> {
+        ParserRun.parse(GulpParser, "parsers/gulp/test/examples/outputs/example1.got", "json") must_== ParseResult.ParseSuccess
+      }
+    }
+    "test example2 " >> {
+      "test with json-events" >> {
+        ParserRun.parse(GulpParser, "parsers/gulp/test/examples/outputs/example2.got", "json-events") must_== ParseResult.ParseSuccess
+      }
+      "test with json" >> {
+        ParserRun.parse(GulpParser, "parsers/gulp/test/examples/outputs/example2.got", "json") must_== ParseResult.ParseSuccess
+      }
+    }
+  }
+}