diff --git a/doc/html/accounting.shtml b/doc/html/accounting.shtml
index b1c1031a3309761751356536c77758b62ee68ae1..7447c02352e50d775e349b95e018364c8ece3abf 100644
--- a/doc/html/accounting.shtml
+++ b/doc/html/accounting.shtml
@@ -226,6 +226,11 @@ prevent users from accessing invalid accounts.
 <li>limits - This will enforce limits set to associations.  By setting
   this option, the 'associations' option is also set.
 </li>
+<li>qos - This will require all jobs to specify (either overtly or by
+default) a valid qos (Quality of Service).  QOS values are defined for
+each association in the database.  By setting this option, the
+'associations' option is also set.
+</li>
 <li>wckeys - This will prevent users from running jobs under a wckey
   that they don't have access to.  By using this option, the
   'associations' option is also set.  The 'TrackWCKey' option is also
diff --git a/doc/html/accounting_storageplugins.shtml b/doc/html/accounting_storageplugins.shtml
index 7bdac1ae5329c866c607cf7f2ffa0ddfc7f3a719..ebe7221031a708700bb761a12bc76dca22a091c6 100644
--- a/doc/html/accounting_storageplugins.shtml
+++ b/doc/html/accounting_storageplugins.shtml
@@ -912,8 +912,8 @@ database with.
 <dt><span class="commandline">AccountingStorageEnforce</span>
 <dd>Specifies if we should enforce certain things be in existence
   before allowing job submissions and such valid options are
-  "associations, limits, and wckeys". You can use any combination of
-  those listed.
+  "associations, limits, qos, and wckeys". You can use any combination
+  of those listed.
 </dl>
 
 <h2>Versioning</h2>
diff --git a/doc/html/resource_limits.shtml b/doc/html/resource_limits.shtml
index afcb619afe1d367054ffa93b09945970f0a9f493..a2e3469ffdf4b4b6a4368356dd82d1ec2442ac58 100644
--- a/doc/html/resource_limits.shtml
+++ b/doc/html/resource_limits.shtml
@@ -52,6 +52,11 @@ prevent users from accessing invalid accounts.
 <li>limits - This will enforce limits set to associations.  By setting
   this option, the 'associations' option is also set.
 </li>
+<li>qos - This will require all jobs to specify (either overtly or by
+default) a valid qos (Quality of Service).  QOS values are defined for
+each association in the database.  By setting this option, the
+'associations' option is also set.
+</li>
 <li>wckeys - This will prevent users from running jobs under a wckey
   that they don't have access to.  By using this option, the
   'associations' option is also set.  The 'TrackWCKey' option is also
diff --git a/doc/man/man1/salloc.1 b/doc/man/man1/salloc.1
index 27129c3ab9b0613bfed33cd0524934d34ba662db..32de207275ec64c788e2c4a509e36ef0d680e784 100644
--- a/doc/man/man1/salloc.1
+++ b/doc/man/man1/salloc.1
@@ -709,6 +709,14 @@ partition as designated by the system administrator.
 \fB\-Q\fR, \fB\-\-quiet\fR
 Suppress informational messages from salloc. Errors will still be displayed.
 
+.TP
+\fB\-\-qos\fR=<\fIqos\fR>
+Request a quality of service for the job.  QOS values can be defined
+for each user/cluster/account association in the SLURM database.
+Users will be limited to their association's defined set of qos's when
+the SLURM configuration parameter, AccountingStorageEnforce, is set to
+"qos".
+
 .TP
 \fB\-\-reservation\fR=<\fIname\fR>
 Allocate resources for the job from the named reservation.
diff --git a/doc/man/man1/sbatch.1 b/doc/man/man1/sbatch.1
index 4ba28c461281938a299d24b3af935ec020671ca8..e6b7234c4f876d12ea44b8346ec782691535d25a 100644
--- a/doc/man/man1/sbatch.1
+++ b/doc/man/man1/sbatch.1
@@ -796,6 +796,14 @@ The maximum stack size
 \fB\-Q\fR, \fB\-\-quiet\fR
 Suppress informational messages from sbatch. Errors will still be displayed.
 
+.TP
+\fB\-\-qos\fR=<\fIqos\fR>
+Request a quality of service for the job.  QOS values can be defined
+for each user/cluster/account association in the SLURM database.
+Users will be limited to their association's defined set of qos's when
+the SLURM configuration parameter, AccountingStorageEnforce, is set to
+"qos".
+
 .TP
 \fB\-\-requeue\fR
 Specifies that the batch job should be requeued after node failure.
diff --git a/doc/man/man1/srun.1 b/doc/man/man1/srun.1
index cd3266d164c33fc6ea420df31a20025d21bb1aa5..997f7d1f77417559ef6dfb4dc896a28d08110d78 100644
--- a/doc/man/man1/srun.1
+++ b/doc/man/man1/srun.1
@@ -884,6 +884,14 @@ disables the status feature normally available when \fBsrun\fR receives
 a single Ctrl\-C and causes \fBsrun\fR to instead immediately terminate the
 running job. 
 
+.TP
+\fB\-\-qos\fR=<\fIqos\fR>
+Request a quality of service for the job.  QOS values can be defined
+for each user/cluster/account association in the SLURM database.
+Users will be limited to their association's defined set of qos's when
+the SLURM configuration parameter, AccountingStorageEnforce, is set to
+"qos".
+
 .TP
 \fB\-r\fR, \fB\-\-relative\fR=<\fIn\fR>
 Run a job step relative to node \fIn\fR of the current allocation. 
diff --git a/src/api/job_info.c b/src/api/job_info.c
index a2679fe7b03a2623718ed9833a79be4d3cddb3fc..61bf810097b0c37d4fe1b14e2c5e96b67ca70678 100644
--- a/src/api/job_info.c
+++ b/src/api/job_info.c
@@ -522,9 +522,8 @@ line7:	/****** Line 7 ******/
 
 	/****** Line 11 ******/
 	snprintf(tmp_line, sizeof(tmp_line), 
-		"Dependency=%s Account=%s Requeue=%u Restarts=%u",
-		job_ptr->dependency, job_ptr->account, job_ptr->requeue,
-		job_ptr->restart_cnt);
+		"Dependency=%s Requeue=%u Restarts=%u",
+		job_ptr->dependency, job_ptr->requeue, job_ptr->restart_cnt);
 	xstrcat(out, tmp_line);
 	if (one_liner)
 		xstrcat(out, " ");
@@ -532,6 +531,16 @@ line7:	/****** Line 7 ******/
 		xstrcat(out, "\n   ");
 
 	/****** Line 12 ******/
+	snprintf(tmp_line, sizeof(tmp_line), 
+		"Account=%s QOS=%s",
+		job_ptr->account, job_ptr->qos);
+	xstrcat(out, tmp_line);
+	if (one_liner)
+		xstrcat(out, " ");
+	else
+		xstrcat(out, "\n   ");
+
+	/****** Line 13 ******/
 	if (job_ptr->state_desc) {
 		/* Replace white space with underscore for easier parsing */
 		for (j=0; job_ptr->state_desc[j]; j++) {
@@ -550,7 +559,7 @@ line7:	/****** Line 7 ******/
 	else
 		xstrcat(out, "\n   ");
 
-	/****** Line 13 ******/
+	/****** Line 14 ******/
 	snprintf(tmp_line, sizeof(tmp_line), "Req%s=%s Req%sIndices=", 
 		nodelist, job_ptr->req_nodes, nodelist);
 	xstrcat(out, tmp_line);
@@ -567,7 +576,7 @@ line7:	/****** Line 7 ******/
 	else
 		xstrcat(out, "\n   ");
 
-	/****** Line 14 ******/
+	/****** Line 15 ******/
 	snprintf(tmp_line, sizeof(tmp_line), "Exc%s=%s Exc%sIndices=", 
 		nodelist, job_ptr->exc_nodes, nodelist);
 	xstrcat(out, tmp_line);
@@ -584,7 +593,7 @@ line7:	/****** Line 7 ******/
 	else
 		xstrcat(out, "\n   ");
 
-	/****** Line 15 ******/
+	/****** Line 16 ******/
 	slurm_make_time_str((time_t *)&job_ptr->submit_time, time_str, 
 		sizeof(time_str));
 	snprintf(tmp_line, sizeof(tmp_line), "SubmitTime=%s ", 
@@ -600,7 +609,7 @@ line7:	/****** Line 7 ******/
 		  time_str, (long int)job_ptr->pre_sus_time);
 	xstrcat(out, tmp_line);
 
-	/****** Lines 16, 17 (optional, batch only) ******/
+	/****** Lines 17, 18 (optional, batch only) ******/
 	if (job_ptr->batch_flag) {
 		if (one_liner)
 			xstrcat(out, " ");
@@ -617,7 +626,7 @@ line7:	/****** Line 7 ******/
 		xstrcat(out, tmp_line);
 	}
 
-	/****** Line 18 (optional) ******/
+	/****** Line 19 (optional) ******/
 	if (job_ptr->comment) {
 		if (one_liner)
 			xstrcat(out, " ");
@@ -628,7 +637,7 @@ line7:	/****** Line 7 ******/
 		xstrcat(out, tmp_line);
 	}
 
-	/****** Line 19 (optional) ******/
+	/****** Line 20 (optional) ******/
 	select_g_select_jobinfo_sprint(job_ptr->select_jobinfo,
 				select_buf, sizeof(select_buf),
 				SELECT_PRINT_MIXED);
@@ -640,7 +649,7 @@ line7:	/****** Line 7 ******/
 		xstrcat(out, select_buf);
 	}
 #ifdef HAVE_BG
-	/****** Line 20 (optional) ******/
+	/****** Line 21 (optional) ******/
 	select_g_select_jobinfo_sprint(job_ptr->select_jobinfo,
 				select_buf, sizeof(select_buf),
 				SELECT_PRINT_BLRTS_IMAGE);
@@ -653,7 +662,7 @@ line7:	/****** Line 7 ******/
 			 "BlrtsImage=%s", select_buf);
 		xstrcat(out, tmp_line);
 	}
-	/****** Line 21 (optional) ******/
+	/****** Line 22 (optional) ******/
 	select_g_select_jobinfo_sprint(job_ptr->select_jobinfo,
 				select_buf, sizeof(select_buf),
 				SELECT_PRINT_LINUX_IMAGE);
@@ -671,7 +680,7 @@ line7:	/****** Line 7 ******/
 #endif
 		xstrcat(out, tmp_line);
 	}
-	/****** Line 22 (optional) ******/
+	/****** Line 23 (optional) ******/
 	select_g_select_jobinfo_sprint(job_ptr->select_jobinfo,
 				select_buf, sizeof(select_buf),
 				SELECT_PRINT_MLOADER_IMAGE);
@@ -684,7 +693,7 @@ line7:	/****** Line 7 ******/
 			 "MloaderImage=%s", select_buf);
 		xstrcat(out, tmp_line);
 	}
-	/****** Line 23 (optional) ******/
+	/****** Line 24 (optional) ******/
 	select_g_select_jobinfo_sprint(job_ptr->select_jobinfo,
 				select_buf, sizeof(select_buf),
 				SELECT_PRINT_RAMDISK_IMAGE);
diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index 6db15a84cb62c85f47a92c1bec72356c7e675518..534622158ee0c33173c43e98b78611b7928dfea6 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -4198,7 +4198,11 @@ void pack_job(struct job_record *dump_job_ptr, uint16_t show_flags, Buf buffer)
 	packstr(dump_job_ptr->comment, buffer);
 	
 	slurm_mutex_lock(&assoc_mgr_qos_lock);
-	packstr(acct_qos_str(assoc_mgr_qos_list, dump_job_ptr->qos), buffer);
+	if (assoc_mgr_qos_list)
+		packstr(acct_qos_str(assoc_mgr_qos_list, dump_job_ptr->qos),
+			buffer);
+	else
+		packstr(NULL, buffer);
 	slurm_mutex_unlock(&assoc_mgr_qos_lock);
 
 	packstr(dump_job_ptr->licenses, buffer);