diff --git a/Doku/reduce_filesize/filter_zip_no_stl.py b/Doku/reduce_filesize/filter_zip_no_stl.py
new file mode 100644
index 0000000..49be176
--- /dev/null
+++ b/Doku/reduce_filesize/filter_zip_no_stl.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python3
+"""
+Filtert ein ZIP-Archiv und entfernt alle .stl Dateien.
+Ausgabe: originalname_heute.zip (oder ersetzt Original mit --replace)
+"""
+
+import zipfile
+import sys
+import argparse
+import shutil
+import struct
+import zlib
+from pathlib import Path
+
+
+def filter_zip_no_stl(source_zip_path: str, replace: bool = False) -> str:
+ """
+ Öffnet ein ZIP und erstellt ein neues ohne .stl Dateien.
+
+ Args:
+ source_zip_path: Pfad zur Quell-ZIP-Datei
+ replace: Wenn True, wird das Original ersetzt
+
+ Returns:
+ Pfad zur erstellten/ersetzten ZIP-Datei
+ """
+ source_path = Path(source_zip_path)
+
+ if not source_path.exists():
+ raise FileNotFoundError(f"Datei nicht gefunden: {source_zip_path}")
+
+ if not source_path.suffix.lower() == '.zip':
+ raise ValueError(f"Keine ZIP-Datei: {source_zip_path}")
+
+ # Temporäres Ziel-ZIP
+ temp_path = source_path.with_name(f"{source_path.stem}_heute.zip")
+
+ copied_count = 0
+ skipped_count = 0
+
+ print("Filtere ZIP und erstelle neues Archiv mit UTF-8 Encoding...")
+
+ with zipfile.ZipFile(source_path, 'r') as src_zip:
+ with zipfile.ZipFile(temp_path, 'w', zipfile.ZIP_DEFLATED) as dst_zip:
+ # Iteriere über alle Dateien im Quell-ZIP
+ for info in src_zip.infolist():
+ # Verzeichnisse überspringen
+ if info.is_dir():
+ continue
+
+ # .stl Dateien überspringen
+ if info.filename.lower().endswith('.stl'):
+ skipped_count += 1
+ print(f" - {info.filename}")
+ continue
+
+ # Kopiere Datei ins neue ZIP
+ try:
+ # Lese Dateiinhalt
+ with src_zip.open(info, 'r') as source:
+ file_data = source.read()
+
+ # Schreibe ins neue ZIP (mit UTF-8 Encoding)
+ dst_zip.writestr(info.filename, file_data, compress_type=zipfile.ZIP_DEFLATED)
+ copied_count += 1
+
+ except Exception as e:
+ # Fallback: Low-Level Extraktion für problematische Dateien
+ try:
+ # Lese direkt aus der ZIP-Datei ohne Validierung
+ with open(source_path, 'rb') as f:
+ # Gehe zu Local File Header
+ f.seek(info.header_offset)
+
+ # Lese Local File Header (30 Bytes)
+ fheader = f.read(30)
+ if len(fheader) != 30:
+ raise Exception("Kann Local File Header nicht lesen")
+
+ # Parse Header (ZIP Local File Header format)
+ sig, ver, flags, comp_method, mod_time, mod_date, crc, comp_size, uncomp_size, fname_len, extra_len = struct.unpack('<4s5H3I2H', fheader)
+ if sig != b'PK\x03\x04':
+ raise Exception("Ungültiger Local File Header")
+
+ # Lese raw filename bytes aus Header
+ raw_filename_bytes = f.read(fname_len)
+
+ # Überspringe Extra Field
+ f.seek(info.header_offset + 30 + fname_len + extra_len)
+
+ # Lese komprimierte Daten
+ compressed_data = f.read(comp_size)
+
+ # Dekomprimiere
+ if comp_method == 8: # DEFLATE
+ file_data = zlib.decompress(compressed_data, -zlib.MAX_WBITS)
+ elif comp_method == 0: # STORED
+ file_data = compressed_data
+ else:
+ raise Exception(f"Unbekannte Kompression: {comp_method}")
+
+ # Dekodiere Dateinamen mit latin-1 (ISO-8859-1)
+ # latin-1 unterstützt deutsche Umlaute korrekt (\xf6 = ö)
+ correct_filename = raw_filename_bytes.decode('latin-1', errors='replace')
+
+ # Schreibe ins neue ZIP mit korrigiertem Namen
+ dst_zip.writestr(correct_filename, file_data, compress_type=zipfile.ZIP_DEFLATED)
+ copied_count += 1
+ print(f" + {correct_filename} (re-encoded)")
+
+ except Exception as e2:
+ print(f" ! Warnung: Konnte {info.filename} nicht kopieren: {e2}")
+ skipped_count += 1
+
+ print(f"\nErgebnis: {copied_count} Datei(en) kopiert, {skipped_count} STL-Datei(en) entfernt")
+
+ if replace:
+ shutil.move(str(temp_path), str(source_path))
+ print(f"Original ersetzt: {source_path}")
+ return str(source_path)
+ else:
+ print(f"Ziel-ZIP: {temp_path}")
+ return str(temp_path)
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Filtert ZIP-Archive und entfernt alle .stl Dateien."
+ )
+ parser.add_argument(
+ "zipfile",
+ help="Pfad zur Quell-ZIP-Datei"
+ )
+ parser.add_argument(
+ "--replace",
+ action="store_true",
+ help="Original-ZIP durch gefilterte Version ersetzen"
+ )
+
+ args = parser.parse_args()
+
+ try:
+ filter_zip_no_stl(args.zipfile, args.replace)
+ except (FileNotFoundError, ValueError, zipfile.BadZipFile) as e:
+ print(f"Fehler: {e}", file=sys.stderr)
+ sys.exit(1)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/Doku/reduce_filesize/mkexe.bat b/Doku/reduce_filesize/mkexe.bat
new file mode 100644
index 0000000..bd2024b
--- /dev/null
+++ b/Doku/reduce_filesize/mkexe.bat
@@ -0,0 +1,10 @@
+echo === EXE erstellen ===
+
+@echo off
+call .venv\Scripts\activate.bat
+pyinstaller --onefile filter_zip_no_stl.py
+
+echo.
+echo === Fertig! ===
+move dist\filter_zip_no_stl.exe ..\..\Sessions\removeStls.exe
+pause
diff --git a/Doku/reduce_filesize/requirements.txt b/Doku/reduce_filesize/requirements.txt
new file mode 100644
index 0000000..30adefe
--- /dev/null
+++ b/Doku/reduce_filesize/requirements.txt
@@ -0,0 +1,2 @@
+# Für EXE-Erstellung
+pyinstaller>=6.0
\ No newline at end of file
diff --git a/Doku/reduce_filesize/setup.bat b/Doku/reduce_filesize/setup.bat
new file mode 100644
index 0000000..b537426
--- /dev/null
+++ b/Doku/reduce_filesize/setup.bat
@@ -0,0 +1,32 @@
+@echo off
+echo === Virtuelle Umgebung einrichten ===
+
+REM Prüfen ob Python verfügbar ist
+python --version >nul 2>&1
+if errorlevel 1 (
+ echo Fehler: Python nicht gefunden!
+ echo Bitte Python installieren und zum PATH hinzufügen.
+ pause
+ exit /b 1
+)
+
+REM Virtuelle Umgebung erstellen
+echo Erstelle .venv ...
+python -m venv .venv
+
+REM Aktivieren und Dependencies installieren
+echo Aktiviere .venv und installiere Abhängigkeiten ...
+call .venv\Scripts\activate.bat
+python -m pip install --upgrade pip
+pip install -r requirements.txt
+
+echo.
+echo === Fertig! ===
+echo.
+echo Zum Aktivieren der Umgebung:
+echo .venv\Scripts\activate
+echo.
+echo Zum Erstellen der EXE:
+echo pyinstaller --onefile filter_zip_no_stl.py
+echo.
+pause
diff --git a/Editor2DLibrary/SSG/shapes/obj/0_BG080090+834372028.stl b/Editor2DLibrary/SSG/shapes/obj/0_BG080090+834372028.stl
new file mode 100644
index 0000000..4937020
Binary files /dev/null and b/Editor2DLibrary/SSG/shapes/obj/0_BG080090+834372028.stl differ
diff --git a/Editor2DLibrary/SSG/shapes/obj/0_BG090090+834372002.stl b/Editor2DLibrary/SSG/shapes/obj/0_BG090090+834372002.stl
new file mode 100644
index 0000000..62e7e19
Binary files /dev/null and b/Editor2DLibrary/SSG/shapes/obj/0_BG090090+834372002.stl differ
diff --git a/Editor2DLibrary/SSG/shapes/obj/0_BG190090+834372008.stl b/Editor2DLibrary/SSG/shapes/obj/0_BG190090+834372008.stl
new file mode 100644
index 0000000..1c1636a
Binary files /dev/null and b/Editor2DLibrary/SSG/shapes/obj/0_BG190090+834372008.stl differ
diff --git a/Editor2DLibrary/SSG/shapes/obj/Gefaellestrecke_rechts_aus.stl b/Editor2DLibrary/SSG/shapes/obj/Gefaellestrecke_rechts_aus.stl
new file mode 100644
index 0000000..62a0823
Binary files /dev/null and b/Editor2DLibrary/SSG/shapes/obj/Gefaellestrecke_rechts_aus.stl differ
diff --git a/Editor2DLibrary/SSG/shapes/obj/Gefaellestrecke_rechts_ein.stl b/Editor2DLibrary/SSG/shapes/obj/Gefaellestrecke_rechts_ein.stl
new file mode 100644
index 0000000..04ecfcb
Binary files /dev/null and b/Editor2DLibrary/SSG/shapes/obj/Gefaellestrecke_rechts_ein.stl differ
diff --git a/Editor2DLibrary/SSG/shapes/obj/Kreiselstrecke.stl b/Editor2DLibrary/SSG/shapes/obj/Kreiselstrecke.stl
new file mode 100644
index 0000000..715504e
Binary files /dev/null and b/Editor2DLibrary/SSG/shapes/obj/Kreiselstrecke.stl differ
diff --git a/Editor2DLibrary/SSG/shapes/obj/Motor.stl b/Editor2DLibrary/SSG/shapes/obj/Motor.stl
new file mode 100644
index 0000000..4c262c8
Binary files /dev/null and b/Editor2DLibrary/SSG/shapes/obj/Motor.stl differ
diff --git a/Editor2DLibrary/SSG/shapes/obj/s70.stl b/Editor2DLibrary/SSG/shapes/obj/s70.stl
new file mode 100644
index 0000000..5781662
Binary files /dev/null and b/Editor2DLibrary/SSG/shapes/obj/s70.stl differ
diff --git a/Editor2DLibrary/SSG/shapes/palettes/c_OmnifloFoerderer.xml b/Editor2DLibrary/SSG/shapes/palettes/c_OmnifloFoerderer.xml
new file mode 100644
index 0000000..7d871fd
--- /dev/null
+++ b/Editor2DLibrary/SSG/shapes/palettes/c_OmnifloFoerderer.xml
@@ -0,0 +1,2 @@
+
Kettenförderer
+
\ No newline at end of file
diff --git a/Editor2DLibrary/SSG/shapes/palettes/c_Parts.xml b/Editor2DLibrary/SSG/shapes/palettes/c_Parts.xml
index 3098925..b532c2b 100644
--- a/Editor2DLibrary/SSG/shapes/palettes/c_Parts.xml
+++ b/Editor2DLibrary/SSG/shapes/palettes/c_Parts.xml
@@ -19,4 +19,6 @@
Gefällestrecke2D
AP110_2D
AP110
+
TEFGERADE
+
TEFGerade_2D
\ No newline at end of file
diff --git a/Editor2DLibrary/SSG/shapes/palettes/c_TEFElemente.xml b/Editor2DLibrary/SSG/shapes/palettes/c_TEFElemente.xml
index 1609504..5784282 100644
--- a/Editor2DLibrary/SSG/shapes/palettes/c_TEFElemente.xml
+++ b/Editor2DLibrary/SSG/shapes/palettes/c_TEFElemente.xml
@@ -2,4 +2,5 @@