diff --git a/src/configure.in b/src/configure.in
index d6ac27bbc01c1be510b42aeb8a0c094a22f802f9..486079734fbb829b25683b5305987d210162c1d5 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -1,4 +1,4 @@
-AC_REVISION("$Id: configure.in,v 1.293 1999/05/29 15:20:51 grubba Exp $")
+AC_REVISION("$Id: configure.in,v 1.294 1999/05/30 20:11:12 mirar Exp $")
 AC_INIT(interpret.c)
 AC_CONFIG_HEADER(machine.h)
 
@@ -284,6 +284,7 @@ AC_ARG_WITH(threads,     [  --without-threads      no threads support],[],[with_
 AC_ARG_WITH(zlib,        [  --without-zlib         no gz compression support],[],[with_zlib=yes])
 AC_ARG_WITH(ssleay,      [  --without-ssleay       no support for the secure socket protocol],[],[with_ssleay=yes])
 AC_ARG_WITH(mysql,       [  --without-mysql        no support for the Mysql database],[],[with_mysql=yes])
+AC_ARG_WITH(gif-rle,     [  --with-gif-rle        use kind-of-rle packing instead of lzw],[],[])
 AC_ARG_WITH(dmalloc,     [  --with-dmalloc         enable memory-leak tests],[AC_DEFINE(DEBUG_MALLOC,10)],[])
 AC_ARG_WITH(checker,	 [  --with-checker         add extra memory checking overhead (Purify)])
 AC_ARG_WITH(profiling,   [  --with-profiling       add code used to profile pike code ],[AC_DEFINE(PROFILING)],[])
diff --git a/src/modules/Image/encodings/gif_lzw.c b/src/modules/Image/encodings/gif_lzw.c
index 13ffa228307d986ae68acd254c227295851e6f76..4cd1b40023eef9e30bf909810b71755b52cad3ff 100644
--- a/src/modules/Image/encodings/gif_lzw.c
+++ b/src/modules/Image/encodings/gif_lzw.c
@@ -1,10 +1,11 @@
 /*
 **! module Image
 **! note
-**!	$Id: gif_lzw.c,v 1.5 1998/04/29 01:27:22 mirar Exp $
+**!	$Id: gif_lzw.c,v 1.6 1999/05/30 20:11:14 mirar Exp $
 */
 
 #include "global.h"
+#include "image_machine.h"
 #include "gif_lzw.h"
 
 #define DEFAULT_OUTBYTES 16384
@@ -84,19 +85,37 @@ static INLINE void lzw_add(struct gif_lzw *lzw,int c)
    if (lzw->current==LZWCNULL) /* no current, load */
    {
       lzw->current=c;
+#ifdef GIF_LZW_LZ
+      lzw->skipone=0;
+#endif
       return;
    }
 
-   lno=lzw->code[lzw->current].firstchild; /* check if we have this sequence */
-   while (lno!=LZWCNULL)
+#ifdef GIF_LZW_RLE
+   if (c==lzw->code[lzw->current].c)
    {
-      if (lzw->code[lno].c==c && lno!=lzw->codes-1 )
+#endif
+#ifdef GIF_LZW_LZ
+      if (!lzw->skipone)
       {
-	 lzw->current=lno;
-	 return;
+#endif
+	 /* check if we have this sequence */
+	 lno=lzw->code[lzw->current].firstchild; 
+	 while (lno!=LZWCNULL)
+	 {
+	    if (lzw->code[lno].c==c && lno!=lzw->codes-1 )
+	    {
+	       lzw->current=lno;
+	       return;
+	    }
+	    lno=lzw->code[lno].next;
+	 }
+#ifdef GIF_LZW_RLE
       }
-      lno=lzw->code[lno].next;
+#endif
+#ifdef GIF_LZW_LZ
    }
+#endif
 
    if (lzw->codes==4096)  /* needs more than 12 bits */
    {
@@ -113,6 +132,9 @@ static INLINE void lzw_add(struct gif_lzw *lzw,int c)
 
       lzw->codebits=lzw->bits+1;
       lzw->current=c;
+#ifdef GIF_LZW_LZ
+      lzw->skipone=0;
+#endif
       return;
    }
 
@@ -133,6 +155,9 @@ static INLINE void lzw_add(struct gif_lzw *lzw,int c)
       lzw->codebits++;
 
    lzw->current=c;
+#ifdef GIF_LZW_LZ
+   lzw->skipone=!lzw->skipone;
+#endif
 }
 
 void image_gif_lzw_init(struct gif_lzw *lzw,int bits)
diff --git a/src/modules/Image/encodings/gif_lzw.h b/src/modules/Image/encodings/gif_lzw.h
index 6cfc9936138dbbe365638b7efd07115d86a7a229..aa46fabe34a091cf309011448eec1b209ce48a46 100644
--- a/src/modules/Image/encodings/gif_lzw.h
+++ b/src/modules/Image/encodings/gif_lzw.h
@@ -1,7 +1,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: gif_lzw.h,v 1.6 1998/05/02 01:24:25 mirar Exp $
+**!	$Id: gif_lzw.h,v 1.7 1999/05/30 20:11:15 mirar Exp $
 */
 
 typedef unsigned short lzwcode_t; /* no more than 12 bits used */
@@ -23,6 +23,10 @@ struct gif_lzw
 
    int earlychange;
    int reversebits;
+
+#ifdef GIF_LZW_LZ
+   int skipone; /* lz marker for skip next code */
+#endif
    
    unsigned long codes;
    unsigned long bits; /* initial encoding bits */