diff --git a/src/main/java/mServer/crawler/sender/base/JsonUtils.java b/src/main/java/mServer/crawler/sender/base/JsonUtils.java
index b21495e37..3b0566f7e 100644
--- a/src/main/java/mServer/crawler/sender/base/JsonUtils.java
+++ b/src/main/java/mServer/crawler/sender/base/JsonUtils.java
@@ -113,6 +113,13 @@ public static boolean hasElements(
     return true;
   }
 
+  public static Optional<Integer> getElementValueAsInteger(final JsonElement aJsonElement, final String... aElementIds) {
+    Optional<JsonElement> rs = JsonUtils.getElement(aJsonElement, aElementIds);
+    if (rs.isPresent()) {
+      return Optional.of(rs.get().getAsInt());
+    }
+    return Optional.empty();
+  }
   /**
    * Checks if the {@link JsonObject} has all given elements and if no element
    * is null or empty.
@@ -142,7 +149,7 @@ public static Optional<String> getElementValueAsString(final JsonElement aJsonEl
 
   public static Optional<JsonElement> getElement(final JsonElement aJsonElement, final String... aElementIds) {
     Optional<JsonElement> rs = Optional.empty();
-    if (aElementIds == null || aElementIds.length == 0) {
+    if (aElementIds == null || aElementIds.length == 0 || aJsonElement == null || !aJsonElement.isJsonObject()) {
       return rs;
     }
     JsonObject aJsonObject = aJsonElement.getAsJsonObject();
diff --git a/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java b/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java
index c0e173561..3c63ec63e 100644
--- a/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java
+++ b/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java
@@ -39,7 +39,9 @@ public class ZdfFilmDetailDeserializer implements JsonDeserializer<Optional<ZdfF
   private static final String JSON_ELEMENT_TITLE = "title";
   private static final String JSON_ELEMENT_TEASER_TEXT = "teasertext";
   private static final String JSON_ATTRIBUTE_TEMPLATE = "http://zdf.de/rels/streams/ptmd-template";
-
+  private static final String EPISODENUMBER = "episodeNumber";
+  private static final String[] SEASONNUMBER = {"http://zdf.de/rels/cmdm/season", "seasonNumber"};
+  
   private static final String PLACEHOLDER_PLAYER_ID = "{playerId}";
   private static final String PLAYER_ID = "android_native_5";
 
@@ -215,38 +217,53 @@ private Optional<String> parseDescription(JsonObject aRootNode) {
     return Optional.empty();
   }
 
-  private Optional<String> parseTitle(JsonObject aRootNode, JsonObject aTarget) {
-    Optional<String> title = parseTitleValue(aRootNode, aTarget);
-    return title.map(s -> s.replaceAll("\\(CC.*\\) - .* Creative Commons.*", ""));
+  private Optional<String> parseTitle(final JsonObject aRootNode, final JsonObject aTarget) {
+    final Optional<String> programmTitle = JsonUtils.getElementValueAsString(aRootNode, JSON_ELEMENT_TITLE);
+    final Optional<String> programmSubtitle = JsonUtils.getElementValueAsString(aRootNode, JSON_ELEMENT_SUBTITLE);
+    Optional<String> resultingTitle = formatTitle(programmTitle, programmSubtitle); 
+    if (resultingTitle.isEmpty()) {
+      final Optional<String> targetTitle = JsonUtils.getElementValueAsString(aTarget, JSON_ELEMENT_TITLE);
+      final Optional<String> targetSubtitle = JsonUtils.getElementValueAsString(aTarget, JSON_ELEMENT_SUBTITLE);
+      resultingTitle = formatTitle(targetTitle, targetSubtitle);
+    }
+    if (resultingTitle.isPresent()) {
+      final Optional<Integer> season = JsonUtils.getElementValueAsInteger(aTarget, SEASONNUMBER);
+      final Optional<Integer> episode = JsonUtils.getElementValueAsInteger(aTarget, EPISODENUMBER);
+      final Optional<String> seasonEpisodeTitle = formatEpisodeTitle(season, episode);
+      final Optional<String> title = cleanupTitle((resultingTitle.get() + " " + seasonEpisodeTitle.orElse("")).trim());
+      return title;
+    }
+    return Optional.empty();
   }
-
-  private Optional<String> parseTitleValue(JsonObject aRootNode, JsonObject aTarget) {
-    // use property "title" if found
-    JsonElement titleElement = aRootNode.get(JSON_ELEMENT_TITLE);
-    if (titleElement != null) {
-      JsonElement subTitleElement = aRootNode.get(JSON_ELEMENT_SUBTITLE);
-      if (subTitleElement != null) {
-        return Optional.of(titleElement.getAsString().trim() + " - " + subTitleElement.getAsString());
-      } else {
-        return Optional.of(titleElement.getAsString());
-      }
+  
+  private Optional<String> cleanupTitle(String title) {
+    return Optional.of(title.replaceAll("\\(CC.*\\) - .* Creative Commons.*", ""));
+  }
+  
+  private Optional<String> formatTitle(Optional<String> title, Optional<String> sub) {
+    if (title.isEmpty()) {
+      return Optional.empty();
+    }
+    if (sub.isPresent() && !sub.get().isBlank()) {
+      return Optional.of(title.get().trim() + " - " + sub.get().trim());
     } else {
-      // programmItem target required to determine title
-      if (aTarget != null && aTarget.has(JSON_ELEMENT_TITLE)) {
-        String title = aTarget.get(JSON_ELEMENT_TITLE).getAsString();
-        String subTitle = aTarget.get(JSON_ELEMENT_SUBTITLE).getAsString();
-
-        if (subTitle.isEmpty()) {
-          return Optional.of(title);
-        } else {
-          return Optional.of(title.trim() + " - " + subTitle);
-        }
-      }
+      return Optional.of(title.get().trim());
     }
-
-    return Optional.empty();
   }
-
+  
+  private Optional<String> formatEpisodeTitle(Optional<Integer> season, Optional<Integer> episode) {
+    if (season.isEmpty() && episode.isEmpty()) {
+      return Optional.empty();
+    }
+    String result = "";
+    if (season.isPresent()) {
+      result += String.format("S%02d", season.get());
+    }
+    if (episode.isPresent()) {
+      result += String.format("E%02d", episode.get());
+    }
+    return Optional.of("("+result+")");
+  }
   private Optional<String> parseTopic(JsonObject aRootNode) {
     JsonObject brand = aRootNode.getAsJsonObject(JSON_ELEMENT_BRAND);
     JsonObject category = aRootNode.getAsJsonObject(JSON_ELEMENT_CATEGORY);