diff --git a/Modules/almodule.c b/Modules/almodule.c
index 360e3d2..47aa52a 100644
--- a/Modules/almodule.c
+++ b/Modules/almodule.c
@@ -253,6 +253,7 @@
 {
 	long count;
 	object *v;
+	ALconfig c;
 	int width;
 
 	if (!getlongarg (args, &count)) return NULL;
@@ -263,7 +264,9 @@
 		return NULL;
 	}
 
-	width = ALgetwidth(ALgetconfig(self->ob_port));
+	c = ALgetconfig(self->ob_port);
+	width = ALgetwidth(c);
+	ALfreeconfig(c);
 	v = newsizedstringobject ((char *)NULL, width * count);
 	if (v == NULL) return NULL;
 
@@ -279,11 +282,14 @@
 {
 	long count;
 	object *v;
+	ALconfig c;
 	int width;
 
 	if (!getstrarg (args, &v)) return NULL;
 
-	width = ALgetwidth(ALgetconfig(self->ob_port));
+	c = ALgetconfig(self->ob_port);
+	width = ALgetwidth(c);
+	ALfreeconfig(c);
 	ALwritesamps (self-> ob_port, (void *) getstringvalue(v),
 		      getstringsize(v) / width);
 
@@ -449,10 +455,98 @@
 
 	return newconfigobject (config);
 }
+
+static object *
+al_queryparams(self, args)
+	object *self, *args;
+{
+	long device;
+	long length;
+	long *PVbuffer;
+	long PVdummy[2];
+	object *v;
+	object *w;
+
+	if (!getlongarg(args, &device))
+		return NULL;
+	length = ALqueryparams(device, PVdummy, 2L);
+	PVbuffer = NEW(long, length);
+	if (PVbuffer == NULL)
+		return err_nomem();
+	(void) ALqueryparams(device, PVbuffer, length);
+	v = newlistobject((int)length);
+	if (v != NULL) {
+		int i;
+		for (i = 0; i < length; i++)
+			setlistitem(v, i, newintobject(PVbuffer[i]));
+	}
+	DEL(PVbuffer);
+	return v;
+}
+
+static object *
+doParams(args, func, modified)
+	object *args;
+	void (*func)(long, long *, long);
+	int modified;
+{
+	long device;
+	object *list, *v;
+	long *PVbuffer;
+	long length;
+	int i;
 	
+	if (!getlongobjectarg(args, &device, &list))
+		return NULL;
+	if (!is_listobject(list)) {
+		err_badarg();
+		return NULL;
+	}
+	length = getlistsize(list);
+	PVbuffer = NEW(long, length);
+	if (PVbuffer == NULL)
+		return err_nomem();
+	for (i = 0; i < length; i++) {
+		v = getlistitem(list, i);
+		if (!is_intobject(v)) {
+			DEL(PVbuffer);
+			err_badarg();
+			return NULL;
+		}
+		PVbuffer[i] = getintvalue(v);
+	}
+
+	ALgetparams(device, PVbuffer, length);
+
+	if (modified) {
+		for (i = 0; i < length; i++)
+			setlistitem(list, i, newintobject(PVbuffer[i]));
+	}
+
+	INCREF(None);
+	return None;
+}
+
+static object *
+al_getparams(self, args)
+	object *self, *args;
+{
+	return doParams(args, ALgetparams, 1);
+}
+
+static object *
+al_setparams(self, args)
+	object *self, *args;
+{
+	return doParams(args, ALsetparams, 0);
+}
+
 static struct methodlist al_methods[] = {
 	{"openport",		al_openport},
 	{"newconfig",		al_newconfig},
+	{"queryparams",		al_queryparams},
+	{"getparams",		al_getparams},
+	{"setparams",		al_setparams},
 	{NULL,			NULL}		/* sentinel */
 };
 
