diff --git a/presubmit/query.go b/presubmit/query.go
index 3a072e6..7937f3f 100644
--- a/presubmit/query.go
+++ b/presubmit/query.go
@@ -67,15 +67,13 @@
 		printf(jirix.Stdout(), "%d sent.\n", numSentCLs)
 	}()
 
-	// Load Jenkins matrix jobs config.
-	config, err := tooldata.LoadConfig(jirix)
+	jenkinsObj, err := jirix.Jenkins(jenkinsHostFlag)
 	if err != nil {
 		return err
 	}
-	matrixJobsConf := config.JenkinsMatrixJobs()
 
 	// Don't query anything if the last "presubmit-test" build failed.
-	lastBuildInfo, err := lastCompletedBuildStatus(jirix, presubmitTestJobFlag, axisValuesInfo{}, matrixJobsConf)
+	lastBuildInfo, err := jenkinsObj.LastCompletedBuildStatus(presubmitTestJobFlag, nil)
 	if err != nil {
 		fmt.Fprintf(jirix.Stderr(), "%v\n", err)
 	} else {
diff --git a/presubmit/result.go b/presubmit/result.go
index fcaa86a..1eb114e 100644
--- a/presubmit/result.go
+++ b/presubmit/result.go
@@ -112,36 +112,18 @@
 	PartIndex int
 }
 
-// genBuildSpec returns a spec string for the given Jenkins build.
-//
-// If the main job is a multi-configuration job, the spec is in the form of:
-// <jobName>/axis1Label=axis1Value,axis2Label=axis2Value,.../<suffix>
-// The axis values are taken from the given axisValuesInfo object, and only
-// the axes set in the job's axisInfo object will appear in the spec.
-//
-// If the main job is not a multi-configuration job, the spec will be:
-// <jobName>/<suffix>.
-func genBuildSpec(jobName string, axisValues axisValuesInfo, suffix string, matrixJobsConf map[string]tooldata.JenkinsMatrixJobInfo) string {
-	axis, ok := matrixJobsConf[jobName]
-
-	// Not a multi-configuration job.
-	if !ok {
-		return fmt.Sprintf("%s/%s", jobName, suffix)
+func (avi *axisValuesInfo) AsMap(jobInfo tooldata.JenkinsMatrixJobInfo) map[string]string {
+	jobArgs := map[string]string{}
+	if jobInfo.HasArch {
+		jobArgs["ARCH"] = avi.Arch
 	}
-
-	// Multi-configuration job.
-	// The axis order doesn't matter.
-	parts := []string{}
-	if axis.HasArch {
-		parts = append(parts, fmt.Sprintf("ARCH=%s", axisValues.Arch))
+	if jobInfo.HasOS {
+		jobArgs["OS"] = avi.OS
 	}
-	if axis.HasOS {
-		parts = append(parts, fmt.Sprintf("OS=%s", axisValues.OS))
+	if jobInfo.HasParts {
+		jobArgs["P"] = fmt.Sprintf("%d", avi.PartIndex)
 	}
-	if axis.HasParts {
-		parts = append(parts, fmt.Sprintf("P=%d", axisValues.PartIndex))
-	}
-	return fmt.Sprintf("%s/%s/%s", jobName, strings.Join(parts, ","), suffix)
+	return jobArgs
 }
 
 // genSubJobLabel returns a descriptive label for given Jenkins job's sub-job.
@@ -271,10 +253,13 @@
 	for _, resultInfo := range testResults {
 		name := resultInfo.TestName
 		timestamp := resultInfo.Timestamp
-		axisValues := resultInfo.AxisValues
 		fmt.Fprintf(jirix.Stdout(), "Getting postsubmit build info for %q before timestamp %d...\n", resultInfo.key(), timestamp)
 
-		buildInfo, err := lastCompletedBuildStatus(jirix, name, axisValues, matrixJobsConf)
+		var axisValuesMap map[string]string
+		if jobInfo, ok := matrixJobsConf[name]; ok {
+			axisValuesMap = resultInfo.AxisValues.AsMap(jobInfo)
+		}
+		buildInfo, err := jenkinsObj.LastCompletedBuildStatus(name, axisValuesMap)
 		if err != nil {
 			test.Fail(jirix.Context, "%v\n", err)
 			continue
@@ -287,7 +272,7 @@
 		}
 		for i := curId; i >= 0; i-- {
 			fmt.Fprintf(jirix.Stdout(), "Checking build %d...\n", i)
-			buildSpec := genBuildSpec(name, resultInfo.AxisValues, fmt.Sprintf("%d", i), matrixJobsConf)
+			buildSpec := jenkins.GenBuildSpec(name, axisValuesMap, fmt.Sprintf("%d", i))
 			curBuildInfo, err := jenkinsObj.BuildInfoForSpec(buildSpec)
 			if err != nil {
 				test.Fail(jirix.Context, "%v\n", err)
@@ -541,22 +526,6 @@
 	return testFailed
 }
 
-// lastCompletedBuildStatus gets the status of the last completed
-// build for a given Jenkins job.
-func lastCompletedBuildStatus(jirix *jiri.X, jobName string, axisValues axisValuesInfo, matrixJobsConf map[string]tooldata.JenkinsMatrixJobInfo) (*jenkins.BuildInfo, error) {
-	jenkins, err := jirix.Jenkins(jenkinsHostFlag)
-	if err != nil {
-		return nil, err
-	}
-
-	buildSpec := genBuildSpec(jobName, axisValues, "lastCompletedBuild", matrixJobsConf)
-	buildInfo, err := jenkins.BuildInfoForSpec(buildSpec)
-	if err != nil {
-		return nil, err
-	}
-	return buildInfo, nil
-}
-
 type failureType int
 
 const (
