diff --git a/src/api/job_info.c b/src/api/job_info.c
index 7f4d04a07c1029b6255087985e83bf675579b0cd..3eebe52e2f3131ac1f946fffbc33c9d456ed2ee4 100644
--- a/src/api/job_info.c
+++ b/src/api/job_info.c
@@ -1052,7 +1052,7 @@ static inline bool _in_federation_test(void *ptr, char *cluster_name)
 	ListIterator iter;
 	bool status = false;
 
-	if (!fed->cluster_list)		/* NULL if no federations */
+	if (!fed || !fed->cluster_list)		/* NULL if no federations */
 		return status;
 	iter = list_iterator_create(fed->cluster_list);
 	while ((cluster = (slurmdb_cluster_rec_t *) list_next(iter))) {
@@ -1078,57 +1078,64 @@ static int _local_resp_first(void *x, void *y)
 	return 0;
 }
 
+extern int
+_load_cluster_jobs(slurm_msg_t *req_msg, job_info_msg_t **job_info_msg_pptr,
+		   slurmdb_cluster_rec_t *cluster)
+{
+	slurm_msg_t resp_msg;
+	int rc;
+
+	slurm_msg_t_init(&resp_msg);
+
+	if (slurm_send_recv_controller_msg(req_msg, &resp_msg, cluster) < 0)
+		return SLURM_ERROR;
+
+	switch (resp_msg.msg_type) {
+	case RESPONSE_JOB_INFO:
+		*job_info_msg_pptr = (job_info_msg_t *)resp_msg.data;
+		resp_msg.data = NULL;
+		break;
+	case RESPONSE_SLURM_RC:
+		rc = ((return_code_msg_t *) resp_msg.data)->return_code;
+		slurm_free_return_code_msg(resp_msg.data);
+		break;
+	default:
+		rc = SLURM_UNEXPECTED_MSG_ERROR;
+		break;
+	}
+	if (rc)
+		slurm_seterrno(rc);
+
+	return SLURM_PROTOCOL_SUCCESS;
+}
+
 /* Thread to read job information from some cluster */
 static void *_load_job_thread(void *args)
 {
 	load_job_req_struct_t *load_args = (load_job_req_struct_t *) args;
 	slurmdb_cluster_rec_t *cluster = load_args->cluster;
-	slurm_msg_t *resp_msg_fed;
 	job_info_msg_t *new_msg = NULL;
 	int rc;
 
-	resp_msg_fed = xmalloc(sizeof(slurm_msg_t));
-	slurm_msg_t_init(resp_msg_fed);
-	if (slurm_send_recv_controller_msg(load_args->req_msg, resp_msg_fed,
-					   cluster) < 0) {
-		verbose("Error reading job information from cluster %s: %m",
-			cluster->name);
+	if ((rc = _load_cluster_jobs(load_args->req_msg, &new_msg, cluster)) ||
+	    !new_msg) {
+		verbose("Error reading job information from cluster %s: %s",
+			cluster->name, slurm_strerror(rc));
 	} else {
-		switch (resp_msg_fed->msg_type) {
-		case RESPONSE_JOB_INFO:
-			rc = 0;
-			new_msg = (job_info_msg_t *) resp_msg_fed->data;
-			break;
-		case RESPONSE_SLURM_RC:
-			rc = ((return_code_msg_t *) resp_msg_fed->data)->
-						    return_code;
-			slurm_free_return_code_msg(resp_msg_fed->data);
-			break;
-		default:
-			rc = SLURM_UNEXPECTED_MSG_ERROR;
-			break;
-		}
-		if ((rc != SLURM_SUCCESS) || (new_msg == NULL)) {
-			verbose("Error reading job information from cluster %s: %s",
-				cluster->name, slurm_strerror(rc));
-		}
-		if (new_msg) {
-			load_job_resp_struct_t *job_resp;
-			job_resp = xmalloc(sizeof(load_job_resp_struct_t));
-			job_resp->local_cluster = load_args->local_cluster;
-			job_resp->new_msg = new_msg;
-			list_append(load_args->resp_msg_list, job_resp);
-		}
+		load_job_resp_struct_t *job_resp;
+		job_resp = xmalloc(sizeof(load_job_resp_struct_t));
+		job_resp->local_cluster = load_args->local_cluster;
+		job_resp->new_msg = new_msg;
+		list_append(load_args->resp_msg_list, job_resp);
 	}
-	xfree(resp_msg_fed);
 	xfree(args);
 
 	return (void *) NULL;
 }
 
-static int _load_jobs(slurm_msg_t *req_msg, job_info_msg_t **job_info_msg_pptr,
-		      uint16_t show_flags, char *cluster_name,
-		      slurmdb_federation_rec_t *fed)
+static int _load_fed_jobs(slurm_msg_t *req_msg, job_info_msg_t **job_info_msg_pptr,
+			  uint16_t show_flags, char *cluster_name,
+			  slurmdb_federation_rec_t *fed)
 {
 	int i, j;
 	int local_job_cnt = 0;
@@ -1305,17 +1312,23 @@ slurm_load_jobs (time_t update_time, job_info_msg_t **job_info_msg_pptr,
 		}
 	}
 
-	fed = (slurmdb_federation_rec_t *) ptr;
 	slurm_msg_t_init(&req_msg);
 	req.last_update  = update_time;
 	req.show_flags   = show_flags;
 	req_msg.msg_type = REQUEST_JOB_INFO;
 	req_msg.data     = &req;
-	rc = _load_jobs(&req_msg, job_info_msg_pptr, show_flags, cluster_name,
-			fed);
+
+	if (!ptr || (show_flags & SHOW_LOCAL))
+		rc = _load_cluster_jobs(&req_msg, job_info_msg_pptr, NULL);
+	else {
+		fed = (slurmdb_federation_rec_t *) ptr;
+		rc = _load_fed_jobs(&req_msg, job_info_msg_pptr, show_flags,
+				    cluster_name, fed);
+		if (ptr)
+			slurm_destroy_federation_rec(ptr);
+	}
+
 	xfree(cluster_name);
-	if (ptr)
-		slurm_destroy_federation_rec(ptr);
 
 	return rc;
 }
@@ -1349,17 +1362,23 @@ extern int slurm_load_job_user (job_info_msg_t **job_info_msg_pptr,
 		}
 	}
 
-	fed = (slurmdb_federation_rec_t *) ptr;
 	slurm_msg_t_init(&req_msg);
 	req.show_flags   = show_flags;
 	req.user_id      = user_id;
 	req_msg.msg_type = REQUEST_JOB_USER_INFO;
 	req_msg.data     = &req;
-	rc = _load_jobs(&req_msg, job_info_msg_pptr, show_flags, cluster_name,
-			fed);
+
+	if (!ptr || (show_flags & SHOW_LOCAL))
+		rc = _load_cluster_jobs(&req_msg, job_info_msg_pptr, NULL);
+	else {
+		fed = (slurmdb_federation_rec_t *) ptr;
+		rc = _load_fed_jobs(&req_msg, job_info_msg_pptr, show_flags,
+				    cluster_name, fed);
+		if (ptr)
+			slurm_destroy_federation_rec(ptr);
+	}
+
 	xfree(cluster_name);
-	if (ptr)
-		slurm_destroy_federation_rec(ptr);
 
 	return rc;
 }
@@ -1392,18 +1411,24 @@ slurm_load_job (job_info_msg_t **job_info_msg_pptr, uint32_t job_id,
 		}
 	}
 
-	fed = (slurmdb_federation_rec_t *) ptr;
 	bzero(&req, sizeof(job_id_msg_t));
 	slurm_msg_t_init(&req_msg);
-	req.job_id = job_id;
-	req.show_flags = show_flags;
+	req.job_id       = job_id;
+	req.show_flags   = show_flags;
 	req_msg.msg_type = REQUEST_JOB_INFO_SINGLE;
 	req_msg.data     = &req;
-	rc = _load_jobs(&req_msg, job_info_msg_pptr, show_flags, cluster_name,
-			fed);
+
+	if (!ptr || (show_flags & SHOW_LOCAL))
+		rc = _load_cluster_jobs(&req_msg, job_info_msg_pptr, NULL);
+	else {
+		fed = (slurmdb_federation_rec_t *) ptr;
+		rc = _load_fed_jobs(&req_msg, job_info_msg_pptr, show_flags,
+				    cluster_name, fed);
+		if (ptr)
+			slurm_destroy_federation_rec(ptr);
+	}
+
 	xfree(cluster_name);
-	if (ptr)
-		slurm_destroy_federation_rec(ptr);
 
 	return rc;
 }