diff --git a/src/modules/Image/module_testsuite.in b/src/modules/Image/module_testsuite.in
index 6668cc0a459ee58e7d00df532d039ccabd1183b2..1a87da0de0047b0fa28817af084fd5479971a572 100644
--- a/src/modules/Image/module_testsuite.in
+++ b/src/modules/Image/module_testsuite.in
@@ -519,6 +519,90 @@ mixed a(){
 
 
 #331 "testsuite.in.in"
+object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
+array z=(array)c;
+if (sizeof(z)!=2) 
+do { werror("failure; Image.image/colortable/colortable - black/white init & cast: "+( "didn't get two colors (black and white): "+((array(string))c)*", " )+"\n"); return 0; } while (0);
+if ((z[0]!=Image.Color.black || z[1]!=Image.Color.white) &&
+(z[1]!=Image.Color.black || z[0]!=Image.Color.white))
+do { werror("failure; Image.image/colortable/colortable - black/white init & cast: "+( "didn't get black and white: "+((array(string))c)*", " )+"\n"); return 0; } while (0);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 25, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#341 "testsuite.in.in"
+object img=Image.image(100,100)->test(43);
+object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
+img=c*img;
+array z=(array)Image.Colortable(img);
+if (sizeof(z)!=2) 
+do { werror("failure; Image.image/colortable/colortable - black/white normal: "+( "didn't get two colors (black and white): "+((array(string))c)*", " )+"\n"); return 0; } while (0);
+if ((z[0]!=Image.Color.black || z[1]!=Image.Color.white) &&
+(z[1]!=Image.Color.black || z[0]!=Image.Color.white))
+do { werror("failure; Image.image/colortable/colortable - black/white normal: "+( "didn't get black and white: "+((array(string))c)*", " )+"\n"); return 0; } while (0);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 26, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#353 "testsuite.in.in"
+object img=Image.image(100,100)->test(43);
+object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
+c->floyd_steinberg();
+img=c*img;
+array z=(array)Image.Colortable(img);
+if (sizeof(z)!=2) 
+do { werror("failure; Image.image/colortable/colortable - black/white floyd-steinberg: "+( "didn't get two colors (black and white): "+((array(string))c)*", " )+"\n"); return 0; } while (0);
+if ((z[0]!=Image.Color.black || z[1]!=Image.Color.white) &&
+(z[1]!=Image.Color.black || z[0]!=Image.Color.white))
+do { werror("failure; Image.image/colortable/colortable - black/white floyd-steinberg: "+( "didn't get black and white: "+((array(string))c)*", " )+"\n"); return 0; } while (0);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 27, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#366 "testsuite.in.in"
+object img=Image.image(100,100)->test(43);
+object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
+c->ordered();
+img=c*img;
+array z=(array)Image.Colortable(img);
+if (sizeof(z)!=2) 
+do { werror("failure; Image.image/colortable/colortable - black/white ordered: "+( "didn't get two colors (black and white): "+((array(string))c)*", " )+"\n"); return 0; } while (0);
+if ((z[0]!=Image.Color.black || z[1]!=Image.Color.white) &&
+(z[1]!=Image.Color.black || z[0]!=Image.Color.white))
+do { werror("failure; Image.image/colortable/colortable - black/white ordered: "+( "didn't get black and white: "+((array(string))c)*", " )+"\n"); return 0; } while (0);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 28, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#379 "testsuite.in.in"
 object img=Image.image(200,200)->test(42);
 img->tuned_box(50,50,150,150,({({0,0,0}),({255,0,0}),({0,255,0}),({0,0,255})}));
 object c=Image.Colortable(img,1000)->cubicles(16,16,16,4);
@@ -531,12 +615,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 25, expected result: EQ
+test 29, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#340 "testsuite.in.in"
+#388 "testsuite.in.in"
 object img=Image.image(200,200)->test(42);
 img->tuned_box(50,50,150,150,({({0,0,0}),({255,0,0}),({0,255,0}),({0,0,255})}));
 object c=Image.Colortable(32,32,32)->floyd_steinberg();
@@ -548,12 +632,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 26, expected result: EQ
+test 30, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#348 "testsuite.in.in"
+#396 "testsuite.in.in"
 object img=Image.image(200,200)->test(42);
 img->tuned_box(50,50,150,150,({({0,0,0}),({255,0,0}),({0,255,0}),({0,0,255})}));
 object c=Image.Colortable(32,32,32)->ordered();
@@ -567,12 +651,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 27, expected result: EQ
+test 31, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#360 "testsuite.in.in"
+#408 "testsuite.in.in"
 object img=Image.image(100,100)->test(40);
 object img1=Image.PNM.decode(Image.PNM.encode(img));
 if (img!=img1) do { werror("failure; Image.image/encoding/decoding/Image.PNM.encode/decode: "+( "differ" )+"\n"); return 0; } while (0);
@@ -582,12 +666,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 28, expected result: EQ
+test 32, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#366 "testsuite.in.in"
+#414 "testsuite.in.in"
 object img=Image.image(100,100)->test(41);
 object c=Image.Colortable(img,250)->cubicles(10,10,10,1)->floyd_steinberg();
 img=c*img;
@@ -599,12 +683,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 29, expected result: EQ
+test 33, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#374 "testsuite.in.in"
+#422 "testsuite.in.in"
 object img=Image.image(100,100)->test(42);
 object c=Image.Colortable(img,256)->cubicles(16,16,16,1);
 img=c*img;
@@ -616,12 +700,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 30, expected result: EQ
+test 34, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#382 "testsuite.in.in"
+#430 "testsuite.in.in"
 object img=Image.image(100,100)->test(43);
 object c=Image.Colortable(img,256)->floyd_steinberg()->cubicles(16,16,16);
 img=c*img;
@@ -629,17 +713,186 @@ object img1=Image.GIF.decode(Image.GIF.encode(img,c));
 if (!(img-img1<50)) do { werror("failure; Image.image/encoding/decoding/Image.GIF.encode/decode colortable w/ floyd-steinberg: "+( "differ too much ("+(img-img1)->max()[0]+","+(img-img1)->max()[1]+","+(img-img1)->max()[2]+","+")" )+"\n"); return 0; } while (0);
 return 1;
 
+}
+mixed b() { return 1; }
+
+....
+test 35, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#438 "testsuite.in.in"
+object img=Image.image(100,100)->test(43);
+if (Image.AVS.decode(Image.AVS.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.AVS.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
+return 1;
 
 }
 mixed b() { return 1; }
 
 ....
-test 31, expected result: EQ
+test 36, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#443 "testsuite.in.in"
+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; }
+
+....
+test 37, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#448 "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);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 38, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#455 "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);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 39, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#462 "testsuite.in.in"
+object img=Image.image(100,100)->test(43);
+object c=Image.Colortable(img,2);
+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);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 40, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#469 "testsuite.in.in"
+object img=Image.image(256,240)->test(43);
+img=Image.Colortable( ({"white","black","red","green"}) )*img;
+xv(img);
+xv(Image.HRZ.decode(Image.HRZ.encode(img)));
+xv(Image.HRZ.decode(Image.HRZ.encode(img))-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);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 41, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#478 "testsuite.in.in"
+object img=Image.image(100,100)->test(43);
+object c=Image.Colortable(img,16);
+img=c*img;
+if (Image.ILBM.decode(Image.ILBM.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.ILBM.encode/decode (4bpp): "+( "differ" )+"\n"); return 0; } while (0);
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
+test 42, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#485 "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;
+
+}
+mixed b() { return 1; }
+
+....
+test 43, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#490 "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;
+
+}
+mixed b() { return 1; }
+
+....
+test 44, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#495 "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;
+
+}
+mixed b() { return 1; }
+
+....
+test 45, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#500 "testsuite.in.in"
+object img=Image.image(100,100)->test(43);
+object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
+img=c*img;
+if (Image.XBM.decode(Image.XBM.encode(img))!=img) do { werror("failure; Image.image/encoding/decoding/Image.XBM.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
+return 1;
+
+
+
+}
+mixed b() { return 1; }
+
+....
+test 46, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#393 "testsuite.in.in"
+#511 "testsuite.in.in"
 foreach (
 ({ ({ "black", ({ 0, 0, 0 }), ({ 0, 0, 0 }), 0 }),
 ({ "blue", ({ 0, 0, 255 }), ({ 170, 255, 255 }), 41 }),
@@ -705,12 +958,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 32, expected result: EQ
+test 47, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#455 "testsuite.in.in"
+#573 "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]))
@@ -723,12 +976,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 33, expected result: EQ
+test 48, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#464 "testsuite.in.in"
+#582 "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]))
@@ -741,3 +994,33 @@ return 1;
 mixed b() { return 1; }
 
 ....
+test 49, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#591 "testsuite.in.in"
+foreach (
+({ ({ "black", ({ 0, 0, 0 }), ({ 0, 0, 0 }), 0 }),
+({ "blue", ({ 0, 0, 255 }), ({ 170, 255, 255 }), 41 }),
+({ "cyan", ({ 0, 255, 255 }), ({ 127, 255, 255 }), 168 }),
+({ "green", ({ 0, 255, 0 }), ({ 85, 255, 255 }), 127 }),
+({ "magenta", ({ 255, 0, 255 }), ({ 212, 255, 255 }), 128 }),
+({ "red", ({ 255, 0, 0 }), ({ 0, 255, 255 }), 87 }),
+({ "white", ({ 255, 255, 255 }), ({ 0, 0, 255 }), 255 }),
+({ "yellow", ({ 255, 255, 0 }), ({ 42, 255, 255 }), 214 }) }),
+array i)
+foreach ( ({Image.Color(i[0]),Image.Color.rgb(@i[1])}), object z)
+{
+z->light();
+z->dark();
+z->neon();
+z->dull();
+z->bright();
+}
+return 1;
+
+}
+mixed b() { return 1; }
+
+....
diff --git a/src/modules/Image/testsuite.in.in b/src/modules/Image/testsuite.in.in
index 6c2218aa9c167e6cd10477015510c66fafc25272..6338c37ea5296dd06e33d73fc9fc9cb6f50ca458 100644
--- a/src/modules/Image/testsuite.in.in
+++ b/src/modules/Image/testsuite.in.in
@@ -327,6 +327,54 @@ ok();
 //-----------------------------------------------------
 #chapter colortable
 
+#test colortable - black/white init & cast
+   object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
+   array z=(array)c;
+   if (sizeof(z)!=2) 
+      fail("didn't get two colors (black and white): "+((array(string))c)*", ");
+   if ((z[0]!=Image.Color.black || z[1]!=Image.Color.white) &&
+       (z[1]!=Image.Color.black || z[0]!=Image.Color.white))
+      fail("didn't get black and white: "+((array(string))c)*", ");
+   ok();
+
+#test colortable - black/white normal
+   object img=Image.image(100,100)->test(43);
+   object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
+   img=c*img;
+   array z=(array)Image.Colortable(img);
+   if (sizeof(z)!=2) 
+      fail("didn't get two colors (black and white): "+((array(string))c)*", ");
+   if ((z[0]!=Image.Color.black || z[1]!=Image.Color.white) &&
+       (z[1]!=Image.Color.black || z[0]!=Image.Color.white))
+      fail("didn't get black and white: "+((array(string))c)*", ");
+   ok();
+
+#test colortable - black/white floyd-steinberg
+   object img=Image.image(100,100)->test(43);
+   object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
+   c->floyd_steinberg();
+   img=c*img;
+   array z=(array)Image.Colortable(img);
+   if (sizeof(z)!=2) 
+      fail("didn't get two colors (black and white): "+((array(string))c)*", ");
+   if ((z[0]!=Image.Color.black || z[1]!=Image.Color.white) &&
+       (z[1]!=Image.Color.black || z[0]!=Image.Color.white))
+      fail("didn't get black and white: "+((array(string))c)*", ");
+   ok();
+
+#test colortable - black/white ordered
+   object img=Image.image(100,100)->test(43);
+   object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
+   c->ordered();
+   img=c*img;
+   array z=(array)Image.Colortable(img);
+   if (sizeof(z)!=2) 
+      fail("didn't get two colors (black and white): "+((array(string))c)*", ");
+   if ((z[0]!=Image.Color.black || z[1]!=Image.Color.white) &&
+       (z[1]!=Image.Color.black || z[0]!=Image.Color.white))
+      fail("didn't get black and white: "+((array(string))c)*", ");
+   ok();
+
 #test colortable - standard
    object img=Image.image(200,200)->test(42);
    img->tuned_box(50,50,150,150,({({0,0,0}),({255,0,0}),({0,255,0}),({0,0,255})}));
@@ -386,6 +434,76 @@ ok();
    if (!(img-img1<50)) fail("differ too much ("+(img-img1)->max()[0]+","+(img-img1)->max()[1]+","+(img-img1)->max()[2]+","+")");
    ok();
 
+#test Image.AVS.encode/decode 
+   object img=Image.image(100,100)->test(43);
+   if (Image.AVS.decode(Image.AVS.encode(img))!=img) fail("differ");
+   ok();
+
+#test Image.BMP.encode/decode (truecolor)
+   object img=Image.image(100,100)->test(43);
+   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");
+   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");
+   ok();
+
+#test Image.BMP.encode/decode (1bpp)
+   object img=Image.image(100,100)->test(43);
+   object c=Image.Colortable(img,2);
+   img=c*img;
+   if (Image.BMP.decode(Image.BMP.encode(img))!=img) fail("differ");
+   ok();
+
+#test Image.HRZ.encode/decode 
+   object img=Image.image(256,240)->test(43);
+   img=Image.Colortable( ({"white","black","red","green"}) )*img;
+	xv(img);
+	xv(Image.HRZ.decode(Image.HRZ.encode(img)));
+	xv(Image.HRZ.decode(Image.HRZ.encode(img))-img);
+   if (Image.HRZ.decode(Image.HRZ.encode(img))!=img) fail("differ");
+   ok();
+
+#test Image.ILBM.encode/decode (4bpp)
+   object img=Image.image(100,100)->test(43);
+   object c=Image.Colortable(img,16);
+   img=c*img;
+   if (Image.ILBM.decode(Image.ILBM.encode(img))!=img) fail("differ");
+   ok();
+
+#test Image.PCX.encode/decode 
+   object img=Image.image(100,100)->test(43);
+   if (Image.PCX.decode(Image.PCX.encode(img))!=img) fail("differ");
+   ok();
+
+#test Image.PNM.encode/decode 
+   object img=Image.image(100,100)->test(43);
+   if (Image.PNM.decode(Image.PNM.encode(img))!=img) fail("differ");
+   ok();
+
+#test Image.TGA.encode/decode 
+   object img=Image.image(100,100)->test(43);
+   if (Image.TGA.decode(Image.TGA.encode(img))!=img) fail("differ");
+   ok();
+
+#test Image.XBM.encode/decode 
+   object img=Image.image(100,100)->test(43);
+   object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
+   img=c*img;
+   if (Image.XBM.decode(Image.XBM.encode(img))!=img) fail("differ");
+   ok();
+
+
 //-----------------------------------------------------
 #chapter Image.Color
 
@@ -468,3 +586,24 @@ ok();
    if (sizeof(indices(Image.Color))!=sizeof(values(Image.Color)))
       fail("not the same size of indices() and values()\n");
    ok();
+
+#test modifiers (no-crash)
+   foreach (
+    ({ ({ "black", ({ 0, 0, 0 }), ({ 0, 0, 0 }), 0 }),
+       ({ "blue", ({ 0, 0, 255 }), ({ 170, 255, 255 }), 41 }),
+       ({ "cyan", ({ 0, 255, 255 }), ({ 127, 255, 255 }), 168 }),
+       ({ "green", ({ 0, 255, 0 }), ({ 85, 255, 255 }), 127 }),
+       ({ "magenta", ({ 255, 0, 255 }), ({ 212, 255, 255 }), 128 }),
+       ({ "red", ({ 255, 0, 0 }), ({ 0, 255, 255 }), 87 }),
+       ({ "white", ({ 255, 255, 255 }), ({ 0, 0, 255 }), 255 }),
+       ({ "yellow", ({ 255, 255, 0 }), ({ 42, 255, 255 }), 214 }) }),
+    array i)
+      foreach ( ({Image.Color(i[0]),Image.Color.rgb(@i[1])}), object z)
+      {
+	 z->light();
+	 z->dark();
+	 z->neon();
+	 z->dull();
+	 z->bright();
+      }
+   ok();