diff --git a/Modules/clmodule.c b/Modules/clmodule.c
index 7e72fbd..7a27a88 100644
--- a/Modules/clmodule.c
+++ b/Modules/clmodule.c
@@ -34,27 +34,16 @@
 typedef struct {
 	OB_HEAD
 	int ob_isCompressor;	/* Compressor or Decompressor */
-	CL_CompressorHdl ob_compressorHdl;
-	long ob_dataMaxSize;
-	long ob_frameSize;
-	object *ob_callbackFunc;
-	object *ob_callbackID;
-	object *ob_data; 
+	CL_Handle ob_compressorHdl;
 } clobject;
 
-#define CheckCompressor(self)	if ((self)->ob_compressorHdl == NULL) { \
-					err_setstr(RuntimeError, "(de)compressor not active"); \
-					return NULL; \
-					}
-
-extern typeobject Cltype;	/* Really static, forward */
-
-#define is_clobject(v)		((v)->ob_type == &Cltype)
-
 static object *ClError;		/* exception cl.error */
 
 static int error_handler_called = 0;
 
+/********************************************************************
+			  Utility routines.
+********************************************************************/
 static void
 cl_ErrorHandler(long errnum, const char *fmt, ...)
 {
@@ -74,20 +63,151 @@
 	err_setstr(ClError, errbuf);
 }
 
+/*
+ * This assumes that params are always in the range 0 to some maximum.
+ * This is not very efficient.
+ */
+static int
+param_type_is_float(CL_Handle comp, long param)
+{
+	long bufferlength;
+	long *PVbuffer;
+	int ret;
+
+	error_handler_called = 0;
+	bufferlength = clQueryParams(comp, 0, 0);
+	if (error_handler_called)
+		return -1;
+
+	if (param < 0 || param >= bufferlength / 2)
+		return -1;
+
+	PVbuffer = NEW(long, bufferlength);
+	if (PVbuffer == NULL)
+		return -1;
+
+	bufferlength = clQueryParams(comp, PVbuffer, bufferlength);
+	if (error_handler_called) {
+		DEL(PVbuffer);
+		return -1;
+	}
+
+	if (PVbuffer[param*2 + 1] == CL_FLOATING_ENUM_VALUE ||
+	    PVbuffer[param*2 + 1] == CL_FLOATING_RANGE_VALUE)
+		ret = 1;
+	else
+		ret = 0;
+
+	DEL(PVbuffer);
+
+	return ret;
+}
+
+/********************************************************************
+	       Single image compression/decompression.
+********************************************************************/
+static object *
+cl_CompressImage(self, args)
+	object *self, *args;
+{
+	long compressionScheme, width, height, originalFormat;
+	float compressionRatio;
+	long frameBufferSize, compressedBufferSize;
+	char *frameBuffer;
+	object *compressedBuffer;
+
+	if (!getargs(args, "(iiiifs#)", &compressionScheme, &width, &height,
+		     &originalFormat, &compressionRatio, &frameBuffer,
+		     &frameBufferSize))
+		return NULL;
+
+ retry:
+	compressedBuffer = newsizedstringobject(NULL, frameBufferSize);
+	if (compressedBuffer == NULL)
+		return NULL;
+
+	compressedBufferSize = frameBufferSize;
+	error_handler_called = 0;
+	if (clCompressImage(compressionScheme, width, height, originalFormat,
+			    compressionRatio, (void *) frameBuffer,
+			    &compressedBufferSize,
+			    (void *) getstringvalue(compressedBuffer))
+	    == FAILURE) {
+		DECREF(compressedBuffer);
+		if (!error_handler_called)
+			err_setstr(ClError, "clCompressImage failed");
+		return NULL;
+	}
+
+	if (compressedBufferSize > frameBufferSize) {
+		frameBufferSize = compressedBufferSize;
+		DECREF(compressedBuffer);
+		goto retry;
+	}
+
+	if (compressedBufferSize < frameBufferSize)
+		if (resizestring(&compressedBuffer, compressedBufferSize))
+			return NULL;
+
+	return compressedBuffer;
+}
+
+static object *
+cl_DecompressImage(self, args)
+	object *self, *args;
+{
+	long compressionScheme, width, height, originalFormat;
+	char *compressedBuffer;
+	long compressedBufferSize, frameBufferSize;
+	object *frameBuffer;
+
+	if (!getargs(args, "(iiiis#i)", &compressionScheme, &width, &height,
+		     &originalFormat, &compressedBuffer, &compressedBufferSize,
+		     &frameBufferSize))
+		return NULL;
+
+	frameBuffer = newsizedstringobject(NULL, frameBufferSize);
+	if (frameBuffer == NULL)
+		return NULL;
+
+	error_handler_called = 0;
+	if (clDecompressImage(compressionScheme, width, height, originalFormat,
+			      compressedBufferSize, compressedBuffer,
+			      (void *) getstringvalue(frameBuffer)) == FAILURE) {
+		DECREF(frameBuffer);
+		if (!error_handler_called)
+			err_setstr(ClError, "clDecompressImage failed");
+		return NULL;
+	}
+
+	return frameBuffer;
+}
+
+/********************************************************************
+		Sequential compression/decompression.
+********************************************************************/
+extern typeobject Cltype;	/* Really static, forward */
+
+#define CheckCompressor(self)	if ((self)->ob_compressorHdl == NULL) { \
+					err_setstr(RuntimeError, "(de)compressor not active"); \
+					return NULL; \
+				}
+
 static object *
 doClose(self, args, close_func)
 	clobject *self;
 	object *args;
-	long (*close_func) PROTO((CL_CompressorHdl));
+	long (*close_func) PROTO((CL_Handle));
 {
 	CheckCompressor(self);
 
 	if (!getnoarg(args))
 		return NULL;
 
+	error_handler_called = 0;
 	if ((*close_func)(self->ob_compressorHdl) == FAILURE) {
 		if (!error_handler_called)
-			err_setstr(ClError, "CloseCompressor failed");
+			err_setstr(ClError, "close failed");
 		return NULL;
 	}
 
@@ -118,166 +238,100 @@
 	clobject *self;
 	object *args;
 {
+	long numberOfFrames;
+	long frameBufferSize, compressedBufferSize;
+	char *frameBuffer;
+	long PVbuf[2];
 	object *data;
-	long frameIndex, numberOfFrames, dataSize;
 
 	CheckCompressor(self);
 
-	if (!getargs(args, "(ii)", &frameIndex, &numberOfFrames))
+	if (!getargs(args, "(is#)", &numberOfFrames, &frameBuffer, &frameBufferSize))
 		return NULL;
 
-	dataSize = self->ob_dataMaxSize;
-	data = newsizedstringobject(NULL, dataSize);
+	PVbuf[0] = CL_COMPRESSED_BUFFER_SIZE;
+	PVbuf[1] = 0;
+	error_handler_called = 0;
+	clGetParams(self->ob_compressorHdl, PVbuf, 2L);
+	if (error_handler_called)
+		return NULL;
+
+	data = newsizedstringobject(NULL, PVbuf[1]);
 	if (data == NULL)
 		return NULL;
 
+	compressedBufferSize = PVbuf[1];
+
 	error_handler_called = 0;
-	if (clCompress(self->ob_compressorHdl, frameIndex, numberOfFrames,
-		       &dataSize, (void *) getstringvalue(data)) == FAILURE) {
+	if (clCompress(self->ob_compressorHdl, numberOfFrames,
+		       (void *) frameBuffer, &compressedBufferSize,
+		       (void *) getstringvalue(data)) == FAILURE) {
 		DECREF(data);
-		if (!error_handler_called && !err_occurred())
+		if (!error_handler_called)
 			err_setstr(ClError, "compress failed");
 		return NULL;
 	}
 
-	if (dataSize < self->ob_dataMaxSize)
-		if (resizestring(&data, dataSize))
+	if (compressedBufferSize < PVbuf[1])
+		if (resizestring(&data, compressedBufferSize))
 			return NULL;
 
-	if (dataSize > self->ob_dataMaxSize) {
-		/* we didn't get all data */
+	if (compressedBufferSize > PVbuf[1]) {
+		/* we didn't get all "compressed" data */
 		DECREF(data);
-		err_setstr(ClError, "buffer too small for compressed image");
+		err_setstr(ClError, "compressed data is more than fitted");
 		return NULL;
 	}
 
 	return data;
-}	
+}
 
 static object *
 clm_Decompress(self, args)
 	clobject *self;
 	object *args;
 {
+	long PVbuf[2];
 	object *data;
-	long frameIndex, numberOfFrames;
+	long numberOfFrames;
+	char *compressedData;
+	long compressedDataSize;
 
 	CheckCompressor(self);
 
-	if (!getargs(args, "(ii)", &frameIndex, &numberOfFrames))
+	if (!getargs(args, "(is#)", &numberOfFrames, &compressedData,
+		     &compressedDataSize))
 		return NULL;
 
-	data = newsizedstringobject(NULL,
-				    numberOfFrames * self->ob_frameSize);
+	PVbuf[0] = CL_FRAME_BUFFER_SIZE;
+	PVbuf[1] = 0;
+	error_handler_called = 0;
+	clGetParams(self->ob_compressorHdl, PVbuf, 2L);
+	if (error_handler_called)
+		return NULL;
+
+	data = newsizedstringobject(NULL, PVbuf[1]);
 	if (data == NULL)
 		return NULL;
 
 	error_handler_called = 0;
-	if (clDecompress(self->ob_compressorHdl, frameIndex, numberOfFrames,
+	if (clDecompress(self->ob_compressorHdl, numberOfFrames,
+			 compressedDataSize, (void *) compressedData,
 			 (void *) getstringvalue(data)) == FAILURE) {
 		DECREF(data);
-		if (!error_handler_called && !err_occurred())
+		if (!error_handler_called)
 			err_setstr(ClError, "decompress failed");
 		return NULL;
 	}
 
 	return data;
-}	
-
-static object *
-clm_GetCompressorInfo(self, args)
-	clobject *self;
-	object *args;
-{
-	long result, infoSize;
-	void *info;
-	object *infoObject, *res;
-
-	CheckCompressor(self);
-
-	if (!getnoarg(args))
-		return NULL;
-
-	error_handler_called = 0;
-	if (clGetCompressorInfo(self->ob_compressorHdl, &infoSize, &info) == FAILURE) {
-		if (!error_handler_called)
-			err_setstr(ClError, "getcompressorinfo failed");
-		return NULL;
-	}
-
-	return newsizedstringobject((char *) info, infoSize);
-}
-
-static object *
-clm_GetDefault(self, args)
-	clobject *self;
-	object *args;
-{
-	long initial, result;
-
-	CheckCompressor(self);
-
-	if (!getargs(args, "i", &initial))
-		return NULL;
-
-	error_handler_called = 0;
-	result = clGetDefault(self->ob_compressorHdl, initial);
-	if (error_handler_called)
-		return NULL;
-
-	return newintobject(result);
-}
-
-static object *
-clm_GetMinMax(self, args)
-	clobject *self;
-	object *args;
-{
-	long param, min, max;
-
-	CheckCompressor(self);
-
-	if (!getargs(args, "i", &param))
-		return NULL;
-
-	error_handler_called = 0;
-	clGetMinMax(self->ob_compressorHdl, param, &min, &max);
-	if (error_handler_called)
-		return NULL;
-
-	return mkvalue("(ii)", min, max);
-}
-
-static object *
-clm_GetName(self, args)
-	clobject *self;
-	object *args;
-{
-	long descriptor;
-	char *name;
-
-	CheckCompressor(self);
-
-	if (!getargs(args, "i", &descriptor))
-		return NULL;
-
-	error_handler_called = 0;
-	name = clGetName(self->ob_compressorHdl, descriptor);
-	if (error_handler_called)
-		return NULL;
-	if (name == NULL) {
-		err_setstr(ClError, "getname failed");
-		return NULL;
-	}
-
-	return newstringobject(name);
 }
 
 static object *
 doParams(self, args, func, modified)
 	clobject *self;
 	object *args;
-	void (*func)(CL_CompressorHdl, long *, long);
+	void (*func)(CL_Handle, long *, long);
 	int modified;
 {
 	object *list, *v;
@@ -299,12 +353,15 @@
 		return err_nomem();
 	for (i = 0; i < length; i++) {
 		v = getlistitem(list, i);
-		if (!is_intobject(v)) {
+		if (is_floatobject(v))
+			PVbuffer[i] = clFloatToRatio(getfloatvalue(v));
+		else if (is_intobject(v))
+			PVbuffer[i] = getintvalue(v);
+		else {
 			DEL(PVbuffer);
 			err_badarg();
 			return NULL;
 		}
-		PVbuffer[i] = getintvalue(v);
 	}
 
 	error_handler_called = 0;
@@ -313,8 +370,14 @@
 		return NULL;
 
 	if (modified) {
-		for (i = 0; i < length; i++)
-			setlistitem(list, i, newintobject(PVbuffer[i]));
+		for (i = 0; i < length; i++) {
+			v = getlistitem(list, i);
+			if (is_floatobject(v))
+				v = newfloatobject(clRatioToFloat(PVbuffer[i]));
+			else
+				v = newintobject(PVbuffer[i]);
+			setlistitem(list, i, v);
+		}
 	}
 
 	DEL(PVbuffer);
@@ -325,16 +388,42 @@
 
 static object *
 clm_GetParams(self, args)
-	object *self, *args;
+	clobject *self;
+	object *args;
 {
 	return doParams(self, args, clGetParams, 1);
 }
 
 static object *
 clm_SetParams(self, args)
-	object *self, *args;
+	clobject *self;
+	object *args;
 {
-	return doParams(self, args, clSetParams, 0);
+	return doParams(self, args, clSetParams, 1);
+}
+
+static object *
+clm_GetParamID(self, args)
+	clobject *self;
+	object *args;
+{
+	char *name;
+	long value;
+
+	CheckCompressor(self);
+
+	if (!getargs(args, "s", &name))
+		return NULL;
+
+	error_handler_called = 0;
+	value = clGetParamID(self->ob_compressorHdl, name);
+	if (value == FAILURE) {
+		if (!error_handler_called)
+			err_setstr(ClError, "getparamid failed");
+		return NULL;
+	}
+
+	return newintobject(value);
 }
 
 static object *
@@ -377,7 +466,10 @@
 	for (i = 0; i < bufferlength; i++) {
 		if (i & 1)
 			setlistitem(list, i, newintobject(PVbuffer[i]));
-		else
+		else if (PVbuffer[i] == 0) {
+			INCREF(None);
+			setlistitem(list, i, None);
+		} else
 			setlistitem(list, i, newstringobject((char *) PVbuffer[i]));
 	}
 
@@ -386,13 +478,88 @@
 	return list;
 }
 
+static object *
+clm_GetMinMax(self, args)
+	clobject *self;
+	object *args;
+{
+	long param, min, max;
+	double fmin, fmax;
+
+	CheckCompressor(self);
+
+	if (!getargs(args, "i", &param))
+		return NULL;
+
+	clGetMinMax(self->ob_compressorHdl, param, &min, &max);
+
+	if (param_type_is_float(self->ob_compressorHdl, param) > 0) {
+		fmin = clRatioToFloat(min);
+		fmax = clRatioToFloat(max);
+		return mkvalue("(ff)", fmin, fmax);
+	}
+
+	return mkvalue("(ii)", min, max);
+}
+
+static object *
+clm_GetName(self, args)
+	clobject *self;
+	object *args;
+{
+	long param;
+	char *name;
+
+	CheckCompressor(self);
+
+	if (!getargs(args, "i", &param))
+		return NULL;
+
+	error_handler_called = 0;
+	name = clGetName(self->ob_compressorHdl, param);
+	if (name == NULL || error_handler_called) {
+		if (!error_handler_called)
+			err_setstr(ClError, "getname failed");
+		return NULL;
+	}
+
+	return newstringobject(name);
+}
+
+static object *
+clm_GetDefault(self, args)
+	clobject *self;
+	object *args;
+{
+	long param, value;
+	double fvalue;
+
+	CheckCompressor(self);
+
+	if (!getargs(args, "i", &param))
+		return NULL;
+
+	error_handler_called = 0;
+	value = clGetDefault(self->ob_compressorHdl, param);
+	if (error_handler_called)
+		return NULL;
+
+	if (param_type_is_float(self->ob_compressorHdl, param) > 0) {
+		fvalue = clRatioToFloat(value);
+		return newfloatobject(fvalue);
+	}
+
+	return newintobject(value);
+}
+
 static struct methodlist compressor_methods[] = {
+	{"close",		clm_CloseCompressor}, /* alias */
 	{"CloseCompressor",	clm_CloseCompressor},
 	{"Compress",		clm_Compress},
-	{"GetCompressorInfo",	clm_GetCompressorInfo},
 	{"GetDefault",		clm_GetDefault},
 	{"GetMinMax",		clm_GetMinMax},
 	{"GetName",		clm_GetName},
+	{"GetParamID",		clm_GetParamID},
 	{"GetParams",		clm_GetParams},
 	{"QueryParams",		clm_QueryParams},
 	{"SetParams",		clm_SetParams},
@@ -400,11 +567,13 @@
 };
 
 static struct methodlist decompressor_methods[] = {
+	{"close",		clm_CloseDecompressor},	/* alias */
 	{"CloseDecompressor",	clm_CloseDecompressor},
 	{"Decompress",		clm_Decompress},
 	{"GetDefault",		clm_GetDefault},
 	{"GetMinMax",		clm_GetMinMax},
 	{"GetName",		clm_GetName},
+	{"GetParamID",		clm_GetParamID},
 	{"GetParams",		clm_GetParams},
 	{"QueryParams",		clm_QueryParams},
 	{"SetParams",		clm_SetParams},
@@ -421,9 +590,6 @@
 		else
 			clCloseDecompressor(self->ob_compressorHdl);
 	}
-	XDECREF(self->ob_callbackFunc);
-	XDECREF(self->ob_callbackID);
-	XDECREF(self->ob_data);
 	DEL(self);
 }
 
@@ -456,260 +622,54 @@
 	0,			/*tp_as_mapping*/
 };
 
-static long
-GetFrame(callbackID, frameIndex, numberOfFrames, data)
-	void *callbackID;
-	long frameIndex;
-	long numberOfFrames;
-	void **data;
+static object *
+doOpen(self, args, open_func, iscompressor)
+	object *self, *args;
+	long (*open_func) PROTO((long, CL_Handle *));
+	int iscompressor;
 {
-	object *args;
-	clobject *self = (clobject *) callbackID;
-	object *result;
+	long scheme;
+	clobject *new;
 
-	args = mkvalue("(Oii)", self->ob_callbackID, frameIndex,
-		       numberOfFrames);
-	if (args == NULL)
-		return FAILURE;
+	if (!getargs(args, "i", &scheme))
+		return NULL;
 
-	result = call_object(self->ob_callbackFunc, args);
-	DECREF(args);
-	if (result == NULL)
-		return FAILURE;
+	new = NEWOBJ(clobject, &Cltype);
+	if (new == NULL)
+		return NULL;
 
-	if (!is_stringobject(result)) {
-		DECREF(result);
-		return FAILURE;
+	new->ob_compressorHdl = NULL;
+	new->ob_isCompressor = iscompressor;
+
+	error_handler_called = 0;
+	if ((*open_func)(scheme, &new->ob_compressorHdl) == FAILURE) {
+		DECREF(new);
+		if (!error_handler_called)
+			err_setstr(ClError, "Open(De)Compressor failed");
+		return NULL;
 	}
-
-	XDECREF(self->ob_data);
-	self->ob_data = result;
-	
-	*data = (void *) getstringvalue(result);
-
-	return SUCCESS;
-}
-
-static long
-GetData(callbackID, frameIndex, numberOfFrames, dataSize, data)
-	void *callbackID;
-	long frameIndex;
-	long numberOfFrames;
-	long *dataSize;
-	void **data;
-{
-	object *args, *result;
-	clobject *self = (clobject *) callbackID;
-
-	args = mkvalue("(Oii)", self->ob_callbackID, frameIndex,
-		       numberOfFrames);
-	if (args == NULL)
-		return FAILURE;
-
-	result = call_object(self->ob_callbackFunc, args);
-	DECREF(args);
-	if (result == NULL)
-		return FAILURE;
-
-	if (!is_stringobject(result)) {
-		DECREF(result);
-		return FAILURE;
-	}
-
-	XDECREF(self->ob_data);
-	self->ob_data = result;
-	
-	*dataSize = getstringsize(result);
-	*data = (void *) getstringvalue(result);
-
-	return SUCCESS;
+	return new;
 }
 
 static object *
 cl_OpenCompressor(self, args)
 	object *self, *args;
 {
-	CL_CompressionFormat compressionFormat;
-	long qualityFactor;
-	object *GetFrameCBPtr;
-	object *callbackID;
-	clobject *new;
-
-	if (!getargs(args, "((iiiiiiiiii)iOO)",
-		     &compressionFormat.width,
-		     &compressionFormat.height,
-		     &compressionFormat.frameSize,
-		     &compressionFormat.dataMaxSize,
-		     &compressionFormat.originalFormat,
-		     &compressionFormat.components,
-		     &compressionFormat.bitsPerComponent,
-		     &compressionFormat.frameRate,
-		     &compressionFormat.numberOfFrames,
-		     &compressionFormat.compressionScheme,
-		     &qualityFactor, &GetFrameCBPtr, &callbackID))
-		return NULL;
-
-	new = NEWOBJ(clobject, &Cltype);
-	if (new == 0)
-		return NULL;
-
-	new->ob_compressorHdl = NULL;
-	new->ob_callbackFunc = NULL;
-	new->ob_callbackID = NULL;
-	new->ob_data = NULL;
-
-	error_handler_called = 0;
-	if (clOpenCompressor(&compressionFormat, qualityFactor, GetFrame,
-			     (void *) new, &new->ob_compressorHdl) == FAILURE) {
-		DECREF(new);
-		if (!error_handler_called)
-			err_setstr(ClError, "opencompressor failed");
-		return NULL;
-	}
-
-	new->ob_isCompressor = 1;
-	new->ob_callbackFunc = GetFrameCBPtr;
-	XINCREF(new->ob_callbackFunc);
-	if (callbackID == NULL)
-		callbackID = None;
-	new->ob_callbackID = callbackID;
-	INCREF(new->ob_callbackID);
-	new->ob_data = NULL;
-	new->ob_dataMaxSize = compressionFormat.dataMaxSize;
-	new->ob_frameSize = compressionFormat.frameSize;
-
-	return new;
+	return doOpen(self, args, clOpenCompressor, 1);
 }
 
 static object *
 cl_OpenDecompressor(self, args)
 	object *self, *args;
 {
-	CL_CompressionFormat compressionFormat;
-	long infoSize;
-	void *info;
-	object *GetDataCBPtr;
-	object *callbackID;
-	clobject *new;
-	object *res;
-
-	if (!getargs(args, "((iiiiiiiiii)s#OO)",
-		     &compressionFormat.width,
-		     &compressionFormat.height,
-		     &compressionFormat.frameSize,
-		     &compressionFormat.dataMaxSize,
-		     &compressionFormat.originalFormat,
-		     &compressionFormat.components,
-		     &compressionFormat.bitsPerComponent,
-		     &compressionFormat.frameRate,
-		     &compressionFormat.numberOfFrames,
-		     &compressionFormat.compressionScheme,
-		     &info, &infoSize, &GetDataCBPtr, &callbackID))
-		return NULL;
-
-	new = NEWOBJ(clobject, &Cltype);
-	if (new == 0)
-		return NULL;
-
-	new->ob_compressorHdl = NULL;
-	new->ob_callbackFunc = NULL;
-	new->ob_callbackID = NULL;
-	new->ob_data = NULL;
-
-	error_handler_called = 0;
-	if (clOpenDecompressor(&compressionFormat, infoSize, info, GetData,
-			       (void *) new, &new->ob_compressorHdl) == FAILURE) {
-		new->ob_compressorHdl = NULL; /* just in case... */
-		DECREF(new);
-		if (!error_handler_called)
-			err_setstr(ClError, "opendecompressor failed");
-		return NULL;
-	}
-
-	new->ob_isCompressor = 0;
-	new->ob_callbackFunc = GetDataCBPtr;
-	XINCREF(new->ob_callbackFunc);
-	if (callbackID == NULL)
-		callbackID = None;
-	new->ob_callbackID = callbackID;
-	XINCREF(new->ob_callbackID);
-	new->ob_data = NULL;
-	new->ob_dataMaxSize = compressionFormat.dataMaxSize;
-	new->ob_frameSize = compressionFormat.frameSize;
-
-	return new;
-}
-
-static object *
-cl_AddParam(self, args)
-	object *self, *args;
-{
-	char *name;
-	long type, min, max, initial, paramID;
-
-	if (!getargs(args, "(siiii)", &name, &type, &min, &max, &initial))
-		return NULL;
-
-	error_handler_called = 0;
-	if (clAddParam(name, type, min, max, initial, &paramID) == FAILURE) {
-		if (!error_handler_called)
-			err_setstr(ClError, "addparam failed");
-		return NULL;
-	}
-
-	return newintobject(paramID);
-}
-
-static object *
-cl_QueryParams(self, args)
-	object *self, *args;
-{
-	long handle, *PVbuffer, bufferlength;
-	object *list;
-	int i;
-
-	if (!getargs(args, "i", &handle))
-		return NULL;
-
-	error_handler_called = 0;
-	bufferlength = clQueryParams((CL_CompressorHdl) handle, 0, 0);
-	if (error_handler_called)
-		return NULL;
-
-	PVbuffer = NEW(long, bufferlength);
-	if (PVbuffer == NULL)
-		return err_nomem();
-
-	bufferlength = clQueryParams((CL_CompressorHdl) handle, PVbuffer,
-				     bufferlength);
-	if (error_handler_called) {
-		DEL(PVbuffer);
-		return NULL;
-	}
-
-	list = newlistobject(bufferlength);
-	if (list == NULL) {
-		DEL(PVbuffer);
-		return NULL;
-	}
-
-	for (i = 0; i < bufferlength; i++) {
-		if (i & 1)
-			setlistitem(list, i, newintobject(PVbuffer[i]));
-		else
-			setlistitem(list, i, newstringobject((char *) PVbuffer[i]));
-	}
-
-	DEL(PVbuffer);
-
-	return list;
+	return doOpen(self, args, clOpenDecompressor, 0);
 }
 
 static struct methodlist cl_methods[] = {
-	{"AddParam",		cl_AddParam},
+	{"CompressImage",	cl_CompressImage},
+	{"DecompressImage",	cl_DecompressImage},
 	{"OpenCompressor",	cl_OpenCompressor},
 	{"OpenDecompressor",	cl_OpenDecompressor},
-	{"QueryParams",		cl_QueryParams},
 	{NULL,			NULL} /* Sentinel */
 };
 
