diff --git a/res/res_phoneprov.c b/res/res_phoneprov.c
index f4272fbced5f4afff3a61ab045c67d3150f9401c..ea5ee9ffcd9975b43af600063baf987beac6e811 100644
--- a/res/res_phoneprov.c
+++ b/res/res_phoneprov.c
@@ -272,7 +272,7 @@ static void profile_destructor(void *obj)
 	while ((var = AST_LIST_REMOVE_HEAD(profile->headp, entries)))
 		ast_var_delete(var);
 
-	free(profile->headp);
+	ast_free(profile->headp);
 	ast_string_field_free_memory(profile);
 }
 
@@ -686,6 +686,8 @@ static struct extension *delete_extension(struct extension *exten)
 	ast_free(exten->headp);
 	ast_string_field_free_memory(exten);
 
+	ast_free(exten);
+
 	return NULL;
 }
 
@@ -789,10 +791,11 @@ static void user_destructor(void *obj)
 		exten = delete_extension(exten);
 	}
 
-	ast_string_field_free_memory(user);
 	if (user->profile) {
 		user->profile = unref_profile(user->profile);
 	}
+	
+	ast_string_field_free_memory(user);
 }
 
 /*! \brief Delete all users */
@@ -968,30 +971,31 @@ static int set_config(void)
 			continue;
 		}
 
-		if (!(profile = find_profile(tmp))) {
-			ast_log(LOG_WARNING, "Could not look up profile '%s' - skipping.\n", tmp);
-			continue;
-		}
 
-		if (!((user = find_user(mac)) || (user = build_user(mac, profile)))) {
-			ast_log(LOG_WARNING, "Could not create user for '%s' - skipping\n", user->macaddress);
-			continue;
-		}
+		if (!(user = find_user(mac))) {
+			if (!(profile = find_profile(tmp))) {
+				ast_log(LOG_WARNING, "Could not look up profile '%s' - skipping.\n", tmp);
+				continue;
+			}
 
-		if (!(exten = build_extension(cfg, cat))) {
-			ast_log(LOG_WARNING, "Could not create extension for %s - skipping\n", user->macaddress);
-			user = unref_user(user);
-			continue;
-		}
+			if (!(user = build_user(mac, profile))) {
+				ast_log(LOG_WARNING, "Could not create user for '%s' - skipping\n", user->macaddress);
+				continue;
+			}
 
-		if (add_user_extension(user, exten)) {
-			ast_log(LOG_WARNING, "Could not add extension '%s' to user '%s'\n", exten->name, user->macaddress);
-			user = unref_user(user);
-			exten = delete_extension(exten);
-			continue;
-		}
+			if (!(exten = build_extension(cfg, cat))) {
+				ast_log(LOG_WARNING, "Could not create extension for %s - skipping\n", user->macaddress);
+				user = unref_user(user);
+				continue;
+			}
+
+			if (add_user_extension(user, exten)) {
+				ast_log(LOG_WARNING, "Could not add extension '%s' to user '%s'\n", exten->name, user->macaddress);
+				user = unref_user(user);
+				exten = delete_extension(exten);
+				continue;
+			}
 
-		if (!find_user(mac)) {
 			if (build_user_routes(user)) {
 				ast_log(LOG_WARNING, "Could not create http routes for %s - skipping\n", user->macaddress);
 				user = unref_user(user);
@@ -999,6 +1003,22 @@ static int set_config(void)
 			}
 
 			ao2_link(users, user);
+			user = unref_user(user);
+		} else {
+			if (!(exten = build_extension(cfg, cat))) {
+				ast_log(LOG_WARNING, "Could not create extension for %s - skipping\n", user->macaddress);
+				user = unref_user(user);
+				continue;
+			}
+
+			if (add_user_extension(user, exten)) {
+				ast_log(LOG_WARNING, "Could not add extension '%s' to user '%s'\n", exten->name, user->macaddress);
+				user = unref_user(user);
+				exten = delete_extension(exten);
+				continue;
+			}
+
+			user = unref_user(user);
 		}
 	}
 
@@ -1225,6 +1245,7 @@ static int unload_module(void)
 	delete_profiles();
 	ao2_ref(profiles, -1);
 	ao2_ref(http_routes, -1);
+	ao2_ref(users, -1);
 
 	while ((var = AST_LIST_REMOVE_HEAD(&global_variables, entries)))
 		ast_var_delete(var);