diff --git a/src/main/scala/eu/nomad_lab/normalizers/PrototypeNormalizer.scala b/src/main/scala/eu/nomad_lab/normalizers/PrototypeNormalizer.scala
new file mode 100644
index 0000000000000000000000000000000000000000..7e50d35469cbd92d5cb02b3efde55ae26ba44bca
--- /dev/null
+++ b/src/main/scala/eu/nomad_lab/normalizers/PrototypeNormalizer.scala
@@ -0,0 +1,106 @@
+package eu.nomad_lab.normalizers
+
+import eu.{ nomad_lab => lab }
+import eu.nomad_lab.DefaultPythonInterpreter
+import org.{ json4s => jn }
+import scala.collection.breakOut
+import eu.nomad_lab.normalize.ExternalNormalizerGenerator
+import eu.nomad_lab.meta
+import eu.nomad_lab.query
+
+object PrototypeNormalizer extends ExternalNormalizerGenerator(
+  name = "PrototypeNormalizer",
+  info = jn.JObject(
+    ("name" -> jn.JString("PrototypeNormalizer")) ::
+      ("normalizerId" -> jn.JString("PrototypeNormalizer" + lab.PrototypeVersionInfo.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.PrototypeVersionInfo.toMap.map {
+            case (key, value) =>
+              (key -> jn.JString(value.toString))
+          }(breakOut): List[(String, jn.JString)])
+      )) :: Nil
+  ),
+  context = "calcuation_context",
+  filter = query.CompiledQuery(query.QueryExpression("section_system"), meta.KnownMetaInfoEnvs.publicMeta),
+  cmd = Seq(DefaultPythonInterpreter.pythonExe(), "${envDir}/normalizers/prototypes/normalizer/normalizer-prototypes/classify4me_prototypes.py",
+    "${contextUri}", "${archivePath}"),
+  resList = Seq(
+    "normalizer-prototypes/setup_paths.py",
+    "normalizer-prototypes/classify4me_prototypes.py",
+    "nomad_meta_info/public.nomadmetainfo.json",
+    "nomad_meta_info/common.nomadmetainfo.json",
+    "nomad_meta_info/meta_types.nomadmetainfo.json",
+    "nomad_meta_info/stats.nomadmetainfo.json"
+  ) ++ DefaultPythonInterpreter.commonFiles(),
+  dirMap = Map(
+    "normalizer-prototypes" -> "normalizers/prototypes/normalizer/normalizer-prototypes",
+    "nomad_meta_info" -> "nomad-meta-info/meta_info/nomad_meta_info",
+    "python" -> "python-common/common/python/nomadcore"
+  ) ++ DefaultPythonInterpreter.commonDirMapping(),
+  metaInfoEnv = lab.meta.KnownMetaInfoEnvs.all
+) {
+  val trace: Boolean = false
+
+  override def stdInHandler(context: ResolvedRef)(wrapper: ExternalParserWrapper)(pIn: java.io.OutputStream): Unit = {
+    val out: java.io.Writer = if (trace)
+      new java.io.BufferedWriter(new java.io.OutputStreamWriter(pIn));
+    else
+      null
+    val stringBuilder = new StringBuilder
+    def writeOut(s: String): Unit = {
+      out.write(s)
+      if (trace) stringBuilder ++= s
+    }
+    def flush(): Unit = {
+      out.flush()
+      if (trace) {
+        logger.info(stringBuilder.result())
+        stringBuilder.clear()
+      }
+    }
+    writeOut("[")
+    var isFirst = true
+    try {
+      context match {
+        case Calculation(archiveSet, c) =>
+	  val sysTable = c.sectionTable(Seq("section_run", "section_system"))
+	  
+	  def outputSysSection(sysSection: SectionH5): Unit = {
+            if (!isFirst)
+              writeOut(",")
+            else
+              isFirst = false
+            //writeOut(s"""{
+            //              |  "context": ${JsonUtils.escapeString(m.toRef.toUriStr(archiveSet.objectKind))},
+            //              |  "section_system": """.stripMargin)
+            val visitor = new EmitJsonVisitor(
+              writeOut = writeOut
+            )
+            val scanner = new H5EagerScanner
+            scanner.scanResolvedRef(Section(archiveSet, sysSection), visitor)
+            //writeOut("}")
+            flush()
+	    }
+          }
+
+	  val nSys = sysTable.lengthL
+	  if (nSys > 0)
+	    	  outputSysSection(sysTable(0))
+	  if (nSys > 1)
+	    outputSysSection(sysTable(nSys - 1))
+
+          writeOut("]")
+          flush()
+        case r =>
+          throw new Exception(s"FhiAimsBasisNormalizer expected a calculation as context, but got $r")
+      }
+    } finally {
+      out.close()
+      pIn.close()
+      wrapper.sendStatus = ExternalParserWrapper.SendStatus.Finished
+    }
+  }
+}
diff --git a/src/test/scala/eu/nomad_lab/normalizers/PrototypesNormalizerSpec.scala b/src/test/scala/eu/nomad_lab/normalizers/PrototypesNormalizerSpec.scala
new file mode 100644
index 0000000000000000000000000000000000000000..95b64d38d8f315785d37d4b17aa24610d89439a5
--- /dev/null
+++ b/src/test/scala/eu/nomad_lab/normalizers/PrototypesNormalizerSpec.scala
@@ -0,0 +1,10 @@
+package eu.nomad_lab.normalizers
+
+import eu.nomad_lab.{ parsers, DefaultPythonInterpreter }
+import org.scalacheck.Properties
+import org.specs2.mutable.Specification
+import org.{ json4s => jn }
+
+object PrototypesNormalizerSpec extends Specification {
+
+}