diff -u -r vdr-1.3.15-orig/config.c vdr-lnbshare/config.c
--- vdr-1.3.15-orig/config.c	2004-10-31 17:17:39.000000000 +0100
+++ vdr-lnbshare/config.c	2004-11-17 21:12:07.000000000 +0100
@@ -297,6 +297,11 @@
   ResumeID = 0;
   CurrentChannel = -1;
   CurrentVolume = MAXVOLUME;
+
+//ML
+  for (int i = 0; i < MAXDEVICES; i++) CardUsesLNBnr[i] = i + 1;
+//ML-Ende
+
 }
 
 cSetup& cSetup::operator= (const cSetup &s)
@@ -451,7 +456,23 @@
   else if (!strcasecmp(Name, "CurrentChannel"))      CurrentChannel     = atoi(Value);
   else if (!strcasecmp(Name, "CurrentVolume"))       CurrentVolume      = atoi(Value);
   else
-     return false;
+
+//ML
+  {
+     char tmp[20];
+     bool ok = false;
+     for (int i = 1; i <= MAXDEVICES; i++) {
+           sprintf(tmp, "Card%dusesLNBnr", i);
+           if (!strcasecmp(Name, tmp)) {
+              CardUsesLNBnr[i - 1] = atoi(Value);
+              ok = true;
+           }   
+     }
+     return ok;
+   }
+//     return false;
+//ML-Ende
+
   return true;
 }
 
@@ -511,6 +532,16 @@
   Store("CurrentChannel",     CurrentChannel);
   Store("CurrentVolume",      CurrentVolume);
 
+//ML
+  char tmp[20];
+  if (cDevice::NumDevices() > 1) {
+     for (int i = 1; i <= cDevice::NumDevices(); i++) {
+        sprintf(tmp, "Card%dusesLNBnr", i);
+        Store(tmp, CardUsesLNBnr[i - 1]);
+     }
+  }
+//ML-Ende
+
   Sort();
 
   if (cConfig<cSetupLine>::Save()) {
diff -u -r vdr-1.3.15-orig/config.h vdr-lnbshare/config.h
--- vdr-1.3.15-orig/config.h	2004-10-31 17:17:02.000000000 +0100
+++ vdr-lnbshare/config.h	2004-11-17 21:12:07.000000000 +0100
@@ -251,6 +251,11 @@
   int ResumeID;
   int CurrentChannel;
   int CurrentVolume;
+
+//ML
+  int CardUsesLNBnr[MAXDEVICES - 1];
+//ML-Ende
+
   int __EndData__;
   cSetup(void);
   cSetup& operator= (const cSetup &s);
Nur in vdr-lnbshare/: configurableLNBshare-VDR_1.3.15.patch.
diff -u -r vdr-1.3.15-orig/device.c vdr-lnbshare/device.c
--- vdr-1.3.15-orig/device.c	2004-10-30 16:53:38.000000000 +0200
+++ vdr-lnbshare/device.c	2004-11-17 21:12:07.000000000 +0100
@@ -40,6 +40,11 @@
 
   SetVideoFormat(Setup.VideoFormat);
 
+//ML
+  LNBlock = -1;
+  LNBnr = Setup.CardUsesLNBnr[cardIndex];
+//ML-Ende
+
   active = false;
 
   mute = false;
@@ -82,6 +87,16 @@
      useDevice |= (1 << n);
 }
 
+//ML
+void cDevice::SetLNBnr(void)
+{
+  for (int i = 0; i < numDevices; i++) {
+    device[i]->LNBnr = Setup.CardUsesLNBnr[i];
+    isyslog("setting device %d to use LNB %d", i, device[i]->LNBnr);
+  }
+}
+//ML-Ende
+
 int cDevice::NextCardIndex(int n)
 {
   if (n > 0) {
@@ -145,6 +160,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]->GetLNBnr() == LNBnr && 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]->GetLNBnr() == LNBnr && 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;
@@ -362,9 +418,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(mtInfo, tr("Channel not available!"));
@@ -378,6 +449,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;
@@ -388,7 +481,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;
            }
@@ -422,7 +518,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.15-orig/device.h vdr-lnbshare/device.h
--- vdr-1.3.15-orig/device.h	2004-10-30 16:49:56.000000000 +0200
+++ vdr-lnbshare/device.h	2004-11-17 21:12:07.000000000 +0100
@@ -97,6 +97,22 @@
          ///< 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;
+  int LNBnr;
+public:
+  char GetLNBconf(void) { return LNBlock; }
+  int GetLNBnr(void) { return LNBnr; }
+  static void SetLNBnr(void);
+  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.
@@ -174,6 +190,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.15-orig/eitscan.c vdr-lnbshare/eitscan.c
--- vdr-1.3.15-orig/eitscan.c	2004-10-31 17:19:49.000000000 +0100
+++ vdr-lnbshare/eitscan.c	2004-11-17 21:12:07.000000000 +0100
@@ -149,7 +149,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.15-orig/menu.c vdr-lnbshare/menu.c
--- vdr-1.3.15-orig/menu.c	2004-11-01 14:49:40.000000000 +0100
+++ vdr-lnbshare/menu.c	2004-11-17 21:12:07.000000000 +0100
@@ -1968,6 +1968,16 @@
 
   Clear();
 
+//ML
+  char tmp[30];
+  if (cDevice::NumDevices() > 1) {
+     for (int i = 1; i <= cDevice::NumDevices(); i++) {
+        sprintf( tmp, tr("Setup.LNB$Karte %d nutzt LNB Nr."), i);
+        Add(new cMenuEditIntItem( tmp, &data.CardUsesLNBnr[i - 1], 1, cDevice::NumDevices() ));
+     }
+  }
+//ML-Ende
+
   Add(new cMenuEditBoolItem(tr("Setup.LNB$Use DiSEqC"),               &data.DiSEqC));
   if (!data.DiSEqC) {
      Add(new cMenuEditIntItem( tr("Setup.LNB$SLOF (MHz)"),               &data.LnbSLOF));
@@ -1984,6 +1994,10 @@
   int oldDiSEqC = data.DiSEqC;
   eOSState state = cMenuSetupBase::ProcessKey(Key);
 
+//ML
+  if (Key == kOk) cDevice::SetLNBnr();
+//ML-Ende
+
   if (Key != kNone && data.DiSEqC != oldDiSEqC)
      Setup();
   return state;
@@ -2914,6 +2928,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.15-orig/timers.c vdr-lnbshare/timers.c
--- vdr-1.3.15-orig/timers.c	2004-10-31 17:41:30.000000000 +0100
+++ vdr-lnbshare/timers.c	2004-11-17 21:12:07.000000000 +0100
@@ -479,7 +479,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;
          }
