diff -ruN vdr-1.4.3/CONTRIBUTORS vdr-1.4.3-1/CONTRIBUTORS
--- vdr-1.4.3/CONTRIBUTORS	2006-09-16 14:14:06.000000000 +0200
+++ vdr-1.4.3-1/CONTRIBUTORS	2006-10-07 15:59:21.000000000 +0200
@@ -1468,6 +1468,8 @@
  for reporting a problem with cPlugin::ConfigDirectory() in case a plugin calls it
  from a separate thread
  for reporting that an assignment in svdrp.c didn't use the cTimer::operator=())
+ for suggesting that the function cThread::Cancel() should only set 'running' to
+ false and not actually kill the thread if the special value -1 is given
 
 Sven Kreiensen <svenk@kammer.uni-hannover.de>
  for his help in keeping 'channels.conf.terr' up to date
@@ -1821,6 +1823,8 @@
  the Makefile to avoid a crash in case a new version is installed on a running system
  for fixing handling video directory updates in case the timestamp of the .update
  file is in the future
+ for fixing handling video directory updates in case an other process has touched the
+ .update file after the last NeedsUpdate() check
 
 Marcel Schaeben <mts280@gmx.de>
  for his "Easy Input" patch
@@ -2003,3 +2007,11 @@
 
 Martin Ostermann <martin@familie-ostermann.de>
  for fixing processing the PDCDescriptor in 'libsi' on big endian systems
+
+Boguslaw Juza <bogdan@uci.agh.edu.pl>
+ for reporting that there are stations that use blanks in the language codes
+ for reporting that events without an ExtendedEventDescriptor may get duplicate
+ information in their ShortText through the EPG bugfixes in case they are received
+ again
+ for reporting a problem with language codes of recorded audio tracks on channels with
+ multiple tracks
diff -ruN vdr-1.4.3/HISTORY vdr-1.4.3-1/HISTORY
--- vdr-1.4.3/HISTORY	2006-09-23 15:57:19.000000000 +0200
+++ vdr-1.4.3-1/HISTORY	2006-10-08 13:28:15.000000000 +0200
@@ -4930,3 +4930,23 @@
 2006-09-23: Version 1.4.3
 
 - Official release.
+
+2006-10-08: Version 1.4.3-1
+
+- The function cThread::Cancel() now only sets 'running' to false and does not
+  actually kill the thread if the special value -1 is given (suggested by Udo Richter).
+- Changed the I18nNormalizeLanguageCode() check to also allow blanks (and all other
+  printable characters) in the language codes (thanks to Boguslaw Juza for reporting
+  that there are stations that use blanks in these codes). Blanks are replaced with
+  underlines, so that all parts of VDR that rely on language codes to be one word
+  (without blanks) work as expected.
+- Now clearing an event's Title, ShortText and Description if there is no
+  ShortEventDescriptor or ExtendedEventDescriptor, respectively (thanks to Boguslaw
+  Juza for reporting that events without an ExtendedEventDescriptor may get
+  duplicate information in their ShortText through the EPG bugfixes in case they
+  are received again).
+- Fixed handling video directory updates in case an other process has touched the
+  .update file after the last NeedsUpdate() check (thanks to Petri Hintukainen).
+- Fixed handling language codes and descriptions of recorded audio tracks on channels
+  with multiple tracks where not all of them appear in the event data (reported by
+  Boguslaw Juza).
diff -ruN vdr-1.4.3/config.h vdr-1.4.3-1/config.h
--- vdr-1.4.3/config.h	2006-09-23 15:56:08.000000000 +0200
+++ vdr-1.4.3-1/config.h	2006-09-24 12:09:25.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: config.h 1.271 2006/09/23 13:56:08 kls Exp $
+ * $Id: config.h 1.272 2006/09/24 10:09:25 kls Exp $
  */
 
 #ifndef __CONFIG_H
@@ -21,7 +21,7 @@
 
 // VDR's own version number:
 
-#define VDRVERSION  "1.4.3"
+#define VDRVERSION  "1.4.3-1"
 #define VDRVERSNUM   10403  // Version * 10000 + Major * 100 + Minor
 
 // The plugin API's version number:
diff -ruN vdr-1.4.3/eit.c vdr-1.4.3-1/eit.c
--- vdr-1.4.3/eit.c	2006-08-05 12:01:21.000000000 +0200
+++ vdr-1.4.3-1/eit.c	2006-10-07 14:32:24.000000000 +0200
@@ -8,7 +8,7 @@
  * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
  * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
  *
- * $Id: eit.c 1.120 2006/08/05 10:01:21 kls Exp $
+ * $Id: eit.c 1.121 2006/10/07 12:32:24 kls Exp $
  */
 
 #include "eit.h"
@@ -234,10 +234,16 @@
             pEvent->SetTitle(ShortEventDescriptor->name.getText(buffer, sizeof(buffer)));
             pEvent->SetShortText(ShortEventDescriptor->text.getText(buffer, sizeof(buffer)));
             }
+         else {
+            pEvent->SetTitle(NULL);
+            pEvent->SetShortText(NULL);
+            }
          if (ExtendedEventDescriptors) {
             char buffer[ExtendedEventDescriptors->getMaximumTextLength(": ") + 1];
             pEvent->SetDescription(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": "));
             }
+         else
+            pEvent->SetDescription(NULL);
          }
       delete ExtendedEventDescriptors;
       delete ShortEventDescriptor;
diff -ruN vdr-1.4.3/epg.c vdr-1.4.3-1/epg.c
--- vdr-1.4.3/epg.c	2006-08-05 12:04:17.000000000 +0200
+++ vdr-1.4.3-1/epg.c	2006-10-07 15:47:28.000000000 +0200
@@ -7,7 +7,7 @@
  * Original version (as used in VDR before 1.3.0) written by
  * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
  *
- * $Id: epg.c 1.79 2006/08/05 10:04:17 kls Exp $
+ * $Id: epg.c 1.80 2006/10/07 13:47:28 kls Exp $
  */
 
 #include "epg.h"
@@ -87,7 +87,8 @@
 tComponent *cComponents::GetComponent(int Index, uchar Stream, uchar Type)
 {
   for (int i = 0; i < numComponents; i++) {
-      if (components[i].stream == Stream && components[i].type == Type) {
+      // In case of an audio stream the 'type' check actually just distinguishes between "normal" and "Dolby Digital":
+      if (components[i].stream == Stream && (Stream != 2 || (components[i].type < 5) == (Type < 5))) {
          if (!Index--)
             return &components[i];
          }
diff -ruN vdr-1.4.3/epg.h vdr-1.4.3-1/epg.h
--- vdr-1.4.3/epg.h	2006-03-25 13:39:39.000000000 +0100
+++ vdr-1.4.3-1/epg.h	2006-10-07 15:47:19.000000000 +0200
@@ -7,7 +7,7 @@
  * Original version (as used in VDR before 1.3.0) written by
  * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
  *
- * $Id: epg.h 1.34 2006/03/25 12:39:39 kls Exp $
+ * $Id: epg.h 1.35 2006/10/07 13:47:19 kls Exp $
  */
 
 #ifndef __EPG_H
@@ -43,6 +43,7 @@
   void SetComponent(int Index, uchar Stream, uchar Type, const char *Language, const char *Description);
   tComponent *Component(int Index) const { return (Index < numComponents) ? &components[Index] : NULL; }
   tComponent *GetComponent(int Index, uchar Stream, uchar Type); // Gets the Index'th component of Stream and Type, skipping other components
+                                                                 // In case of an audio stream the 'type' check actually just distinguishes between "normal" and "Dolby Digital"
   };
 
 class cSchedule;
diff -ruN vdr-1.4.3/i18n.c vdr-1.4.3-1/i18n.c
--- vdr-1.4.3/i18n.c	2006-09-16 11:08:30.000000000 +0200
+++ vdr-1.4.3-1/i18n.c	2006-10-08 10:50:30.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: i18n.c 1.282 2006/09/16 09:08:30 kls Exp $
+ * $Id: i18n.c 1.284 2006/10/08 08:50:30 kls Exp $
  *
  * Translations provided by:
  *
@@ -6243,12 +6243,31 @@
 
 const char *I18nNormalizeLanguageCode(const char *Code)
 {
-  if (Code[0] && !isalnum(Code[0]) || Code[1] && !isalnum(Code[1]) || Code[2] && !isalnum(Code[2])) {
-     // ISO 639 language codes are defined as alphabetical characters, but digits are apparently
-     // also used, for instance for "2ch"
-     //dsyslog("invalid language code: '%s'", Code);
-     return "???";
-     }
+  for (int i = 0; i < 3; i++) {
+      if (Code[i]) {
+         // ETSI EN 300 468 defines language codes as consisting of three letters
+         // according to ISO 639-2. This means that they are supposed to always consist
+         // of exactly three letters in the range a-z - no digits, UTF-8 or other
+         // funny characters. However, some broadcasters apparently don't have a
+         // copy of the DVB standard (or they do, but are perhaps unable to read it),
+         // so they put all sorts of non-standard stuff into the language codes,
+         // like nonsense as "2ch" or "A 1" (yes, they even go as far as using
+         // blanks!). Such things should go into the description of the EPG event's
+         // ComponentDescriptor.
+         // So, as a workaround for this broadcaster stupidity, let's ignore
+         // language codes with unprintable characters...
+         if (!isprint(Code[i])) {
+            //dsyslog("invalid language code: '%s'", Code);
+            return "???";
+            }
+         // ...and replace blanks with underlines (ok, this breaks the 'const'
+         // of the Code parameter - but hey, it's them who started this):
+         if (Code[i] == ' ')
+            *((char *)&Code[i]) = '_';
+         }
+      else
+         break;
+      }
   int n = I18nLanguageIndex(Code);
   return n >= 0 ? I18nLanguageCode(n) : Code;
 }
diff -ruN vdr-1.4.3/recording.c vdr-1.4.3-1/recording.c
--- vdr-1.4.3/recording.c	2006-09-16 14:12:34.000000000 +0200
+++ vdr-1.4.3-1/recording.c	2006-10-07 14:46:22.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: recording.c 1.150 2006/09/16 12:12:34 kls Exp $
+ * $Id: recording.c 1.151 2006/10/07 12:46:22 kls Exp $
  */
 
 #include "recording.h"
@@ -941,8 +941,10 @@
 
 void cRecordings::TouchUpdate(void)
 {
+  bool needsUpdate = NeedsUpdate();
   TouchFile(UpdateFileName());
-  lastUpdate = time(NULL); // make sure we don't tigger ourselves
+  if (!needsUpdate)
+     lastUpdate = time(NULL); // make sure we don't tigger ourselves
 }
 
 bool cRecordings::NeedsUpdate(void)
diff -ruN vdr-1.4.3/thread.c vdr-1.4.3-1/thread.c
--- vdr-1.4.3/thread.c	2006-08-20 12:20:44.000000000 +0200
+++ vdr-1.4.3-1/thread.c	2006-09-24 14:54:47.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: thread.c 1.57 2006/08/20 10:20:44 kls Exp $
+ * $Id: thread.c 1.58 2006/09/24 12:54:47 kls Exp $
  */
 
 #include "thread.h"
@@ -293,7 +293,7 @@
 void cThread::Cancel(int WaitSeconds)
 {
   running = false;
-  if (active) {
+  if (active && WaitSeconds > -1) {
      if (WaitSeconds > 0) {
         for (time_t t0 = time(NULL) + WaitSeconds; time(NULL) < t0; ) {
             if (!Active())
diff -ruN vdr-1.4.3/thread.h vdr-1.4.3-1/thread.h
--- vdr-1.4.3/thread.h	2006-01-08 12:40:23.000000000 +0100
+++ vdr-1.4.3-1/thread.h	2006-09-24 12:10:37.000000000 +0200
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: thread.h 1.36 2006/01/08 11:40:23 kls Exp $
+ * $Id: thread.h 1.37 2006/09/24 10:10:37 kls Exp $
  */
 
 #ifndef __THREAD_H
@@ -103,6 +103,8 @@
        ///< the Action() loop can finish in an orderly fashion and then waiting
        ///< up to WaitSeconds seconds for the thread to actually end. If the
        ///< thread doesn't end by itself, it is killed.
+       ///< If WaitSeconds is -1, only 'running' is set to false and Cancel()
+       ///< returns immediately, without killing the thread.
 public:
   cThread(const char *Description = NULL);
        ///< Creates a new thread.
