diff --git a/src/common/slurmdb_pack.c b/src/common/slurmdb_pack.c
index e8ca9e481792fcc4912da10aace2d14ddb26ee60..969775a5ef282dd38df610213f1ea89e20a9bcd6 100644
--- a/src/common/slurmdb_pack.c
+++ b/src/common/slurmdb_pack.c
@@ -4303,6 +4303,7 @@ extern void slurmdb_pack_res_cond(void *in, uint16_t rpc_version, Buf buffer)
 		}
 		list_iterator_destroy(itr);
 	}
+	count = NO_VAL;
 
 	if (object->type_list)
 		count = list_count(object->type_list);
@@ -4316,6 +4317,7 @@ extern void slurmdb_pack_res_cond(void *in, uint16_t rpc_version, Buf buffer)
 		}
 		list_iterator_destroy(itr);
 	}
+	count = NO_VAL;
 
 	pack16(object->with_deleted, buffer);
 	pack16(object->with_clusters, buffer);
diff --git a/src/plugins/accounting_storage/mysql/as_mysql_resource.c b/src/plugins/accounting_storage/mysql/as_mysql_resource.c
index 1fc560c1ec1d90af42770156a42eb99d7bf09120..b6d80178d34a2543b7408cc4e53b8329b3b96f8a 100644
--- a/src/plugins/accounting_storage/mysql/as_mysql_resource.c
+++ b/src/plugins/accounting_storage/mysql/as_mysql_resource.c
@@ -50,23 +50,20 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond,
 	ListIterator itr = NULL;
 	char *object = NULL;
 
-	/* Since we are always doing an outer join here t1.deleted needs
-	   to be handled on join instead of the where.
-	*/
 	if (!res_cond) {
-//		xstrcat(*extra, "where t1.deleted=0");
+		xstrcat(*extra, "where t1.deleted=0");
 		return;
 	}
 
-	/* if (res_cond->with_deleted) */
-	/* 	xstrcat(*extra, "where (t1.deleted=0 || t1.deleted=1)"); */
-	/* else */
-	/* 	xstrcat(*extra, "where t1.deleted=0"); */
+	if (res_cond->with_deleted)
+		xstrcat(*extra, "where (t1.deleted=0 || t1.deleted=1)");
+	else
+		xstrcat(*extra, "where t1.deleted=0");
 
 	if (res_cond->description_list
 	    && list_count(res_cond->description_list)) {
 		set = 0;
-		xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where");
+		xstrcat(*extra, " && (");
 		itr = list_iterator_create(res_cond->description_list);
 		while ((object = list_next(itr))) {
 			if (set)
@@ -79,15 +76,14 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond,
 	}
 
 	if (!(res_cond->flags & SLURMDB_RES_FLAG_NOTSET)) {
-		xstrfmtcat(*extra, "%s (flags & %u)",
-			   *extra ? " &&" : "where",
+		xstrfmtcat(*extra, " && (flags & %u)",
 			   res_cond->flags & SLURMDB_RES_FLAG_BASE);
 	}
 
 	if (res_cond->id_list
 	    && list_count(res_cond->id_list)) {
 		set = 0;
-		xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where");
+		xstrcat(*extra, " && (");
 		itr = list_iterator_create(res_cond->id_list);
 		while ((object = list_next(itr))) {
 			if (set)
@@ -102,7 +98,7 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond,
 	if (res_cond->manager_list
 	    && list_count(res_cond->manager_list)) {
 		set = 0;
-		xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where");
+		xstrcat(*extra, " && (");
 		itr = list_iterator_create(res_cond->manager_list);
 		while ((object = list_next(itr))) {
 			if (set)
@@ -117,7 +113,7 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond,
 	if (res_cond->name_list
 	    && list_count(res_cond->name_list)) {
 		set = 0;
-		xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where");
+		xstrcat(*extra, " && (");
 		itr = list_iterator_create(res_cond->name_list);
 		while ((object = list_next(itr))) {
 			if (set)
@@ -132,7 +128,7 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond,
 	if (res_cond->server_list
 	    && list_count(res_cond->server_list)) {
 		set = 0;
-		xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where");
+		xstrcat(*extra, " && (");
 		itr = list_iterator_create(res_cond->server_list);
 		while ((object = list_next(itr))) {
 			if (set)
@@ -147,7 +143,7 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond,
 	if (res_cond->type_list
 	    && list_count(res_cond->type_list)) {
 		set = 0;
-		xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where");
+		xstrcat(*extra, " && (");
 		itr = list_iterator_create(res_cond->type_list);
 		while ((object = list_next(itr))) {
 			if (set)
@@ -158,9 +154,6 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond,
 		list_iterator_destroy(itr);
 		xstrcat(*extra, ")");
 	}
-
-	if (!*extra)
-		*extra = xstrdup("");
 }
 
 static int _setup_clus_res_cond(slurmdb_res_cond_t *res_cond, char **extra)
@@ -375,7 +368,7 @@ static int _fill_in_res_rec(mysql_conn_t *mysql_conn, slurmdb_res_rec_t *res)
 	query = xstrdup_printf("select distinct %s from %s as t1 "
 			       "left outer join "
 			       "%s as t2 on (res_id=id && "
-			       "t1.deleted=0 && t2.deleted=0) "
+			       "t2.deleted=0) "
 			       "where id=%u group by id",
 			       tmp, res_table, clus_res_table, res->id);
 
@@ -786,7 +779,7 @@ extern List as_mysql_get_res(mysql_conn_t *mysql_conn, uid_t uid,
 			       "id",
 			       tmp, res_table, clus_res_table,
 			       (!res_cond || !res_cond->with_deleted) ?
-			       " && t1.deleted=0 && t2.deleted=0" : "",
+			       " && t2.deleted=0" : "",
 			       extra);
 	xfree(tmp);
 	xfree(extra);
@@ -875,7 +868,7 @@ extern List as_mysql_remove_res(mysql_conn_t *mysql_conn, uint32_t uid,
 			       "%s as t2 on (res_id = id%s) %s && %s;",
 			       res_table, clus_res_table,
 			       (!res_cond || !res_cond->with_deleted) ?
-			       " && t1.deleted && t2.deleted=0" : "",
+			       " && t2.deleted=0" : "",
 			       extra, clus_extra);
 	xfree(clus_extra);
 
@@ -1043,13 +1036,14 @@ extern List as_mysql_modify_res(mysql_conn_t *mysql_conn, uint32_t uid,
 	res_cond->with_deleted = 0;
 	_setup_res_cond(res_cond, &extra);
 	query_clusters += _setup_clus_res_cond(res_cond, &clus_extra);
+
 	if (query_clusters || send_update)
 		query = xstrdup_printf("select id, name, server, cluster "
 				       "from %s as t1 left outer join "
 				       "%s as t2 on (res_id = id%s) %s && %s;",
 				       res_table, clus_res_table,
 				       (!res_cond || !res_cond->with_deleted) ?
-				       " && t1.deleted=0 && t2.deleted=0" : "",
+				       " && t2.deleted=0" : "",
 				       extra, clus_extra);
 	else
 		query = xstrdup_printf("select id, name, server "
diff --git a/src/sacctmgr/resource_functions.c b/src/sacctmgr/resource_functions.c
index 24e3542feb20a0652075bc3e8bb10a7fffef093b..1b639f9bbe028d9c66382398f1bdd40c9c7c00c7 100644
--- a/src/sacctmgr/resource_functions.c
+++ b/src/sacctmgr/resource_functions.c
@@ -234,8 +234,17 @@ static int _set_res_cond(int *start, int argc, char *argv[],
 				}
 			}
 			list_iterator_destroy(itr);
+		} else if (!strncasecmp(argv[i], "PercentAllowed",
+					 MAX(command_len, 1))) {
+			if (!res_cond->percent_list) {
+				res_cond->percent_list =
+					list_create(slurm_destroy_char);
+			}
+			if (slurm_addto_char_list(res_cond->percent_list,
+						  argv[i]+end))
+				set = 1;
 		} else if (!strncasecmp(argv[i], "ServerType",
-					 MAX(command_len, 2))) {
+					 MAX(command_len, 7))) {
 			if (!res_cond->manager_list) {
 				res_cond->manager_list =
 					list_create(slurm_destroy_char);
@@ -588,6 +597,7 @@ extern int sacctmgr_add_res(int argc, char *argv[])
 			res->count = start_res->count;
 			res->flags = start_res->flags;
 			res->type = start_res->type;
+			res->percent_used = 0;
 
 			xstrfmtcat(res_str, "  %s@%s\n",
 				   res->name, res->server);
@@ -607,6 +617,7 @@ extern int sacctmgr_add_res(int argc, char *argv[])
 				slurmdb_init_res_rec(res, 0);
 				res->id = found_res->id;
 				res->type = found_res->type;
+				res->server = xstrdup(found_res->server);
 				start_used = res->percent_used =
 					found_res->percent_used;
 			}
@@ -887,6 +898,18 @@ extern int sacctmgr_modify_res(int argc, char *argv[])
 		}
 	}
 
+	if (res->count != NO_VAL && res_cond->cluster_list &&
+			list_count(res_cond->cluster_list)) {
+		fprintf(stderr, "Can't change \"count\" on a cluster-based "
+			"resource. Remove cluster selection.\n");
+		return SLURM_ERROR;
+	} else if (res->percent_used != (uint16_t)NO_VAL &&
+			!res_cond->cluster_list) {
+		fprintf(stderr, "Can't change \"percentallowed\" without "
+			"specifying a cluster.\n");
+		return SLURM_ERROR;
+	}
+
 	notice_thread_init();
 	ret_list = acct_storage_g_modify_res(db_conn, my_uid, res_cond, res);
 	notice_thread_fini();