diff --git a/lib/modules/_Image_PSD.pmod b/lib/modules/_Image_PSD.pmod
index 70388180bd7d600ccb5d1dcb90897c6a0effa041..e1d759596eedad094fa642be824ad8911500ebc9 100644
--- a/lib/modules/_Image_PSD.pmod
+++ b/lib/modules/_Image_PSD.pmod
@@ -91,6 +91,7 @@ Layer decode_layer(mapping layer, mapping i)
                  ({0,255,0,}),
                  ({0,0,255,}),
                }) + ({ 255,255,255 }) * 24;
+     l->image = Image.image( l->width, l->height, 255, 255, 255);
      break;
    case Indexed:
      use_cmap = 1;
@@ -198,7 +199,7 @@ array(object) decode_background( mapping data, array bg )
 mapping _decode( string|mapping what, mapping|void opts )
 {
   mapping data;
-mixed e =catch{
+// mixed e =catch{
   if(!opts) opts = ([]);
   if(mappingp(what))
     data = what;
@@ -211,7 +212,7 @@ mixed e =catch{
 
   foreach(reverse(data->layers), object l)
   {
-    if((l->flags & LAYER_FLAG_VISIBLE) || opts->draw_all_layers)
+//     if((l->flags & LAYER_FLAG_VISIBLE) || opts->draw_all_layers)
     {
       Layer h = l->get_opaqued( l->opacity );
 
@@ -256,6 +257,6 @@ mixed e =catch{
     "image":img,
     "alpha":alpha,
   ]);
-};
- werror(describe_backtrace(e));
+// };
+//  werror(describe_backtrace(e));
 }
diff --git a/src/modules/Image/encodings/psd.c b/src/modules/Image/encodings/psd.c
index 61fb3719824b80212e87eea5dcf851a5bdc7d009..fffa845187545fb01635159e7592272cd60603d8 100644
--- a/src/modules/Image/encodings/psd.c
+++ b/src/modules/Image/encodings/psd.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: psd.c,v 1.5 1999/04/17 01:25:48 per Exp $");
+RCSID("$Id: psd.c,v 1.6 1999/04/22 01:41:40 per Exp $");
 
 #include "config.h"
 
@@ -35,6 +35,7 @@ extern struct program *image_program;
 */
 
 #define MIN(X,Y) ((X)<(Y)?(X):(Y))
+#define MAX(X,Y) ((X)>(Y)?(X):(Y))
 #define STRING(X) static struct pike_string *s_##X;
 #include "psd_constant_strings.h"
 #undef STRING
@@ -430,28 +431,22 @@ static void f_decode_image_data( INT32 args )
     {
      case 4:
        /* cmyk.. */
-       dst->r = dst->g = dst->b = 255;
-       dst->r -= *(source++);
-       dst->g -= *(source2++);
-       dst->b -= *(source3++);
-       if(dst->r > *source4)
-         dst->r -= *source4;
-       else
-         dst->r = 0;
-       if(dst->g > *source4)
-         dst->g -= *source4;
-       else
-         dst->g = 0;
-       if(dst->b > *source4)
-         dst->b -= *source4;
-       else
-         dst->b = 0;
-       source4++;
+       dst->r = MAX(255-(*(source++) + *source4),  0);
+       dst->g = MAX(255-(*(source2++) + *source4), 0);
+       dst->b = MAX(255-(*(source3++) + *source4), 0);
+       dst++; source4++;
        break;
      case 3:
-       dst->r = *(source++);
-       dst->g = *(source2++);
-       (dst++)->b = *(source3++);
+       if( m != CMYK )
+       {
+         dst->r = *(source++);
+         dst->g = *(source2++);
+         (dst++)->b = *(source3++);
+       } else {
+         dst->r = 255-*(source++);
+         dst->g = 255-*(source2++);
+         dst->b = 255-*(source3++);
+       }
        break;
      case 2:
      case 1: