diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
index e116056..dc7dac8 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
@@ -91,7 +91,23 @@
           aktuellesZitat.append(c);
         }
       } else if (tiefe > 0) {
-        aktuellesZitat.append(c);
+        if (c == '\n' && beginntArtikelUeberschrift(text, i + 1)) {
+          // Ein Änderungsgesetz zitiert nie über eine Artikel-Überschrift hinweg: Hier fehlt im
+          // amtlichen Satz ein schließendes Anführungszeichen (kommt vor, z.B. GV. NRW. 2026
+          // S. 202 Artikel 2 Nr. 11). Ohne diese Grenze verschlänge das offene Zitat alle
+          // folgenden Artikel und der Parser fände überhaupt keine Änderungsbefehle mehr.
+          warnungen.add(
+              "Zitat vor einer Artikel-Überschrift nicht geschlossen: …"
+                  + kontextAuszug(text, i)
+                  + "… — dort geschlossen.");
+          ausgabe.append('«').append(zitate.size()).append('»');
+          zitate.add(aktuellesZitat.toString());
+          aktuellesZitat.setLength(0);
+          tiefe = 0;
+          ausgabe.append(c);
+        } else {
+          aktuellesZitat.append(c);
+        }
       } else {
         ausgabe.append(c);
       }
@@ -131,6 +147,22 @@
     return FORTFUEHRUNGS_MARKER.matcher(fenster).find();
   }
 
+  /**
+   * Strukturgrenze eines Änderungsgesetzes: eine Zeile, die nur aus „Artikel N“ besteht. Bayerische
+   * Stammgesetze zitieren ihre Normköpfe als „Art. N“, nicht als „Artikel N“ — zitierter Inhalt
+   * läuft hier also nicht versehentlich auf.
+   */
+  private static final Pattern ARTIKEL_GRENZE = Pattern.compile("^Artikel[ \\t]+\\d+[a-z]?[ \\t]*$");
+
+  /** Wahr, wenn die bei {@code von} beginnende Zeile eine Artikel-Überschrift ist. */
+  private static boolean beginntArtikelUeberschrift(String text, int von) {
+    if (von >= text.length()) {
+      return false;
+    }
+    int ende = text.indexOf('\n', von);
+    return ARTIKEL_GRENZE.matcher(text.substring(von, ende < 0 ? text.length() : ende)).matches();
+  }
+
   private static String kontextAuszug(String text, int position) {
     var von = Math.max(0, position - 60);
     var bis = Math.min(text.length(), position + 20);
diff --git a/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java b/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java
index ada273c..a3397cf 100644
--- a/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java
+++ b/src/main/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParser.java
@@ -41,6 +41,9 @@
   // geprüft, sodass spätere Fundstellen-Klammern („(BayRS V S. 595)“) nicht getroffen werden.
   private static final Pattern JURABK_ZEILE = Pattern.compile("^\\(([^()]+)\\)$");
 
+  /** Trennt im Klammerzusatz den Kurztitel von der Abkürzung („Kurztitel – Abk“). */
+  private static final Pattern KURZTITEL_TRENNER = Pattern.compile("\\s+[–—]\\s+");
+
   // Kopf der Druckfassung („BayJG: Bayerisches Jagdgesetz … (Art. 1–64)“), ggf. mit
   // umbrochenem Rest („1–64)“) auf der Folgezeile.
   private static final Pattern DRUCKKOPF = Pattern.compile("^\\S{1,20}: .+$");
@@ -95,10 +98,20 @@
     }
     var langue = zeilen.get(i++).strip();
     String jurabk = null;
+    String kurzue = null;
     if (i < zeilen.size()) {
       var m = JURABK_ZEILE.matcher(zeilen.get(i).strip());
       if (m.matches()) {
-        jurabk = m.group(1);
+        // Landesgesetze führen im Klammerzusatz häufig Kurztitel und Abkürzung nebeneinander
+        // („Telemedienzuständigkeitsgesetz – TMZ-Gesetz“, „Gemeindeordnung – GO –“). Das
+        // Änderungsgesetz zitiert dann den Kurztitel, nicht die Abkürzung.
+        var teile = KURZTITEL_TRENNER.split(m.group(1).strip(), 2);
+        if (teile.length == 2) {
+          kurzue = teile[0].strip();
+          jurabk = teile[1].strip().replaceAll("\\s*[–—-]\\s*$", "");
+        } else {
+          jurabk = m.group(1).strip();
+        }
         i++;
       }
     }
@@ -190,7 +203,7 @@
           "Kein „§ N“- oder „Art. N“-Normkopf gefunden — ist das eine konsolidierte Fassung im"
               + " kanonischen Klartextformat?");
     }
-    return new Gesetz(jurabk != null ? jurabk : langue, langue, null, normen, gliederungen);
+    return new Gesetz(jurabk != null ? jurabk : langue, langue, kurzue, normen, gliederungen);
   }
 
   /** Überspringt die Kopfzeile der Druckfassung samt umbrochenem Rest. */
diff --git a/src/main/resources/sampledata/Landesrecht-Beispiele.adoc b/src/main/resources/sampledata/Landesrecht-Beispiele.adoc
index 373f615..1d831ac 100644
--- a/src/main/resources/sampledata/Landesrecht-Beispiele.adoc
+++ b/src/main/resources/sampledata/Landesrecht-Beispiele.adoc
@@ -61,7 +61,10 @@
 |`NRW/GV-NRW-2026-S202_22-Rundfunkaenderungsgesetz.pdf` — GV. NRW. 2026 Nr. 7 vom 31.03.2026,
 S. 202 (22. Rundfunkänderungsgesetz)
 |Umfangreiches Mehrgesetz-Artikelgesetz (17 S.); „Die Inhaltsübersicht wird wie folgt
-geändert", „§ … (weggefallen)". Bereitgestellt aus dem amtlichen recht.nrw.de-PDF.
+geändert", „§ … (weggefallen)". Bereitgestellt aus dem amtlichen recht.nrw.de-PDF. *Unbalancierte
+Anführungszeichen* im amtlichen Satz (Artikel 2 Nr. 7 b und Nr. 11). Konsolidierte Fassungen sind
+über `recht.nrw.de/lrgv/gesetz/<TTMMJJJJ>-<Kurztitel-Slug>` frei und serverseitig gerendert
+abrufbar; der Datumspräfix ist der Gültigkeitsbeginn der jeweiligen Fassung.
 
 |Sachsen
 |`Sachsen/SaechsGVBl-2026-S134_AendG-SaechsBeamtVG_revosax.pdf` — SächsGVBl. S. 134
@@ -92,6 +95,11 @@
   (`EndToEndTest.kommunalrechtAendGSchleswigHolstein`): Artikel 1 trifft die Gemeindeordnung,
   Artikel 2 die Kreisordnung, je ein Neufassungsbefehl, kein unbekannter Befehl. Ein voller
   Akzeptanztest ist *nicht* möglich — siehe „Noch offen“.
+* *Nordrhein-Westfalen* ist umgesetzt: `NRW/TMZ-Gesetz-alt.txt` (Telemedienzuständigkeitsgesetz in
+  der Fassung vom 27.04.2022, aus der Fassungshistorie von recht.nrw.de) und
+  `EndToEndTest.tmzGesetzAcceptance` (Artikel 3 des 22. Rundfunkänderungsgesetzes; alle vier
+  Befehle angewandt, kein Rest). Das Ergebnis ist gegen die amtliche Fassung vom 01.04.2026
+  abgeglichen. Die übrigen Artikel (WDR-Gesetz, Landesmediengesetz, 17. RÄStV-AusfG) bleiben offen.
 * Baden-Württemberg (GBl 2026 Nr. 26): großes Anlage-lastiges Änderungsgesetz (§§ 4–57a + Anlagen
   1/3b/4b); Stammfassung/Akzeptanztest noch offen.
 
diff --git a/src/main/resources/sampledata/NRW/TMZ-Gesetz-alt.txt b/src/main/resources/sampledata/NRW/TMZ-Gesetz-alt.txt
new file mode 100644
index 0000000..74621d1
--- /dev/null
+++ b/src/main/resources/sampledata/NRW/TMZ-Gesetz-alt.txt
@@ -0,0 +1,13 @@
+Gesetz zur Regelung der Zuständigkeit für die Überwachung von Telemedien nach dem Telemediengesetz, dem Telekommunikation-Telemedien-Datenschutz-Gesetz und nach § 24 Absatz 3, § 104 Absatz 1, § 106 Absatz 3 und § 113 des Medienstaatsvertrages
+(Telemedienzuständigkeitsgesetz – TMZ-Gesetz)
+Vom 29. März 2007
+§ 1  Aufsicht bei Telemedien
+(1) Die Landesanstalt für Medien Nordrhein-Westfalen (im Folgenden LfM) ist die nach § 24 Absatz 3, § 104 Absatz 1 sowie § 106 Absatz 3 des Medienstaatsvertrages vom 14. bis 28. April 2020 (GV. NRW. S. 524) in der jeweils geltenden Fassung zuständige Aufsichtsbehörde für das gesamte Land Nordrhein-Westfalen, soweit Absatz 2 nichts Abweichendes bestimmt.
+(2) Die oder der Landesbeauftragte für Datenschutz und Informationsfreiheit, im Folgenden LDI, überwacht in ihrem oder seinem Bereich die Einhaltung der Bestimmungen des § 23 des Medienstaatsvertrages über den Datenschutz, der §§ 19 bis 25 des Telekommunikation-Telemedien-Datenschutz-Gesetzes vom 23. Juni 2021 (BGBl. I S. 1982) in der jeweils geltenden Fassung sowie sonstiger datenschutzrechtlicher Bestimmungen, soweit nicht die Zuständigkeit der oder des Datenschutzbeauftragten der LfM, der oder des Rundfunkbeauftragten für den Datenschutz des WDR, im Folgenden WDR-Rundfunkdatenschutzbeauftragte oder WDR-Rundfunkdatenschutzbeauftragter, oder einer anderen für die Datenschutzaufsicht beim öffentlich-rechtlichen Rundfunk zuständigen Stelle gesetzlich bestimmt ist oder ein Fall des § 113 Satz 3 des Medienstaatsvertrages vorliegt. Im Hinblick auf die Befugnisse der oder des LDI im Rahmen ihrer oder seiner Aufsichtstätigkeit über die Einhaltung der Bestimmungen nach dem Telekommunikation-Telemedien-Datenschutz-Gesetz findet Artikel 58 Absatz 1 bis 5 der Datenschutz-Grundverordnung vom 27. April 2016 (ABl. L 119 vom 4.5.2016, S. 1; L 314 vom 22.11.2016, S. 72; L 127 vom 23.5.2018, S. 2; L 74 vom 4.3.2021, S. 35) entsprechende Anwendung.
+(3) Die Bezirksregierung Düsseldorf ist für das gesamte Land Nordrhein-Westfalen zuständig für die Überwachung und Untersagung von Glücksspielen im Internet und der Werbung hierfür im Internet.
+§ 2  Zuständigkeit bei Ordnungswidrigkeiten
+Zuständige Verwaltungsbehörde im Sinne des § 36 Absatz 1 Nummer 1 des Gesetzes über Ordnungswidrigkeiten in der Fassung der Bekanntmachung vom 19. Februar 1987 (BGBl. I S. 602), das zuletzt durch Artikel 31 des Gesetzes vom 5. Oktober 2021 (BGBl. I S. 4607) geändert worden ist, ist in den Fällen des
+1. § 11 Absatz 1 und 2 des Telemediengesetzes die LfM,
+2. § 28 Absatz 1 Nummern 10 bis 13 des Telekommunikation-Telemedien-Datenschutz-Gesetzes die oder der Datenschutzbeauftragte der LfM, die oder der WDR-Rundfunkdatenschutzbeauftragte oder die oder der LDI, soweit die jeweilige Aufsichtszuständigkeit begründet ist.
+§ 3  Inkrafttreten
+Dieses Gesetz tritt am Tag nach der Verkündung in Kraft.
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
index d36341d..b89a367 100644
--- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java
+++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
@@ -482,4 +482,68 @@
     assertThat(kro.befehle()).hasSize(1);
     assertThat(kro.befehle().get(0).stelle().anzeigeText()).isEqualTo("§ 29a Absatz 1");
   }
+
+  /**
+   * Nordrhein-Westfalen: Artikel 3 des 22. Rundfunkänderungsgesetzes (GV. NRW. 2026 S. 202) ändert
+   * das Telemedienzuständigkeitsgesetz. Voller Akzeptanztest — alle vier Befehle werden angewandt;
+   * das Ergebnis stimmt mit der amtlichen Fassung vom 1. April 2026 (recht.nrw.de) überein.
+   */
+  @Test
+  void tmzGesetzAcceptance() throws Exception {
+    var alt = SAMPLEDATA.resolve("NRW/TMZ-Gesetz-alt.txt");
+    var pdf = SAMPLEDATA.resolve("NRW/GV-NRW-2026-S202_22-Rundfunkaenderungsgesetz.pdf");
+    assumeTrue(Files.exists(alt) && Files.exists(pdf), "TMZ-Gesetz-Beispieldaten fehlen");
+
+    var gesetz = new eu.mulk.aendggner.gesetz.land.LandesRechtLoader().load(alt);
+    // Der Klammerzusatz führt Kurztitel und Abkürzung nebeneinander; das Änderungsgesetz zitiert
+    // den Kurztitel („Das Telemedienzuständigkeitsgesetz vom 29. März 2007 …“).
+    assertThat(gesetz.jurabk()).isEqualTo("TMZ-Gesetz");
+    assertThat(gesetz.kurzue()).isEqualTo("Telemedienzuständigkeitsgesetz");
+    assertThat(gesetz.normen()).hasSize(3);
+    assertThat(gesetz.norm("§ 1").orElseThrow().absaetze()).hasSize(3);
+
+    var text = TextBereiniger.bereinige(new PatchTextExtraktor().extrahiere(pdf));
+    var parseErgebnis = new AenderungsgesetzParser().parse(text, gesetz, null);
+    // Das Heft ändert vier Gesetze; nur Artikel 3 trifft das TMZ-Gesetz.
+    assertThat(parseErgebnis.artikel()).containsExactly("3");
+    assertThat(parseErgebnis.befehle()).hasSize(4);
+    assertThat(parseErgebnis.befehle()).noneMatch(b -> b instanceof UnbekannterBefehl);
+
+    // Im amtlichen Satz fehlt bei Artikel 2 Nr. 11 das schließende Anführungszeichen. Ohne die
+    // Artikel-Grenze im ZitatExtraktor verschlänge dieses Zitat die Artikel 3 bis 5.
+    assertThat(parseErgebnis.warnungen())
+        .anyMatch(w -> w.startsWith("Zitat vor einer Artikel-Überschrift nicht geschlossen"));
+
+    var anwendung = BefehlAnwender.anwenden(gesetz, parseErgebnis.befehle());
+    assertThat(anwendung.anzahlAngewandt()).isEqualTo(4);
+    assertThat(anwendung.protokoll())
+        .noneMatch(a -> a.status() == BefehlAnwender.Status.MANUELL_PRUEFEN);
+
+    // Abgleich mit der amtlichen Fassung vom 01.04.2026:
+    var neu = anwendung.neu();
+    // 1. Die Gesetzesüberschrift ist neu gefasst.
+    assertThat(neu.langue())
+        .startsWith("Gesetz zur Regelung der Zuständigkeit für die Überwachung von Telemedien im")
+        .contains("Anwendungsbereich des Digitale-Dienste-Gesetzes");
+    // 2. § 1 Absatz 2 nennt nun die Verordnung (EU) 2016/679 statt der Datenschutz-Grundverordnung
+    //    und das Telekommunikation-Digitale-Dienste-Datenschutz-Gesetz.
+    var absatz2 = neu.norm("§ 1").orElseThrow().absaetze().get(1).text();
+    assertThat(absatz2)
+        .contains("Verordnung (EU) 2016/679")
+        .contains("Telekommunikation-Digitale-Dienste-Datenschutz-Gesetzes vom 23. Juni 2021 (BGBl."
+            + " I S. 1982; 2022 I S. 1045)")
+        .doesNotContain("WDR-Rundfunkdatenschutzbeauftragte");
+    // 3./4. § 2: Fundstellen-Ersetzung im Satzteil vor Nummer 1 und Neufassung der Nummern 1 und 2.
+    var paragraph2 = neu.norm("§ 2").orElseThrow().gesamtText();
+    assertThat(paragraph2)
+        .contains("Artikel 4 des Gesetzes vom 17. Juli 2025 (BGBl. 2025 I Nr. 163)")
+        .contains("§ 33 Absatz 1 und 2 Nummer 1 und 2 des Digitale-Dienste-Gesetzes")
+        .doesNotContain("§ 11 Absatz 1 und 2 des Telemediengesetzes");
+    // § 3 bleibt unberührt.
+    assertThat(neu.norm("§ 3").orElseThrow().gesamtText())
+        .isEqualTo(gesetz.norm("§ 3").orElseThrow().gesamtText());
+
+    var synopse = SynopseBuilder.baue(gesetz, anwendung, parseErgebnis.warnungen(), false);
+    assertThat(HtmlRenderer.rendere(synopse, "E2E-Test TMZ-Gesetz")).contains("§ 2");
+  }
 }
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktorTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktorTest.java
index 8194f6b..618d078 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktorTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktorTest.java
@@ -61,6 +61,39 @@
   }
 
   @Test
+  void schliesstOffenesZitatVorArtikelUeberschrift() {
+    // Fehlt im amtlichen Satz das schließende Anführungszeichen (GV. NRW. 2026 S. 202 Artikel 2
+    // Nr. 11), verschlänge das Zitat sonst alle folgenden Artikel und der Parser fände keinen
+    // einzigen Änderungsbefehl mehr.
+    var ergebnis =
+        ZitatExtraktor.extrahiere(
+            "12. Dem § 128 wird folgender Absatz angefügt:\n"
+                + "„(3) § 14 gilt nicht.\n"
+                + "Artikel 3\n"
+                + "§ 1 wird wie folgt gefasst: „(1) Neu.“");
+
+    assertThat(ergebnis.text())
+        .isEqualTo(
+            "12. Dem § 128 wird folgender Absatz angefügt:\n«0»\nArtikel 3\n"
+                + "§ 1 wird wie folgt gefasst: «1»");
+    assertThat(ergebnis.zitat(0)).isEqualTo("(3) § 14 gilt nicht.");
+    assertThat(ergebnis.zitat(1)).isEqualTo("(1) Neu.");
+    assertThat(ergebnis.warnungen()).hasSize(1);
+    assertThat(ergebnis.warnungen().get(0)).startsWith("Zitat vor einer Artikel-Überschrift");
+  }
+
+  @Test
+  void zitiertUeberParagraphenUeberschriftenHinweg() {
+    // Nur „Artikel N“ ist Strukturgrenze: Ein zitierter Paragraph („§ 19“ + Überschrift auf der
+    // Folgezeile) gehört vollständig ins Zitat.
+    var ergebnis = ZitatExtraktor.extrahiere("Es wird gefasst: „§ 19\nAußerkrafttreten\nText.“");
+
+    assertThat(ergebnis.text()).isEqualTo("Es wird gefasst: «0»");
+    assertThat(ergebnis.zitat(0)).isEqualTo("§ 19\nAußerkrafttreten\nText.");
+    assertThat(ergebnis.warnungen()).isEmpty();
+  }
+
+  @Test
   void stelltZitateWiederHer() {
     var original = "Das Wort „alt“ wird durch das Wort „neu“ ersetzt.";
     var ergebnis = ZitatExtraktor.extrahiere(original);
diff --git a/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java b/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java
index 3354255..b170c5f 100644
--- a/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java
+++ b/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextParserTest.java
@@ -161,4 +161,36 @@
     assertThat(gesetz.norm("§ 3").orElseThrow().weggefallen()).isTrue();
     assertThat(gesetz.gliederungen()).extracting(Gliederung::anzeigeText).containsExactly("I. Teil — Grundlagen der Gemeindeverfassung");
   }
+
+  @Test
+  void trenntKurztitelUndAbkuerzungImKlammerzusatz() {
+    // Landesgesetze führen im Klammerzusatz oft beides („Telemedienzuständigkeitsgesetz –
+    // TMZ-Gesetz“); das Änderungsgesetz zitiert den Kurztitel, nicht die Abkürzung.
+    var gesetz =
+        LandesRechtTextParser.parse(
+            """
+            Gesetz zur Regelung der Zuständigkeit für die Überwachung von Telemedien
+            (Telemedienzuständigkeitsgesetz – TMZ-Gesetz)
+            Vom 29. März 2007
+            § 1  Aufsicht bei Telemedien
+            (1) Die Landesanstalt für Medien ist zuständig.
+            """);
+
+    assertThat(gesetz.jurabk()).isEqualTo("TMZ-Gesetz");
+    assertThat(gesetz.kurzue()).isEqualTo("Telemedienzuständigkeitsgesetz");
+
+    // Ohne Trenner bleibt der Klammerzusatz die Abkürzung; ein nachgestellter Gedankenstrich
+    // („Gemeindeordnung – GO –“) gehört nicht zur Abkürzung.
+    var ohneKurztitel =
+        LandesRechtTextParser.parse(
+            "Gemeindeordnung für Schleswig-Holstein\n(GO)\n§ 1  Wesen\n(1) Text.\n");
+    assertThat(ohneKurztitel.jurabk()).isEqualTo("GO");
+    assertThat(ohneKurztitel.kurzue()).isNull();
+
+    var mitGedankenstrich =
+        LandesRechtTextParser.parse(
+            "Gemeindeordnung für Schleswig-Holstein\n(Gemeindeordnung – GO –)\n§ 1  Wesen\n(1) Text.\n");
+    assertThat(mitGedankenstrich.jurabk()).isEqualTo("GO");
+    assertThat(mitGedankenstrich.kurzue()).isEqualTo("Gemeindeordnung");
+  }
 }
