diff --git a/.cleancount b/.cleancount
index 8351c19397f4fcd5238d10034fa7fa384f14d580..60d3b2f4a4cd5f1637eba020358bfe5ecb5edcf2 100644
--- a/.cleancount
+++ b/.cleancount
@@ -1 +1 @@
-14
+15
diff --git a/channel.c b/channel.c
index a0f15f2dc460fd6697a22fd6c70b2987681d3124..2c7804559b4be8bdb2f6508a1febc6eb39acbca2 100644
--- a/channel.c
+++ b/channel.c
@@ -984,16 +984,10 @@ void ast_channel_free(struct ast_channel *chan)
 	}
 	
 	/* Get rid of each of the data stores on the channel */
-	AST_LIST_LOCK(&chan->datastores);
-	AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, list) {
-		/* Remove from the list */
-		AST_LIST_REMOVE_CURRENT(&chan->datastores, list);
+	while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry)))
 		/* Free the data store */
 		ast_channel_datastore_free(datastore);
-	}
-	AST_LIST_TRAVERSE_SAFE_END
-	AST_LIST_UNLOCK(&chan->datastores);
-	AST_LIST_HEAD_DESTROY(&chan->datastores);
+	AST_LIST_HEAD_INIT_NOLOCK(&chan->datastores);
 
 	/* loop over the variables list, freeing all data and deleting list items */
 	/* no need to lock the list, as the channel is already locked */
@@ -1059,9 +1053,7 @@ int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *da
 {
 	int res = 0;
 
-	AST_LIST_LOCK(&chan->datastores);
-	AST_LIST_INSERT_HEAD(&chan->datastores, datastore, list);
-	AST_LIST_UNLOCK(&chan->datastores);
+	AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry);
 
 	return res;
 }
@@ -1072,16 +1064,14 @@ int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore
 	int res = -1;
 
 	/* Find our position and remove ourselves */
-	AST_LIST_LOCK(&chan->datastores);
-	AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, list) {
+	AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, entry) {
 		if (datastore2 == datastore) {
-			AST_LIST_REMOVE_CURRENT(&chan->datastores, list);
+			AST_LIST_REMOVE_CURRENT(&chan->datastores, entry);
 			res = 0;
 			break;
 		}
 	}
 	AST_LIST_TRAVERSE_SAFE_END
-	AST_LIST_UNLOCK(&chan->datastores);
 
 	return res;
 }
@@ -1093,8 +1083,7 @@ struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const
 	if (info == NULL)
 		return NULL;
 
-	AST_LIST_LOCK(&chan->datastores);
-	AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, list) {
+	AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, entry) {
 		if (datastore->info == info) {
 			if (uid != NULL && datastore->uid != NULL) {
 				if (!strcasecmp(uid, datastore->uid)) {
@@ -1108,7 +1097,6 @@ struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const
 		}
 	}
 	AST_LIST_TRAVERSE_SAFE_END
-	AST_LIST_UNLOCK(&chan->datastores);
 
 	return datastore;
 }
@@ -3169,7 +3157,7 @@ int ast_do_masquerade(struct ast_channel *original)
 	}
 	/* Move data stores over */
 	if (AST_LIST_FIRST(&clone->datastores))
-                AST_LIST_INSERT_TAIL(&original->datastores, AST_LIST_FIRST(&clone->datastores), list);
+                AST_LIST_INSERT_TAIL(&original->datastores, AST_LIST_FIRST(&clone->datastores), entry);
 	AST_LIST_HEAD_INIT_NOLOCK(&clone->datastores);
 
 	clone_variables(original, clone);
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index 4d1826e6e6d513764c1f0cd41ee7c0c0f50367fd..7d2b4356f13df6a5440fc87abed3166fcb82f14f 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -161,7 +161,7 @@ struct ast_datastore {
 	/*! Data store type information */
 	const struct ast_datastore_info *info;
 	/*! Used for easy linking */
-	AST_LIST_ENTRY(ast_datastore) list;
+	AST_LIST_ENTRY(ast_datastore) entry;
 };
 
 /*! Structure for all kinds of caller ID identifications */
@@ -444,7 +444,7 @@ struct ast_channel {
 	struct ast_channel_spy_list *spies;
 
 	/*! Data stores on the channel */
-	AST_LIST_HEAD(datastores, ast_datastore) datastores;
+	AST_LIST_HEAD_NOLOCK(datastores, ast_datastore) datastores;
 
 	/*! For easy linking */
 	AST_LIST_ENTRY(ast_channel) chan_list;