diff --git a/src/modules/Image/module_testsuite.in b/src/modules/Image/module_testsuite.in
index 404d813a677081b40ae67d4db09d9d851dd0ed0f..c8ae5d9ebfc7b0d2f6af78f48b32b4dc3a8dc783 100644
--- a/src/modules/Image/module_testsuite.in
+++ b/src/modules/Image/module_testsuite.in
@@ -694,6 +694,7 @@ object img=Image.image(100,100)->test(43);
 if (Image.BMP.decode(Image.BMP.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (truecolor): "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
 
+
 }
 mixed b() { return 1; }
 
@@ -703,11 +704,11 @@ mixed a(){
 # 1 "-"
 
 
-#392 "testsuite.in.in"
+#393 "testsuite.in.in"
 object img=Image.image(100,100)->test(43);
 object c=Image.Colortable(img,256);
 img=c*img;
-if (Image.BMP.decode(Image.BMP.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (8bpp): "+( "differ" )+"\n"); return 0; } while (0);
+if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":8])))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (8bpp): "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
 
 }
@@ -719,11 +720,11 @@ mixed a(){
 # 1 "-"
 
 
-#399 "testsuite.in.in"
+#400 "testsuite.in.in"
 object img=Image.image(100,100)->test(43);
 object c=Image.Colortable(img,16);
 img=c*img;
-if (Image.BMP.decode(Image.BMP.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (4bpp): "+( "differ" )+"\n"); return 0; } while (0);
+if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":4])))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (4bpp): "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
 
 }
@@ -735,11 +736,11 @@ mixed a(){
 # 1 "-"
 
 
-#406 "testsuite.in.in"
+#407 "testsuite.in.in"
 object img=Image.image(100,100)->test(43);
-object c=Image.Colortable(img,2);
+object c=Image.Colortable(img,2)->floyd_steinberg();
 img=c*img;
-if (Image.BMP.decode(Image.BMP.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (1bpp): "+( "differ" )+"\n"); return 0; } while (0);
+if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":1])))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (1bpp): "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
 
 }
@@ -751,7 +752,75 @@ mixed a(){
 # 1 "-"
 
 
-#413 "testsuite.in.in"
+#414 "testsuite.in.in"
+object img=Image.image(400,100,Image.Color.red);
+img->line(0,0,0,99,Image.Color.green);
+img->line(399,0,399,99,Image.Color.blue);
+object c=Image.Colortable(img,256);
+img=c*img;
+if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":8,"rle":1])))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (8bpp rle first): "+( "differ" )+"\n"); return 0; } while (0);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 42, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#423 "testsuite.in.in"
+object img=Image.image(400,100,Image.Color.red);
+img->line(0,0,0,99,Image.Color.green);
+img->line(399,0,399,99,Image.Color.blue);
+object c=Image.Colortable(img,16);
+img=c*img;
+if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":4,"rle":1])))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (4bpp rle first): "+( "differ" )+"\n"); return 0; } while (0);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 43, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#432 "testsuite.in.in"
+object img=Image.image(100,100)->test(99)->scale(400,100);
+object c=Image.Colortable(img,256);
+img=c*img;
+if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":8,"rle":1])))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (8bpp rle second): "+( "differ" )+"\n"); return 0; } while (0);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 44, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#439 "testsuite.in.in"
+object img=Image.image(100,100)->test(99)->scale(400,100);
+object c=Image.Colortable(img,16);
+img=c*img;
+if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":4,"rle":1])))!=img) do { werror("failure; Image.image/encoding/decoding/Image.BMP.encode/decode (4bpp rle second): "+( "differ" )+"\n"); return 0; } while (0);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 45, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#446 "testsuite.in.in"
 object img=Image.image(256,240)->test(43);
 img=Image.Colortable( ({"white","black","red","green"}) )*img;
 if (Image.HRZ.decode(Image.HRZ.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.HRZ.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
@@ -761,12 +830,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 42, expected result: EQ
+test 46, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#419 "testsuite.in.in"
+#452 "testsuite.in.in"
 object img=Image.image(100,100)->test(43);
 object c=Image.Colortable(img,16);
 img=c*img;
@@ -777,12 +846,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 43, expected result: EQ
+test 47, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#426 "testsuite.in.in"
+#459 "testsuite.in.in"
 object img=Image.image(100,100)->test(43);
 if (Image.PCX.decode(Image.PCX.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.PCX.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
@@ -791,12 +860,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 44, expected result: EQ
+test 48, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#431 "testsuite.in.in"
+#464 "testsuite.in.in"
 object img=Image.image(100,100)->test(43);
 if (Image.PNM.decode(Image.PNM.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.PNM.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
@@ -805,12 +874,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 45, expected result: EQ
+test 49, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#436 "testsuite.in.in"
+#469 "testsuite.in.in"
 object img=Image.image(100,100)->test(43);
 if (Image.TGA.decode(Image.TGA.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.TGA.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
@@ -819,12 +888,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 46, expected result: EQ
+test 50, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#441 "testsuite.in.in"
+#474 "testsuite.in.in"
 object img=Image.image(100,100)->test(43);
 object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
 img=c*img;
@@ -844,12 +913,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 47, expected result: EQ
+test 51, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#457 "testsuite.in.in"
+#490 "testsuite.in.in"
 #if constant(Image.XPM.encode)
 object img=Image.image(100,100)->test(43);
 object c=Image.Colortable(img,16);
@@ -865,12 +934,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 48, expected result: EQ
+test 52, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#469 "testsuite.in.in"
+#502 "testsuite.in.in"
 #if constant(Image.XPM.encode)
 object img=Image.image(100,100)->test(43);
 object c=Image.Colortable(16,16,16); 
@@ -884,12 +953,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 49, expected result: EQ
+test 53, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#479 "testsuite.in.in"
+#512 "testsuite.in.in"
 #if constant(Image.TIFF.encode)
 object img=Image.image(100,100)->test(43);
 if (Image.TIFF.decode(Image.TIFF.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.TIFF.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
@@ -902,12 +971,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 50, expected result: EQ
+test 54, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#488 "testsuite.in.in"
+#521 "testsuite.in.in"
 #if constant(Image.XFace.encode)
 object img=Image.image(48,48)->test(43);
 object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
@@ -923,12 +992,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 51, expected result: EQ
+test 55, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#500 "testsuite.in.in"
+#533 "testsuite.in.in"
 #if constant(Image.JPEG.encode)
 object img=Image.image(100,100)->test(43);
 object img1=Image.JPEG.decode(Image.JPEG.encode(img,(["quality":100])));
@@ -944,12 +1013,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 52, expected result: EQ
+test 56, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#514 "testsuite.in.in"
+#547 "testsuite.in.in"
 foreach (
 ({ ({ "black", ({ 0, 0, 0 }), ({ 0, 0, 0 }), 0 }),
 ({ "blue", ({ 0, 0, 255 }), ({ 170, 255, 255 }), 41 }),
@@ -1015,12 +1084,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 53, expected result: EQ
+test 57, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#576 "testsuite.in.in"
+#609 "testsuite.in.in"
 if (!arrayp(indices(Image.Color)))
 do { werror("failure; Image.image/Image.Color/indices(Image.Color): "+( "wrong type\n" )+"\n"); return 0; } while (0);
 if (!stringp(indices(Image.Color)[0]))
@@ -1033,12 +1102,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 54, expected result: EQ
+test 58, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#585 "testsuite.in.in"
+#618 "testsuite.in.in"
 if (!arrayp(values(Image.Color)))
 do { werror("failure; Image.image/Image.Color/values(Image.Color): "+( "wrong type\n" )+"\n"); return 0; } while (0);
 if (!objectp(values(Image.Color)[0]))
@@ -1051,12 +1120,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 55, expected result: EQ
+test 59, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#594 "testsuite.in.in"
+#627 "testsuite.in.in"
 foreach (
 ({ ({ "black", ({ 0, 0, 0 }), ({ 0, 0, 0 }), 0 }),
 ({ "blue", ({ 0, 0, 255 }), ({ 170, 255, 255 }), 41 }),
@@ -1082,12 +1151,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 56, expected result: EQ
+test 60, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#618 "testsuite.in.in"
+#651 "testsuite.in.in"
 
 object Stina=Image.JPEG.decode(MIME.decode_base64(
 "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\r\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\r\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAhAD8DASIA\r\nAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAABgcABQgE/8QANhAAAgEEAAQDAwkJAAAAAAAAAQID\r\nAAQFEQYSITEHE3EiQYEUMjNCYXOhscEVIzY3UVJicsL/xAAZAQACAwEAAAAAAAAAAAAAAAACBAAB\r\nAwX/xAAdEQACAgMBAQEAAAAAAAAAAAABAgARAyExEjJB/9oADAMBAAIRAxEAPwBcXMazCMT3wOjy\r\nhAOpPpXaOEs2bIXdhib2WJVIJW31sfO3vfpXXaWlrd35SUDn0PLHYg9/0p44HiS1yWIgCSwRXcQ8\r\nuW3kl8vlK9NjferZ1X65JlORVtBZmW7iSWFJreTzUZG5ikq6ZTrtqtQ+EuLixvh7jm8tRLcp5khD\r\ndT16b+FLDxltcZe5DFXWPlglyLs0d38nYHYGtA6+3dPvERfJ8JYwBQnJbouh00eUVRbViXbeR67M\r\nzeIRi4f8QLlLNFhVFdF+tok73+PauK3s5r20DLEsS82/PufYD0x48Ri8/wCPGVkybQPBYBWSCYjT\r\nyFQOx79wfhTNzj4+2w8sV9bxtC6FEhZRo9PcKFcwA3I7MpAAmbplvYomtXijcluUSxN8emvdRH4X\r\nAW0eYLHmlWVUHOSTqhG/hW1zTShnWLQ1pui9e1GvhwD+xrqYczefcMQT3IFBme01GMCn1uC1/byT\r\nsGtWKuDtXB67qxsM0l9bbyYhM8Oo9gA85Hp1owfwltZnaK1y1xBNolY/L3v0oLfgjHxZg2drkMjL\r\nfxvp0ktBErH7Dvr/AEregTMzctsJjocnx5gbVIIzbef50qqhGuXZ0a0Yw6dunuA+ND/CmDhxOItW\r\ne3C3xQhmce0P8d1ci7jZuQnUv9g70LVwQCSxiu8ROBpJc1LxJas0qzRrHcQbJ0yjQZT6dDSxzWdF\r\ngqRq9xJMy8qhm3yDtqtSMiSRGN0DK406nsd96UOd8PcFJxiTc/uIki505j0cH6o9DUpSNw1Y3UR7\r\nJc3kq24V3uJ/ZCjZK799PPCY6LA4a2s9FgqDm9nR37/xroseG8bip2nsrSAvrQk5tsBVkyEqpCk/\r\nHdJ5snrQjmJaNmWkP0ll/sPzpdZz+Z0Hr/1UqU4nYs3I9F+ji9BVUf4kP3VSpVHsyWWMvYeo/OhT\r\njT59v92f1qVKFvmFj+oL475g9Ksrbs1SpSB7Oj+T/9k="));
@@ -1105,12 +1174,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 57, expected result: EQ
+test 61, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#632 "testsuite.in.in"
+#665 "testsuite.in.in"
 
 object Stina=Image.JPEG.decode(MIME.decode_base64(
 "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\r\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\r\nMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAhAD8DASIA\r\nAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAABgcABQgE/8QANhAAAgEEAAQDAwkJAAAAAAAAAQID\r\nAAQFEQYSITEHE3EiQYEUMjNCYXOhscEVIzY3UVJicsL/xAAZAQACAwEAAAAAAAAAAAAAAAACBAAB\r\nAwX/xAAdEQACAgMBAQEAAAAAAAAAAAABAgARAyExEjJB/9oADAMBAAIRAxEAPwBcXMazCMT3wOjy\r\nhAOpPpXaOEs2bIXdhib2WJVIJW31sfO3vfpXXaWlrd35SUDn0PLHYg9/0p44HiS1yWIgCSwRXcQ8\r\nuW3kl8vlK9NjferZ1X65JlORVtBZmW7iSWFJreTzUZG5ikq6ZTrtqtQ+EuLixvh7jm8tRLcp5khD\r\ndT16b+FLDxltcZe5DFXWPlglyLs0d38nYHYGtA6+3dPvERfJ8JYwBQnJbouh00eUVRbViXbeR67M\r\nzeIRi4f8QLlLNFhVFdF+tok73+PauK3s5r20DLEsS82/PufYD0x48Ri8/wCPGVkybQPBYBWSCYjT\r\nyFQOx79wfhTNzj4+2w8sV9bxtC6FEhZRo9PcKFcwA3I7MpAAmbplvYomtXijcluUSxN8emvdRH4X\r\nAW0eYLHmlWVUHOSTqhG/hW1zTShnWLQ1pui9e1GvhwD+xrqYczefcMQT3IFBme01GMCn1uC1/byT\r\nsGtWKuDtXB67qxsM0l9bbyYhM8Oo9gA85Hp1owfwltZnaK1y1xBNolY/L3v0oLfgjHxZg2drkMjL\r\nfxvp0ktBErH7Dvr/AEregTMzctsJjocnx5gbVIIzbef50qqhGuXZ0a0Yw6dunuA+ND/CmDhxOItW\r\ne3C3xQhmce0P8d1ci7jZuQnUv9g70LVwQCSxiu8ROBpJc1LxJas0qzRrHcQbJ0yjQZT6dDSxzWdF\r\ngqRq9xJMy8qhm3yDtqtSMiSRGN0DK406nsd96UOd8PcFJxiTc/uIki505j0cH6o9DUpSNw1Y3UR7\r\nJc3kq24V3uJ/ZCjZK799PPCY6LA4a2s9FgqDm9nR37/xroseG8bip2nsrSAvrQk5tsBVkyEqpCk/\r\nHdJ5snrQjmJaNmWkP0ll/sPzpdZz+Z0Hr/1UqU4nYs3I9F+ji9BVUf4kP3VSpVHsyWWMvYeo/OhT\r\njT59v92f1qVKFvmFj+oL475g9Ksrbs1SpSB7Oj+T/9k="));
diff --git a/src/modules/Image/testsuite.in.in b/src/modules/Image/testsuite.in.in
index 5cb71ec9cc2740b2ee24506cf1a9b60028d238a8..2652422a0cbbe02dd61bdaf62c49bb9b62a6e0ad 100644
--- a/src/modules/Image/testsuite.in.in
+++ b/src/modules/Image/testsuite.in.in
@@ -388,25 +388,58 @@
    if (Image.BMP.decode(Image.BMP.encode(img))!=img) fail("differ");
    ok();
 
+
 #test Image.BMP.encode/decode (8bpp)
    object img=Image.image(100,100)->test(43);
    object c=Image.Colortable(img,256);
    img=c*img;
-   if (Image.BMP.decode(Image.BMP.encode(img))!=img) fail("differ");
+   if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":8])))!=img) fail("differ");
    ok();
 
 #test Image.BMP.encode/decode (4bpp)
    object img=Image.image(100,100)->test(43);
    object c=Image.Colortable(img,16);
    img=c*img;
-   if (Image.BMP.decode(Image.BMP.encode(img))!=img) fail("differ");
+   if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":4])))!=img) fail("differ");
    ok();
 
 #test Image.BMP.encode/decode (1bpp)
    object img=Image.image(100,100)->test(43);
-   object c=Image.Colortable(img,2);
+   object c=Image.Colortable(img,2)->floyd_steinberg();
    img=c*img;
-   if (Image.BMP.decode(Image.BMP.encode(img))!=img) fail("differ");
+   if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":1])))!=img) fail("differ");
+   ok();
+
+#test Image.BMP.encode/decode (8bpp rle first)
+   object img=Image.image(400,100,Image.Color.red);
+   img->line(0,0,0,99,Image.Color.green);
+   img->line(399,0,399,99,Image.Color.blue);
+   object c=Image.Colortable(img,256);
+   img=c*img;
+   if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":8,"rle":1])))!=img) fail("differ");
+   ok();
+
+#test Image.BMP.encode/decode (4bpp rle first)
+   object img=Image.image(400,100,Image.Color.red);
+   img->line(0,0,0,99,Image.Color.green);
+   img->line(399,0,399,99,Image.Color.blue);
+   object c=Image.Colortable(img,16);
+   img=c*img;
+   if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":4,"rle":1])))!=img) fail("differ");
+   ok();
+
+#test Image.BMP.encode/decode (8bpp rle second)
+   object img=Image.image(100,100)->test(99)->scale(400,100);
+   object c=Image.Colortable(img,256);
+   img=c*img;
+   if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":8,"rle":1])))!=img) fail("differ");
+   ok();
+
+#test Image.BMP.encode/decode (4bpp rle second)
+   object img=Image.image(100,100)->test(99)->scale(400,100);
+   object c=Image.Colortable(img,16);
+   img=c*img;
+   if (Image.BMP.decode(Image.BMP.encode(img,(["bpp":4,"rle":1])))!=img) fail("differ");
    ok();
 
 #test Image.HRZ.encode/decode