diff --git a/CHANGELOG b/CHANGELOG
index 9f4e4b4..c09ae44 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -6,6 +6,7 @@
 - cthon multi-map locking fix and current race corrections.
 - cthon shutdown expire fix.
 - cthon more map parser corrections.
+- cthon cleanup and corrections.
 
 13/7/2006 autofs-5.0.1 rc1
 --------------------------
diff --git a/daemon/automount.c b/daemon/automount.c
index 1d0e64f..21f0378 100644
--- a/daemon/automount.c
+++ b/daemon/automount.c
@@ -314,7 +314,7 @@ static int umount_ent(struct autofs_poin
 	if (rv && (ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) {
 		ret = stat(path, &st);
 		if (ret == -1 && errno == ENOENT) {
-			error(ap->logopt, "mount point does not exist");
+			warn(ap->logopt, "mount point does not exist");
 			status = pthread_mutex_unlock(&ap->state_mutex);
 			if (status)
 				fatal(status);
@@ -322,7 +322,7 @@ static int umount_ent(struct autofs_poin
 		}
 
 		if (ret == 0 && !S_ISDIR(st.st_mode)) {
-			error(ap->logopt, "mount point is not a directory");
+			warn(ap->logopt, "mount point is not a directory");
 			status = pthread_mutex_unlock(&ap->state_mutex);
 			if (status)
 				fatal(status);
@@ -440,7 +440,7 @@ static int rm_unwanted_fn(const char *fi
 		debug(LOGOPT_ANY, "removing directory %s", file);
 		if (rmdir(file)) {
 			char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
-			error(LOGOPT_ANY,
+			warn(LOGOPT_ANY,
 			      "unable to remove directory %s: %s", file, estr);
 			return 0;
 		}
@@ -570,36 +570,38 @@ int umount_multi(struct autofs_point *ap
 		if (!strcmp(mptr->fs_type, "autofs"))
 			continue;
 
+		sched_yield();
+
 		if (umount_offsets(ap, mnts, mptr->path))
-			error(ap->logopt, "could not umount some offsets under %s",
+			warn(ap->logopt, "could not umount some offsets under %s",
 				mptr->path);
 
+		sched_yield();
+
 		debug(ap->logopt, "unmounting dir = %s", mptr->path);
 
 		if (umount_ent(ap, mptr->path, mptr->fs_type)) {
 			left++;
 		}
-
-		sched_yield();
 	}
 
 	/* Lastly check for offsets with no root mount */
 	n = scandir(path, &de, 0, alphasort);
-	if (n) {
+	if (n && n != -1) {
 		char buf[PATH_MAX + 1];
 
 		while (n--) {
 			size_t size;
 			int ret;
 
+			sched_yield();
+
 			if (strcmp(de[n]->d_name, ".") == 0 ||
 			    strcmp(de[n]->d_name, "..") == 0) {
 				free(de[n]);
 				continue;
 			}
 
-			sched_yield();
-
 			size = sizeof(buf);
 			ret = cat_path(buf, size, path, de[n]->d_name);
 			if (!ret) {
@@ -612,7 +614,7 @@ int umount_multi(struct autofs_point *ap
 
 			if (!tree_is_mounted(mnts, buf)) {
 				if (umount_offsets(ap, mnts, buf)) {
-					error(ap->logopt,
+					warn(ap->logopt,
 					  "could not umount some offsets under %s",
 					  buf);
 					left++;
@@ -624,8 +626,9 @@ int umount_multi(struct autofs_point *ap
 	}
 
 	if (!left && !tree_is_mounted(mnts, path)) {
+		sched_yield();
 		if (umount_offsets(ap, mnts, path)) {
-			error(ap->logopt,
+			warn(ap->logopt,
 			      "could not umount some offsets under %s", path);
 			left++;
 		}
@@ -831,11 +834,10 @@ int do_expire(struct autofs_point *ap, c
 	mnts = tree_make_mnt_tree(_PROC_MOUNTS, buf);
 
 	ret = umount_multi(ap, mnts, buf, 1);
-	if (ret == 0) {
+	if (ret == 0)
 		msg("expired %s", buf);
-	} else {
+	else
 		error(ap->logopt, "error while expiring %s", buf);
-	}
 
 	tree_free_mnt_tree(mnts);
 
@@ -1258,8 +1260,6 @@ static void handle_mounts_cleanup(void *
 
 	sched_yield();
 
-	sched_yield();
-
 	if (clean) {
 		if (rmdir(path) == -1) {
 			char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
@@ -1415,7 +1415,7 @@ void *handle_mounts(void *arg)
 	 * So, the solution is a recipe for disaster.
 	 * Hope we don't get a really busy system!
 	 */
-	sleep(5);
+	sleep(1);
 	/* sched_yield(); */
 
 	return NULL;
diff --git a/daemon/direct.c b/daemon/direct.c
index 4ee8a03..3905ed0 100644
--- a/daemon/direct.c
+++ b/daemon/direct.c
@@ -140,12 +140,12 @@ int do_umount_autofs_direct(struct autof
 		switch (errno) {
 		case ENOENT:
 		case EINVAL:
-			error(ap->logopt, "mount point %s does not exist",
+			warn(ap->logopt, "mount point %s does not exist",
 			      me->key);
 			return 0;
 			break;
 		case EBUSY:
-			error(ap->logopt, "mount point %s is in use", me->key);
+			warn(ap->logopt, "mount point %s is in use", me->key);
 			if (ap->state == ST_SHUTDOWN_FORCE)
 				goto force_umount;
 			else
@@ -246,13 +246,13 @@ static int unlink_mount_tree(struct auto
 
 			switch (errno) {
 			case EINVAL:
-				debug(ap->logopt,
+				warn(ap->logopt,
 				      "bad superblock or not mounted");
 				break;
 
 			case ENOENT:
 			case EFAULT:
-				debug(ap->logopt, "bad path for mount");
+				warn(ap->logopt, "bad path for mount");
 				break;
 			}
 		}
@@ -494,10 +494,10 @@ int umount_autofs_offset(struct autofs_p
 	rv = umount(me->key);
 	if (rv == -1) {
 		if (errno == ENOENT) {
-			error(ap->logopt, "mount point does not exist");
+			warn(ap->logopt, "mount point does not exist");
 			return 0;
 		} else if (errno == EBUSY) {
-			error(ap->logopt, "mount point %s is in use", me->key);
+			warn(ap->logopt, "mount point %s is in use", me->key);
 			if (ap->state != ST_SHUTDOWN_FORCE)
 				return 0;
 		} else if (errno == ENOTDIR) {
@@ -534,7 +534,7 @@ int mount_autofs_offset(struct autofs_po
 
 	if (is_mounted(_PROC_MOUNTS, me->key, MNTS_AUTOFS)) {
 		if (ap->state != ST_READMAP)
-			debug(ap->logopt,
+			warn(ap->logopt,
 			      "trigger %s already mounted", me->key);
 		return 0;
 	}
diff --git a/daemon/indirect.c b/daemon/indirect.c
index c46326c..0c47cfd 100644
--- a/daemon/indirect.c
+++ b/daemon/indirect.c
@@ -106,13 +106,13 @@ static int unlink_mount_tree(struct auto
 
 			switch (errno) {
 			case EINVAL:
-				debug(ap->logopt,
+				warn(ap->logopt,
 				      "bad superblock or not mounted");
 				break;
 
 			case ENOENT:
 			case EFAULT:
-				debug(ap->logopt, "bad path for mount");
+				warn(ap->logopt, "bad path for mount");
 				break;
 			}
 		}
@@ -329,12 +329,12 @@ int umount_autofs_indirect(struct autofs
 		switch (errno) {
 		case ENOENT:
 		case EINVAL:
-			error(ap->logopt,
+			warn(ap->logopt,
 			      "mount point %s does not exist", ap->path);
 			return 0;
 			break;
 		case EBUSY:
-			error(ap->logopt,
+			warn(ap->logopt,
 			      "mount point %s is in use", ap->path);
 			if (ap->state == ST_SHUTDOWN_FORCE)
 				goto force_umount;
@@ -457,7 +457,7 @@ void *expire_proc_indirect(void *arg)
 
 		ret = ioctl(ioctlfd, AUTOFS_IOC_EXPIRE_MULTI, &now);
 		if (ret < 0 && errno != EAGAIN) {
-			debug(ap->logopt,
+			warn(ap->logopt,
 			      "failed to expire mount %s", next->path);
 			ea->status = 1;
 			break;
@@ -490,7 +490,7 @@ void *expire_proc_indirect(void *arg)
 		while (offsets--) {
 			ret = ioctl(ap->ioctlfd, AUTOFS_IOC_EXPIRE_MULTI, &now);
 			if (ret < 0 && errno != EAGAIN) {
-				debug(ap->logopt,
+				warn(ap->logopt,
 				      "failed to expire ofsets under %s",
 				      ap->path);
 				ea->status = 1;
@@ -529,7 +529,7 @@ void *expire_proc_indirect(void *arg)
 
 		if (!ioctl(ap->ioctlfd, AUTOFS_IOC_ASKUMOUNT, &ret)) {
 			if (!ret) {
-				debug(ap->logopt,
+				warn(ap->logopt,
 				      "mount still busy %s", ap->path);
 				ea->status = 1;
 			}
diff --git a/daemon/lookup.c b/daemon/lookup.c
index cad98d2..f0f9718 100644
--- a/daemon/lookup.c
+++ b/daemon/lookup.c
@@ -253,6 +253,9 @@ static int do_read_map(struct autofs_poi
 	if (!ap->ghost && ap->type != LKP_DIRECT)
 		return NSS_STATUS_SUCCESS;
 
+	master_source_current_wait(ap->entry);
+	ap->entry->current = map;
+
 	status = lookup->lookup_read_map(ap, age, lookup->context);
 
 	/*
@@ -414,8 +417,6 @@ int lookup_nss_read_map(struct autofs_po
 		if (map->type) {
 			debug(ap->logopt,
 			      "reading map %s %s", map->type, map->argv[0]);
-			master_source_current_wait(entry);
-			entry->current = map;
 			result = do_read_map(ap, map, age);
 			map = map->next;
 			continue;
@@ -432,14 +433,10 @@ int lookup_nss_read_map(struct autofs_po
 				map->type = tmp;
 				debug(ap->logopt,
 				      "reading map %s %s", tmp, map->argv[0]);
-				master_source_current_wait(entry);
-				entry->current = map;
 				result = do_read_map(ap, map, age);
 			} else {
 				debug(ap->logopt,
 				      "reading map file %s", map->argv[0]);
-				master_source_current_wait(entry);
-				entry->current = map;
 				result = read_file_source_instance(ap, map, age);
 			}
 			map = map->next;
@@ -464,8 +461,6 @@ int lookup_nss_read_map(struct autofs_po
 			debug(ap->logopt,
 			      "reading map %s %s", this->source, map->argv[0]);
 
-			master_source_current_wait(entry);
-			entry->current = map;
 			result = read_map_source(this, ap, map, age);
 			if (result == NSS_STATUS_UNKNOWN)
 				continue;
@@ -592,6 +587,9 @@ int do_lookup_mount(struct autofs_point 
 
 	lookup = map->lookup;
 
+	master_source_current_wait(ap->entry);
+	ap->entry->current = map;
+
 	status = lookup->lookup_mount(ap, name, name_len, lookup->context);
 
 	return status;
@@ -746,8 +744,6 @@ int lookup_nss_mount(struct autofs_point
 		sched_yield();
 
 		if (map->type) {
-			master_source_current_wait(entry);
-			entry->current = map;
 			result = do_lookup_mount(ap, map, name, name_len);
 
 			if (result == NSS_STATUS_SUCCESS)
@@ -766,14 +762,9 @@ int lookup_nss_mount(struct autofs_point
 					continue;
 				}
 				map->type = tmp;
-				master_source_current_wait(entry);
-				entry->current = map;
 				result = do_lookup_mount(ap, map, name, name_len);
-			} else {
-				master_source_current_wait(entry);
-				entry->current = map;
+			} else
 				result = lookup_name_file_source_instance(ap, map, name, name_len);
-			}
 
 			if (result == NSS_STATUS_SUCCESS)
 				break;
@@ -798,8 +789,6 @@ int lookup_nss_mount(struct autofs_point
 
 			this = list_entry(p, struct nss_source, list);
 
-			master_source_current_wait(entry);
-			entry->current = map;
 			result = lookup_map_name(this, ap, map, name, name_len);
 
 			if (result == NSS_STATUS_UNKNOWN) {
diff --git a/lib/master.c b/lib/master.c
index f54fffe..9d16801 100644
--- a/lib/master.c
+++ b/lib/master.c
@@ -181,13 +181,7 @@ master_add_map_source(struct master_mape
 
 	source->age = age;
 	source->stale = 1;
-/*
-	source->mc = cache_init(source);
-	if (!source->mc) {
-		master_free_map_source(source);
-		return NULL;
-	}
-*/
+
 	tmpargv = copy_argv(argc, argv);
 	if (!tmpargv) {
 		master_free_map_source(source, 0);
@@ -343,7 +337,7 @@ void master_free_map_source(struct map_s
 		instance = source->instance;
 		while (instance) {
 			next = instance->next;
-			master_free_map_source(instance, free_cache);
+			master_free_map_source(instance, 0);
 			instance = next;
 		}
 
@@ -434,6 +428,7 @@ master_add_source_instance(struct map_so
 	}
 
 	new->age = age;
+	new->mc = source->mc;
 
 	tmpargv = copy_argv(source->argc, source->argv);
 	if (!tmpargv) {
@@ -519,6 +514,8 @@ void master_source_current_wait(struct m
 {
 	int status;
 
+	debug(LOGOPT_ANY, "locking");
+
 	status = pthread_mutex_lock(&entry->current_mutex);
 	if (status) {
 		error(LOGOPT_ANY, "entry current source lock failed");
@@ -555,6 +552,8 @@ void master_source_current_signal(struct
 		fatal(status);
 	}
 
+	debug(LOGOPT_ANY, "unlocking");
+
 	return;
 }
 
diff --git a/modules/lookup_file.c b/modules/lookup_file.c
index 6306084..81ade74 100644
--- a/modules/lookup_file.c
+++ b/modules/lookup_file.c
@@ -193,7 +193,7 @@ static int read_one(FILE *f, char *key, 
 			else {
 				if (key_len == KEY_MAX_LEN) {
 					state = st_badent;
-					error(LOGOPT_ANY,
+					warn(LOGOPT_ANY,
 					      MODPREFIX "map key \"%s...\" "
 					      "is too long.  The maximum key "
 					      "length is %d", key,
@@ -243,7 +243,7 @@ static int read_one(FILE *f, char *key, 
 					state = st_badent;
 					ungetc(nch, f);
 					gotten = got_nothing;
-					error(LOGOPT_ANY, MODPREFIX 
+					warn(LOGOPT_ANY, MODPREFIX 
 					      "bad map entry \"%s...\" for key "
 					      "\"%s\"", mapent, key);
 					break;
@@ -261,7 +261,7 @@ static int read_one(FILE *f, char *key, 
 				   	goto got_it;
 				ungetc(nch, f);
 			} else {
-				error(LOGOPT_ANY,
+				warn(LOGOPT_ANY,
 				      MODPREFIX "map entry \"%s...\" for key "
 				      "\"%s\" is too long.  The maximum entry"
 				      " size is %d", mapent, key,
diff --git a/modules/lookup_hesiod.c b/modules/lookup_hesiod.c
index 4491c16..1664afc 100644
--- a/modules/lookup_hesiod.c
+++ b/modules/lookup_hesiod.c
@@ -86,6 +86,9 @@ int lookup_read_master(struct master *ma
 
 int lookup_read_map(struct autofs_point *ap, time_t age, void *context)
 {
+	ap->entry->current = NULL;
+	master_source_current_signal(ap->entry);
+
 	return NSS_STATUS_UNKNOWN;
 }
 
@@ -103,6 +106,9 @@ int lookup_mount(struct autofs_point *ap
 	char **record, *best_record = NULL, *p;
 	int priority, lowest_priority = INT_MAX;	
 
+	ap->entry->current = NULL;
+	master_source_current_signal(ap->entry);
+
 	debug(ap->logopt,
 	      MODPREFIX "looking up root=\"%s\", name=\"%s\"",
 	      ap->path, name);
diff --git a/modules/lookup_multi.c b/modules/lookup_multi.c
index a3363b7..00ab28e 100644
--- a/modules/lookup_multi.c
+++ b/modules/lookup_multi.c
@@ -133,9 +133,16 @@ int lookup_read_master(struct master *ma
 int lookup_read_map(struct autofs_point *ap, time_t age, void *context)
 {
 	struct lookup_context *ctxt = (struct lookup_context *) context;
+	struct map_source *source;
 	int i, ret, at_least_1 = 0;
 
+	source = ap->entry->current;
+	ap->entry->current = NULL;
+	master_source_current_signal(ap->entry);
+
 	for (i = 0; i < ctxt->n; i++) {
+		master_source_current_wait(ap->entry);
+		ap->entry->current = source;
 		ret = ctxt->m[i].mod->lookup_read_map(ap, age,
 						ctxt->m[i].mod->context);
 		if (ret & LKP_FAIL || ret == LKP_NOTSUP)
@@ -153,9 +160,16 @@ int lookup_read_map(struct autofs_point 
 int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context)
 {
 	struct lookup_context *ctxt = (struct lookup_context *) context;
+	struct map_source *source;
 	int i;
 
+	source = ap->entry->current;
+	ap->entry->current = NULL;
+	master_source_current_signal(ap->entry);
+
 	for (i = 0; i < ctxt->n; i++) {
+		master_source_current_wait(ap->entry);
+		ap->entry->current = source;
 		if (ctxt->m[i].mod->lookup_mount(ap, name, name_len,
 						 ctxt->m[i].mod->context) == 0)
 			return NSS_STATUS_SUCCESS;
diff --git a/modules/lookup_program.c b/modules/lookup_program.c
index 9c69b6f..c589d05 100644
--- a/modules/lookup_program.c
+++ b/modules/lookup_program.c
@@ -99,6 +99,9 @@ int lookup_read_master(struct master *ma
 
 int lookup_read_map(struct autofs_point *ap, time_t age, void *context)
 {
+	ap->entry->current = NULL;
+	master_source_current_signal(ap->entry);
+
 	return NSS_STATUS_UNKNOWN;
 }
 
diff --git a/modules/lookup_userhome.c b/modules/lookup_userhome.c
index 0d84379..cc0b4fa 100644
--- a/modules/lookup_userhome.c
+++ b/modules/lookup_userhome.c
@@ -42,6 +42,8 @@ int lookup_read_master(struct master *ma
 
 int lookup_read_map(struct autofs_point *ap, time_t age, void *context)
 {
+	ap->entry->current = NULL;
+	master_source_current_signal(ap->entry);
 	return NSS_STATUS_UNKNOWN;
 }
 
@@ -50,6 +52,8 @@ int lookup_mount(struct autofs_point *ap
 	struct passwd *pw;
 	char buf[MAX_ERR_BUF];
 
+	ap->entry->current = NULL;
+	master_source_current_signal(ap->entry);
 	debug(ap->logopt, MODPREFIX "looking up %s", name);
 
 	/* Get the equivalent username */
diff --git a/modules/parse_sun.c b/modules/parse_sun.c
index 7656bb4..00b0bd3 100644
--- a/modules/parse_sun.c
+++ b/modules/parse_sun.c
@@ -641,7 +641,7 @@ add_offset_entry(struct autofs_point *ap
 		p_len--;
 	m_key_len = m_root_len + p_len;
 	if (m_key_len > PATH_MAX) {
-		error(ap->logopt, MODPREFIX "multi mount key too long");
+		warn(ap->logopt, MODPREFIX "multi mount key too long");
 		return CHE_FAIL;
 	}
 	strcpy(m_key, m_root);
@@ -654,7 +654,7 @@ add_offset_entry(struct autofs_point *ap
 
 	m_mapent_len = strlen(loc);
 	if (m_mapent_len + m_options_len > MAPENT_MAX_LEN) {
-		error(ap->logopt, MODPREFIX "multi mount mapent too long");
+		warn(ap->logopt, MODPREFIX "multi mount mapent too long");
 		return CHE_FAIL;
 	}
 
@@ -676,7 +676,7 @@ add_offset_entry(struct autofs_point *ap
 		debug(ap->logopt, MODPREFIX
 		      "added multi-mount offset %s -> %s", path, m_mapent);
 	else
-		debug(ap->logopt, MODPREFIX
+		warn(ap->logopt, MODPREFIX
 		      "syntax error or dupliate offset %s -> %s", path, loc);
 
 	return ret;
@@ -818,7 +818,7 @@ static int parse_mapent(const char *ent,
 
 	/* Location can't begin with a '/' */
 	if (*p == '/') {
-		error(logopt, MODPREFIX "error location begins with \"/\"");
+		warn(logopt, MODPREFIX "error location begins with \"/\"");
 		free(myoptions);
 		return 0;
 	}
@@ -852,7 +852,7 @@ static int parse_mapent(const char *ent,
 
 		/* Location can't begin with a '/' */
 		if (*p == '/') {
-			error(logopt,
+			warn(logopt,
 			      MODPREFIX "error location begins with \"/\"");
 			free(myoptions);
 			free(loc);
@@ -873,7 +873,7 @@ static int parse_mapent(const char *ent,
 		}
 
 		if (!validate_location(ent)) {
-			error(logopt,
+			warn(logopt,
 			      MODPREFIX "invalid location %s", ent);
 			free(ent);
 			free(myoptions);
@@ -940,7 +940,7 @@ int parse_mount(struct autofs_point *ap,
 	mc = source->mc;
 
 	if (!mapent) {
-		error(ap->logopt, MODPREFIX "error: empty map entry");
+		warn(ap->logopt, MODPREFIX "error: empty map entry");
 		return 1;
 	}
 
@@ -1094,7 +1094,7 @@ int parse_mount(struct autofs_point *ap,
 
 			path = sanitize_path(tmp, strlen(tmp));
 			if (!path) {
-				error(ap->logopt, MODPREFIX "invalid path");
+				warn(ap->logopt, MODPREFIX "invalid path");
 				cache_readlock(mc);
 				cache_multi_lock(mc);
 				cache_delete_offset_list(mc, name);
@@ -1132,7 +1132,7 @@ int parse_mount(struct autofs_point *ap,
 						path, myoptions, loc, age);
 
 			if (status != CHE_OK) {
-				error(ap->logopt, MODPREFIX "error adding multi-mount");
+				warn(ap->logopt, MODPREFIX "error adding multi-mount");
 				cache_readlock(mc);
 				cache_multi_lock(mc);
 				cache_delete_offset_list(mc, name);
@@ -1172,7 +1172,7 @@ int parse_mount(struct autofs_point *ap,
 				options, &myoptions, &loc, ap->logopt);
 			if (!rv) {
 				error(ap->logopt,
-				      MODPREFIX "mount of root offset failed");
+				      MODPREFIX "failed to mount root offset");
 				cache_multi_lock(mc);
 				cache_delete_offset_list(mc, name);
 				cache_multi_unlock(mc);
@@ -1219,7 +1219,7 @@ int parse_mount(struct autofs_point *ap,
 
 		/* Location can't begin with a '/' */
 		if (*p == '/') {
-			error(ap->logopt,
+			warn(ap->logopt,
 			      MODPREFIX "error location begins with \"/\"");
 			free(options);
 			return 1;
@@ -1236,15 +1236,8 @@ int parse_mount(struct autofs_point *ap,
 			return 1;
 		}
 
-		if (!*loc) {
-			error(ap->logopt, MODPREFIX "invalid location");
-			free(loc);
-			free(options);
-			return 1;
-		}
-
 		if (!validate_location(loc)) {
-			error(ap->logopt, MODPREFIX "invalid location");
+			warn(ap->logopt, MODPREFIX "invalid location");
 			free(loc);
 			free(options);
 			return 1;
@@ -1269,7 +1262,7 @@ int parse_mount(struct autofs_point *ap,
 			}
 
 			if (!validate_location(ent)) {
-				error(ap->logopt, MODPREFIX "invalid location");
+				warn(ap->logopt, MODPREFIX "invalid location");
 				free(ent);
 				free(loc);
 				free(options);