diff --git a/res/res_statsd.c b/res/res_statsd.c
index 3e52c219b55a482c8d98d4b8eeff1b52cf75c292..01a1fd867aa91cf5fb89133e6c57c7e33ef4d86a 100644
--- a/res/res_statsd.c
+++ b/res/res_statsd.c
@@ -316,6 +316,14 @@ static void statsd_shutdown(void)
 	}
 }
 
+static int unload_module(void)
+{
+	statsd_shutdown();
+	aco_info_destroy(&cfg_info);
+	ao2_global_obj_release(confs);
+	return 0;
+}
+
 static int load_module(void)
 {
 	if (aco_info_init(&cfg_info)) {
@@ -364,34 +372,34 @@ static int load_module(void)
 		return AST_MODULE_LOAD_SUCCESS;
 	}
 
-	if (statsd_init() != 0) {
-		aco_info_destroy(&cfg_info);
+	if (statsd_init()) {
+		unload_module();
 		return AST_MODULE_LOAD_DECLINE;
 	}
 
 	return AST_MODULE_LOAD_SUCCESS;
 }
 
-static int unload_module(void)
-{
-	statsd_shutdown();
-	aco_info_destroy(&cfg_info);
-	ao2_global_obj_release(confs);
-	return 0;
-}
-
 static int reload_module(void)
 {
-	if (aco_process_config(&cfg_info, 1)) {
+	switch (aco_process_config(&cfg_info, 1)) {
+	case ACO_PROCESS_OK:
+		break;
+	case ACO_PROCESS_UNCHANGED:
+		return AST_MODULE_LOAD_SUCCESS;
+	case ACO_PROCESS_ERROR:
+	default:
 		return AST_MODULE_LOAD_DECLINE;
 	}
 
 	if (is_enabled()) {
-		return statsd_init();
+		if (statsd_init()) {
+			return AST_MODULE_LOAD_DECLINE;
+		}
 	} else {
 		statsd_shutdown();
-		return AST_MODULE_LOAD_SUCCESS;
 	}
+	return AST_MODULE_LOAD_SUCCESS;
 }
 
 /* The priority of this module is set just after realtime, since it loads