diff --git a/src/slurmctld/acct_policy.c b/src/slurmctld/acct_policy.c
index 474a451fdf49f0ad099b7157d8a7d2a2c970dc67..6b5b20a1ccafd05058192693442e700101d9505f 100644
--- a/src/slurmctld/acct_policy.c
+++ b/src/slurmctld/acct_policy.c
@@ -914,6 +914,53 @@ static bool _validate_tres_limits_for_qos(
 	return true;
 }
 
+/* Only check the time_limits if the admin didn't set
+ * the timelimit.
+ * It is important we look at these even if strict_checking
+ * isn't set so we get the correct time_limit from the job.
+ */
+static bool _validate_time_limit(uint32_t *time_limit_in,
+				 uint32_t part_max_time,
+				 uint64_t tres_req_cnt,
+				 uint64_t max_limit,
+				 uint64_t *out_max_limit,
+				 uint16_t *limit_set_time,
+				 bool strict_checking,
+				 bool is64)
+{
+	uint32_t max_time_limit;
+
+	if (!tres_req_cnt ||
+	    !strict_checking || (*limit_set_time) == ADMIN_SET_LIMIT)
+		return true;
+
+	if (is64) {
+		if (((*out_max_limit) != INFINITE64) ||
+		    (max_limit == INFINITE64) ||
+		    (tres_req_cnt == NO_VAL64))
+			return true;
+	} else {
+		if (((uint32_t)(*out_max_limit) != INFINITE) ||
+		    ((uint32_t)max_limit == INFINITE) ||
+		    ((uint32_t)tres_req_cnt == NO_VAL))
+			return true;
+	}
+
+	max_time_limit = (uint32_t)(max_limit / tres_req_cnt);
+
+	_set_time_limit(time_limit_in, part_max_time, max_time_limit,
+			limit_set_time);
+
+	(*out_max_limit) = max_limit;
+
+	if ((*time_limit_in) > max_time_limit)
+		return false;
+
+	return true;
+}
+
+
+
 /*
  * _validate_tres_time_limits - validate the tres requested
  * against limits of an association as well as qos skipping any limit
@@ -942,7 +989,7 @@ static bool _validate_tres_time_limits(
 	bool strict_checking)
 {
 	int i;
-	uint32_t max_time_limit;
+//	uint32_t max_time_limit;
 
 	if (!strict_checking || (*limit_set_time) == ADMIN_SET_LIMIT)
 		return true;
@@ -950,23 +997,30 @@ static bool _validate_tres_time_limits(
 	for (i = 0; i < g_tres_count; i++) {
 		(*tres_pos) = i;
 
-		if ((out_max_tres_array[i] != INFINITE64) ||
-		    (max_tres_array[i] == INFINITE64) ||
-		    (job_tres_array[i] == NO_VAL64) ||
-		    (job_tres_array[i] == 0))
-			continue;
+		if (!_validate_time_limit(time_limit_in, part_max_time,
+					  job_tres_array[i],
+					  max_tres_array[i],
+					  &out_max_tres_array[i],
+					  limit_set_time,
+					  strict_checking, true))
+			return false;
+		/* if ((out_max_tres_array[i] != INFINITE64) || */
+		/*     (max_tres_array[i] == INFINITE64) || */
+		/*     (job_tres_array[i] == NO_VAL64) || */
+		/*     (job_tres_array[i] == 0)) */
+		/* 	continue; */
 
-		max_time_limit = (uint32_t)(max_tres_array[i] /
-					    job_tres_array[i]);
+		/* max_time_limit = (uint32_t)(max_tres_array[i] / */
+		/* 			    job_tres_array[i]); */
 
-		_set_time_limit(time_limit_in,
-				part_max_time, max_time_limit,
-				limit_set_time);
+		/* _set_time_limit(time_limit_in, */
+		/* 		part_max_time, max_time_limit, */
+		/* 		limit_set_time); */
 
-		out_max_tres_array[i] = max_tres_array[i];
+		/* out_max_tres_array[i] = max_tres_array[i]; */
 
-		if ((*time_limit_in) > max_time_limit)
-			return false;
+		/* if ((*time_limit_in) > max_time_limit) */
+		/* 	return false; */
 	}
 
 	return true;