diff -ruN vdr-1.3.44/config.c vdr-1.3.44-bp/config.c
--- vdr-1.3.44/config.c	2006-03-03 16:25:54.000000000 +0100
+++ vdr-1.3.44-bp/config.c	2006-03-03 15:59:36.000000000 +0100
@@ -370,8 +370,6 @@
   SplitEditedFiles = 0;
   MinEventTimeout = 30;
   MinUserInactivity = 300;
-  TrayOpenOnBegin = 0;
-  TrayOpenOnEnd = 0;
   MultiSpeedMode = 0;
   ShowReplayMode = 0;
   ResumeID = 0;
@@ -400,6 +398,10 @@
   ShowRecTime = 1;
   ShowRecLength = 0;
   MenuCmdPosition = 0;
+  DvdDisplayMode = 1;
+  DvdDisplayZeros = 1;
+  DvdTrayMode = 0;
+  DvdSpeedLimit = 0;
 }
 
 cSetup& cSetup::operator= (const cSetup &s)
@@ -616,8 +618,6 @@
   else if (!strcasecmp(Name, "SplitEditedFiles"))    SplitEditedFiles   = atoi(Value);
   else if (!strcasecmp(Name, "MinEventTimeout"))     MinEventTimeout    = atoi(Value);
   else if (!strcasecmp(Name, "MinUserInactivity"))   MinUserInactivity  = atoi(Value);
-  else if (!strcasecmp(Name, "TrayOpenOnBegin"))     TrayOpenOnBegin    = atoi(Value);
-  else if (!strcasecmp(Name, "TrayOpenOnEnd"))       TrayOpenOnEnd      = atoi(Value);
   else if (!strcasecmp(Name, "MultiSpeedMode"))      MultiSpeedMode     = atoi(Value);
   else if (!strcasecmp(Name, "ShowReplayMode"))      ShowReplayMode     = atoi(Value);
   else if (!strcasecmp(Name, "noEPG"))               strn0cpy(noEPG, Value, 999);
@@ -649,6 +649,10 @@
   else if (!strcasecmp(Name, "ShowRecTime"))         ShowRecTime        = atoi(Value);
   else if (!strcasecmp(Name, "ShowRecLength"))       ShowRecLength      = atoi(Value);
   else if (!strcasecmp(Name, "MenuCmdPosition"))     MenuCmdPosition    = atoi(Value);
+  else if (!strcasecmp(Name, "DvdDisplayMode"))      DvdDisplayMode     = atoi(Value);
+  else if (!strcasecmp(Name, "DvdDisplayZeros"))     DvdDisplayZeros    = atoi(Value);
+  else if (!strcasecmp(Name, "DvdTrayMode"))         DvdTrayMode        = atoi(Value);
+  else if (!strcasecmp(Name, "DvdSpeedLimit"))       DvdSpeedLimit      = atoi(Value);
   else
 
 //ML
@@ -751,8 +755,6 @@
   Store("DoubleEpgTimeDelta", DoubleEpgTimeDelta);
   Store("MultiSpeedMode",     MultiSpeedMode);
   Store("ShowReplayMode",     ShowReplayMode);
-  Store("TrayOpenOnBegin",    TrayOpenOnBegin);
-  Store("TrayOpenOnEnd",      TrayOpenOnEnd);
   Store("ResumeID",           ResumeID);
   Store("JumpPlay",           JumpPlay);
   Store("PlayJump",           PlayJump);
@@ -770,6 +772,10 @@
   Store("ShowRecTime",        ShowRecTime);
   Store("ShowRecLength",      ShowRecLength);
   Store("MenuCmdPosition",    MenuCmdPosition);
+  Store("DvdDisplayMode",     DvdDisplayMode);
+  Store("DvdDisplayZeros",    DvdDisplayZeros);
+  Store("DvdTrayMode",        DvdTrayMode);
+  Store("DvdSpeedLimit",      DvdSpeedLimit);
   Store("PreferredChannel",   PreferredChannel);
   Store("StartupVolume",      StartupVolume);
 
@@ -788,6 +794,7 @@
 
   if (cConfig<cSetupLine>::Save()) {
      isyslog("saved setup to %s", FileName());
+     if(DvdDisplayMode >= 1) ::Recordings.Load();		// DVDARCHIVE Patch
      return true;
      }
   return false;
diff -ruN vdr-1.3.44/config.h vdr-1.3.44-bp/config.h
--- vdr-1.3.44/config.h	2006-03-03 16:25:54.000000000 +0100
+++ vdr-1.3.44-bp/config.h	2006-03-03 16:25:09.000000000 +0100
@@ -22,11 +22,33 @@
 #define VDRVERSION  "1.3.44"
 #define VDRVERSNUM   10344  // Version * 10000 + Major * 100 + Minor
 
-#define BIGPATCHVERSION "26.02.2006"
+#define BIGPATCHVERSION "03.03.2006"
 #define LIVEBUFFERVERSION 106
 
 #define LIEMIKUUTIO  103
 
+#define SWITCHONLYPATCH 0.0.6-1.3.42
+#define MINIPATCHVERSION 0.0.6-1.3.42
+#define SHOWVALIDINPUTVERSION 1
+#define WAREAGLEICONVERSION 1.3.22
+#define SHARELNBVERSION 1.3.42
+#define PERSONALPREFERENCESVERSION 1.3.42
+#define LOCALCHANNELPROVIDEVERSION 1.3.24
+#define DISABLEDOUBLEEPGENTRYSVERSION 0.7.3b
+#define NOEPGVERSION 0.3
+#define RECORDAC3SELECTABLEVERSION 1.3.20
+#define SORTRECVERSION 0.2b
+#define SOURCECAPSVERSION 1.3.39
+#define TIMERCMDVERSION 0.2
+#define CUTTERQUEUEVERSION 1.3.23
+#define CHANNELLISTSWITCHVERSION 2
+#define JUMPINGSECONDSVERSION 0.1
+#define SKIPSLOWVERSION 0.1
+#define TIMERINFOVERSION 0.1c
+#define SHOWSIZEVERSION 1.3.32
+#define DVDARCHIV 0.4
+#define DMHDVDARCHIV 3
+
 #define MAXPRIORITY 99
 #define MAXLIFETIME 99
 
@@ -282,8 +304,6 @@
   int SortRecords;
   int SortRecordsHelper;
   int MinEventTimeout, MinUserInactivity;
-  int TrayOpenOnBegin;
-  int TrayOpenOnEnd;
   int MultiSpeedMode;
   int ShowReplayMode;
   int DoubleEpgTimeDelta;
@@ -301,6 +321,10 @@
   int noEPGPatch;
   int CurrentVolume;
   int CurrentDolby;
+  int DvdDisplayMode;
+  int DvdDisplayZeros;
+  int DvdTrayMode;
+  int DvdSpeedLimit;
 
 //ML
   int VerboseLNBlog;
diff -ruN vdr-1.3.44/HISTORY-dmh-dvd-archive vdr-1.3.44-bp/HISTORY-dmh-dvd-archive
--- vdr-1.3.44/HISTORY-dmh-dvd-archive	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.3.44-bp/HISTORY-dmh-dvd-archive	2006-03-03 15:59:36.000000000 +0100
@@ -0,0 +1,21 @@
+DMH DVD-Archive Patch History
+-----------------------------
+
+
+2006-03-02: Version 3 (vdr: 1.3.44, BigPatch: test1)
+
+- changed the setup options
+
+- added possibility to remove leading zeros of dvd number (Suggested by
+  clausmuus@vdr-portal)
+
+- fixed problem that playing of archived recording does not start if "Show
+  DVD-No." is set to "no" in setup (Reported by Wolfi@vdr-portal)
+
+- added reloading of recordings when "DVD display mode" is turned to "Length /
+  Number" or "Number" in setup (Suggested by pat@vdr-portal)
+  
+- added this history ;o)
+
+
+2005-??-??: Initial Version
diff -ruN vdr-1.3.44/i18n.c vdr-1.3.44-bp/i18n.c
--- vdr-1.3.44/i18n.c	2006-03-03 16:25:54.000000000 +0100
+++ vdr-1.3.44-bp/i18n.c	2006-03-03 15:59:36.000000000 +0100
@@ -7465,8 +7465,206 @@
     "",//TODO
     "",//TODO
   },
-  { "Please mount DVD %s",
-    "Bitte DVD %s einlegen",
+  { "Please mount %s", // English
+    "Bitte %s einlegen", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "Mettez %s dans le lecteur", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Please mount DVD %04d", // English
+    "Bitte DVD %04d einlegen", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "Mettez le DVD %04d dans le lecteur", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Please mount DVD %d", // English
+    "Bitte DVD %d einlegen", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "Mettez le DVD %d dans le lecteur", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Please wait. Checking DVD...", // English
+    "Bitte warten. Überprüfe DVD...", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "Un moment SVP. Vérification DVD...", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Wrong DVD!", // English
+    "Falsche DVD!", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "Faux DVD!", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "DVD plugin is not installed!", // English
+    "Das DVD-Plugin ist nicht installiert!", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "Le DVD-plugin n'est pas installé!", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Please wait. Creating index-file...", // English
+    "Bitte warten. Index-Datei wird erstellt...", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "Attendez, merci. Le fichier index est en création...", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "No index-file found. Creating may take minutes. Create one?", // English
+    "Keine Index-Datei gefunden. Erstellung kann Minuten dauern. Erstellen?", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "Pas trouvé de fichiers index. Création du ficher prend quelques minutes. Créer?", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Setup.BigPatch$DVD display mode",
+    "DVD Anzeige",
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+    "",//TODO
+  },
+  { "Setup.BigPatch$Length",
+    "Länge",
     "",//TODO
     "",//TODO
     "",//TODO
@@ -7487,8 +7685,8 @@
     "",//TODO
     "",//TODO
   },
-  { "Wrong DVD!",
-    "Falsche DVD!",
+  { "Setup.BigPatch$Length / Number",
+    "Länge / Nummer",
     "",//TODO
     "",//TODO
     "",//TODO
@@ -7509,8 +7707,8 @@
     "",//TODO
     "",//TODO
   },
-  { "Setup.BigPatch$Tray open on begin",
-    "DVD-Schublade zu Beginn öffnen",
+  { "Setup.BigPatch$Number",
+    "Nummer",
     "",//TODO
     "",//TODO
     "",//TODO
@@ -7531,8 +7729,8 @@
     "",//TODO
     "",//TODO
   },
-  { "Setup.BigPatch$Tray open on end",
-    "DVD-Schublade am Ende öffnen",
+  { "Setup.BigPatch$DVD display leading zeros",
+    "DVD führende Nullen anzeigen",
     "",//TODO
     "",//TODO
     "",//TODO
@@ -7553,6 +7751,138 @@
     "",//TODO
     "",//TODO
   },
+  { "Setup.BigPatch$Tray open", // English
+    "DVD-Schublade öffnen", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "Ouvrir le tiroir du lecteur DVD", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Setup.BigPatch$never", // English
+    "nie", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Setup.BigPatch$on begin", // English
+    "am Anfang", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Setup.BigPatch$on end", // English
+    "am Ende", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Setup.BigPatch$on begin and end", // English
+    "am Anfang und Ende", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
+  { "Setup.BigPatch$Limit DVD to speed", // English
+    "DVD drosseln auf", // Deutsch / German
+    "", // Slovenski / Slovenian
+    "", // Italiano / Italian
+    "", // Nederlands / Dutch
+    "", // Português / Portuguese
+    "Ralentir la vitesse du DVD sur", // Français / French
+    "", // Norsk / Norwegian
+    "", // suomi / Finnish
+    "", // Polski / Polish
+    "", // Español / Spanish
+    "", // ÅëëçíéêÜ / Greek
+    "", // Svenska / Swedish
+    "", // Românã / Romanian
+    "", // Magyar / Hungarian
+    "", // Català / Catalanian
+    "", // ÀãááÚØÙ / Russian
+    "", // Hrvatski / Croatian
+    "", // Eesti / Estonian
+    "", // Dansk / Danish
+    "", // Èesky / Czech
+  },
   { NULL }
   };
 
diff -ruN vdr-1.3.44/menu.c vdr-1.3.44-bp/menu.c
--- vdr-1.3.44/menu.c	2006-03-03 16:25:54.000000000 +0100
+++ vdr-1.3.44-bp/menu.c	2006-03-03 16:09:00.000000000 +0100
@@ -2588,8 +2588,27 @@
      else {
         cRecording *recording = GetRecording(ri);
         if (recording) {
-           cReplayControl::SetRecording(recording->FileName(), recording->Title());
-           return osReplay;
+	   int mountRet = MOUNT_DVD_REPLAY;
+	   if (recording->IsOnlyOnDvd()) {
+	     mountRet = recording->MountDvd();
+	   }
+	   if(mountRet == MOUNT_DVD_REPLAY) {
+	     cReplayControl::SetRecording(recording->FileName(), recording->Title());
+             return osReplay;
+	   } else if (mountRet == MOUNT_DVD_LAUNCH_DVD_PLUGIN) {
+	     //launch DVD plugin here
+	     cPlugin *p = cPluginManager::GetPlugin("dvd");
+	     cOsdObject *osd = NULL;
+	     if(p) {
+	       osd = p->MainMenuAction();
+	       delete osd;
+	       osd = NULL;
+	       return osEnd;
+	     } else {
+	       Skins.Message(mtError, tr("DVD plugin is not installed!"));
+	       Skins.Flush();
+	       }
+	     }
            }
         }
      }
@@ -3321,8 +3340,19 @@
   Add(new cMenuEditBoolItem(tr("Setup.BigPatch$Record Dolby Digital"),            &data.UseDolbyInRecordings));  
   Add(new cMenuEditIntItem( tr("Setup.BigPatch$Jump Seconds"),	                  &data.JumpSeconds));
   Add(new cMenuEditIntItem( tr("Setup.BigPatch$Jump Seconds Slow"),               &data.JumpSecondsSlow));
-  Add(new cMenuEditBoolItem(tr("Setup.BigPatch$Tray open on begin"),              &data.TrayOpenOnBegin));
-  Add(new cMenuEditBoolItem(tr("Setup.BigPatch$Tray open on end"),                &data.TrayOpenOnEnd));  
+  static const char *dvddisplaymode[3];
+  dvddisplaymode[0]=tr("Setup.BigPatch$Length");
+  dvddisplaymode[1]=tr("Setup.BigPatch$Length / Number");
+  dvddisplaymode[2]=tr("Setup.BigPatch$Number");
+  Add(new cMenuEditStraItem(tr("Setup.BigPatch$DVD display mode"),                &data.DvdDisplayMode,3,dvddisplaymode));
+  Add(new cMenuEditBoolItem(tr("Setup.BigPatch$DVD display leading zeros"),       &data.DvdDisplayZeros));
+  static const char *dvdtraymode[4];
+  dvdtraymode[0]=tr("Setup.BigPatch$never");
+  dvdtraymode[1]=tr("Setup.BigPatch$on begin");
+  dvdtraymode[2]=tr("Setup.BigPatch$on end");
+  dvdtraymode[3]=tr("Setup.BigPatch$on begin and end");
+  Add(new cMenuEditStraItem(tr("Setup.BigPatch$Tray open"),                       &data.DvdTrayMode,4,dvdtraymode));
+  Add(new cMenuEditIntItem(tr("Setup.BigPatch$Limit DVD to speed"),               &data.DvdSpeedLimit, 0, 50));
 // /  Add(new cMenuEditBoolItem(tr("Setup.BigPatch$Sort recordings by date"),        &data.SortRecordsByDate));
 
 }
@@ -3915,6 +3945,7 @@
   if (Direction) {
      while (Channel) {
            Channel = Direction > 0 ? Channels.Next(Channel) : Channels.Prev(Channel);
+           if (cStatus::MsgChannelProtected(0, Channel) == false)      // PIN PATCH
            if (Channel && !Channel->GroupSep() && (cDevice::PrimaryDevice()->ProvidesChannel(Channel, Setup.PrimaryLimit) || cDevice::GetDevice(Channel, 0)))
               return Channel;
            }
diff -ruN vdr-1.3.44/menuitems.c vdr-1.3.44-bp/menuitems.c
--- vdr-1.3.44/menuitems.c	2006-03-03 16:25:55.000000000 +0100
+++ vdr-1.3.44-bp/menuitems.c	2006-03-01 00:08:27.000000000 +0100
@@ -827,11 +827,10 @@
                      *value = 256;
                      SetValue(buf);
                    } else {
-                     cChannel *channel = Channels.GetByNumber(*value + delta, delta);
-                     if (channel) {
-                        *value = channel->Number();
-                        Set();
-                        }
+                     if (*value + delta >= 0) {
+                       *value = *value + delta;
+                       Set();
+                     }
                    }
                  }
                  break;
diff -ruN vdr-1.3.44/NEWBP.txt vdr-1.3.44-bp/NEWBP.txt
--- vdr-1.3.44/NEWBP.txt	2006-03-03 16:25:55.000000000 +0100
+++ vdr-1.3.44-bp/NEWBP.txt	2006-03-03 16:12:44.000000000 +0100
@@ -1,7 +1,7 @@
 Zur Zeit enthaltene Patches:
 
-LiveBuffer Patch V 0.1.5
-Liemikuutio Patch V 1.2 mit MenuCmdPosition Patch!
+LiveBuffer Patch V 0.1.6
+Liemikuutio Patch V 1.3 mit MenuCmdPosition Patch!
 Plugin Missing Patch
 Showsize_Delmarks2 Patch
 Reload Recordings Patch (Taste 9 im Recordings Menu)
@@ -58,13 +58,16 @@
 JumpingSeconds Patch eingebaut
 Anspassung an VDR 1.4.43
 
-
 NEU 21:
 Patch fuer das PIN Plugin
 Wareagle-int2 Patch
 DVDArchiv Patch
 Kleinere Fixes
 
-Bekannte Bugs:
-- Einschaltlautstaerke -> Wert veraendert sich scheinbar mit "Spruengen"
-- Einschaltlautstaerke mit der Option letzte Lautstaerke -> funktioniert nicht!
+NEU 22:
+Bugfix fuer den PreferredVolume Patch von Helmut Auer
+DMH DVD-Archiv Patch Version 3
+PIN Plugin Patch aktualisiert
+
+
+Bekannte Bugs: Keine!
diff -ruN vdr-1.3.44/recording.c vdr-1.3.44-bp/recording.c
--- vdr-1.3.44/recording.c	2006-03-03 16:25:55.000000000 +0100
+++ vdr-1.3.44-bp/recording.c	2006-03-03 15:59:36.000000000 +0100
@@ -46,6 +46,7 @@
 #endif
 #define INFOFILESUFFIX    "/info.vdr"
 #define MARKSFILESUFFIX   "/marks.vdr"
+#define DVDARCHIVEFILENAME "/dvd.vdr"
 
 #define MINDISKSPACE 1024 // MB
 
@@ -484,6 +485,10 @@
   sortBuffer = NULL;
   fileName = NULL;
   name = NULL;
+  dvdname = NULL;
+  dvdtrack = NULL;
+  isArchived = false;
+  isOnlyOnDvd = false;
   fileSizeMB = -1; // unknown
   deleted = 0;
   // set up the actual name:
@@ -544,6 +549,10 @@
   char *p = strrchr(FileName, '/');
 
   name = NULL;
+  dvdname = NULL;
+  dvdtrack = NULL;
+  isArchived = false;
+  isOnlyOnDvd = false;
   info = new cRecordingInfo;
   if (p) {
      time_t now = time(NULL);
@@ -627,6 +636,13 @@
         free(SummaryFileName);
         }
 #endif
+     if(CheckFileExistence("dvd.vdr")) {
+       GetDvdName(fileName);
+       isArchived = true;
+       if(!CheckFileExistence("001.vdr")) {
+         isOnlyOnDvd = true;  
+         }
+       }
      }
 }
 
@@ -636,6 +652,8 @@
   free(sortBuffer);
   free(fileName);
   free(name);
+  free(dvdname);
+  free(dvdtrack);
   delete info;
 }
 
@@ -702,6 +720,188 @@
   return fileName;
 }
 
+bool cRecording::CheckFileExistence(const char* FileNameToTest, const bool useVideoDir) const
+{
+  if (!useVideoDir || (useVideoDir && FileName())) {
+    char filename[BUFSIZ];
+    
+    sprintf(filename, "%s%s%s", useVideoDir ? FileName() : "",
+				useVideoDir ? "/" : "",
+				FileNameToTest);
+    struct stat statBuf;
+    if(lstat(filename, &statBuf) == -1) return false;
+    return S_ISREG(statBuf.st_mode) || S_ISLNK(statBuf.st_mode);
+    }
+  return false;
+}
+
+bool cRecording::GetDvdName(const char* Directory) const
+{
+  char* filename = (char*)alloca(strlen(Directory) + strlen(DVDARCHIVEFILENAME) + 1);
+  if (filename) {
+    strcpy(filename, Directory);
+    char *end = filename + strlen(filename);
+    strcpy(end, DVDARCHIVEFILENAME);
+    FILE* file;
+    if((file = fopen(filename, "r"))) {
+      cReadLine ReadLine;
+      char* buffer = (char*)alloca(BUFSIZ);
+      if(buffer) {
+        buffer = ReadLine.Read(file);
+        if(buffer) {
+	  ((cRecording*)this)->dvdname = strdup(buffer);
+	} else {
+	  ((cRecording*)this)->dvdname = NULL;
+	  }
+	    
+        buffer = ReadLine.Read(file);
+        if(buffer) {
+	  ((cRecording*)this)->dvdtrack = strdup(buffer);
+	} else {
+	  ((cRecording*)this)->dvdtrack = NULL;
+	  }
+	    
+        fclose(file);
+        return true;
+        }
+      }
+    }
+  return false;
+}
+
+int cRecording::MountDvd(void) const
+{
+  char cmd[BUFSIZ];
+  if(Setup.DvdSpeedLimit > 0) {
+    sprintf(cmd, "speedcontrol -x %d %s", Setup.DvdSpeedLimit, DVD_DEVICE);
+    SystemExec(cmd);
+    }
+
+  char msg[BUFSIZ];
+  if(atoi(dvdname) == 0) {
+    sprintf(msg, tr("Please mount %s"), dvdname);
+  } else {
+    if(Setup.DvdDisplayZeros) {
+      sprintf(msg, tr("Please mount DVD %04d"), atoi(dvdname));
+    } else {
+      sprintf(msg, tr("Please mount DVD %d"), atoi(dvdname));
+      }  
+    }
+  
+  bool rep = true;
+  while(rep) {
+    if(Setup.DvdTrayMode==1 || Setup.DvdTrayMode==3) {
+      sprintf(cmd, "umount %s; eject %s", DVD_DEVICE, DVD_DEVICE);
+    } else {
+      sprintf(cmd, "umount %s", DVD_DEVICE);
+      }
+    SystemExec(cmd);
+  
+    if(Interface->Confirm(msg, 300)) {
+      Skins.Message(mtStatus, tr("Please wait. Checking DVD..."));
+      Skins.Flush();
+      sprintf(cmd, "eject -t %s; mkdir -p %s; mount -o ro -t %s %s %s",
+		    DVD_DEVICE, DVD_MOUNT_PATH,
+		    (dvdtrack ? "udf" : "iso9660"),
+		    DVD_DEVICE, DVD_MOUNT_PATH);
+      SystemExec(cmd);
+    
+      bool correctDvd = true;
+    
+      char *olddvdname, *olddvdtrack;
+      olddvdname = dvdname;
+      olddvdtrack = dvdtrack;
+      if(GetDvdName(DVD_MOUNT_PATH)) {
+        if(atoi(dvdname) != atoi(olddvdname)) correctDvd = false;
+        }
+      ((cRecording*)this)->dvdname = olddvdname;
+      ((cRecording*)this)->dvdtrack = olddvdtrack;
+    
+      if(correctDvd) {
+        if(dvdtrack == NULL) {
+          // Archived DVD in VDR format
+	  char fn[BUFSIZ];
+	  strcpy(fn, FileName());
+	  char *p = strrchr(fn, '/');
+	  sprintf(cmd, "find '%s' -name '%s'", DVD_MOUNT_PATH, p+1);
+        } else {
+          // Either archived DVD in DVD-Video format or DVD-Video which
+	  // should be played with the DVD plugin
+	  sprintf(cmd, "find '%s' -iname 'VIDEO_TS'", DVD_MOUNT_PATH);
+          }
+	
+        cReadLine pipe;
+        FILE* file;
+        char *dirname = NULL;
+        if((file = popen(cmd, "r")) != (FILE *)NULL) {
+          if((dirname = pipe.Read(file)) != NULL) {
+	    pclose(file);
+	    if(dvdtrack != NULL && atoi(dvdtrack) == 0) {
+	      // It is a valid Video-DVD and DVD plugin can be started
+	      return MOUNT_DVD_LAUNCH_DVD_PLUGIN;
+	    } else {
+	      // It is a valid Archive-DVD or an archived Video-DVD
+	      // and the links can now be established
+	      char srcFn[BUFSIZ];
+	      int n = 1;
+	    
+	      do {
+	        if(dvdtrack == NULL) {
+	          sprintf(srcFn, "%s/%03d.vdr", dirname, n);
+		} else {
+	          sprintf(srcFn, "%s/VTS_%02d_%d.VOB", dirname, atoi(dvdtrack), n);
+		  }
+	    
+	        if(!access(srcFn, R_OK)) {
+	          sprintf(cmd, "ln -sf '%s' '%s/%03d.vdr'", srcFn, FileName(), n);
+	          SystemExec(cmd);
+	          isyslog("DVD-ARCHIVE: Linking %s/%03d.vdr -> %s", FileName(), n, srcFn);
+	        } else {
+	          break;
+	          }
+	        } while( ++n < 999);
+	      
+	        if(!CheckFileExistence("index.vdr")) {
+		  if(dvdtrack == NULL) {
+	            sprintf(srcFn, "%s/index.vdr", dirname);
+		  } else {
+	            sprintf(srcFn, "%s/index_%02d.vdr", dirname, atoi(dvdtrack));
+		    }
+		    
+	          if(!CheckFileExistence(srcFn, false)) {
+		    sprintf(msg, tr("No index-file found. Creating may take minutes. Create one?"));
+		    if(Interface->Confirm(msg, 300)) {
+		      Skins.Message(mtStatus, tr("Please wait. Creating index-file..."));
+		      sprintf(cmd, "speedcontrol -x 999 %s; cd %s && genindex &", DVD_DEVICE, FileName());
+		      SystemExec(cmd);
+		      return MOUNT_DVD_ABORT;
+		    }
+		  } else {
+		    sprintf(cmd, "ln -sf '%s' '%s/index.vdr'", srcFn, FileName());
+	            SystemExec(cmd);
+	            isyslog("DVD-ARCHIVE: Linking %s/index.vdr -> %s", FileName(), srcFn);
+		    }
+	          }
+	      return MOUNT_DVD_REPLAY;
+	      }
+	  } else {
+            Skins.Message(mtError, tr("Wrong DVD!"), 3);
+            Skins.Flush();
+	    }
+          }
+        pclose(file);
+	
+      } else {
+        Skins.Message(mtError, tr("Wrong DVD!"), 3);
+        Skins.Flush();
+        }
+    } else {
+      rep = false;
+    }
+  }
+  return MOUNT_DVD_ABORT;
+}
+
 const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level, bool Original) const
 {
   char New = NewIndicator && IsNew() ? Setup.WarEagleIcons ? ICON_NEU : '*' : ' ';
@@ -762,6 +962,42 @@
                  }
               }
            }
+	
+	if(isArchived && !isOnlyOnDvd) New = '~';
+        
+	if (isOnlyOnDvd && Setup.DvdDisplayMode >= 1) {
+	   char oldLength[21];
+	   
+	   if(strrchr(RecLength, '\'')) {
+	     snprintf(oldLength, sizeof(oldLength), "%s", RecLength);
+	   } else {
+	     oldLength[0] = 0;
+	   }
+
+	   if(dvdname) {
+	     char tmp[BUFSIZ];
+	     if(atoi(dvdname) != 0) {
+	       if(Setup.DvdDisplayZeros) {
+	         snprintf(tmp, sizeof(tmp), "%04d", atoi(dvdname));
+	       } else {
+	         int num = atoi(dvdname);
+		 bool displaySpace = !(Setup.DvdDisplayMode == 1 && oldLength[0] != 0);
+		 // ugly hack to have 2 spaces instead of one 0 for each place
+	         snprintf(tmp, sizeof(tmp), "%s%s%s%d", displaySpace && (num < 1000) ? "  " : "",
+							displaySpace && (num < 100)  ? "  " : "",
+							displaySpace && (num < 10)   ? "  " : "",
+							num);
+	         }
+	       ((cRecording*)this)->dvdname = strdup(tmp);
+	       }
+	     }
+	     
+	   snprintf(RecLength, sizeof(RecLength), "%s%s%s%s",	(Setup.ShowRecLength && (Setup.DvdDisplayMode == 1) && (oldLength[0] != 0)) ? oldLength : "",
+								    (dvdname && isArchived && isOnlyOnDvd && Setup.ShowRecLength && (Setup.DvdDisplayMode == 1) && (oldLength[0] != 0)) ? " / " : "",
+								    (dvdname && isArchived && isOnlyOnDvd) ? dvdname : "",
+								    (dvdname && isArchived && isOnlyOnDvd) ? " " : ""
+							);
+	   }
         snprintf(RecDate, sizeof(RecDate), "%02d.%02d.%02d", t->tm_mday, t->tm_mon + 1, t->tm_year % 100);
         snprintf(RecTime, sizeof(RecTime), "%02d:%02d", t->tm_hour, t->tm_min);
         snprintf(RecDelimiter, sizeof(RecDelimiter), "%c", Delimiter);
@@ -771,8 +1007,8 @@
                                (Setup.ShowRecTime ? RecTime                               : ""),
                                New,
                                (Setup.ShowRecTime   ? RecDelimiter : Setup.ShowRecDate ? RecDelimiter : ""),
-                               (Setup.ShowRecLength ? RecLength    : ""),
-                               (Setup.ShowRecLength ? RecDelimiter : ""),
+                               (((Setup.ShowRecLength + Setup.DvdDisplayMode) > 0) ? RecLength    : ""),
+                               (((Setup.ShowRecLength + Setup.DvdDisplayMode) > 0) ? RecDelimiter : ""),
                                s);
         }
      // let's not display a trailing '~':
@@ -1516,6 +1752,49 @@
 cFileName::~cFileName()
 {
   Close();
+
+  // DVD Archive Begin
+  
+  char fn[BUFSIZ];
+  strcpy(fn, fileName);
+  
+  char *p;
+  if((p = strrchr(fn, '/'))) {
+    p[0] = 0;
+    }
+  
+  char cmd[BUFSIZ];
+  sprintf(cmd, "find '%s' -type l -lname '%s/*'", fn, DVD_MOUNT_PATH);
+  
+  bool isOnDvd = false;
+  
+  cReadLine pipe;
+  FILE* file;
+  char* filename;
+  if((file = popen(cmd, "r")) != (FILE *)NULL) {
+    while((filename = pipe.Read(file)) != NULL) {
+      isOnDvd = true;
+      unlink(filename);
+      isyslog("DVD-ARCHIVE: Deleting %s", filename);
+      }
+    }
+  
+  if(isOnDvd) {
+    if(Setup.DvdTrayMode==2 || Setup.DvdTrayMode==3) {
+      sprintf(cmd, "umount %s; eject %s", DVD_DEVICE, DVD_DEVICE);
+    } else {
+      sprintf(cmd, "umount %s", DVD_DEVICE);
+      }
+    SystemExec(cmd);
+    
+    if(Setup.DvdSpeedLimit > 0) {
+      sprintf(cmd, "speedcontrol -x 999 %s", DVD_DEVICE);
+      SystemExec(cmd);
+      }
+    }
+  
+  // DVD Archive End
+
   free(fileName);
 }
 
@@ -1530,95 +1809,6 @@
            LOG_ERROR_STR(fileName);
         }
      else {
-     
-//DVDARCHIVE Patch Start
-        isOnDVD = false;
-
-        if (access(fileName, R_OK)) { // fileName="/video0/Blumen_des_Schreckens/2004-05-10.12:25.50.99.rec/001.vdr"
-          if (errno == ENOENT) {
-            register char *p, *p1;
-            register int   n = 1;
-            auto     bool  ok = false;
-            auto     char  fn[BUFSIZ], fn2[BUFSIZ], msg[BUFSIZ], cmd[BUFSIZ], s[BUFSIZ];
-            auto     FILE *f, *f1;
-     	    cReadLine ReadLine;
-
-            strcpy(fn, fileName);
-
-            if ((p = strrchr(fn, '.'))) {
-              memcpy(p - 3, "dvd", 3);    // fn="/video0/Blumen_des_Schreckens/2004-05-10.12:25.50.99.rec/dvd.vdr"
-
-              if ((f = fopen(fn, "r")) != (FILE *)NULL) {
-                if (fgets(s, sizeof s, f)) {
-                  if ((p1 = strchr(s, '\n')))
-                    *p1 = 0;
-                  sprintf(msg, tr("Please mount DVD %s"), s);
-
-                  do {
-                    if (Setup.TrayOpenOnBegin)
-                      SystemExec("umount /dev/cdrom; eject /dev/cdrom");
-                    else
-                      SystemExec("umount /dev/cdrom");
-
-                    if (Interface->Confirm(msg)) {
-
-                      SystemExec("eject -t /dev/cdrom; mkdir -p /tmp/vdr.dvd; mount -o ro /dev/cdrom /tmp/vdr.dvd");
-                      isOnDVD = true;
-
-                      *(p - 4) = 0;
-                      sprintf(cmd, "find /tmp/vdr.dvd -name '%s'", p - 30); // fn="2004-05-10.12:25.50.99.rec"
-
-                      if ((f1 = popen(cmd, "r")) != (FILE *)NULL) {
-
-                        if ((p1 = ReadLine.Read(f1)) != NULL) {
-
-                          if ((p = strrchr(fileName, '/')))
-                            *p = 0;
-
-                          do {
-                            sprintf(fn2, "%s/%03d.vdr", p1, n);
-
-        		    if (!access(fn2, R_OK)) {
-                              sprintf(s, "ln -sf '%s' '%s/%03d.vdr'", fn2, fileName, n);
-                      	      SystemExec(s);
-           		      dsyslog(s);
-        		    }
-                            else
-                              break;
-                          }
-                          while (++n < MAXFILESPERRECORDING);
-
-                          sprintf(fn2, "%s/index.vdr", p1);
-
-        		  if (!access(fn2, R_OK)) {
-                            sprintf(s, "ln -sf '%s' '%s/index.vdr'", fn2, fileName);
-                      	    SystemExec(s);
-                      	    dsyslog(s);
-                          }
-
-                          *p = '/';
-
-                          ok = true;
-                        }
-                        pclose(f1);
-                      }
-
-                      if (!ok) {
-                        Skins.Message(mtError, tr("Wrong DVD!"));
-                        isOnDVD = false;
-                      }
-                    }
-                    else
-                      break;
-                  } while (!ok);
-                }
-                fclose(f);
-              }
-            }
-          }
-        }
-//DVDARCHIVE Patch End
-
         if (access(fileName, R_OK) == 0) {
            dsyslog("playing '%s'", fileName);
            file = cUnbufferedFile::Create(fileName, O_RDONLY | BlockingFlag);
@@ -1638,17 +1828,6 @@
      if ((record && CloseVideoFile(file) < 0) || (!record && file->Close() < 0))
         LOG_ERROR_STR(fileName);
      file = NULL;
-     
-//DVDARCHIVE Patch Start
-     if (isOnDVD) {
-        if (Setup.TrayOpenOnEnd)
-          SystemExec("umount /dev/cdrom; eject /dev/cdrom");
-        else
-          SystemExec("umount /dev/cdrom");
-        isOnDVD = false;
-     }
-//DVDARCHIVE Patch End
-
      }
 }
 
diff -ruN vdr-1.3.44/recording.h vdr-1.3.44-bp/recording.h
--- vdr-1.3.44/recording.h	2006-03-03 16:25:55.000000000 +0100
+++ vdr-1.3.44-bp/recording.h	2006-03-03 15:59:36.000000000 +0100
@@ -61,6 +61,12 @@
   bool Write(FILE *f, const char *Prefix = "") const;
   };
 
+#define MOUNT_DVD_ABORT             0
+#define MOUNT_DVD_REPLAY            1
+#define MOUNT_DVD_LAUNCH_DVD_PLUGIN 2
+#define DVD_DEVICE		    "/dev/cdrom"
+#define DVD_MOUNT_PATH		    "/tmp/vdr.dvd"
+
 class cRecording : public cListObject {
   friend class cRecordings;
 private:
@@ -71,6 +77,10 @@
   mutable char *name;
   mutable int fileSizeMB;
   cRecordingInfo *info;
+  char *dvdname;
+  char *dvdtrack;
+  bool isArchived;
+  bool isOnlyOnDvd;
   static char *StripEpisodeName(char *s);
   char *SortName(void) const;
   int GetResume(void) const;
@@ -85,6 +95,10 @@
   virtual int Compare(const cListObject &ListObject) const;
   const char *Name(void) const { return name; }
   const char *FileName(void) const;
+  bool CheckFileExistence(const char* FileNameToTest, const bool useVideoDir = true) const;
+  bool GetDvdName(const char* Directory) const;
+  bool IsOnlyOnDvd(void) const { return isOnlyOnDvd; }
+  int MountDvd(void) const;
   const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1, bool Original = false) const;
   const cRecordingInfo *Info(void) const { return info; }
   const char *PrefixFileName(char Prefix, bool IsLiveRec = false);
@@ -206,6 +220,7 @@
   cResumeFile resumeFile;
   cMutex mutex;
   bool CatchUp(int Index = -1);
+  bool isOnDVD;
 public:
   cIndexFile(const char *FileName, bool Record,bool IsLiveRec = false);
   ~cIndexFile();
