diff --git a/src/schema/common.rnc b/src/schema/common.rnc
new file mode 100644
index 0000000000000000000000000000000000000000..ab1e95186559d9355459ece5554185522dd903ef
--- /dev/null
+++ b/src/schema/common.rnc
@@ -0,0 +1,119 @@
+# -*- mode: rnc; -*-
+#
+# Author: David Maus <maus@hab.de>
+#
+
+namespace dct  = "http://purl.org/dc/terms/"
+namespace foaf = "http://xmlns.com/foaf/0.1/"
+namespace owl  = "http://www.w3.org/2002/07/owl#"
+namespace rdf  = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+namespace skos = "http://www.w3.org/2004/02/skos/core#"
+
+namespace s = "http://purl.oclc.org/dsdl/schematron"
+
+[
+   s:ns [ prefix = "rdf" uri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" ]
+   s:ns [ prefix = "owl" uri = "http://www.w3.org/2002/07/owl#" ]
+]
+
+start = rdfWrapper
+
+optionalMetadata =
+   element dct:subject { Concept }*
+ & element dct:issued { Datestamp }?
+
+requiredMetadata =
+   element dct:title { rdfLiteral }+
+ & element dct:description { rdfLiteral }+
+ & element dct:creator { Agent }+
+ & element dct:publisher { Agent }
+ & element dct:created { Datestamp }
+ & element dct:modified { Datestamp }
+ & element dct:license { License }
+
+rdfLiteral =
+   attribute xml:lang { xsd:language }?
+ & text
+
+Agent =
+   ( Organization | Person )
+
+Organization =
+   element foaf:Organization {
+      ( internalEntity | externalEntity )
+   }
+
+Person =
+   element foaf:Person {
+      ( internalEntity | externalEntity )
+   }
+
+internalEntity =
+   [
+      s:pattern [
+         s:rule [
+            context = "*[@rdf:about]" s:assert [
+               test = "matches(@rdf:about, '^http://([^.]+\.)?hab\.de')"
+               "Verwende <owl:sameAs> für Statements zu Entitäten, die nicht unter der Kontrolle der HAB liegen."
+            ]
+         ]
+      ]
+   ]
+   attribute rdf:about { xsd:anyURI },
+   Label+
+
+externalEntity =
+   [
+      s:pattern [
+         s:rule [
+            context = "owl:sameAs" s:assert [
+               test = "not(matches(@rdf:resource, '^http://([^.]+\.)?hab\.de'))"
+               "Verwende @rdf:about für Statements zu Entitäten, die unter der Kontroller der HAB liegen."
+            ]
+         ]
+      ]
+   ]
+   element owl:sameAs {
+      attribute rdf:resource { xsd:anyURI }
+   }
+ & Label+
+
+Label =
+   element skos:prefLabel { rdfLiteral }
+
+Datestamp =
+   attribute rdf:datatype { "http://www.w3.org/2001/XMLSchema#date" }
+ & xsd:date
+
+License =
+   element dct:LicenseDocument {
+      ( internalEntity | externalEntity )
+   }
+
+Concept =
+   element skos:Concept {
+      ( internalEntity | externalEntity )
+   }
+
+rdfResource =
+   attribute rdf:resource { xsd:anyURI }
+
+rdfPrimarySubject =
+   [
+      s:pattern [
+         s:rule [
+            context = "/rdf:RDF/*" s:assert [
+               test = "matches(@rdf:about, '^http://([^.]+\.)?hab\.de')"
+               "Ein primäres Subject muss unter der Kontrolle der HAB stehen."
+            ]
+         ]
+      ]
+   ]
+   attribute rdf:about { xsd:anyURI }
+
+rdfPrimarySubjectEntity = notAllowed
+
+rdfWrapper =
+   element rdf:RDF {
+      rdfPrimarySubjectEntity
+   }
diff --git a/src/schema/void.rnc b/src/schema/void.rnc
new file mode 100644
index 0000000000000000000000000000000000000000..d0d29768be169985f0b3f4fb5c4629e1630c5870
--- /dev/null
+++ b/src/schema/void.rnc
@@ -0,0 +1,29 @@
+# -*- mode: rnc; -*-
+#
+# Author: David Maus <maus@hab.de>
+#
+
+namespace void = "http://rdfs.org/ns/void#"
+
+include "common.rnc" {
+   optionalMetadata &=
+      element void:exampleResource { rdfResource }*
+    & element void:uriSpace { text }?
+    & element void:vocabulary { rdfResource }*
+    & element void:triples { xsd:integer }?
+    & element void:entities { xsd:integer }?
+
+   requiredMetadata &=
+      element void:feature { rdfResource }+
+    & element void:dataDump { rdfResource }+
+
+   rdfPrimarySubjectEntity = void.Dataset+
+}
+
+void.Dataset =
+   element void:Dataset {
+      rdfPrimarySubject
+    & requiredMetadata
+    & optionalMetadata
+    & empty
+   }