Support Bavarian state law (BayJG) with Art./§ inversion and superscripts

Extend ÄndGgner from federal-only to Bavarian state law. Bavarian base
laws are structured in Artikel while their amending acts are structured
in Paragraphen (inverted from the Bund); official sentence numbers and
footnote markers are carried as Unicode superscripts (¹²³, ⁶)).

- Generalise Stelle.Paragraph to carry a sigil ("§" or "Art.") and route
  it through recogniser, applier and resolver (bit-identical Bund output).
- Superscript pipeline: geometric detection in FontgroessenFilter
  (SuperskriptModus BEHALTEN), Superskript util, exact sentence splitting
  in SatzTeiler, label-based sentence resolution.
- BayRechtLoader/BayRechtTextParser for gesetze-bayern.de PDF/plaintext.
- §-structured amending acts, GVBl/Landtag column titles, non-breaking
  spaces, the GVBl continuation quote; Bavarian command forms (footnote
  aufhebung, Satznummerierung streichung, Wortlaut forms, Halbsatz,
  gapping chains).

Acceptance (EndToEndTest.bayJgGvblAcceptance): the pre-2026 BayJG
fassung (BayJG-alt.txt, reconstructed from Wayback single-article
snapshots) with GVBl 6/2026 §§ 1-2 applied — 154 commands, 0 unknown,
149 applied automatically, 5 pinned residuals (follow-up edits inside
two multi-step renumbering sequences in Art. 29a and Art. 56).

Application-side fixes surfaced by the acceptance run (all Bund-safe):
sentence-start superscript before §; sentence boundaries = {0} ∪ {each
number ≥ 2}; gapping scope inheritance for bare word operations;
footnote definition lines hidden from word operations; absatz aufhebung
marks "(weggefallen)" keeping its number, and absatz renumbering
overwrites an empty placeholder (weggefallen/gegenstandslos) target.

211 tests green (mvnw verify); federal reference numbers unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Change-Id: Iebae4c17ca90755c5fd36251362042f3d5796fd0
diff --git a/FASSUNGEN.txt b/FASSUNGEN.txt
index 9ea3b7e..a1361f4 100644
--- a/FASSUNGEN.txt
+++ b/FASSUNGEN.txt
@@ -30,6 +30,15 @@
 ferner wird die Strukturierung hängend eingerückter Definitionslisten (z.B. im
 UWG-Anhang) sowohl im PDF-Extraktor als auch im XML-Flattener vereinheitlicht.
 
+Sodann wird das Erzeugnis in einer fünften Ertüchtigungswelle für das Landes-
+recht des Freistaates Bayern ertüchtigt (Artikel 4 bis 10): Stammgesetze in
+Artikel-Gliederung aus der konsolidierten Fassung von gesetze-bayern.de,
+paragraphengegliederte Änderungsgesetze aus dem Bayerischen Gesetz- und
+Verordnungsblatt und aus Landtags-Drucksachen, amtliche Satznummern als
+Superskripte sowie die bayerischen Befehlsformen. Belegfall ist das Gesetz zur
+Änderung des Bayerischen Jagdgesetzes und weiterer Rechtsvorschriften vom
+26. März 2026 (GVBl. S. 113) nebst Regierungsentwurf (Ltg-Drs. 19/9707).
+
 
 Artikel 1
 Geometrische Klassifikation der Zeilenenden nach Ausrichtungs-Clustern
@@ -86,16 +95,164 @@
 die Stellenauflösung (StellenAufloeser.zeilenBlock) erforderlich ist.
 
 
+Artikel 4
+Verallgemeinerung der Normbezeichnung auf das Artikel-Sigel
+
+Die Stellenkomponente des Paragraphen (Stelle.Paragraph) führt neben der Nummer
+nunmehr das Sigel („§“ oder „Art.“) und bildet daraus die Einzelnormbezeichnung
+(enbez). Der Stellenparser (StellenParser) nimmt „Art.“ als Normbezeichnung
+sowie durchgehend die abgekürzten und deklinierten Einheitenwörter an („Abs.“,
+„Nr.“, „Nrn.“, „Buchst.“, „Sätzen“, „Absätzen“); ferner wird die Komponente des
+Halbsatzes eingeführt (Auflösung durch Teilung des Satzes am Semikolon) und
+werden koordinierte Stellen mit nachgestellten Komponenten („Art. 18 Satz 2,
+Art. 19 und 20 Satz 1“) entfaltet. Befehlserkenner und Befehlsanwender bilden
+sämtliche bisher auf das „§“-Zeichen festgelegten Muster auf beide Sigel ab;
+das Verhalten gegenüber Bundesrecht bleibt unverändert.
+
+
+Artikel 5
+Amtliche Satznummern als Superskripte
+
+Bayerische Normtexte führen amtliche Satznummern als hochgestellte Ziffern.
+Der PDF-Vorverarbeiter (FontgroessenFilter) erhält einen Superskript-Modus:
+Ziffernfolgen, die kleiner gesetzt und gegenüber der Grundlinie ihres Laufs um
+zwei bis sechs Punkt gehoben sind, werden als Unicode-Superskripte (¹ ² ³)
+übernommen statt verworfen — im selben Lauf klebende Satznummern und Fußnoten-
+marker („Enteignung⁶)“) eingeschlossen. Der Satzteiler (SatzTeiler) teilt
+nummerierte Texte exakt an den Satznummern und stellt die Nummer eines Satzes
+bereit; die Stellenauflösung löst Satzangaben in nummerierten Texten nach dem
+amtlichen Label statt nach der Position auf. Die Satz-Umnummerierung schreibt
+die Satznummer im Text um („Satz 5 wird Satz 4“ → „⁵“ wird „⁴“). Für Bundes-
+recht (Modus „Entfernen“) bleibt das Verhalten unverändert.
+
+
+Artikel 6
+Kolumnentitel des GVBl und des Bayerischen Landtags; geschützte Leerzeichen
+
+Der Textbereiniger entfernt die Kolumnentitel des Bayerischen Gesetz- und
+Verordnungsblatts (mit links- oder rechtsstehender, auch an die Jahreszahl
+geklebter Seitenzahl: „… Nr. 6/202676“) sowie die Titel- und Seitenköpfe der
+Landtags-Drucksachen; eine am Seitenwechsel unterbrochene Silbentrennung heilt
+nach der Kopfentfernung („kurz-“ + „fristige“). Geschützte Leerzeichen des
+GVBl-Satzes („§ 1“, „Abs. 2“) werden früh auf gewöhnliche Leerzeichen
+normalisiert, da sie für die Muster des Parsers unsichtbar sind. Die Struktur-
+zeilen-Ausnahme des Reflows erfasst nunmehr auch „Art. N“.
+
+
+Artikel 7
+Paragraphengegliederte Änderungsgesetze; Rahmenbefehl im Vorspann;
+Fortführungszeichen
+
+Bayerische Änderungsgesetze gliedern sich in Paragraphen. Der Parser
+(AenderungsgesetzParser) teilt ein Dokument ohne Artikel-Überschriften an
+freistehenden „§ N“-Zeilen; die Auswahl über den Einleitungssatz (betrifft)
+bleibt maßgeblich und wählt auch die „Weitere Änderung“ desselben Stamm-
+gesetzes. Nennungen des Stammgesetzes als Genitiv-Attribut eines Ausführungs-
+oder Durchführungstitels („Verordnung zur Ausführung des Bayerischen Jagd-
+gesetzes“) zählen nicht als Treffer. Trägt der Vorspann nach der gesetzesweiten
+Änderungsformel einen Rahmenbefehl („… wird wie folgt geändert: Art. 28 Abs. 1
+wird wie folgt geändert:“) oder das Ziel eingebettet in der Formel selbst
+(„Art. 7 Abs. 2 des X-Gesetzes … wird wie folgt geändert:“), so wird dieses
+Ziel Kontext aller Gliederungspunkte. Der Zitatextraktor behandelt das
+Fortführungszeichen des GVBl (jedes neugefasste Aufzählungsglied öffnet am
+Zeilenanfang erneut mit „, geschlossen wird einmal am Blockende) als
+Typografie statt als geschachteltes Zitat; der Begründungs-Abschneider nimmt
+auch „Begründung:“ an. Ein GVBl-Heft, das zugleich ein artikelgegliedertes
+Änderungsgesetz enthielte, unterdrückte die Paragraphen-Teilung — Ausweg ist
+die Handkorrektur über --extract-only.
+
+
+Artikel 8
+Stammgesetz-Lader für das bayerische Landesrecht
+
+Das neue Paket gesetz/bayern liest ein Stammgesetz aus der konsolidierten
+Fassung von gesetze-bayern.de — als PDF (über den Superskript-erhaltenden
+Extraktionsweg) oder als kanonischen Klartext im Format der --extract-only-
+Ausgabe (BayRechtLoader, BayRechtTextParser). Erfasst werden Titelblock,
+Gliederungs-Überschriften samt nummerierten Unter-Überschriften (synthetische
+Kennzahlen), Normköpfe „Art. N“ (Querverweise am Zeilenanfang werden über eine
+Negativliste und die Monotonie der Artikelnummern ausgeschlossen; vom Reflow an
+ein Satzende geklebte Normköpfe werden am doppelten Leerzeichen erkannt und
+wieder abgetrennt), aufgehobene Artikel sowie Fußnotenzeilen („⁶) [Amtl.
+Anm.:] …“), die superskript-normalisiert im tragenden Absatz verbleiben. Die
+Befehlszeile (AendGgner) wählt den Lader nach dem Dateityp des Stammgesetzes
+(XML → gii, PDF/Klartext → Bayern) und extrahiert Änderungsgesetze dann im
+Superskript-Modus.
+
+
+Artikel 9
+Bayerische Befehlsformen
+
+Der Befehlserkenner und der Befehlsanwender werden ergänzt um: die Aufhebung
+von Fußnoten („Fußnote 1 wird aufgehoben“, auch mehrere — entfernt Fußnoten-
+zeile und Inline-Marker der Kontextnorm), die Streichung der Satznummerierung
+(„In Satz 1 wird die Satznummerierung „1“ gestrichen“), die Wortlaut-Formen
+(„Der Wortlaut wird Satz 1“, „Der bisherige Wortlaut wird Abs. 5“ — erhält nur
+der einzige unnummerierte Absatz die Nummer —, „Dem Wortlaut werden die
+folgenden Abs. 1 bis 4 vorangestellt“ nebst lokativer Folgeklausel auf den
+nummerierten Absatz), stellenlose und koordinierte Streichungen („Die Angabe
+„X“ wird gestrichen“, „werden die Angabe „X“ und die Angabe „Y“ gestrichen“),
+Ersetzungspaare mit „sowie“ und Einfügepaare mit Komma-Reihung, Bereichs- und
+Koordinations-Umnummerierungen in abgekürzter Form („Die bisherigen Abs. 1
+bis 3 werden die Abs. 2 bis 4“) sowie Klauselketten mit gemeinsamem Schluss-
+verb („… wird durch … und … wird durch … ersetzt“). Die Absatz-Umnummerierung
+greift nur noch, wenn der Absatz selbst das Ziel ist (bei „Satz 5 wird Satz 4“
+stammt die Absatzangabe aus dem Kontextrahmen und der Satz-Zweig ist
+zuständig).
+
+
+Artikel 10
+Feinbehandlung von Satzgrenzen, Fußnoten und mehrschrittigen Aufhebungen bei
+der Anwendung
+
+Aus der vollständigen Anwendung der bayerischen Belegnovelle auf die (nach
+Artikel 8 wiederhergestellte) alte Jagdgesetz-Fassung ergeben sich folgende
+Verfeinerungen des Satzteilers, des Befehlserkenners und des Befehlsanwenders:
+
+1.  Der Satzteiler (SatzTeiler) bestimmt die Satzgrenzen fortan als Textanfang
+    zuzüglich der Fundstelle jeder amtlichen Satznummer ab „²“. Eine allein
+    stehende Nummer ≥ 2 — sei es, weil der erste Satz keine Nummer trägt, sei es,
+    weil seine Nummer zuvor gestrichen wurde („Verboten ist … ²Art. 33 …“) —
+    bildet damit eine eigene Grenze. Als Satzanfang gilt eine Satznummer auch vor
+    einem Paragraphzeichen („³§ 23 …“).
+
+2.  Fußnoten-Definitionszeilen („⁶) [Amtl. Anm.:] …“) sind für die wortweisen
+    Operationen (Streichen, Ersetzen, Einfügen) kein Inhalt: Sie werden vor der
+    Operation abgetrennt und danach unverändert wieder angefügt, sodass die
+    Streichung eines Fußnotenmarkers („die Angabe „¹)“ wird gestrichen“) den in
+    den Text eingebetteten Marker trifft, nicht aber den gleichlautenden Kopf der
+    Definitionszeile (deren Beseitigung der Fußnoten-Aufhebung vorbehalten bleibt).
+
+3.  Die Aufhebung eines durch seine Bezeichnung benannten Absatzes markiert
+    diesen — unter Beibehaltung seiner Nummer — als weggefallen. Eine nachfolgende
+    Absatz-Umnummerierung auf eine Zielnummer, die bereits von einem leeren Platz-
+    halter (weggefallen oder gegenstandslos) belegt ist, überschreibt diesen
+    (in Entsprechung zur Umnummerierung auf eine weggefallene Zielnorm), sodass
+    Folgen wie „Abs. 2 wird aufgehoben; Abs. 3 wird Abs. 2 …“ vollständig aufgehen.
+
+4.  In einem Verbund erbt eine reine Wortoperation ohne eigenen Lokativ den Skopus
+    der linken Klausel („In Abs. 2 Satz 1 wird „A“ ersetzt und die Angabe „B“ wird
+    gestrichen“ wirkt für beide Klauseln auf Abs. 2 Satz 1); das gemeinsame Verb
+    wird hierzu in die grammatische Normalform vorgezogen.
+
+
 Schlussbestimmung
 
-Die vorstehenden Änderungen sind durch die Prüfung sämtlicher Testfälle (einhun-
-dertneunundsiebzig an der Zahl), durch die vollständige Erstellung (mvnw verify)
-sowie durch einen Vorher-nachher-Vergleich sämtlicher einundzwanzig Beispiel-
-kombinationen (UWG, AGG, ProdHaftG, GEG, IfSG; Anwendungs- und Prüfzahlen
-durchgehend unverändert) bestätigt worden. Anlass war ein anhand der UWG-Novelle
-2026 gemeldeter Wiedergabefehler (verklebte Kurzüberschriften im Anhang, auch in
-der Grundvorschrift); die Behebung wurde anhand der Beispieldaten (UWG-Anhang,
-Nummern 2a, 4c sowie 22; § 2 IfSG) verifiziert.
+Die vorstehenden Änderungen sind durch die Prüfung sämtlicher Testfälle (zwei-
+hundertelf an der Zahl) sowie durch die vollständige Erstellung (mvnw verify)
+bestätigt worden. Die Behebung des eingangs genannten Wiedergabefehlers wurde
+anhand der Beispieldaten (UWG-Anhang, Nummern 2a, 4c sowie 22; § 2 IfSG)
+verifiziert; die Anwendungs- und Prüfzahlen der bundesrechtlichen Beispiele (UWG,
+AGG, ProdHaftG, GEG, IfSG) bleiben durchgehend unverändert. Die Ertüchtigung für
+das bayerische Landesrecht ist durch die vollständige Anwendung der Belegnovelle
+(GVBl. 2026 S. 113, §§ 1 und 2) auf die wiederhergestellte alte Fassung des
+Bayerischen Jagdgesetzes belegt: Von einhundertvierundfünfzig Änderungsanweisungen
+werden einhundertneunundvierzig selbsttätig angewandt; keine bleibt unerkannt.
+Die fünf verbleibenden Anweisungen sind Folgeänderungen innerhalb zweier mehr-
+schrittiger Umnummerierungssequenzen (Neunummerierung des Bußgeldkatalogs in
+Art. 56 sowie die Absatzverschiebung in Art. 29a) und werden — statt fehlerhaft
+gedeutet zu werden — mit Begründung dem Abschnitt „Manuell prüfen“ zugewiesen.
+Der Regierungsentwurf (Ltg-Drs. 19/9707) wird auf derselben Grundlage verarbeitet.
 
 
 ════════════════════════════════════════════════════════════════════════════════
diff --git a/README.adoc b/README.adoc
index 1ba4343..d785371 100644
--- a/README.adoc
+++ b/README.adoc
@@ -60,9 +60,15 @@
 
 Eingaben:
 
-* Stammgesetz: XML im gii-norm-Format von
+* Stammgesetz (Bundesrecht): XML im gii-norm-Format von
   https://www.gesetze-im-internet.de/[gesetze-im-internet.de]
-* Änderungsgesetz: BGBl-PDF oder Klartext
+* Stammgesetz (Landesrecht Bayern): konsolidierte Fassung von
+  https://www.gesetze-bayern.de/[gesetze-bayern.de] als PDF oder als
+  kanonischer Klartext im Format der `--extract-only`-Ausgabe; amtliche
+  Satznummern und Fußnotenmarker stehen als Unicode-Superskripte im
+  Text („¹Die freilebende Tierwelt …“, „Enteignung⁶)“)
+* Änderungsgesetz: BGBl-, GVBl- oder Drucksachen-PDF (Bundestag,
+  Bundesrat, Bayerischer Landtag) oder Klartext
 
 [source,shell script]
 ----
@@ -112,6 +118,22 @@
 Zieltext nicht mehr existiert — landet mit Begründung im Abschnitt
 *Manuell prüfen* der Synopse und wird niemals stillschweigend verworfen.
 
+Für das bayerische Landesrecht versteht ÄndGgner die dortigen
+Konventionen: Stammgesetze gliedern sich in Artikel („Art. 6 Abs. 2
+Satz 1 Nr. 2“, durchgängig abgekürzt zitiert), Änderungsgesetze dagegen
+in Paragraphen — auch mehrere Gesetze in einem GVBl-Heft, aus denen die
+auf das Stammgesetz zielenden §§ (einschließlich „Weitere Änderung“)
+anhand des Einleitungssatzes ausgewählt werden. Amtliche Satznummern
+bleiben als Superskripte erhalten und dienen als exakte Satzgrenzen;
+zusätzlich erkannt werden die bayerischen Befehlsformen („Fußnote 1
+wird aufgehoben“, „In Satz 1 wird die Satznummerierung „1“ gestrichen“,
+„Dem Wortlaut werden die folgenden Abs. 1 bis 4 vorangestellt“, „Der
+bisherige Wortlaut wird Abs. 5“, Halbsatz-Ziele, Klauselketten mit
+gemeinsamem Schlussverb) sowie das Fortführungszeichen des GVBl (jedes
+neugefasste Aufzählungsglied öffnet erneut mit „). Meta-Änderungen an
+Drucksachen (Änderungsanträge des Landtags) sind bewusst noch nicht
+abgedeckt.
+
 
 == Running the Tests
 
diff --git a/src/main/java/eu/mulk/aendggner/AendGgner.java b/src/main/java/eu/mulk/aendggner/AendGgner.java
index f7e6bf7..e647b75 100644
--- a/src/main/java/eu/mulk/aendggner/AendGgner.java
+++ b/src/main/java/eu/mulk/aendggner/AendGgner.java
@@ -2,8 +2,11 @@
 
 import eu.mulk.aendggner.aenderung.parse.AenderungsgesetzParser;
 import eu.mulk.aendggner.aenderung.parse.PatchTextExtraktor;
+import eu.mulk.aendggner.aenderung.parse.SuperskriptModus;
 import eu.mulk.aendggner.aenderung.parse.TextBereiniger;
 import eu.mulk.aendggner.anwendung.BefehlAnwender;
+import eu.mulk.aendggner.gesetz.Gesetz;
+import eu.mulk.aendggner.gesetz.bayern.BayRechtLoader;
 import eu.mulk.aendggner.gesetz.gii.GiiXmlLoader;
 import eu.mulk.aendggner.synopse.HtmlRenderer;
 import eu.mulk.aendggner.synopse.SynopseBuilder;
@@ -30,7 +33,11 @@
 
   private static final Logger log = Logger.getLogger(AendGgner.class);
 
-  @Parameters(index = "0", description = "The base law (gii-norm XML from gesetze-im-internet.de).")
+  @Parameters(
+      index = "0",
+      description =
+          "The base law: gii-norm XML from gesetze-im-internet.de, or — for Bavarian state law —"
+              + " the consolidated version from gesetze-bayern.de (PDF or canonical plain text).")
   private Path baseFile;
 
   @Parameters(
@@ -103,7 +110,7 @@
     log.debugf("Logging configured.");
 
     if (dumpGesetz) {
-      var gesetz = new GiiXmlLoader().load(baseFile);
+      var gesetz = ladeStammgesetz();
       System.out.printf(
           "%s — %s (%d Normen)%n", gesetz.jurabk(), gesetz.langue(), gesetz.normen().size());
       for (var norm : gesetz.normen()) {
@@ -118,7 +125,7 @@
     }
 
     if (extractOnly) {
-      var extraktor = new PatchTextExtraktor();
+      var extraktor = new PatchTextExtraktor(superskriptModus());
       for (var file : patches) {
         var text = extraktor.extrahiere(file);
         System.out.println(raw ? text : TextBereiniger.bereinige(text));
@@ -127,8 +134,8 @@
     }
 
     if (dumpBefehle) {
-      var gesetz = new GiiXmlLoader().load(baseFile);
-      var extraktor = new PatchTextExtraktor();
+      var gesetz = ladeStammgesetz();
+      var extraktor = new PatchTextExtraktor(superskriptModus());
       var parser = new AenderungsgesetzParser();
       for (var file : patches) {
         var text = TextBereiniger.bereinige(extraktor.extrahiere(file));
@@ -169,8 +176,8 @@
     }
 
     // Pipeline: Stammgesetz laden → Befehle parsen → anwenden → Synopse rendern.
-    var altesGesetz = new GiiXmlLoader().load(baseFile);
-    var extraktor = new PatchTextExtraktor();
+    var altesGesetz = ladeStammgesetz();
+    var extraktor = new PatchTextExtraktor(superskriptModus());
     var parser = new AenderungsgesetzParser();
 
     var gesetz = altesGesetz;
@@ -215,6 +222,23 @@
     return gesamtErgebnis.anzahlAngewandt() == 0 && !protokoll.isEmpty() ? 2 : 0;
   }
 
+  /** Gii-XML → {@link GiiXmlLoader}; PDF/Klartext (bayerisches Landesrecht) → {@link
+   * BayRechtLoader}. */
+  private Gesetz ladeStammgesetz() throws Exception {
+    return istGiiXml() ? new GiiXmlLoader().load(baseFile) : new BayRechtLoader().load(baseFile);
+  }
+
+  /** Bayerische Stammtexte tragen amtliche Satznummern — auch die Änderungsgesetze werden dann
+   * mit Superskript-Erhalt extrahiert, damit Zitate und Stammtext dieselbe Schreibweise tragen. */
+  private SuperskriptModus superskriptModus() throws IOException {
+    return istGiiXml() ? SuperskriptModus.ENTFERNEN : SuperskriptModus.BEHALTEN;
+  }
+
+  private boolean istGiiXml() throws IOException {
+    var mimeType = new org.apache.tika.Tika().detect(baseFile);
+    return mimeType.equals("application/xml") || mimeType.equals("text/xml");
+  }
+
   private static String kuerze(String text) {
     var einzeilig = text.replaceAll("\\s+", " ");
     return einzeilig.length() <= 160 ? einzeilig : einzeilig.substring(0, 157) + "…";
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java b/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java
index d35fc5b..897f02c 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/Aenderungsbefehl.java
@@ -107,6 +107,41 @@
       implements Aenderungsbefehl {}
 
   /**
+   * „Der Wortlaut wird Satz 1.“ (bayerisches Landesrecht) — der bisher unnummerierte Text erhält
+   * die amtliche Satznummer als Superskript (Vorbereitung für das Anfügen weiterer Sätze).
+   */
+  record WortlautZuSatz(Stelle stelle, String nummer, Provenienz provenienz)
+      implements Aenderungsbefehl {}
+
+  /**
+   * „Dem Wortlaut werden die folgenden Abs. 1 bis 4 vorangestellt: „…““ (bayerisches Landesrecht) —
+   * neue Absätze treten vor den bisherigen Normtext.
+   */
+  record WortlautVoranstellung(Stelle stelle, String text, Provenienz provenienz)
+      implements Aenderungsbefehl {}
+
+  /**
+   * „Fußnote 1 wird aufgehoben.“ / „Die Fußnoten 9 und 10 werden aufgehoben.“ (bayerisches
+   * Landesrecht) — entfernt die Fußnotenzeile(n) „ⁿ) [Amtl. Anm.:] …“ samt der Inline-Marker „ⁿ)“
+   * aus der Kontextnorm.
+   */
+  record FussnotenAufhebung(Stelle stelle, java.util.List<String> nummern, Provenienz provenienz)
+      implements Aenderungsbefehl {
+
+    public FussnotenAufhebung {
+      nummern = java.util.List.copyOf(nummern);
+    }
+  }
+
+  /**
+   * „In Satz 1 wird die Satznummerierung „1“ gestrichen.“ (bayerisches Landesrecht) — entfernt die
+   * amtliche Superskript-Satznummer am Anfang des bezeichneten Bereichs (etwa nachdem der zweite
+   * und letzte Satz eines Absatzes aufgehoben wurde).
+   */
+  record SatznummerierungStreichung(Stelle stelle, String nummer, Provenienz provenienz)
+      implements Aenderungsbefehl {}
+
+  /**
    * „Nach § 33 werden die folgenden Überschriften zu Teil 3 und zu Teil 3 Abschnitt 1 eingefügt:
    * „…““ bzw. „Die bisherigen Überschriften zu Teil 4 und Teil 4 Abschnitt 1 werden durch die
    * folgende Überschrift zu Abschnitt 2 ersetzt: „…““ — neue Gliederungs-Überschriften im
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/Stelle.java b/src/main/java/eu/mulk/aendggner/aenderung/Stelle.java
index ababf63..1c63a5f 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/Stelle.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/Stelle.java
@@ -20,6 +20,7 @@
       permits Paragraph,
           AbsatzNr,
           SatzNr,
+          HalbsatzNr,
           NummerNr,
           BuchstabeNr,
           Ueberschrift,
@@ -27,8 +28,20 @@
           Gliederungseinheit,
           Absatzbezeichnung {}
 
-  /** „§ 5“, „§ 28a“ — die Paragraphennummer ohne „§ “. */
-  public record Paragraph(String nummer) implements Komponente {}
+  /**
+   * „§ 5“, „§ 28a“, im bayerischen Landesrecht „Art. 5“ — die Normnummer ohne Sigel, dazu das
+   * Sigel selbst („§“ oder „Art.“).
+   */
+  public record Paragraph(String nummer, String sigel) implements Komponente {
+    public Paragraph(String nummer) {
+      this(nummer, "§");
+    }
+
+    /** Die Einzelnormbezeichnung, wie sie im {@code Gesetz}-Modell steht: „§ 5“, „Art. 5“. */
+    public String enbez() {
+      return sigel + " " + nummer;
+    }
+  }
 
   /** Eine Gliederungseinheit oberhalb des Paragraphen: „Teil 2“, „Abschnitt 3“, „Anlage 8“. */
   public record Gliederungseinheit(String art, String nummer) implements Komponente {
@@ -46,6 +59,9 @@
   /** „Satz 1“ */
   public record SatzNr(String nummer) implements Komponente {}
 
+  /** „Halbsatz 1“ — die Hälfte eines am Semikolon geteilten Satzes (bayerische Zitierweise). */
+  public record HalbsatzNr(String nummer) implements Komponente {}
+
   /** „Nummer 4“ */
   public record NummerNr(String nummer) implements Komponente {}
 
@@ -148,9 +164,10 @@
       }
       sb.append(
           switch (komponente) {
-            case Paragraph p -> "§ " + p.nummer();
+            case Paragraph p -> p.enbez();
             case AbsatzNr a -> "Absatz " + a.nummer();
             case SatzNr s -> "Satz " + s.nummer();
+            case HalbsatzNr h -> "Halbsatz " + h.nummer();
             case NummerNr n -> "Nummer " + n.nummer();
             case BuchstabeNr b -> "Buchstabe " + b.kennung();
             case Ueberschrift u -> "Überschrift";
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParser.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParser.java
index 1b79794..976cd5e 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParser.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParser.java
@@ -24,6 +24,13 @@
 
   private static final Pattern ARTIKEL_UEBERSCHRIFT = Pattern.compile("^Artikel\\s+(\\d+[a-z]?)$");
 
+  // Bayerische Änderungsgesetze gliedern sich in Paragraphen statt Artikel („§ 1“ als
+  // freistehende Überschriftzeile). Die §-Teilung greift nur, wenn das Dokument keinerlei
+  // Artikel-Überschriften enthält — Bundesgesetze mit unzitiert abgedruckten Ablösegesetzen
+  // (ProdHaftG) enthalten freistehende „§ N“-Zeilen innerhalb ihrer Artikel.
+  private static final Pattern PARAGRAPH_UEBERSCHRIFT_AUSSEN =
+      Pattern.compile("^§\\s*(\\d+[a-z]?)$");
+
   public record ParseErgebnis(
       List<Aenderungsbefehl> befehle, List<String> artikel, List<String> warnungen) {}
 
@@ -35,20 +42,35 @@
    */
   public ParseErgebnis parse(String text, Gesetz ziel, @Nullable String artikelFilter) {
     var zitate = ZitatExtraktor.extrahiere(text);
-    var artikelBloecke = teileInArtikel(zitate.text());
+    var artikelBloecke = teileInArtikel(zitate.text(), ARTIKEL_UEBERSCHRIFT);
+    boolean paragraphenModus = false;
+    if (artikelBloecke.isEmpty()) {
+      artikelBloecke = teileInArtikel(zitate.text(), PARAGRAPH_UEBERSCHRIFT_AUSSEN);
+      paragraphenModus = !artikelBloecke.isEmpty();
+    }
 
     var befehle = new ArrayList<Aenderungsbefehl>();
     var betroffeneArtikel = new ArrayList<String>();
+    var warnungen = new ArrayList<>(zitate.warnungen());
 
     for (var artikel : artikelBloecke) {
       var relevant =
           artikelFilter != null
               ? artikel.label.equals(artikelFilter)
+                  && (!paragraphenModus || hatAenderungsformel(artikel))
               : betrifft(artikel, ziel, zitate);
       if (!relevant) {
         continue;
       }
       log.infof("Artikel %s betrifft %s.", artikel.label, ziel.jurabk());
+      if (paragraphenModus && artikelFilter != null && betroffeneArtikel.contains(artikel.label)) {
+        // Ein GVBl-Heft enthält mehrere Gesetze mit je eigener §-Zählung.
+        warnungen.add(
+            "Mehrere Änderungsgesetze im Dokument tragen einen § "
+                + artikel.label
+                + "; --artikel ist hier mehrdeutig — besser ohne Filter arbeiten (Auswahl über den"
+                + " Namen des Stammgesetzes).");
+      }
       betroffeneArtikel.add(artikel.label);
 
       var scan = GliederungsScanner.scanne(artikel.zeilen);
@@ -59,12 +81,76 @@
         befehle.add(vorspannBefehl(scan.vorspann(), artikel.label, zitate));
         continue;
       }
+      // Der Vorspann kann nach der gesetzesweiten Änderungsformel einen Rahmenbefehl tragen, der
+      // den Kontext aller Punkte setzt: „… wird wie folgt geändert: Art. 28 Abs. 1 wird wie folgt
+      // geändert:“ (GVBl) bzw. mit eingebettetem Ziel „Art. 7 Abs. 2 des X-Gesetzes … wird wie
+      // folgt geändert:“ (dann trägt die Formel das Ziel selbst).
+      var kontext = vorspannKontext(scan.vorspann(), artikel.label, zitate, befehle);
       for (var punkt : scan.punkte()) {
-        verarbeitePunkt(punkt, Stelle.LEER, artikel.label, "", zitate, befehle);
+        verarbeitePunkt(punkt, kontext, artikel.label, "", zitate, befehle);
       }
     }
 
-    return new ParseErgebnis(befehle, betroffeneArtikel, zitate.warnungen());
+    return new ParseErgebnis(befehle, betroffeneArtikel, warnungen);
+  }
+
+  private static final String AENDERUNGSFORMEL = "wird wie folgt geändert:";
+
+  private static boolean hatAenderungsformel(ArtikelBlock artikel) {
+    var scan = GliederungsScanner.scanne(artikel.zeilen);
+    return scan.vorspann().replaceAll("\\s+", " ").contains("wird wie folgt geändert");
+  }
+
+  // Eingebettetes Rahmenziel in der Änderungsformel selbst: „Art. 7 Abs. 2 des Bayerischen
+  // Umweltinformationsgesetzes … wird wie folgt geändert:“. Der Lookbehind auf „durch “ schließt
+  // die Zitierkette der Änderungshistorie aus („das zuletzt durch § 5 des Gesetzes vom … geändert
+  // worden ist“) — dort ist die Norm nie das Subjekt der Formel.
+  private static final Pattern EINGEBETTETES_ZIEL =
+      Pattern.compile(
+          "(?<!durch )\\b((?:§|Art\\.)\\s*\\d+[a-z]?"
+              + "(?:\\s+(?:Absatz|Abs\\.|Satz|Nummer|Nr\\.|Buchstabe|Buchst\\.)\\s+\\d+[a-z]?)*)"
+              + "\\s+(?:des|der)\\s+\\p{Lu}");
+
+  /**
+   * Bestimmt aus dem Vorspann eines Artikels mit Gliederungspunkten den gemeinsamen Kontext der
+   * Punkte. Ohne erkennbaren Rahmen bleibt der Kontext leer (die Punkte müssen ihre Ziele dann
+   * selbst vollständig nennen; Unerkanntes landet als „nicht erkannt“ im Protokoll — niemals
+   * stillschweigend).
+   */
+  private static Stelle vorspannKontext(
+      String vorspann,
+      String artikelLabel,
+      ZitatExtraktor.Ergebnis zitate,
+      List<Aenderungsbefehl> befehle) {
+    var normalisiert = vorspann.replaceAll("\\s+", " ").strip();
+    // Die erste Formel ist die gesetzesweite Einleitung; ein dahinter stehender Rahmenbefehl
+    // trägt ggf. seine eigene Formel („… wird wie folgt geändert: Art. 28 Abs. 1 wird wie folgt
+    // geändert:“).
+    int formel = normalisiert.indexOf(AENDERUNGSFORMEL);
+    if (formel < 0) {
+      return Stelle.LEER;
+    }
+    var rest = normalisiert.substring(formel + AENDERUNGSFORMEL.length()).strip();
+    if (!rest.isEmpty()) {
+      // Rahmenbefehl hinter der gesetzesweiten Formel („Art. 28 Abs. 1 wird wie folgt geändert:“,
+      // auch als Umnummerierungs-Verbund).
+      var provenienz = new Provenienz(artikelLabel, "", zitate.stelleZitateWiederHer(rest));
+      var rahmen = BefehlErkenner.rahmenMitBefehl(rest, Stelle.LEER, provenienz);
+      if (rahmen.isPresent()) {
+        if (rahmen.get().begleitbefehl() != null) {
+          befehle.add(rahmen.get().begleitbefehl());
+        }
+        return rahmen.get().stelle();
+      }
+      return Stelle.LEER;
+    }
+    // Die Formel endet den Vorspann: Trägt sie ihr Ziel eingebettet („Art. 7 Abs. 2 des
+    // X-Gesetzes … wird wie folgt geändert:“), wird dieses zum Kontext.
+    var eingebettet = EINGEBETTETES_ZIEL.matcher(normalisiert.substring(0, formel));
+    if (eingebettet.find()) {
+      return StellenParser.parse(eingebettet.group(1)).orElse(Stelle.LEER);
+    }
+    return Stelle.LEER;
   }
 
   /** Versucht, den Vorspann-Rest nach der Änderungsformel als einzelnen Befehl zu erkennen. */
@@ -133,7 +219,7 @@
 
   private record ArtikelBlock(String label, List<String> zeilen) {}
 
-  private static List<ArtikelBlock> teileInArtikel(String platzhalterText) {
+  private static List<ArtikelBlock> teileInArtikel(String platzhalterText, Pattern ueberschrift) {
     var bloecke = new ArrayList<ArtikelBlock>();
     String aktuellesLabel = null;
     var aktuelleZeilen = new ArrayList<String>();
@@ -141,10 +227,10 @@
     for (var zeile : platzhalterText.split("\n", -1)) {
       // Gesetzentwürfe (RefE/RegE/Drucksachen): Nach dem Gesetzestext folgt der Begründungsteil
       // — Freitext, der keine Befehle enthält und den letzten Artikel nicht verunreinigen darf.
-      if (aktuellesLabel != null && zeile.strip().equals("Begründung")) {
+      if (aktuellesLabel != null && zeile.strip().matches("Begründung:?")) {
         break;
       }
-      var matcher = ARTIKEL_UEBERSCHRIFT.matcher(zeile.strip());
+      var matcher = ueberschrift.matcher(zeile.strip());
       if (matcher.matches()) {
         if (aktuellesLabel != null) {
           bloecke.add(new ArtikelBlock(aktuellesLabel, List.copyOf(aktuelleZeilen)));
@@ -174,6 +260,11 @@
     if (!vorspann.contains("wird wie folgt geändert")) {
       return false;
     }
+    // Ausführungs-/Durchführungstitel nennen das Stammgesetz nur als Genitiv-Attribut („Die
+    // Verordnung zur Ausführung des Bayerischen Jagdgesetzes (AVBayJG) … wird wie folgt
+    // geändert“) — solche Nennungen zählen nicht als Treffer.
+    vorspann =
+        vorspann.replaceAll("\\b(?:zur Ausführung|zur Durchführung|zum Vollzug) des [^,()]*", "");
     var vorspannStamm = stammForm(vorspann);
     return (ziel.kurzue() != null && vorspannStamm.contains(stammForm(ziel.kurzue())))
         || (ziel.langue() != null && vorspannStamm.contains(stammForm(ziel.langue())))
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java
index 9cb4701..edbe742 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/BefehlErkenner.java
@@ -5,7 +5,9 @@
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Aufhebung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Ebene;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Ersetzung;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.FussnotenAufhebung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.GliederungsUeberschriften;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.SatznummerierungStreichung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Neufassung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Sammelbefehl;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Streichung;
@@ -14,7 +16,9 @@
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Umnummerierung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WoerterEinfuegung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortAnker;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautVoranstellung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautZuAbsatz;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautZuSatz;
 import eu.mulk.aendggner.aenderung.Provenienz;
 import eu.mulk.aendggner.aenderung.Stelle;
 import java.util.ArrayList;
@@ -65,7 +69,7 @@
   // „…““ — neue Gliederungs-Überschriften hinter einem Anker-§.
   private static final Pattern GLIEDERUNG_UEBERSCHRIFT_EINFUEGUNG =
       Pattern.compile(
-          "^Nach (§ \\S+) (?:wird|werden) (?:die |der |das )?folgenden? Überschrift(?:en)? "
+          "^Nach ((?:§|Art\\.) \\S+) (?:wird|werden) (?:die |der |das )?folgenden? Überschrift(?:en)? "
               + "zu (.+?) (?:ein|an)gefügt: "
               + Z
               + "\\.?$");
@@ -243,6 +247,19 @@
 
   private static final Pattern AUFHEBUNG = Pattern.compile("^(.+?) (?:wird|werden) aufgehoben\\.$");
 
+  // „Fußnote 1 wird aufgehoben.“ / „Die Fußnoten 9 und 10 werden aufgehoben.“ (bayerisches
+  // Landesrecht; Fußnoten stehen dort als „ⁿ) [Amtl. Anm.:] …“-Zeilen im Normtext).
+  private static final Pattern FUSSNOTE_AUFHEBUNG =
+      Pattern.compile(
+          "^(?:Die )?Fußnoten? (\\d+(?:(?:, | und )\\d+)*) (?:wird|werden) aufgehoben\\.$");
+  private static final Pattern FUSSNOTEN_TRENNER = Pattern.compile(", | und ");
+
+  // „In Satz 1 wird die Satznummerierung „1“ gestrichen.“ (bayerisches Landesrecht) — etwa
+  // nachdem der zweite und letzte Satz eines Absatzes aufgehoben wurde.
+  private static final Pattern SATZNUMMERIERUNG_STREICHUNG =
+      Pattern.compile(
+          "^(?:In )?(.+?) (?:wird|werden) die Satznummerierung " + Z + " gestrichen\\.$");
+
   // „Die Überschrift von Teil 3 Abschnitt 2 wird gestrichen.“ — Streichung einer Gliederungs-
   // Überschrift (die Wörter-Streichung STREICHUNG erfordert dagegen ein Zitat).
   private static final Pattern UEBERSCHRIFT_STREICHUNG =
@@ -274,6 +291,23 @@
       Pattern.compile(
           "^(?:In )?(.+?) (?:wird|werden) (?:jeweils )?" + WOERTER + " " + Z + " gestrichen\\.$");
 
+  // „Die Angabe „X“ wird gestrichen.“ — ohne Stellenangabe (Kontext liefert das Ziel); tritt vor
+  // allem als rechte Klausel eines Verbunds auf („… ersetzt und die Angabe „X“ wird gestrichen“).
+  private static final Pattern STREICHUNG_OHNE_STELLE =
+      Pattern.compile(
+          "^(?:Die Wörter|Das Wort|Die Angabe|Die Zahl) " + Z + " (?:wird|werden) "
+              + "(?:jeweils )?gestrichen\\.$");
+
+  // „In Nr. 2 werden die Angabe „X“ und die Angabe „Y“ gestrichen.“ — mehrere Streichobjekte
+  // unter einem gemeinsamen „gestrichen“.
+  private static final Pattern STREICHUNG_MEHRFACH =
+      Pattern.compile(
+          "^(?:In )?(.+?) (?:wird|werden) (?:jeweils )?("
+              + WOERTER
+              + " «\\d+»(?:(?:, | und | sowie )"
+              + WOERTER
+              + " «\\d+»)+) gestrichen\\.$");
+
   // „§ 9 wird gestrichen.“, „Absatz 3 wird gestrichen.“, „Die §§ 34 bis 39 werden gestrichen.“,
   // „Der bisherige Teil 3 wird gestrichen.“ — Streichung ganzer Struktureinheiten (semantisch eine
   // Aufhebung). Greift erst, wenn die Wörter-Streichung STREICHUNG (die ein Zitat verlangt) und die
@@ -284,30 +318,36 @@
   private static final Pattern UMNUMMERIERUNG =
       Pattern.compile(
           "^(?:Der bisherige |Die bisherige |Das bisherige )?(.+?) wird (?:zu )?"
-              + "(§|Absatz|Satz|Nummer|Buchstabe|Teil|Abschnitt|Unterabschnitt|Buch|Kapitel|Anlage) "
+              + "(§|Art\\.|Absatz|Abs\\.|Satz|Nummer|Nr\\.|Buchstabe|Buchst\\."
+              + "|Teil|Abschnitt|Unterabschnitt|Buch|Kapitel|Anlage) "
               + "(\\d+[a-z]?)\\.$");
 
   // „Die bisherigen Absätze 2 bis 4 werden zu den Absätzen 3 bis 5.“ bzw. „Die bisherigen Nummern 4
   // bis 6 werden die Nummern 8 bis 10.“ — Bereichs-Umnummerierung, in Einzelbefehle aufgelöst.
   private static final Pattern UMNUMMERIERUNG_BEREICH =
       Pattern.compile(
-          "^Die (?:bisherigen )?(?:Absätze|Sätze|Nummern|Buchstaben) (\\d+) bis (\\d+) "
-              + "werden (?:zu den |die )?(Absätzen|Sätzen|Nummern|Buchstaben|Absätze|Sätze) "
+          "^Die (?:bisherigen )?(?:Absätze|Abs\\.|Sätze|Nummern|Nrn?\\.|Buchstaben|Buchst\\.) "
+              + "(\\d+) bis (\\d+) "
+              + "werden (?:zu den |die )?(Absätzen|Sätzen|Nummern|Buchstaben|Absätze|Sätze"
+              + "|Abs\\.|Nrn?\\.|Buchst\\.) "
               + "(\\d+) bis (\\d+)\\.$");
 
   // „Die §§ 46 und 47 werden zu den §§ 34 und 35.“ — paarweise §-Umnummerierung (auch Bereiche).
   private static final Pattern UMNUMMERIERUNG_PARAGRAPHEN =
-      Pattern.compile("^Die §§ (.+?) werden (?:zu den §§ |zu §§ |die §§ )(.+?)\\.$");
+      Pattern.compile("^Die (§§|Artt?\\.) (.+?) werden (?:zu den \\1 |zu \\1 |die \\1 )(.+?)\\.$");
 
   // „Die §§ 52 bis 56 werden wie folgt gefasst: „§ 52 (weggefallen) …““ — Neufassung eines §-Bereichs;
   // der Zitatblock wird an „§ N“-Grenzen in Einzel-Neufassungen zerlegt.
   private static final Pattern PARAGRAPH_BEREICH_NEUFASSUNG =
       Pattern.compile(
-          "^Die §§ (\\d+[a-z]?) bis (\\d+[a-z]?) (?:wird|werden) wie folgt gefasst: " + Z + "\\.?$");
+          "^Die (?:§§|Artt?\\.) (\\d+[a-z]?) bis (\\d+[a-z]?) (?:wird|werden) wie folgt gefasst: "
+              + Z
+              + "\\.?$");
 
-  // „Der Wortlaut wird Absatz 1.“
+  // „Der Wortlaut wird Absatz 1.“, bayerisch auch „Der bisherige Wortlaut wird Abs. 5.“ und
+  // „Der Wortlaut wird Satz 1.“
   private static final Pattern WORTLAUT_ZU_ABSATZ =
-      Pattern.compile("^Der Wortlaut wird Absatz (\\d+[a-z]?)\\.$");
+      Pattern.compile("^Der (?:bisherige )?Wortlaut wird (Absatz|Abs\\.|Satz) (\\d+[a-z]?)\\.$");
 
   // „In Nummer 7 wird das Wort «1» am Ende durch ein Komma ersetzt.“
   private static final Pattern WORT_ZU_SATZZEICHEN =
@@ -361,15 +401,16 @@
 
   private static final Pattern EBENE_BEZEICHNUNG =
       Pattern.compile(
-          "^(?:§ (\\d+[a-z]?)|Absatz (\\d+[a-z]?)|Satz(?: (\\d+[a-z]?))?|Sätze"
-              + "|Nummer (\\d+[a-z]?)|Buchstabe ([a-z]{1,3})"
-              + "|(Absätze .+|Nummern .+|Buchstaben .+))$");
+          "^(?:(?:§|Art\\.) (\\d+[a-z]?)|(?:Absatz|Abs\\.) (\\d+[a-z]?)|Satz(?: (\\d+[a-z]?))?|Sätze"
+              + "|(?:Nummer|Nr\\.) (\\d+[a-z]?)|(?:Buchstabe|Buchst\\.) ([a-z]{1,3})"
+              + "|(Absätze .+|Abs\\. .+|Sätze .+|Nummern .+|Nrn?\\. .+|Buchstaben .+"
+              + "|Buchst\\. .+))$");
 
   // „In <Stelle> werden die Wörter «1» durch die Wörter «2» und die Angabe «3» durch die Wörter «4»
   // ersetzt.“ — mehrere Ersetzungspaare unter einem gemeinsamen „ersetzt“. Die Mitte (Gruppe 2)
   // wird an „ und “ in Einzelpaare zerlegt und je gegen EIN_ERSETZUNGS_PAAR validiert.
   private static final Pattern PAAR_ERSETZUNG =
-      Pattern.compile("^(?:In )?(.+?) (?:wird|werden) (.+(?: und |, ).+) ersetzt\\.$");
+      Pattern.compile("^(?:In )?(.+?) (?:wird|werden) (.+(?: und | sowie |, ).+) ersetzt\\.$");
   private static final Pattern EIN_ERSETZUNGS_PAAR =
       Pattern.compile(
           "^(?:jeweils )?"
@@ -381,15 +422,17 @@
               + " )?"
               + Z
               + "$");
-  // Paare trennen sich an „ und “ sowie an Kommata vor dem nächsten Wörter-Objekt.
+  // Paare trennen sich an „ und “/„ sowie “ sowie an Kommata vor dem nächsten Wörter-Objekt.
   private static final Pattern PAAR_SEP =
-      Pattern.compile(" und |,\\s+(?=(?:die Wörter|das Wort|die Angabe|die Zahl) )");
+      Pattern.compile(" und | sowie |,\\s+(?=(?:die Wörter|das Wort|die Angabe|die Zahl) )");
 
   // „Die bisherigen Absätze 6 und 7 werden die Absätze 1 und 2.“ — koordinierte Umnummerierung.
   private static final Pattern UMNUMMERIERUNG_KOORDINIERT =
       Pattern.compile(
-          "^Die (?:bisherigen )?(Absätze|Sätze|Nummern|Buchstaben) (\\d+[a-z]?) und (\\d+[a-z]?) "
-              + "werden (?:zu den |die )?(?:Absätze[n]?|Sätze[n]?|Nummern|Buchstaben) "
+          "^Die (?:bisherigen )?(Absätze|Abs\\.|Sätze|Nummern|Nrn?\\.|Buchstaben|Buchst\\.)"
+              + " (\\d+[a-z]?) und (\\d+[a-z]?) "
+              + "werden (?:zu den |die )?(?:Absätze[n]?|Abs\\.|Sätze[n]?|Nummern|Nrn?\\."
+              + "|Buchstaben|Buchst\\.) "
               + "(\\d+[a-z]?) und (\\d+[a-z]?)\\.$");
 
   // „In Absatz 3 Satz 1 wird vor dem Punkt am Ende ein Komma und werden die Wörter „…“
@@ -408,7 +451,8 @@
   private static final Pattern EINFUEGUNGS_PAARE =
       Pattern.compile(
           "^(?:In )?(.+?) (?:wird|werden) (?:jeweils )?((?:nach|vor) .+) eingefügt\\.$");
-  private static final Pattern EINFUEGUNGS_PAAR_SEP = Pattern.compile(" und (?=nach |vor )");
+  private static final Pattern EINFUEGUNGS_PAAR_SEP =
+      Pattern.compile("(?: und |,\\s+)(?=nach |vor )");
   private static final Pattern EIN_EINFUEGUNGS_PAAR =
       Pattern.compile(
           "^(nach|vor) (?:dem Wort|den Wörtern|der Angabe|der Zahl) "
@@ -422,7 +466,12 @@
   // „… ein Komma eingefügt und werden …“: Trennstellen eines Verbundbefehls sind „ und “ (ggf. mit
   // Komma) bzw. „, “ direkt vor „wird/werden“. Innerhalb von Zitaten steht „ und “ als «n» maskiert.
   private static final Pattern VERBUND_SEP =
-      Pattern.compile(",? und |, (?=wird\\b|werden\\b)");
+      Pattern.compile(
+          ",? und |, (?=wird\\b|werden\\b)"
+              // Komma-Kette gleichrangiger Klauseln („… ersetzt, die Angabe «n» wird gestrichen
+              // und …“) — nur vor einer Wortgruppen-Klausel mit maskiertem Zitat, damit echte
+              // Relativsätze nicht getrennt werden.
+              + "|, (?=(?:die Wörter|das Wort|die Angabe|die Zahl) «)");
   private static final Pattern WIRD_WERDEN = Pattern.compile(" (?:wird|werden) ");
 
   // „In <Stelle> wird nach den Wörtern «1» ein Komma eingefügt.“ (Satzzeichen statt Wörter einfügen)
@@ -461,7 +510,8 @@
   private static final Pattern UMNUMMERIERUNGS_RAHMEN =
       Pattern.compile(
           "^(?:Der bisherige |Die bisherige |Das bisherige )?(.+?) wird (?:zu )?"
-              + "(§|Absatz|Satz|Nummer|Buchstabe|Teil|Abschnitt|Unterabschnitt|Buch|Kapitel|Anlage)"
+              + "(§|Art\\.|Absatz|Abs\\.|Satz|Nummer|Nr\\.|Buchstabe|Buchst\\."
+              + "|Teil|Abschnitt|Unterabschnitt|Buch|Kapitel|Anlage)"
               + " (\\d+[a-z]?) und wird wie folgt geändert:$");
 
   /** Ein Kontextrahmen samt optionalem Begleitbefehl (Umnummerierung des Rahmens selbst). */
@@ -599,7 +649,21 @@
     }
 
     if ((m = WORTLAUT_ZU_ABSATZ.matcher(text)).matches()) {
-      return Optional.of(new WortlautZuAbsatz(kontext, m.group(1), provenienz));
+      if (m.group(1).equals("Satz")) {
+        return Optional.of(new WortlautZuSatz(kontext, m.group(2), provenienz));
+      }
+      return Optional.of(new WortlautZuAbsatz(kontext, m.group(2), provenienz));
+    }
+
+    if ((m = FUSSNOTE_AUFHEBUNG.matcher(text)).matches()) {
+      var nummern = List.of(FUSSNOTEN_TRENNER.split(m.group(1)));
+      return Optional.of(new FussnotenAufhebung(kontext, nummern, provenienz));
+    }
+
+    if ((m = SATZNUMMERIERUNG_STREICHUNG.matcher(text)).matches()) {
+      var nummer = wortZitat(zitate, m.group(2));
+      return ausStellen(
+          m.group(1), s -> new SatznummerierungStreichung(kontext.plus(s), nummer, provenienz));
     }
 
     if ((m = UEBERSCHRIFT_ERSETZUNG.matcher(text)).matches()) {
@@ -658,7 +722,7 @@
       if (stellen.size() == 1
           && (ziel.equals("Überschrift")
               || ziel.equals("Inhaltsübersicht")
-              || ziel.matches("§\\s*\\d+[a-z]?"))) {
+              || ziel.matches("(?:§|Art\\.)\\s*\\d+[a-z]?"))) {
         return Optional.of(new Neufassung(kontext.plus(stellen.get(0)), neuerText, provenienz));
       }
       var ebene = strukturEbene(ziel);
@@ -845,7 +909,7 @@
         // „Nach § 60a werden die folgenden §§ 60b und 60c eingefügt: „…““ — Block mehrerer
         // Paragraphen (Aufteilung an den §-Überschriften erfolgt beim Anwenden). Signal:
         // Ebene PARAGRAPH mit bezeichnung == null.
-        if (m.group(3).strip().matches("§§\\s*\\d.*")) {
+        if (m.group(3).strip().matches("(?:§§|Artt?\\.)\\s*\\d.*")) {
           return Optional.of(
               new StrukturEinfuegung(
                   kontext.plus(stelle.get()),
@@ -872,6 +936,12 @@
       // Bei der stellenlosen Form ist die neue Einheit zugleich der Anker (sie tritt vor die
       // gleichnamige bestehende Einheit).
       boolean mitStelle = m.pattern() == VORANSTELLUNG_MIT_STELLE;
+      // „Dem Wortlaut werden die folgenden Abs. 1 bis 4 vorangestellt: „…““ (bayerisch): die
+      // neuen Absätze treten vor den gesamten bisherigen Normtext.
+      if (mitStelle && m.group(1).equals("Wortlaut")) {
+        return Optional.of(
+            new WortlautVoranstellung(kontext, zitat(zitate, m.group(4)), provenienz));
+      }
       var ankerPhrase = m.group(1);
       var ebeneBez = ebeneUndBezeichnung(mitStelle ? m.group(2) : m.group(1));
       var stelle = StellenParser.parse(ankerPhrase);
@@ -996,12 +1066,40 @@
       return ausStellen(m.group(1), s -> new Streichung(kontext.plus(s), woerter, provenienz));
     }
 
+    if ((m = STREICHUNG_OHNE_STELLE.matcher(text)).matches()) {
+      var woerter = wortZitat(zitate, m.group(1));
+      return Optional.of(new Streichung(kontext, woerter, provenienz));
+    }
+
+    if ((m = STREICHUNG_MEHRFACH.matcher(text)).matches()) {
+      var stellen = StellenParser.parseMehrfach(m.group(1));
+      if (stellen.isEmpty()) {
+        if (!StellenParser.istNurChapeau(m.group(1))) {
+          return Optional.empty();
+        }
+        stellen = List.of(Stelle.LEER);
+      }
+      var objekte = new ArrayList<String>();
+      var zm = Pattern.compile("«(\\d+)»").matcher(m.group(2));
+      while (zm.find()) {
+        objekte.add(wortZitat(zitate, zm.group(1)));
+      }
+      var teile = new ArrayList<Aenderungsbefehl>();
+      for (var s : stellen) {
+        for (var woerter : objekte) {
+          teile.add(new Streichung(kontext.plus(s), woerter, provenienz));
+        }
+      }
+      return Optional.of(teile.size() == 1 ? teile.get(0) : new Sammelbefehl(teile));
+    }
+
     if ((m = STRUKTUR_STREICHUNG.matcher(text)).matches()) {
       return ausStellen(m.group(1), s -> new Aufhebung(kontext.plus(s), provenienz));
     }
 
     if ((m = UMNUMMERIERUNG_PARAGRAPHEN.matcher(text)).matches()) {
-      return paragraphenUmnummerierung(m.group(1), m.group(2), kontext, provenienz);
+      var sigel = m.group(1).startsWith("Art") ? "Art. " : "§ ";
+      return paragraphenUmnummerierung(sigel, m.group(2), m.group(3), kontext, provenienz);
     }
 
     if ((m = UMNUMMERIERUNG_BEREICH.matcher(text)).matches()) {
@@ -1047,7 +1145,12 @@
     }
     var stellen = StellenParser.parseMehrfach(m.group(1));
     if (stellen.isEmpty()) {
-      return Optional.empty();
+      // „In dem Satzteil nach Nr. 3 werden … ersetzt.“ — reine Chapeau-Angabe ohne eigene
+      // Komponente: die Ersetzung sucht im Text der Kontextstelle.
+      if (!StellenParser.istNurChapeau(m.group(1))) {
+        return Optional.empty();
+      }
+      stellen = List.of(Stelle.LEER);
     }
     var segmente = PAAR_SEP.split(m.group(2));
     if (segmente.length < 2) {
@@ -1135,6 +1238,13 @@
    * erkannt werden, entsteht ein {@link Sammelbefehl}. Nur wenn <em>alle</em> Klauseln erkannt
    * werden, greift die Zerlegung — sonst bleibt der Befehl unbekannt (konservativ).
    */
+  // Reine Wortoperationen tragen nie einen eigenen strukturellen Lokativ, sondern wirken innerhalb
+  // des zuvor gesetzten Skopus (Gapping): „… und die Angabe „X“ wird gestrichen/eingefügt“.
+  private static final Pattern REINE_WORT_OPERATION =
+      Pattern.compile(
+          "(?i)(?:die Angabe|nach der Angabe|vor der Angabe|die Wörter|die Worte|"
+              + "nach den Wörtern|vor den Wörtern|das Wort)\\b");
+
   private static Optional<Aenderungsbefehl> erkenneVerbund(
       String text, Stelle kontext, ZitatExtraktor.Ergebnis zitate, Provenienz provenienz) {
     var sep = VERBUND_SEP.matcher(text);
@@ -1146,6 +1256,15 @@
       }
       var linksBefehl = erkenneAlsSatz(links, kontext, zitate, provenienz);
       if (linksBefehl.isEmpty()) {
+        // Gemeinsames Schlussverb (Gapping): „die Angabe «A» wird durch die Angabe «B» und die
+        // Angabe «C» wird durch die Angabe «D» ersetzt.“ — das „ersetzt“ der rechten Klausel
+        // gilt auch links.
+        var schluss = gemeinsamerVerbSchluss(rechts);
+        if (schluss != null) {
+          linksBefehl = erkenneAlsSatz(links + " " + schluss, kontext, zitate, provenienz);
+        }
+      }
+      if (linksBefehl.isEmpty()) {
         continue;
       }
       var rechtsBefehl =
@@ -1182,12 +1301,50 @@
     if (linksBefehl instanceof Umnummerierung um
         && um.neu().paragraph().isPresent()
         && rechts.startsWith("in ")
-        && !rechts.matches(".*§\\s*\\d.*")) {
+        && !rechts.matches(".*(?:§|Art\\.)\\s*\\d.*")) {
       var imNeuen = erkenneAlsSatz(gross, um.neu(), zitate, provenienz);
       if (imNeuen.isPresent()) {
         return imNeuen;
       }
     }
+    // „Der bisherige Wortlaut wird Abs. 5 und in Halbsatz 1 wird … ersetzt“ (bayerisch): die
+    // lokative Folgeklausel bezieht sich auf den soeben nummerierten Absatz.
+    if (linksBefehl instanceof WortlautZuAbsatz wz
+        && rechts.startsWith("in ")
+        && !rechts.matches(".*(?:§|Art\\.)\\s*\\d.*")) {
+      var neuKontext =
+          wz.stelle().plus(new Stelle(List.of(new Stelle.AbsatzNr(wz.nummer()))));
+      var imNeuen = erkenneAlsSatz(gross, neuKontext, zitate, provenienz);
+      if (imNeuen.isPresent()) {
+        return imNeuen;
+      }
+    }
+    // Gapping mit gemeinsamem Lokativ: „In Abs. 2 Satz 1 wird A ersetzt und die Angabe „B“ wird
+    // gestrichen“ — die rechte Klausel ist eine reine Wortoperation ohne eigenen Lokativ und erbt
+    // daher den Skopus der linken (sonst löste sie fälschlich auf Artikelebene auf). Nur wenn die
+    // linke Klausel überhaupt einen Lokativ trägt und der so entstandene Befehl eine engere Stelle
+    // als der bloße Kontext trifft.
+    // Nach einer Umnummerierung wird die Wortoperation nicht auf die neue Stelle festgenagelt: sie
+    // löst norm-weit auf (findet ihren Zieltext im umbenannten Absatz, ohne eine womöglich schon
+    // bestehende Zielnummer fälschlich zu treffen) — das übernehmen die Zweige weiter unten.
+    if (REINE_WORT_OPERATION.matcher(rechts).lookingAt()
+        && !(linksBefehl instanceof Umnummerierung)) {
+      var praefix0 = lokativerPraefix(links);
+      var vm = WIRD_WERDEN.matcher(rechts);
+      if (praefix0 != null && !praefix0.isBlank() && vm.find()) {
+        // „die Angabe „X“ wird gestrichen“ → „In <loc> wird die Angabe „X“ gestrichen“: den Lokativ
+        // der linken Klausel voranstellen und das Verb nach vorn ziehen (grammatische Normalform).
+        var subjekt = rechts.substring(0, vm.start()).strip();
+        var praedikat = rechts.substring(vm.end()).strip();
+        var umgestellt =
+            praefix0.strip() + " " + vm.group().strip() + " " + subjekt + " " + praedikat;
+        var geerbt = erkenneAlsSatz(umgestellt, kontext, zitate, provenienz);
+        if (geerbt.isPresent()
+            && geerbt.get().stelle().komponenten().size() > kontext.komponenten().size()) {
+          return geerbt;
+        }
+      }
+    }
     var direkt = erkenneAlsSatz(rechts, kontext, zitate, provenienz);
     if (direkt.isPresent()) {
       return direkt;
@@ -1257,6 +1414,15 @@
     return erkenne(satz, kontext, zitate, provenienz);
   }
 
+  private static final Pattern VERB_SCHLUSS =
+      Pattern.compile(".*\\b(ersetzt|gestrichen|eingefügt|angefügt|aufgehoben)\\.$");
+
+  /** Das gemeinsame Schlussverb einer Klauselkette („… ersetzt.“), falls vorhanden. */
+  private static @Nullable String gemeinsamerVerbSchluss(String rechts) {
+    var m = VERB_SCHLUSS.matcher(rechts);
+    return m.matches() ? m.group(1) + "." : null;
+  }
+
   /** Der Teil einer Klausel vor dem ersten „wird“/„werden“ („In § 3 Absatz 1“). */
   private static @Nullable String lokativerPraefix(String klausel) {
     var m = WIRD_WERDEN.matcher(klausel);
@@ -1276,9 +1442,9 @@
    * §-Umnummerierungen auf. Beide Seiten werden zu Paragraphenlisten expandiert und zusammengeführt.
    */
   private static Optional<Aenderungsbefehl> paragraphenUmnummerierung(
-      String altPhrase, String neuPhrase, Stelle kontext, Provenienz provenienz) {
-    var alt = StellenParser.parseMehrfach("§ " + altPhrase);
-    var neu = StellenParser.parseMehrfach("§ " + neuPhrase);
+      String sigel, String altPhrase, String neuPhrase, Stelle kontext, Provenienz provenienz) {
+    var alt = StellenParser.parseMehrfach(sigel + altPhrase);
+    var neu = StellenParser.parseMehrfach(sigel + neuPhrase);
     if (alt.isEmpty() || alt.size() != neu.size()) {
       return Optional.empty();
     }
@@ -1429,11 +1595,11 @@
   private static @Nullable Ebene strukturEbene(String ziel) {
     var erstesWort = ziel.split("\\s+", 2)[0];
     return switch (erstesWort) {
-      case "§", "§§" -> Ebene.PARAGRAPH;
-      case "Absatz", "Absätze" -> Ebene.ABSATZ;
+      case "§", "§§", "Art.", "Artt." -> Ebene.PARAGRAPH;
+      case "Absatz", "Absätze", "Abs." -> Ebene.ABSATZ;
       case "Satz", "Sätze" -> Ebene.SATZ;
-      case "Nummer", "Nummern" -> Ebene.NUMMER;
-      case "Buchstabe", "Buchstaben" -> Ebene.BUCHSTABE;
+      case "Nummer", "Nummern", "Nr.", "Nrn." -> Ebene.NUMMER;
+      case "Buchstabe", "Buchstaben", "Buchst." -> Ebene.BUCHSTABE;
       default -> null;
     };
   }
@@ -1441,10 +1607,11 @@
   private static Stelle.Komponente komponenteFuer(String ebene, String nummer) {
     return switch (ebene) {
       case "§" -> new Stelle.Paragraph(nummer);
-      case "Absatz" -> new Stelle.AbsatzNr(nummer);
+      case "Art." -> new Stelle.Paragraph(nummer, "Art.");
+      case "Absatz", "Abs." -> new Stelle.AbsatzNr(nummer);
       case "Satz" -> new Stelle.SatzNr(nummer);
-      case "Nummer" -> new Stelle.NummerNr(nummer);
-      case "Buchstabe" -> new Stelle.BuchstabeNr(nummer);
+      case "Nummer", "Nr." -> new Stelle.NummerNr(nummer);
+      case "Buchstabe", "Buchst." -> new Stelle.BuchstabeNr(nummer);
       case "Teil", "Abschnitt", "Unterabschnitt", "Buch", "Kapitel", "Anlage" ->
           new Stelle.Gliederungseinheit(ebene, nummer);
       default -> throw new IllegalArgumentException("Unbekannte Ebene: " + ebene);
@@ -1454,10 +1621,10 @@
   /** Normalisiert die Ebenenwörter (auch Dativ-/Pluralformen) auf den Basisnamen. */
   private static @Nullable String ebeneAusWort(String wort) {
     return switch (wort) {
-      case "Absatz", "Absätze", "Absätzen" -> "Absatz";
+      case "Absatz", "Absätze", "Absätzen", "Abs." -> "Absatz";
       case "Satz", "Sätze", "Sätzen" -> "Satz";
-      case "Nummer", "Nummern" -> "Nummer";
-      case "Buchstabe", "Buchstaben" -> "Buchstabe";
+      case "Nummer", "Nummern", "Nr.", "Nrn." -> "Nummer";
+      case "Buchstabe", "Buchstaben", "Buchst." -> "Buchstabe";
       default -> null;
     };
   }
@@ -1469,17 +1636,18 @@
   private static Optional<Aenderungsbefehl> paragraphBereichNeufassung(
       String block, Stelle kontext, Provenienz provenienz) {
     var teile = new ArrayList<Aenderungsbefehl>();
-    var stuecke = block.strip().split("(?=§\\s*\\d)");
+    var stuecke = block.strip().split("(?=(?:§|Art\\.)\\s*\\d)");
     for (var stueck : stuecke) {
       var s = stueck.strip();
       if (s.isEmpty()) {
         continue;
       }
-      var pm = Pattern.compile("^§\\s*(\\d+[a-z]?)\\b").matcher(s);
+      var pm = Pattern.compile("^(§|Art\\.)\\s*(\\d+[a-z]?)\\b").matcher(s);
       if (!pm.find()) {
         return Optional.empty();
       }
-      var stelle = kontext.plus(new Stelle(List.of(new Stelle.Paragraph(pm.group(1)))));
+      var stelle =
+          kontext.plus(new Stelle(List.of(new Stelle.Paragraph(pm.group(2), pm.group(1)))));
       teile.add(new Neufassung(stelle, s, provenienz));
     }
     if (teile.isEmpty()) {
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/FontgroessenFilter.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/FontgroessenFilter.java
index 964d856..26589b3 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/FontgroessenFilter.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/FontgroessenFilter.java
@@ -84,6 +84,11 @@
   private FontgroessenFilter() {}
 
   static String extrahiere(PDDocument dokument) throws IOException {
+    return extrahiere(dokument, SuperskriptModus.ENTFERNEN);
+  }
+
+  static String extrahiere(PDDocument dokument, SuperskriptModus superskriptModus)
+      throws IOException {
     var zaehler = new GroessenZaehler();
     zaehler.setLineSeparator("\n");
     var wegwerf = new StringWriter();
@@ -96,7 +101,9 @@
     }
     log.debugf("Brotschriftgrößen (je Seite): %s", schwellen);
 
-    var filter = new GroessenFilterStripper(schwellen, zaehler.brotschriftUntergrenzen(schwellen));
+    var filter =
+        new GroessenFilterStripper(
+            schwellen, zaehler.brotschriftUntergrenzen(schwellen), superskriptModus);
     filter.setLineSeparator("\n");
     var ausgabe = new StringWriter();
     filter.writeText(dokument, ausgabe);
@@ -303,21 +310,42 @@
     /** Läufe, die um mehr als diese Punktzahl unter der Brotschrift liegen, sind immer Beiwerk. */
     private static final float STARK_KLEINER_PT = 3f;
 
+    /** Mindest-Hebung (pt) der Grundlinie, ab der eine kleinere Ziffer als Superskript gilt. */
+    private static final float SUPERSKRIPT_HEBUNG_MIN_PT = 2f;
+
+    /** Maximal-Hebung (pt): darüber liegt ein Zeilenwechsel vor, kein Superskript. */
+    private static final float SUPERSKRIPT_HEBUNG_MAX_PT = 6f;
+
     private final Map<Integer, Float> schwellen;
     private final Map<Integer, Float> untergrenzen;
+    private final SuperskriptModus superskriptModus;
 
     /** End-X (pt) des breitesten behaltenen Laufs der laufenden Zeile; NaN vor dem ersten. */
     private float zeilenEndX = Float.NaN;
 
-    GroessenFilterStripper(Map<Integer, Float> schwellen, Map<Integer, Float> untergrenzen) {
+    GroessenFilterStripper(
+        Map<Integer, Float> schwellen,
+        Map<Integer, Float> untergrenzen,
+        SuperskriptModus superskriptModus) {
       this.schwellen = schwellen;
       this.untergrenzen = untergrenzen;
+      this.superskriptModus = superskriptModus;
     }
 
     @Override
     protected void writeString(String text, List<TextPosition> positionen) throws IOException {
       if (!behalte(positionen)) {
-        return; // Fußnotenblock bzw. hochgestellte Ziffer
+        // Fußnotenblock bzw. hochgestellte Ziffer. In BEHALTEN-Modus werden reine Ziffernläufe
+        // im Satzspiegel (oberhalb des Fußnotenblocks) als Superskripte übernommen.
+        var hochgestellt = superskriptModus == SuperskriptModus.BEHALTEN ? nurZiffern(positionen) : null;
+        if (hochgestellt == null) {
+          return;
+        }
+        text = hochgestellt;
+      } else if (superskriptModus == SuperskriptModus.BEHALTEN) {
+        // Gehobene, kleiner gesetzte Ziffern innerhalb eines Brotschrift-Laufs (bayerische
+        // Satznummern und Fußnotenmarker kleben im selben Lauf wie der Fließtext).
+        text = mitSuperskripten(text, positionen);
       }
       for (var position : positionen) {
         float endX = position.getXDirAdj() + position.getWidthDirAdj();
@@ -326,6 +354,76 @@
       super.writeString(text, positionen);
     }
 
+    /**
+     * Der Lauf als Superskript-Text, falls er ausschließlich aus Ziffern im Satzspiegel besteht
+     * (hochgestellte Marker, die als eigener Lauf ankommen); sonst {@code null}.
+     */
+    private @org.jspecify.annotations.Nullable String nurZiffern(List<TextPosition> positionen) {
+      if (positionen.isEmpty()) {
+        return null;
+      }
+      var grenze = untergrenzen.get(getCurrentPageNo());
+      var sb = new StringBuilder();
+      for (var position : positionen) {
+        if (grenze != null && position.getYDirAdj() > grenze) {
+          return null; // Fußnotenblock
+        }
+        var unicode = position.getUnicode();
+        for (int i = 0; i < unicode.length(); i++) {
+          if (!Character.isDigit(unicode.charAt(i))) {
+            return null;
+          }
+        }
+        sb.append(eu.mulk.aendggner.gesetz.Superskript.zuSuperskript(unicode));
+      }
+      return sb.toString();
+    }
+
+    /**
+     * Ersetzt innerhalb eines behaltenen Laufs Ziffern, die kleiner gesetzt und gegenüber der
+     * Grundlinie des Laufs deutlich gehoben sind, durch Unicode-Superskripte. Die Grundlinie ist
+     * das größte Y des Laufs (gehobene Zeichen haben kleinere Y-Werte); die Hebung ist nach oben
+     * begrenzt, damit ein etwaiger Zeilenwechsel im Lauf keine Fehltreffer erzeugt.
+     */
+    private String mitSuperskripten(String text, List<TextPosition> positionen) {
+      float grundlinie = Float.NEGATIVE_INFINITY;
+      float brotschriftGroesse = 0;
+      for (var position : positionen) {
+        if (position.getYDirAdj() > grundlinie) {
+          grundlinie = position.getYDirAdj();
+          brotschriftGroesse = position.getFontSizeInPt();
+        }
+      }
+      var sb = new StringBuilder(text.length());
+      boolean geaendert = false;
+      for (var position : positionen) {
+        var unicode = position.getUnicode();
+        float hebung = grundlinie - position.getYDirAdj();
+        if (hebung >= SUPERSKRIPT_HEBUNG_MIN_PT
+            && hebung <= SUPERSKRIPT_HEBUNG_MAX_PT
+            && position.getFontSizeInPt() < brotschriftGroesse
+            && istZiffernfolge(unicode)) {
+          sb.append(eu.mulk.aendggner.gesetz.Superskript.zuSuperskript(unicode));
+          geaendert = true;
+        } else {
+          sb.append(unicode);
+        }
+      }
+      return geaendert ? sb.toString() : text;
+    }
+
+    private static boolean istZiffernfolge(String unicode) {
+      if (unicode.isEmpty()) {
+        return false;
+      }
+      for (int i = 0; i < unicode.length(); i++) {
+        if (!Character.isDigit(unicode.charAt(i))) {
+          return false;
+        }
+      }
+      return true;
+    }
+
     /** Schreibt vor jedem Zeilentrenner das End-X der Zeile als Metadaten für
      * {@link #klassifiziereZeilenenden}. */
     @Override
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/PatchTextExtraktor.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/PatchTextExtraktor.java
index 9112cb6..c9fde36 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/PatchTextExtraktor.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/PatchTextExtraktor.java
@@ -21,6 +21,15 @@
   private static final Logger log = Logger.getLogger(PatchTextExtraktor.class);
 
   private final Tika tika = new Tika();
+  private final SuperskriptModus superskriptModus;
+
+  public PatchTextExtraktor() {
+    this(SuperskriptModus.ENTFERNEN);
+  }
+
+  public PatchTextExtraktor(SuperskriptModus superskriptModus) {
+    this.superskriptModus = superskriptModus;
+  }
 
   public String extrahiere(Path datei) throws IOException {
     var mimeType = tika.detect(datei);
@@ -36,9 +45,9 @@
     };
   }
 
-  private static String extrahierePdf(Path datei) throws IOException {
+  private String extrahierePdf(Path datei) throws IOException {
     try (var dokument = Loader.loadPDF(datei.toFile())) {
-      return FontgroessenFilter.extrahiere(dokument);
+      return FontgroessenFilter.extrahiere(dokument, superskriptModus);
     }
   }
 }
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java
index 78a815b..473eb14 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/StellenParser.java
@@ -46,12 +46,13 @@
 
   private StellenParser() {}
 
-  // „in dem Satzteil vor Nummer 1“, „in der Angabe vor Nummer 1“ — verfeinernde Chapeau-Angaben
-  // ohne eigene Stelle-Komponente; die Ersetzung sucht ohnehin im Text der umgebenden Stelle.
+  // „in dem Satzteil vor Nummer 1“, „in der Angabe vor Nummer 1“, bayerisch auch „Satzteil nach
+  // Nr. 3“ — verfeinernde Chapeau-Angaben ohne eigene Stelle-Komponente; die Ersetzung sucht
+  // ohnehin im Text der umgebenden Stelle.
   private static final Pattern CHAPEAU_QUALIFIER =
       Pattern.compile(
-          "(?i)(?:im |in dem |in der |dem |der )?(?:Satzteil|Angabe) vor "
-              + "(?:Nummer|Buchstabe|Satz|Absatz) \\S+");
+          "(?i)(?:im |in dem |in der |dem |der )?(?:Satzteil|Angabe) (?:vor|nach) "
+              + "(?:Nummer|Nr\\.|Buchstabe|Buchst\\.|Satz|Absatz|Abs\\.) \\S+");
 
   /**
    * Wahr, wenn die Phrase ausschließlich aus einem Chapeau-Qualifier besteht (z.B. „im Satzteil
@@ -82,7 +83,16 @@
           komponenten.add(new Stelle.Paragraph(wert));
           i++;
         }
-        case "Absatz", "Abs.", "Absätze" -> {
+        // Bayerisches Landesrecht: Gesetze gliedern sich in Artikel, zitiert stets als „Art. N“.
+        case "Art.", "Artt." -> {
+          var wert = naechstesWort(woerter, i);
+          if (wert == null || !NUMMER_WERT.matcher(wert).matches()) {
+            return Optional.empty();
+          }
+          komponenten.add(new Stelle.Paragraph(wert, "Art."));
+          i++;
+        }
+        case "Absatz", "Abs.", "Absätze", "Absätzen" -> {
           var wert = naechstesWort(woerter, i);
           if (wert == null || !NUMMER_WERT.matcher(wert).matches()) {
             return Optional.empty();
@@ -90,7 +100,7 @@
           komponenten.add(new Stelle.AbsatzNr(wert));
           i++;
         }
-        case "Satz", "Sätze" -> {
+        case "Satz", "Sätze", "Sätzen" -> {
           var wert = naechstesWort(woerter, i);
           if (wert == null || !NUMMER_WERT.matcher(wert).matches()) {
             return Optional.empty();
@@ -98,7 +108,15 @@
           komponenten.add(new Stelle.SatzNr(wert));
           i++;
         }
-        case "Nummer", "Nr.", "Nummern" -> {
+        case "Halbsatz", "Halbsätze", "Halbs." -> {
+          var wert = naechstesWort(woerter, i);
+          if (wert == null || !NUMMER_WERT.matcher(wert).matches()) {
+            return Optional.empty();
+          }
+          komponenten.add(new Stelle.HalbsatzNr(wert));
+          i++;
+        }
+        case "Nummer", "Nr.", "Nummern", "Nrn." -> {
           var wert = naechstesWort(woerter, i);
           if (wert == null || !NUMMER_WERT.matcher(wert).matches()) {
             return Optional.empty();
@@ -195,6 +213,14 @@
           return List.of();
         }
         voll = geerbt.get();
+      } else if (vorige != null) {
+        // Bloßes Label mit nachgestellten Komponenten („Art. 18 Satz 2, Art. 19 und 20 Satz 1“ →
+        // das „20 Satz 1“): Das Label erbt die gröbste passende Komponentenart der vorigen Stelle.
+        var kombiniert = mitGeerbtemLabelUndRest(vorige, segment);
+        if (kombiniert.isEmpty()) {
+          return List.of();
+        }
+        voll = kombiniert.get();
       } else {
         return List.of();
       }
@@ -217,9 +243,58 @@
     return Optional.of(new Stelle(komponenten));
   }
 
+  private static final Pattern LABEL_MIT_REST =
+      Pattern.compile("(\\d+[a-z]?|[a-z]{1,3})\\s+(\\S.*)");
+
+  /**
+   * „Art. 19 und 20 Satz 1“: Das führende bloße Label des Segments erbt aus {@code vorige} die
+   * letzte Komponentenart, die gröber ist als die erste Komponente des Rests; die feineren
+   * Komponenten der vorigen Stelle entfallen, der geparste Rest wird angehängt.
+   */
+  private static Optional<Stelle> mitGeerbtemLabelUndRest(Stelle vorige, String segment) {
+    var m = LABEL_MIT_REST.matcher(segment.strip());
+    if (!m.matches()) {
+      return Optional.empty();
+    }
+    var rest = parse(m.group(2));
+    if (rest.isEmpty()) {
+      return Optional.empty();
+    }
+    int restRang = rang(rest.get().komponenten().get(0));
+    var vorKomp = vorige.komponenten();
+    for (int i = vorKomp.size() - 1; i >= 0; i--) {
+      if (rang(vorKomp.get(i)) < restRang) {
+        var neu = mitLabel(vorKomp.get(i), m.group(1));
+        if (neu == null) {
+          return Optional.empty();
+        }
+        var komponenten = new ArrayList<Stelle.Komponente>(vorKomp.subList(0, i));
+        komponenten.add(neu);
+        komponenten.addAll(rest.get().komponenten());
+        return Optional.of(new Stelle(komponenten));
+      }
+    }
+    return Optional.empty();
+  }
+
+  /** Hierarchie-Rang einer Komponente (kleiner = gröber). */
+  private static int rang(Stelle.Komponente komponente) {
+    return switch (komponente) {
+      case Stelle.Gliederungseinheit g -> 0;
+      case Stelle.Paragraph p -> 1;
+      case Stelle.AbsatzNr a -> 2;
+      case Stelle.SatzNr s -> 3;
+      case Stelle.HalbsatzNr h -> 4;
+      case Stelle.NummerNr n -> 5;
+      case Stelle.BuchstabeNr b -> 6;
+      default -> 9;
+    };
+  }
+
   private static final Pattern BEREICH =
       Pattern.compile(
-          "(?:(§§?|Absätze|Absatz|Sätze|Satz|Nummern|Nummer|Buchstaben|Buchstabe)\\s+)?"
+          "(?:(§§?|Artt?\\.|Absätze|Absatz|Abs\\.|Sätze|Satz|Nummern|Nummer|Nrn?\\.|Buchstaben"
+              + "|Buchstabe|Buchst\\.)\\s+)?"
               + "(\\d+|[a-z])\\s+bis\\s+(\\d+|[a-z])");
 
   /**
@@ -292,19 +367,21 @@
   private static Stelle.@Nullable Komponente komponenteFuerArt(String art, String label) {
     return switch (art) {
       case "§", "§§" -> new Stelle.Paragraph(label);
-      case "Absatz", "Absätze" -> new Stelle.AbsatzNr(label);
+      case "Art.", "Artt." -> new Stelle.Paragraph(label, "Art.");
+      case "Absatz", "Absätze", "Abs." -> new Stelle.AbsatzNr(label);
       case "Satz", "Sätze" -> new Stelle.SatzNr(label);
-      case "Nummer", "Nummern" -> new Stelle.NummerNr(label);
-      case "Buchstabe", "Buchstaben" -> new Stelle.BuchstabeNr(label);
+      case "Nummer", "Nummern", "Nr.", "Nrn." -> new Stelle.NummerNr(label);
+      case "Buchstabe", "Buchstaben", "Buchst." -> new Stelle.BuchstabeNr(label);
       default -> null;
     };
   }
 
   private static Stelle.@Nullable Komponente mitLabel(Stelle.Komponente muster, String label) {
     return switch (muster) {
-      case Stelle.Paragraph p -> new Stelle.Paragraph(label);
+      case Stelle.Paragraph p -> new Stelle.Paragraph(label, p.sigel());
       case Stelle.AbsatzNr a -> new Stelle.AbsatzNr(label);
       case Stelle.SatzNr s -> new Stelle.SatzNr(label);
+      case Stelle.HalbsatzNr h -> new Stelle.HalbsatzNr(label);
       case Stelle.NummerNr n -> new Stelle.NummerNr(label);
       case Stelle.BuchstabeNr b -> new Stelle.BuchstabeNr(label);
       case Stelle.Gliederungseinheit g -> new Stelle.Gliederungseinheit(g.art(), label);
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/SuperskriptModus.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/SuperskriptModus.java
new file mode 100644
index 0000000..36f6338
--- /dev/null
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/SuperskriptModus.java
@@ -0,0 +1,15 @@
+package eu.mulk.aendggner.aenderung.parse;
+
+/**
+ * Behandlung hochgestellter Ziffern bei der PDF-Extraktion.
+ *
+ * <p>Bundesrecht ({@link #ENTFERNEN}): hochgestellte Fußnotenziffern sind Beiwerk und werden — wo
+ * sie als eigene Läufe erkennbar sind — verworfen. Bayerisches Landesrecht ({@link #BEHALTEN}):
+ * hochgestellte Ziffern sind amtliche Satznummern bzw. Fußnotenmarker und werden als
+ * Unicode-Superskripte (¹²³) in den Text übernommen, damit Stammgesetz und zitierter Änderungstext
+ * dieselbe kanonische Schreibweise tragen.
+ */
+public enum SuperskriptModus {
+  ENTFERNEN,
+  BEHALTEN
+}
diff --git a/src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java b/src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java
index 8a7b6ae..4016256 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/TextBereiniger.java
@@ -98,6 +98,25 @@
       Pattern.compile(
           "^\\s*Deutscher Bundestag [–-] \\d+\\. Wahlperiode [–-] \\d+ [–-] Drucksache.*$");
 
+  // Bayerisches Gesetz- und Verordnungsblatt: Kolumnentitel mit Seitenzahl links oder rechts
+  // („… Nr. 6/2026 77“) bzw. auf geraden Seiten ohne Zwischenraum an die Jahreszahl geklebt
+  // („… Nr. 6/202676“).
+  private static final Pattern GVBL_KOPF =
+      Pattern.compile(
+          "^\\s*(?:\\d{1,4}\\s+)?Bayerisches Gesetz- und Verordnungsblatt Nr\\. \\d+/\\d{4}"
+              + "(?:\\s*\\d{1,4})?\\s*$");
+  // Bayerischer Landtag: laufender Seitenkopf („Drucksache 19/9707 Bayerischer Landtag
+  // 19. Wahlperiode Seite 2“) und Titelköpfe („19. Wahlperiode 28.01.2026  Drucksache 19/9707“,
+  // „Bayerischer Landtag“ + „19. Wahlperiode Drucksache 19/9707“).
+  private static final Pattern LANDTAG_SEITENKOPF =
+      Pattern.compile(
+          "^\\s*Drucksache \\d+/\\d+\\s+Bayerischer Landtag\\s+\\d+\\. Wahlperiode"
+              + "\\s+Seite \\d+\\s*$");
+  private static final Pattern LANDTAG_TITELKOPF =
+      Pattern.compile(
+          "^\\s*\\d+\\. Wahlperiode\\s+(?:\\d{2}\\.\\d{2}\\.\\d{4}\\s+)?Drucksache \\d+/\\d+\\s*$");
+  private static final Pattern LANDTAG_MARKE = Pattern.compile("^\\s*Bayerischer Landtag\\s*$");
+
   /** Konjunktionen, die typischerweise auf einen Suspensivstrich folgen („Wirk- und …“). */
   private static final Pattern KONJUNKTION =
       Pattern.compile("^(und|oder|sowie|bzw\\.|beziehungsweise)\\b.*");
@@ -116,6 +135,7 @@
       Pattern.compile(
           "^(?:(?:Artikel|Teil|Abschnitt|Unterabschnitt|Kapitel|Titel|Buch)\\s+\\d+[a-z]?"
               + "|§\\s*\\d+[a-z]?"
+              + "|Art\\.\\s*\\d+[a-z]?"
               + "|(?:Anlage|Anhang)(?:\\s+\\d+[a-z]?)?)$");
 
   /** Perzentil der Zeilenlängen, das als „volle Spaltenbreite“ gilt (siehe {@link #verbindeUmbrueche}). */
@@ -145,7 +165,10 @@
   private TextBereiniger() {}
 
   public static String bereinige(String rohText) {
-    var text = normalisiereAnfuehrungszeichen(rohText);
+    // Geschützte Leerzeichen (GVBl-Satz: „§  1“, „Abs.  2“) sind für Javas \s und
+    // String.strip unsichtbar — früh auf gewöhnliche Leerzeichen normalisieren.
+    var text = rohText.replace(' ', ' ').replace(' ', ' ');
+    text = normalisiereAnfuehrungszeichen(text);
     text = INVERTIERTES_ZITAT.matcher(text).replaceAll("$1„($2) ");
     text = INVERTIERTES_PARAGRAPH_ZITAT.matcher(text).replaceAll("$1„$2");
     text = INVERTIERTES_LISTEN_ZITAT.matcher(text).replaceAll("$1„$2 ");
@@ -258,7 +281,11 @@
         || SEITENMARKER.matcher(zeile).matches()
         || DRUCKSACHE_KOPF.matcher(zeile).matches()
         || BUNDESTAG_KOPF.matcher(zeile).matches()
-        || BUNDESRAT_KOPF.matcher(zeile).matches();
+        || BUNDESRAT_KOPF.matcher(zeile).matches()
+        || GVBL_KOPF.matcher(zeile).matches()
+        || LANDTAG_SEITENKOPF.matcher(zeile).matches()
+        || LANDTAG_TITELKOPF.matcher(zeile).matches()
+        || LANDTAG_MARKE.matcher(zeile).matches();
   }
 
   /**
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 c24a1dc..e116056 100644
--- a/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
+++ b/src/main/java/eu/mulk/aendggner/aenderung/parse/ZitatExtraktor.java
@@ -62,6 +62,12 @@
     for (int i = 0; i < text.length(); i++) {
       char c = text.charAt(i);
       if (c == OEFFNEND) {
+        if (tiefe > 0 && istFortfuehrungszeichen(text, i)) {
+          // GVBl-Zitierweise: Jedes neugefasste Aufzählungsglied öffnet am Zeilenanfang erneut
+          // mit „, geschlossen wird nur einmal am Blockende. Das Fortführungszeichen ist
+          // Typografie, kein geschachteltes Zitat — es würde die Tiefenzählung entgleisen lassen.
+          continue;
+        }
         if (tiefe == 0) {
           aktuellesZitat.setLength(0);
         } else {
@@ -104,6 +110,27 @@
     return new Ergebnis(ausgabe.toString(), zitate, warnungen);
   }
 
+  // Aufzählungsmarker unmittelbar nach dem öffnenden Zeichen („2.“, „b)“, „aa)“).
+  private static final Pattern FORTFUEHRUNGS_MARKER =
+      Pattern.compile("^(?:\\d+[a-z]?\\.|[a-z]{1,3}\\))[ \\t]");
+
+  /**
+   * Wahr, wenn das öffnende Anführungszeichen an Position {@code i} ein Fortführungszeichen ist:
+   * Es steht am Zeilenanfang innerhalb eines offenen Zitats und ihm folgt unmittelbar ein
+   * Aufzählungsmarker.
+   */
+  private static boolean istFortfuehrungszeichen(String text, int i) {
+    int z = i;
+    while (z > 0 && (text.charAt(z - 1) == ' ' || text.charAt(z - 1) == '\t')) {
+      z--;
+    }
+    if (z != 0 && text.charAt(z - 1) != '\n') {
+      return false;
+    }
+    var fenster = text.substring(i + 1, Math.min(text.length(), i + 10));
+    return FORTFUEHRUNGS_MARKER.matcher(fenster).find();
+  }
+
   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/anwendung/BefehlAnwender.java b/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
index ac4dbf2..b6bee1b 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/BefehlAnwender.java
@@ -4,7 +4,9 @@
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Anfuegung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Aufhebung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Ersetzung;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.FussnotenAufhebung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.GliederungsUeberschriften;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.SatznummerierungStreichung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Neufassung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Sammelbefehl;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Streichung;
@@ -14,12 +16,15 @@
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.UnbekannterBefehl;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WoerterEinfuegung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortAnker;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautVoranstellung;
 import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautZuAbsatz;
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautZuSatz;
 import eu.mulk.aendggner.aenderung.Stelle;
 import eu.mulk.aendggner.gesetz.Absatz;
 import eu.mulk.aendggner.gesetz.Gesetz;
 import eu.mulk.aendggner.gesetz.Gliederung;
 import eu.mulk.aendggner.gesetz.Norm;
+import eu.mulk.aendggner.gesetz.Superskript;
 import java.util.ArrayList;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -128,6 +133,10 @@
         case Aufhebung a -> wendeAufhebungAn(normen, a);
         case Umnummerierung u -> wendeUmnummerierungAn(normen, u);
         case WortlautZuAbsatz w -> wendeWortlautZuAbsatzAn(normen, w);
+        case WortlautZuSatz w -> wendeWortlautZuSatzAn(normen, w);
+        case WortlautVoranstellung w -> wendeWortlautVoranstellungAn(normen, w);
+        case FussnotenAufhebung f -> wendeFussnotenAufhebungAn(normen, f);
+        case SatznummerierungStreichung s -> wendeSatznummerierungStreichungAn(normen, s);
         case GliederungsUeberschriften g ->
             wendeGliederungsUeberschriftenAn(normen, gliederungen, g);
         case Sammelbefehl s -> wendeSammelAn(normen, gliederungen, s);
@@ -318,6 +327,7 @@
     return bearbeiteText(
         normen,
         befehl,
+        ohneFussnoten(
         text -> {
           if (befehl.amEnde()) {
             var gestutzt = text.stripTrailing();
@@ -336,13 +346,14 @@
                 "„" + befehl.alt() + "“ kommt " + anzahl + "-mal vor (ohne „jeweils“ mehrdeutig).");
           }
           return TextErgebnis.ok(text.replace(befehl.alt(), befehl.neu()));
-        });
+        }));
   }
 
   private static AngewandteAenderung wendeStreichungAn(List<Norm> normen, Streichung befehl) {
     return bearbeiteText(
         normen,
         befehl,
+        ohneFussnoten(
         text -> {
           int anzahl = zaehleVorkommen(text, befehl.woerter());
           if (anzahl == 0) {
@@ -355,7 +366,7 @@
               text.replace(befehl.woerter(), "")
                   .replaceAll("  +", " ")
                   .replaceAll(" ([,;.])", "$1"));
-        });
+        }));
   }
 
   private static AngewandteAenderung wendeWoerterEinfuegungAn(
@@ -363,6 +374,7 @@
     return bearbeiteText(
         normen,
         befehl,
+        ohneFussnoten(
         text ->
             switch (befehl.anker()) {
               case WortAnker.NachWoertern nach -> {
@@ -405,7 +417,7 @@
                 }
                 yield TextErgebnis.ok(gestutzt + " " + befehl.woerter());
               }
-            });
+            }));
   }
 
   // --- Strukturoperationen -------------------------------------------------------------------
@@ -419,7 +431,7 @@
         return manuell(befehl, aufloesung.fehler());
       }
       var norm = normen.get(aufloesung.normIndex());
-      var titel = befehl.neuerText().replaceFirst("^§\\s*\\S+\\s+", "").strip();
+      var titel = befehl.neuerText().replaceFirst("^(?:§|Art\\.)\\s*\\S+\\s+", "").strip();
       normen.set(aufloesung.normIndex(), norm.mitTitel(titel));
       return angewandt(befehl, norm.enbez());
     }
@@ -671,7 +683,9 @@
           yield angewandt(befehl, neue.stream().map(Norm::enbez).toList());
         }
 
-        var enbezNeu = "§ " + befehl.bezeichnung();
+        var sigelNeu =
+            befehl.stelle().paragraph().map(Stelle.Paragraph::sigel).orElse("§");
+        var enbezNeu = sigelNeu + " " + befehl.bezeichnung();
         if (StellenAufloeser.normIndex(gesetzAus(normen), enbezNeu) >= 0) {
           yield manuell(befehl, enbezNeu + " existiert bereits im Stammgesetz.");
         }
@@ -783,7 +797,10 @@
       var absaetze = new ArrayList<>(norm.absaetze());
       for (int i = 0; i < absaetze.size(); i++) {
         if (nummer.equals(absaetze.get(i).nummer())) {
-          absaetze.set(i, new Absatz(null, absaetze.get(i).text()));
+          // Als weggefallen markieren (Nummer behalten) — konsistent mit der Aufhebung über einen
+          // Absatz-Lokator; eine etwaige Folge-Umnummerierung „Abs. N+1 wird Abs. N“ räumt den
+          // weggefallenen Absatz dann weg.
+          absaetze.set(i, new Absatz(nummer, "(weggefallen)"));
           normen.set(aufloesung.normIndex(), norm.mitAbsaetzen(absaetze));
           return angewandt(befehl, norm.enbez());
         }
@@ -845,8 +862,8 @@
       List<Norm> normen, Umnummerierung befehl) {
     // „§ 9a wird zu § 9.“ — Umbenennung einer ganzen Norm.
     if (nurParagraph(befehl.stelle()) && nurParagraph(befehl.neu())) {
-      var enbezAlt = "§ " + befehl.stelle().paragraph().get().nummer();
-      var enbezNeu = "§ " + befehl.neu().paragraph().get().nummer();
+      var enbezAlt = befehl.stelle().paragraph().get().enbez();
+      var enbezNeu = befehl.neu().paragraph().get().enbez();
       int idx = StellenAufloeser.normIndex(gesetzAus(normen), enbezAlt);
       if (idx < 0) {
         return manuell(befehl, enbezAlt + " existiert nicht im Gesetz.");
@@ -870,7 +887,12 @@
 
     var altAbsatz = befehl.stelle().absatz();
     var neuAbsatz = befehl.neu().absatz();
-    if (altAbsatz.isPresent() && neuAbsatz.isPresent()) {
+    // Nur wenn der Absatz selbst das Umnummerierungsziel ist — bei „Satz 5 wird Satz 4“ stammt
+    // eine etwaige Absatzangabe aus dem Kontextrahmen und der Satz-Zweig unten ist zuständig.
+    if (altAbsatz.isPresent()
+        && neuAbsatz.isPresent()
+        && feinsteIstAbsatz(befehl.stelle())
+        && feinsteIstAbsatz(befehl.neu())) {
       var ergebnis = StellenAufloeser.aufloese(gesetzAus(normen), befehl.stelle());
       if (ergebnis instanceof StellenAufloeser.Ergebnis.NichtGefunden nicht) {
         return manuell(befehl, nicht.begruendung());
@@ -878,15 +900,72 @@
       var fundstelle = ((StellenAufloeser.Ergebnis.Gefunden) ergebnis).fundstelle();
       var norm = normen.get(fundstelle.normIndex());
       var absaetze = new ArrayList<>(norm.absaetze());
-      var absatz = absaetze.get(fundstelle.absatzIndex());
-      absaetze.set(fundstelle.absatzIndex(), new Absatz(neuAbsatz.get().nummer(), absatz.text()));
+      int quelleIdx = fundstelle.absatzIndex();
+      var neueNummer = neuAbsatz.get().nummer();
+      // Ein leerer Platzhalter-Absatz mit der Zielnummer (weggefallen/gegenstandslos) wird durch die
+      // Umnummerierung überschrieben (analog zur Norm-Umnummerierung auf eine weggefallene Zielnorm).
+      for (int i = absaetze.size() - 1; i >= 0; i--) {
+        if (i != quelleIdx
+            && neueNummer.equals(absaetze.get(i).nummer())
+            && istLeererPlatzhalter(absaetze.get(i).text())) {
+          absaetze.remove(i);
+          if (i < quelleIdx) {
+            quelleIdx--;
+          }
+        }
+      }
+      absaetze.set(quelleIdx, new Absatz(neueNummer, absaetze.get(quelleIdx).text()));
       normen.set(fundstelle.normIndex(), norm.mitAbsaetzen(absaetze));
       return angewandt(befehl, norm.enbez());
     }
-    // Satz-Umnummerierungen ändern den Text nicht (Sätze sind unnummeriert).
+    // Satz-Umnummerierung: unnummerierte Sätze brauchen keine Textänderung; amtlich nummerierte
+    // (bayerisches Landesrecht, „Satz 5 wird Satz 4.“) erhalten die neue Satznummer im Text.
+    var altSatz = letzteKomponente(befehl.stelle(), Stelle.SatzNr.class);
+    var neuSatz = letzteKomponente(befehl.neu(), Stelle.SatzNr.class);
+    if (altSatz != null && neuSatz != null) {
+      var ergebnis = StellenAufloeser.aufloese(gesetzAus(normen), befehl.stelle());
+      if (ergebnis instanceof StellenAufloeser.Ergebnis.NichtGefunden nicht) {
+        return manuell(befehl, nicht.begruendung());
+      }
+      var fundstelle = ((StellenAufloeser.Ergebnis.Gefunden) ergebnis).fundstelle();
+      if (fundstelle.bereich() != null && fundstelle.absatzIndex() != null) {
+        var norm = normen.get(fundstelle.normIndex());
+        var absaetze = new ArrayList<>(norm.absaetze());
+        var absatz = absaetze.get(fundstelle.absatzIndex());
+        var text = absatz.text();
+        var marker = Superskript.LAUF.matcher(text).region(fundstelle.bereich().von(), fundstelle.bereich().bis());
+        if (marker.lookingAt()
+            && Superskript.istSatzanfang(text, marker.start(), marker.end())) {
+          var neuerText =
+              text.substring(0, marker.start())
+                  + Superskript.zuSuperskript(neuSatz.nummer())
+                  + text.substring(marker.end());
+          absaetze.set(fundstelle.absatzIndex(), absatz.mitText(neuerText));
+          normen.set(fundstelle.normIndex(), norm.mitAbsaetzen(absaetze));
+          return angewandt(befehl, norm.enbez());
+        }
+      }
+    }
     return angewandt(befehl, "(keine Textänderung nötig)");
   }
 
+  /** Ein leerer Platzhalter-Absatz ohne Inhalt („(weggefallen)“, „(gegenstandslos)“). */
+  private static boolean istLeererPlatzhalter(String text) {
+    var t = text.strip();
+    return t.equals("(weggefallen)") || t.equals("(gegenstandslos)");
+  }
+
+  private static <K extends Stelle.Komponente> @Nullable K letzteKomponente(
+      Stelle stelle, Class<K> art) {
+    K letzte = null;
+    for (var komponente : stelle.komponenten()) {
+      if (art.isInstance(komponente)) {
+        letzte = art.cast(komponente);
+      }
+    }
+    return letzte;
+  }
+
   private static AngewandteAenderung wendeWortlautZuAbsatzAn(
       List<Norm> normen, WortlautZuAbsatz befehl) {
     var aufloesung = loeseNormAuf(normen, befehl.stelle());
@@ -894,6 +973,18 @@
       return manuell(befehl, aufloesung.fehler());
     }
     var norm = normen.get(aufloesung.normIndex());
+    // Steht genau ein unnummerierter Absatz zwischen nummerierten (bayerische Folge „Dem Wortlaut
+    // werden … Abs. 1 bis 4 vorangestellt“ → „Der bisherige Wortlaut wird Abs. 5“), erhält nur
+    // dieser die Nummer. Sind alle Absätze unnummeriert, wird der Gesamtwortlaut zu einem Absatz.
+    var unnummerierte =
+        norm.absaetze().stream().filter(a -> a.nummer() == null).toList();
+    if (unnummerierte.size() == 1 && norm.absaetze().size() > 1) {
+      var absaetze = new ArrayList<>(norm.absaetze());
+      int idx = absaetze.indexOf(unnummerierte.get(0));
+      absaetze.set(idx, new Absatz(befehl.nummer(), unnummerierte.get(0).text()));
+      normen.set(aufloesung.normIndex(), norm.mitAbsaetzen(absaetze));
+      return angewandt(befehl, norm.enbez());
+    }
     var sb = new StringBuilder();
     for (var absatz : norm.absaetze()) {
       if (sb.length() > 0) {
@@ -907,6 +998,109 @@
     return angewandt(befehl, norm.enbez());
   }
 
+  /** „Der Wortlaut wird Satz 1.“ — der Zieltext erhält die amtliche Satznummer als Superskript. */
+  private static AngewandteAenderung wendeWortlautZuSatzAn(
+      List<Norm> normen, WortlautZuSatz befehl) {
+    var ergebnis = StellenAufloeser.aufloese(gesetzAus(normen), befehl.stelle());
+    if (ergebnis instanceof StellenAufloeser.Ergebnis.NichtGefunden nicht) {
+      return manuell(befehl, nicht.begruendung());
+    }
+    var fundstelle = ((StellenAufloeser.Ergebnis.Gefunden) ergebnis).fundstelle();
+    var norm = normen.get(fundstelle.normIndex());
+    Integer absatzIndex = fundstelle.absatzIndex();
+    if (absatzIndex == null) {
+      if (norm.absaetze().size() != 1) {
+        return manuell(
+            befehl, norm.enbez() + " hat " + norm.absaetze().size() + " Absätze; Ziel unklar.");
+      }
+      absatzIndex = 0;
+    }
+    var absaetze = new ArrayList<>(norm.absaetze());
+    var absatz = absaetze.get(absatzIndex);
+    var marke = Superskript.zuSuperskript(befehl.nummer());
+    if (!absatz.text().startsWith(marke)) {
+      absaetze.set(absatzIndex, absatz.mitText(marke + absatz.text()));
+      normen.set(fundstelle.normIndex(), norm.mitAbsaetzen(absaetze));
+    }
+    return angewandt(befehl, norm.enbez());
+  }
+
+  /** „Dem Wortlaut werden die folgenden Abs. 1 bis 4 vorangestellt: „…““ */
+  private static AngewandteAenderung wendeWortlautVoranstellungAn(
+      List<Norm> normen, WortlautVoranstellung befehl) {
+    var aufloesung = loeseNormAuf(normen, befehl.stelle());
+    if (aufloesung.fehler() != null) {
+      return manuell(befehl, aufloesung.fehler());
+    }
+    var neue = parseAbsaetze(befehl.text());
+    if (neue.isEmpty()) {
+      return manuell(befehl, "Im Zitat wurde kein Absatz erkannt.");
+    }
+    var norm = normen.get(aufloesung.normIndex());
+    var absaetze = new ArrayList<>(neue);
+    absaetze.addAll(norm.absaetze());
+    normen.set(aufloesung.normIndex(), norm.mitAbsaetzen(absaetze));
+    return angewandt(befehl, norm.enbez());
+  }
+
+  /** „Fußnote 1 wird aufgehoben.“ — entfernt Fußnotenzeile und Inline-Marker in der Kontextnorm. */
+  private static AngewandteAenderung wendeFussnotenAufhebungAn(
+      List<Norm> normen, FussnotenAufhebung befehl) {
+    var aufloesung = loeseNormAuf(normen, befehl.stelle());
+    if (aufloesung.fehler() != null) {
+      return manuell(befehl, aufloesung.fehler());
+    }
+    var norm = normen.get(aufloesung.normIndex());
+    var absaetze = new ArrayList<>(norm.absaetze());
+    var fehlend = new ArrayList<String>();
+    for (var nummer : befehl.nummern()) {
+      var marke = Superskript.zuSuperskript(nummer) + ")";
+      var zeilenMuster =
+          Pattern.compile("(?m)^" + Pattern.quote(marke) + "\\s*\\[Amtl\\. Anm\\.:\\].*(?:\n|$)");
+      boolean gefunden = false;
+      for (int i = 0; i < absaetze.size(); i++) {
+        var text = absaetze.get(i).text();
+        var ohneZeile = zeilenMuster.matcher(text).replaceAll("");
+        var ohneMarker = ohneZeile.replace(marke, "");
+        if (!ohneMarker.equals(text)) {
+          absaetze.set(i, absaetze.get(i).mitText(ohneMarker.stripTrailing()));
+          gefunden = true;
+        }
+      }
+      if (!gefunden) {
+        fehlend.add(nummer);
+      }
+    }
+    if (!fehlend.isEmpty()) {
+      return manuell(
+          befehl,
+          "Fußnote "
+              + String.join(", ", fehlend)
+              + " kommt in "
+              + norm.enbez()
+              + " nicht vor.");
+    }
+    normen.set(aufloesung.normIndex(), norm.mitAbsaetzen(absaetze));
+    return angewandt(befehl, norm.enbez());
+  }
+
+  /** „In Satz 1 wird die Satznummerierung „1“ gestrichen.“ */
+  private static AngewandteAenderung wendeSatznummerierungStreichungAn(
+      List<Norm> normen, SatznummerierungStreichung befehl) {
+    return bearbeiteBereich(
+        normen,
+        befehl,
+        (text, bereich) -> {
+          var marke = Superskript.zuSuperskript(befehl.nummer());
+          if (!text.startsWith(marke, bereich.von())) {
+            return TextErgebnis.fehler(
+                "Die Satznummerierung „" + befehl.nummer() + "“ steht nicht am Anfang des Ziels.");
+          }
+          return TextErgebnis.ok(
+              text.substring(0, bereich.von()) + text.substring(bereich.von() + marke.length()));
+        });
+  }
+
   /**
    * Ein Mehrfachziel-Befehl („In A und B wird jeweils …“): wendet jeden Teilbefehl nacheinander an
    * (jeder mutiert den fortlaufenden Zwischenstand) und fasst sie zu einem Protokolleintrag
@@ -949,6 +1143,28 @@
     TextErgebnis wende(String text);
   }
 
+  // Fußnoten-Definitionszeile am Zeilenanfang („⁶) [Amtl. Anm.:] …“), die dem tragenden Absatz
+  // anhängt. Für wortweise Operationen (Streichen/Ersetzen/Einfügen) ist sie kein Inhalt: der
+  // eingebettete Marker „Gesetzbuchs²)“ soll getroffen werden, der gleichlautende Definitionskopf
+  // „²)“ nicht. Fußnoten werden daher vor der Operation abgetrennt und danach unverändert
+  // wieder angehängt (ihre eigene Aufhebung läuft über FussnotenAufhebung).
+  private static final Pattern FUSSNOTEN_DEFINITION = Pattern.compile("(?m)^[⁰¹²³⁴⁵⁶⁷⁸⁹]+\\)");
+
+  private static TextOperation ohneFussnoten(TextOperation operation) {
+    return text -> {
+      var m = FUSSNOTEN_DEFINITION.matcher(text);
+      if (!m.find()) {
+        return operation.wende(text);
+      }
+      int grenze = m.start();
+      var ergebnis = operation.wende(text.substring(0, grenze));
+      if (ergebnis.fehler() != null) {
+        return ergebnis;
+      }
+      return TextErgebnis.ok(ergebnis.text() + text.substring(grenze));
+    };
+  }
+
   private interface BereichsOperation {
     TextErgebnis wende(String text, SatzTeiler.SatzBereich bereich);
   }
@@ -1067,7 +1283,7 @@
   private static NormAufloesung loeseNormAuf(List<Norm> normen, Stelle stelle) {
     String enbez;
     if (stelle.paragraph().isPresent()) {
-      enbez = "§ " + stelle.paragraph().get().nummer();
+      enbez = stelle.paragraph().get().enbez();
     } else if (stelle.anlagenEnbez().isPresent()) {
       enbez = stelle.anlagenEnbez().get();
     } else {
@@ -1097,6 +1313,7 @@
         .noneMatch(
             k ->
                 k instanceof Stelle.SatzNr
+                    || k instanceof Stelle.HalbsatzNr
                     || k instanceof Stelle.NummerNr
                     || k instanceof Stelle.BuchstabeNr);
   }
@@ -1154,7 +1371,7 @@
   // die Untergliederungs- und Verbindungswörter aus, sodass an solchen Stellen nicht getrennt wird.
   private static final Pattern PARAGRAPH_UEBERSCHRIFT =
       Pattern.compile(
-          "(?=§\\s*\\d+[a-z]?\\s+"
+          "(?=(?:§|Art\\.)\\s*\\d+[a-z]?\\s+"
               + "(?!Absatz|Absätze|Abs|Satz|Sätze|Nummer|Nummern|Nr|Buchstabe|Buchstaben|Buchst"
               + "|und|bis|oder|sowie|des|der|dieses|genannten)"
               + "\\p{Lu})");
@@ -1167,11 +1384,11 @@
     var normen = new ArrayList<Norm>();
     for (var stueck : PARAGRAPH_UEBERSCHRIFT.split(block.strip())) {
       var s = stueck.strip();
-      var m = Pattern.compile("^§\\s*(\\d+[a-z]?)\\b").matcher(s);
+      var m = Pattern.compile("^(§|Art\\.)\\s*(\\d+[a-z]?)\\b").matcher(s);
       if (s.isEmpty() || !m.find()) {
         continue;
       }
-      var enbez = "§ " + m.group(1);
+      var enbez = m.group(1) + " " + m.group(2);
       normen.add(parseNorm(s, enbez, new Norm(enbez, null, gliederung, List.of(), false)));
     }
     return normen;
@@ -1188,7 +1405,7 @@
     if (erster >= 0) {
       var kopf = text.substring(0, erster).strip();
       if (!kopf.isEmpty()) {
-        titel = kopf.replaceFirst("^§\\s*\\S+\\s*", "").replaceAll("\\s+", " ").strip();
+        titel = kopf.replaceFirst("^(?:§|Art\\.)\\s*\\S+\\s*", "").replaceAll("\\s+", " ").strip();
         if (titel.isEmpty()) {
           titel = vorlage.titel();
         }
@@ -1201,7 +1418,7 @@
     // Steht „§ N“ allein auf der ersten Zeile, ist die zweite Zeile die Überschrift und der Rest
     // der Normtext.
     var zeilen = text.lines().map(String::strip).filter(z -> !z.isEmpty()).toList();
-    if (zeilen.size() >= 3 && zeilen.get(0).matches("§\\s*\\d+[a-z]?")) {
+    if (zeilen.size() >= 3 && zeilen.get(0).matches("(?:§|Art\\.)\\s*\\d+[a-z]?")) {
       titel = zeilen.get(1);
       var rest = String.join("\n", zeilen.subList(2, zeilen.size()));
       return new Norm(
@@ -1212,7 +1429,7 @@
           false);
     }
     // Fallback: gesamter Text (ohne „§ N“-Präfix) als unnummerierter Absatz, Titel unverändert.
-    var inhalt = text.replaceFirst("^§\\s*\\S+\\s*", "");
+    var inhalt = text.replaceFirst("^(?:§|Art\\.)\\s*\\S+\\s*", "");
     return new Norm(
         enbez,
         titel,
diff --git a/src/main/java/eu/mulk/aendggner/anwendung/InhaltsuebersichtAnwender.java b/src/main/java/eu/mulk/aendggner/anwendung/InhaltsuebersichtAnwender.java
index 4fb91b0..e9f84b6 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/InhaltsuebersichtAnwender.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/InhaltsuebersichtAnwender.java
@@ -229,7 +229,8 @@
   private static Pattern zeilenMuster(Stelle.Komponente ziel) {
     return switch (ziel) {
       case Stelle.Paragraph p ->
-          Pattern.compile("^§\\s*" + Pattern.quote(p.nummer()) + "(?![0-9a-z])");
+          Pattern.compile(
+              "^" + Pattern.quote(p.sigel()) + "\\s*" + Pattern.quote(p.nummer()) + "(?![0-9a-z])");
       case Stelle.Gliederungseinheit g -> {
         if (g.nummer().isEmpty()) {
           yield Pattern.compile("^" + Pattern.quote(g.art()) + "\\b");
@@ -279,7 +280,7 @@
       var m =
           Pattern.compile(
                   "^((?:Teil|Abschnitt|Unterabschnitt|Kapitel|Buch)\\s+\\d+[a-z]?|Anhang"
-                      + "|§\\s*\\d+[a-z]*)\\s*(.*)$")
+                      + "|(?:§|Art\\.)\\s*\\d+[a-z]*)\\s*(.*)$")
               .matcher(s);
       if (m.matches() && !m.group(2).isEmpty()) {
         zeilen.add(m.group(1) + " | " + m.group(2));
@@ -301,7 +302,7 @@
   // Zeilenanfänge einer Inhaltsübersicht: §-Angaben (nicht Querverweise) und Gliederungsmarken.
   private static final Pattern UEBERSICHT_MARKE =
       Pattern.compile(
-          "(?=§\\s*\\d+[a-z]?\\s+"
+          "(?=(?:§|Art\\.)\\s*\\d+[a-z]?\\s+"
               + "(?!Absatz|Absätze|Abs|Satz|Sätze|Nummer|Nummern|Nr|Buchstabe|Buchstaben"
               + "|und|bis|oder|sowie|des|der|dieses)"
               + "(?:\\(|\\p{Lu})"
@@ -315,13 +316,13 @@
   private static List<String> angabenZeilen(String zitat, String einrueckung) {
     var flach = zitat.strip().replaceAll("\\s+", " ");
     var zeilen = new ArrayList<String>();
-    if (flach.startsWith("§")) {
+    if (flach.startsWith("§") || flach.startsWith("Art.")) {
       for (var stueck : PARAGRAPH_ANGABE.split(flach)) {
         var s = stueck.strip();
         if (s.isEmpty()) {
           continue;
         }
-        var m = Pattern.compile("^(§\\s*\\d+[a-z]*)\\s*(.*)$").matcher(s);
+        var m = Pattern.compile("^((?:§|Art\\.)\\s*\\d+[a-z]*)\\s*(.*)$").matcher(s);
         if (m.matches() && !m.group(2).isEmpty()) {
           zeilen.add(einrueckung + m.group(1) + " | " + m.group(2));
         } else {
@@ -339,7 +340,7 @@
   // trennen nicht (nach ihnen folgt ein Kleinwort oder eine Strukturangabe statt eines Titels).
   private static final Pattern PARAGRAPH_ANGABE =
       Pattern.compile(
-          "(?=§\\s*\\d+[a-z]?\\s+"
+          "(?=(?:§|Art\\.)\\s*\\d+[a-z]?\\s+"
               + "(?!Absatz|Absätze|Abs|Satz|Sätze|Nummer|Nummern|Nr|Buchstabe|Buchstaben"
               + "|und|bis|oder|sowie|des|der|dieses)"
               + "(?:\\(|\\p{Lu}))");
@@ -362,7 +363,7 @@
 
   private static String anzeige(Stelle.Komponente ziel) {
     return switch (ziel) {
-      case Stelle.Paragraph p -> "§ " + p.nummer();
+      case Stelle.Paragraph p -> p.enbez();
       case Stelle.Gliederungseinheit g -> g.bezeichnung();
       default -> ziel.toString();
     };
diff --git a/src/main/java/eu/mulk/aendggner/anwendung/SatzTeiler.java b/src/main/java/eu/mulk/aendggner/anwendung/SatzTeiler.java
index a15aafa..6df6ea5 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/SatzTeiler.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/SatzTeiler.java
@@ -1,13 +1,18 @@
 package eu.mulk.aendggner.anwendung;
 
+import eu.mulk.aendggner.gesetz.Superskript;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.regex.Pattern;
+import org.jspecify.annotations.Nullable;
 
 /**
  * Zerlegt einen Absatztext in Sätze im Rechtssinne, mit einer Stoppliste für juristische
  * Abkürzungen und Datumsangaben („Abs.“, „31. März 2021“).
+ *
+ * <p>Trägt der Text amtliche Satznummern als Unicode-Superskripte (bayerisches Landesrecht,
+ * „¹Die freilebende Tierwelt …“), wird exakt an diesen geteilt statt heuristisch.
  */
 public final class SatzTeiler {
 
@@ -63,6 +68,10 @@
   private SatzTeiler() {}
 
   public static List<SatzBereich> teile(String text) {
+    var nummeriert = teileAnSatznummern(text);
+    if (nummeriert != null) {
+      return nummeriert;
+    }
     var bereiche = new ArrayList<SatzBereich>();
     var matcher = SATZENDE.matcher(text);
     int start = 0;
@@ -85,6 +94,55 @@
     return teile(text).stream().map(b -> text.substring(b.von(), b.bis()).strip()).toList();
   }
 
+  /**
+   * Teilt an amtlichen Satznummern (Superskript-Läufe an Satzanfängen); {@code null}, wenn der Text
+   * keine trägt. Text vor der ersten Satznummer (und Fußnotenzeilen nach dem letzten Satz) bleibt
+   * dem jeweils angrenzenden Satz zugeschlagen.
+   */
+  private static @Nullable List<SatzBereich> teileAnSatznummern(String text) {
+    // Satzgrenzen: stets der Textanfang (Satz 1 samt etwaigem Vorspann vor „¹“) plus die Position
+    // jeder Satznummer ab „²“. Eine allein stehende Nummer ≥ 2 (weil Satz 1 unnummeriert ist oder
+    // seine Nummer zuvor gestrichen wurde, „Verboten … ²Art. 33 …“) bildet so eine eigene Grenze.
+    var matcher = Superskript.LAUF.matcher(text);
+    var grenzen = new ArrayList<Integer>();
+    grenzen.add(0);
+    boolean gefunden = false;
+    while (matcher.find()) {
+      if (Superskript.istSatzanfang(text, matcher.start(), matcher.end())) {
+        gefunden = true;
+        int nummer = Integer.parseInt(Superskript.zuZahl(matcher.group()));
+        if (nummer >= 2 && matcher.start() > 0) {
+          grenzen.add(matcher.start());
+        }
+      }
+    }
+    if (!gefunden) {
+      return null;
+    }
+    var bereiche = new ArrayList<SatzBereich>();
+    for (int k = 0; k < grenzen.size(); k++) {
+      int von = grenzen.get(k);
+      int bis = k + 1 < grenzen.size() ? grenzen.get(k + 1) : text.length();
+      while (bis > von && Character.isWhitespace(text.charAt(bis - 1))) {
+        bis--;
+      }
+      if (bis > von) {
+        bereiche.add(new SatzBereich(von, bis));
+      }
+    }
+    return bereiche;
+  }
+
+  /** Die amtliche Satznummer am Anfang des Satztexts; {@code null}, wenn er keine trägt. */
+  public static @Nullable Integer nummerVonSatz(String satzText) {
+    var s = satzText.stripLeading();
+    var matcher = Superskript.LAUF.matcher(s);
+    if (!matcher.lookingAt() || !Superskript.istSatzanfang(s, 0, matcher.end())) {
+      return null;
+    }
+    return Integer.parseInt(Superskript.zuZahl(matcher.group()));
+  }
+
   private static boolean istAbkuerzung(String text, int punktPosition) {
     var wort = wortVor(text, punktPosition);
     return ABKUERZUNGEN.contains(wort);
diff --git a/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java b/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java
index 9501f24..dd8409e 100644
--- a/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java
+++ b/src/main/java/eu/mulk/aendggner/anwendung/StellenAufloeser.java
@@ -39,7 +39,7 @@
     if (stelle.betrifftInhaltsuebersicht()) {
       enbez = "Inhaltsübersicht";
     } else if (stelle.paragraph().isPresent()) {
-      enbez = "§ " + stelle.paragraph().get().nummer();
+      enbez = stelle.paragraph().get().enbez();
     } else if (stelle.anlagenEnbez().isPresent()) {
       enbez = stelle.anlagenEnbez().get();
     } else {
@@ -136,6 +136,7 @@
         .anyMatch(
             k ->
                 k instanceof Stelle.SatzNr
+                    || k instanceof Stelle.HalbsatzNr
                     || k instanceof Stelle.NummerNr
                     || k instanceof Stelle.BuchstabeNr);
   }
@@ -174,15 +175,76 @@
     }
     for (var komponente : stelle.komponenten()) {
       if (komponente instanceof Stelle.SatzNr satz) {
-        int index = Integer.parseInt(satz.nummer().replaceAll("[a-z]$", "")) - 1;
+        int nummer = Integer.parseInt(satz.nummer().replaceAll("[a-z]$", ""));
         var saetze = SatzTeiler.teile(text);
-        return index >= 0 && index < saetze.size() ? saetze.get(index) : null;
+        var satzBereich = satzBereich(text, nummer, saetze);
+        return satzBereich == null ? null : halbsatzBereich(text, stelle, satzBereich);
       }
     }
+    // Halbsatz ohne Satzangabe („in Halbsatz 1“ im Rahmen eines Satzes bzw. Absatzes).
+    if (stelle.komponenten().stream().anyMatch(k -> k instanceof Stelle.HalbsatzNr)) {
+      return halbsatzBereich(text, stelle, new SatzTeiler.SatzBereich(0, text.length()));
+    }
     return null;
   }
 
   /**
+   * Der Bereich des Satzes mit der gegebenen Nummer. Amtlich nummerierte Sätze (bayerisches
+   * Landesrecht) werden nach Satznummer statt Position aufgelöst — nach Streichungen kann die
+   * Zählung von der Position abweichen. Trägt mindestens ein Satz eine Nummer, entscheidet allein
+   * das Label (kein Positions-Fallback, der einen falsch nummerierten Satz greifen könnte).
+   */
+  private static SatzTeiler.@Nullable SatzBereich satzBereich(
+      String text, int nummer, List<SatzTeiler.SatzBereich> saetze) {
+    boolean nummeriert = false;
+    for (var kandidat : saetze) {
+      var label = SatzTeiler.nummerVonSatz(text.substring(kandidat.von(), kandidat.bis()));
+      if (label != null && label == nummer) {
+        return kandidat;
+      }
+      nummeriert |= label != null;
+    }
+    if (nummeriert) {
+      return null;
+    }
+    int index = nummer - 1;
+    return index >= 0 && index < saetze.size() ? saetze.get(index) : null;
+  }
+
+  /**
+   * Verfeinert den Bereich um eine etwaige Halbsatz-Angabe: Halbsatz 1 reicht bis zum (ersten)
+   * Semikolon, Halbsatz 2 beginnt dahinter. Ohne Semikolon ist die Angabe nicht auflösbar
+   * (konservativ: {@code null} → manuell prüfen).
+   */
+  private static SatzTeiler.@Nullable SatzBereich halbsatzBereich(
+      String text, Stelle stelle, SatzTeiler.SatzBereich bereich) {
+    Stelle.HalbsatzNr halbsatz = null;
+    for (var komponente : stelle.komponenten()) {
+      if (komponente instanceof Stelle.HalbsatzNr h) {
+        halbsatz = h;
+      }
+    }
+    if (halbsatz == null) {
+      return bereich;
+    }
+    int semikolon = text.indexOf(';', bereich.von());
+    if (semikolon < 0 || semikolon >= bereich.bis()) {
+      return null;
+    }
+    return switch (halbsatz.nummer()) {
+      case "1" -> new SatzTeiler.SatzBereich(bereich.von(), semikolon);
+      case "2" -> {
+        int start = semikolon + 1;
+        while (start < bereich.bis() && Character.isWhitespace(text.charAt(start))) {
+          start++;
+        }
+        yield new SatzTeiler.SatzBereich(start, bereich.bis());
+      }
+      default -> null;
+    };
+  }
+
+  /**
    * Findet die (im Suchbereich eindeutige) Aufzählungszeile, die mit dem gegebenen Label beginnt,
    * und dehnt den Bereich auf die tiefer eingerückten Kindzeilen der Einheit aus.
    */
diff --git a/src/main/java/eu/mulk/aendggner/gesetz/Superskript.java b/src/main/java/eu/mulk/aendggner/gesetz/Superskript.java
new file mode 100644
index 0000000..777fe35
--- /dev/null
+++ b/src/main/java/eu/mulk/aendggner/gesetz/Superskript.java
@@ -0,0 +1,73 @@
+package eu.mulk.aendggner.gesetz;
+
+import java.util.regex.Pattern;
+
+/**
+ * Hochgestellte Ziffern (¹²³…), wie sie das bayerische Landesrecht als amtliche Satznummern und
+ * Fußnotenmarker führt. Die kanonische Textform des ÄndGgner stellt solche Ziffern als
+ * Unicode-Superskripte dar, damit Stammgesetz und zitierter Änderungstext dieselbe Schreibweise
+ * tragen und Befehle wie „In Satz 1 wird die Satznummerierung „1“ gestrichen“ anwendbar sind.
+ */
+public final class Superskript {
+
+  private static final String NORMAL = "0123456789";
+  private static final String HOCH = "⁰¹²³⁴⁵⁶⁷⁸⁹";
+
+  /** Ein Lauf hochgestellter Ziffern. */
+  public static final Pattern LAUF = Pattern.compile("[" + HOCH + "]+");
+
+  private Superskript() {}
+
+  /** Wahr, wenn {@code c} eine hochgestellte Ziffer ist. */
+  public static boolean istHochgestellt(char c) {
+    return HOCH.indexOf(c) >= 0;
+  }
+
+  /** „12“ → „¹²“. Nicht-Ziffern bleiben unverändert. */
+  public static String zuSuperskript(String ziffern) {
+    var sb = new StringBuilder(ziffern.length());
+    for (int i = 0; i < ziffern.length(); i++) {
+      var c = ziffern.charAt(i);
+      int idx = NORMAL.indexOf(c);
+      sb.append(idx >= 0 ? HOCH.charAt(idx) : c);
+    }
+    return sb.toString();
+  }
+
+  /** „¹²“ → „12“. Nicht-Superskripte bleiben unverändert. */
+  public static String zuZahl(String superskript) {
+    var sb = new StringBuilder(superskript.length());
+    for (int i = 0; i < superskript.length(); i++) {
+      var c = superskript.charAt(i);
+      int idx = HOCH.indexOf(c);
+      sb.append(idx >= 0 ? NORMAL.charAt(idx) : c);
+    }
+    return sb.toString();
+  }
+
+  /**
+   * Wahr, wenn der Superskript-Lauf {@code [start, ende)} in {@code text} eine amtliche Satznummer
+   * am Satzanfang ist — im Unterschied zum Fußnotenmarker, der einem Wort anhängt und auf den eine
+   * schließende Klammer folgt („Enteignung⁶)“).
+   */
+  public static boolean istSatzanfang(String text, int start, int ende) {
+    if (ende < text.length() && text.charAt(ende) == ')') {
+      return false; // Fußnotenmarker „⁶)“
+    }
+    if (start > 0) {
+      var davor = text.charAt(start - 1);
+      if (!Character.isWhitespace(davor) && davor != '„' && davor != '(') {
+        return false; // hängt einem Wort an → Fußnotenmarker ohne Klammer
+      }
+    }
+    // Nach der Satznummer beginnt der Satz: Buchstabe, Paragraphzeichen, öffnendes Zitat oder
+    // öffnende Klammer (z. B. „³§ 23 des Gesetzes …“).
+    return ende < text.length()
+        && (Character.isLetter(text.charAt(ende))
+            || text.charAt(ende) == '§'
+            || text.charAt(ende) == '„'
+            || text.charAt(ende) == '»'
+            || text.charAt(ende) == '"'
+            || text.charAt(ende) == '(');
+  }
+}
diff --git a/src/main/java/eu/mulk/aendggner/gesetz/bayern/BayRechtLoader.java b/src/main/java/eu/mulk/aendggner/gesetz/bayern/BayRechtLoader.java
new file mode 100644
index 0000000..4150af4
--- /dev/null
+++ b/src/main/java/eu/mulk/aendggner/gesetz/bayern/BayRechtLoader.java
@@ -0,0 +1,58 @@
+package eu.mulk.aendggner.gesetz.bayern;
+
+import eu.mulk.aendggner.aenderung.parse.PatchTextExtraktor;
+import eu.mulk.aendggner.aenderung.parse.SuperskriptModus;
+import eu.mulk.aendggner.aenderung.parse.TextBereiniger;
+import eu.mulk.aendggner.gesetz.Gesetz;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import org.apache.tika.Tika;
+import org.jboss.logging.Logger;
+
+/**
+ * Liest ein Stammgesetz des bayerischen Landesrechts aus der konsolidierten Fassung von
+ * gesetze-bayern.de — als PDF oder als kanonischer Klartext.
+ *
+ * <p>PDFs durchlaufen dieselbe Aufbereitung wie Änderungsgesetze (Fontgrößen-Filter mit
+ * Superskript-Erhalt, Textbereinigung); der bereinigte Lineartext ist zugleich das dokumentierte
+ * Klartext-Format (siehe {@link BayRechtTextParser}): Wo die PDF-Extraktion versagt oder nur eine
+ * andere Quelle verfügbar ist (etwa eine archivierte HTML-Fassung), kann der Text von Hand
+ * aufbereitet und als {@code .txt} eingespeist werden. Amtliche Satznummern und Fußnotenmarker
+ * stehen dabei als Unicode-Superskripte im Text (¹Die freilebende Tierwelt …, Enteignung⁶)).
+ */
+public final class BayRechtLoader {
+
+  private static final Logger log = Logger.getLogger(BayRechtLoader.class);
+
+  private final Tika tika = new Tika();
+
+  public Gesetz load(Path datei) throws IOException {
+    var mimeType = tika.detect(datei);
+    log.infof("Stammgesetz %s hat Typ %s.", datei, mimeType);
+
+    var text =
+        switch (mimeType) {
+          case "application/pdf" ->
+              nachSatzendeGetrennteNormkoepfe(
+                  TextBereiniger.bereinige(
+                      new PatchTextExtraktor(SuperskriptModus.BEHALTEN).extrahiere(datei)));
+          case "text/plain" -> Files.readString(datei, StandardCharsets.UTF_8);
+          default ->
+              throw new IOException(
+                  "Nicht unterstützter Dateityp %s für Stammgesetz %s (unterstützt: PDF, Klartext)"
+                      .formatted(mimeType, datei));
+        };
+    return BayRechtTextParser.parse(text);
+  }
+
+  /**
+   * Stellt einen vom Zeilen-Reflow an das Satzende der Vornorm geklebten Normkopf („… verlangen.
+   * Art. 17  Jagderlaubnis“) wieder auf eine eigene Zeile. Das doppelte Leerzeichen zwischen
+   * Artikelnummer und Titel unterscheidet den Normkopf von gewöhnlichen Querverweisen.
+   */
+  private static String nachSatzendeGetrennteNormkoepfe(String text) {
+    return text.replaceAll("(?<=[.“?!])[ \\t]+(?=Art\\.\\s\\d+[a-z]?[ \\t]{2})", "\n");
+  }
+}
diff --git a/src/main/java/eu/mulk/aendggner/gesetz/bayern/BayRechtTextParser.java b/src/main/java/eu/mulk/aendggner/gesetz/bayern/BayRechtTextParser.java
new file mode 100644
index 0000000..0744086
--- /dev/null
+++ b/src/main/java/eu/mulk/aendggner/gesetz/bayern/BayRechtTextParser.java
@@ -0,0 +1,250 @@
+package eu.mulk.aendggner.gesetz.bayern;
+
+import eu.mulk.aendggner.gesetz.Absatz;
+import eu.mulk.aendggner.gesetz.Gesetz;
+import eu.mulk.aendggner.gesetz.Gliederung;
+import eu.mulk.aendggner.gesetz.Norm;
+import eu.mulk.aendggner.gesetz.Superskript;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+import org.jspecify.annotations.Nullable;
+
+/**
+ * Parst den kanonischen Lineartext eines bayerischen Stammgesetzes (gesetze-bayern.de) zu einem
+ * {@link Gesetz}. Das Layout entspricht der {@code --extract-only}-Ausgabe der konsolidierten
+ * PDF-Fassung (siehe {@link BayRechtLoader}):
+ *
+ * <pre>
+ * Bayerisches Jagdgesetz          ← Langtitel
+ * (BayJG)                         ← Juris-Abkürzung
+ * Vom 13. Oktober 1978            ← Datumszeile (übersprungen)
+ * (BayRS V S. 595)                ← Fundstellen (übersprungen)
+ * BayRS 792-1-W
+ * Vollzitat nach RedR: …          ← übersprungen (ggf. mehrzeilig)
+ * I. Abschnitt Grundsätze         ← Gliederungs-Überschrift
+ * 1. Allgemeine Vorschriften      ← nummerierte Unter-Überschrift (vor einem Art.-Kopf)
+ * Art. 1  Gesetzeszweck           ← Normkopf; „Art. 60  (aufgehoben)“ → weggefallen
+ * (1) ¹Die freilebende Tierwelt … ← Absätze mit amtlichen Satznummern als Superskript
+ * ⁶) [Amtl. Anm.:] …              ← Fußnotenzeile, verbleibt im Text des tragenden Absatzes
+ * </pre>
+ */
+final class BayRechtTextParser {
+
+  private static final Pattern ABSATZ_MARKER = Pattern.compile("^\\((\\d+[a-z]?)\\)\\s+");
+
+  private static final Pattern JURABK_ZEILE = Pattern.compile("^\\((\\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}: .+$");
+  private static final Pattern DRUCKKOPF_REST = Pattern.compile("^\\d+[–-]\\d+[a-z]?\\)$");
+
+  private static final Pattern GLIEDERUNG =
+      Pattern.compile("^([IVXLCDM]+)\\.\\s+(Abschnitt|Teil|Kapitel)\\b\\s*(.*)$");
+
+  private static final Pattern UNTER_GLIEDERUNG = Pattern.compile("^(\\d+[a-z]?)\\.\\s+(\\S.*)$");
+
+  // Normkopf: „Art. N“ plus Titel auf derselben Zeile. Die Negativliste schließt
+  // Querverweise am Zeilenanfang aus („Art. 4 Abs. 3 …“).
+  private static final Pattern NORM_KOPF =
+      Pattern.compile(
+          "^Art\\.\\s+(\\d+[a-z]?)\\s+"
+              + "(?!Absatz|Abs\\.|Satz|Sätze|Nummer|Nr\\.|Buchstabe|Buchst\\."
+              + "|und|bis|oder|sowie|des|der|dieses)"
+              + "((?:\\p{Lu}|\\().*)$");
+
+  private static final Pattern WEGGEFALLEN_TITEL =
+      Pattern.compile("^\\((?:aufgehoben|weggefallen)\\)$");
+
+  private static final Pattern FUSSNOTE =
+      Pattern.compile("^([⁰¹²³⁴⁵⁶⁷⁸⁹]+|\\d{1,3})\\)\\s*(\\[Amtl\\. Anm\\.:\\].*)$");
+
+  private BayRechtTextParser() {}
+
+  static Gesetz parse(String text) {
+    var zeilen = text.lines().toList();
+    int i = ueberspringeDruckkopf(zeilen);
+
+    // Titelblock.
+    while (i < zeilen.size() && zeilen.get(i).isBlank()) {
+      i++;
+    }
+    if (i >= zeilen.size()) {
+      throw new IllegalArgumentException("Leere Eingabe: kein Titel gefunden.");
+    }
+    var langue = zeilen.get(i++).strip();
+    String jurabk = null;
+    if (i < zeilen.size()) {
+      var m = JURABK_ZEILE.matcher(zeilen.get(i).strip());
+      if (m.matches()) {
+        jurabk = m.group(1);
+        i++;
+      }
+    }
+    // Rest des Titelblocks (Datum, Fundstellen, Vollzitat) bis zur ersten Struktur überspringen.
+    while (i < zeilen.size()
+        && !GLIEDERUNG.matcher(zeilen.get(i).strip()).matches()
+        && !NORM_KOPF.matcher(zeilen.get(i).strip()).matches()) {
+      i++;
+    }
+
+    var normen = new ArrayList<Norm>();
+    var gliederungen = new ArrayList<Gliederung>();
+    Gliederung aktuelleGliederung = null;
+    String elternKennzahl = null;
+    int gliederungsZaehler = 0;
+
+    String normNummer = null;
+    String normTitel = null;
+    var normZeilen = new ArrayList<String>();
+    int letzteNormNummer = 0;
+
+    for (; i <= zeilen.size(); i++) {
+      var zeile = i < zeilen.size() ? zeilen.get(i).strip() : null;
+
+      var gliederung = zeile != null ? GLIEDERUNG.matcher(zeile) : null;
+      var unterGliederung = zeile != null ? UNTER_GLIEDERUNG.matcher(zeile) : null;
+      var normKopf = zeile != null ? NORM_KOPF.matcher(zeile) : null;
+
+      if (zeile == null
+          || gliederung.matches()
+          || (normKopf.matches() && istNeuerNormKopf(normKopf.group(1), letzteNormNummer))
+          || (unterGliederung.matches() && istUnterGliederung(unterGliederung, zeilen, i))) {
+        // Laufende Norm abschließen.
+        if (normNummer != null) {
+          normen.add(baueNorm(normNummer, normTitel, aktuelleGliederung, normZeilen));
+        }
+        normNummer = null;
+        normZeilen.clear();
+
+        if (zeile == null) {
+          break;
+        }
+        if (gliederung.matches()) {
+          gliederungsZaehler++;
+          elternKennzahl = String.format("%03d", gliederungsZaehler);
+          var titel = gliederung.group(3).strip();
+          aktuelleGliederung =
+              new Gliederung(
+                  elternKennzahl,
+                  gliederung.group(1) + ". " + gliederung.group(2),
+                  titel.isEmpty() ? null : titel);
+          gliederungen.add(aktuelleGliederung);
+        } else if (normKopf.matches() && istNeuerNormKopf(normKopf.group(1), letzteNormNummer)) {
+          normNummer = normKopf.group(1);
+          normTitel = normKopf.group(2).strip();
+          letzteNormNummer = numerisch(normNummer);
+        } else {
+          var kennzahl =
+              (elternKennzahl != null ? elternKennzahl : "000") + "." + unterGliederung.group(1);
+          aktuelleGliederung =
+              new Gliederung(kennzahl, unterGliederung.group(1) + ".", unterGliederung.group(2));
+          gliederungen.add(aktuelleGliederung);
+        }
+        continue;
+      }
+
+      if (normNummer != null) {
+        normZeilen.add(zeilen.get(i));
+      }
+    }
+
+    if (normen.isEmpty()) {
+      throw new IllegalArgumentException(
+          "Kein „Art. N“-Normkopf gefunden — ist das eine konsolidierte Fassung von"
+              + " gesetze-bayern.de?");
+    }
+    return new Gesetz(jurabk != null ? jurabk : langue, langue, null, normen, gliederungen);
+  }
+
+  /** Überspringt die Kopfzeile der Druckfassung samt umbrochenem Rest. */
+  private static int ueberspringeDruckkopf(List<String> zeilen) {
+    int i = 0;
+    while (i < zeilen.size() && zeilen.get(i).isBlank()) {
+      i++;
+    }
+    if (i < zeilen.size() && DRUCKKOPF.matcher(zeilen.get(i).strip()).matches()) {
+      i++;
+      if (i < zeilen.size() && DRUCKKOPF_REST.matcher(zeilen.get(i).strip()).matches()) {
+        i++;
+      }
+    }
+    return i;
+  }
+
+  /**
+   * Ein Normkopf eröffnet nur dann eine neue Norm, wenn seine Nummer hinter der letzten liegt —
+   * das fängt Querverweise ab, die die Negativliste nicht ausschließt.
+   */
+  private static boolean istNeuerNormKopf(String nummer, int letzteNormNummer) {
+    return numerisch(nummer) >= letzteNormNummer;
+  }
+
+  private static int numerisch(String nummer) {
+    return Integer.parseInt(nummer.replaceAll("[a-z]+$", ""));
+  }
+
+  /**
+   * Eine nummerierte Zeile ist eine Unter-Überschrift (keine Aufzählung), wenn ihr Text kurz ist,
+   * großgeschrieben beginnt, nicht mit Satzzeichen endet und die nächste nicht-leere Zeile ein
+   * Normkopf oder eine weitere Überschrift ist.
+   */
+  private static boolean istUnterGliederung(
+      java.util.regex.Matcher unterGliederung, List<String> zeilen, int index) {
+    var titel = unterGliederung.group(2);
+    if (titel.length() > 80
+        || !Character.isUpperCase(titel.codePointAt(0))
+        || titel.matches(".*[.,;:]$")) {
+      return false;
+    }
+    for (int j = index + 1; j < zeilen.size(); j++) {
+      var naechste = zeilen.get(j).strip();
+      if (naechste.isEmpty()) {
+        continue;
+      }
+      return NORM_KOPF.matcher(naechste).matches()
+          || GLIEDERUNG.matcher(naechste).matches()
+          || UNTER_GLIEDERUNG.matcher(naechste).matches();
+    }
+    return false;
+  }
+
+  private static Norm baueNorm(
+      String nummer, @Nullable String titel, @Nullable Gliederung gliederung, List<String> zeilen) {
+    var enbez = "Art. " + nummer;
+    boolean weggefallen = titel != null && WEGGEFALLEN_TITEL.matcher(titel).matches();
+
+    var absaetze = new ArrayList<Absatz>();
+    String absatzNummer = null;
+    var absatzZeilen = new ArrayList<String>();
+    for (var zeile : zeilen) {
+      var gestutzt = zeile.strip();
+      if (gestutzt.isEmpty()) {
+        continue;
+      }
+      var fussnote = FUSSNOTE.matcher(gestutzt);
+      if (fussnote.matches()) {
+        // Fußnoten verbleiben superskript-normalisiert als eigene Zeile im tragenden Absatz.
+        absatzZeilen.add(Superskript.zuSuperskript(fussnote.group(1)) + ") " + fussnote.group(2));
+        continue;
+      }
+      var marker = ABSATZ_MARKER.matcher(gestutzt);
+      if (marker.find()) {
+        if (!absatzZeilen.isEmpty()) {
+          absaetze.add(new Absatz(absatzNummer, String.join("\n", absatzZeilen)));
+          absatzZeilen.clear();
+        }
+        absatzNummer = marker.group(1);
+        absatzZeilen.add(gestutzt.substring(marker.end()));
+      } else {
+        absatzZeilen.add(zeile.stripTrailing());
+      }
+    }
+    if (!absatzZeilen.isEmpty()) {
+      absaetze.add(new Absatz(absatzNummer, String.join("\n", absatzZeilen)));
+    }
+
+    return new Norm(enbez, titel == null || titel.isEmpty() ? null : titel, gliederung, absaetze, weggefallen);
+  }
+}
diff --git a/src/main/resources/sampledata/BayJG/BayJG-alt.txt b/src/main/resources/sampledata/BayJG/BayJG-alt.txt
new file mode 100644
index 0000000..de2ed2e
--- /dev/null
+++ b/src/main/resources/sampledata/BayJG/BayJG-alt.txt
@@ -0,0 +1,570 @@
+Bayerisches Jagdgesetz
+(BayJG)
+Vom 13. Oktober 1978
+(BayRS V S. 595)
+BayRS 792-1-W
+
+I. Abschnitt Grundsätze
+Art. 1  Gesetzeszweck
+
+(1) ¹Die freilebende Tierwelt ist wesentlicher Bestandteil der heimischen Natur. ²Sie ist als Teil des natürlichen Wirkungsgefüges in ihrer Vielfalt zu bewahren.
+(2) Dieses Gesetz soll neben dem Bundesjagdgesetz¹) dazu dienen:
+  1. einen artenreichen und gesunden Wildbestand in einem ausgewogenen Verhältnis zu seinen natürlichen Lebensgrundlagen zu erhalten,
+  2. die natürlichen Lebensgrundlagen des Wildes zu sichern und zu verbessern,
+  3. Beeinträchtigungen einer ordnungsgemäßen land-, forst- und fischereiwirtschaftlichen Nutzung durch das Wild möglichst zu vermeiden, insbesondere soll die Bejagung die natürliche Verjüngung der standortgemäßen Baumarten im Wesentlichen ohne Schutzmaßnahmen ermöglichen,
+  4. die jagdlichen Interessen mit den sonstigen öffentlichen Belangen, insbesondere mit den Belangen der Landeskultur, des Naturschutzes und der Landschaftspflege auszugleichen.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 2  Staatliche Aufsicht und Förderung
+
+(1) Der Staat ordnet und beaufsichtigt das gesamte Jagdwesen und schützt die Jagd als Kulturgut.
+(2) ¹Das Jagdwesen wird aus dem Aufkommen der Jagdabgabe (Art. 26 und 27) gefördert. ²Die Förderung nach anderen Vorschriften und Programmen bleibt unberührt.
+
+II. Abschnitt Jagdreviere, Hegegemeinschaften
+Art. 3  Feststellung der Jagdreviere
+
+Bestand, Umfang und Grenzen eines Jagdreviers (Jagdbezirks) werden, falls erforderlich, durch die Jagdbehörde festgestellt.
+
+Art. 4  Gestaltung der Jagdreviere
+
+(1) ¹Jagdreviere sind durch Abtrennung, Angliederung oder Austausch von Grundflächen abzurunden, wenn Jagdpflege und Jagdausübung dies erfordern. ²Bei der Abrundung soll die Gesamtgröße der Jagdreviere möglichst wenig verändert werden; Möglichkeiten eines Flächenausgleichs sind auszuschöpfen. ³Durch Abrundung darf ein Jagdrevier seine gesetzliche Mindestgröße (Art. 8 Abs. 1, Art. 10 Abs. 1) nicht verlieren.
+(2) ¹Die Abrundung kann durch Vereinbarung der Beteiligten (Jagdgenossenschaft, Eigentümer oder Nutznießer eines Eigenjagdreviers) oder von Amts wegen vorgenommen werden. ²Die Vereinbarung bedarf der Schriftform und der Zustimmung der Jagdbehörde.
+(3) ¹Ist die Ausübung des Jagdrechts auf einer anzugliedernden oder abzutrennenden Grundfläche verpachtet, so darf während der Pachtdauer eine Abrundungsmaßnahme nur mit Zustimmung der Parteien des Jagdpachtvertrags durchgeführt werden. ²Wird der Abrundung nicht zugestimmt, so wird diese erst mit der Beendigung des Jagdpachtverhältnisses der nichtzustimmenden Vertragspartei, bei mehreren nichtzustimmenden Vertragsparteien mit Beendigung des am längsten laufenden Jagdpachtvertrags der nichtzustimmenden Vertragsparteien wirksam. ³Der Zustimmung bedarf es insoweit nicht, als Jagdpachtverträge vor ihrem Ablauf verlängert oder neu abgeschlossen werden und im Zeitpunkt der Verlängerung oder des Neuabschlusses ein Abrundungsverfahren bereits anhängig ist.
+
+Art. 5  Pachtpreisregelung und Entschädigung bei Angliederung von Flächen
+
+(1) Wird eine Grundfläche während der Laufzeit eines Jagdpachtvertrags einem Jagdrevier angegliedert oder von diesem abgetrennt, so erhöht oder ermäßigt sich der Pachtpreis entsprechend der Größe der angegliederten oder abgetrennten Fläche, falls nicht die Beteiligten etwas anderes vereinbaren.
+(2) ¹Wird eine Grundfläche einem Eigenjagdrevier angegliedert, so hat der Eigentümer der Grundfläche gegen den Eigentümer oder Nutznießer des Eigenjagdreviers einen Anspruch auf eine Entschädigung. ²Diese bemißt sich, wenn das Eigenjagdrevier verpachtet ist, nach Absatz 1. ³Ist das Eigenjagdrevier nicht verpachtet, so setzt, wenn sich die Beteiligten über die Höhe der Entschädigung nicht einigen, die Jagdbehörde eine angemessene Entschädigung fest. ⁴Auf das Rechtsverhältnis zwischen dem Eigentümer der Grundflächen und dem Eigentümer oder Nutznießer des Eigenjagdreviers finden im übrigen die Vorschriften des Bürgerlichen Gesetzbuchs²) über die Pacht sinngemäß Anwendung, soweit nichts anderes vereinbart ist.
+²) [Amtl. Anm.:] BGBl. FN 400-2
+
+Art. 6  Befriedete Bezirke; Ruhen der Jagd
+
+(1) Befriedete Bezirke (§ 6 des Bundesjagdgesetzes¹)) sind:
+  1. Gebäude, die zum Aufenthalt von Menschen dienen, und Gebäude, die mit solchen Gebäuden räumlich zusammenhängen,
+  2. Hofräume und Hausgärten, die unmittelbar an eine Behausung im Sinn der Nummer 1 anschließen und durch eine Umfriedung begrenzt sind,
+  3. sonstige überbaute Flächen im Geltungsbereich eines Bebauungsplans und Flächen innerhalb der im Zusammenhang bebauten Ortsteile,
+  4. Friedhöfe,
+  5. Tiergärten.
+(2) ¹Darüber hinaus kann die Jagdbehörde für befriedet erklären:
+  1. sonstige Flächen im Geltungsbereich eines Bebauungsplans mit Ausnahme der in § 9 Abs. 1 Nr. 18 des Bundesbaugesetzes³) genannten Flächen,
+  2. Grundflächen, die gegen das Ein- oder Auswechseln von Wild – ausgenommen Federwild, Wildkaninchen und Raubwild – und gegen unbefugten Zutritt von Menschen dauernd abgeschlossen und deren Eingänge absperrbar sind.
+²Auf Wildgehege (Art. 23 Abs. 1), die jagdlichen Zwecken dienen, und auf Wintergatter (Art. 25) findet Satz 1 keine Anwendung.
+(3) ¹In befriedeten Bezirken kann die Jagdbehörde dem Eigentümer, dem Nutzungsberechtigten, dem Revierinhaber oder deren Beauftragten bestimmte Jagdhandlungen unter Beschränkung auf bestimmte Wildarten und auf eine bestimmte Zeit gestatten. ²Eines Jagdscheins bedarf es nicht. ³Jagdhandlungen mit der Schußwaffe dürfen dem Eigentümer, dem Nutzungsberechtigten oder einem Beauftragten nur gestattet werden, wenn diese im Besitz eines gültigen Jagdscheins oder für den Gebrauch von Schußwaffen im Sinn des § 17 Abs. 1 Nr. 4 des Bundesjagdgesetzes¹) ausreichend versichert sind. ⁴Die waffenrechtlichen Vorschriften bleiben unberührt. ⁵Das Aneignungsrecht hat derjenige, dem oder dessen Beauftragten die Jagdhandlung gestattet wurde.
+(4) ¹Mit Zustimmung der Jagdbehörde kann der Eigentümer oder Nutznießer des Eigenjagdreviers oder die Jagdgenossenschaft die Jagd ruhen lassen. ²Die Zustimmung darf nur erteilt werden, wenn dadurch die Verwirklichung der in Art. 1 Abs. 2 genannten Ziele nicht gefährdet wird.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+³) [Amtl. Anm.:] BGBl. FN 213-1
+
+Art. 7  Verantwortlicher Revierinhaber
+
+(1) ¹Derjenige, dem die Ausübung des Jagdrechts in einem Jagdrevier zusteht (Jagdausübungsberechtigter), ist verpflichtet, dort das Jagdrecht auszuüben. ²Er ist der für die Ausübung des Jagdrechts einschließlich des Jagdschutzes verantwortliche Revierinhaber.
+(2) ¹Ist der Eigentümer oder Nutznießer eines Eigenjagdreviers eine Personenmehrheit, eine juristische Person oder nichtjagdpachtfähig (§ 11 Abs. 5 des Bundesjagdgesetzes¹)), so hat er der Jagdbehörde eine oder mehrere jagdpachtfähige Personen als im Sinn des Absatzes 1 Satz 2 verantwortliche Personen zu benennen, wenn die Jagd nicht durch Verpachtung ausgeübt wird. ²Es dürfen nicht mehr Personen als verantwortlich benannt werden als nach Art. 15 Abs. 1 Jagdpächter sein dürfen.
+(3) Absatz 2 gilt sinngemäß, wenn und solang der Revierinhaber aus Gründen, die in seiner Person liegen, an der Ausübung des Jagdrechts einschließlich des Jagdschutzes längere Zeit verhindert ist.
+(4) Mitpächter oder mehrere für ein Jagdrevier verantwortliche Personen im Sinn des Absatzes 2 haben auf Verlangen der Jagdbehörde einen von ihnen als Bevollmächtigten zu benennen, der gegenüber der Jagdbehörde in allen die Jagdausübung in dem Jagdrevier betreffenden Angelegenheiten zur Abgabe und Entgegennahme von Erklärungen sowie zum Empfang von Urkunden und Sachen berechtigt ist.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 8  Eigenjagdreviere
+
+(1) ¹Die Mindestgröße eines Eigenjagdreviers beträgt 81,755 ha, im Hochgebirge mit seinen Vorbergen 300 ha. ²Grundflächen, die kein Jagdrevier bilden und von mehreren Eigenjagdrevieren umschlossen werden, sind durch die Jagdbehörde einem oder mehreren dieser angrenzenden Jagdreviere anzugliedern; werden sie nur von einem Eigenjagdrevier umschlossen, so sind sie dessen Bestandteil. ³Die Art. 4 Abs. 3, Art. 5 Abs. 2 und Art. 11 Abs. 6 (Angliederungsgenossenschaft) sind entsprechend anzuwenden.
+(2) ¹Eigenjagdreviere können mit Zustimmung der Jagdbehörde in mehrere selbständige Jagdreviere aufgeteilt werden. ²Die Jagdbehörde darf nur zustimmen, wenn jeder Teil für sich die Mindestgröße von 250 ha, im Hochgebirge mit seinen Vorbergen von 500 ha hat, und wenn jedes Teilrevier eine ordnungsgemäße Jagdausübung gestattet.
+
+Art. 9  Staatsjagdreviere
+
+(1) Staatsjagdreviere sind die Eigenjagdreviere des Freistaates Bayern mit den angegliederten und ausschließlich der abgetrennten Grundflächen.
+(2) ¹Der Staat übt das Jagdrecht selbst oder durch Verpachtung aus, soweit nicht der Bayerischen Staatsforsten das Jagdausübungsrecht gemäß Art. 4 Abs. 1 des Staatsforstengesetzes zusteht. ²Übt der Staat das Jagdrecht selbst aus, findet Art. 7 Abs. 2 keine Anwendung.
+(3) Inhaber eines gültigen Jagdscheins können in den nichtverpachteten Staatsjagdrevieren neben dem Personal, durch das der Staat die Jagd ausüben läßt, als Jagdgäste zur Jagdausübung zugelassen werden; Jäger ohne ständige Jagdmöglichkeit auch durch Ausgabe befristeter Jagderlaubnisscheine.
+
+Art. 10  Gemeinschaftsjagdreviere
+
+(1) ¹Die Mindestgröße eines Gemeinschaftsjagdreviers beträgt 250 ha, im Hochgebirge mit seinen Vorbergen 500 ha. ²Befriedete Bezirke zählen bei der Berechnung der Mindestgröße nicht mit.
+(2) ¹Die außerhalb eines Gemeinschaftsjagdreviers liegenden Grundflächen eines Gemeindegebiets oder eines gemeindefreien Gebiets sind durch die Jagdbehörde angrenzenden Jagdrevieren anzugliedern, sofern sie nicht nach § 8 Abs. 2 des Bundesjagdgesetzes¹) zu einem Gemeinschaftsjagdrevier zusammengelegt werden. ²Werden solche Flächen von einem Jagdrevier ganz umschlossen, so sind sie dessen Bestandteil. ³Art. 4 Abs. 3 ist entsprechend anzuwenden.
+(3) Einem Antrag auf Zusammenlegung zusammenhängender Grundflächen zu einem Gemeinschaftsjagdrevier ist unter den Voraussetzungen des § 8 Abs. 2 des Bundesjagdgesetzes stattzugeben, wenn er von der Mehrheit der Grundstückseigentümer jeder der beteiligten Gemeinden gestellt wird und die Antragsteller in ihrer Gemeinde jeweils gemeinsam über mehr als die Hälfte der zusammenhängenden Grundflächen verfügen.
+(4) Die Teilung eines Gemeinschaftsjagdreviers in mehrere selbständige Jagdreviere (§ 8 Abs. 3 des Bundesjagdgesetzes) darf die Jagdbehörde nur zulassen, wenn die Jagdgenossenschaft dies beschlossen hat und jeder Teil für sich die gesetzliche Mindestgröße (Absatz 1) hat und eine ordnungsgemäße Jagdausübung gestattet.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 11  Jagdgenossenschaft
+
+(1) ¹Die Jagdgenossenschaft (§ 9 des Bundesjagdgesetzes¹)) ist eine Körperschaft des öffentlichen Rechts. ²Sie untersteht der staatlichen Aufsicht der Jagdbehörden. ³Diese haben ihr gegenüber die gleichen Befugnisse, wie sie den kommunalen Aufsichtsbehörden gegenüber den Gemeinden in Angelegenheiten des eigenen Wirkungskreises zustehen.
+(2) ¹Die Jagdgenossenschaft hat eine Satzung zu beschließen, die der Genehmigung der Jagdbehörden bedarf. ²Erläßt das Staatsministerium für Wirtschaft, Landesentwicklung und Energie Satzungsmuster, so ist eine Satzung von der Genehmigungspflicht befreit, wenn sie keine oder nur solche Abweichungen enthält, die im Satzungsmuster selbst vorgesehen sind; in diesem Fall soll die Satzung spätestens vier Wochen vor ihrem Inkrafttreten der Jagdbehörde vorgelegt werden. ³Die Satzung ist ortsüblich bekanntzumachen. ⁴Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung Mindestanforderungen für die Satzungen aufzustellen, in denen auch Vorschriften über die Verwaltung des Vermögens der Jagdgenossenschaften enthalten sein sollen. ⁵Kommt die Jagdgenossenschaft der Aufforderung der Jagdbehörde zum Erlaß einer Satzung nicht innerhalb einer ihr gesetzten angemessenen Frist nach, so erläßt die Jagdbehörde eine Satzung für die Jagdgenossenschaft.
+(3) ¹Die Jagdgenossenschaft kann für ihren durch die sonstigen Einnahmen nicht gedeckten Bedarf Umlagen von den Jagdgenossen erheben. ²Die Umlagen können von der Jagdgenossenschaft wie Kommunalabgaben beigetrieben werden.
+(4) Die Kosten der vorübergehenden Geschäftsführung (§ 9 Abs. 2 Satz 3 des Bundesjagdgesetzes) bis zur Wahl des Jagdvorstands trägt die Jagdgenossenschaft.
+(5) Gehören zu einem Gemeinschaftsjagdrevier Flächen verschiedener Gemeinden oder gemeindefreier Gebiete, so nimmt der Bürgermeister der Gemeinde, in deren Gebiet der größte Flächenanteil des Gemeinschaftsjagdreviers liegt, nach § 9 Abs. 2 Satz 3 des Bundesjagdgesetzes bis zur Wahl des Jagdvorstands dessen Geschäfte wahr.
+(6) ¹Besteht die einem Eigenjagdrevier angegliederte Grundfläche aus mehreren selbständigen Grundstücken, die im Eigentum von mehr als 15 Personen stehen, so bilden diese Personen zur Vertretung ihrer Rechte, die sich aus der Angliederung ergeben, eine Jagdgenossenschaft (Angliederungsgenossenschaft). ²Auf die Angliederungsgenossenschaft finden die §§ 9 und 10 Abs. 3 des Bundesjagdgesetzes und die Absätze 1 bis 5 sinngemäß Anwendung.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 12  Jagdnutzung
+
+(1) ¹Die Jagdgenossenschaft kann die Verpachtung insbesondere auf den Kreis der Jagdgenossen (§ 10 Abs. 1 Satz 2 des Bundesjagdgesetzes¹)) oder der jagdpachtfähigen Personen beschränken, die ihre Hauptwohnung in einer bestimmten Höchstentfernung zum Jagdrevier haben. ²Sie kann außerdem ihre Zustimmung zur Weiter- und Unterverpachtung sowie zur Erteilung entgeltlicher Dauerjagderlaubnisscheine (Art. 15 Abs. 2, Art. 17 Abs. 2 Satz 1) davon abhängig machen, daß ortsansässige jagdpachtfähige Personen angemessen berücksichtigt werden. ³Die Inhaber von Dauerjagderlaubnisscheinen sind dem Jagdvorsteher mitzuteilen. ⁴Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung Vorschriften über die Art der Verpachtung von Gemeinschaftsjagdrevieren (z.B. öffentliche Versteigerung, öffentliche Ausbietung, freihändige Vergabe) und das dabei anzuwendende Verfahren zu erlassen.
+(2) Wird die Jagd durch angestellte Jäger ausgeübt, so dürfen nicht mehr Personen angestellt werden, als nach Art. 15 Abs. 1 Jagdpächter sein dürfen.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 13  Aufgaben und räumlicher Wirkungsbereich der Hegegemeinschaften
+
+(1) Die Revierinhaber von zusammenhängenden Jagdrevieren, die einen bestimmten Lebensraum für das Wild umfassen, können eine Hegegemeinschaft bilden, um eine ausgewogene Hege der vorkommenden Wildarten und eine einheitliche großräumige Abschußregelung zu ermöglichen (§ 10a Abs. 1 des Bundesjagdgesetzes).
+(2) ¹Zu den Aufgaben einer Hegegemeinschaft zählen insbesondere
+  1. Hegemaßnahmen in den einzelnen Jagdrevieren abzustimmen und gemeinsam durchzuführen,
+  2. bei der Wildbestandsermittlung mitzuwirken,
+  3. die Abschußplanvorschläge aufeinander abzustimmen,
+  4. auf die Erfüllung der Abschußpläne hinzuwirken.
+²An den Beratungen der Hegegemeinschaften, bei denen sich die Mitglieder auch vertreten lassen können, sind die Jagdvorstände der beteiligten Jagdgenossenschaften und die Inhaber der verpachteten Eigenjagdreviere zu beteiligen. ³Soweit Abschußpläne vom Revierinhaber nicht im Einvernehmen mit dem Jagdvorstand oder dem Inhaber des Eigenjagdreviers aufgestellt worden sind, hat die Hegegemeinschaft auf eine einvernehmliche Abschußplanung hinzuwirken (§ 21 Abs. 2 Sätze 3 und 4 des Bundesjagdgesetzes und Art. 32 Abs. 1 Satz 1 dieses Gesetzes).
+(3) Die Mitglieder der Hegegemeinschaft wählen in der Regel aus dem Kreis der ihr angehörenden Revierinhaber für eine bestimmte Amtszeit einen Vorsitzenden und einen Stellvertreter, die zuverlässig, jagdlich erfahren und mit den Verhältnissen in der Hegegemeinschaft vertraut sein sollen.
+(4) ¹Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung Vorschriften zu erlassen über die Abgrenzung des räumlichen Wirkungsbereichs der Hegegemeinschaften und die Mitwirkung der anerkannten Vereinigungen der Jäger (Art. 51) dazu, ferner über die Abgabe von Empfehlungen der Hegegemeinschaften zur Abschußplanung und ihre Mitwirkung bei der Erfüllung der Abschußpläne. ²Dabei kann die Zuständigkeit für die Abgrenzung des räumlichen Wirkungsbereichs der Hegegemeinschaften auf nachgeordnete Jagdbehörden übertragen werden.
+(5) Beteiligt sich ein Revierinhaber nicht an der Hegegemeinschaft, so gibt der Vorsitzende der Hegegemeinschaft, in deren räumlichen Wirkungsbereich das Jagdrevier liegt, eine Empfehlung zur Abschußplanung ab, die dem Revierinhaber und der Jagdgenossenschaft oder, bei verpachteten Eigenjagdrevieren, dem Inhaber des Eigenjagdreviers sowie der Jagdbehörde zuzuleiten ist.
+
+III. Abschnitt Beteiligung Dritter an der Ausübung des Jagdrechts
+Art. 14  Verpachtung von Teilen eines Jagdreviers; Mindestpachtzeit; Beanstandungsverfahren; Änderung von Jagdpachtverträgen
+
+(1) ¹Die Verpachtung eines Teils eines Jagdreviers bedarf der Zustimmung der Jagdbehörde. ²Die für die Teilung von Jagdrevieren vorgeschriebenen Mindestgrößen gelten entsprechend. ³Die Jagdbehörde darf der Teilverpachtung nur zustimmen, wenn sowohl der verpachtete als auch der verbleibende Teil eine ordnungsgemäße Jagdausübung gestattet. ⁴Die Jagdbehörde kann die Verpachtung eines Teils von geringerer Größe an den Revierinhaber eines angrenzenden Jagdreviers zulassen, wenn dies einer besseren Reviergestaltung dient.
+(2) ¹Die Mindestpachtzeit beträgt für Niederwildreviere neun Jahre, für Hochwildreviere zwölf Jahre. ²Die Jagdbehörde kann im Fall des Absatzes 1 Satz 4 oder für die Aufnahme eines Mitpächters oder sonst, wenn besondere Gründe vorliegen, ausnahmsweise eine kürzere Pachtzeit zulassen.
+(3) Eine juristische Person des öffentlichen Rechts, die Inhaber eines oder mehrerer Eigenjagdreviere ist und Flächen zur Jagdausübung zupachten will, kann Jagdpächter sein.
+(4) ¹Ein Jagdpachtvertrag kann nach § 12 des Bundesjagdgesetzes¹) auch beanstandet werden, wenn im Verfahren bei der Verpachtung von Gemeinschaftsjagdrevieren zwingende Vorschriften der nach Art. 12 Abs. 1 Satz 4 erlassenen Rechtsverordnung verletzt worden sind. ²Das gleiche gilt, wenn zu erwarten ist, daß der Jagdpächter nicht die Gewähr für eine den Zielen des Art. 1 Abs. 2 entsprechende Jagdausübung bietet.
+(5) Die Bestimmungen über den Jagdpachtvertrag gelten sinngemäß für die Änderung oder Verlängerung eines Jagdpachtvertrags.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 15  Mehrzahl von Jagdpächtern
+
+(1) ¹Die Zahl der Jagdpächter wird bei Jagdrevieren mit einem Umfang bis zu 250 ha, im Hochgebirge mit seinen Vorbergen bis zu 500 ha auf zwei beschränkt (Mitpacht); in größeren Jagdrevieren ist für je weitere angefangene 250 ha, im Hochgebirge mit seinen Vorbergen für je weitere angefangene 500 ha ein weiterer Pächter zulässig. ²Bei der Berechnung der nach Satz 1 erforderlichen Reviergrößen bleiben die befriedeten Bezirke außer Betracht.
+(2) ¹Die Bestimmungen über den Jagdpachtvertrag gelten mit Ausnahme des Art. 14 Abs. 2 Satz 1 auch für die Weiter- und Unterverpachtung. ²In diesen Fällen darf die Zahl der jagdausübungsberechtigten Personen die zulässige Zahl der Jagdpächter nach Absatz 1 nicht überschreiten.
+
+Art. 16  Pachthöchstfläche; Eintragung in den Jagdschein
+
+(1) ¹Die Gesamtfläche, auf der einem Jagdpächter die Ausübung des Jagdrechts zusteht, darf im Hochgebirge mit seinen Vorbergen nicht mehr als 2000 ha umfassen (§ 11 Abs. 3 Satz 4 des Bundesjagdgesetzes¹)). ²Bei Anpachtungen im Hochgebirge mit seinen Vorbergen und außerhalb sind die Pachtflächen im Verhältnis zu den zulässigen Pachthöchstflächen aufeinander anzurechnen.
+(2) Auf den vertraglichen Flächenanteil eines Mitpächters (§ 11 Abs. 3 Satz 3 des Bundesjagdgesetzes) ist mindestens die Fläche anzurechnen, die bei Teilung der Fläche des Jagdreviers durch die nach Art. 15 Abs. 1 zulässige Zahl der Jagdpächter auf den einzelnen entfällt.
+(3) ¹Wer die Erteilung oder Verlängerung eines Jahresjagdscheins beantragt, hat dabei schriftlich anzugeben, ob er
+  1. als Inhaber eines Eigenjagdreviers,
+  2. als Jagdpächter oder Unterpächter oder
+  3. als Mitpächter
+in einem Jagdrevier zur Jagdausübung befugt ist und für welche Flächen, im Fall der Nummer 3 die anteilig auf ihn entfallende Fläche (§ 11 Abs. 3 Satz 3 des Bundesjagdgesetzes). ²Die Jagdbehörde kann die Erteilung oder Verlängerung des Jagdscheins aussetzen, bis die Angaben gemacht sind. ³Sie hat die Flächen in den Jagdschein einzutragen. ⁴Sie kann die Vorlage des Jagdpachtvertrags oder sonstige Nachweise verlangen.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 17  Jagderlaubnis
+
+(1) ¹Der Revierinhaber kann einem Dritten (Jagdgast) eine Jagderlaubnis erteilen. ²Diese kann auch beschränkt erteilt werden. ³Bei mehreren Revierinhabern muß die Jagderlaubnis von allen Revierinhabern erteilt werden. ⁴Die Revierinhaber können sich gegenseitig zur Erteilung von Jagderlaubnissen schriftlich bevollmächtigen.
+(2) ¹Auf die entgeltliche Erteilung einer Jagderlaubnis sind § 11 Abs. 4 Satz 1 und Abs. 5, §§ 12 und 13 des Bundesjagdgesetzes¹) und Art. 15 Abs. 1 und Art. 16 dieses Gesetzes entsprechend anzuwenden. ²Dies gilt nicht für eine vorübergehende Überlassung der Jagdausübung.
+(3) Soweit der Jagdgast bei der Jagdausübung nicht von einem Revierinhaber, einem angestellten Jäger oder Jagdaufseher begleitet wird, hat er eine auf seinen Namen lautende schriftliche Jagderlaubnis bei sich zu führen, die er auf Verlangen den Jagdschutzberechtigten (§ 25 des Bundesjagdgesetzes, Art. 40 Abs. 2 und Art. 41) zur Prüfung auszuhändigen hat.
+(4) Der Jagdgast ist nicht Jagdausübungsberechtigter im Sinn des Bundesjagdgesetzes und dieses Gesetzes.
+(5) Angestellte Jäger und Jagdaufseher sind im Rahmen ihres Anstellungsvertrags zur Jagdausübung innerhalb ihres Dienstbereichs berechtigt; sie benötigen dazu keinen Jagderlaubnisschein.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 18  Nichtigkeit von Jagdpachtverträgen und Jagderlaubnisverträgen
+
+¹Ein Vertrag, der gegen die Bestimmungen der Art. 15, Art. 16 Abs. 2 und Art. 17 Abs. 1 und 2 verstößt, ist nichtig. ²Das gleiche gilt für einen Jagdpachtvertrag, der den Vorschriften des Art. 14 Abs. 1 nicht oder wegen Ausscheidens eines Inhabers einer entgeltlichen Jagderlaubnis den Vorschriften des § 11 Abs. 3 des Bundesjagdgesetzes¹) nicht mehr entspricht und dieser Mangel bis zum Beginn des nächsten Jagdjahres nicht behoben wird.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 19  Erlöschen des Jagdpachtvertrags
+
+Ist die Gültigkeitsdauer eines Jagdscheins abgelaufen, so erlischt der Jagdpachtvertrag oder Jagderlaubnisvertrag im Fall des § 13 Satz 2 des Bundesjagdgesetzes¹) nur dann, wenn der Jagdpächter oder Inhaber der entgeltlichen Dauerjagderlaubnis innerhalb einer von der Jagdbehörde gesetzten angemessenen Frist einen Jahresjagdschein nicht beantragt oder sonstige Voraussetzungen dafür nicht erfüllt.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 20  Tod des Jagdpächters
+
+¹Ist beim Tod des Jagdpächters der Erbe nichtjagdpachtfähig (§ 11 Abs. 5 des Bundesjagdgesetzes¹)) oder sind mehrere Erben vorhanden, so sind der Jagdbehörde eine oder mehrere jagdpachtfähige Personen als verantwortlich im Sinn des Art. 7 Abs. 1 Satz 2 zu benennen. ²Es dürfen nicht mehr Personen als verantwortlich benannt werden, als nach Art. 15 Abs. 1 Jagdpächter sein dürfen.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+IV. Abschnitt Schutz des Wildes und seiner Lebensräume
+Art. 21  Wildschutzgebiete
+
+(1) ¹Flächen, die zum Schutz und zur Erhaltung von Wildarten, zur Wildschadensverhütung oder für die Wildforschung von besonderer Bedeutung sind, können zu Wildschutzgebieten erklärt werden. ²Das gilt insbesondere für Flächen, auf denen sich das Wild zum Brüten, Setzen oder zur Rast bevorzugt aufzuhalten pflegt, sowie für Bereiche, in denen es gefüttert werden muß.
+(2) ¹In Wildschutzgebieten kann das Betreten von Flächen und nichtöffentlichen Wegen zeitweise, insbesondere während der Fortpflanzungs-, Aufzucht- und Mauserzeiten verboten oder beschränkt werden, soweit es der Schutzzweck erfordert. ²Die ordnungsgemäße land-, forst- und fischereiwirtschaftliche Bodennutzung bleibt grundsätzlich unberührt.
+(3) ¹Wildschutzgebiete und die zur Erreichung des Schutzzwecks erforderlichen Gebote und Verbote werden durch Rechtsverordnung der unteren Jagdbehörde im Benehmen mit der unteren Naturschutzbehörde festgelegt. ²Vor Erlaß der Rechtsverordnung sind die betroffenen Eigentümer oder sonstigen Berechtigten zu hören. ³Art. 46 Abs. 1, 2, 4 und 5 und Art. 47 des Bayerischen Naturschutzgesetzes⁴) sind sinngemäß anzuwenden.
+(4) Die untere Jagdbehörde kann ferner durch Rechtsverordnung oder Einzelanordnung das Betreten von Teilen der freien Natur im erforderlichen Umfang zum Schutz der dem Wild als Nahrungsquellen, Aufzucht-, Brut- und Nistgelegenheiten dienenden Lebensbereiche (Biotope) sowie zur Durchführung der Wildfütterung in Notzeiten und von Gesellschaftsjagden vorübergehend untersagen oder beschränken.
+⁴) [Amtl. Anm.:] BayRS 791-1-U
+
+Art. 22  Schutz der Nist-, Brut- und Zufluchtstätten des Wildes
+
+(1) ¹Der Revierinhaber ist befugt, mit Genehmigung der Jagdbehörde Bild- und Schrifttafeln anzubringen, die auf die nach § 19a Satz 1 des Bundesjagdgesetzes¹) geschützten Zuflucht-, Nist-, Brut- und Wohnstätten des Wildes sowie auf die Folgen eines Verstoßes gegen diese Vorschrift (§ 39 Abs. 1 Nr. 5 des Bundesjagdgesetzes) hinweisen. ²Durch die Hinweistafeln darf das Landschaftsbild nicht verunstaltet werden.
+(2) ¹Das Verbot des § 19a Satz 1 des Bundesjagdgesetzes steht einer ordnungsgemäßen land- und forstwirtschaftlichen Bodennutzung sowie der rechtmäßigen Ausübung der Jagd und Fischerei nicht entgegen. ²Von dem Verbot kann ferner in Einzelfällen zu wissenschaftlichen Zwecken, Lehr- und Forschungszwecken Befreiung erteilt werden.
+(3) ¹Verboten ist, die Nester und Gelege des Federwildes zu beschädigen, wegzunehmen oder zu zerstören. ²Art. 33 Abs. 5 Nr. 1 bleibt unberührt.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 22a  Schutz kranken und verletzten Wildes
+
+Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung im Rahmen des § 36 Abs. 2 Nr. 2 und Abs. 3 des Bundesjagdgesetzes¹) Vorschriften über das Aufnehmen, die Pflege und die Aufzucht verletzten oder kranken Wildes und dessen Verbleib zu erlassen; diese Vorschriften können sich auch auf Eier oder sonstige Entwicklungsformen solchen Wildes erstrecken.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 23  Wildgehege
+
+(1) Wildgehege sind vollständig eingefriedete Grundflächen, auf denen überwiegend sonst wildlebende Tiere, die dem Jagdrecht unterliegen, dauernd oder vorübergehend gehalten oder zu Jagdzwecken gehegt werden.
+(2) ¹Die Errichtung, die Erweiterung und der Betrieb von Wildgehegen, in denen Wild zu Jagdzwecken gehegt wird, sind genehmigungspflichtig; für sonstige Wildgehege gilt dies ab einer Mindestgröße von 10 ha. ²Die Genehmigung erteilt die Jagdbehörde. ³Diese entscheidet insoweit auch als untere Naturschutzbehörde über die Voraussetzungen des Art. 20a des Bayerischen Naturschutzgesetzes⁴). ⁴Die Genehmigung wird durch eine nach anderen Vorschriften zugleich erforderliche behördliche Gestattung ersetzt; ist die zuständige Behörde nicht zugleich Jagdbehörde und Naturschutzbehörde, so entscheidet sie im Einvernehmen mit diesen Behörden.
+(3) ¹Die Genehmigung darf nur erteilt werden, wenn
+  1. durch das Wildgehege der Lebensraum der Wildarten außerhalb desselben nicht in unangemessener Weise eingeschränkt wird,
+  2. die Jagdausübung nicht wesentlich beeinträchtigt wird und
+  3. das Wildgehege so gesichert ist, daß die Tiere nicht entweichen können.
+²Die Errichtung von Wildgehegen, in denen Wild zu Jagdzwecken gehegt wird, darf außerdem nur genehmigt werden, wenn diese zusammenhängend mindestens die Größe eines Eigenjagdreviers haben und ihre Flächen im Eigentum einer Person oder einer Personengemeinschaft stehen.
+(4) ¹Die Genehmigung ist für bestimmte Tierarten zu erteilen. ²Sie kann mit Nebenbestimmungen versehen werden. ³Die Jagdbehörde kann auch nachträglich Auflagen anordnen. ⁴Sie kann insbesondere die Höchstzahlen der zu haltenden Tiere bestimmen. ⁵Das Beseitigungsverfahren richtet sich nach Art. 76 Sätze 1 und 3 der Bayerischen Bauordnung (BayBO)⁵).
+(5) ¹Wildgehege, die bei Inkrafttreten des Gesetzes bereits bestehen, sind innerhalb von drei Monaten nach Inkrafttreten dieses Gesetzes bei der Jagdbehörde anzuzeigen. ²Die Genehmigung gilt als erteilt, wenn das Wildgehege nach anderen gesetzlichen Bestimmungen genehmigt worden ist oder die Jagdbehörde nicht binnen drei Monaten nach Eingang der Anzeige die Genehmigung versagt; mit der Versagung der Genehmigung kann die Beseitigung des Wildgeheges nach Art. 76 Sätze 1 und 3 BayBO angeordnet werden. ³Soweit diese Maßnahmen enteignend wirken, ist den Betroffenen Entschädigung nach den Vorschriften des Bayerischen Gesetzes über die entschädigungspflichtige Enteignung⁶) zu gewähren. ⁴Entschädigungspflichtig ist der Freistaat Bayern. ⁵Zuständig für die Festsetzung der Entschädigung ist die Kreisverwaltungsbehörde.
+(6) ¹Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung Vorschriften über die Registrierung und die Regulierung der Tierbestände in Wildgehegen sowie über die Gestaltung der Gehegeanlagen zu erlassen. ²Die Rechtsverordnung ergeht im Einvernehmen mit dem Staatsministerium für Umwelt und Verbraucherschutz, soweit sie die Gestaltung der Gehegeanlagen betrifft.
+⁴) [Amtl. Anm.:] BayRS 791-1-U
+⁵) [Amtl. Anm.:] BayRS 2132-1-I
+⁶) [Amtl. Anm.:] BayRS 2141-1-I
+
+Art. 24  Wildpark
+
+(1) ¹Wildgehege, in denen Schalenwild zu Jagdzwecken gehegt und durch Jagdhandlungen genutzt wird, können als Wildpark (§ 20 Abs. 2 des Bundesjagdgesetzes¹)) anerkannt werden. ²Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, die Voraussetzungen der Anerkennung durch Rechtsverordnung zu regeln.
+(2) Die Bezeichnung „Wildpark“ darf nur für die nach Absatz 1 Satz 1 anerkannten Wildgehege verwendet werden.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 25  Wintergatter
+
+¹Wintergatter sind Wildgehege, in denen Rotwild zur Vermeidung übermäßiger Wildschäden während der Notzeit zur Fütterung gehalten wird. ²Auf sie finden die Vorschriften des Art. 23 Abs. 2 Satz 1 Halbsatz 1, Sätze 2 bis 4, Abs. 4 Sätze 2, 3 und 5 und Abs. 5 Anwendung. ³Die Genehmigung darf im übrigen nur erteilt werden, wenn der Verfügungsberechtigte dem Vorhaben zugestimmt hat.
+
+V. Abschnitt Förderung des Jagdwesens
+Art. 26  Mittel und Gegenstand der Förderung
+
+(1) ¹Mit der Gebühr für den Jagdschein wird vom Jagdscheininhaber eine Jagdabgabe erhoben, die vom Staatsministerium für Wirtschaft, Landesentwicklung und Energie zur Förderung des Jagdwesens zu verwenden ist. ²Gefördert sollen insbesondere werden:
+  1. Maßnahmen zur Erhaltung und Verbesserung der Lebensgrundlagen des Wildes,
+  2. Erforschung der Lebens- und Umweltbedingungen der Wildarten,
+  3. Erforschung von Möglichkeiten zur Verhütung und Verhinderung von Wildschäden in der Land-, Forst- und Fischereiwirtschaft,
+  4. das Berufsjägerwesen,
+  5. die Errichtung und der Betrieb von Muster- und Lehrrevieren sowie sonstige Maßnahmen und Einrichtungen zur Information und Aus- und Fortbildung der Jäger, der Jagdvorsteher sowie der für den Vollzug der jagdrechtlichen Vorschriften zuständigen Organe.
+(2) ¹Die Höhe der Jagdabgabe beträgt für den Tagesjagdschein und den Einjahresjagdschein die Hälfte der Jagdscheingebühr. ²Für den Dreijahresjagdschein wird der dreifache Betrag der Jagdabgabe für den Einjahresjagdschein erhoben.
+
+Art. 27  Verfahren
+
+¹Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie entscheidet über die Verteilung der für Zwecke der Forschung und für sonstige zentrale Zwecke zu verwendenden Anteile der Jagdabgabe im Benehmen mit den anerkannten Vereinigungen der Jäger (Art. 51). ²Es stellt das verbleibende Aufkommen dem Landesjagdverband Bayern e.V. für die Förderung der Jagd zur Verfügung; der Haushalt des Landesjagdverbands Bayern e.V. unterliegt insoweit der Genehmigung des Staatsministeriums für Wirtschaft, Landesentwicklung und Energie. ³Bei der Festlegung der Förderanteile nach den Sätzen 1 und 2 ist der Jagdbeirat der obersten Jagdbehörde anzuhören.
+
+VI. Abschnitt Jagdausübung
+Art. 28  Jägerprüfung, Falknerprüfung, Jagdschein
+
+(1) ¹Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung eine Prüfungsordnung für die Jäger- und Falknerprüfung zu erlassen. ²In der Prüfungsordnung sind insbesondere die Zulassungsvoraussetzungen, die Grundsätze des Prüfungsverfahrens, die Prüfungsorgane, die Prüfungsanforderungen und die Prüfungsfächer festzulegen. ³Ferner können Bestimmungen über die Ausbildung der Prüfungsbewerber und über der Jägerprüfung gleichgestellte Prüfungen getroffen werden. ⁴Es ist weiter festzulegen, daß die erforderlichen Kenntnisse für die Jagd mit Fallen durch Teilnahme an einem Lehrgang nachzuweisen sind; auf diesen Nachweis kann verzichtet werden, wenn der Prüfungsbewerber bei der Anmeldung zur Jägerprüfung die Erklärung abgibt, auf die Ausübung der Fallenjagd zu verzichten; der Verzicht kann widerrufen werden, wenn die Teilnahme an einem Lehrgang zu einem späteren Zeitpunkt nachgeholt wird. ⁵Soweit die Rechtsverordnung nach Satz 1 Belange des Lebensmittelrechts (Wildbrethygiene), des Tierschutzrechts sowie des Naturschutz- und Landschaftspflegerechts betrifft, ergeht sie im Benehmen mit dem Staatsministerium für Umwelt und Verbraucherschutz.
+(2) Der Jahresjagdschein wird als Einjahresjagdschein und als Dreijahresjagdschein erteilt.
+(3) ¹Die Erteilung des Jagdscheins ist von dem Nachweis einer ausreichenden Jagdhaftpflichtversicherung (§ 17 Abs. 1 Nr. 4 des Bundesjagdgesetzes) abhängig zu machen. ²Besteht keine ausreichende Versicherung, so ist ein erteilter Jagdschein unverzüglich der zuständigen Jagdbehörde abzuliefern. ³Erfährt diese auf andere Weise, daß keine ausreichende Versicherung besteht, so hat sie den Jagdschein unverzüglich nach § 18 Satz 1 des Bundesjagdgesetzes für ungültig zu erklären und einzuziehen. ⁴Zuständige Stelle im Sinn des § 158c Abs. 2 des Gesetzes über den Versicherungsvertrag ist die für den Entzug des Jagdscheins zuständige Jagdbehörde. ⁵Kennt der Versicherer diese nicht, so ist die Anzeige an die Jagdbehörde zu richten, die den Jagdschein erteilt hat.
+
+Art. 29  Sachliche Gebote und Verbote
+
+(1) Auf krankgeschossenes Wild ist zeitgerecht und fachgemäß nachzusuchen.
+(2) Verboten ist – in Ergänzung zu § 19 des Bundesjagdgesetzes¹) –
+  1. Wild, insbesondere zur Abrichtung und Prüfung von Jagdhunden, absichtlich krankzuschießen,
+  2. die Jagd auf Wild mit Fanggeräten oder Fangvorrichtungen auszuüben; dies gilt vorbehaltlich des Art. 29a nicht für die Jagd auf Raubwild und Wildkaninchen,
+  3. die Jagd auf sonstiges Haarwild, mit Ausnahme von Schwarzwild und Raubwild, zur Nachtzeit (§ 19 Abs. 1 Nr. 4 des Bundesjagdgesetzes) auszuüben,
+  4. die Jagd auf Schalenwild, mit Ausnahme von Schwarzwild, als Treibjagd auszuüben,
+  5. das Wild durch Lappen oder sonstige Mittel zu hindern, aus seinen oder in seine Tageseinstände zu wechseln,
+  6. auf Wild, das durch Überflutungen, Lawinen oder sonstige Naturkatastrophen in Not geraten oder zum Verlassen der Einstände gezwungen worden ist, die Jagd auszuüben; dies gilt nicht, soweit die Not des Wildes nur durch Erlegung beendet werden kann,
+  7. die Jagd unter Verwendung von Betäubungs- oder Lähmungsmitteln, Sprengstoffen, Gasen oder von Schußwaffen mit Schalldämpfern auszuüben,
+  8. Wild aus Luftfahrzeugen, Kraftfahrzeugen oder maschinengetriebenen Wasserfahrzeugen zu beschießen; das Verbot umfasst nicht das Beschießen von Wild aus Kraftfahrzeugen durch Körperbehinderte mit Erlaubnis der Jagdbehörde.
+(3) Die Jagdbehörde kann Ausnahmen zulassen
+  1. in besonderen Einzelfällen, insbesondere zur Durchführung von Hegemaßnahmen oder zu wissenschaftlichen Zwecken, von dem Verbot des Absatzes 2 Nr. 2, soweit es sich nicht um die Verwendung von Schlagfallen (Art. 29a) handelt,
+  2. in begründeten Einzelfällen von den Verboten der Verwendung von Betäubungs- oder Lähmungsmittel oder von Schusswaffen mit Schalldämpfern (Abs. 2 Nr. 7),
+  3. von dem Verbot des § 19 Abs. 1 Nr. 4 des Bundesjagdgesetzes für die Nachtjagd auf Rotwild, soweit es die Landeskultur erfordert.
+(4) Das Verbot des § 19 Abs. 1 Nr. 10 des Bundesjagdgesetzes gilt nicht für Kirrungen.
+(5) ¹Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung die Verbote des § 19 Abs. 1 des Bundesjagdgesetzes¹), mit Ausnahme der Nummer 16, zu erweitern oder aus besonderen Gründen, insbesondere aus Gründen der Wildseuchenbekämpfung und Landeskultur, zur Beseitigung kranken oder kümmernden Wildes, zur Vermeidung von übermäßigen Wildschäden, zu wissenschaftlichen Zwecken, Lehr- und Forschungszwecken oder bei Störung des biologischen Gleichgewichts einzuschränken; soweit Federwild betroffen ist, ist die Einschränkung nur aus den in Art. 9 Abs. 1 der Richtlinie 79/409/EWG genannten Gründen und nach den in Art. 9 Abs. 2 dieser Richtlinie genannten Maßgaben zulässig. ²Unter den gleichen Voraussetzungen kann die Jagdbehörde die Verbote auch durch Einzelanordnung einschränken. ³Die tierseuchenrechtlichen Vorschriften bleiben unberührt.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 29a  Jagd mit Fallen
+
+(1) ¹Die verwendeten Fallen müssen ihrer Bauart nach Mindestanforderungen erfüllen, die ein sofortiges Töten oder einen unversehrten Lebendfang gewährleisten. ²Fangeisen dürfen nur verwendet werden, wenn zusätzlich
+  1. ihre Betriebssicherheit regelmäßig überprüft wird und
+  2. sie dauerhaft so gekennzeichnet sind, daß ihr Besitzer feststellbar ist.
+(2) ¹Fangeisen dürfen nur in geschlossenen Räumen, Fangbunkern oder Fanggärten, in denen die Schlagfalle nach oben verblendet ist, so aufgestellt werden, daß von ihnen keine Gefährdung von Menschen, geschützten Tieren und Haustieren ausgeht. ²Art. 42 Abs. 1 Nr. 2 bleibt unberührt.
+(3) Die Verwendung von Schlagfallen ist der Jagdbehörde anzuzeigen.
+(4) ¹Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, im Einvernehmen mit dem Staatsministerium für Umwelt und Verbraucherschutz das Nähere durch Rechtsverordnung zu regeln. ²Mit der Durchführung der Lehrgänge (Art. 28 Abs. 1 Satz 4), der Überprüfung der Fangeisen auf ihre Betriebssicherheit, ihrer Kennzeichnung und Registrierung (Absatz 1 Satz 2 Nrn. 1 und 2) kann der Landesjagdverband Bayern e. V. betraut werden; in diesem Fall hat der Landesjagdverband Bayern e. V. oder dessen zuständige Kreisgruppe der Jagdbehörde auf Verlangen die Ergebnisse der Funktionsprüfung sowie die Namen und Anschriften der Besitzer der gekennzeichneten Fangeisen mitzuteilen.
+
+Art. 30  Treibjagd, Gesellschaftsjagd
+
+(1) Treibjagd ist die Jagd, an der neben Schützen mehr als vier Personen als Treiber und Abwehrer teilnehmen.
+(2) Gesellschaftsjagd ist die Jagd, an der mehr als vier Personen teilnehmen.
+
+Art. 31  Örtliche Beschränkungen
+
+(1) ¹Die Ausübung der Jagd in Nationalparken wird durch Rechtsverordnung nach Art. 8 Abs. 4 des Bayerischen Naturschutzgesetzes⁴), in Naturschutzgebieten durch Rechtsverordnung nach den Art. 7 und 45 des Bayerischen Naturschutzgesetzes geregelt. ²Vorschriften über die Ausübung der Jagd in Wildparken erläßt das Staatsministerium für Wirtschaft, Landesentwicklung und Energie durch Rechtsverordnung (§ 20 Abs. 2 des Bundesjagdgesetzes¹)).
+(2) ¹In Wintergattern (Art. 25) darf Schalenwild, ausgenommen krankes und kümmerndes Wild, nicht erlegt werden. ²Ausnahmen können zugelassen werden, wenn dies mit Rücksicht auf das allgemeine Wohl, insbesondere auf die Interessen der Land- und Forstwirtschaft und die Belange des Naturschutzes und der Landschaftspflege notwendig ist.
+(3) Die höhere Jagdbehörde kann die Bejagung von Wildarten, die in ihrem Bestand bedroht erscheinen, in bestimmten Gebieten oder in bestimmten Jagdrevieren durch Rechtsverordnung oder durch Anordnung für den Einzelfall dauernd oder zeitweise gänzlich verbieten (§ 21 Abs. 3 des Bundesjagdgesetzes).
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+⁴) [Amtl. Anm.:] BayRS 791-1-U
+
+Art. 32  Regelung der Bejagung
+
+(1) ¹Der Abschußplan (§ 21 Abs. 2 des Bundesjagdgesetzes¹)) ist für den Zeitraum von ein bis drei Jahren zahlenmäßig getrennt nach Wildart und Geschlecht vom Revierinhaber im Einvernehmen mit dem Jagdvorstand, bei verpachteten Eigenjagdrevieren im Einvernehmen mit dem Jagdberechtigten aufzustellen und von der Jagdbehörde im Einvernehmen mit dem Jagdbeirat (Art. 50 Abs. 2 und 6) zu bestätigen oder festzusetzen. ²Bei der Abschußplanung ist neben der körperlichen Verfassung des Wildes vorrangig der Zustand der Vegetation, insbesondere der Waldverjüngung zu berücksichtigen. ³Den zuständigen Forstbehörden ist vorher Gelegenheit zu geben, sich auf der Grundlage eines forstlichen Gutachtens über eingetretene Wildschäden an forstlich genutzten Grundstücken zu äußern und ihre Auffassung zur Situation der Waldverjüngung darzulegen. ⁴Ist zwischen der Jagdbehörde und dem Jagdbeirat ein Einvernehmen nicht zu erzielen, so entscheidet die nächsthöhere Jagdbehörde.
+(2) ¹Der Revierinhaber ist verpflichtet, den Abschußplan für Schalenwild notfalls unter Hinzuziehung anderer Jagdscheininhaber zu erfüllen. ²Die Jagdbehörde trifft die zur Erfüllung des Abschußplans erforderlichen Anordnungen. ³Die Vorschrift des § 27 Abs. 2 des Bundesjagdgesetzes findet entsprechende Anwendung; Art. 32 Satz 2 des Bayerischen Verwaltungszustellungs- und Vollstreckungsgesetzes gilt nicht. ⁴Ein für den Fall der nicht ordnungsgemäßen Erfüllung des Abschußplans angedrohtes Zwangsgeld kann auch beigetrieben werden, wenn nach Ablauf der Jagdzeit feststeht, daß der Abschußplan nicht mehr erfüllt werden kann.
+(3) ¹Anordnungen nach Absatz 2 Satz 2 ergehen im Fall des Art. 7 Abs. 4 an den Bevollmächtigten, der auf die Erfüllung des Abschußplans durch die Mitpächter oder die verantwortlichen Personen im Sinn des Art. 7 Abs. 2 hinzuwirken hat. ²Handlungen des Bevollmächtigten, die zur Erfüllung des Abschußplans erforderlich sind, haben die übrigen Mitpächter oder verantwortlichen Personen zu dulden.
+(4) ¹Über erlegtes und verendetes Schalenwild mit Ausnahme des vor Beginn seiner Jagdzeit gefallenen Jungwildes ist
+  1. der Jagdbehörde eine schriftliche Abschußmeldung zu erstatten und
+  2. eine Streckenliste zu führen, die der Jagdbehörde auf Verlangen jederzeit vorzulegen ist.
+²Die Jagdbehörde kann vom Revierinhaber verlangen, ihr oder einem von ihr Beauftragten das erlegte Wild oder Teile desselben vorzulegen.
+(5) ¹Die Erlegung von krankem Wild außerhalb der Jagdzeiten sowie innerhalb der Jagdzeiten über den Abschußplan hinaus ist der Jagdbehörde unter Angabe der Art der Erkrankung oder Verletzung unverzüglich mitzuteilen. ²Auf Verlangen ist das erlegte Wild der Jagdbehörde oder einem von ihr Beauftragten vorzuzeigen.
+(6) ¹Für bestimmte Jagdreviere können zu wissenschaftlichen Zwecken, Lehr- und Forschungszwecken durch Einzelanordnung Ausnahmen von den Vorschriften über die Hege und Bejagung, insbesondere die zulässige Wilddichte zugelassen werden. ²Die Ausnahme darf nur erteilt werden, wenn dadurch weder eine Störung des biologischen Gleichgewichts noch eine Schädigung der Landeskultur zu befürchten ist und wenn der Revierinhaber und der Jagdberechtigte oder die Jagdgenossenschaft zugestimmt haben. ³Die Zustimmung ist unwiderruflich.
+(7) Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung
+  1. nähere Vorschriften über die Abschußplanung sowie über die Bestätigung und Festsetzung der Abschußpläne, ferner über die Überwachung ihrer Durchführung und über die Erzwingung ihrer Erfüllung zu erlassen (§ 21 Abs. 2 Satz 7 des Bundesjagdgesetzes),
+  2. Vorschriften über die Erhebung von Daten über die Revierverhältnisse und das erlegte Wild, ferner über die Erhebung des Bestands der Wildarten sowie der Abschuß- und Fangergebnisse zu erlassen,
+  3. Gebiete für die Hege und Bejagung von Schalenwild festzulegen, diese Gebiete in Bezirke zu unterteilen, ferner die Jagd- und Forstbehörden zu bestimmen, die für die Abschußplanung in diesen Gebieten zuständig sind und erforderlichenfalls gemeinsame Jagdbeiräte vorzusehen.
+(8) Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie kann Richtlinien für die Hege und Bejagung des Wildes erlassen.
+(9) Ohne Abschußplan bejagt werden darf Schalenwild in Gebieten, in denen die Hege auf Grund einer Verordnung nach Absatz 7 Nr. 3 untersagt ist.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 33  Jagd- und Schonzeiten
+
+(1) Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung
+  1. Tierarten, die in § 2 Abs. 1 des Bundesjagdgesetzes¹) nicht genannt sind, dem Jagdrecht zu unterstellen und für diese Tierarten Jagdzeiten festzusetzen,
+  2. gemäß § 22 Abs. 1 Satz 3 des Bundesjagdgesetzes die Jagdzeiten abzukürzen oder aufzuheben,
+(2) Rechtsverordnungen nach Absatz 1 Nr. 1 ergehen im Einvernehmen mit dem Staatsministerium für Umwelt und Verbraucherschutz.
+(3) Die höhere Jagdbehörde wird ermächtigt, durch Rechtsverordnung
+  1. gemäß § 22 Abs. 1 Satz 3 des Bundesjagdgesetzes für bestimmte Gebiete oder für einzelne Jagdreviere aus besonderen Gründen, insbesondere aus Gründen der Wildseuchenbekämpfung und Landeskultur, zur Beseitigung kranken und kümmernden Wildes, zur Vermeidung von übermäßigen Wildschäden, zu wissenschaftlichen Zwecken, Lehr- und Forschungszwecken, bei Störung des biologischen Gleichgewichts oder der Wildhege die Schonzeiten aufzuheben,
+  2. gemäß § 22 Abs. 2 Satz 2 des Bundesjagdgesetzes bei Störung des biologischen Gleichgewichts oder bei schwerer Schädigung der Landeskultur Jagdzeiten festzusetzen,
+  3. gemäß § 22 Abs. 3 des Bundesjagdgesetzes aus Gründen der Landeskultur Schonzeiten für Wild gänzlich zu versagen,
+  4. gemäß § 22 Abs. 4 Satz 2 des Bundesjagdgesetzes Ausnahmen von dem Jagdverbot in den Setz- und Brutzeiten für Schwarzwild, Wildkaninchen, Fuchs, Ringel- und Türkentaube, Silber- und Lachmöwe sowie für die nach Landesrecht dem Jagdrecht unterstellten Tierarten zu bestimmen,
+  5. abweichend von § 22 Abs. 4 Satz 4 des Bundesjagdgesetzes unter Beachtung der in Art. 9 Abs. 2 der Richtlinie 2009/147/EG genannten Maßgaben das Ausnehmen oder Unfruchtbarmachen der Gelege von Federwild aus den in Art. 9 Abs. 1 der Richtlinie 2009/147/EG genannten Gründen zu gestatten, sofern es keine andere zufriedenstellende Lösung gibt.
+(4) ¹Rechtsverordnungen nach Absatz 3 werden, wenn eine landeseinheitliche Regelung erforderlich oder zweckmäßig ist, vom Staatsministerium für Wirtschaft, Landesentwicklung und Energie erlassen. ²Solche Rechtsverordnungen setzen entgegenstehende oder inhaltsgleiche Vorschriften der nachgeordneten Jagdbehörden außer Kraft. ³Haben solche Rechtsverordnungen die Bekämpfung von Wildseuchen zum Gegenstand, so ist das Staatsministerium für Umwelt und Verbraucherschutz zu beteiligen.
+(5) Die Jagdbehörde kann
+  1. in Einzelfällen für den Lebendfang von Wild Ausnahmen nach § 22 Abs. 1 Satz 4 des Bundesjagdgesetzes und zu wissenschaftlichen, Lehr- und Forschungszwecken oder für Zwecke der Aufzucht und Wiedereinsetzung Ausnahmen nach § 22 Abs. 4 Satz 5 des Bundesjagdgesetzes zulassen und das Sammeln der Eier von Ringel- und Türkentauben sowie von Silber- und Lachmöwen nach § 22 Abs. 4 Satz 6 des Bundesjagdgesetzes erlauben,
+  2. Regelungen nach Abs. 3 Nr. 1, 2 und 5 auch durch Einzelanordnung treffen und gemäß § 22 Abs. 2 Satz 2 des Bundesjagdgesetzes Ausnahmen zulassen,
+  3. gemäß § 22 Abs. 4 Satz 3 des Bundesjagdgesetzes im Einzelfall das Aushorsten von Nestlingen und Ästlingen der Habichte für Beizzwecke genehmigen.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 34  Aussetzen von Tierarten
+
+(1) Als fremd im Sinn des § 28 Abs. 3 des Bundesjagdgesetzes¹) gelten Tierarten, die im Geltungsbereich des Bundesjagdgesetzes bei dessen Inkrafttreten (1. April 1953) freilebend nicht heimisch waren.
+(2) ¹Das Aussetzen oder das Ansiedeln fremder Tierarten in der freien Natur ist nur mit vorheriger schriftlicher Genehmigung der Jagdbehörde zulässig. ²Die Genehmigung darf nur erteilt werden, wenn durch das Aussetzen oder das Ansiedeln eine Störung des biologischen Gleichgewichts oder eine Schädigung der Landeskultur oder Gefahren für die öffentliche Sicherheit nicht zu befürchten sind.
+(3) Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung das Hegen oder Aussetzen weiterer Tierarten im Sinn von § 28 Abs. 4 des Bundesjagdgesetzes, die dem Jagdrecht unterliegen, aus den in Absatz 2 Satz 2 genannten Gründen zu beschränken oder zu verbieten.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 35  Wegerecht
+
+(1) ¹Wer die Jagd ausübt, aber zum Jagdrevier nicht auf einem zum allgemeinen Gebrauch bestimmten Weg oder nur auf einem unzumutbaren Weg gelangen kann, ist zum Betreten fremder Jagdreviere in Jagdausrüstung auch auf einem nicht zum allgemeinen Gebrauch bestimmten Weg (Jägernotweg) befugt, der notfalls durch die Jagdbehörde bestimmt wird. ²Der Eigentümer des Grundstücks, über das der Jägernotweg führt, kann eine angemessene Entschädigung verlangen, die auf Antrag der Beteiligten durch die Jagdbehörde festgesetzt wird.
+(2) Bei Benutzung des Jägernotwegs dürfen Langwaffen nur ungeladen und Hunde nur angeleint mitgeführt werden.
+
+Art. 36  Jagdeinrichtungen
+
+¹Der Revierinhaber darf auf land- oder forstwirtschaftlich genutzten Grundstücken besondere, das Eigentum wesentlich beeinträchtigende Anlagen nur mit Einwilligung des Grundstückseigentümers oder Nutzungsberechtigten errichten; die Einwilligung kann durch die Jagdbehörde ersetzt werden, wenn dem Eigentümer des Grundstücks die Duldung der Anlage unter Berücksichtigung der jagdlichen Erfordernisse zumutbar ist. ²Der Eigentümer des Grundstücks kann eine angemessene Entschädigung verlangen, die auf Antrag eines der Beteiligten durch die Jagdbehörde festgesetzt wird.
+
+Art. 37  Wildfolge
+
+(1) ¹Wechselt krankgeschossenes Wild in ein benachbartes Revier, so hat der Jagdausübende den Anschuß und die Stelle des Überwechselns nach Möglichkeit kenntlich zu machen. ²Außerdem hat er das Überwechseln dem Inhaber des Nachbarreviers oder dessen Vertreter unverzüglich anzuzeigen; das gilt auch für Wild, das aufgrund anderer Ursachen schwer krank oder verletzt ist. ³Für die Nachsuche hat er sich selbst oder eine mit den Vorgängen vertraute Person zur Verfügung zu stellen.
+(2) Ist der Schütze ein Jagdgast, so ist neben diesem auch der Revierinhaber, wenn er vom Überwechseln des krankgeschossenen Wildes Kenntnis erhält, zur Anzeige verpflichtet.
+(3) ¹Wechselt krankgeschossenes Wild über die Grenze und ist es für einen sicheren Schuß erreichbar, so ist es vom Jagdausübenden zu erlegen und zu versorgen. ²Die Pflicht zur Versorgung erstreckt sich auch auf krankgeschossenes Wild, das nach dem Überwechseln in Sichtweite von der Grenze im benachbarten Revier verendet. ³Langwaffen dürfen beim Überschreiten der Grenze nur ungeladen mitgeführt werden. ⁴Das Fortschaffen des erlegten Schalenwildes ist unzulässig. ⁵Das Erlegen ist dem Inhaber des benachbarten Jagdreviers oder dessen Vertreter unverzüglich anzuzeigen. ⁶Fortgeschafftes oder vom Hund aus dem Nachbarrevier gebrachtes Wild ist dem Inhaber des Nachbarreviers abzuliefern.
+(4) ¹Unbeschadet einer anderweitigen Vereinbarung gehören in den Fällen der Abs. 1, 3 und 6 das Wildbret und die Erinnerungsstücke (Kopfschmuck und Grandeln des Schalenwildes, Waffen des Schwarzwildes) dem Revierinhaber, in dessen Jagdrevier das Wild zur Strecke kommt. ²Das erlegte Wild ist auf den Abschußplan desjenigen Reviers anzurechnen, in dem es angeschossen wurde.
+(5) Über die Vorschriften der Absätze 1, 3 und 4 hinausgehende Vereinbarungen bedürfen der Schriftform.
+(6) ¹Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung abweichend von den Abs. 1, 2 und 3 Vorschriften zur Wildfolge durch anerkannte Nachsuchengespanne zu erlassen. ²Es kann insbesondere die Anforderungen, die Anerkennung und die Befugnisse von Nachsuchengespannen einschließlich des Führens von und des Schießens mit Schusswaffen regeln.
+
+Art. 38  Verfolgung kranken oder krankgeschossenen Wildes in befriedeten Bezirken
+
+¹Die Verfolgung kranken oder krankgeschossenen Wildes im eigenen Jagdrevier ist in Gebieten zulässig, in denen die Jagd ruht oder nur eine beschränkte Jagdausübung gestattet ist. ²Das gilt nicht für Gebäude, Hofräume und Hausgärten im Sinn von Art. 6 Abs. 1 Nrn. 1 und 2; dem Revierinhaber steht jedoch auch in diesen Fällen das Aneignungsrecht zu; der Grundstückseigentümer oder Nutzungsberechtigte ist zur Herausgabe verpflichtet.
+
+Art. 39  Verwendung von Jagdhunden
+
+(1) ¹Bei jeder Such-, Drück-, Riegel- und Treibjagd sowie bei jeder Jagdart auf Wasserwild sind brauchbare Jagdhunde in genügender Zahl zu verwenden. ²Auch der bei einer anderen Jagdart zur Nachsuche verwendete Hund muß brauchbar sein.
+(2) Die Jagdbehörde kann dem Revierinhaber die Verpflichtung zur Haltung eines zur Nachsuche brauchbaren Jagdhunds auferlegen.
+(3) Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung Vorschriften über die Feststellung der Brauchbarkeit von Jagdhunden zu erlassen und hierbei Prüfungen vorzuschreiben sowie ihre Durchführung und die Prüfungszulassung zu regeln; mit der Durchführung von Brauchbarkeitsprüfungen und der Feststellung der Brauchbarkeit von Jagdhunden können die anerkannten Vereinigungen der Jäger (Art. 51) betraut werden.
+
+VII. Abschnitt Jagdschutz
+Art. 40  Inhalt des Jagdschutzes; Pflicht zur Ausübung des Jagdschutzes
+
+(1) Der Jagdschutz umfaßt auch den Schutz des Wildes vor Beeinträchtigungen durch dem Jagdrecht nicht unterliegende Tierarten, soweit diese keinem besonderen Schutz nach Naturschutzrecht unterstellt sind, sowie vor aufsichtslosen Hunden und Katzen.
+(2) Der Revierinhaber (Art. 7 Abs. 1 Satz 2) ist verpflichtet, den Jagdschutz (§ 23 des Bundesjagdgesetzes¹) und Absatz 1) in seinem Jagdrevier auszuüben.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 41  Jagdschutzberechtigte
+
+(1) Der Revierinhaber kann zum Schutz der Jagd volljährige, zuverlässige Personen als Jagdaufseher anstellen.
+(2) ¹Für die Bestätigung von Jagdaufsehern (§ 25 Abs. 1 Satz 1 des Bundesjagdgesetzes¹)) ist die Jagdbehörde zuständig. ²Die Bestätigung darf nur versagt werden, wenn der Jagdaufseher nicht Inhaber eines gültigen Jahresjagdscheins ist oder Bedenken gegen seine persönliche Zuverlässigkeit oder fachliche Eignung bestehen. ³ (aufgehoben)
+(3) Neben dem Revierinhaber und dem bestätigten Jagdaufseher übt den Jagdschutz auch die Bayerische Staatliche Polizei aus, soweit er die Sorge für die Einhaltung der zum Schutz des Wildes erlassenen Vorschriften und den Schutz vor Wilderern umfaßt.
+(4) ¹Der Revierinhaber kann auch einem Jagdgast die Ausübung des Jagdschutzes erlauben, soweit er den Schutz des Wildes vor Tieren im Sinn des Art. 40 Abs. 1, vor Futternot und Wildseuchen umfaßt. ²Art. 17 Abs. 3 gilt sinngemäß.
+(5) ¹Die Jagdbehörde kann die Anstellung eines oder mehrerer bestätigter Jagdaufseher verlangen, wenn es zumutbar und zum Jagdschutz notwendig ist oder der Revierinhaber seinen Verpflichtungen zur Hege oder Regulierung des Wildbestands trotz schriftlicher Aufforderung nicht nachkommt. ²Soweit es Reviergröße, Revierbeschaffenheit oder Wildbestand erfordern, kann die Jagdbehörde auch die Anstellung eines oder mehrerer hauptberuflich angestellter bestätigter Jagdaufseher verlangen. ³Bei Hochwildrevieren über 1000 ha soll der bestätigte Jagdaufseher Berufsjäger oder forstlich ausgebildet sein. ⁴Wer Berufsjäger oder forstlich ausgebildet im Sinn von § 25 Abs. 1 Satz 2 des Bundesjagdgesetzes ist, wird durch Rechtsverordnung des Staatsministeriums für Wirtschaft, Landesentwicklung und Energie bestimmt.
+(6) ¹Der Revierinhaber und der bestätigte Jagdaufseher sind verpflichtet, bei Ausübung des Jagdschutzes auf Verlangen des Betroffenen sich auszuweisen, und zwar der Revierinhaber durch Vorzeigen seines Jagdscheins, der Jagdaufseher durch Vorzeigen des Ausweises über seine Bestätigung; dies gilt nicht, wenn die Ausweisung aus Sicherheitsgründen nicht zugemutet werden kann. ²Die bestätigten Jagdaufseher müssen bei der Ausübung ihrer Tätigkeit außerdem ein Dienstabzeichen tragen. ³Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie erläßt im Einvernehmen mit dem Staatsministerium des Innern, für Sport und Integration durch Rechtsverordnung Vorschriften über die Dienstabzeichen.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 42  Aufgaben und Befugnisse der Jagdschutzberechtigten
+
+(1) Die zur Ausübung des Jagdschutzes berechtigten Personen sind befugt,
+  1. Personen, die in einem Jagdrevier unberechtigt jagen oder eine sonstige Zuwiderhandlung gegen jagdrechtliche Vorschriften begehen oder außerhalb der zum allgemeinen Gebrauch bestimmten Wege ohne Berechtigung hierzu zur Jagd ausgerüstet angetroffen werden, zur Feststellung ihrer Personalien anzuhalten und ihnen gefangenes oder erlegtes Wild, Waffen, Jagd- und Fanggeräte, Hunde und Frettchen sowie Beizvögel abzunehmen,
+  2. wildernde Hunde und Katzen zu töten. Hunde gelten als wildernd, wenn sie im Jagdrevier erkennbar dem Wild nachstellen und dieses gefährden können. Katzen gelten als wildernd, wenn sie im Jagdrevier in einer Entfernung von mehr als 300 Meter vom nächsten bewohnten Gebäude angetroffen werden. Diese Befugnis erstreckt sich auch auf solche Katzen, die sich in Fallen gefangen haben, die in einer Entfernung von mehr als 300 Meter vom nächsten bewohnten Gebäude aufgestellt worden sind. Sie gilt nicht gegenüber Jagd-, Dienst-, Blinden- und Hirtenhunden, soweit sie als solche kenntlich sind und solange sie von der führenden Person zu ihrem Dienst verwendet werden oder sich aus Anlaß des Dienstes ihrer Einwirkung entzogen haben sowie gegenüber in Fallen gefangenen Katzen, deren Besitzer eindeutig und für den Jagdschutzberechtigten in zumutbarer Weise festgestellt werden können.
+(2) Soweit der Revierinhaber einem Jagdgast nach Art. 41 Abs. 4 die Ausübung des Jagdschutzes übertragen hat, stehen diesem die Befugnisse nach Absatz 1 Nr. 2 ebenfalls zu.
+(3) Die bestätigten Jagdaufseher, die Berufsjäger oder forstlich ausgebildet sind, haben die Aufgaben und Befugnisse der Naturschutzwacht.
+
+Art. 43  Natürliche Äsung; Fütterung des Wildes
+
+(1) ¹Der Schutz und die Pflege der natürlichen Lebensgrundlagen des Wildes sind Aufgabe des Revierinhabers, der im Einvernehmen mit den Grundstückseigentümern oder Nutzungsberechtigten durch Maßnahmen der Reviergestaltung und Äsungsverbesserung die Voraussetzungen dafür schaffen soll, daß das Wild auch in der vegetationsarmen Zeit natürliche Äsung findet. ²Auf Grund anderer Vorschriften bestehende Verpflichtungen bleiben unberührt.
+(2) ¹Durch die Fütterung des Wildes darf die Verwirklichung des Hegeziels (§ 1 Abs. 2 des Bundesjagdgesetzes¹)) nicht gefährdet werden. ²Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung Vorschriften zur Verhinderung einer mißbräuchlichen Wildfütterung zu erlassen.
+(3) ¹Der Revierinhaber ist verpflichtet, in der Notzeit für angemessene Wildfütterung zu sorgen und die dazu erforderlichen Fütterungsanlagen zu unterhalten. ²Das gilt nicht für Rotwild, das auf Grund einer Rechtsverordnung nach Art. 32 Abs. 7 Nr. 3 nicht gehegt werden darf.
+(4) Kommt der Revierinhaber der Verpflichtung nach Absatz 3 trotz Aufforderung durch die Jagdbehörde nicht nach, so kann die Jagdbehörde auf seine Rechnung die Fütterung vornehmen und ausreichende Fütterungsanlagen aufstellen lassen.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+VIII. Abschnitt Wild- und Jagdschaden
+Art. 44  Verhinderung übermäßigen Wildschadens auf eingezäunten Waldflächen
+
+Zum Schutz von Forstkulturen und forstlichen Verjüngungsflächen, die gegen das Eindringen von Schalenwild mit den üblichen Schutzvorrichtungen (§ 32 Abs. 2 des Bundesjagdgesetzes¹), Art. 47 Nr. 2) versehen sind und deren Größe 10 ha nicht überschreitet, kann die Jagdbehörde nach § 27 des Bundesjagdgesetzes auf Antrag des Grundeigentümers oder Nutzungsberechtigten anordnen, daß der Revierinhaber unabhängig von den Schonzeiten innerhalb einer bestimmten Frist in bestimmtem Umfang eingewechseltes Schalenwild zu erlegen hat.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 45  Erstattungsausschluß
+
+¹Wildschaden an Grundflächen, auf denen die Jagd nicht ausgeübt werden darf, ist nicht zu ersetzen. ²Die Grundflächen bleiben bei der Berechnung der anteiligen Ersatzleistung für den Wildschaden an anderen Grundstücken (§ 29 Abs. 1 Satz 2 des Bundesjagdgesetzes¹)) außer Ansatz.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 46  Ersatz weiterer Wildschäden
+
+Ist für den ganzen oder teilweisen Verlust der Ernte Ersatz geleistet, so kann wegen eines weiteren Schadens im gleichen Wirtschaftsjahr Ersatz nur verlangt werden, wenn die Neubestellung im Rahmen der üblichen Bewirtschaftung liegt.
+
+Art. 47  Ermächtigungen
+
+Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung
+  1. im Rahmen des § 29 Abs. 4 des Bundesjagdgesetzes¹) die Wildschadensersatzpflicht auf andere Wildarten auszudehnen,
+  2. Bestimmungen über die Verpflichtung zur Leistung von Wildschadensersatz in den Fällen des § 32 Abs. 2 Satz 1 des Bundesjagdgesetzes zu erlassen, soweit sie zur Vermeidung unzumutbarer Wildschäden in der Land- und Forstwirtschaft unerläßlich sind, sowie darüber zu erlassen, welche Schutzvorrichtungen als üblich anzusehen sind (§ 32 Abs. 2 Satz 2 des Bundesjagdgesetzes),
+  3. Vorschriften über die Erhebung von Daten über die Wildschadenssituation (Art, Ausmaß und regionale Verteilung der Wildschäden) und über geleistete Wildschadensbeträge zu erlassen.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 47a  Verfahren in Wild- und Jagdschadenssachen
+
+(1) ¹Wild- und Jagdschäden können im ordentlichen Rechtsweg erst geltend gemacht werden, wenn das Vorverfahren nach § 35 des Bundesjagdgesetzes stattgefunden hat. ²Das Vorverfahren führt die Gemeinde im eigenen Wirkungskreis durch; im Fall ihrer Beteiligung die Rechtsaufsichtsbehörde. ³Verspätet angemeldete Ansprüche oder wegen Fehlens eines ersatzfähigen Wild- oder Jagdschadens offensichtlich unbegründete Anträge sind zurückzuweisen. ⁴Im Übrigen wird das Vorverfahren mit der Niederschrift über die gütliche Einigung oder, wenn eine solche nicht erreicht wird, mit dem Erlass des Vorbescheids abgeschlossen. ⁵Gegen den Zurückweisungs- oder Vorbescheid kann binnen einer Notfrist von vier Wochen nach Zustellung Klage vor den ordentlichen Gerichten erhoben werden. ⁶§ 23 des Gerichtsverfassungsgesetzes findet Anwendung.
+(2) Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung die Einzelheiten der Anmeldung (§ 34 des Bundesjagdgesetzes) und des Vorverfahrens zu regeln, einschließlich der Kostentragung und der Zwangsvollstreckung aus der Niederschrift über die gütliche Einigung oder aus dem Vorbescheid.
+
+IX. Abschnitt Wildhandel
+Art. 48  Überwachung des Wildhandels
+
+Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung im Einvernehmen mit dem Staatsministerium für Umwelt und Verbraucherschutz Vorschriften über die behördliche Überwachung des gewerbsmäßigen Ankaufs, Verkaufs und Tausches sowie der gewerbsmäßigen Verarbeitung von Wildbret und die behördliche Überwachung der Wildhandelsbücher zu erlassen (§ 36 Abs. 2 Nr. 1 des Bundesjagdgesetzes¹)).
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+X. Abschnitt Organisation, Zuständigkeit, Verfahren
+Art. 49  Jagdbehörden, Jagdberater
+
+(1) ¹Der Vollzug des Bundesjagdgesetzes¹), dieses Gesetzes und der auf Grund dieser Gesetze erlassenen Rechtsverordnungen ist grundsätzlich Aufgabe des Staates. ²Er obliegt den Jagdbehörden. ³Soweit wesentliche Belange der Land- und Forstwirtschaft berührt sind, sind die Ämter für Ernährung, Landwirtschaft und Forsten zu beteiligen. ⁴Soweit wesentliche Belange des Naturschutzes oder der Landschaftspflege berührt werden, sind diejenigen Naturschutzbehörden zu beteiligen, die dem Zuständigkeitsbereich der Jagdbehörde der vergleichbaren Verwaltungsstufe entsprechen.
+(2) Jagdbehörden im Sinn dieses Gesetzes sind
+  1. das Staatsministerium für Wirtschaft, Landesentwicklung und Energie als oberste Jagdbehörde,
+  2. die Regierungen als höhere Jagdbehörden,
+  3. die Kreisverwaltungsbehörden als untere Jagdbehörden.
+(3) ¹Zur laufenden sachverständigen Beratung der Jagdbehörden sind nach Anhörung des Jagdbeirats (Art. 50) ehrenamtliche Berater (Jagdberater) zu bestellen. ²Die Jagdberater und je ein Stellvertreter werden aus dem Kreis der Jagdscheininhaber für fünf Jagdjahre widerruflich bestellt. ³Die Zahl der Jagdberater soll je Behörde zwei nicht überschreiten. ⁴Ihre Aufgabe und Stellung innerhalb der Jagdbehörde und die Aufwandsentschädigung werden durch Rechtsverordnung geregelt, die vom Staatsministerium für Wirtschaft, Landesentwicklung und Energie zu erlassen ist. ⁵In der Regel sollen die Jagdberater kein wichtiges Amt in einer Organisation der im Jagdbeirat vertretenen Interessengruppen bekleiden.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 50  Jagdbeirat
+
+(1) Zur Beratung aller Angelegenheiten von grundsätzlicher Bedeutung sowie wichtiger Einzelfragen wird bei jeder Jagdbehörde ein Jagdbeirat (§ 37 Abs. 1 des Bundesjagdgesetzes¹)) gebildet.
+(2) Der Jagdbeirat bei der unteren Jagdbehörde besteht aus deren Vertreter als Vorsitzendem und aus fünf Mitgliedern, nämlich je einem Vertreter der Landwirtschaft, der Forstwirtschaft, der Jagdgenossenschaften, der Jäger und des Natur- und Waldschutzes.
+(3) Der Jagdbeirat bei der höheren Jagdbehörde besteht aus deren Vertreter als Vorsitzendem und aus neun Mitgliedern, nämlich aus zwei der Jagdgenossenschaften und je einem Vertreter der Landwirtschaft, der staatlichen und privaten Forstwirtschaft, der Teich- und Fischereiwirtschaft, der Jäger, des Naturschutzes und Waldschutzes.
+(4) ¹Der Jagdbeirat bei der obersten Jagdbehörde besteht aus deren Vertreter als Vorsitzendem und aus 14 Mitgliedern. ²Von diesen müssen drei den Jagdgenossenschaften, je zwei der Landwirtschaft und den Jägern sowie je ein Mitglied der staatlichen und privaten Forstwirtschaft, den Berufsjägern, der Fischerei, dem Tierschutz, dem Naturschutz und Waldschutz angehören.
+(5) ¹Zu den Beratungen des Jagdbeirats können vom Vorsitzenden weitere Sachkundige zugezogen werden. ²Den Trägern öffentlicher Belange ist auf Verlangen Gelegenheit zur Äußerung zu geben.
+(6) ¹Die Mitglieder des Jagdbeirats und je ein Stellvertreter werden durch die Jagdbehörde für fünf Jagdjahre widerruflich bestellt. ²Sie sind ehrenamtlich tätig. ³Sie erhalten auf Antrag Ersatz der ihnen bei der Ausübung der Beiratstätigkeit entstandenen notwendigen Auslagen. ⁴Ein Verdienstausfall wird nicht ersetzt. ⁵Das gleiche gilt für den nach Absatz 5 zugezogenen Sachkundigen. ⁶Das Nähere, insbesondere Bestellung, Aufgaben und Aufwandsentschädigung der Beiräte, regelt das Staatsministerium für Wirtschaft, Landesentwicklung und Energie durch Rechtsverordnung im Einvernehmen mit dem Staatsministerium der Finanzen und für Heimat.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 51  Vereinigungen der Jäger
+
+Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie wird ermächtigt, durch Rechtsverordnung die Mitwirkung von Vereinigungen der Jäger für die Fälle vorzusehen, in denen Jagdscheininhaber gegen die Grundsätze der Weidgerechtigkeit verstoßen (§ 1 Abs. 3, § 37 Abs. 2 des Bundesjagdgesetzes¹)), ferner Voraussetzungen und Verfahren für die Anerkennung von Vereinigungen der Jäger zu bestimmen und diesen über Art. 39 Abs. 3 hinaus weitere nichthoheitliche Aufgaben auf dem Gebiet des Jagdwesens zu übertragen.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 52  Sachliche Zuständigkeit
+
+(1) Die oberste Jagdbehörde ist zuständig für
+  1. die Anerkennung von Fachinstituten nach § 19 Abs. 3 des Bundesjagdgesetzes¹),
+  2. die Genehmigung zum Aussetzen oder Ansiedeln fremder Tierarten nach Art. 34 Abs. 2 Satz 1, soweit es sich um Tierarten handelt, die dem Jagdrecht unterliegen; bei anderen Tierarten im Sinn des Art. 34 Abs. 1 entscheidet das Staatsministerium für Umwelt und Verbraucherschutz im Einvernehmen mit dem Staatsministerium für Wirtschaft, Landesentwicklung und Energie,
+  3. die Bestellung ihres Jagdberaters nach Art. 49 Abs. 3 und ihres Jagdbeirats nach Art. 50 Abs. 4 und 6.
+(2) Die höheren Jagdbehörden sind zuständig für
+  1. die Anerkennung von Wildgehegen als Wildpark nach Art. 24 Abs. 1 Satz 1,
+  2. die Zulassung von Ausnahmen nach Art. 31 Abs. 2 Satz 2 und für die Einzelanordnungen nach Art. 31 Abs. 3,
+  3. die Zulassung von Ausnahmen nach Art. 32 Abs. 6 Satz 1,
+  4. die Anerkennung von Nachsuchengespannen nach Art. 37 Abs. 6,
+  5. die Bestellung ihrer Jagdberater nach Art. 49 Abs. 3 und ihrer Jagdbeiräte nach Art. 50 Abs. 3 und 6.
+(3) Die unteren Jagdbehörden sind für die übrigen staatlichen Aufgaben auf dem Gebiet des Jagdwesens zuständig, soweit nicht ausdrücklich etwas anderes bestimmt ist.
+(4) ¹Die oberste Jagdbehörde kann einzelne der ihr oder den höheren Jagdbehörden zustehenden Verwaltungsbefugnisse durch Rechtsverordnung auf nachgeordnete Jagdbehörden übertragen. ²Die oberste Jagdbehörde bestimmt durch Rechtsverordnung die für die Abnahme der Jäger- und Falknerprüfung nach § 15 Abs. 5 Satz 1 und Abs. 7 Satz 1 des Bundesjagdgesetzes zuständigen Behörden.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 53  Örtliche Zuständigkeit
+
+Die für die Erteilung von Jagdscheinen zuständige Jagdbehörde nimmt auch die Eintragungen nach § 11 Abs. 7 des Bundesjagdgesetzes¹) vor.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 54  (aufgehoben)
+
+
+Art. 55  Vorläufige Anordnung
+
+Die Jagdbehörde kann die Ausübung der Jagd und des Jagdschutzes regeln, insbesondere durch einen bestätigten Jagdaufseher für Rechnung der Jagdgenossenschaft, des Jagdberechtigten oder des Revierinhabers vornehmen lassen und die Jagdausübung durch andere verbieten, wenn und solang
+  1. für ein Gebiet der verantwortliche Revierinhaber (Art. 7 Abs. 1 Satz 2) nicht festgestellt werden kann oder eine verantwortliche jagdpachtfähige Person nicht benannt wird (Art. 7 Abs. 2 und 3, Art. 20),
+  2. der Revierinhaber durch ein Verbot nach § 41a des Bundesjagdgesetzes¹) oder Art. 57 gehindert ist, die Jagd auszuüben, oder wenn und solang der Revierinhaber oder die an seiner Stelle verantwortliche Person der Verantwortung nach Art. 7 Abs. 1 trotz wiederholter Aufforderung weiterhin zuwiderhandelt,
+  3. im Fall des Art. 7 Abs. 4 nach zweimaliger Aufforderung der Jagdbehörde ein Mitpächter oder eine verantwortliche Person im Sinn von Art. 7 Abs. 2 nicht als Bevollmächtigter benannt wird und die Mitpächter oder die verantwortlichen Personen ihren Verpflichtungen gegenüber der Jagdbehörde gemeinsam nicht nachkommen; mit der Ausübung der Jagd und des Jagdschutzes kann auch ein Mitpächter oder eine verantwortliche Person beauftragt werden,
+  4. ein bestätigter Jagdaufseher oder Berufsjäger auf Verlangen der Jagdbehörde nicht angestellt wird (Art. 41 Abs. 5),
+  5. nach Beendigung eines Jagdpachtvertrags die Jagd oder der Jagdschutz nicht ausgeübt wird,
+  6. während eines Beanstandungsverfahrens der Jagdpächter die Jagd nach § 12 Abs. 4 des Bundesjagdgesetzes nicht ausüben darf,
+  7. über die Rechtsgültigkeit oder Beendigung des Jagdpachtvertrags ein Rechtsstreit anhängig ist oder trotz befristeter Aufforderung der Vertragsparteien durch die Jagdbehörde nicht anhängig gemacht wird; die Aufforderung ist ohne Rücksicht darauf zulässig, ob zwischen den Vertragsparteien Meinungsverschiedenheiten über die Gültigkeit des Jagdpachtvertrags bestehen.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+XI. Abschnitt Ahndungsvorschriften
+Art. 56  Ordnungswidrigkeiten
+
+(1) Mit Geldbuße bis zu fünftausend Euro kann belegt werden, wer
+  1. vorsätzlich oder fahrlässig einer vollziehbaren Anordnung nach Art. 21 Abs. 4 zuwiderhandelt,
+  2. entgegen Art. 22 Abs. 3 Satz 1 die Nester und Gelege des Federwildes beschädigt, wegnimmt oder zerstört,
+  3. vorsätzlich oder fahrlässig entgegen Art. 23 Abs. 2 Satz 1, Abs. 4 Sätze 2 bis 4, Art. 25 Satz 2 Wildgehege oder Wintergatter errichtet, erweitert oder betreibt,
+  3a. vorsätzlich oder fahrlässig die Jagd mit Fallen ausübt, ohne den erforderlichen Nachweis der Kenntnisse über die Ausübung der Jagd mit Fallen zu besitzen,
+  4. entgegen Art. 29 Abs. 1, Abs. 2 Nrn. 2 bis 7 und Art. 29a Abs. 1 Satz 2, Abs. 2 Satz 1 und Abs. 3
+    a) als Jagdausübender eine zeitgerechte und fachgemäße Nachsuche auf krankgeschossenes Wild weder selbst durchführt noch veranlaßt,
+    b) die Jagd auf Wild mit Fanggeräten oder Fangvorrichtungen ausübt,
+    c) die Jagd auf sonstiges Haarwild zur Nachtzeit ausübt,
+    d) die Jagd auf Schalenwild, mit Ausnahme von Schwarzwild, als Treibjagd ausübt,
+    e) das Wild durch Lappen oder sonstige Mittel hindert, aus seinen oder in seine Tageseinstände zu wechseln,
+    f) die Jagd auf Wild ausübt, das durch Naturkatastrophen in Not geraten oder zum Verlassen der Einstände gezwungen worden ist,
+    g) die Jagd unter Verwendung von Betäubungs- oder Lähmungsmitteln, Sprengstoffen, Gasen, elektrischem Strom oder von Schußwaffen mit Schalldämpfern ausübt oder
+    h) Fangeisen verwendet, deren Betriebssicherheit nicht überprüft ist oder die nicht dauerhaft gekennzeichnet sind, Fangeisen außerhalb geschlossener Räume oder Fangbunker oder Fanggärten aufstellt oder nicht ordnungsgemäß verblendet oder die Verwendung von Schlagfallen nicht der Jagdbehörde anzeigt,
+  5. entgegen Art. 31 Abs. 2 Satz 1 Schalenwild in Wintergattern erlegt,
+  6. vorsätzlich oder fahrlässig entgegen Art. 32 Abs. 2 Satz 1, Abs. 4 oder 5
+    a) den Abschußplan für Schalenwild nicht ordnungsgemäß erfüllt,
+    b) die schriftliche Abschußmeldung oder die Streckenliste nicht ordnungsgemäß erstattet oder führt oder diese der Jagdbehörde auf Verlangen nicht vorzeigt oder
+    c) der Jagdbehörde den Abschuß von krankem Wild über den Abschußplan hinaus oder während der Schonzeit nicht unverzüglich mitteilt oder ihr oder einem von ihr Beauftragten das erlegte Wild auf Verlangen nicht vorzeigt,
+  7. (aufgehoben)
+  8. vorsätzlich oder fahrlässig entgegen Art. 37 Abs. 1, 2 oder 3
+    a) es unterläßt, das Überwechseln von krankgeschossenem Wild dem Inhaber des Nachbarreviers oder dessen Vertreter unverzüglich anzuzeigen oder
+    b) beim Überschreiten der Grenze geladene Langwaffen mit sich führt, Wild fortschafft, das Erlegen nicht unverzüglich anzeigt oder Wild dem Inhaber des Nachbarreviers nicht abliefert,
+  9. vorsätzlich oder fahrlässig entgegen Art. 39 Abs. 1 bei der Such-, Drück-, Riegel- oder Treibjagd oder bei der Jagd auf Wasserwild sowie bei der Nachsuche auf krankgeschossenes Wild brauchbare Jagdhunde nicht verwendet,
+  10. (aufgehoben)
+  11. ohne Begleitung oder schriftliche Erlaubnis des Revierinhabers aufsichtslosen Hunden oder Katzen mit der Schußwaffe nachstellt oder solche erlegt,
+  12. (aufgehoben)
+  13. vorsätzlich oder fahrlässig entgegen Art. 43 Abs. 3 Satz 1 seiner Verpflichtung, in der Notzeit für angemessene Wildfütterung zu sorgen und die dazu erforderlichen Fütterungsanlagen zu unterhalten, nicht nachkommt,
+  14. einer vollziehbaren Anordnung nach Art. 55 über die Ausübung der Jagd und des Jagdschutzes zuwiderhandelt,
+  15. vorsätzlich oder fahrlässig den Vorschriften einer auf Grund der Art. 21, 22a, 23 Abs. 7, Art. 29 Abs. 5 Satz 1, Art. 29a Abs. 4 Satz 1, Art. 31 Abs. 1 Satz 2 und Abs. 3, Art. 32 Abs. 7, Art. 33 Abs. 1 Nr. 4, Art. 34 Abs. 3, Art. 43 Abs. 2 Satz 2, Art. 47 Nr. 3 und Art. 48 erlassenen Rechtsverordnung, die für einen bestimmten Tatbestand auf diese Bußgeldvorschrift verweist, zuwiderhandelt,
+  16. (aufgehoben)
+(2) Mit Geldbuße kann belegt werden, wer
+  1. (aufgehoben)
+  2. entgegen Art. 16 Abs. 3, auch in Verbindung mit Art. 17 Abs. 2 Satz 1, der Jagdbehörde beim Erwerb des Jagdscheins unrichtige Angaben macht,
+  3. vorsätzlich oder fahrlässig entgegen Art. 17 Abs. 3 als Jagdgast ohne Begleitung eines Revierinhabers, eines angestellten Jägers oder Jagdaufsehers die Jagd ausübt, ohne den Erlaubnisschein bei sich zu führen, oder diesen dem Jagdschutzberechtigten auf Verlangen nicht zur Prüfung aushändigt,
+  4. (aufgehoben)
+  5. einer vollziehbaren Anordnung nach Art. 32 Abs. 4 Satz 2 über den körperlichen Nachweis der Erfüllung des Abschußplans zuwiderhandelt,
+  6. entgegen Art. 35 Abs. 2 bei der Benutzung eines Jägernotwegs geladene Langwaffen oder nichtangeleinte Hunde mitführt,
+  7. trotz Aufforderung des Berechtigten Jagdeinrichtungen nicht verläßt,
+  8. trotz Abmahnung durch den Berechtigten die Jagdausübung dadurch vereitelt, daß er, ohne die Land-, Forst- oder Fischereiwirtschaft auszuüben, das Wild vergrämt,
+  9. Hunde in einem Jagdrevier unbeaufsichtigt frei laufen läßt,
+  10. entgegen Art. 41 Abs. 6 Satz 1 als Revierinhaber oder bestätigter Jagdaufseher bei Ausübung des Jagdschutzes auf Verlangen des Betroffenen sich nicht ausweist,
+  11. entgegen Art. 42 Abs. 1 Nr. 1 und Abs. 3, auch in Verbindung mit Art. 43 Abs. 3 Nr. 1 des Bayerischen Naturschutzgesetzes⁴), der Aufforderung eines für das Jagdrevier zuständigen Jagdschutzberechtigten, Angaben über die Person zu machen, nicht oder nicht richtig nachkommt, soweit die Tat nicht nach § 111 des Gesetzes über Ordnungswidrigkeiten⁸) mit Geldbuße bedroht ist,
+  12.
+    a) vorsätzlich oder fahrlässig an Orten, an denen ihm die Ausübung des Jagdrechts nicht zusteht, Besitz an lebendem oder verendetem Wild oder an Fallwild und Abwurfstangen sowie Eiern des dem Jagdrecht unterliegenden Federwildes erlangt und diese Gegenstände nicht binnen drei Tagen entweder dem Revierinhaber (Art. 7 Abs. 1) oder der nächsterreichbaren Polizeidienststelle abliefert oder den Sachverhalt anzeigt,
+    b) als Führer eines Fahrzeugs Schalenwild (§ 2 Abs. 3 des Bundesjagdgesetzes¹)) durch An- oder Überfahren verletzt oder tötet und dies nicht unverzüglich einer der in Buchstabe a genannten Stellen anzeigt.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+⁴) [Amtl. Anm.:] BayRS 791-1-U
+⁸) [Amtl. Anm.:] BGBl. FN 454-1
+
+Art. 57  Verbot der Jagdausübung
+
+(1) Wird gegen jemanden wegen einer Ordnungswidrigkeit nach Art. 56, die er unter grober oder beharrlicher Verletzung der Pflichten bei der Jagdausübung begangen hat, eine Geldbuße festgesetzt, so kann ihm in der Entscheidung für die Dauer von einem Monat bis zu sechs Monaten verboten werden, die Jagd auszuüben.
+(2) ¹Das Verbot der Jagdausübung wird mit der Rechtskraft der Entscheidung wirksam. ²Für seine Dauer wird ein erteilter Jagdschein amtlich verwahrt. ³Wird er nicht freiwillig herausgegeben, so ist er zu beschlagnahmen.
+(3) ¹Ist ein Jagdschein amtlich zu verwahren, so wird die Verbotsfrist erst von dem Tag an gerechnet, an dem dies geschieht. ²In die Verbotsfrist wird die Zeit nicht eingerechnet, in welcher der Täter auf behördliche Anordnung in einer Anstalt verwahrt wird.
+(4) Über den Beginn der Verbotsfrist nach Absatz 3 Satz 1 ist der Täter im Anschluß an die Verkündung der Entscheidung oder bei deren Zustellung zu belehren.
+
+Art. 58  Einziehung
+
+¹Die durch eine Ordnungswidrigkeit nach Art. 56 gewonnenen oder erlangten oder die zu ihrer Begehung gebrauchten oder dazu bestimmten Gegenstände einschließlich der bei der Ordnungswidrigkeit verwendeten Verpackungs- und Beförderungsmittel können eingezogen werden. ²Es können auch Gegenstände eingezogen werden, auf die sich die Ordnungswidrigkeit bezieht. ³§ 23 des Gesetzes über Ordnungswidrigkeiten⁸) ist anzuwenden.
+⁸) [Amtl. Anm.:] BGBl. FN 454-1
+
+XII. Abschnitt Übergangs- und Schlußvorschriften
+Art. 59  Enteignende Maßnahmen
+
+(1) Hat eine Behörde auf Grund dieses Gesetzes eine Maßnahme getroffen, die eine Enteignung darstellt oder einer solchen gleichkommt, insbesondere weil sie eine wesentliche Nutzungsbeschränkung darstellt, so ist dem Eigentümer oder dem sonstigen Berechtigten nach den Vorschriften des Bayerischen Gesetzes über die entschädigungspflichtige Enteignung⁶) Entschädigung in Geld zu leisten.
+(2) ¹Der Grundstückseigentümer kann verlangen, daß der Entschädigungspflichtige das Grundstück übernimmt, soweit es ihm infolge der enteignenden Maßnahme wirtschaftlich nicht mehr zumutbar ist, das Grundstück zu behalten oder es in der bisherigen oder in einer anderen zulässigen Art zu nutzen. ²Kommt eine Einigung über die Übernahme des Grundstücks nicht zustande, kann der Eigentümer das Enteignungsverfahren beantragen; im übrigen gelten die Vorschriften des Bayerischen Gesetzes über die entschädigungspflichtige Enteignung sinngemäß.
+⁶) [Amtl. Anm.:] BayRS 2141-1-I
+
+Art. 60  (aufgehoben)
+
+
+Art. 61  Ausführungsvorschriften
+
+Das Staatsministerium für Wirtschaft, Landesentwicklung und Energie erläßt im Einvernehmen mit den beteiligten Staatsministerien die zum Vollzug dieses Gesetzes erforderlichen Ausführungsvorschriften und die Rechtsverordnungen, die das Bundesjagdgesetz¹) und seine Ausführungsvorschriften den Ländern vorbehalten.
+¹) [Amtl. Anm.:] BGBl. FN 792-1
+
+Art. 62  Verweisungen auf aufgehobene Vorschriften
+
+Soweit in anderen Gesetzen und Verordnungen auf durch dieses Gesetz aufgehobene Vorschriften verwiesen wird, treten die entsprechenden Vorschriften dieses Gesetzes an ihre Stelle.
+
+Art. 63  (Änderungsbestimmung)
+
+
+Art. 64  Inkrafttreten; Aufhebung von Vorschriften
+
+(1) Dieses Gesetz tritt am 1. Januar 1979 in Kraft.⁹)
+(2) (gegenstandslos)
+(3) Das Gesetz über das Verfahren in Wild- und Jagdschadenssachen¹⁰) vom 12. August 1953 (BayBS IV S. 575) tritt mit Inkrafttreten der Rechtsverordnung nach Art. 47 Nr. 3 außer Kraft.
+⁹) [Amtl. Anm.:] Betrifft die ursprüngliche Fassung vom 13. Oktober 1978 (GVBl S. 678).
+¹⁰) [Amtl. Anm.:] BayRS 792-4-E
+
diff --git a/src/main/resources/sampledata/BayJG/SOURCES b/src/main/resources/sampledata/BayJG/SOURCES
index cff1afe..964ecc4 100644
--- a/src/main/resources/sampledata/BayJG/SOURCES
+++ b/src/main/resources/sampledata/BayJG/SOURCES
@@ -2,6 +2,16 @@
 - Bayerisches Jagdgesetz (BayJG) vom 13. Oktober 1978 (BayRS 792-1-W)
 - https://www.gesetze-bayern.de/Content/Document/BayJG
   (BayJG.pdf, konsolidierte Fassung nach dem Änderungsgesetz)
+- BayJG-alt.txt: die vor dem Änderungsgesetz geltende Fassung (Stand
+  nach der Änderung vom 23.07.2024, GVBl. S. 247) im kanonischen
+  Klartext-Format des BayRechtLoaders. Abgeleitet am 17.07.2026 aus den
+  in der Wayback Machine archivierten Einzelnorm-Seiten
+  http://web.archive.org/web/<ts>/https://www.gesetze-bayern.de/Content/Document/BayJG-<n>
+  (je Artikel der jüngste Schnappschuss vor dem 31.03.2026;
+  <sup>-Satznummern und Fußnotenmarker als Unicode-Superskripte,
+  Aufzählungen in gii-üblicher Einrückung, Gliederungs-Überschriften aus
+  den BayJG-G<k>-Abschnittsseiten). Basis des Akzeptanztests
+  EndToEndTest.bayJgGvblAcceptance.
 
 Änderungsgesetz:
 - Gesetz zur Änderung des Bayerischen Jagdgesetzes und weiterer
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
index 0b7820d..2e19090 100644
--- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java
+++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
@@ -217,4 +217,97 @@
     assertThat(neueNorm.titel()).isEqualTo("Außerkrafttreten");
     assertThat(neueNorm.gesamtText()).contains("9. Dezember 2026 außer Kraft");
   }
+
+  /**
+   * Bayerisches Landesrecht (Akzeptanzfall der fünften Welle): altes BayJG (Klartext, aus der
+   * archivierten Fassung von gesetze-bayern.de abgeleitet) + GVBl-Heft 6/2026. §§ 1 und 2 des
+   * Änderungsgesetzes betreffen das BayJG; alle Befehle werden erkannt und angewandt.
+   */
+  @Test
+  void bayJgGvblAcceptance() throws Exception {
+    var alt = SAMPLEDATA.resolve("BayJG/BayJG-alt.txt");
+    var pdf = SAMPLEDATA.resolve("BayJG/gvbl-2026-06.pdf");
+    assumeTrue(Files.exists(alt) && Files.exists(pdf), "BayJG-Beispieldaten fehlen");
+
+    // 1. Stammgesetz laden (Art.-gegliedert, amtliche Satznummern als Superskripte).
+    var gesetz = new eu.mulk.aendggner.gesetz.bayern.BayRechtLoader().load(alt);
+    assertThat(gesetz.jurabk()).isEqualTo("BayJG");
+    assertThat(gesetz.langue()).isEqualTo("Bayerisches Jagdgesetz");
+    assertThat(gesetz.norm("Art. 1").orElseThrow().absaetze().get(0).text())
+        .startsWith("¹Die freilebende Tierwelt");
+
+    // 2. GVBl-Heft extrahieren (Superskript-Erhalt; Kolumnentitel entfernt).
+    var text =
+        TextBereiniger.bereinige(
+            new PatchTextExtraktor(eu.mulk.aendggner.aenderung.parse.SuperskriptModus.BEHALTEN)
+                .extrahiere(pdf));
+    assertThat(text).doesNotContain("Gesetz- und Verordnungsblatt Nr. 6/2026 ");
+    assertThat(text).contains("für die kurzfristige Vermietung");
+
+    // 3. Parsen: §§ 1 und 2 betreffen das BayJG (nicht aber die AVBayJG-§§ 4 und 5,
+    //    deren Titel das BayJG nur als Genitiv-Attribut nennt); alles wird erkannt.
+    var parseErgebnis = new AenderungsgesetzParser().parse(text, gesetz, null);
+    assertThat(parseErgebnis.artikel()).containsExactly("1", "2");
+    assertThat(parseErgebnis.befehle()).hasSize(154);
+    assertThat(parseErgebnis.befehle()).noneMatch(b -> b instanceof UnbekannterBefehl);
+
+    // 4. Anwenden auf die alte Fassung. Von 154 Befehlen bleiben genau fünf als „manuell prüfen“
+    //    stehen — allesamt Folgeänderungen innerhalb zweier mehrschrittiger Umnummerierungs-
+    //    sequenzen, die ÄndGgner bewusst nicht automatisch auflöst (statt fehlerhaft zu raten):
+    //      * Art. 29a (§ 1 Nr. 23): ein vorangestellter Absatz und die Bereichs-Umnummerierung
+    //        „Die bisherigen Abs. 1 bis 3 werden die Abs. 2 bis 4“ verschieben die Absatzzählung;
+    //        die auf den neuen Abs. 5 zielenden Wort-/Satzbefehle finden ihren Alttext nicht mehr.
+    //      * Art. 56 (§ 1 Nr. 48): eine umfangreiche Neunummerierung des Bußgeldkatalogs
+    //        (Einfügen der Nrn. 5–7 und 13, Verschieben von Nr. 6→9, 11→12 …) verschiebt die
+    //        Zielnummern der begleitenden Buchstaben-/Wortänderungen.
+    //    Diese Residuen sind exakt gepinnt; sie landen mit Begründung im Abschnitt „Manuell prüfen“
+    //    der Synopse und werden nie stillschweigend verworfen.
+    var anwendung = BefehlAnwender.anwenden(gesetz, parseErgebnis.befehle());
+    assertThat(anwendung.protokoll()).hasSameSizeAs(parseErgebnis.befehle());
+    var manuellPfade =
+        anwendung.protokoll().stream()
+            .filter(a -> a.status() == BefehlAnwender.Status.MANUELL_PRUEFEN)
+            .map(a -> a.befehl().provenienz().gliederungsPfad())
+            .toList();
+    assertThat(manuellPfade)
+        .containsExactlyInAnyOrder(
+            "23. c) aa)", "23. c) cc)", "48. a) ee)", "48. a) gg)", "48. b) cc)");
+
+    // 5. Stichproben: § 2 (in Kraft 1.1.2027) hebt Art. 28 Abs. 1 Satz 4 auf und nummeriert
+    //    Satz 5 um; § 1 Nr. 16 stellt Art. 22a die Abs. 1 bis 4 voran.
+    var art28 = anwendung.neu().norm("Art. 28").orElseThrow();
+    var abs1 = art28.absaetze().get(0);
+    assertThat(abs1.text()).doesNotContain("⁵");
+    var art22a = anwendung.neu().norm("Art. 22a").orElseThrow();
+    assertThat(art22a.absaetze().size()).isGreaterThanOrEqualTo(5);
+    assertThat(art22a.absaetze().get(0).nummer()).isEqualTo("1");
+
+    // 6. Synopse rendern.
+    var synopse = SynopseBuilder.baue(gesetz, anwendung, parseErgebnis.warnungen(), false);
+    var html = HtmlRenderer.rendere(synopse, "E2E-Test BayJG");
+    assertThat(html).contains("Art. 29");
+  }
+
+  /** Landtags-Gesetzentwurf (Ltg-Drs. 19/9707) auf derselben alten Fassung. */
+  @Test
+  void bayJgLandtagsEntwurf() throws Exception {
+    var alt = SAMPLEDATA.resolve("BayJG/BayJG-alt.txt");
+    var pdf = SAMPLEDATA.resolve("BayJG/Ltg-Drs-19-9707_Gesetzentwurf.pdf");
+    assumeTrue(Files.exists(alt) && Files.exists(pdf), "BayJG-Beispieldaten fehlen");
+
+    var gesetz = new eu.mulk.aendggner.gesetz.bayern.BayRechtLoader().load(alt);
+    var text =
+        TextBereiniger.bereinige(
+            new PatchTextExtraktor(eu.mulk.aendggner.aenderung.parse.SuperskriptModus.BEHALTEN)
+                .extrahiere(pdf));
+    var parseErgebnis = new AenderungsgesetzParser().parse(text, gesetz, null);
+
+    // Nur § 1 des Entwurfs ändert das BayJG; Vorblatt und Begründung erzeugen keine Befehle.
+    assertThat(parseErgebnis.artikel()).containsExactly("1");
+    assertThat(parseErgebnis.befehle()).hasSize(154);
+    assertThat(parseErgebnis.befehle()).noneMatch(b -> b instanceof UnbekannterBefehl);
+
+    var anwendung = BefehlAnwender.anwenden(gesetz, parseErgebnis.befehle());
+    assertThat(anwendung.protokoll()).hasSameSizeAs(parseErgebnis.befehle());
+  }
 }
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java
new file mode 100644
index 0000000..a8ec3aa
--- /dev/null
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java
@@ -0,0 +1,128 @@
+package eu.mulk.aendggner.aenderung.parse;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import eu.mulk.aendggner.aenderung.Aenderungsbefehl;
+import eu.mulk.aendggner.gesetz.Gesetz;
+import java.util.List;
+import org.junit.jupiter.api.Test;
+
+class AenderungsgesetzParserTest {
+
+  private static final Gesetz BAYJG =
+      new Gesetz("BayJG", "Bayerisches Jagdgesetz", null, List.of(), List.of());
+
+  private static final Gesetz UWG =
+      new Gesetz(
+          "UWG", "Gesetz gegen den unlauteren Wettbewerb", "UWG-Langtitel", List.of(), List.of());
+
+  @Test
+  void teiltParagraphenGegliedertesAenderungsgesetz() {
+    // Bayerischer Stil: das Änderungsgesetz gliedert sich in §§; § 1 und § 2 treffen dasselbe
+    // Stammgesetz, § 3 ein anderes; Inkrafttretens-§ ohne Änderungsformel wird nicht gewählt.
+    var text =
+        """
+        § 1
+        Änderung des
+        Bayerischen Jagdgesetzes
+        Das Bayerische Jagdgesetz (BayJG) in der in der Bayerischen Rechtssammlung (BayRS 792-1-W) veröffentlichten bereinigten Fassung, das zuletzt durch § 5 des Gesetzes vom 23. Juli 2024 (GVBl. S. 247) geändert worden ist, wird wie folgt geändert:
+        1. Art. 1 wird wie folgt geändert:
+        a) In Abs. 2 Satzteil vor Nr. 1 wird die Angabe „Bundesjagdgesetz“ durch die Angabe „BJagdG“ ersetzt.
+        b) Fußnote 1 wird aufgehoben.
+        § 2
+        Weitere Änderung des
+        Bayerischen Jagdgesetzes
+        Das Bayerische Jagdgesetz (BayJG) in der in der Bayerischen Rechtssammlung (BayRS 792-1-W) veröffentlichten bereinigten Fassung, das zuletzt durch § 1 dieses Gesetzes geändert worden ist, wird wie folgt geändert:
+        Art. 28 Abs. 1 wird wie folgt geändert:
+        1. Satz 4 wird aufgehoben.
+        2. Satz 5 wird Satz 4.
+        § 3
+        Änderung des
+        Bayerischen Umweltinformationsgesetzes
+        Art. 7 Abs. 2 des Bayerischen Umweltinformationsgesetzes (BayUIG) vom 8. Dezember 2006 (GVBl. S. 933, BayRS 2129-1-4-U), das zuletzt durch § 10 des Gesetzes vom 23. Dezember 2024 (GVBl. S. 605) geändert worden ist, wird wie folgt geändert:
+        1. Der Wortlaut wird Satz 1.
+        § 4
+        Inkrafttreten
+        Dieses Gesetz tritt am 1. April 2026 in Kraft.
+        """;
+
+    var ergebnis = new AenderungsgesetzParser().parse(text, BAYJG, null);
+
+    assertThat(ergebnis.artikel()).containsExactly("1", "2");
+    // § 2: Vorspann-Rahmen „Art. 28 Abs. 1“ wird Kontext der Punkte.
+    var aufhebung =
+        ergebnis.befehle().stream()
+            .filter(b -> b instanceof Aenderungsbefehl.Aufhebung)
+            .map(Aenderungsbefehl::stelle)
+            .map(s -> s.anzeigeText())
+            .toList();
+    assertThat(aufhebung).contains("Art. 28 Absatz 1 Satz 4");
+  }
+
+  @Test
+  void eingebettetesRahmenzielSetztKontext() {
+    var bayUig =
+        new Gesetz(
+            "BayUIG", "Bayerisches Umweltinformationsgesetz", null, List.of(), List.of());
+    var text =
+        """
+        § 3
+        Änderung des
+        Bayerischen Umweltinformationsgesetzes
+        Art. 7 Abs. 2 des Bayerischen Umweltinformationsgesetzes (BayUIG) vom 8. Dezember 2006 (GVBl. S. 933, BayRS 2129-1-4-U), das zuletzt durch § 10 des Gesetzes vom 23. Dezember 2024 (GVBl. S. 605) geändert worden ist, wird wie folgt geändert:
+        1. Der Wortlaut wird Satz 1.
+        2. Folgender Satz 2 wird angefügt:
+        „²Die Voraussetzungen nach Satz 1 Nr. 2 sind insbesondere gegeben.“
+        """;
+
+    var ergebnis = new AenderungsgesetzParser().parse(text, bayUig, null);
+
+    assertThat(ergebnis.artikel()).containsExactly("3");
+    // Das eingebettete Ziel „Art. 7 Abs. 2“ ist Kontext aller Punkte — nicht etwa das „§ 10“
+    // aus der Zitierkette der Änderungshistorie.
+    assertThat(ergebnis.befehle())
+        .allSatisfy(
+            befehl ->
+                assertThat(befehl.stelle().anzeigeText()).startsWith("Art. 7 Absatz 2"));
+  }
+
+  @Test
+  void artikelUeberschriftenUnterdrueckenParagraphenModus() {
+    // Ein Bundes-Änderungsgesetz mit unzitiert abgedrucktem Ablösegesetz enthält freistehende
+    // „§ N“-Zeilen — sie dürfen nicht als äußere Gliederung gedeutet werden.
+    var text =
+        """
+        Artikel 1
+        Das Gesetz gegen den unlauteren Wettbewerb vom 3. Juli 2004, das zuletzt geändert worden ist, wird wie folgt geändert:
+        1. In § 5 wird die Angabe „alt“ durch die Angabe „neu“ ersetzt.
+        Artikel 2
+        § 1
+        Dieses Gesetz tritt am 1. Januar 2027 in Kraft.
+        """;
+
+    var ergebnis = new AenderungsgesetzParser().parse(text, UWG, null);
+
+    assertThat(ergebnis.artikel()).containsExactly("1");
+    assertThat(ergebnis.befehle()).hasSize(1);
+    assertThat(ergebnis.befehle().get(0)).isInstanceOf(Aenderungsbefehl.Ersetzung.class);
+  }
+
+  @Test
+  void artikelFilterImParagraphenModusVerlangtAenderungsformel() {
+    var text =
+        """
+        § 1
+        Das Bayerische Jagdgesetz (BayJG), das zuletzt geändert worden ist, wird wie folgt geändert:
+        1. In Art. 1 wird die Angabe „alt“ durch die Angabe „neu“ ersetzt.
+        § 2
+        Dieses Gesetz tritt am 1. April 2026 in Kraft.
+        """;
+
+    // § 2 ist der Inkrafttretens-§ ohne Änderungsformel: der Filter wählt ihn nicht.
+    var ergebnis = new AenderungsgesetzParser().parse(text, BAYJG, "2");
+    assertThat(ergebnis.artikel()).isEmpty();
+
+    var eins = new AenderungsgesetzParser().parse(text, BAYJG, "1");
+    assertThat(eins.artikel()).containsExactly("1");
+  }
+}
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java
index f8cfe82..8cf9eea 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java
@@ -1026,4 +1026,121 @@
     assertThat(ersetzung.alt()).isEqualTo("einer Rechtsverordnung nach § 14,");
     assertThat(ersetzung.neu()).isEqualTo("§ 14 Absatz 8,");
   }
+
+  // --- Bayerisches Landesrecht ---------------------------------------------------------------
+
+  private static final Stelle ART_22 = new Stelle(List.of(new Stelle.Paragraph("22", "Art.")));
+
+  @Test
+  void erkenntBayerischeErsetzungMitAbkuerzungen() {
+    var befehl =
+        erkenne(
+            "In Abs. 2 Satz 1 Nr. 1 wird die Angabe „des Bundesbaugesetzes“ durch die Angabe"
+                + " „des Baugesetzbuchs (BauGB)“ ersetzt.",
+            new Stelle(List.of(new Stelle.Paragraph("6", "Art."))));
+
+    assertThat(befehl).containsInstanceOf(Ersetzung.class);
+    var ersetzung = (Ersetzung) befehl.orElseThrow();
+    assertThat(ersetzung.stelle().anzeigeText()).isEqualTo("Art. 6 Absatz 2 Satz 1 Nummer 1");
+  }
+
+  @Test
+  void erkenntFussnotenAufhebung() {
+    var einzeln = erkenne("Fußnote 1 wird aufgehoben.", ART_22);
+    assertThat(einzeln).containsInstanceOf(Aenderungsbefehl.FussnotenAufhebung.class);
+    assertThat(((Aenderungsbefehl.FussnotenAufhebung) einzeln.orElseThrow()).nummern())
+        .containsExactly("1");
+
+    var mehrere = erkenne("Die Fußnoten 9 und 10 werden aufgehoben.", ART_22);
+    assertThat(mehrere).containsInstanceOf(Aenderungsbefehl.FussnotenAufhebung.class);
+    assertThat(((Aenderungsbefehl.FussnotenAufhebung) mehrere.orElseThrow()).nummern())
+        .containsExactly("9", "10");
+  }
+
+  @Test
+  void erkenntSatznummerierungsStreichungImVerbund() {
+    // GVBl 2026 S. 113, Nr. 15 c) aa) — exakt die Verbundform des Belegdokuments.
+    var befehl =
+        erkenne(
+            "In Satz 1 wird die Satznummerierung „1“ gestrichen und die Angabe „Absätzen 1"
+                + " und 2“ wird durch die Angabe „Abs. 1 und 2“ ersetzt.",
+            ART_22);
+
+    assertThat(befehl).containsInstanceOf(Sammelbefehl.class);
+    var teile = ((Sammelbefehl) befehl.orElseThrow()).teilbefehle();
+    assertThat(teile.get(0)).isInstanceOf(Aenderungsbefehl.SatznummerierungStreichung.class);
+    var streichung = (Aenderungsbefehl.SatznummerierungStreichung) teile.get(0);
+    assertThat(streichung.nummer()).isEqualTo("1");
+    assertThat(streichung.stelle().anzeigeText()).isEqualTo("Art. 22 Satz 1");
+    assertThat(teile.get(1)).isInstanceOf(Ersetzung.class);
+
+    var einfach = erkenne("In Satz 1 wird die Satznummerierung „1“ gestrichen.", ART_22);
+    assertThat(einfach).containsInstanceOf(Aenderungsbefehl.SatznummerierungStreichung.class);
+  }
+
+  @Test
+  void erkenntBayerischeWortlautFormen() {
+    var zuSatz = erkenne("Der Wortlaut wird Satz 1.", ART_22);
+    assertThat(zuSatz).containsInstanceOf(Aenderungsbefehl.WortlautZuSatz.class);
+
+    var zuAbsatz = erkenne("Der bisherige Wortlaut wird Abs. 5.", ART_22);
+    assertThat(zuAbsatz).containsInstanceOf(WortlautZuAbsatz.class);
+    assertThat(((WortlautZuAbsatz) zuAbsatz.orElseThrow()).nummer()).isEqualTo("5");
+
+    var voranstellung =
+        erkenne(
+            "Dem Wortlaut werden die folgenden Abs. 1 bis 4 vorangestellt: „(1) Erster."
+                + " (2) Zweiter. (3) Dritter. (4) Vierter.“",
+            ART_22);
+    assertThat(voranstellung).containsInstanceOf(Aenderungsbefehl.WortlautVoranstellung.class);
+    assertThat(((Aenderungsbefehl.WortlautVoranstellung) voranstellung.orElseThrow()).text())
+        .contains("(3) Dritter.");
+  }
+
+  @Test
+  void erkenntWortlautZuAbsatzMitFolgeklausel() {
+    // „Der bisherige Wortlaut wird Abs. 5 und in Halbsatz 1 wird …“ — die lokative Folgeklausel
+    // bezieht sich auf den soeben nummerierten Absatz.
+    var befehl =
+        erkenne(
+            "Der bisherige Wortlaut wird Abs. 5 und in Halbsatz 1 wird die Angabe „Das"
+                + " Staatsministerium“ durch die Angabe „Die oberste Jagdbehörde“ ersetzt.",
+            ART_22);
+
+    assertThat(befehl).containsInstanceOf(Sammelbefehl.class);
+    var teile = ((Sammelbefehl) befehl.orElseThrow()).teilbefehle();
+    assertThat(teile.get(0)).isInstanceOf(WortlautZuAbsatz.class);
+    assertThat(teile.get(1)).isInstanceOf(Ersetzung.class);
+    assertThat(((Ersetzung) teile.get(1)).stelle().anzeigeText())
+        .isEqualTo("Art. 22 Absatz 5 Halbsatz 1");
+  }
+
+  @Test
+  void erkenntSatzUmnummerierungMitErsetzungsKlausel() {
+    // GVBl 2026 S. 113, Nr. 23 c) cc).
+    var befehl =
+        erkenne(
+            "Der bisherige Satz 2 wird Satz 3 und die Angabe „der Durchführung der Lehrgänge"
+                + " (Art. 28 Abs. 1 Satz 4),“ wird durch die Angabe „einer Durchführung von"
+                + " Lehrgängen für die Fallenjagd“ ersetzt.",
+            ART_22);
+
+    assertThat(befehl).containsInstanceOf(Sammelbefehl.class);
+    var teile = ((Sammelbefehl) befehl.orElseThrow()).teilbefehle();
+    assertThat(teile.get(0)).isInstanceOf(Umnummerierung.class);
+    assertThat(teile.get(1)).isInstanceOf(Ersetzung.class);
+  }
+
+  @Test
+  void erkenntBayerischeUmnummerierungsVerbuende() {
+    // „Abs. 3 wird Abs. 2 und wird wie folgt geändert:“ läuft über rahmenMitBefehl;
+    // „Satz 5 wird Satz 4.“ ist eine gewöhnliche Umnummerierung.
+    var satz = erkenne("Satz 5 wird Satz 4.", ART_22);
+    assertThat(satz).containsInstanceOf(Umnummerierung.class);
+    assertThat(((Umnummerierung) satz.orElseThrow()).neu().anzeigeText())
+        .isEqualTo("Art. 22 Satz 4");
+
+    var abs = erkenne("Abs. 3 wird Abs. 2.", ART_22);
+    assertThat(abs).containsInstanceOf(Umnummerierung.class);
+  }
 }
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/StellenParserTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/StellenParserTest.java
index 9389534..f15b98f 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/StellenParserTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/StellenParserTest.java
@@ -83,6 +83,33 @@
   }
 
   @Test
+  void parstBayerischeArtikelStelle() {
+    // Bayerisches Landesrecht: Normen heißen „Art. N“, Unterkomponenten sind abgekürzt.
+    var stelle = StellenParser.parse("Art. 6 Abs. 2 Satz 1 Nr. 2").orElseThrow();
+    assertThat(stelle.anzeigeText()).isEqualTo("Art. 6 Absatz 2 Satz 1 Nummer 2");
+    assertThat(stelle.paragraph().orElseThrow().enbez()).isEqualTo("Art. 6");
+  }
+
+  @Test
+  void parstBayerischenBereichMitAbkuerzung() {
+    // „In den Abs. 4 und 5“ und Bereiche wie „Art. 4 bis 6“ mit erhaltenem Sigel.
+    var stellen = StellenParser.parseMehrfach("Art. 4 Abs. 3, Art. 5 Abs. 2 und Art. 11 Abs. 6");
+    assertThat(stellen).extracting(Stelle::anzeigeText)
+        .containsExactly("Art. 4 Absatz 3", "Art. 5 Absatz 2", "Art. 11 Absatz 6");
+    var bereich = StellenParser.parseMehrfach("Abs. 1 bis 3");
+    assertThat(bereich).extracting(Stelle::anzeigeText)
+        .containsExactly("Absatz 1", "Absatz 2", "Absatz 3");
+  }
+
+  @Test
+  void ignoriertBayerischenChapeauZusatz() {
+    assertThat(StellenParser.parse("Abs. 2 Satzteil vor Nr. 1").orElseThrow().anzeigeText())
+        .isEqualTo("Absatz 2");
+    assertThat(StellenParser.parse("in dem Satzteil nach Nr. 3").isEmpty()).isTrue();
+    assertThat(StellenParser.istNurChapeau("in dem Satzteil nach Nr. 3")).isTrue();
+  }
+
+  @Test
   void ignoriertChapeauZusatz() {
     // „in der Angabe vor Nummer 1“ ist ein verfeinernder Zusatz ohne eigene Komponente.
     assertThat(StellenParser.parse("Absatz 1 in der Angabe vor Nummer 1").orElseThrow().anzeigeText())
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java
index 8a7cf12..755db46 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java
@@ -48,6 +48,36 @@
   }
 
   @Test
+  void entferntGvblKolumnentitel() {
+    // Gerade Seiten kleben die Seitenzahl ohne Zwischenraum an die Jahreszahl („…/202676“);
+    // eine am Seitenwechsel unterbrochene Silbentrennung heilt nach der Kopfentfernung.
+    var roh =
+        "Einheiten über Online-Plattformen für die kurz-\n"
+            + "Bayerisches Gesetz- und Verordnungsblatt Nr. 6/202676\n"
+            + "fristige Vermietung von Unterkünften anbietet, \n"
+            + "Bayerisches Gesetz- und Verordnungsblatt Nr. 6/2026 77\n"
+            + "Zweiter Satz. ";
+
+    assertThat(TextBereiniger.bereinige(roh))
+        .isEqualTo(
+            "Einheiten über Online-Plattformen für die kurzfristige Vermietung von Unterkünften"
+                + " anbietet,\nZweiter Satz.");
+  }
+
+  @Test
+  void entferntLandtagsKolumnentitel() {
+    var roh =
+        "Bayerischer Landtag \n"
+            + "19. Wahlperiode 28.01.2026  Drucksache 19/9707 \n"
+            + "Erster Satz. \n"
+            + "Drucksache 19/9707 Bayerischer Landtag 19. Wahlperiode Seite 2 \n"
+            + "Zweiter Satz. \n"
+            + "19. Wahlperiode Drucksache 19/9707 ";
+
+    assertThat(TextBereiniger.bereinige(roh)).isEqualTo("Erster Satz.\nZweiter Satz.");
+  }
+
+  @Test
   void entferntKopfzeilenDesNeuenBgblFormats() {
     var roh =
         "Erster Satz. \n"
diff --git a/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java b/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java
index aa658dd..a23f444 100644
--- a/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java
+++ b/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java
@@ -984,4 +984,154 @@
   private static String absatzText(Gesetz gesetz, String enbez, int index) {
     return gesetz.norm(enbez).orElseThrow().absaetze().get(index).text();
   }
+
+  // --- Bayerisches Landesrecht ---------------------------------------------------------------
+
+  /** Ein Gesetz nach bayerischem Muster: Art.-Normen, amtliche Satznummern, Fußnoten. */
+  private static Gesetz bayGesetz() {
+    return new Gesetz(
+        "BayTestG",
+        "Bayerisches Testgesetz",
+        null,
+        List.of(
+            new Norm(
+                "Art. 1",
+                "Zweck",
+                null,
+                List.of(
+                    new Absatz(
+                        "1",
+                        "¹Die Erprobung ist Zweck dieses Gesetzes⁶). ²Sie erfolgt sorgfältig.\n"
+                            + "⁶) [Amtl. Anm.:] BayRS 0-0-T"),
+                    new Absatz("2", "¹Erster Satz. ²Zweiter Satz.")),
+                false),
+            new Norm(
+                "Art. 2",
+                "Begriffe",
+                null,
+                List.of(
+                    new Absatz(
+                        null,
+                        "Erprobung ist die Prüfung der Tauglichkeit; sie endet mit einem"
+                            + " Bericht.")),
+                false)),
+        List.of());
+  }
+
+  @Test
+  void wendetFussnotenAufhebungAn() {
+    var befehl =
+        new eu.mulk.aendggner.aenderung.Aenderungsbefehl.FussnotenAufhebung(
+            stelle(new Stelle.Paragraph("1", "Art.")), List.of("6"), PROV);
+
+    var ergebnis = BefehlAnwender.anwenden(bayGesetz(), List.of(befehl));
+
+    assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.ANGEWANDT);
+    var text = absatzText(ergebnis.neu(), "Art. 1", 0);
+    assertThat(text).doesNotContain("⁶").doesNotContain("[Amtl. Anm.:]");
+    assertThat(text).startsWith("¹Die Erprobung ist Zweck dieses Gesetzes.");
+  }
+
+  @Test
+  void meldetFehlendeFussnoteAlsManuellPruefen() {
+    var befehl =
+        new eu.mulk.aendggner.aenderung.Aenderungsbefehl.FussnotenAufhebung(
+            stelle(new Stelle.Paragraph("1", "Art.")), List.of("7"), PROV);
+
+    var ergebnis = BefehlAnwender.anwenden(bayGesetz(), List.of(befehl));
+
+    assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.MANUELL_PRUEFEN);
+    assertThat(ergebnis.protokoll().get(0).begruendung()).contains("Fußnote 7");
+  }
+
+  @Test
+  void wendetSatznummerierungsStreichungAn() {
+    var befehl =
+        new eu.mulk.aendggner.aenderung.Aenderungsbefehl.SatznummerierungStreichung(
+            stelle(
+                new Stelle.Paragraph("1", "Art."),
+                new Stelle.AbsatzNr("2"),
+                new Stelle.SatzNr("1")),
+            "1",
+            PROV);
+
+    var ergebnis = BefehlAnwender.anwenden(bayGesetz(), List.of(befehl));
+
+    assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.ANGEWANDT);
+    assertThat(absatzText(ergebnis.neu(), "Art. 1", 1)).isEqualTo("Erster Satz. ²Zweiter Satz.");
+  }
+
+  @Test
+  void satzUmnummerierungSchreibtSuperskriptUm() {
+    // „Satz 2 wird Satz 3.“ — die amtliche Satznummer im Text wird umgeschrieben.
+    var befehl =
+        new Umnummerierung(
+            stelle(
+                new Stelle.Paragraph("1", "Art."),
+                new Stelle.AbsatzNr("2"),
+                new Stelle.SatzNr("2")),
+            stelle(
+                new Stelle.Paragraph("1", "Art."),
+                new Stelle.AbsatzNr("2"),
+                new Stelle.SatzNr("3")),
+            PROV);
+
+    var ergebnis = BefehlAnwender.anwenden(bayGesetz(), List.of(befehl));
+
+    assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.ANGEWANDT);
+    assertThat(absatzText(ergebnis.neu(), "Art. 1", 1)).isEqualTo("¹Erster Satz. ³Zweiter Satz.");
+  }
+
+  @Test
+  void wendetWortlautZuSatzAn() {
+    var befehl =
+        new eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautZuSatz(
+            stelle(new Stelle.Paragraph("2", "Art.")), "1", PROV);
+
+    var ergebnis = BefehlAnwender.anwenden(bayGesetz(), List.of(befehl));
+
+    assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.ANGEWANDT);
+    assertThat(absatzText(ergebnis.neu(), "Art. 2", 0)).startsWith("¹Erprobung ist die Prüfung");
+  }
+
+  @Test
+  void wendetWortlautVoranstellungUndNummerierungAn() {
+    // Bayerische Folge: erst „Dem Wortlaut werden die folgenden Abs. 1 und 2 vorangestellt“,
+    // dann „Der bisherige Wortlaut wird Abs. 3“ — nur der unnummerierte Absatz erhält die Nummer.
+    var voranstellung =
+        new eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautVoranstellung(
+            stelle(new Stelle.Paragraph("2", "Art.")), "(1) Erstens. (2) Zweitens.", PROV);
+    var nummerierung =
+        new eu.mulk.aendggner.aenderung.Aenderungsbefehl.WortlautZuAbsatz(
+            stelle(new Stelle.Paragraph("2", "Art.")), "3", PROV);
+
+    var ergebnis = BefehlAnwender.anwenden(bayGesetz(), List.of(voranstellung, nummerierung));
+
+    assertThat(ergebnis.protokoll())
+        .allSatisfy(eintrag -> assertThat(eintrag.status()).isEqualTo(Status.ANGEWANDT));
+    var norm = ergebnis.neu().norm("Art. 2").orElseThrow();
+    assertThat(norm.absaetze()).hasSize(3);
+    assertThat(norm.absaetze().get(0).nummer()).isEqualTo("1");
+    assertThat(norm.absaetze().get(1).nummer()).isEqualTo("2");
+    assertThat(norm.absaetze().get(2).nummer()).isEqualTo("3");
+    assertThat(norm.absaetze().get(2).text()).startsWith("Erprobung ist");
+  }
+
+  @Test
+  void wendetHalbsatzErsetzungAn() {
+    var befehl =
+        new Ersetzung(
+            stelle(new Stelle.Paragraph("2", "Art."), new Stelle.HalbsatzNr("2")),
+            "sie endet",
+            "sie schließt",
+            false,
+            false,
+            PROV);
+
+    var ergebnis = BefehlAnwender.anwenden(bayGesetz(), List.of(befehl));
+
+    assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.ANGEWANDT);
+    assertThat(absatzText(ergebnis.neu(), "Art. 2", 0))
+        .isEqualTo("Erprobung ist die Prüfung der Tauglichkeit; sie schließt mit einem Bericht.");
+  }
 }
diff --git a/src/test/java/eu/mulk/aendggner/anwendung/SatzTeilerTest.java b/src/test/java/eu/mulk/aendggner/anwendung/SatzTeilerTest.java
index 7df8f37..a97fc03 100644
--- a/src/test/java/eu/mulk/aendggner/anwendung/SatzTeilerTest.java
+++ b/src/test/java/eu/mulk/aendggner/anwendung/SatzTeilerTest.java
@@ -38,6 +38,30 @@
   }
 
   @Test
+  void teiltAnAmtlichenSatznummern() {
+    // Bayerisches Landesrecht: hochgestellte Satznummern sind exakte Satzgrenzen — auch dort,
+    // wo die Heuristik versagen würde (Abkürzung am Satzende).
+    var text = "¹Die Förderung erfolgt gem. Art. 26 und 27. ²Sie ist als Teil zu bewahren.";
+    assertThat(SatzTeiler.teileTexte(text))
+        .containsExactly(
+            "¹Die Förderung erfolgt gem. Art. 26 und 27.", "²Sie ist als Teil zu bewahren.");
+    assertThat(SatzTeiler.nummerVonSatz("²Sie ist als Teil zu bewahren.")).isEqualTo(2);
+    assertThat(SatzTeiler.nummerVonSatz("Ohne Nummer.")).isNull();
+  }
+
+  @Test
+  void fussnotenmarkerIstKeinSatzanfang() {
+    // „Enteignung⁶)“ mitten im Satz und die Fußnotenzeile „⁶) …“ eröffnen keinen neuen Satz.
+    var text =
+        "¹Es gilt das Gesetz über die entschädigungspflichtige Enteignung⁶) entsprechend."
+            + " ²Näheres regelt die Verordnung.\n⁶) [Amtl. Anm.:] BayRS 2141-1-I";
+    var saetze = SatzTeiler.teileTexte(text);
+    assertThat(saetze).hasSize(2);
+    assertThat(saetze.get(0)).contains("Enteignung⁶)");
+    assertThat(saetze.get(1)).startsWith("²Näheres").contains("⁶) [Amtl. Anm.:]");
+  }
+
+  @Test
   void behandeltAufzaehlungenAlsTeilDesSatzes() {
     var text =
         "Die Erprobung umfasst\n"
diff --git a/src/test/java/eu/mulk/aendggner/gesetz/bayern/BayRechtTextParserTest.java b/src/test/java/eu/mulk/aendggner/gesetz/bayern/BayRechtTextParserTest.java
new file mode 100644
index 0000000..a5fc67a
--- /dev/null
+++ b/src/test/java/eu/mulk/aendggner/gesetz/bayern/BayRechtTextParserTest.java
@@ -0,0 +1,120 @@
+package eu.mulk.aendggner.gesetz.bayern;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import eu.mulk.aendggner.gesetz.Gliederung;
+import org.junit.jupiter.api.Test;
+
+class BayRechtTextParserTest {
+
+  private static final String BEISPIEL =
+      """
+      BayJG: Bayerisches Jagdgesetz (BayJG) Vom 13. Oktober 1978 (BayRS V S. 595) BayRS 792-1-W (Art.
+      1–64)
+      Bayerisches Jagdgesetz
+      (BayJG)
+      Vom 13. Oktober 1978
+      (BayRS V S. 595)
+      BayRS 792-1-W
+      Vollzitat nach RedR: Bayerisches Jagdgesetz (BayJG) in der in der Bayerischen Rechtssammlung (BayRS
+      792-1-L) veröffentlichten bereinigten Fassung
+      I. Abschnitt Grundsätze
+      Art. 1  Gesetzeszweck
+
+      (1) ¹Die freilebende Tierwelt ist wesentlicher Bestandteil der heimischen Natur. ²Sie ist zu bewahren.
+      (2) Dieses Gesetz soll dazu dienen:
+      1.  einen artenreichen Wildbestand zu erhalten,
+
+      2.  die Lebensgrundlagen des Wildes zu sichern.
+
+      II. Abschnitt Jagdreviere, Hegegemeinschaften
+      1. Allgemeine Vorschriften
+      Art. 3  Feststellung der Jagdreviere
+
+      Bestand, Umfang und Grenzen eines Jagdreviers werden durch die
+      Jagdbehörde festgestellt.
+      2. Jagdreviere
+      Art. 8  Eigenjagdreviere
+
+      (1) ¹Die Mindestgröße beträgt 81,755 ha. ²Die Art. 4 Abs. 3, Art. 5 Abs. 2 und
+      Art. 11 Abs. 6 sind entsprechend anzuwenden.
+      Art. 59  Enteignende Maßnahmen
+
+      (1) Es ist nach den Vorschriften des Gesetzes über die entschädigungspflichtige Enteignung⁶) Entschädigung zu leisten.
+      6) [Amtl. Anm.:] BayRS 2141-1-I
+      Art. 60  (aufgehoben)
+
+      Art. 63 (Änderungsbestimmung)
+
+      Art. 64  Inkrafttreten; Aufhebung von Vorschriften
+
+      (1) Dieses Gesetz tritt am 1. Januar 1979 in Kraft.
+      """;
+
+  @Test
+  void parstTitelblock() {
+    var gesetz = BayRechtTextParser.parse(BEISPIEL);
+    assertThat(gesetz.jurabk()).isEqualTo("BayJG");
+    assertThat(gesetz.langue()).isEqualTo("Bayerisches Jagdgesetz");
+    assertThat(gesetz.kurzue()).isNull();
+  }
+
+  @Test
+  void parstNormenMitTitelnUndAbsaetzen() {
+    var gesetz = BayRechtTextParser.parse(BEISPIEL);
+    assertThat(gesetz.normen())
+        .extracting(n -> n.enbez())
+        .containsExactly("Art. 1", "Art. 3", "Art. 8", "Art. 59", "Art. 60", "Art. 63", "Art. 64");
+
+    var art1 = gesetz.norm("Art. 1").orElseThrow();
+    assertThat(art1.titel()).isEqualTo("Gesetzeszweck");
+    assertThat(art1.absaetze()).hasSize(2);
+    assertThat(art1.absaetze().get(0).nummer()).isEqualTo("1");
+    assertThat(art1.absaetze().get(0).text()).startsWith("¹Die freilebende Tierwelt");
+    assertThat(art1.absaetze().get(1).text()).contains("1.  einen artenreichen");
+
+    // Unnummerierter Einzelabsatz.
+    var art3 = gesetz.norm("Art. 3").orElseThrow();
+    assertThat(art3.absaetze()).hasSize(1);
+    assertThat(art3.absaetze().get(0).nummer()).isNull();
+  }
+
+  @Test
+  void querverweiseAmZeilenanfangEroeffnenKeineNorm() {
+    // „Art. 11 Abs. 6 …“ am Zeilenanfang in Art. 8 ist ein Querverweis, kein Normkopf.
+    var gesetz = BayRechtTextParser.parse(BEISPIEL);
+    var art8 = gesetz.norm("Art. 8").orElseThrow();
+    assertThat(art8.absaetze().get(0).text()).contains("Art. 11 Abs. 6 sind entsprechend");
+    assertThat(gesetz.norm("Art. 11")).isEmpty();
+  }
+
+  @Test
+  void parstGliederungenMitUnterUeberschriften() {
+    var gesetz = BayRechtTextParser.parse(BEISPIEL);
+    assertThat(gesetz.gliederungen())
+        .extracting(Gliederung::anzeigeText)
+        .containsExactly(
+            "I. Abschnitt — Grundsätze",
+            "II. Abschnitt — Jagdreviere, Hegegemeinschaften",
+            "1. — Allgemeine Vorschriften",
+            "2. — Jagdreviere");
+    // Kennzahlen sind eindeutig und hängen an der Eltern-Gliederung.
+    assertThat(gesetz.gliederungen())
+        .extracting(Gliederung::kennzahl)
+        .containsExactly("001", "002", "002.1", "002.2");
+    assertThat(gesetz.norm("Art. 8").orElseThrow().gliederung().kennzahl()).isEqualTo("002.2");
+  }
+
+  @Test
+  void erkenntWeggefalleneNormenUndFussnoten() {
+    var gesetz = BayRechtTextParser.parse(BEISPIEL);
+    assertThat(gesetz.norm("Art. 60").orElseThrow().weggefallen()).isTrue();
+    assertThat(gesetz.norm("Art. 63").orElseThrow().weggefallen()).isFalse();
+
+    // Fußnotenzeile bleibt superskript-normalisiert im tragenden Absatz.
+    var art59 = gesetz.norm("Art. 59").orElseThrow();
+    assertThat(art59.absaetze().get(0).text())
+        .contains("Enteignung⁶)")
+        .contains("⁶) [Amtl. Anm.:] BayRS 2141-1-I");
+  }
+}