diff --git a/src/modules/Image/image.c b/src/modules/Image/image.c
index 2ce9f46e328f4337ca732646a73a8f95ce9a839e..d52cb130c93041685f847c2584915214e4ad23a7 100644
--- a/src/modules/Image/image.c
+++ b/src/modules/Image/image.c
@@ -1,9 +1,9 @@
-/* $Id: image.c,v 1.132 1999/04/21 16:44:57 mirar Exp $ */
+/* $Id: image.c,v 1.133 1999/04/21 23:33:31 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: image.c,v 1.132 1999/04/21 16:44:57 mirar Exp $
+**!	$Id: image.c,v 1.133 1999/04/21 23:33:31 mirar Exp $
 **! class Image
 **!
 **!	The main object of the <ref>Image</ref> module, this object
@@ -97,7 +97,7 @@
 
 #include "stralloc.h"
 #include "global.h"
-RCSID("$Id: image.c,v 1.132 1999/04/21 16:44:57 mirar Exp $");
+RCSID("$Id: image.c,v 1.133 1999/04/21 23:33:31 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -3884,6 +3884,8 @@ void pike_module_init(void)
 		tFunc(tOr3(tObj,tArr(tInt),tInt),tObj),0);
    ADD_FUNCTION("`/",image_operator_divide,
 		tFunc(tOr3(tObj,tArr(tInt),tInt),tObj),0);
+   ADD_FUNCTION("`%",image_operator_rest,
+		tFunc(tOr3(tObj,tArr(tInt),tInt),tObj),0);
    ADD_FUNCTION("`&",image_operator_minimum,
 		tFunc(tOr3(tObj,tArr(tInt),tInt),tObj),0);
    ADD_FUNCTION("`|",image_operator_maximum,
diff --git a/src/modules/Image/image.h b/src/modules/Image/image.h
index d34d8e102346d24ee69fa0ab14af1dea8667779f..0f4910b37753acda39394a966d5476156e8c0b31 100644
--- a/src/modules/Image/image.h
+++ b/src/modules/Image/image.h
@@ -1,7 +1,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: image.h,v 1.28 1999/04/21 16:45:00 mirar Exp $
+**!	$Id: image.h,v 1.29 1999/04/21 23:33:34 mirar Exp $
 */
 
 #ifdef PIKE_IMAGE_IMAGE_H
@@ -154,6 +154,7 @@ void image_operator_minus(INT32 args);
 void image_operator_plus(INT32 args);
 void image_operator_multiply(INT32 args);
 void image_operator_divide(INT32 args);
+void image_operator_rest(INT32 args);
 void image_operator_maximum(INT32 args);
 void image_operator_minimum(INT32 args);
 
diff --git a/src/modules/Image/operator.c b/src/modules/Image/operator.c
index db8b8e3ce642bff1cd3987cc8975d8339e8876c9..cd6ce27135c4becda7895026af50120553469b78 100644
--- a/src/modules/Image/operator.c
+++ b/src/modules/Image/operator.c
@@ -1,9 +1,9 @@
-/* $Id: operator.c,v 1.21 1999/04/21 16:45:02 mirar Exp $ */
+/* $Id: operator.c,v 1.22 1999/04/21 23:33:29 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: operator.c,v 1.21 1999/04/21 16:45:02 mirar Exp $
+**!	$Id: operator.c,v 1.22 1999/04/21 23:33:29 mirar Exp $
 **! class Image
 */
 
@@ -42,6 +42,7 @@ extern struct program *image_program;
    struct image *img,*oper=NULL;					\
    rgb_group *s1,*s2,*d;						\
    rgbl_group rgb;							\
+   rgb_group trgb;                                                      \
    INT32 i;								\
 									\
    if (!THIS->img) error("no image\n");					\
@@ -63,8 +64,9 @@ extern struct program *image_program;
    else if (args && (sp[-args].type==T_ARRAY ||				\
 		     sp[-args].type==T_OBJECT ||			\
 		     sp[-args].type==T_STRING) &&			\
-            image_color_arg(-args,&rgb))				\
+            image_color_arg(-args,&trgb))				\
    {									\
+      rgb.r=trgb.r; rgb.g=trgb.g; rgb.b=trgb.b; 			\
       oper=NULL;							\
    }									\
    else									\
@@ -227,37 +229,62 @@ STANDARD_OPERATOR_HEADER("`*")
 
 /*
 **! method object `/(object operand)
-**! method object `/(array(int) color)
+**! method object `/(Color color)
 **! method object `/(int value)
-**!	Multiplies pixel values and creates a new image.
+**! method object `%(object operand)
+**! method object `%(Color color)
+**! method object `%(int value)
+**!	Divides pixel values and creates a new image from the result or
+**!	the rest.
 **! returns the new image object
 **!
-**!	This can be useful to lower the values of an image,
-**!	making it greyer, for instance:
-**!
-**!	<pre>image=image/128+64;</pre>
-**!
 **! arg object operand
-**!	the other image to multiply with;
+**!	the other image to divide with;
 **!	the images must have the same size.
-**! arg array(int) color
-**!	an array in format ({r,g,b}), this is equal
-**!	to using an uniform-colored image.
+**! arg Color color
 **! arg int value
-**!	equal to ({value,value,value}).
+**!	if specified as color or value, it will act as a whole
+**!	image of that color (or value).
 **!
-**! see also: `-, `+, `|, `&, add_layers
+**! see also: `-, `+, `|, `&, `*, add_layers
+**!
+**! note: Divide is really not a/b but a/((b+1)/255).
+**!	  It isn't possible to do a modulo 256 either. (why?)
 */
 
+void image_operator_rest(INT32 args)
+{
+   double q=1/255.0;
+STANDARD_OPERATOR_HEADER("`%")
+   while (i--)
+   {
+      d->r=s1->r%(s2->r?s2->r:1);
+      d->g=s1->g%(s2->g?s2->g:1);
+      d->b=s1->b%(s2->b?s2->b:1);
+      s1++; s2++; d++; 
+   }
+   else
+   while (i--)
+   {
+      d->r=s1->r%(rgb.r?rgb.r:1);
+      d->g=s1->g%(rgb.g?rgb.g:1);
+      d->b=s1->b%(rgb.b?rgb.b:1);
+      s1++; d++; 
+   }
+   THREADS_DISALLOW();
+   pop_n_elems(args);		   		   		
+   push_object(o);		   		   		
+}
+
 void image_operator_divide(INT32 args)
 {
    double q=1/255.0;
-STANDARD_OPERATOR_HEADER("`*")
+STANDARD_OPERATOR_HEADER("`/")
    while (i--)
    {
-      d->r=floor(s1->r/(q*(s2->r+1))+0.5);
-      d->g=floor(s1->g/(q*(s2->g+1))+0.5);
-      d->b=floor(s1->b/(q*(s2->b+1))+0.5);
+      d->r=testrange(floor(s1->r/(q*(s2->r+1))+0.5));
+      d->g=testrange(floor(s1->g/(q*(s2->g+1))+0.5));
+      d->b=testrange(floor(s1->b/(q*(s2->b+1))+0.5));
       s1++; s2++; d++; 
    }
    else
@@ -273,6 +300,7 @@ STANDARD_OPERATOR_HEADER("`*")
    push_object(o);		   		   		
 }
 
+
 /*
 **! method object `|(object operand)
 **! method object `|(array(int) color)