Index: MediaPortal/MediaPortal.Base/language/strings_de.xml
===================================================================
--- MediaPortal/MediaPortal.Base/language/strings_de.xml	(revision 27957)
+++ MediaPortal/MediaPortal.Base/language/strings_de.xml	(working copy)
@@ -1904,6 +1904,7 @@
     <String id="200021">TV-Konfiguration - EPG</String>
     <String id="990000">Wöchentlich an Tag X auf diesem Kanal</String>
     <String id="990001">{0} immer auf {1}</String>
+    <String id="990002">Immer nur neue Episoden</String>
     <String id="200022">MediaPortal hat folgende TV-Karten gefunden:</String>
     <String id="200023">Drücken sie den "Weiter" Knopf um die TV-Karten einzurichten</String>
     <String id="200024">TV-Konfiguration</String>
Index: MediaPortal/MediaPortal.Base/language/strings_en.xml
===================================================================
--- MediaPortal/MediaPortal.Base/language/strings_en.xml	(revision 27957)
+++ MediaPortal/MediaPortal.Base/language/strings_en.xml	(working copy)
@@ -1917,6 +1917,7 @@
     <String id="200021">TV Set-up - EPG</String>
     <String id="990000">Weekly on this channel</String>
     <String id="990001">{0} on channel {1}</String>
+    <String id="990002">Everytime new episodes</String>
     <String id="200022">MediaPortal has found the following TV cards:</String>
     <String id="200023">Press the Next button to configure these cards</String>
     <String id="200024">TV Set-up</String>
Index: TvEngine3/TVLibrary/Plugins/ConflictsManager/ConflictsManager.cs
===================================================================
--- TvEngine3/TVLibrary/Plugins/ConflictsManager/ConflictsManager.cs	(revision 27957)
+++ TvEngine3/TVLibrary/Plugins/ConflictsManager/ConflictsManager.cs	(working copy)
@@ -156,6 +156,7 @@
       getWorkingDaysSchedules(scheduleList, scheduleListToParse);
       getWeeklyEveryTimeOnThisChannelSchedules(scheduleList, scheduleListToParse);
       getEveryTimeOnEveryChannelSchedules(scheduleList, scheduleListToParse);
+      getEveryTimeOnEveryChannelOnlyNewerEpisodesSchedules(scheduleList, scheduleListToParse);
       getEveryTimeOnThisChannelSchedules(scheduleList, scheduleListToParse);
       removeCanceledSchedules(scheduleListToParse);
 
@@ -690,6 +691,46 @@
     }
 
     /// <summary>
+    /// Gets the every time on every channel but only newer episodes
+    /// </summary>
+    /// <param name="schedulesList">The schedules list.</param>
+    /// <returns></returns>
+    private void getEveryTimeOnEveryChannelOnlyNewerEpisodesSchedules(IList<Schedule> schedulesList, IList<Schedule> refFillList)
+    {
+      //IList programsList = Program.ListAll();
+      foreach (Schedule schedule in schedulesList)
+      {
+        ScheduleRecordingType scheduleType = (ScheduleRecordingType)schedule.ScheduleType;
+        if (schedule.Canceled != Schedule.MinSchedule) continue;
+        if (scheduleType != ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes) continue;
+        IList<Program> programsList = Program.RetrieveEveryTimeOnEveryChannelOnlyNewerEpisodesSchedules(schedule.ProgramName, schedule.LastseriesNum, schedule.LastepisodeNum);
+
+        foreach (Program program in programsList)
+        {
+          if ((program.Title == schedule.ProgramName) && (program.IdChannel == schedule.IdChannel) &&
+              (program.EndTime >= DateTime.Now) &&
+              ((program.SeriesNumAsInt == schedule.LastseriesNum && program.EpisodeNumAsInt > schedule.LastepisodeNum) ||
+              (program.SeriesNumAsInt > schedule.LastseriesNum) || (schedule.LastseriesNum == 0 && schedule.LastepisodeNum == 0))
+            )
+          {
+            Schedule incomingSchedule = schedule.Clone();
+            incomingSchedule.IdChannel = program.IdChannel;
+            incomingSchedule.ProgramName = program.Title;
+            incomingSchedule.StartTime = program.StartTime;
+            incomingSchedule.EndTime = program.EndTime;
+            incomingSchedule.PreRecordInterval = schedule.PreRecordInterval;
+            incomingSchedule.PostRecordInterval = schedule.PostRecordInterval;
+            incomingSchedule.LastseriesNum = schedule.LastseriesNum;
+            incomingSchedule.LastepisodeNum = schedule.LastepisodeNum;
+            refFillList.Add(incomingSchedule);
+          }
+        } //foreach (Program _program in _programsList)
+      } //foreach (Schedule _Schedule in schedulesList)
+      foreach (Schedule sched in refFillList) schedulesList.Remove(sched);
+    }
+
+
+    /// <summary>
     /// Gets the Weekly every time on this channel schedules.
     /// </summary>
     /// <param name="schedulesList">The schedules list.</param>
Index: TvEngine3/TVLibrary/SetupTv/Sections/TvSchedules.cs
===================================================================
--- TvEngine3/TVLibrary/SetupTv/Sections/TvSchedules.cs	(revision 27957)
+++ TvEngine3/TVLibrary/SetupTv/Sections/TvSchedules.cs	(working copy)
@@ -104,6 +104,11 @@
             item.SubItems.Add("Always");
             item.SubItems.Add("All channels");
             break;
+          case ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+            item.ImageIndex = 0;
+            item.SubItems.Add("OnlyNewerEpisodes");
+            item.SubItems.Add("S"+schedule.LastseriesNum+"E"+schedule.LastepisodeNum);
+            break;
         }
         item.SubItems.Add(schedule.ProgramName);
         item.SubItems.Add(String.Format("{0} mins", schedule.PreRecordInterval));
Index: TvEngine3/TVLibrary/TVDatabase/Program.cs
===================================================================
--- TvEngine3/TVLibrary/TVDatabase/Program.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TVDatabase/Program.cs	(working copy)
@@ -465,7 +465,54 @@
       }
     }
 
+
     /// <summary>
+    /// The programs series id
+    /// </summary>
+    public int SeriesNumAsInt
+    {
+      get
+      {
+        try
+        {
+          return Convert.ToInt32(seriesNum);
+        }
+        catch
+        {
+          return 0;
+        }
+      }
+      set
+      {
+        isChanged |= seriesNum != value.ToString();
+        seriesNum = value.ToString();
+      }
+    }
+
+    /// <summary>
+    /// The programs episode number from the distributor
+    /// </summary>
+    public int EpisodeNumAsInt
+    {
+      get
+      {
+        try
+        {
+          return Convert.ToInt32(episodeNum);
+        }
+        catch
+        {
+          return 0;
+        }
+      }
+      set
+      {
+        isChanged |= episodeNum != value.ToString();
+        episodeNum = value.ToString();
+      }
+    }
+
+    /// <summary>
     /// The programs episode title from the distributor
     /// </summary>
     public string EpisodeName
@@ -688,6 +735,84 @@
       return ObjectFactory.GetCollection<Program>(stmt.Execute());
     }
 
+    public static string GetDateTimeString()
+    {
+      string provider = ProviderFactory.GetDefaultProvider().Name.ToLowerInvariant();
+      if (provider == "mysql")
+      {
+        return "yyyy-MM-dd HH:mm:ss";
+      }
+      return "yyyyMMdd HH:mm:ss";
+    }
+
+    public static string EscapeSQLString(string original)
+    {
+      string provider = ProviderFactory.GetDefaultProvider().Name.ToLowerInvariant();
+      if (provider == "mysql")
+      {
+        return original.Replace("\\", "\\\\").Replace("'", "\\'");
+      }
+      else
+      {
+        return original.Replace("\\", "\\\\").Replace("'", "''");
+      }
+    }
+
+    public static IList<Program> RetrieveEveryTimeOnEveryChannelOnlyNewerEpisodesSchedules(string title, int lastseriesNum, int lastepisodeNum)
+    {
+      IList<Program> data = new List<Program>();
+      String SqlSelectCommand;
+
+      if (lastseriesNum == 0 && lastepisodeNum == 0)
+      {
+        // we do not have any valid episodedata so select all
+        SqlSelectCommand = String.Format("SELECT * FROM Program WHERE Title = '{0}' AND startTime >= '{1}'",
+                                         EscapeSQLString(title), DateTime.Now.ToString(GetDateTimeString()));
+      }
+      else
+      {
+        SqlSelectCommand = String.Format("SELECT * FROM Program WHERE Title = '{0}' AND startTime >= '{1}' AND "+
+                                         "((SeriesNum = {2} AND EpisodeNum > {3}) OR (SeriesNum > {4}))",
+                                         EscapeSQLString(title), DateTime.Now.ToString(GetDateTimeString()), lastseriesNum, lastepisodeNum, lastseriesNum);
+      }
+
+      SqlStatement stmt = new SqlBuilder(StatementType.Select, typeof(Program)).GetStatement(true);
+      SqlStatement mansql = new SqlStatement(StatementType.Select, stmt.Command, SqlSelectCommand.ToString(),
+                                                    typeof(Program));
+      IList<Program> data1 = ObjectFactory.GetCollection<Program>(mansql.Execute());
+
+      for (int i = 0; i < data1.Count; i++)
+      {
+        bool present = false;
+        // we only need to check for double episode if we have data
+        if (data1[i].EpisodeNumAsInt > 0 && data1[i].SeriesNumAsInt > 0)
+        {
+          for (int i2 = 0; i2 < data.Count; i2++)
+          {
+            // is this schedule already present? and do we have valid episodedata
+            if (data[i2].EpisodeNumAsInt == data1[i].EpisodeNumAsInt && data[i2].SeriesNumAsInt == data1[i].SeriesNumAsInt)
+            {
+              // earlier wins ;-) 
+              if (data1[i].StartTime < data[i2].StartTime)
+              {
+                // replace recording with the one which starts earlier
+                data[i2] = data1[i];
+              }
+              present = true;
+              break;
+            }
+          }
+        }
+        if (!present)
+        {
+          data.Add(data1[i]);
+        }
+      }
+
+      // execute the statement/query and create a collection of User instances from the result set
+      return data;
+    }
+
     public static IList<Program> RetrieveWeeklyEveryTimeOnThisChannel(DateTime startTime, DateTime endTime, string title,
                                                                       int channelId)
     {
Index: TvEngine3/TVLibrary/TVDatabase/Schedule.cs
===================================================================
--- TvEngine3/TVLibrary/TVDatabase/Schedule.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TVDatabase/Schedule.cs	(working copy)
@@ -43,7 +43,8 @@
     EveryTimeOnEveryChannel,
     Weekends,
     WorkingDays,
-    WeeklyEveryTimeOnThisChannel
+    WeeklyEveryTimeOnThisChannel,
+    EveryTimeOnEveryChannelOnlyNewerEpisodes
   }
 
   /// <summary>
@@ -81,6 +82,9 @@
     [TableColumn("recommendedCard", NotNull = true)] private int recommendedCard;
     [TableColumn("series", NotNull = true)] private bool series;
 
+    [TableColumn("lastepisodeNum", NotNull = true)] private int lastepisodeNum;
+    [TableColumn("lastseriesNum", NotNull = true)] private int lastseriesNum;    
+
     #endregion
 
     #region Constructors
@@ -107,6 +111,8 @@
       Series = (scheduleType > 0);
       StartTime = startTime;
       recommendedCard = -1;
+      lastseriesNum = 0;
+      lastepisodeNum = 0;
     }
 
     /// <summary> 
@@ -115,8 +121,18 @@
     public Schedule(int idChannel, int idParentSchedule, int scheduleType, string programName, DateTime startTime,
                     DateTime endTime,
                     int maxAirings, int priority, string directory, int quality, int keepMethod, DateTime keepDate,
-                    int preRecordInterval, int postRecordInterval, DateTime canceled)
+                    int preRecordInterval, int postRecordInterval, DateTime canceled) : 
+                    this(idChannel, idParentSchedule, scheduleType, programName, startTime,
+                    endTime, maxAirings, priority, directory, quality, keepMethod, keepDate,
+                    preRecordInterval, postRecordInterval, canceled, 0, 0)
     {
+    }
+
+    public Schedule(int idChannel, int idParentSchedule, int scheduleType, string programName, DateTime startTime,
+                    DateTime endTime,
+                    int maxAirings, int priority, string directory, int quality, int keepMethod, DateTime keepDate,
+                    int preRecordInterval, int postRecordInterval, DateTime canceled, int lastseriesNum, int lastepisodeNum)
+    {
       isChanged = true;
       this.idChannel = idChannel;
       this.idParentSchedule = idParentSchedule;
@@ -134,6 +150,8 @@
       this.postRecordInterval = postRecordInterval;
       this.canceled = canceled;
       this.series = (scheduleType > 0);
+      this.lastepisodeNum = lastepisodeNum;
+      this.lastseriesNum = lastseriesNum;
       recommendedCard = -1;
     }
 
@@ -159,6 +177,8 @@
       postRecordInterval = schedule.postRecordInterval;
       canceled = schedule.canceled;
       series = schedule.Series;
+      lastseriesNum = schedule.lastseriesNum;
+      lastepisodeNum = schedule.lastepisodeNum;
       recommendedCard = -1;
     }
 
@@ -169,8 +189,19 @@
     public Schedule(int idSchedule, int idParentSchedule, int idChannel, int scheduleType, string programName,
                     DateTime startTime,
                     DateTime endTime, int maxAirings, int priority, string directory, int quality, int keepMethod,
-                    DateTime keepDate, int preRecordInterval, int postRecordInterval, DateTime canceled)
+                    DateTime keepDate, int preRecordInterval, int postRecordInterval, DateTime canceled) :
+      this(idSchedule, idParentSchedule, idChannel, scheduleType, programName, startTime,
+                    endTime, maxAirings, priority, directory, quality, keepMethod,
+                    keepDate, preRecordInterval, postRecordInterval, canceled, 0, 0)
     {
+    }
+
+    public Schedule(int idSchedule, int idParentSchedule, int idChannel, int scheduleType, string programName,
+                    DateTime startTime,
+                    DateTime endTime, int maxAirings, int priority, string directory, int quality, int keepMethod,
+                    DateTime keepDate, int preRecordInterval, int postRecordInterval, DateTime canceled,
+                    int lastseriesNum , int lastepisodeNum)
+    {
       this.idSchedule = idSchedule;
       this.idParentSchedule = idParentSchedule;
       this.idChannel = idChannel;
@@ -188,6 +219,8 @@
       this.postRecordInterval = postRecordInterval;
       this.canceled = canceled;
       this.series = (scheduleType > 0);
+      this.lastseriesNum = lastseriesNum;
+      this.lastepisodeNum = lastepisodeNum;
       recommendedCard = -1;
     }
 
@@ -433,6 +466,32 @@
       }
     }
 
+    /// <summary>
+    /// Property relating to database column lastseasonNum
+    /// </summary>
+    public int LastseriesNum
+    {
+      get { return lastseriesNum; }
+      set
+      {
+        isChanged |= lastseriesNum != value;
+        lastseriesNum = value;
+      }
+    }
+
+    /// <summary>
+    /// Property relating to database column lastepisodeNum
+    /// </summary>
+    public int LastepisodeNum
+    {
+      get { return lastepisodeNum; }
+      set
+      {
+        isChanged |= lastepisodeNum != value;
+        lastepisodeNum = value;
+      }
+    }
+
     #endregion
 
     #region Storage and Retrieval
@@ -680,14 +739,32 @@
               {
                 if (!schedule.IsSerieIsCanceled(prgWeeklyEveryTimeOnThisChannel.StartTime))
                 {
-                  prgWeeklyEveryTimeOnThisChannel.IsRecordingOncePending = false;
-                  prgWeeklyEveryTimeOnThisChannel.IsRecordingSeriesPending = !clear;
-                  prgWeeklyEveryTimeOnThisChannel.Persist();
+                  SetAdvScheduleState(schedule, clear, prgWeeklyEveryTimeOnThisChannel);
                 }
               }
             }
             break;
 
+          case (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+            List<Program> prgsEveryTimeOnEveryChannelOnlyNewerEpisode =
+              (List<Program>)
+              Program.RetrieveEveryTimeOnEveryChannelOnlyNewerEpisodesSchedules(schedule.programName, schedule.lastseriesNum, schedule.lastepisodeNum);
+
+            Log.Error("Applyprogramstates RetrieveEveryTimeOnEveryChannelOnlyNewerEpisodesSchedules Show: {0} S{1}E{2}", schedule.programName, schedule.lastseriesNum, schedule.lastepisodeNum);
+
+            if (prgsEveryTimeOnEveryChannelOnlyNewerEpisode != null && prgsEveryTimeOnEveryChannelOnlyNewerEpisode.Count > 0)
+            {
+              foreach (Program prgEveryTimeOnEveryChannelOnlyNewerEpisode in prgsEveryTimeOnEveryChannelOnlyNewerEpisode)
+              {
+                Log.Error("    Program Show: {0} S{1}E{2}", prgEveryTimeOnEveryChannelOnlyNewerEpisode.Title, prgEveryTimeOnEveryChannelOnlyNewerEpisode.SeriesNum, prgEveryTimeOnEveryChannelOnlyNewerEpisode.EpisodeNum);
+                if (!schedule.IsSerieIsCanceled(prgEveryTimeOnEveryChannelOnlyNewerEpisode.StartTime))
+                {
+                  SetAdvScheduleState(schedule, clear, prgEveryTimeOnEveryChannelOnlyNewerEpisode);
+                }
+              }
+            }
+            break;
+
           case (int)ScheduleRecordingType.Weekends:
             List<Program> prgsWeekends =
               (List<Program>)
@@ -770,6 +847,7 @@
     {
       if (schedule.ScheduleType == (int)ScheduleRecordingType.EveryTimeOnEveryChannel ||
           schedule.ScheduleType == (int)ScheduleRecordingType.EveryTimeOnThisChannel ||
+          schedule.ScheduleType == (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes ||
           schedule.ScheduleType == (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel)
       {
         return false;
@@ -1132,6 +1210,19 @@
             return true;
           }
           break;
+        case ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+          if (program.Title == ProgramName && 
+              ((program.SeriesNumAsInt == lastseriesNum && program.EpisodeNumAsInt > lastepisodeNum) || 
+               (program.SeriesNumAsInt > lastseriesNum) || (lastseriesNum == 0 && lastepisodeNum == 0))
+            )
+          {
+            if (filterCanceledRecordings && IsSerieIsCanceled(program.StartTime))
+            {
+              return false;
+            }
+            return true;
+          }
+          break;
         case ScheduleRecordingType.EveryTimeOnThisChannel:
           if (program.Title == ProgramName && program.IdChannel == IdChannel)
           {
@@ -1390,7 +1481,7 @@
       Schedule schedule = new Schedule(IdChannel, idParentSchedule, scheduleType, ProgramName, StartTime, EndTime,
                                        MaxAirings, Priority,
                                        Directory, Quality, KeepMethod, KeepDate, PreRecordInterval, PostRecordInterval,
-                                       Canceled);
+                                       Canceled, lastepisodeNum, lastepisodeNum);
 
       schedule.series = series;
       schedule.idSchedule = idSchedule;
Index: TvEngine3/TVLibrary/TVDatabase/TvBusinessLayer/BusinessLayer.cs
===================================================================
--- TvEngine3/TVLibrary/TVDatabase/TvBusinessLayer/BusinessLayer.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TVDatabase/TvBusinessLayer/BusinessLayer.cs	(working copy)
@@ -2993,6 +2993,33 @@
       }
 
       IList<Program> programs;
+      if (rec.ScheduleType == (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes)
+      {
+        programs = Program.RetrieveByTitleAndTimesInterval(rec.ProgramName, rec.StartTime, rec.StartTime.AddMonths(1));
+
+        foreach (Program prog in programs)
+        {
+          if ( (prog.SeriesNumAsInt == rec.LastseriesNum && prog.EpisodeNumAsInt > rec.LastepisodeNum) ||
+               (prog.SeriesNumAsInt > rec.LastseriesNum) || (rec.LastseriesNum == 0 && rec.LastepisodeNum == 0) )
+          {
+            Schedule recNew = rec.Clone();
+            recNew.ScheduleType = (int)ScheduleRecordingType.Once;
+            recNew.IdChannel = prog.IdChannel;
+            recNew.StartTime = prog.StartTime;
+            recNew.EndTime = prog.EndTime;
+            recNew.LastseriesNum = prog.SeriesNumAsInt;
+            recNew.LastepisodeNum = prog.EpisodeNumAsInt;
+            recNew.Series = true;
+            if (rec.IsSerieIsCanceled(recNew.StartTime))
+            {
+              recNew.Canceled = recNew.StartTime;
+            }
+            recordings.Add(recNew);
+          }
+        }
+        return recordings;
+      }
+
       if (rec.ScheduleType == (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel)
       {
         //Log.Debug("get {0} {1} EveryTimeOnThisChannel", rec.ProgramName, rec.ReferencedChannel().Name);
Index: TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVConflicts.cs
===================================================================
--- TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVConflicts.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVConflicts.cs	(working copy)
@@ -328,6 +328,10 @@
             item.Label = rec.ProgramName;
             item.Label2 = GUILocalizeStrings.Get(651);
             break;
+          case (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+            item.Label = rec.ProgramName;
+            item.Label2 = GUILocalizeStrings.Get(990002);
+            break;
         }
       }
     }
Index: TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvGuideBase.cs
===================================================================
--- TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvGuideBase.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvGuideBase.cs	(working copy)
@@ -4096,6 +4096,7 @@
       if (refresh)
       {
         _recordingList = Schedule.ListAll();
+
         return;
       }
     }
Index: TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvNewScheduleSearchType.cs
===================================================================
--- TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvNewScheduleSearchType.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvNewScheduleSearchType.cs	(working copy)
@@ -300,8 +300,11 @@
           rec.ScheduleType = (int)ScheduleRecordingType.Weekends;
           break;
         case 7://everytime weekly, this channel
-          rec.ScheduleType = (int) ScheduleRecordingType.WeeklyEveryTimeOnThisChannel;
+          rec.ScheduleType = (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel;
           break;
+        case 8://everytime, all channels but only new episodes
+          rec.ScheduleType = (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes;
+          break;
       }
 
 
Index: TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVPriorities.cs
===================================================================
--- TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVPriorities.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVPriorities.cs	(working copy)
@@ -402,6 +402,10 @@
             item.Label = rec.ProgramName;
             item.Label2 = GUILocalizeStrings.Get(651);
             break;
+          case ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+            item.Label = rec.ProgramName;
+            item.Label2 = GUILocalizeStrings.Get(990002);
+            break;
         }
       }
     }
@@ -590,6 +594,7 @@
         dlg.Add(GUILocalizeStrings.Get(WeekEndTool.GetText(DayType.Record_WorkingDays)));
         dlg.Add(GUILocalizeStrings.Get(WeekEndTool.GetText(DayType.Record_WeekendDays)));
         dlg.Add(GUILocalizeStrings.Get(990000));// 990000=Weekly everytime on this channel		
+        dlg.Add(GUILocalizeStrings.Get(990002));// 990002=Every channel but only newer episodes
         switch ((ScheduleRecordingType)rec.ScheduleType)
         {
           case ScheduleRecordingType.Once:
@@ -616,6 +621,9 @@
           case ScheduleRecordingType.WeeklyEveryTimeOnThisChannel:
             dlg.SelectedLabel = 7;
             break;
+          case ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+            dlg.SelectedLabel = 8;
+            break;
         }
         dlg.DoModal(GetID);
         if (dlg.SelectedLabel == -1)
@@ -656,6 +664,10 @@
             rec.ScheduleType = (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel;
             rec.Canceled = Schedule.MinSchedule;
             break;
+          case 8://every time every channel but only new episodes
+            rec.ScheduleType = (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes;
+            rec.Canceled = Schedule.MinSchedule;
+            break;
         }
         rec.Persist();
         TvServer server = new TvServer();
@@ -694,6 +706,9 @@
         case ScheduleRecordingType.WeeklyEveryTimeOnThisChannel:
           strType = GUILocalizeStrings.Get(990000);//Weekly Everytime on this channel
           break;
+        case ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+          strType = GUILocalizeStrings.Get(990002);//every time every channel but only newer episodes
+          break;
       }
       return strType;
     }
Index: TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVProgramInfo.cs
===================================================================
--- TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVProgramInfo.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVProgramInfo.cs	(working copy)
@@ -1078,8 +1078,9 @@
           || (schedule.ScheduleType == (int)ScheduleRecordingType.Weekly)
           || (schedule.ScheduleType == (int)ScheduleRecordingType.WorkingDays)
           || (schedule.ScheduleType == (int)ScheduleRecordingType.EveryTimeOnEveryChannel)
+          || (schedule.ScheduleType == (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes)
           || (schedule.ScheduleType == (int)ScheduleRecordingType.EveryTimeOnThisChannel)
-          || (schedule.ScheduleType == (int) ScheduleRecordingType.WeeklyEveryTimeOnThisChannel))          
+          || (schedule.ScheduleType == (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel))          
       {
         GUIDialogMenu dlg = (GUIDialogMenu)GUIWindowManager.GetWindow((int)Window.WINDOW_DIALOG_MENU);
         if (dlg == null)
@@ -1174,11 +1175,17 @@
       }
       else
       {
-        Log.Debug("TVProgramInfo.CreateProgram - no series schedule");
-        // no series schedule => create it
+        // series schedule => create it
         schedule = new Schedule(program.IdChannel, program.Title, program.StartTime, program.EndTime);
         schedule.PreRecordInterval = Int32.Parse(layer.GetSetting("preRecordInterval", "5").Value);
         schedule.PostRecordInterval = Int32.Parse(layer.GetSetting("postRecordInterval", "5").Value);
+        if ((int)scheduleType == (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes &&
+            program.SeriesNumAsInt > 0 && program.EpisodeNumAsInt > 0)
+        {
+          schedule.LastseriesNum = program.SeriesNumAsInt;
+          // -1 so that this schedule will also get recorded (SQL Rule is > X)
+          schedule.LastepisodeNum = program.EpisodeNumAsInt-1;
+        }
         schedule.ScheduleType = scheduleType;
       }
 
@@ -1326,6 +1333,7 @@
         dlg.Add(GUILocalizeStrings.Get(WeekEndTool.GetText(DayType.Record_WorkingDays)));
         dlg.Add(GUILocalizeStrings.Get(WeekEndTool.GetText(DayType.Record_WeekendDays)));
         dlg.AddLocalizedString(990000); // 990000=Weekly everytime on this channel
+        dlg.AddLocalizedString(990002); // 990002=Every time every channel but only new episodes
 
         dlg.DoModal(GetID);
         if (dlg.SelectedLabel == -1)
@@ -1360,6 +1368,9 @@
           case 7://Weekly everytime, this channel
             scheduleType = (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel;
             break;
+          case 8://every time every channel but only newer episodes
+            scheduleType = (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes;
+            break;
         }
         CreateProgram(CurrentProgram, scheduleType);
 
Index: TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVScheduler.cs
===================================================================
--- TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVScheduler.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVScheduler.cs	(working copy)
@@ -714,6 +714,7 @@
               strType = GUILocalizeStrings.Get(649);
               item.Label2 = String.Format("{0} {1}", strType, strTime);
               break;
+
             case (int)ScheduleRecordingType.Weekly:
               switch (rec.StartTime.DayOfWeek)
               {
@@ -752,7 +753,10 @@
             case (int)ScheduleRecordingType.EveryTimeOnEveryChannel:
               item.Label2 = GUILocalizeStrings.Get(651);
               break;
-           case (int) ScheduleRecordingType.WeeklyEveryTimeOnThisChannel:
+            case (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+              item.Label2 = GUILocalizeStrings.Get(990002);
+              break;
+            case (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel:
              switch (rec.StartTime.DayOfWeek)
              {
                  case DayOfWeek.Monday:
@@ -1087,6 +1091,9 @@
           case ScheduleRecordingType.WeeklyEveryTimeOnThisChannel:
             dlg.SelectedLabel = 7;
             break;
+          case ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+            dlg.SelectedLabel = 8;
+            break;
         }
         dlg.DoModal(GetID);
         if (dlg.SelectedLabel == -1)
@@ -1127,6 +1134,10 @@
             rec.ScheduleType = (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel;
             rec.Canceled = Schedule.MinSchedule;
             break;
+          case 8://every time every channel but only newer episodes
+            rec.ScheduleType = (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes;
+            rec.Canceled = Schedule.MinSchedule;
+            break;
         }
         rec.Persist();
         TvServer server = new TvServer();
@@ -1189,6 +1200,9 @@
         case ScheduleRecordingType.EveryTimeOnEveryChannel:
           strType = GUILocalizeStrings.Get(651); //Everytime on any channel
           break;
+        case ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+          strType = GUILocalizeStrings.Get(990002);
+          break;
         case ScheduleRecordingType.EveryTimeOnThisChannel:
           strType = String.Format(GUILocalizeStrings.Get(650), schedule.ReferencedChannel().DisplayName);
           ; //Everytime on this channel
Index: TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVSearch.cs
===================================================================
--- TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVSearch.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVSearch.cs	(working copy)
@@ -1200,6 +1200,7 @@
         dlg.Add(GUILocalizeStrings.Get(WeekEndTool.GetText(DayType.Record_WorkingDays)));
         dlg.Add(GUILocalizeStrings.Get(WeekEndTool.GetText(DayType.Record_WeekendDays)));
         dlg.Add(GUILocalizeStrings.Get(990000));  // 990000=Weekly everytime on this channel
+        dlg.Add(GUILocalizeStrings.Get(990002));  // 990002=Every time every channel but only newer episodes
 
         dlg.DoModal(GetID);
         if (dlg.SelectedLabel == -1)
@@ -1260,6 +1261,15 @@
           case 8://Weekly everytime, this channel
             rec.ScheduleType = (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel;
             break;
+          case 9://every time every channel but only newer episodes
+            rec.ScheduleType = (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes;
+            if (program.SeriesNumAsInt > 0 && program.EpisodeNumAsInt > 0)
+            {
+              // -1 so that this program gets also recorded
+              rec.LastseriesNum = program.SeriesNumAsInt;
+              rec.LastepisodeNum = program.EpisodeNumAsInt-1;
+            }
+            break;
         }
         rec.Persist();
         server.OnNewSchedule();
Index: TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVUtil.cs
===================================================================
--- TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVUtil.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVUtil.cs	(working copy)
@@ -113,8 +113,12 @@
           break;
 
         case (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel:
-          programs = Program.RetrieveWeeklyEveryTimeOnThisChannel(rec.StartTime, rec.EndTime, rec.ProgramName, rec.ReferencedChannel().IdChannel);          
+          programs = Program.RetrieveWeeklyEveryTimeOnThisChannel(rec.StartTime, rec.EndTime, rec.ProgramName, rec.ReferencedChannel().IdChannel);
           break;
+
+        case (int)ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+          programs = Program.RetrieveEveryTimeOnEveryChannelOnlyNewerEpisodesSchedules(rec.ProgramName, rec.LastseriesNum, rec.LastepisodeNum);
+          break;
       }
       recordings = AddProgramsToSchedulesList(rec, programs);
       return recordings;
Index: TvEngine3/TVLibrary/TvService/DiskManagement/EpisodeManagement.cs
===================================================================
--- TvEngine3/TVLibrary/TvService/DiskManagement/EpisodeManagement.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TvService/DiskManagement/EpisodeManagement.cs	(working copy)
@@ -59,9 +59,27 @@
 
     public void OnScheduleEnded(string recordingFilename, Schedule recording, TvDatabase.Program program)
     {
-      Log.Write("diskmanagement: recording {0} ended. type:{1} max episodes:{2}",
-                program.Title, (ScheduleRecordingType)recording.ScheduleType, recording.MaxAirings);
+      Schedule parentrec = recording.ReferencedSchedule();
+      Log.Write("diskmanagement: recording {0} / {1} ended. type:{2} max episodes:{3}",
+                program.Title, recording.ProgramName, (ScheduleRecordingType)recording.ScheduleType, recording.MaxAirings);
+      if (parentrec != null)
+      {
+        Log.Write("diskmanagement: parent recording was {0} type:{1} S{2}E{3}",
+                  parentrec.ProgramName, (ScheduleRecordingType)parentrec.ScheduleType,
+                  program.SeriesNumAsInt, program.EpisodeNumAsInt);
+        if ((ScheduleRecordingType)parentrec.ScheduleType == ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes)
+        {
+          Log.Write("diskmanagement: Update series and episodedata for {0} type:{1} to: S{2}E{3}",
+                    parentrec.ProgramName, (ScheduleRecordingType)parentrec.ScheduleType,
+                    program.SeriesNumAsInt, program.EpisodeNumAsInt);
 
+          parentrec.LastseriesNum = program.SeriesNumAsInt;
+          parentrec.LastepisodeNum = program.EpisodeNumAsInt;
+          parentrec.Persist();
+
+        }
+      }
+
       CheckEpsiodesForRecording(recording, program);
     }
 
Index: TvEngine3/TVLibrary/TvService/Scheduler/Scheduler.cs
===================================================================
--- TvEngine3/TVLibrary/TvService/Scheduler/Scheduler.cs	(revision 27957)
+++ TvEngine3/TVLibrary/TvService/Scheduler/Scheduler.cs	(working copy)
@@ -711,9 +711,14 @@
         case ScheduleRecordingType.EveryTimeOnEveryChannel:
           isTimeToRecord = IsTimeToRecordEveryTimeOnEveryChannel(schedule);
           break;
+
         case ScheduleRecordingType.WeeklyEveryTimeOnThisChannel:
           isTimeToRecord = IsTimeToRecordWeeklyEveryTimeOnThisChannel(schedule, currentTime);
           break;
+
+        case ScheduleRecordingType.EveryTimeOnEveryChannelOnlyNewerEpisodes:
+          isTimeToRecord = IsTimeToRecordEveryTimeOnEveryChannelOnlyNewerEpisodes(schedule);
+          break;
       }
       return isTimeToRecord;
     }
@@ -749,6 +754,34 @@
       return isTimeToRecord;
     }
 
+    private bool IsTimeToRecordEveryTimeOnEveryChannelOnlyNewerEpisodes(Schedule schedule)
+    {
+      bool isTimeToRecord = false;
+      bool createSpawnedOnceSchedule = false;
+
+      IList<TvDatabase.Program> programs = TvDatabase.Program.RetrieveCurrentRunningByTitle(schedule.ProgramName,
+                                                                                            schedule.PreRecordInterval,
+                                                                                            schedule.PostRecordInterval);
+      foreach (TvDatabase.Program program in programs)
+      {
+        if ((program.SeriesNumAsInt == schedule.LastseriesNum && program.EpisodeNumAsInt > schedule.LastepisodeNum) ||
+            (program.SeriesNumAsInt > schedule.LastseriesNum) || (schedule.LastseriesNum == 0 && schedule.LastepisodeNum == 0))
+        if (!schedule.IsSerieIsCanceled(program.StartTime))
+        {
+          if (CreateSpawnedOnceSchedule(schedule, program))
+          {
+            createSpawnedOnceSchedule = true;
+          }
+        }
+      }
+      if (createSpawnedOnceSchedule)
+      {
+        ResetTimer(); //lets process the spawned once schedule at once.
+      }
+
+      return isTimeToRecord;
+    }
+
     private bool IsTimeToRecordEveryTimeOnEveryChannel(Schedule schedule)
     {
       bool isTimeToRecord = false;
@@ -879,6 +912,9 @@
           newSchedule.StartTime = current.StartTime;
           newSchedule.EndTime = current.EndTime;
           newSchedule.ScheduleType = 0; // type Once
+          // remove me? perhaps there is another way to get the correct series and episodenumbers?
+          newSchedule.LastseriesNum = current.SeriesNumAsInt;
+          newSchedule.LastepisodeNum = current.EpisodeNumAsInt;
           newSchedule.Series = true;
           newSchedule.IdParentSchedule = schedule.IdSchedule;
           newSchedule.Persist();
