diff --git a/src/common/gres.c b/src/common/gres.c
index b47a3bc67a5a30d60a015b52b1a3415501b585bc..043756683baebd62c57068635a433a14ae458239 100644
--- a/src/common/gres.c
+++ b/src/common/gres.c
@@ -124,6 +124,7 @@ static slurm_gres_context_t *gres_context = NULL;
 static char *gres_plugin_list = NULL;
 static pthread_mutex_t gres_context_lock = PTHREAD_MUTEX_INITIALIZER;
 static List gres_conf_list = NULL;
+static bool init_run = false;
 
 /* Local functions */
 static gres_node_state_t *
@@ -338,7 +339,7 @@ extern int gres_plugin_init(void)
 	int i, j, rc = SLURM_SUCCESS;
 	char *last = NULL, *names, *one_name, *full_name;
 
-	if (gres_context_cnt >= 0)
+	if (init_run && (gres_context_cnt >= 0))
 		return rc;
 
 	slurm_mutex_lock(&gres_context_lock);
@@ -406,6 +407,7 @@ extern int gres_plugin_init(void)
 		gres_context[i].gres_name_colon_len =
 			strlen(gres_context[i].gres_name_colon);
 	}
+	init_run = true;
 
 fini:	slurm_mutex_unlock(&gres_context_lock);
 	return rc;
@@ -424,6 +426,7 @@ extern int gres_plugin_fini(void)
 	if (gres_context_cnt < 0)
 		goto fini;
 
+	init_run = false;
 	for (i=0; i<gres_context_cnt; i++) {
 		j = _unload_gres_plugin(gres_context + i);
 		if (j != SLURM_SUCCESS)
diff --git a/src/common/mpi.c b/src/common/mpi.c
index d5c2d6054e2746abf600ba48a09e5d1b05cbbd0c..699d3437239d60e3f8c0a82cc4eeb610279a6130 100644
--- a/src/common/mpi.c
+++ b/src/common/mpi.c
@@ -79,6 +79,7 @@ struct slurm_mpi_context {
 
 static slurm_mpi_context_t g_context = NULL;
 static pthread_mutex_t      context_lock = PTHREAD_MUTEX_INITIALIZER;
+static bool init_run = false;
 
 static slurm_mpi_context_t
 _slurm_mpi_context_create(const char *mpi_type)
@@ -211,7 +212,7 @@ int _mpi_init (char *mpi_type)
 	char *full_type = NULL;
 	int got_default = 0;
 
-	if ( g_context )
+	if ( init_run && g_context )
 		return retval;
 
 	slurm_mutex_lock( &context_lock );
@@ -247,7 +248,7 @@ int _mpi_init (char *mpi_type)
 		g_context = NULL;
 		retval = SLURM_ERROR;
 	}
-
+	init_run = true;
 
 done:
 	if(got_default)
@@ -335,6 +336,7 @@ int mpi_fini (void)
 	if (!g_context)
 		return SLURM_SUCCESS;
 
+	init_run = false;
 	rc = _slurm_mpi_context_destroy(g_context);
 	return rc;
 }
diff --git a/src/common/node_select.c b/src/common/node_select.c
index 6e31d669a720c4c13ad3d976f2af20c13dc76211..1321f12193674996ad2a4034159723d5c9122443 100644
--- a/src/common/node_select.c
+++ b/src/common/node_select.c
@@ -66,6 +66,7 @@ static int select_context_default = -1;
 static slurm_select_context_t * select_context = NULL;
 static pthread_mutex_t		select_context_lock =
 	PTHREAD_MUTEX_INITIALIZER;
+static bool init_run = false;
 
 /*
  * Locate and load the appropriate plugin
@@ -282,7 +283,7 @@ extern int slurm_select_init(bool only_default)
 	struct dirent *e;
 	char *dir_array = NULL, *head = NULL;
 
-	if ( select_context )
+	if ( init_run && select_context )
 		return retval;
 
 	slurm_mutex_lock( &select_context_lock );
@@ -453,6 +454,7 @@ skip_load_all:
 		}
 
 	}
+	init_run = true;
 
 done:
 	slurm_mutex_unlock( &select_context_lock );
@@ -469,6 +471,7 @@ extern int slurm_select_fini(void)
 	if (!select_context)
 		goto fini;
 
+	init_run = false;
 	for (i=0; i<select_context_cnt; i++) {
 		j = _select_context_destroy(select_context + i);
 		if (j != SLURM_SUCCESS)
diff --git a/src/common/slurm_accounting_storage.c b/src/common/slurm_accounting_storage.c
index 056c185a473eb37cce14571d18fbe0634eb8d391..575edb6e0ae05f5cc57edd512d4acbc76d541830 100644
--- a/src/common/slurm_accounting_storage.c
+++ b/src/common/slurm_accounting_storage.c
@@ -201,6 +201,7 @@ typedef struct slurm_acct_storage_context {
 static slurm_acct_storage_context_t * g_acct_storage_context = NULL;
 static pthread_mutex_t		g_acct_storage_context_lock =
 	PTHREAD_MUTEX_INITIALIZER;
+static bool init_run = false;
 
 /*
  * Local functions
@@ -388,7 +389,7 @@ extern int slurm_acct_storage_init(char *loc)
 	int retval = SLURM_SUCCESS;
 	char *acct_storage_type = NULL;
 
-	if ( g_acct_storage_context )
+	if ( init_run && g_acct_storage_context )
 		return retval;
 
 	slurm_mutex_lock( &g_acct_storage_context_lock );
@@ -414,7 +415,8 @@ extern int slurm_acct_storage_init(char *loc)
 		_acct_storage_context_destroy( g_acct_storage_context );
 		g_acct_storage_context = NULL;
 		retval = SLURM_ERROR;
-	}
+	} else
+		init_run = true;
 
 done:
 	slurm_mutex_unlock( &g_acct_storage_context_lock );
@@ -429,6 +431,7 @@ extern int slurm_acct_storage_fini(void)
 	if (!g_acct_storage_context)
 		return SLURM_SUCCESS;
 
+	init_run = false;
 //	(*(g_acct_storage_context->ops.acct_storage_fini))();
 	rc = _acct_storage_context_destroy( g_acct_storage_context );
 	g_acct_storage_context = NULL;
diff --git a/src/common/slurm_auth.c b/src/common/slurm_auth.c
index 652127f44305cab5f61fff6e4bdc9bc71c606a20..12ad31e8dfeee9477e35bb13e483418a117b4901 100644
--- a/src/common/slurm_auth.c
+++ b/src/common/slurm_auth.c
@@ -106,6 +106,7 @@ struct slurm_auth_context {
  */
 static slurm_auth_context_t g_context    = NULL;
 static pthread_mutex_t      context_lock = PTHREAD_MUTEX_INITIALIZER;
+static bool init_run = false;
 
 /*
  * Order of advisory arguments passed to some of the plugins.
@@ -315,7 +316,7 @@ extern int slurm_auth_init( char *auth_type )
         int retval = SLURM_SUCCESS;
 	char *auth_type_local = NULL;
 
-        if ( g_context )
+        if ( init_run && g_context )
 		return retval;
 
         slurm_mutex_lock( &context_lock );
@@ -346,7 +347,8 @@ extern int slurm_auth_init( char *auth_type )
                 _slurm_auth_context_destroy( g_context );
                 g_context = NULL;
                 retval = SLURM_ERROR;
-        }
+        } else
+		init_run = true;
 
 done:
 	xfree(auth_type_local);
@@ -363,6 +365,7 @@ slurm_auth_fini( void )
 	if ( !g_context )
 		return SLURM_SUCCESS;
 
+	init_run = false;
 	rc = _slurm_auth_context_destroy( g_context );
 	g_context = NULL;
 	return rc;
diff --git a/src/common/slurm_jobacct_gather.c b/src/common/slurm_jobacct_gather.c
index 3c07c1540533d4f4d97e8cefd8e6840a653f8369..b927c9c937d94f95086a213afbe03be534a4ee70 100644
--- a/src/common/slurm_jobacct_gather.c
+++ b/src/common/slurm_jobacct_gather.c
@@ -107,6 +107,7 @@ typedef struct slurm_jobacct_gather_context {
 
 static slurm_jobacct_gather_context_t *g_jobacct_gather_context = NULL;
 static pthread_mutex_t g_jobacct_gather_context_lock = PTHREAD_MUTEX_INITIALIZER;
+static bool init_run = false;
 
 static int _slurm_jobacct_gather_init(void);
 
@@ -258,7 +259,7 @@ static int _slurm_jobacct_gather_init(void)
 	char	*jobacct_gather_type = NULL;
 	int	retval=SLURM_SUCCESS;
 
-	if ( g_jobacct_gather_context )
+	if (init_run &&  g_jobacct_gather_context )
 		return(retval);
 
 	slurm_mutex_lock( &g_jobacct_gather_context_lock );
@@ -281,7 +282,8 @@ static int _slurm_jobacct_gather_init(void)
 			g_jobacct_gather_context);
 		g_jobacct_gather_context = NULL;
 		retval = SLURM_ERROR;
-	}
+	} else
+		init_run = true;
 
 done:
 	slurm_mutex_unlock( &g_jobacct_gather_context_lock );
@@ -304,6 +306,7 @@ extern int slurm_jobacct_gather_fini(void)
 
 	slurm_mutex_lock( &g_jobacct_gather_context_lock );
 	if (g_jobacct_gather_context) {
+		init_run = false;
 		rc = _slurm_jobacct_gather_context_destroy(
 				g_jobacct_gather_context);
 		g_jobacct_gather_context = NULL;
diff --git a/src/common/slurm_priority.c b/src/common/slurm_priority.c
index a86432541f575313f9232e3e6a6a7b678045af59..8a7579917ef8b1baaf158940d19a32b9df84c3a2 100644
--- a/src/common/slurm_priority.c
+++ b/src/common/slurm_priority.c
@@ -63,6 +63,7 @@ typedef struct slurm_priority_context {
 static slurm_priority_context_t * g_priority_context = NULL;
 static pthread_mutex_t		g_priority_context_lock =
 	PTHREAD_MUTEX_INITIALIZER;
+static bool init_run = false;
 
 /*
  * Local functions
@@ -198,7 +199,7 @@ extern int slurm_priority_init(void)
 	int retval = SLURM_SUCCESS;
 	char *priority_type = NULL;
 
-	if ( g_priority_context )
+	if ( init_run && g_priority_context )
 		return retval;
 
 	slurm_mutex_lock( &g_priority_context_lock );
@@ -221,7 +222,8 @@ extern int slurm_priority_init(void)
 		_priority_context_destroy( g_priority_context );
 		g_priority_context = NULL;
 		retval = SLURM_ERROR;
-	}
+	} else
+		init_run = true;
 
 done:
 	slurm_mutex_unlock( &g_priority_context_lock );
@@ -236,6 +238,7 @@ extern int slurm_priority_fini(void)
 	if (!g_priority_context)
 		return SLURM_SUCCESS;
 
+	init_run = false;
 	rc = _priority_context_destroy( g_priority_context );
 	g_priority_context = NULL;
 	return rc;
diff --git a/src/common/slurm_topology.c b/src/common/slurm_topology.c
index 8d4a265159e3c5d66bb47536407fade7f206c27f..3229fa2bb2c21b8f84fd4861c98ef6ad225396b1 100644
--- a/src/common/slurm_topology.c
+++ b/src/common/slurm_topology.c
@@ -75,7 +75,7 @@ typedef struct slurm_topo_context {
 
 static slurm_topo_context_t	*g_topo_context = NULL;
 static pthread_mutex_t		g_topo_context_lock = PTHREAD_MUTEX_INITIALIZER;
-
+static bool init_run = false;
 
 /* ************************************************************************ */
 /*  TAG(                       slurm_topo_get_ops                        )  */
@@ -207,7 +207,7 @@ slurm_topo_init( void )
 	int retval = SLURM_SUCCESS;
 	char *topo_type = NULL;
 
-	if ( g_topo_context )
+	if ( init_run && g_topo_context )
 		return retval;
 
 	slurm_mutex_lock( &g_topo_context_lock );
@@ -229,7 +229,8 @@ slurm_topo_init( void )
 		slurm_topo_context_destroy( g_topo_context );
 		g_topo_context = NULL;
 		retval = SLURM_ERROR;
-	}
+	} else
+		init_run = true;
 
 done:
 	slurm_mutex_unlock( &g_topo_context_lock );
@@ -248,6 +249,7 @@ slurm_topo_fini( void )
 	if (!g_topo_context)
 		return SLURM_SUCCESS;
 
+	init_run = false;
 	rc = slurm_topo_context_destroy(g_topo_context);
 	g_topo_context = NULL;
 	return rc;
diff --git a/src/common/switch.c b/src/common/switch.c
index 5a8ac8b16e840ad3fefac52b3564286d50e763ce..2d4fb845484c539e8a9d7e423b869991e4a0188e 100644
--- a/src/common/switch.c
+++ b/src/common/switch.c
@@ -127,7 +127,7 @@ struct slurm_switch_context {
 
 static slurm_switch_context_t *g_context = NULL;
 static pthread_mutex_t      context_lock = PTHREAD_MUTEX_INITIALIZER;
-
+static bool init_run = false;
 
 static slurm_switch_context_t *
 _slurm_switch_context_create(const char *switch_type)
@@ -288,7 +288,7 @@ extern int switch_init( void )
 	int retval = SLURM_SUCCESS;
 	char *switch_type = NULL;
 
-	if ( g_context )
+	if ( init_run && g_context )
 		return retval;
 
 	slurm_mutex_lock( &context_lock );
@@ -309,7 +309,8 @@ extern int switch_init( void )
 		_slurm_switch_context_destroy( g_context );
 		g_context = NULL;
 		retval = SLURM_ERROR;
-	}
+	} else
+		init_run = true;
 
       done:
 	slurm_mutex_unlock( &context_lock );
@@ -324,6 +325,7 @@ extern int switch_fini(void)
 	if (!g_context)
 		return SLURM_SUCCESS;
 
+	init_run = false;
 	rc = _slurm_switch_context_destroy(g_context);
 	return rc;
 }
diff --git a/src/slurmctld/job_submit.c b/src/slurmctld/job_submit.c
index 56c3e3b1467e1989501884ce7e5948d7562a0064..2def3b5dce0921f80ff810cd9f542977498d66da 100644
--- a/src/slurmctld/job_submit.c
+++ b/src/slurmctld/job_submit.c
@@ -93,6 +93,7 @@ static int submit_context_cnt = -1;
 static slurm_submit_context_t *submit_context = NULL;
 static char *submit_plugin_list = NULL;
 static pthread_mutex_t submit_context_lock = PTHREAD_MUTEX_INITIALIZER;
+static bool init_run = false;
 
 static int _load_submit_plugin(char *plugin_name,
 			       slurm_submit_context_t *plugin_context)
@@ -196,7 +197,7 @@ extern int job_submit_plugin_init(void)
 	int rc = SLURM_SUCCESS;
 	char *last = NULL, *names, *one_name;
 
-	if (submit_context_cnt >= 0)
+	if (init_run && (submit_context_cnt >= 0))
 		return rc;
 
 	slurm_mutex_lock(&submit_context_lock);
@@ -222,6 +223,7 @@ extern int job_submit_plugin_init(void)
 		one_name = strtok_r(NULL, ",", &last);
 	}
 	xfree(names);
+	init_run = true;
 
 fini:	slurm_mutex_unlock(&submit_context_lock);
 	return rc;
@@ -240,6 +242,7 @@ extern int job_submit_plugin_fini(void)
 	if (submit_context_cnt < 0)
 		goto fini;
 
+	init_run = false;
 	for (i=0; i<submit_context_cnt; i++) {
 		j = _unload_submit_plugin(submit_context + i);
 		if (j != SLURM_SUCCESS)
diff --git a/src/slurmctld/sched_plugin.c b/src/slurmctld/sched_plugin.c
index 5b1229109b4594ae8ff38b3ab6e26adcd61346c2..d508ed017ef1b06406d8f791750b78b511234af6 100644
--- a/src/slurmctld/sched_plugin.c
+++ b/src/slurmctld/sched_plugin.c
@@ -83,7 +83,7 @@ typedef struct slurm_sched_context {
 
 static slurm_sched_context_t	*g_sched_context = NULL;
 static pthread_mutex_t		g_sched_context_lock = PTHREAD_MUTEX_INITIALIZER;
-
+static bool init_run = false;
 
 /* ************************************************************************ */
 /*  TAG(                       slurm_sched_get_ops                       )  */
@@ -225,7 +225,7 @@ slurm_sched_init( void )
 	int retval = SLURM_SUCCESS;
 	char *sched_type = NULL;
 
-	if ( g_sched_context )
+	if ( init_run && g_sched_context )
 		return retval;
 
 	slurm_mutex_lock( &g_sched_context_lock );
@@ -253,6 +253,7 @@ slurm_sched_init( void )
 	if ( (slurm_get_preempt_mode() & PREEMPT_MODE_GANG) &&
 	     (gs_init() != SLURM_SUCCESS))
 		error( "cannot start gang scheduler ");
+	init_run = true;
 
  done:
 	slurm_mutex_unlock( &g_sched_context_lock );
@@ -271,6 +272,7 @@ slurm_sched_fini( void )
 	if (!g_sched_context)
 		return SLURM_SUCCESS;
 
+	init_run = false;
 	rc = slurm_sched_context_destroy(g_sched_context);
 	g_sched_context = NULL;