diff --git a/src/modules/Image/layer_oper.h b/src/modules/Image/layer_oper.h
index b1dafc705cb71c596b491925a1a7366ace493db6..f99e211004e56f288d06cc7bc4919b059c01c3df 100644
--- a/src/modules/Image/layer_oper.h
+++ b/src/modules/Image/layer_oper.h
@@ -1,5 +1,94 @@
 /* template for operator layer row function */
 
+static void LM_FUNC(rgb_group *s,rgb_group *l,rgb_group *d,
+		    rgb_group *sa,rgb_group *la,rgb_group *da,
+		    int len,double alpha)
+{
+   if (alpha==0.0)
+   {
+      MEMCPY(d,s,sizeof(rgb_group)*len);
+      MEMCPY(da,sa,sizeof(rgb_group)*len);
+      return; 
+   }
+   else if (alpha==1.0)
+   {
+      if (!la)  /* no layer alpha => full opaque */
+	 while (len--)
+	 {
+	    d->r=L_TRUNC(L_OPER(s->r,l->r));
+	    d->g=L_TRUNC(L_OPER(s->g,l->g));
+	    d->b=L_TRUNC(L_OPER(s->b,l->b));
+	    *da=white;
+	    l++; s++; sa++; da++; d++;
+	 }
+      else
+	 while (len--)
+	 {
+	    if (la->r==COLORMAX && la->g==COLORMAX && la->b==COLORMAX)
+	    {
+	       d->r=L_TRUNC(L_OPER(s->r,l->r));
+	       d->g=L_TRUNC(L_OPER(s->g,l->g));
+	       d->b=L_TRUNC(L_OPER(s->b,l->b));
+	       *da=white;
+#ifdef L_USE_SA
+	       *da=*sa;
+#endif
+	    }
+	    else if (la->r==0 && la->g==0 && la->b==0)
+	    {
+	       *d=*s;
+	       *da=*sa;
+	    }
+	    else
+	    {
+	       d->r=L_TRUNC(L_OPER(s->r,l->r));
+	       ALPHA_ADD(s,d,d,sa,la,da,r);
+	       d->g=L_TRUNC(L_OPER(s->g,l->g));
+	       ALPHA_ADD(s,d,d,sa,la,da,g);
+	       d->b=L_TRUNC(L_OPER(s->b,l->b));
+	       ALPHA_ADD(s,d,d,sa,la,da,b);
+#ifdef L_USE_SA
+	       *da=*sa;
+#endif
+	    }
+	    l++; s++; la++; sa++; da++; d++;
+	 }
+   }
+   else
+   {
+      if (!la)  /* no layer alpha => full opaque */
+	 while (len--)
+	 {
+	    d->r=L_TRUNC(L_OPER(s->r,l->r));
+	    ALPHA_ADD_V_NOLA(s,d,d,sa,da,alpha,r);
+	    d->g=L_TRUNC(L_OPER(s->g,l->g));
+	    ALPHA_ADD_V_NOLA(s,d,d,sa,da,alpha,g);
+	    d->b=L_TRUNC(L_OPER(s->b,l->b));
+	    ALPHA_ADD_V_NOLA(s,d,d,sa,da,alpha,b);
+#ifdef L_USE_SA
+	    *da=*sa;
+#endif
+	    l++; s++; sa++; da++; d++;
+	 }
+      else
+	 while (len--)
+	 {
+	    d->r=L_TRUNC(L_OPER(s->r,l->r));
+	    ALPHA_ADD_V(s,d,d,sa,la,da,alpha,r);
+	    d->g=L_TRUNC(L_OPER(s->g,l->g));
+	    ALPHA_ADD_V(s,d,d,sa,la,da,alpha,g);
+	    d->b=L_TRUNC(L_OPER(s->b,l->b));
+	    ALPHA_ADD_V(s,d,d,sa,la,da,alpha,b);
+#ifdef L_USE_SA
+	    *da=*sa;
+#endif
+	    l++; s++; la++; sa++; da++; d++;
+	 }
+   }
+}
+/* old code */
+#if 0 
+
 static void LM_FUNC(rgb_group *s,rgb_group *l,rgb_group *d,
 		    rgb_group *sa,rgb_group *la,rgb_group *da,
 		    int len,double alpha)
@@ -62,3 +151,5 @@ static void LM_FUNC(rgb_group *s,rgb_group *l,rgb_group *d,
 	 }
    }
 }
+
+#endif
diff --git a/src/modules/Image/layers.c b/src/modules/Image/layers.c
index 337ce1a05778da1def432206be08f440bac53ab8..6abfe4c4b152120c775832b1496527bf8260dadb 100644
--- a/src/modules/Image/layers.c
+++ b/src/modules/Image/layers.c
@@ -1,7 +1,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: layers.c,v 1.9 1999/04/23 15:50:41 mirar Exp $
+**!	$Id: layers.c,v 1.10 1999/04/23 23:45:27 mirar Exp $
 **! class Layer
 */
 
@@ -10,7 +10,7 @@
 
 #include <math.h> /* floor */
 
-RCSID("$Id: layers.c,v 1.9 1999/04/23 15:50:41 mirar Exp $");
+RCSID("$Id: layers.c,v 1.10 1999/04/23 23:45:27 mirar Exp $");
 
 #include "config.h"
 
@@ -190,9 +190,11 @@ subtract        Pd=Ps-Pl
 multiply        Pd=Ps*Pl
 divide          Pd=Ps/Pl
 invmodulo       Pd=Ps%Pl (measured in color values)
-invsubtract     Pd=Pl*Al-Ps
-invdivide       Pd=Pl/Ps
-invmodulo       Pd=Pl%Ps (measured in color values)
+
+invsubtract     Pd=Pl-Ps                             | keeps alpha 
+invdivide       Pd=Pl/Ps                             | from below
+invmodulo       Pd=Pl%Ps (measured in color values)  |
+
 difference      Pd=abs(Ps-Pl)
 min             Pd=min(Ps,Pl)
 max             Pd=max(Ps,Pl)
@@ -1160,14 +1162,6 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d,
 #undef L_TRUNC
 #undef L_OPER
 
-#define LM_FUNC lm_invsubtract
-#define L_TRUNC(X) MAXIMUM(0,(X))
-#define L_OPER(A,B) ((B)-(int)(A))
-#include "layer_oper.h"
-#undef LM_FUNC
-#undef L_TRUNC
-#undef L_OPER
-
 #define LM_FUNC lm_multiply
 #define L_TRUNC(X) (X)
 #define L_OPER(A,B) CCUT((A)*(int)(B))
@@ -1192,6 +1186,16 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d,
 #undef L_TRUNC
 #undef L_OPER
 
+#define L_USE_SA
+
+#define LM_FUNC lm_invsubtract
+#define L_TRUNC(X) MAXIMUM(0,(X))
+#define L_OPER(A,B) ((B)-(int)(A))
+#include "layer_oper.h"
+#undef LM_FUNC
+#undef L_TRUNC
+#undef L_OPER
+
 #define LM_FUNC lm_invdivide
 #define L_TRUNC(X) MINIMUM(255,(X))
 #define L_OPER(A,B) ((B)/C2F(1+(int)(A)))
@@ -1202,12 +1206,14 @@ static void lm_normal(rgb_group *s,rgb_group *l,rgb_group *d,
 
 #define LM_FUNC lm_invmodulo
 #define L_TRUNC(X) ((COLORTYPE)(X))
-#define L_OPER(A,B) ((B)%(A))
+#define L_OPER(A,B) ((B)%((A)?(A):1))
 #include "layer_oper.h"
 #undef LM_FUNC
 #undef L_TRUNC
 #undef L_OPER
 
+#undef L_USE_SA
+
 #define LM_FUNC lm_difference
 #define L_TRUNC(X) ((COLORTYPE)(X))
 #define L_OPER(A,B) abs((A)-(B))