diff --git a/src/main/scala/eu/nomad_lab/parsers/OctopusParser.scala b/src/main/scala/eu/nomad_lab/parsers/OctopusParser.scala
new file mode 100644
index 0000000000000000000000000000000000000000..d38cddbe094bee76f0f00253c038c78e2be9bcde
--- /dev/null
+++ b/src/main/scala/eu/nomad_lab/parsers/OctopusParser.scala
@@ -0,0 +1,41 @@
+package eu.nomad_lab.parsers
+
+import eu.{ nomad_lab => lab }
+import eu.nomad_lab.DefaultPythonInterpreter
+import org.{ json4s => jn }
+import scala.collection.breakOut
+
+object OctopusParser extends SimpleExternalParserGenerator(
+  name = "OctopusParser",
+  parserInfo = jn.JObject(
+    ("name" -> jn.JString("OctopusParser")) ::
+      ("parserId" -> jn.JString("OctopusParser" + lab.OctopusVersionInfo.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.OctopusVersionInfo.toMap.map {
+            case (key, value) =>
+              (key -> jn.JString(value.toString))
+          }(breakOut): List[(String, jn.JString)])
+      )) :: Nil
+  ),
+  mainFileTypes = Seq("text/.*"),
+  //TODO: Update the replacement string (mainFileRe)
+  mainFileRe = """******************************** Grid ********************************
+                 |Simulation Box:""".r,
+  cmd = Seq(DefaultPythonInterpreter.python2Exe(), "${envDir}/parsers/octopus/parser/parser-octopus/OctopusParser.py",
+    "--uri", "${mainFileUri}", "${mainFilePath}"),
+  resList = Seq(
+    "parser-octopus/OctopusParser.py",
+    "parser-octopus/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/octopus.nomadmetainfo.json"
+  ) ++ DefaultPythonInterpreter.commonFiles(),
+  dirMap = Map(
+    "parser-octopus" -> "parsers/octopus/parser/parser-octopus",
+    "nomad_meta_info" -> "nomad-meta-info/meta_info/nomad_meta_info"
+  ) ++ DefaultPythonInterpreter.commonDirMapping()
+)
diff --git a/src/test/scala/eu/nomad_lab/parsers/OctopusParserSpec.scala b/src/test/scala/eu/nomad_lab/parsers/OctopusParserSpec.scala
new file mode 100644
index 0000000000000000000000000000000000000000..27a7316bb81c0707f8682219c17706746a76ff65
--- /dev/null
+++ b/src/test/scala/eu/nomad_lab/parsers/OctopusParserSpec.scala
@@ -0,0 +1,14 @@
+package eu.nomad_lab.parsers
+
+import org.specs2.mutable.Specification
+
+object OctopusParserSpec extends Specification {
+  "CastepParserTest" >> {
+    "test with json-events" >> {
+      ParserRun.parse(CastepParser, "parsers/castep/test/examples/", "json-events") must_== ParseResult.ParseSuccess
+    }
+    "test with json" >> {
+      ParserRun.parse(CastepParser, "parsers/castep/test/examples/", "json") must_== ParseResult.ParseSuccess
+    }
+  }
+}