diff --git a/Modules/imgfile.c b/Modules/imgfile.c
new file mode 100644
index 0000000..4c452d6
--- /dev/null
+++ b/Modules/imgfile.c
@@ -0,0 +1,160 @@
+/***********************************************************
+Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
+Netherlands.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the names of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/* IMGFILE module - Interface to sgi libimg */
+
+/*XXXX This modele should be done better at some point. It should return
+** an object of image file class, and have routines to manipulate these
+** image files in a neater way (so you can get rgb images off a greyscale
+** file, for instance, or do a straight display without having to get the
+** image bits into python, etc).
+*/
+
+#include "allobjects.h"
+#include "modsupport.h"
+
+#include <gl/image.h>
+
+/* #include "sigtype.h" */
+
+static object * ImgfileError;
+
+static char gfname[1024];
+static IMAGE *image;
+
+
+static
+imgfile_open(args)
+    object *args;
+{
+    char *fname;
+    
+    if ( !getargs(args, "s", &fname) )
+      return 0;
+    if ( image != NULL && strcmp(fname, gfname) != 0 ) {
+	iclose(image);
+	image = NULL;
+	gfname[0] = '\0';
+    }
+    if ( (image=iopen(fname, "r")) == NULL ) {
+	err_setstr(ImgfileError, "Cannot open image file");
+	return 0;
+    }
+    strcpy(gfname, fname);
+    return 1;    
+}
+
+static object *
+imgfile_read(self, args)
+    object *self;
+    object *args;
+{
+    char *fname;
+    object *rv;
+    int xsize, ysize, zsize;
+    char *cdatap;
+    long *idatap;
+    static short rs[8192], gs[8192], bs[8192];
+    int x, y;
+    
+    if ( !imgfile_open(args) )
+      return NULL;
+    
+    if ( image->colormap != CM_NORMAL ) {
+	err_setstr(ImgfileError, "Can only handle CM_NORMAL images");
+	return NULL;
+    }
+    if ( BPP(image->type) != 1 ) {
+	err_setstr(ImgfileError, "Cannot handle imgfiles with bpp!=1");
+	return NULL;
+    }
+    xsize = image->xsize;
+    ysize = image->ysize;
+    zsize = image->zsize;
+    if ( zsize != 1 && zsize != 3) {
+	err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels");
+	return NULL;
+    }
+
+    if ( zsize == 3 ) zsize = 4;
+    rv = newsizedstringobject(NULL, xsize*ysize*zsize);
+    if ( rv == NULL )
+      return NULL;
+    cdatap = getstringvalue(rv);
+    idatap = (long *)cdatap;
+    for ( y=0; y < ysize; y++ ) {
+	if ( zsize == 1 ) {
+	    getrow(image, rs, y, 0);
+	    for(x=0; x<xsize; x++ )
+	      *cdatap++ = rs[x];
+	} else {
+	    getrow(image, rs, y, 0);
+	    getrow(image, gs, y, 1);
+	    getrow(image, bs, y, 2);
+	    for(x=0; x<xsize; x++ )
+	      *idatap++ = (rs[x] & 0xff)     |
+		         ((gs[x] & 0xff)<<8) |
+		         ((bs[x] & 0xff)<<16);
+	}
+    }
+    return rv;
+}
+
+static object *
+imgfile_getsizes(self, args)
+    object *self;
+    object *args;
+{
+    char *fname;
+    object *rv;
+    
+    if ( !imgfile_open(args) )
+      return NULL;
+    rv = newtupleobject(3);
+    if ( rv == NULL )
+      return NULL;
+    settupleitem(rv, 0, newintobject(image->xsize));
+    settupleitem(rv, 1, newintobject(image->ysize));
+    settupleitem(rv, 2, newintobject(image->zsize));
+    return rv;
+}
+
+
+static struct methodlist imgfile_methods[] = {
+    { "getsizes", imgfile_getsizes },
+    { "read",     imgfile_read },
+    { 0,          0 }
+};
+
+
+void
+initimgfile()
+{
+	object *m, *d;
+	m = initmodule("imgfile", imgfile_methods);
+	d = getmoduledict(m);
+	ImgfileError = newstringobject("imgfile.error");
+	if ( ImgfileError == NULL || dictinsert(d,"error",ImgfileError) )
+	    fatal("can't define imgfile.error");
+}
