diff --git a/src/vdmodem/vdmodem.c b/src/vdmodem/vdmodem.c
index 9c38885da36dfbed19b74d9864d16b0e77b8eea9..22c7623124888ecf75ef8a3108e6ac012242b6ba 100644
--- a/src/vdmodem/vdmodem.c
+++ b/src/vdmodem/vdmodem.c
@@ -255,6 +255,15 @@ char* error(struct modem* modem)
 	return response(modem, ERROR);
 }
 
+char* text_response(struct modem* modem, const char* text)
+{
+	static char str[512];
+
+	SAFECOPY(str, verbal_response(modem, text));
+	SAFECAT(str, response(modem, OK));
+	return str;
+}
+
 char* connect_result(struct modem* modem)
 {
 	return response(modem, modem->ext_results ? CONNECT_9600 : CONNECT);
@@ -378,6 +387,7 @@ bool write_save(struct modem* modem, ulong savnum)
 	iniSetString(&ini, "modem", key, modem->save[savnum], /* style: */NULL);
 	bool result = iniWriteFile(fp, ini);
 	iniCloseFile(fp);
+	iniFreeStringList(ini);
 	return result;
 }
 
@@ -588,13 +598,17 @@ char* dial(struct modem* modem, const char* number)
 	struct addrinfo	*res=NULL;
 	char host[128];
 	char portnum[16];
+	char value[INI_MAX_VALUE_LEN];
 	uint16_t port = cfg.port;
 
 	dprintf("dial(%s)", number);
 	if(stricmp(number, "L") == 0)
 		number = modem->last;
 	else {
-		if(toupper(*number) == 'S' && IS_DIGIT(number[1])) {
+		const char* p = iniGetString(ini, "alias", number, NULL, value);
+		if(p != NULL)
+			number = p;
+		else if(toupper(*number) == 'S' && IS_DIGIT(number[1])) {
 			char* p;
 			ulong val = strtoul(number+1, &p, 10);
 			if(val < MAX_SAVES && *p == '\0')
@@ -743,6 +757,8 @@ char* answer(struct modem* modem)
 	return connected(modem);
 }
 
+bool read_ini(const char* ini_fname);
+
 char* atmodem_exec(struct modem* modem)
 {
 	static char respbuf[128];
@@ -831,15 +847,14 @@ char* atmodem_exec(struct modem* modem)
 				switch(val) {
 					case 0:
 						safe_snprintf(respbuf, sizeof(respbuf)
-							,"\r\n" TITLE " v" VERSION " Copyright %s Rob Swindell\r\n%s/%s\r\n"
+							,TITLE " v" VERSION " Copyright %s Rob Swindell\r\n%s/%s"
 							,&__DATE__[7]
 							,GIT_BRANCH
 							,GIT_HASH
 							);
-						break;
+						return text_response(modem, respbuf);
 					case 1:
-						safe_snprintf(respbuf, sizeof(respbuf), "\r\n%s\r\n", ini_fname);
-						break;
+						return text_response(modem, ini_fname);
 					default:
 						return error(modem);
 				}
@@ -942,6 +957,10 @@ char* atmodem_exec(struct modem* modem)
 				modem->ext_results = val;
 				break;
 			case 'Z':
+				if(fexist(ini_fname)) {
+					if(!read_ini(ini_fname))
+						return error(modem);
+				}
 				init(modem);
 				break;
 			default:
@@ -1064,11 +1083,11 @@ void listen_thread(void* arg)
 
 bool read_ini(const char* ini_fname)
 {
-	printf("Reading '%s'\n", ini_fname);
 	FILE* fp = iniOpenFile(ini_fname, /* create: */false);
 	if(fp == NULL)
 		return false;
 
+	iniFreeStringList(ini);
 	ini = iniReadFile(fp);
 	iniCloseFile(fp);
 	mode = iniGetEnum(ini, ROOT_SECTION, "Mode", modeNames, mode);
@@ -1178,8 +1197,9 @@ int main(int argc, char** argv)
 				cfg.port = atoi(arg + 1);
 				break;
 			case 'c':
-				if(!read_ini(arg + 1)) {
-					fprintf(stderr, "!Error %d reading: %s\n", errno, arg + 1);
+				SAFECOPY(ini_fname, arg + 1);
+				if(!read_ini(ini_fname)) {
+					fprintf(stderr, "!Error %d reading: %s\n", errno, ini_fname);
 					return EXIT_FAILURE;
 				}
 				break;