diff -u -r vdr-1.3.10-orig/channels.h vdr-1.3.10/channels.h
--- vdr-1.3.10-orig/channels.h	Sat Apr  3 15:40:47 2004
+++ vdr-1.3.10/channels.h	Fri Jun 18 18:22:00 2004
@@ -82,6 +82,14 @@
 
 class cChannel : public cListObject {
   friend class cMenuEditChannel;
+
+//ML
+  friend class cDevice;
+  friend class cEITScanner;
+  friend class cRecordControls;
+  friend class cTimers;
+//ML-Ende
+
 private:
   static char *buffer;
   static const char *ToText(cChannel *Channel);
diff -u -r vdr-1.3.10-orig/device.c vdr-1.3.10/device.c
--- vdr-1.3.10-orig/device.c	Wed Jun 16 18:07:31 2004
+++ vdr-1.3.10/device.c	Fri Jun 18 18:38:44 2004
@@ -39,6 +39,10 @@
 
   SetVideoFormat(Setup.VideoFormat);
 
+//ML
+  LNBlock = -1;
+//ML-Ende
+
   active = false;
 
   mute = false;
@@ -144,6 +148,47 @@
   return (0 <= Index && Index < numDevices) ? device[Index] : NULL;
 }
 
+
+//ML
+cDevice *cDevice::GetBadDevice(char Polarization, int Frequency)
+{
+char lock;
+if (Frequency >= Setup.LnbSLOF) {
+  lock = 1 ;
+} else {
+  lock = 0;
+}
+if (Polarization == 'v' || Polarization == 'V') lock += 2;
+ 
+  for (int i = 0; i < numDevices; i++) {
+    if (this != device[i] && device[i]->GetLNBconf() != lock) {
+      return device[i];
+    }
+  }
+  return NULL;
+}
+
+
+int cDevice::GetMaxBadPriority(char Polarization, int Frequency)
+{
+char lock;
+if (Frequency >= Setup.LnbSLOF) {
+  lock = 1 ;
+} else {
+  lock = 0;
+}
+if (Polarization == 'v' || Polarization == 'V') lock += 2;
+
+int d = -1;
+  for (int i = 0; i < numDevices; i++) {
+    if (device[i]->GetLNBconf() != lock && device[i]->Receiving()) {
+      if (device[i]->Priority() > d) d = device[i]->Priority();
+      }
+  }
+  return d;
+}
+//ML-Ende
+
 cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers)
 {
   cDevice *d = NULL;
@@ -352,9 +397,24 @@
 
 bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView)
 {
+//ML
+  cDevice *tmpDevice;
+  if (this->GetMaxBadPriority(Channel->polarization, Channel->frequency) >= 0) {
+     Skins.Message(mtError, tr("durch LNB blockiert!"));
+     return false;
+  }
+         while ((tmpDevice = GetBadDevice(Channel->polarization, Channel->frequency)) != NULL) {
+	     if (tmpDevice->IsPrimaryDevice() )
+           tmpDevice->SwitchChannelForced(Channel, true);
+         else
+           tmpDevice->SwitchChannelForced(Channel, false);
+         }
+//ML-Ende
+
   if (LiveView)
      isyslog("switching to channel %d", Channel->Number());
   for (int i = 3; i--;) {
+
       switch (SetChannel(Channel, LiveView)) {
         case scrOk:           return true;
         case scrNotAvailable: Skins.Message(mtError, tr("Channel not available!"));
@@ -368,6 +428,28 @@
   return false;
 }
 
+//ML
+bool cDevice::SwitchChannelForced(const cChannel *Channel, bool LiveView)
+{
+  if (LiveView)
+     isyslog("switching to channel %d", Channel->Number());
+  for (int i = 3; i--;) {
+
+      switch (SetChannel(Channel, LiveView)) {
+        case scrOk:           return true;
+        case scrNotAvailable: Skins.Message(mtError, tr("Channel not available!"));
+                              return false;
+        case scrNoTransfer:   Skins.Message(mtError, tr("Can't start Transfer Mode!"));
+                              return false;
+        case scrFailed:       break; // loop will retry
+        }
+      esyslog("retrying");
+      }
+  return false;
+}
+//ML-Ende
+
+
 bool cDevice::SwitchChannel(int Direction)
 {
   bool result = false;
@@ -378,7 +460,10 @@
      cChannel *channel;
      while ((channel = Channels.GetByNumber(n, Direction)) != NULL) {
            // try only channels which are currently available
-           if (PrimaryDevice()->ProvidesChannel(channel, Setup.PrimaryLimit) || PrimaryDevice()->CanReplay() && GetDevice(channel, 0))
+//ML
+           if (PrimaryDevice()->GetMaxBadPriority(channel->polarization, channel->frequency) == -1 && (PrimaryDevice()->ProvidesChannel(channel, Setup.PrimaryLimit) || PrimaryDevice()->CanReplay() && GetDevice(channel, 0)))
+//ML-Ende
+
               break;
            n = channel->Number() + Direction;
            }
@@ -412,7 +497,31 @@
   // If this DVB card can't receive this channel, let's see if we can
   // use the card that actually can receive it and transfer data from there:
 
+//ML
+  char lock;
+  bool LNBchange = false;
+  if (Channel->Frequency() >= Setup.LnbSLOF) {
+    lock = 1;
+  } else {
+    lock = 0;
+  }
+  if (Channel->Polarization() == 'v' || Channel->Polarization() == 'V') lock += 2;
+	 if (LNBlock != lock) LNBchange = true;
+     LNBlock = lock;
+//ML-Ende
+
   if (NeedsTransferMode) {
+
+//ML
+    if (LNBchange) {
+      if (IsPrimaryDevice()) {
+        SetChannelDevice(Channel, true);
+      } else {
+        SetChannelDevice(Channel, false);
+      }
+    }
+//ML-Ende
+
      cDevice *CaDevice = GetDevice(Channel, 0);
      if (CaDevice && CanReplay()) {
         cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel
diff -u -r vdr-1.3.10-orig/device.h vdr-1.3.10/device.h
--- vdr-1.3.10-orig/device.h	Wed Jun 16 18:07:31 2004
+++ vdr-1.3.10/device.h	Fri Jun 18 18:27:31 2004
@@ -96,6 +96,19 @@
          ///< given Priority.
          ///< See ProvidesChannel() for more information on how
          ///< priorities are handled, and the meaning of NeedsDetachReceivers.
+
+//ML
+private:
+  // beschreibt die LNB-Konfiguration
+  char LNBlock;
+public:
+  char GetLNBconf(void) { return LNBlock; }
+  cDevice *GetBadDevice(char Polarization, int Frequency);
+         // Gibt eine DVB-Karte zurück, deren LNB Konfiguration anderes eingestellt ist
+  int GetMaxBadPriority(char Polarization, int Frequency);
+         // Gibt die höchte Priorität aller Aufträge mit anderer LNB Konfiguration zurück
+//ML-Ende
+
   static void Shutdown(void);
          ///< Closes down all devices.
          ///< Must be called at the end of the program.
@@ -173,6 +186,13 @@
   bool SwitchChannel(const cChannel *Channel, bool LiveView);
          ///< Switches the device to the given Channel, initiating transfer mode
          ///< if necessary.
+
+//ML
+  bool SwitchChannelForced(const cChannel *Channel, bool LiveView);
+         ///< Switches the device to the given Channel, initiating transfer mode
+         ///< if necessary.
+//ML-Ende
+
   static bool SwitchChannel(int Direction);
          ///< Switches the primary device to the next available channel in the given
          ///< Direction (only the sign of Direction is evaluated, positive values
diff -u -r vdr-1.3.10-orig/eitscan.c vdr-1.3.10/eitscan.c
--- vdr-1.3.10-orig/eitscan.c	Fri Apr 16 15:33:34 2004
+++ vdr-1.3.10/eitscan.c	Fri Jun 18 20:32:27 2004
@@ -146,7 +146,13 @@
                             if (!(Device->Receiving(true) || Device->Replaying())) {
                                const cChannel *Channel = ScanData->GetChannel();
                                if (Channel) {
-                                  if ((!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= 0x0100) && Device->ProvidesTransponder(Channel)) {
+
+//ML
+//                                  if ((!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= 0x0100) && Device->ProvidesTransponder(Channel)) {
+                                  if ((!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= 0x0100) && Device->ProvidesTransponder(Channel) && (!Device->GetBadDevice(Channel->polarization, Channel->frequency) || (Device->GetMaxBadPriority(Channel->polarization, Channel->frequency) == -1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) ) {
+
+//ML-Ende
+
                                      if (Device == cDevice::PrimaryDevice() && !currentChannel) {
                                         currentChannel = Device->CurrentChannel();
                                         Skins.Message(mtInfo, "Starting EPG scan");
diff -u -r vdr-1.3.10-orig/menu.c vdr-1.3.10/menu.c
--- vdr-1.3.10-orig/menu.c	Wed Jun 16 18:07:31 2004
+++ vdr-1.3.10/menu.c	Fri Jun 18 20:57:55 2004
@@ -2867,6 +2867,27 @@
      int Priority = Timer ? Timer->Priority() : Pause ? Setup.PausePriority : Setup.DefaultPriority;
      cDevice *device = cDevice::GetDevice(channel, Priority, &NeedsDetachReceivers);
      if (device) {
+
+//ML
+	     if (device->GetMaxBadPriority(channel->polarization, channel->frequency) >= Priority) {
+	       isyslog("Aufnahme mit anderer Polarisation hat höhere Priorität!");
+	       Timer->SetPending(false);
+	       return false;
+	     } else {
+	       cDevice *tmpDevice;
+	       while ((tmpDevice = device->GetBadDevice(channel->polarization, channel->frequency))) {
+             if (tmpDevice->Replaying() == false) {
+               Stop(tmpDevice);
+  		       if (tmpDevice->IsPrimaryDevice() )
+	             tmpDevice->SwitchChannelForced(channel, true);
+	           else
+	             tmpDevice->SwitchChannelForced(channel, false);
+	         } else
+			   tmpDevice->SwitchChannelForced(channel, false);
+		   }
+		 }
+//ML-Ende
+
         if (NeedsDetachReceivers) {
            Stop(device);
            if (device == cTransferControl::ReceiverDevice())
diff -u -r vdr-1.3.10-orig/timers.c vdr-1.3.10/timers.c
--- vdr-1.3.10-orig/timers.c	Sun Mar 14 14:27:57 2004
+++ vdr-1.3.10/timers.c	Fri Jun 18 18:22:00 2004
@@ -468,7 +468,11 @@
 {
   cTimer *t0 = NULL;
   for (cTimer *ti = First(); ti; ti = Next(ti)) {
-      if (!ti->Recording() && ti->Matches(t)) {
+
+//ML
+      if (!ti->Recording() && cDevice::PrimaryDevice()->GetMaxBadPriority(ti->channel->polarization, ti->channel->frequency) < ti->priority && ti->Matches(t)) {
+//ML-Ende
+
          if (!t0 || ti->Priority() > t0->Priority())
             t0 = ti;
          }
diff -u -r vdr-1.3.10-orig/timers.h vdr-1.3.10/timers.h
--- vdr-1.3.10-orig/timers.h	Sun Feb 29 15:18:17 2004
+++ vdr-1.3.10/timers.h	Fri Jun 18 18:22:00 2004
@@ -25,6 +25,13 @@
 
 class cTimer : public cListObject {
   friend class cMenuEditTimer;
+
+//ML
+  friend class cDevice;
+  friend class cRecordControls;
+  friend class cTimers;
+//ML-Ende
+
 private:
   time_t startTime, stopTime;
   static char *buffer;
