diff --git a/src/modules/Image/orient.c b/src/modules/Image/orient.c
index 86417256d27ee9ddd69dfdb026914fe91ceea46c..63576acbbdb18d702e5b965438177692f6c36e90 100644
--- a/src/modules/Image/orient.c
+++ b/src/modules/Image/orient.c
@@ -1,9 +1,9 @@
-/* $Id: orient.c,v 1.6 1998/03/20 03:47:31 hubbe Exp $ */
+/* $Id: orient.c,v 1.7 1998/03/23 19:12:43 hedda Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: orient.c,v 1.6 1998/03/20 03:47:31 hubbe Exp $
+**!	$Id: orient.c,v 1.7 1998/03/23 19:12:43 hedda Exp $
 **! class image
 */
 
@@ -64,28 +64,31 @@ static void chrono(char *x)
 #endif
 
 /*
-**! method object orient()
+**! method object orient(void|array(object))
 **! method array(object) orient4()
 **!	Draws images describing the orientation
 **!     of the current image.
 **!
-**!	<tt>orient</tt> gives a HSV image
+**!	<tt>orient</tt> gives an HSV image
 **!	(run a <ref>hsv_to_rgb</ref> pass on it
 **!	to get a viewable image).
 **!     corresponding to the angle of the
 **!	orientation:
 **!     <pre>      |      /    -    \
-**!          hue=  0     64   128  192  (=red in a hsv image)
+**!          hue=  0     64   128  192  (=red in an hsv image)
 **!              purple cyan green red
 **!     </pre>
 **!	Red, green and blue channels are added
 **!	and not compared separately.
+**!     
+**!     If you first use orient4 you can give its
+**!     output as input to this function.
 **!
 **!     The <tt>orient4</tt> function gives back
 **!	4 image objects, corresponding to the
 **!	amount of different directions, see above.
 **!
-**! returns an array of the five new image objects
+**! returns an image or an array of the four new image objects
 **!
 **! note
 **!	experimental status; may not be exact the same
@@ -150,29 +153,68 @@ THREADS_DISALLOW();
 void image_orient(INT32 args)
 {
   struct object *o[5];
-  struct image *img[5],*this;
+  struct image *img[5],*this,*img1;
   int n;
   rgb_group *d,*s1,*s2,*s3,*s0;
   float mag;
-  
+  int i, w, h;
+
   if (!THIS->img) { error("no image\n");  return; }
 
   this=THIS;
 
-   if (args)
-   {
-      if (sp[-args].type==T_INT) 
-	 mag=sp[-args].u.integer;
-      else if (sp[-args].type==T_FLOAT)
-	 mag=sp[-args].u.float_number;
-      else
-	 error("Illegal argument 1 to image->orient\n");
-      pop_n_elems(args);
-   }
-   else mag=1.0;
-  
-  _image_orient(this,o,img);
+  if (args)
+  {
+    if (sp[-args].type==T_INT) 
+      mag=sp[-args].u.integer;
+    else if (sp[-args].type==T_FLOAT)
+      mag=sp[-args].u.float_number;
+    else
+      error("Illegal argument 1 to image->orient\n");
+  }
+  else mag=1.0;
+
+  if (args==1)
+    pop_n_elems(args);
 
+  if (args>1)
+  {
+    if (sp[1-args].type!=T_ARRAY) 
+      error("Illegal argument 2 to image->orient\n");
+    if (sp[1-args].u.array->size!=4)
+      error("The array given as argument 2 to image->orient do not have size 4\n");
+    for(i=0; i<4; i++)
+      if ((sp[1-args].u.array->item[i].type!=T_OBJECT) ||
+	  (!(sp[1-args].u.array->item[i].u.object)) ||
+	  (sp[1-args].u.array->item[i].u.object->prog!=image_program))
+	error("The array given as argument 2 to image->orient do not contain images\n");
+    img1=(struct image*)sp[1-args].u.array->item[0].u.object->storage;
+
+    w=this->xsize;
+    h=this->ysize;
+
+    for(i=0; i<4; i++)
+    {
+      img1=(struct image*)sp[1-args].u.array->item[i].u.object->storage;
+      if ((img1->xsize!=w)||
+	  (img1->ysize!=h))
+	error("The images in the array given as argument 2 to image->orient have different sizes\n");
+    }
+    for(i=0; i<4; i++) 
+      img[i]=(struct image*)sp[1-args].u.array->item[i].u.object->storage;
+    pop_n_elems(args);
+    push_int(this->xsize);
+    push_int(this->ysize);
+    o[4]=clone_object(image_program,2);
+    img[4]=(struct image*)get_storage(o[4],image_program);
+    push_object(o[4]);
+    w=1;
+  }
+  else
+  {
+    _image_orient(this,o,img);
+    w=0;
+  }
   s0=img[0]->img;
   s1=img[1]->img;
   s2=img[2]->img;
@@ -213,8 +255,12 @@ CHRONO("end hsv...");
 THREADS_DISALLOW();
 
   o[4]->refs++;
-  pop_n_elems(5);
-  push_object(o[4]);
+
+  if (!w)
+  {
+    pop_n_elems(5);
+    push_object(o[4]);
+  }
 }