diff --git a/web/bjcp-styleguide.css b/web/bjcp-styleguide.css
index 3a55e6dda59489a55710f578d94e42487028357f..e6ea1cba25f4ed34a1cf381e5bdc1626f8f2e6c1 100644
--- a/web/bjcp-styleguide.css
+++ b/web/bjcp-styleguide.css
@@ -92,6 +92,49 @@ styleguide strength-classifications:before {
   content: "Strength Classifications: ";
 }
 
+styleguide[lang="de"] overall-impression:before {
+  content: "Gesamteindruck: ";
+}
+styleguide aroma:before {
+  content: "Geruch: ";
+}
+styleguide appearance:before {
+  content: "Erscheinungsbild: ";
+}
+styleguide flavor:before {
+  content: "Geschmack: ";
+}
+styleguide mouthfeel:before {
+  content: "Mundgefühl: ";
+}
+styleguide comments:before {
+  content: "Kommentierung: ";
+}
+styleguide history:before {
+  content: "Geschichte: ";
+}
+styleguide characteristic-ingredients:before {
+  content: "Charakteristische Zutaten: ";
+}
+styleguide style-comparison:before {
+  content: "Stilvergleich: ";
+}
+styleguide entry-instructions:before {
+  content: "Einreichungshinweise: ";
+}
+styleguide specs:before {
+  content: "Technische Daten: ";
+}
+styleguide commercial-examples:before {
+  content: "Kommerzielle Beispiele: ";
+}
+styleguide tags:before {
+  content: "Tags: ";
+}
+styleguide strength-classifications:before {
+  content: "Stärkeklassifikation: ";
+}
+
 styleguide overall-impression,
 styleguide aroma,
 styleguide appearance,
@@ -213,3 +256,13 @@ styleguide nav {
 styleguide chapter.collapsed nav, styleguide category.collapsed nav, styleguide subcategory.collapsed nav {
     transform: rotate(-90deg);
 }
+
+styleguide *[source="original"] {
+    background-color: #ffd0d0;
+}
+styleguide *[source="lang-file"] {
+    background-color: white;
+}
+styleguide nav:not([todo="0"]) {
+    background-color: #ffb0b0;
+}
diff --git a/web/edit.js b/web/edit.js
index 5307b273b4a7b6b22f318d15237e164f5b9868f7..dd3cf0562441ec79fbf447162ff4ca9691f3f6a4 100644
--- a/web/edit.js
+++ b/web/edit.js
@@ -178,7 +178,10 @@ for (var i = 0; i < l.length; i++) {
     });
 
     l[i].classList.add("collapsed");
-    
+
+    var o = l[i].querySelectorAll('*[source="original"]');
+    nav.setAttribute("todo",o.length);
+
     nav.addEventListener("click", function() {
 	this.parentNode.classList.toggle("collapsed");
     });
diff --git a/web/save.cgi b/web/save.cgi
index 0a6533fd819ef838c44e822f5352565c207297b1..b30cc8e7bb47f0ba2cecd83c65c5be2945e30b1e 100755
--- a/web/save.cgi
+++ b/web/save.cgi
@@ -84,19 +84,19 @@ f.write('<styleguide xmlns="http://heimbrauconvention.de/bjcp-styleguide/2015">\
 f.write('<!-- snippet supplied by %s from %s at %s -->\n' % (user, addr, time))
 if level == 1:
     f.write('  <category id="%s">\n' % id)
-    f.write('    <%s date="%s" author="%s" source="%s">%s</%s>\n' % (elem, time, user, addr, data, elem))
+    f.write('    <%s date="%s" author="%s" addr="%s">%s</%s>\n' % (elem, time, user, addr, data, elem))
     f.write('  </category>\n')
 elif level == 2:
     f.write('  <category id="%s">\n' % id1)
     f.write('    <subcategory id="%s">\n' % id)
-    f.write('      <%s date="%s" author="%s" source="%s">%s</%s>\n' % (elem, time, user, addr, data, elem))
+    f.write('      <%s date="%s" author="%s" addr="%s">%s</%s>\n' % (elem, time, user, addr, data, elem))
     f.write('    </subcategory>\n')
     f.write('  </category>\n')
 elif level == 3:
     f.write('  <category id="%s">\n' % id1)
     f.write('    <subcategory id="%s">\n' % id2)
     f.write('      <subcategory id="%s">\n' % id)
-    f.write('        <%s date="%s" author="%s" source="%s">%s</%s>\n' % (elem, time, user, addr, data, elem))
+    f.write('        <%s date="%s" author="%s" addr="%s">%s</%s>\n' % (elem, time, user, addr, data, elem))
     f.write('      </subcategory>\n')
     f.write('    </subcategory>\n')
     f.write('  </category>\n')
diff --git a/xsd/bjcp-styleguide-2015.xsd b/xsd/bjcp-styleguide-2015.xsd
index 020cee9fba6428e1902d207c634dcc043c2b5431..62ee415902c75b5909803717ebb85fda60e7e595 100644
--- a/xsd/bjcp-styleguide-2015.xsd
+++ b/xsd/bjcp-styleguide-2015.xsd
@@ -20,6 +20,7 @@
 	  <xsd:element ref="category"/>
 	</xsd:choice>
       </xsd:sequence>
+      <xsd:attribute name="lang" type="xsd:string"/>
     </xsd:complexType>
   </xsd:element>
 
@@ -105,9 +106,10 @@
     <xsd:choice minOccurs="0" maxOccurs="unbounded">
       <xsd:element ref="p"/>
     </xsd:choice>
+    <xsd:attribute name="source" type="xsd:string"/>
     <xsd:attribute name="date" type="xsd:string"/>
     <xsd:attribute name="author" type="xsd:string"/>
-    <xsd:attribute name="source" type="xsd:string"/>
+    <xsd:attribute name="addr" type="xsd:string"/>
   </xsd:complexType>
 
   <xsd:element name="tags">
@@ -312,9 +314,10 @@
       <xsd:element name="u" type="xsd:string"/>
       <xsd:element ref="a"/>
     </xsd:choice>
+    <xsd:attribute name="source" type="xsd:string"/>
     <xsd:attribute name="date" type="xsd:string"/>
     <xsd:attribute name="author" type="xsd:string"/>
-    <xsd:attribute name="source" type="xsd:string"/>
+    <xsd:attribute name="addr" type="xsd:string"/>
   </xsd:complexType>
 
 
diff --git a/xsl/bjcp-2015-styleguide-translate.xsl b/xsl/bjcp-2015-styleguide-translate.xsl
index fa0e9077d7a65382ec0c198768bfe9a1a2f355ef..f5f35acf0e19e25ee012b2eb1248493bdc5223fc 100644
--- a/xsl/bjcp-2015-styleguide-translate.xsl
+++ b/xsl/bjcp-2015-styleguide-translate.xsl
@@ -26,6 +26,18 @@
 
 
 
+  <xsl:template match="bjcp:styleguide">
+    <xsl:element name="{local-name(.)}">
+      <xsl:attribute name="lang">
+	<xsl:value-of select="$lang"/>
+      </xsl:attribute>
+      <xsl:apply-templates select="@*[local-name(.) != 'lang']"/>
+      <xsl:apply-templates/>
+    </xsl:element>
+  </xsl:template>
+
+
+
   <xsl:template match="bjcp:chapter">
     <xsl:variable name="d">
       <xsl:text>../</xsl:text>
@@ -151,10 +163,12 @@
     <xsl:element name="{local-name(.)}">
       <xsl:choose>
 	<xsl:when test="dyn:evaluate($p)">
+	  <xsl:attribute name="source">lang-file</xsl:attribute>
 	  <xsl:apply-templates select="dyn:evaluate($p)/@*"/>
 	  <xsl:apply-templates select="dyn:evaluate($p)/bjcp:* | dyn:evaluate($p)/text()"/>
 	</xsl:when>
 	<xsl:otherwise>
+	  <xsl:attribute name="source">original</xsl:attribute>
 	  <xsl:apply-templates/>
 	</xsl:otherwise>
       </xsl:choose>