diff -pru tar-1.13-lzma/src/common.h tar-1.13-autodetect/src/common.h
--- tar-1.13-lzma/src/common.h	2008-09-30 19:13:47.000000000 +0200
+++ tar-1.13-autodetect/src/common.h	2008-09-30 20:24:55.000000000 +0200
@@ -126,6 +126,13 @@ GLOBAL int after_date_option;
 GLOBAL int atime_preserve_option;
 
 /* Boolean value.  */
+GLOBAL int autodetect_option_used;
+GLOBAL int archive_is_bz2;
+GLOBAL int archive_is_gz;
+GLOBAL int archive_is_lzma;
+GLOBAL int archive_is_z;
+
+/* Boolean value.  */
 GLOBAL int backup_option;
 
 /* Type of backups being made.  */
diff -pru tar-1.13-lzma/src/tar.c tar-1.13-autodetect/src/tar.c
--- tar-1.13-lzma/src/tar.c	2008-09-30 19:47:17.000000000 +0200
+++ tar-1.13-autodetect/src/tar.c	2008-09-30 20:30:12.000000000 +0200
@@ -20,6 +20,8 @@
 
 /* Patched to integrate lzma as compression filter (option --lzma) */
 
+/* Patched to autodetect compression method based on file extension */
+
 #include "system.h"
 
 #include <getopt.h>
@@ -166,6 +168,7 @@ struct option long_options[] =
   {"after-date", required_argument, NULL, 'N'},
   {"append", no_argument, NULL, 'r'},
   {"atime-preserve", no_argument, &atime_preserve_option, 1},
+  {"auto-compress", no_argument, NULL, 'a'},
   {"backup", optional_argument, NULL, BACKUP_OPTION},
   {"block-compress", no_argument, NULL, OBSOLETE_BLOCK_COMPRESS},
   {"block-number", no_argument, NULL, 'R'},
@@ -352,6 +355,7 @@ Archive format selection:\n\
               PATTERN                at list/extract time, a globbing PATTERN\n\
   -o, --old-archive, --portability   write a V7 format archive\n\
       --posix                        write a POSIX conformant archive\n\
+  -a, --auto-compress                autodetect compression based on file suffix\n\
       --lzma                         filter the archive through lzma\n\
   -j, --bzip2, --bunzip2             filter the archive through bzip2\n\
   -z, --gzip, --ungzip               filter the archive through gzip\n\
@@ -430,7 +434,7 @@ Report bugs to <tar-bugs@gnu.org>.\n"),
    Y  per-block gzip compression */
 
 #define OPTION_STRING \
-  "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hijklmoprstuvwxz"
+  "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zab:cdf:g:hijklmoprstuvwxz"
 
 static void
 set_subcommand_option (enum subcommand subcommand)
@@ -470,6 +474,7 @@ decode_options (int argc, char *const *a
 
   owner_option = -1;
   group_option = -1;
+  int autodetect_option_used;
 
   backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
 
@@ -550,6 +555,10 @@ decode_options (int argc, char *const *a
 	input_files++;
 	break;
 
+      case 'a':
+	autodetect_option_used = 1;
+	break;
+
       case 'A':
 	set_subcommand_option (CAT_SUBCOMMAND);
 	break;
@@ -610,6 +619,54 @@ decode_options (int argc, char *const *a
 	      xrealloc (archive_name_array,
 			sizeof (const char *) * allocated_archive_names);
 	  }
+	{
+	   if (autodetect_option_used) {
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=3 && strcmp(optarg+len-3,".gz")==0) archive_is_gz=1;
+              }
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=4 && strcmp(optarg+len-4,".tgz")==0) archive_is_gz=1;
+              }
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=4 && strcmp(optarg+len-4,".taz")==0) archive_is_gz=1;
+              }
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=4 && strcmp(optarg+len-4,".bz2")==0) archive_is_bz2=1;
+              }
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=4 && strcmp(optarg+len-4,".tbz")==0) archive_is_bz2=1;
+              }
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=4 && strcmp(optarg+len-4,".tz2")==0) archive_is_bz2=1;
+              }
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=5 && strcmp(optarg+len-5,".tbz2")==0) archive_is_bz2=1;
+              }
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=5 && strcmp(optarg+len-5,".lzma")==0) archive_is_lzma=1;
+              }
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=4 && strcmp(optarg+len-4,".tlz")==0) archive_is_lzma=1;
+              }
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=4 && strcmp(optarg+len-4,".taZ")==0) archive_is_z=1;
+              }
+	      {
+	        ssize_t len=strlen(optarg);
+                if (len>=2 && strcmp(optarg+len-2,".Z")==0) archive_is_z=1;
+              }
+	   }
+        }
 	archive_name_array[archive_names++] = optarg;
 	break;
 
@@ -1008,6 +1065,11 @@ decode_options (int argc, char *const *a
 
 #endif /* not DEVICE_PREFIX */
       }
+  /* Set the compression program to use */
+  if (autodetect_option_used && archive_is_gz) use_compress_program_option="gzip";   
+  if (autodetect_option_used && archive_is_bz2) use_compress_program_option="bzip2";
+  if (autodetect_option_used && archive_is_lzma) use_compress_program_option="lzma";
+  if (autodetect_option_used && archive_is_z) use_compress_program_option="compress";
 
   /* Process trivial options.  */
 
