diff --git a/third_party/cq_client/README.depot_tools.md b/third_party/cq_client/README.depot_tools.md
new file mode 100644
index 0000000000000000000000000000000000000000..eb3c04bb38ac67aa9eb30ce72258678bbdf66337
--- /dev/null
+++ b/third_party/cq_client/README.depot_tools.md
@@ -0,0 +1,2 @@
+Import of CQ protobuf config from infra_internal repo.
+Version: fde09c7a7b5e47b94a6aeffa24c8f339df0517a8 from Dec 19, 2016.
diff --git a/third_party/cq_client/README.md b/third_party/cq_client/README.md
index d3a264f0268c9e5ffb4fdde5f94bb78dc64cf588..d82f504aae8e1d332a4440ea9be54e173fa2c231 100644
--- a/third_party/cq_client/README.md
+++ b/third_party/cq_client/README.md
@@ -39,7 +39,7 @@ infra/infra repository and go utilities `make go-prepare`.
 
 ## Notes
 
-1. Please make sure to use proto3-compatible yntax, e.g. no default
+1. Please make sure to use proto3-compatible syntax, e.g. no default
 values, no required fields. As of this writing (Jan 2016),
 the Go protobuf compiler has been upgraded to 3.0.0. So, if you can generate go
 bindings, all is good.
diff --git a/third_party/cq_client/cq.pb.go b/third_party/cq_client/cq.pb.go
index 386053ca17d4423a754aafe9e4f00fee33e25f3b..166e4653a08369b9c156ed40bc263c016d00ce75 100644
--- a/third_party/cq_client/cq.pb.go
+++ b/third_party/cq_client/cq.pb.go
@@ -25,6 +25,12 @@ var _ = proto.Marshal
 var _ = fmt.Errorf
 var _ = math.Inf
 
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
+
 // This message describes a Commit Queue configuration. The config file cq.cfg
 // should be stored in the config directory located on the branch that this CQ
 // should commit to.
@@ -36,43 +42,40 @@ type Config struct {
 	// name for CLs on Rietveld, name of the project in the status app, internal
 	// name for logging etc. CQ name should not be confused with the project name
 	// in LUCI as there may be multiple CQs per project.
-	CqName *string `protobuf:"bytes,2,opt,name=cq_name" json:"cq_name,omitempty"`
+	CqName *string `protobuf:"bytes,2,opt,name=cq_name,json=cqName" json:"cq_name,omitempty"`
 	// List of verifiers that verify if the CL is ready to be committed.
 	Verifiers *Verifiers `protobuf:"bytes,3,opt,name=verifiers" json:"verifiers,omitempty"`
 	// URL of the CQ status app to push updates to.
-	CqStatusUrl *string `protobuf:"bytes,4,opt,name=cq_status_url" json:"cq_status_url,omitempty"`
-	// When true, hash of the commit is not posted by CQ. This is used for
-	// projects using gnumbd as latter publishes actual hash later. Default value
-	// is false.
-	HideRefInCommittedMsg *bool `protobuf:"varint,5,opt,name=hide_ref_in_committed_msg" json:"hide_ref_in_committed_msg,omitempty"`
+	CqStatusUrl *string `protobuf:"bytes,4,opt,name=cq_status_url,json=cqStatusUrl" json:"cq_status_url,omitempty"`
+	// DO NOT USE. Kept here for validator error messages.
+	HideRefInCommittedMsg *bool `protobuf:"varint,5,opt,name=hide_ref_in_committed_msg,json=hideRefInCommittedMsg" json:"hide_ref_in_committed_msg,omitempty"`
 	// Delay between commit bursts in seconds. Default value is 480.
-	CommitBurstDelay *int32 `protobuf:"varint,6,opt,name=commit_burst_delay" json:"commit_burst_delay,omitempty"`
+	CommitBurstDelay *int32 `protobuf:"varint,6,opt,name=commit_burst_delay,json=commitBurstDelay" json:"commit_burst_delay,omitempty"`
 	// Maximum number of commits done sequentially, before waiting for
 	// commit_burst_delay. Default value is 4.
-	MaxCommitBurst *int32 `protobuf:"varint,7,opt,name=max_commit_burst" json:"max_commit_burst,omitempty"`
+	MaxCommitBurst *int32 `protobuf:"varint,7,opt,name=max_commit_burst,json=maxCommitBurst" json:"max_commit_burst,omitempty"`
 	// Defines whether a CQ is used in production. Allows to disable CQ for a
 	// given branch. Default is true.
-	InProduction *bool `protobuf:"varint,8,opt,name=in_production" json:"in_production,omitempty"`
+	InProduction *bool `protobuf:"varint,8,opt,name=in_production,json=inProduction" json:"in_production,omitempty"`
 	// Configuration options for Rietveld code review.
 	Rietveld *Rietveld `protobuf:"bytes,9,opt,name=rietveld" json:"rietveld,omitempty"`
-	// EXPERIMENTAL! Configuration options for Gerrit code review.
-	// TODO(tandrii): update this doc (GERRIT).
+	// Configuration options for Gerrit code review.
 	Gerrit *Gerrit `protobuf:"bytes,15,opt,name=gerrit" json:"gerrit,omitempty"`
 	// This can be used to override the Git repository URL used to checkout and
 	// commit changes on CQ host. This should only be used in case, when the
 	// source repository is not supported by luci-config (e.g. GitHub).
-	GitRepoUrl *string `protobuf:"bytes,10,opt,name=git_repo_url" json:"git_repo_url,omitempty"`
+	GitRepoUrl *string `protobuf:"bytes,10,opt,name=git_repo_url,json=gitRepoUrl" json:"git_repo_url,omitempty"`
 	// Target ref to commit to. This can be used to specify a different ref than
 	// the one where the luci config is located. This is useful, e.g. for projects
 	// that use gnumbd where CQ should commit into a pending ref.
-	TargetRef *string `protobuf:"bytes,11,opt,name=target_ref" json:"target_ref,omitempty"`
-	// Deprecated. URL of the SVN repository. We are deprecating SVN support.
-	SvnRepoUrl *string `protobuf:"bytes,12,opt,name=svn_repo_url" json:"svn_repo_url,omitempty"`
+	TargetRef *string `protobuf:"bytes,11,opt,name=target_ref,json=targetRef" json:"target_ref,omitempty"`
+	// DO NOT USE. Kept here for validator error messages.
+	SvnRepoUrl *string `protobuf:"bytes,12,opt,name=svn_repo_url,json=svnRepoUrl" json:"svn_repo_url,omitempty"`
 	// If present, the CQ will refrain from processing any commits whose start
 	// time is >= this time.
 	//
 	// This is an UTC RFC3339 (stiptime(tm)) string representing the time.
-	DrainingStartTime *string `protobuf:"bytes,13,opt,name=draining_start_time" json:"draining_start_time,omitempty"`
+	DrainingStartTime *string `protobuf:"bytes,13,opt,name=draining_start_time,json=drainingStartTime" json:"draining_start_time,omitempty"`
 	XXX_unrecognized  []byte  `json:"-"`
 }
 
@@ -182,12 +185,8 @@ func (m *Config) GetDrainingStartTime() string {
 type Rietveld struct {
 	// Required. URL of the codereview site.
 	Url *string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"`
-	// List of regular expressions used to check if CL's base URL should be
-	// processed by this CQ. This may be useful if a single branch has multiple
-	// sub-directories that are handled by different CQs. When no regular
-	// expressions are specified, the regular expression '.*', which matches any
-	// directory, is used.
-	ProjectBases     []string `protobuf:"bytes,2,rep,name=project_bases" json:"project_bases,omitempty"`
+	// DO NOT USE. Kept here for validator error messages.
+	ProjectBases     []string `protobuf:"bytes,2,rep,name=project_bases,json=projectBases" json:"project_bases,omitempty"`
 	XXX_unrecognized []byte   `json:"-"`
 }
 
@@ -210,15 +209,10 @@ func (m *Rietveld) GetProjectBases() []string {
 	return nil
 }
 
-// Gerrit CQ is EXPERIMENTAL! See http://crbug.com/493899 for more info.
-//
 // Unlike Rietveld, Gerrit doesn't need a separate url.
 // Instead, the git_repo_url must be specified on the Gerrit instance,
 // and CQ will deduce Gerrit url from it.
 //
-// TODO(tandrii): support Rietveld and Gerrit at the same time.
-// This basically requires to start two CQ instances, instead of one.
-//
 // For example, if https://chromium.googlesource.com/infra/infra.git is your
 // repo url provided in `git_repo_url` above, then
 // https://chromium-review.googlesource.com/#/admin/projects/infra/infra should
@@ -230,14 +224,20 @@ func (m *Rietveld) GetProjectBases() []string {
 // see it. This will come handy to enable and customize the CQ-related workflows
 // for your project.
 type Gerrit struct {
-	// Optional. If set, tells CQ vote on a given label to mark result of CQ run.
-	// The vote is either -1 if failed or 1 on success, and will be given on
+	// Optional. If set, tells CQ to vote on a given label to mark result of CQ
+	// run.  The vote is either -1 if failed or 1 on success, and will be given on
 	// non-dry runs only.
 	// This vote can then be used in Gerrit's rule for submitting issues, so as to
 	// require CQ run. CQ will attempt to submit issue only after setting this
 	// label.
-	CqVerifiedLabel  *string `protobuf:"bytes,1,opt,name=cq_verified_label" json:"cq_verified_label,omitempty"`
-	XXX_unrecognized []byte  `json:"-"`
+	CqVerifiedLabel *string `protobuf:"bytes,1,opt,name=cq_verified_label,json=cqVerifiedLabel" json:"cq_verified_label,omitempty"`
+	// Optional and only allowed if cq_verified_label is set. Default: False.
+	// If set, tells CQ to vote on the Verified label even on dry run.
+	// This is useful if CQ has no presubmit builders, as dry run would be
+	// totally equivalent to full run, except that CQ won't try to actually submit
+	// the code.
+	DryRunSetsCqVerifiedLabel *bool  `protobuf:"varint,2,opt,name=dry_run_sets_cq_verified_label,json=dryRunSetsCqVerifiedLabel" json:"dry_run_sets_cq_verified_label,omitempty"`
+	XXX_unrecognized          []byte `json:"-"`
 }
 
 func (m *Gerrit) Reset()                    { *m = Gerrit{} }
@@ -252,6 +252,13 @@ func (m *Gerrit) GetCqVerifiedLabel() string {
 	return ""
 }
 
+func (m *Gerrit) GetDryRunSetsCqVerifiedLabel() bool {
+	if m != nil && m.DryRunSetsCqVerifiedLabel != nil {
+		return *m.DryRunSetsCqVerifiedLabel
+	}
+	return false
+}
+
 // Verifiers are various types of checks that a Commit Queue performs on a CL.
 // All verifiers must pass in order for a CL to be landed. Configuration file
 // describes types of verifiers that should be applied to each CL and their
@@ -259,19 +266,21 @@ func (m *Gerrit) GetCqVerifiedLabel() string {
 type Verifiers struct {
 	// This verifier is used to ensure that an LGTM was posted to the code review
 	// site from a valid project committer.
-	// This verifier is not supported with Gerrit.
-	ReviewerLgtm *Verifiers_ReviewerLgtmVerifier `protobuf:"bytes,1,opt,name=reviewer_lgtm" json:"reviewer_lgtm,omitempty"`
+	// It is ignored in case of Gerrit, and you should not declare it unless you
+	// use both Gerrit and Rietveld for codereview. Unlike Rietveld, Gerrit has
+	// its own ACL system which should be set up by project admins.
+	ReviewerLgtm *Verifiers_ReviewerLgtmVerifier `protobuf:"bytes,1,opt,name=reviewer_lgtm,json=reviewerLgtm" json:"reviewer_lgtm,omitempty"`
 	// This verifier is used to check tree status before committing a CL. If the
 	// tree is closed, then the verifier will wait until it is reopened.
-	TreeStatus *Verifiers_TreeStatusLgtmVerifier `protobuf:"bytes,2,opt,name=tree_status" json:"tree_status,omitempty"`
+	TreeStatus *Verifiers_TreeStatusLgtmVerifier `protobuf:"bytes,2,opt,name=tree_status,json=treeStatus" json:"tree_status,omitempty"`
 	// This verifier triggers a set of tryjobs that are to be run on builders on
 	// Buildbot. It automatically retries failed try-jobs and only allows CL to
 	// land if each builder has succeeded in the latest retry. If a given tryjob
 	// result is too old (>1 day) it is ignored.
-	TryJob *Verifiers_TryJobVerifier `protobuf:"bytes,3,opt,name=try_job" json:"try_job,omitempty"`
+	TryJob *Verifiers_TryJobVerifier `protobuf:"bytes,3,opt,name=try_job,json=tryJob" json:"try_job,omitempty"`
 	// This verifier is used to ensure that the author has signed Google's
 	// Contributor License Agreement.
-	SignCla          *Verifiers_SignCLAVerifier `protobuf:"bytes,4,opt,name=sign_cla" json:"sign_cla,omitempty"`
+	SignCla          *Verifiers_SignCLAVerifier `protobuf:"bytes,4,opt,name=sign_cla,json=signCla" json:"sign_cla,omitempty"`
 	XXX_unrecognized []byte                     `json:"-"`
 }
 
@@ -312,20 +321,20 @@ type Verifiers_ReviewerLgtmVerifier struct {
 	// Required. Name of the chrome-infra-auth group, which contains the list of
 	// identities authorized to approve (lgtm) a CL and trigger CQ run or dry
 	// run.
-	CommitterList *string `protobuf:"bytes,1,opt,name=committer_list" json:"committer_list,omitempty"`
+	CommitterList *string `protobuf:"bytes,1,opt,name=committer_list,json=committerList" json:"committer_list,omitempty"`
 	// Number of seconds to wait for LGTM on CQ. Default value is 0.
-	MaxWaitSecs *int32 `protobuf:"varint,2,opt,name=max_wait_secs" json:"max_wait_secs,omitempty"`
+	MaxWaitSecs *int32 `protobuf:"varint,2,opt,name=max_wait_secs,json=maxWaitSecs" json:"max_wait_secs,omitempty"`
 	// Message to be posted to code review site when no LGTM is found. Default
 	// value is "No LGTM from a valid reviewer yet. Only full committers are "
 	// "accepted.\nEven if an LGTM may have been provided, it was from a "
 	// "non-committer,\n_not_ a full super star committer.\nSee "
 	// "http://www.chromium.org/getting-involved/become-a-committer\nNote that "
 	// "this has nothing to do with OWNERS files."
-	NoLgtmMsg *string `protobuf:"bytes,3,opt,name=no_lgtm_msg" json:"no_lgtm_msg,omitempty"`
+	NoLgtmMsg *string `protobuf:"bytes,3,opt,name=no_lgtm_msg,json=noLgtmMsg" json:"no_lgtm_msg,omitempty"`
 	// Optional, but recommended. Name of the chrome-infra-auth group,
 	// which contains the list of identities authorized to trigger CQ dry run.
 	// This is usually the same group as tryjob-access.
-	DryRunAccessList *string `protobuf:"bytes,4,opt,name=dry_run_access_list" json:"dry_run_access_list,omitempty"`
+	DryRunAccessList *string `protobuf:"bytes,4,opt,name=dry_run_access_list,json=dryRunAccessList" json:"dry_run_access_list,omitempty"`
 	XXX_unrecognized []byte  `json:"-"`
 }
 
@@ -366,7 +375,7 @@ func (m *Verifiers_ReviewerLgtmVerifier) GetDryRunAccessList() string {
 
 type Verifiers_TreeStatusLgtmVerifier struct {
 	// Required. URL of the project tree status app.
-	TreeStatusUrl    *string `protobuf:"bytes,1,opt,name=tree_status_url" json:"tree_status_url,omitempty"`
+	TreeStatusUrl    *string `protobuf:"bytes,1,opt,name=tree_status_url,json=treeStatusUrl" json:"tree_status_url,omitempty"`
 	XXX_unrecognized []byte  `json:"-"`
 }
 
@@ -389,7 +398,7 @@ type Verifiers_TryJobVerifier struct {
 	Buckets []*Verifiers_TryJobVerifier_Bucket `protobuf:"bytes,1,rep,name=buckets" json:"buckets,omitempty"`
 	// Provides project specific trybot retry configuration. This overrides the
 	// defaults used in the CQ.
-	TryJobRetryConfig *Verifiers_TryJobVerifier_TryJobRetryConfig `protobuf:"bytes,2,opt,name=try_job_retry_config" json:"try_job_retry_config,omitempty"`
+	TryJobRetryConfig *Verifiers_TryJobVerifier_TryJobRetryConfig `protobuf:"bytes,2,opt,name=try_job_retry_config,json=tryJobRetryConfig" json:"try_job_retry_config,omitempty"`
 	XXX_unrecognized  []byte                                      `json:"-"`
 }
 
@@ -418,12 +427,12 @@ type Verifiers_TryJobVerifier_Builder struct {
 	// Optionally specify a builder name that triggers the given builder.
 	// Otherwise, CQ will trigger this builder (default). If in doubt, you
 	// probably won't need this.
-	TriggeredBy *string `protobuf:"bytes,2,opt,name=triggered_by" json:"triggered_by,omitempty"`
+	TriggeredBy *string `protobuf:"bytes,2,opt,name=triggered_by,json=triggeredBy" json:"triggered_by,omitempty"`
 	// When this field is present, it marks given builder as experimental. It
 	// is only executed on a given percentage of the CLs and the outcome does
 	// not affect the decicion whether a CL can land or not. This is typically
 	// used to test new builders and estimate their capacity requirements.
-	ExperimentPercentage *float32 `protobuf:"fixed32,4,opt,name=experiment_percentage" json:"experiment_percentage,omitempty"`
+	ExperimentPercentage *float32 `protobuf:"fixed32,4,opt,name=experiment_percentage,json=experimentPercentage" json:"experiment_percentage,omitempty"`
 	XXX_unrecognized     []byte   `json:"-"`
 }
 
@@ -488,15 +497,15 @@ func (m *Verifiers_TryJobVerifier_Bucket) GetBuilders() []*Verifiers_TryJobVerif
 
 type Verifiers_TryJobVerifier_TryJobRetryConfig struct {
 	// Retry quota for a single tryjob.
-	TryJobRetryQuota *int32 `protobuf:"varint,1,opt,name=try_job_retry_quota" json:"try_job_retry_quota,omitempty"`
+	TryJobRetryQuota *int32 `protobuf:"varint,1,opt,name=try_job_retry_quota,json=tryJobRetryQuota" json:"try_job_retry_quota,omitempty"`
 	// Retry quota for all tryjobs in a CL.
-	GlobalRetryQuota *int32 `protobuf:"varint,2,opt,name=global_retry_quota" json:"global_retry_quota,omitempty"`
+	GlobalRetryQuota *int32 `protobuf:"varint,2,opt,name=global_retry_quota,json=globalRetryQuota" json:"global_retry_quota,omitempty"`
 	// The weight assigned to each tryjob failure.
-	FailureRetryWeight *int32 `protobuf:"varint,3,opt,name=failure_retry_weight" json:"failure_retry_weight,omitempty"`
+	FailureRetryWeight *int32 `protobuf:"varint,3,opt,name=failure_retry_weight,json=failureRetryWeight" json:"failure_retry_weight,omitempty"`
 	// The weight assigned to each transient failure.
-	TransientFailureRetryWeight *int32 `protobuf:"varint,4,opt,name=transient_failure_retry_weight" json:"transient_failure_retry_weight,omitempty"`
+	TransientFailureRetryWeight *int32 `protobuf:"varint,4,opt,name=transient_failure_retry_weight,json=transientFailureRetryWeight" json:"transient_failure_retry_weight,omitempty"`
 	// The weight assigned to tryjob timeouts.
-	TimeoutRetryWeight *int32 `protobuf:"varint,5,opt,name=timeout_retry_weight" json:"timeout_retry_weight,omitempty"`
+	TimeoutRetryWeight *int32 `protobuf:"varint,5,opt,name=timeout_retry_weight,json=timeoutRetryWeight" json:"timeout_retry_weight,omitempty"`
 	XXX_unrecognized   []byte `json:"-"`
 }
 
@@ -569,49 +578,68 @@ func init() {
 	proto.RegisterType((*Verifiers_SignCLAVerifier)(nil), "Verifiers.SignCLAVerifier")
 }
 
+func init() { proto.RegisterFile("cq.proto", fileDescriptor0) }
+
 var fileDescriptor0 = []byte{
-	// 687 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x54, 0xdd, 0x4e, 0xdb, 0x4c,
-	0x10, 0x55, 0x08, 0x49, 0x9c, 0x31, 0x90, 0x0f, 0x13, 0xc0, 0x98, 0xaf, 0x2d, 0x50, 0xa9, 0xaa,
-	0xda, 0xca, 0x12, 0xa9, 0xd4, 0xfb, 0xc2, 0x45, 0xd5, 0x96, 0x2b, 0xa8, 0x7a, 0xbb, 0x5a, 0xdb,
-	0x13, 0xb3, 0xd4, 0x3f, 0xb0, 0xbb, 0x4e, 0xc8, 0x5b, 0xf5, 0x81, 0x7a, 0xd7, 0x47, 0xe8, 0x0b,
-	0x74, 0xbc, 0x76, 0x7e, 0x4b, 0xae, 0x6c, 0xcf, 0x39, 0x33, 0x9e, 0x39, 0x73, 0x76, 0xc1, 0x0a,
-	0x1f, 0xfc, 0x7b, 0x99, 0xeb, 0xfc, 0xec, 0xf7, 0x06, 0xb4, 0x2f, 0xf3, 0x6c, 0x28, 0x62, 0xa7,
-	0x07, 0x9d, 0x11, 0x4a, 0x25, 0xf2, 0xcc, 0x6d, 0x9c, 0x34, 0x5e, 0xb7, 0xca, 0x40, 0xf8, 0xc0,
-	0x32, 0x9e, 0xa2, 0xbb, 0x41, 0x81, 0xae, 0xf3, 0x0c, 0xba, 0xc4, 0x10, 0x43, 0x41, 0x34, 0xb7,
-	0x49, 0x21, 0x7b, 0x00, 0xfe, 0xf7, 0x69, 0xc4, 0xd9, 0x87, 0x6d, 0xe2, 0x2b, 0xcd, 0x75, 0xa1,
-	0x58, 0x21, 0x13, 0x77, 0xd3, 0x64, 0x9d, 0xc2, 0xd1, 0xad, 0x88, 0x90, 0x49, 0x1c, 0x32, 0x91,
-	0xb1, 0x30, 0x4f, 0x53, 0xa1, 0x35, 0x46, 0x2c, 0x55, 0xb1, 0xdb, 0x22, 0x8a, 0xe5, 0x78, 0xe0,
-	0x54, 0x61, 0x16, 0x14, 0x52, 0x69, 0x16, 0x61, 0xc2, 0x27, 0x6e, 0xdb, 0x74, 0xe1, 0xc2, 0x7f,
-	0x29, 0x7f, 0x64, 0x8b, 0xb8, 0xdb, 0x31, 0x08, 0xfd, 0x8f, 0xea, 0xd1, 0x1c, 0x51, 0x11, 0xea,
-	0xb2, 0x6d, 0xcb, 0x14, 0x3b, 0x06, 0x4b, 0x0a, 0xd4, 0x23, 0x4c, 0x22, 0xb7, 0x6b, 0x9a, 0xec,
-	0xfa, 0xd7, 0x75, 0xc0, 0x39, 0x84, 0x76, 0x8c, 0x52, 0x0a, 0xed, 0xf6, 0x0c, 0xd4, 0xf1, 0x3f,
-	0x99, 0x4f, 0xa7, 0x0f, 0x5b, 0x31, 0xd5, 0x97, 0x78, 0x9f, 0x9b, 0xde, 0xc1, 0xf4, 0xee, 0x00,
-	0x68, 0x2e, 0x63, 0x2c, 0x81, 0xa1, 0x6b, 0x9b, 0x18, 0x31, 0xd5, 0x28, 0x9b, 0x33, 0xb7, 0x4c,
-	0xf4, 0x18, 0xf6, 0x22, 0xc9, 0x45, 0x26, 0xb2, 0xb8, 0x94, 0x40, 0x6a, 0xa6, 0x05, 0x09, 0xb7,
-	0x5d, 0x82, 0x67, 0x3e, 0x58, 0xb3, 0x0e, 0x6c, 0x68, 0x96, 0x59, 0x0d, 0x93, 0x45, 0x23, 0x50,
-	0xff, 0x77, 0x18, 0xd2, 0x64, 0x5c, 0xa1, 0x22, 0xa1, 0x9b, 0xc4, 0x7f, 0x09, 0xed, 0xba, 0xad,
-	0x23, 0xd8, 0x25, 0x4d, 0x6b, 0xd5, 0x23, 0x96, 0xf0, 0x00, 0xeb, 0xdc, 0xb3, 0x3f, 0x6d, 0xe8,
-	0xce, 0xc5, 0xff, 0x00, 0xdb, 0x12, 0x47, 0x02, 0xc7, 0x28, 0x59, 0x12, 0xeb, 0xd4, 0x90, 0xec,
-	0xc1, 0x8b, 0xf9, 0x7e, 0xfc, 0xeb, 0x1a, 0xbf, 0x22, 0x78, 0x1a, 0xa5, 0x3c, 0x5b, 0x4b, 0xc4,
-	0x7a, 0x6d, 0x66, 0xd1, 0xf6, 0xe0, 0x74, 0x21, 0xeb, 0x1b, 0xa1, 0x37, 0x06, 0x5c, 0xca, 0x7b,
-	0x03, 0x1d, 0x2d, 0x27, 0xec, 0x2e, 0x0f, 0x6a, 0x27, 0x1c, 0x2d, 0xe5, 0x4c, 0xbe, 0xe4, 0xc1,
-	0x8c, 0xfb, 0x0e, 0x2c, 0x25, 0x62, 0x5a, 0x7d, 0xc2, 0x8d, 0x27, 0xec, 0x81, 0xb7, 0x40, 0xbe,
-	0x21, 0xe8, 0xf2, 0xea, 0xe3, 0x34, 0xe0, 0x8d, 0xa1, 0xff, 0x64, 0xa7, 0x07, 0xb0, 0x33, 0xf5,
-	0x0e, 0x8d, 0x28, 0xc8, 0x06, 0x33, 0x0d, 0x4b, 0x83, 0x8c, 0x39, 0xad, 0x4f, 0x61, 0x58, 0xcd,
-	0xd0, 0x72, 0xf6, 0xc0, 0xce, 0x72, 0x23, 0x85, 0x31, 0x5a, 0x73, 0xbe, 0xa5, 0x09, 0x93, 0x45,
-	0xc6, 0x78, 0x18, 0xa2, 0x52, 0x55, 0x21, 0x63, 0x54, 0xef, 0x1c, 0x0e, 0xd6, 0x0c, 0x7b, 0x08,
-	0xbd, 0x05, 0x91, 0xd8, 0x6c, 0x7f, 0xde, 0xaf, 0x26, 0xec, 0xac, 0x0c, 0x7b, 0x0e, 0x9d, 0xa0,
-	0x08, 0x7f, 0xa0, 0x56, 0xc4, 0x69, 0xd2, 0xac, 0x27, 0x6b, 0x85, 0xf1, 0x2f, 0x0c, 0xd1, 0xf9,
-	0x0c, 0xfd, 0x5a, 0x4b, 0x72, 0x55, 0xf9, 0x16, 0x9a, 0x13, 0x59, 0x2f, 0xe3, 0xed, 0xfa, 0xfc,
-	0xea, 0xf3, 0xba, 0xcc, 0xa9, 0x0e, 0xb1, 0x77, 0x05, 0x9d, 0x8b, 0x42, 0x24, 0x11, 0x35, 0xb2,
-	0x05, 0x9b, 0xe6, 0xec, 0x36, 0xa6, 0xae, 0xd5, 0x52, 0xc4, 0x64, 0x7e, 0xb2, 0x51, 0x30, 0x99,
-	0x9d, 0xe8, 0x7d, 0x7c, 0xbc, 0xa7, 0x72, 0x29, 0x66, 0x9a, 0xd1, 0x4b, 0x48, 0x4f, 0x1e, 0xa3,
-	0x51, 0x64, 0xc3, 0xfb, 0x0a, 0xed, 0xba, 0xc5, 0xe5, 0x62, 0xef, 0xc1, 0x0a, 0xaa, 0xbf, 0x54,
-	0x8e, 0x5d, 0x75, 0xcc, 0xca, 0x90, 0x86, 0xe9, 0xfd, 0x6c, 0xc0, 0xee, 0x3f, 0x0d, 0x97, 0x1b,
-	0x59, 0x9e, 0xfd, 0xa1, 0xc8, 0x35, 0xaf, 0x6f, 0x20, 0xba, 0x17, 0xe2, 0x24, 0x0f, 0x78, 0xb2,
-	0x84, 0x55, 0xfb, 0xfd, 0x1f, 0xfa, 0x43, 0x2e, 0x92, 0x42, 0x62, 0x0d, 0x8e, 0x51, 0xc4, 0xb7,
-	0xda, 0x2c, 0xba, 0xe5, 0xbc, 0x82, 0xe7, 0x5a, 0xf2, 0x4c, 0x89, 0x72, 0xae, 0x27, 0x79, 0x9b,
-	0xd3, 0x2a, 0xe5, 0x39, 0xcd, 0x0b, 0xbd, 0x8c, 0x96, 0xf7, 0x52, 0xcb, 0xdb, 0x85, 0xde, 0x8a,
-	0x3b, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x92, 0xf5, 0x6a, 0x3b, 0x05, 0x00, 0x00,
+	// 959 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x55, 0x5b, 0x6f, 0x23, 0xb5,
+	0x17, 0x57, 0xd2, 0xe6, 0x76, 0x26, 0x69, 0x53, 0xff, 0xbb, 0x7f, 0xa6, 0x41, 0x74, 0xb3, 0x85,
+	0x45, 0x11, 0x97, 0x68, 0x15, 0xc4, 0x0b, 0x02, 0x89, 0x26, 0x2b, 0x10, 0xa8, 0xa0, 0xc5, 0xdd,
+	0x65, 0x1f, 0x40, 0xb2, 0x9c, 0x99, 0x93, 0x59, 0x2f, 0x73, 0x49, 0x6c, 0x4f, 0xda, 0x7c, 0x14,
+	0x78, 0x45, 0xbc, 0xf3, 0x11, 0x91, 0xed, 0x99, 0x49, 0xd2, 0x76, 0xdf, 0xe2, 0xdf, 0xe5, 0x78,
+	0xfc, 0xf3, 0x39, 0x0e, 0xb4, 0x83, 0xd5, 0x78, 0x29, 0x33, 0x9d, 0x5d, 0xfc, 0x7d, 0x08, 0xcd,
+	0x59, 0x96, 0x2e, 0x44, 0x44, 0x7c, 0x68, 0xad, 0x51, 0x2a, 0x91, 0xa5, 0x7e, 0x6d, 0x58, 0x1b,
+	0x35, 0x68, 0xb9, 0x24, 0xef, 0x41, 0x2b, 0x58, 0xb1, 0x94, 0x27, 0xe8, 0xd7, 0x87, 0xb5, 0x51,
+	0x87, 0x36, 0x83, 0xd5, 0xcf, 0x3c, 0x41, 0x32, 0x82, 0xce, 0x1a, 0xa5, 0x58, 0x08, 0x94, 0xca,
+	0x3f, 0x18, 0xd6, 0x46, 0xde, 0x04, 0xc6, 0xbf, 0x96, 0x08, 0xdd, 0x92, 0xe4, 0x02, 0x7a, 0xc1,
+	0x8a, 0x29, 0xcd, 0x75, 0xae, 0x58, 0x2e, 0x63, 0xff, 0xd0, 0x16, 0xf2, 0x82, 0xd5, 0xb5, 0xc5,
+	0x5e, 0xc9, 0x98, 0x7c, 0x0d, 0x67, 0x6f, 0x44, 0x88, 0x4c, 0xe2, 0x82, 0x89, 0x94, 0x05, 0x59,
+	0x92, 0x08, 0xad, 0x31, 0x64, 0x89, 0x8a, 0xfc, 0xc6, 0xb0, 0x36, 0x6a, 0x4f, 0xeb, 0x7e, 0x8d,
+	0x3e, 0x32, 0x22, 0x8a, 0x8b, 0x1f, 0xd2, 0x59, 0xa9, 0xf8, 0x49, 0x45, 0xe4, 0x33, 0x20, 0xce,
+	0xc1, 0xe6, 0xb9, 0x54, 0x9a, 0x85, 0x18, 0xf3, 0x8d, 0xdf, 0xb4, 0x27, 0xe9, 0x3b, 0x66, 0x6a,
+	0x88, 0xe7, 0x06, 0x27, 0x23, 0xe8, 0x27, 0xfc, 0x96, 0xed, 0x3a, 0xfc, 0x96, 0xd5, 0x1e, 0x25,
+	0xfc, 0x76, 0xb6, 0x95, 0x93, 0x0f, 0xa1, 0x27, 0x52, 0xb6, 0x94, 0x59, 0x98, 0x07, 0xda, 0x84,
+	0xd3, 0x36, 0x5f, 0x42, 0xbb, 0x22, 0x7d, 0x51, 0x61, 0xe4, 0x29, 0xb4, 0xa5, 0x40, 0xbd, 0xc6,
+	0x38, 0xf4, 0x3b, 0x36, 0x87, 0xce, 0x98, 0x16, 0x00, 0xad, 0x28, 0xf2, 0x18, 0x9a, 0x11, 0x4a,
+	0x29, 0xb4, 0x7f, 0x6c, 0x45, 0xad, 0xf1, 0xf7, 0x76, 0x49, 0x0b, 0x98, 0x0c, 0xa1, 0x1b, 0x09,
+	0xcd, 0x24, 0x2e, 0x33, 0x9b, 0x12, 0xd8, 0x94, 0x20, 0x12, 0x9a, 0xe2, 0x32, 0x33, 0x21, 0x7d,
+	0x00, 0xa0, 0xb9, 0x8c, 0xd0, 0x88, 0x16, 0xbe, 0x67, 0xf9, 0x8e, 0x43, 0x28, 0x2e, 0xc8, 0x47,
+	0xd0, 0x55, 0xeb, 0x74, 0x5b, 0xa0, 0x6b, 0x04, 0x36, 0x36, 0x50, 0xeb, 0xb4, 0x2c, 0x32, 0x86,
+	0xff, 0x85, 0x92, 0x8b, 0x54, 0xa4, 0x91, 0xb9, 0x13, 0xa9, 0x99, 0x16, 0x09, 0xfa, 0x3d, 0x5b,
+	0xed, 0xa4, 0xa4, 0xae, 0x0d, 0xf3, 0x52, 0x24, 0x78, 0x71, 0x09, 0xed, 0xf2, 0x34, 0xa4, 0x0f,
+	0x07, 0xa6, 0x70, 0xcd, 0x6a, 0xcd, 0x4f, 0x93, 0xd0, 0x52, 0x66, 0x6f, 0x31, 0xd0, 0x6c, 0xce,
+	0x15, 0x2a, 0xbf, 0x3e, 0x3c, 0x18, 0x75, 0x68, 0xb7, 0x00, 0xa7, 0x06, 0xbb, 0xb8, 0x81, 0xa6,
+	0x3b, 0x2b, 0xf9, 0x04, 0x4e, 0x82, 0x15, 0x2b, 0x5a, 0x23, 0x64, 0x31, 0x9f, 0x63, 0x59, 0xee,
+	0x38, 0x58, 0x15, 0xdd, 0x13, 0x5e, 0x19, 0x98, 0x5c, 0xc2, 0x79, 0x28, 0x37, 0x4c, 0xe6, 0x29,
+	0x53, 0xa8, 0x15, 0xbb, 0x6f, 0xac, 0xdb, 0xdb, 0x38, 0x0b, 0xe5, 0x86, 0xe6, 0xe9, 0x35, 0x6a,
+	0x35, 0xdb, 0x2f, 0x71, 0xf1, 0x4f, 0x07, 0x3a, 0x55, 0x4b, 0x92, 0xe7, 0xd0, 0x93, 0xb8, 0x16,
+	0x78, 0x83, 0x92, 0xc5, 0x91, 0x4e, 0xec, 0xc6, 0xde, 0xe4, 0xf1, 0xb6, 0x6b, 0xc7, 0xb4, 0xe0,
+	0xaf, 0x22, 0x9d, 0x94, 0x28, 0xed, 0xca, 0x1d, 0x94, 0x4c, 0xc1, 0xd3, 0x12, 0xb1, 0xe8, 0x67,
+	0xfb, 0x0d, 0xde, 0xe4, 0xc9, 0x4e, 0x8d, 0x97, 0x12, 0xd1, 0x35, 0xf6, 0x5e, 0x15, 0xd0, 0x15,
+	0x4e, 0x26, 0xd0, 0xd2, 0x72, 0xc3, 0xde, 0x66, 0xf3, 0x62, 0x72, 0xce, 0xf6, 0xfc, 0x9b, 0x1f,
+	0xb3, 0x79, 0xe5, 0x6b, 0x6a, 0xbb, 0x26, 0x5f, 0x42, 0x5b, 0x89, 0x28, 0x65, 0x41, 0xcc, 0xed,
+	0x00, 0x79, 0x93, 0xc1, 0x8e, 0xe9, 0x5a, 0x44, 0xe9, 0xec, 0xea, 0xb2, 0x72, 0xb5, 0x8c, 0x76,
+	0x16, 0xf3, 0xc1, 0xbf, 0x35, 0x38, 0x7d, 0xe8, 0x54, 0xe4, 0x29, 0x1c, 0x95, 0x53, 0x26, 0x59,
+	0x2c, 0x94, 0x2e, 0xee, 0xa1, 0x57, 0xa1, 0x57, 0x42, 0x69, 0x33, 0xbc, 0x66, 0x58, 0x6e, 0xb8,
+	0xd0, 0x4c, 0x61, 0xe0, 0x0e, 0xdc, 0xa0, 0x5e, 0xc2, 0x6f, 0x5f, 0x73, 0xa1, 0xaf, 0x31, 0x50,
+	0xe4, 0x1c, 0xbc, 0x34, 0xb3, 0x91, 0xda, 0x71, 0x3d, 0x70, 0x8d, 0x99, 0x66, 0x66, 0x3f, 0x33,
+	0x9e, 0x9f, 0x9b, 0x96, 0x73, 0x37, 0xc9, 0x83, 0x00, 0x95, 0x72, 0xfb, 0xb9, 0x67, 0xa0, 0xef,
+	0xae, 0xef, 0xd2, 0x12, 0x66, 0xcb, 0xc1, 0xb7, 0xf0, 0xff, 0x87, 0x33, 0x24, 0x1f, 0xc3, 0xf1,
+	0x4e, 0xf6, 0x6c, 0xdb, 0x8b, 0xbd, 0x6d, 0xb8, 0xaf, 0x64, 0x3c, 0xf8, 0xab, 0x01, 0x47, 0xfb,
+	0x31, 0x92, 0xaf, 0xa0, 0x35, 0xcf, 0x83, 0x3f, 0x50, 0x2b, 0xbf, 0x36, 0x3c, 0x18, 0x79, 0x93,
+	0xe1, 0x3b, 0x23, 0x1f, 0x4f, 0xad, 0x90, 0x96, 0x06, 0xf2, 0x3b, 0x9c, 0x16, 0xd7, 0xc5, 0x24,
+	0x9a, 0x5f, 0x81, 0x7d, 0x35, 0x8b, 0xbb, 0xff, 0xf4, 0xdd, 0x85, 0xdc, 0x92, 0x1a, 0x8f, 0x7b,
+	0x68, 0xe9, 0x89, 0xbe, 0x0b, 0x0d, 0x72, 0x68, 0x4d, 0x73, 0x11, 0x87, 0x28, 0x09, 0x81, 0x43,
+	0xfb, 0xd2, 0xba, 0x43, 0xd9, 0xdf, 0xe4, 0x09, 0x74, 0xb5, 0x14, 0x51, 0x84, 0x12, 0x43, 0x36,
+	0xdf, 0x14, 0xaf, 0xb0, 0x57, 0x61, 0xd3, 0x0d, 0xf9, 0x02, 0x1e, 0xe1, 0xed, 0x12, 0xa5, 0x48,
+	0x30, 0xd5, 0x6c, 0x89, 0x32, 0xc0, 0x54, 0xf3, 0x08, 0x6d, 0xc2, 0x75, 0x7a, 0xba, 0x25, 0x5f,
+	0x54, 0xdc, 0xe0, 0x37, 0x68, 0xba, 0x73, 0x3e, 0xb8, 0xeb, 0x37, 0xd0, 0x9e, 0xbb, 0x8f, 0x72,
+	0x23, 0x7d, 0xb7, 0xc5, 0xef, 0xe4, 0x65, 0x95, 0xb4, 0xb2, 0x0c, 0xfe, 0xac, 0xc3, 0xc9, 0xbd,
+	0xc3, 0x9b, 0x3e, 0xd8, 0xcf, 0x71, 0x95, 0x67, 0x9a, 0x17, 0xff, 0x38, 0xfd, 0x9d, 0x64, 0x7e,
+	0x31, 0xb8, 0x79, 0xd5, 0xa3, 0x38, 0x9b, 0xf3, 0x78, 0x4f, 0xed, 0xfa, 0xaf, 0xef, 0x98, 0x1d,
+	0xf5, 0x33, 0x38, 0x5d, 0x70, 0x11, 0xe7, 0x12, 0x0b, 0xf9, 0x0d, 0x8a, 0xe8, 0x8d, 0xb6, 0xdd,
+	0xd8, 0xa0, 0xa4, 0xe0, 0xac, 0xe1, 0xb5, 0x65, 0xc8, 0x0c, 0xce, 0xb5, 0xe4, 0xa9, 0x12, 0x26,
+	0xb5, 0x07, 0xbd, 0x87, 0xd6, 0xfb, 0x7e, 0xa5, 0xfa, 0xee, 0x7e, 0x91, 0x67, 0x70, 0x6a, 0xde,
+	0xcf, 0x2c, 0xd7, 0xfb, 0xd6, 0x86, 0xdb, 0xb6, 0xe0, 0x76, 0x1c, 0x83, 0x13, 0x38, 0xbe, 0x33,
+	0xad, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xe7, 0xaf, 0xdd, 0x86, 0x94, 0x07, 0x00, 0x00,
 }
diff --git a/third_party/cq_client/cq.proto b/third_party/cq_client/cq.proto
index 1727d273f698b0c617de177ba512b033da462c1c..c0ee39d6998bc6ffebe06f7ee0f747d9e4e7a2d6 100644
--- a/third_party/cq_client/cq.proto
+++ b/third_party/cq_client/cq.proto
@@ -20,10 +20,8 @@ message Config {
   // URL of the CQ status app to push updates to.
   optional string cq_status_url = 4;
 
-  // When true, hash of the commit is not posted by CQ. This is used for
-  // projects using gnumbd as latter publishes actual hash later. Default value
-  // is false.
-  optional bool hide_ref_in_committed_msg = 5;
+  // DO NOT USE. Kept here for validator error messages.
+  optional bool hide_ref_in_committed_msg = 5 [deprecated = true];
 
   // Delay between commit bursts in seconds. Default value is 480.
   optional int32 commit_burst_delay = 6;
@@ -39,8 +37,7 @@ message Config {
   // Configuration options for Rietveld code review.
   optional Rietveld rietveld = 9;
 
-  // EXPERIMENTAL! Configuration options for Gerrit code review.
-  // TODO(tandrii): update this doc (GERRIT).
+  // Configuration options for Gerrit code review.
   optional Gerrit gerrit = 15;
 
   // This can be used to override the Git repository URL used to checkout and
@@ -53,8 +50,8 @@ message Config {
   // that use gnumbd where CQ should commit into a pending ref.
   optional string target_ref = 11;
 
-  // Deprecated. URL of the SVN repository. We are deprecating SVN support.
-  optional string svn_repo_url = 12;
+  // DO NOT USE. Kept here for validator error messages.
+  optional string svn_repo_url = 12 [deprecated = true];
 
   // If present, the CQ will refrain from processing any commits whose start
   // time is >= this time.
@@ -67,23 +64,14 @@ message Rietveld {
   // Required. URL of the codereview site.
   optional string url = 1;
 
-  // List of regular expressions used to check if CL's base URL should be
-  // processed by this CQ. This may be useful if a single branch has multiple
-  // sub-directories that are handled by different CQs. When no regular
-  // expressions are specified, the regular expression '.*', which matches any
-  // directory, is used.
+  // DO NOT USE. Kept here for validator error messages.
   repeated string project_bases = 2;
 }
 
-// Gerrit CQ is EXPERIMENTAL! See http://crbug.com/493899 for more info.
-//
 // Unlike Rietveld, Gerrit doesn't need a separate url.
 // Instead, the git_repo_url must be specified on the Gerrit instance,
 // and CQ will deduce Gerrit url from it.
 //
-// TODO(tandrii): support Rietveld and Gerrit at the same time.
-// This basically requires to start two CQ instances, instead of one.
-//
 // For example, if https://chromium.googlesource.com/infra/infra.git is your
 // repo url provided in `git_repo_url` above, then
 // https://chromium-review.googlesource.com/#/admin/projects/infra/infra should
@@ -95,13 +83,20 @@ message Rietveld {
 // see it. This will come handy to enable and customize the CQ-related workflows
 // for your project.
 message Gerrit {
-  // Optional. If set, tells CQ vote on a given label to mark result of CQ run.
-  // The vote is either -1 if failed or 1 on success, and will be given on
+  // Optional. If set, tells CQ to vote on a given label to mark result of CQ
+  // run.  The vote is either -1 if failed or 1 on success, and will be given on
   // non-dry runs only.
   // This vote can then be used in Gerrit's rule for submitting issues, so as to
   // require CQ run. CQ will attempt to submit issue only after setting this
   // label.
   optional string cq_verified_label = 1;
+
+  // Optional and only allowed if cq_verified_label is set. Default: False.
+  // If set, tells CQ to vote on the Verified label even on dry run.
+  // This is useful if CQ has no presubmit builders, as dry run would be
+  // totally equivalent to full run, except that CQ won't try to actually submit
+  // the code.
+  optional bool dry_run_sets_cq_verified_label = 2;
 }
 
 // Verifiers are various types of checks that a Commit Queue performs on a CL.
@@ -111,7 +106,9 @@ message Gerrit {
 message Verifiers {
   // This verifier is used to ensure that an LGTM was posted to the code review
   // site from a valid project committer.
-  // This verifier is not supported with Gerrit.
+  // It is ignored in case of Gerrit, and you should not declare it unless you
+  // use both Gerrit and Rietveld for codereview. Unlike Rietveld, Gerrit has
+  // its own ACL system which should be set up by project admins.
   optional ReviewerLgtmVerifier reviewer_lgtm = 1;
 
   // This verifier is used to check tree status before committing a CL. If the
diff --git a/third_party/cq_client/cq_pb2.py b/third_party/cq_client/cq_pb2.py
index 117c199f63d1766e3eb9d0f1d54c0946c8374304..a593f027638f377b40ce36dd21e2255afc7601da 100644
--- a/third_party/cq_client/cq_pb2.py
+++ b/third_party/cq_client/cq_pb2.py
@@ -26,7 +26,7 @@ _sym_db = _symbol_database.Default()
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='cq.proto',
   package='',
-  serialized_pb=_b('\n\x08\x63q.proto\"\xe3\x02\n\x06\x43onfig\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x0f\n\x07\x63q_name\x18\x02 \x01(\t\x12\x1d\n\tverifiers\x18\x03 \x01(\x0b\x32\n.Verifiers\x12\x15\n\rcq_status_url\x18\x04 \x01(\t\x12!\n\x19hide_ref_in_committed_msg\x18\x05 \x01(\x08\x12\x1a\n\x12\x63ommit_burst_delay\x18\x06 \x01(\x05\x12\x18\n\x10max_commit_burst\x18\x07 \x01(\x05\x12\x15\n\rin_production\x18\x08 \x01(\x08\x12\x1b\n\x08rietveld\x18\t \x01(\x0b\x32\t.Rietveld\x12\x17\n\x06gerrit\x18\x0f \x01(\x0b\x32\x07.Gerrit\x12\x14\n\x0cgit_repo_url\x18\n \x01(\t\x12\x12\n\ntarget_ref\x18\x0b \x01(\t\x12\x14\n\x0csvn_repo_url\x18\x0c \x01(\t\x12\x1b\n\x13\x64raining_start_time\x18\r \x01(\t\".\n\x08Rietveld\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x15\n\rproject_bases\x18\x02 \x03(\t\"#\n\x06Gerrit\x12\x19\n\x11\x63q_verified_label\x18\x01 \x01(\t\"\xf3\x06\n\tVerifiers\x12\x36\n\rreviewer_lgtm\x18\x01 \x01(\x0b\x32\x1f.Verifiers.ReviewerLgtmVerifier\x12\x36\n\x0btree_status\x18\x02 \x01(\x0b\x32!.Verifiers.TreeStatusLgtmVerifier\x12*\n\x07try_job\x18\x03 \x01(\x0b\x32\x19.Verifiers.TryJobVerifier\x12,\n\x08sign_cla\x18\x04 \x01(\x0b\x32\x1a.Verifiers.SignCLAVerifier\x1aw\n\x14ReviewerLgtmVerifier\x12\x16\n\x0e\x63ommitter_list\x18\x01 \x01(\t\x12\x15\n\rmax_wait_secs\x18\x02 \x01(\x05\x12\x13\n\x0bno_lgtm_msg\x18\x03 \x01(\t\x12\x1b\n\x13\x64ry_run_access_list\x18\x04 \x01(\t\x1a\x31\n\x16TreeStatusLgtmVerifier\x12\x17\n\x0ftree_status_url\x18\x01 \x01(\t\x1a\xdc\x03\n\x0eTryJobVerifier\x12\x31\n\x07\x62uckets\x18\x01 \x03(\x0b\x32 .Verifiers.TryJobVerifier.Bucket\x12I\n\x14try_job_retry_config\x18\x02 \x01(\x0b\x32+.Verifiers.TryJobVerifier.TryJobRetryConfig\x1aL\n\x07\x42uilder\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0ctriggered_by\x18\x02 \x01(\t\x12\x1d\n\x15\x65xperiment_percentage\x18\x04 \x01(\x02\x1aK\n\x06\x42ucket\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x33\n\x08\x62uilders\x18\x02 \x03(\x0b\x32!.Verifiers.TryJobVerifier.Builder\x1a\xb0\x01\n\x11TryJobRetryConfig\x12\x1b\n\x13try_job_retry_quota\x18\x01 \x01(\x05\x12\x1a\n\x12global_retry_quota\x18\x02 \x01(\x05\x12\x1c\n\x14\x66\x61ilure_retry_weight\x18\x03 \x01(\x05\x12&\n\x1etransient_failure_retry_weight\x18\x04 \x01(\x05\x12\x1c\n\x14timeout_retry_weight\x18\x05 \x01(\x05\x1a\x11\n\x0fSignCLAVerifier')
+  serialized_pb=_b('\n\x08\x63q.proto\"\xeb\x02\n\x06\x43onfig\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x0f\n\x07\x63q_name\x18\x02 \x01(\t\x12\x1d\n\tverifiers\x18\x03 \x01(\x0b\x32\n.Verifiers\x12\x15\n\rcq_status_url\x18\x04 \x01(\t\x12%\n\x19hide_ref_in_committed_msg\x18\x05 \x01(\x08\x42\x02\x18\x01\x12\x1a\n\x12\x63ommit_burst_delay\x18\x06 \x01(\x05\x12\x18\n\x10max_commit_burst\x18\x07 \x01(\x05\x12\x15\n\rin_production\x18\x08 \x01(\x08\x12\x1b\n\x08rietveld\x18\t \x01(\x0b\x32\t.Rietveld\x12\x17\n\x06gerrit\x18\x0f \x01(\x0b\x32\x07.Gerrit\x12\x14\n\x0cgit_repo_url\x18\n \x01(\t\x12\x12\n\ntarget_ref\x18\x0b \x01(\t\x12\x18\n\x0csvn_repo_url\x18\x0c \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x64raining_start_time\x18\r \x01(\t\".\n\x08Rietveld\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x15\n\rproject_bases\x18\x02 \x03(\t\"K\n\x06Gerrit\x12\x19\n\x11\x63q_verified_label\x18\x01 \x01(\t\x12&\n\x1e\x64ry_run_sets_cq_verified_label\x18\x02 \x01(\x08\"\xf3\x06\n\tVerifiers\x12\x36\n\rreviewer_lgtm\x18\x01 \x01(\x0b\x32\x1f.Verifiers.ReviewerLgtmVerifier\x12\x36\n\x0btree_status\x18\x02 \x01(\x0b\x32!.Verifiers.TreeStatusLgtmVerifier\x12*\n\x07try_job\x18\x03 \x01(\x0b\x32\x19.Verifiers.TryJobVerifier\x12,\n\x08sign_cla\x18\x04 \x01(\x0b\x32\x1a.Verifiers.SignCLAVerifier\x1aw\n\x14ReviewerLgtmVerifier\x12\x16\n\x0e\x63ommitter_list\x18\x01 \x01(\t\x12\x15\n\rmax_wait_secs\x18\x02 \x01(\x05\x12\x13\n\x0bno_lgtm_msg\x18\x03 \x01(\t\x12\x1b\n\x13\x64ry_run_access_list\x18\x04 \x01(\t\x1a\x31\n\x16TreeStatusLgtmVerifier\x12\x17\n\x0ftree_status_url\x18\x01 \x01(\t\x1a\xdc\x03\n\x0eTryJobVerifier\x12\x31\n\x07\x62uckets\x18\x01 \x03(\x0b\x32 .Verifiers.TryJobVerifier.Bucket\x12I\n\x14try_job_retry_config\x18\x02 \x01(\x0b\x32+.Verifiers.TryJobVerifier.TryJobRetryConfig\x1aL\n\x07\x42uilder\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0ctriggered_by\x18\x02 \x01(\t\x12\x1d\n\x15\x65xperiment_percentage\x18\x04 \x01(\x02\x1aK\n\x06\x42ucket\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x33\n\x08\x62uilders\x18\x02 \x03(\x0b\x32!.Verifiers.TryJobVerifier.Builder\x1a\xb0\x01\n\x11TryJobRetryConfig\x12\x1b\n\x13try_job_retry_quota\x18\x01 \x01(\x05\x12\x1a\n\x12global_retry_quota\x18\x02 \x01(\x05\x12\x1c\n\x14\x66\x61ilure_retry_weight\x18\x03 \x01(\x05\x12&\n\x1etransient_failure_retry_weight\x18\x04 \x01(\x05\x12\x1c\n\x14timeout_retry_weight\x18\x05 \x01(\x05\x1a\x11\n\x0fSignCLAVerifier')
 )
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -74,7 +74,7 @@ _CONFIG = _descriptor.Descriptor(
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
     _descriptor.FieldDescriptor(
       name='commit_burst_delay', full_name='Config.commit_burst_delay', index=5,
       number=6, type=5, cpp_type=1, label=1,
@@ -130,7 +130,7 @@ _CONFIG = _descriptor.Descriptor(
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      options=None),
+      options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
     _descriptor.FieldDescriptor(
       name='draining_start_time', full_name='Config.draining_start_time', index=13,
       number=13, type=9, cpp_type=9, label=1,
@@ -150,7 +150,7 @@ _CONFIG = _descriptor.Descriptor(
   oneofs=[
   ],
   serialized_start=13,
-  serialized_end=368,
+  serialized_end=376,
 )
 
 
@@ -186,8 +186,8 @@ _RIETVELD = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=370,
-  serialized_end=416,
+  serialized_start=378,
+  serialized_end=424,
 )
 
 
@@ -205,6 +205,13 @@ _GERRIT = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
+    _descriptor.FieldDescriptor(
+      name='dry_run_sets_cq_verified_label', full_name='Gerrit.dry_run_sets_cq_verified_label', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
   ],
   extensions=[
   ],
@@ -216,8 +223,8 @@ _GERRIT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=418,
-  serialized_end=453,
+  serialized_start=426,
+  serialized_end=501,
 )
 
 
@@ -267,8 +274,8 @@ _VERIFIERS_REVIEWERLGTMVERIFIER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=671,
-  serialized_end=790,
+  serialized_start=719,
+  serialized_end=838,
 )
 
 _VERIFIERS_TREESTATUSLGTMVERIFIER = _descriptor.Descriptor(
@@ -296,8 +303,8 @@ _VERIFIERS_TREESTATUSLGTMVERIFIER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=792,
-  serialized_end=841,
+  serialized_start=840,
+  serialized_end=889,
 )
 
 _VERIFIERS_TRYJOBVERIFIER_BUILDER = _descriptor.Descriptor(
@@ -339,8 +346,8 @@ _VERIFIERS_TRYJOBVERIFIER_BUILDER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=988,
-  serialized_end=1064,
+  serialized_start=1036,
+  serialized_end=1112,
 )
 
 _VERIFIERS_TRYJOBVERIFIER_BUCKET = _descriptor.Descriptor(
@@ -375,8 +382,8 @@ _VERIFIERS_TRYJOBVERIFIER_BUCKET = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1066,
-  serialized_end=1141,
+  serialized_start=1114,
+  serialized_end=1189,
 )
 
 _VERIFIERS_TRYJOBVERIFIER_TRYJOBRETRYCONFIG = _descriptor.Descriptor(
@@ -432,8 +439,8 @@ _VERIFIERS_TRYJOBVERIFIER_TRYJOBRETRYCONFIG = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1144,
-  serialized_end=1320,
+  serialized_start=1192,
+  serialized_end=1368,
 )
 
 _VERIFIERS_TRYJOBVERIFIER = _descriptor.Descriptor(
@@ -468,8 +475,8 @@ _VERIFIERS_TRYJOBVERIFIER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=844,
-  serialized_end=1320,
+  serialized_start=892,
+  serialized_end=1368,
 )
 
 _VERIFIERS_SIGNCLAVERIFIER = _descriptor.Descriptor(
@@ -490,8 +497,8 @@ _VERIFIERS_SIGNCLAVERIFIER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1322,
-  serialized_end=1339,
+  serialized_start=1370,
+  serialized_end=1387,
 )
 
 _VERIFIERS = _descriptor.Descriptor(
@@ -540,8 +547,8 @@ _VERIFIERS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=456,
-  serialized_end=1339,
+  serialized_start=504,
+  serialized_end=1387,
 )
 
 _CONFIG.fields_by_name['verifiers'].message_type = _VERIFIERS
@@ -651,4 +658,8 @@ _sym_db.RegisterMessage(Verifiers.TryJobVerifier.TryJobRetryConfig)
 _sym_db.RegisterMessage(Verifiers.SignCLAVerifier)
 
 
+_CONFIG.fields_by_name['hide_ref_in_committed_msg'].has_options = True
+_CONFIG.fields_by_name['hide_ref_in_committed_msg']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
+_CONFIG.fields_by_name['svn_repo_url'].has_options = True
+_CONFIG.fields_by_name['svn_repo_url']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
 # @@protoc_insertion_point(module_scope)
diff --git a/third_party/cq_client/testdata/cq_both.cfg b/third_party/cq_client/testdata/cq_both.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..af90052708ecfe5d85bf50d18e1910a708ce9a8e
--- /dev/null
+++ b/third_party/cq_client/testdata/cq_both.cfg
@@ -0,0 +1,68 @@
+version: 1
+cq_name: "infra"
+cq_status_url: "https://chromium-cq-status.appspot.com"
+commit_burst_delay: 600
+max_commit_burst: 10
+in_production: false
+git_repo_url: "http://chromium.googlesource.com/infra/infra.git"
+target_ref: "refs/pending/heads/master"
+
+rietveld {
+  url: "https://codereview.chromium.org"
+}
+
+
+gerrit {
+  cq_verified_label: "Commit-Queue-Verified"
+}
+
+verifiers {
+
+  # This verifier is not supported in Gerrit, and is just ignored.
+  reviewer_lgtm: {
+     committer_list: "project-chromium-committers"
+     dry_run_access_list: "project-chromium-tryjob-access"
+     max_wait_secs: 600
+     no_lgtm_msg: "LGTM is missing"
+  }
+
+  tree_status: {
+     tree_status_url: "https://infra-status.appspot.com"
+  }
+
+  try_job {
+    buckets {
+      name: "tryserver.blink"
+      builders { name: "android_blink_compile_dbg" }
+      builders { name: "android_blink_compile_rel" }
+      builders { name: "win_blink_rel" }
+      builders {
+        name: "win_blink_rel_triggered"
+        triggered_by: "win_blink_rel"
+      }
+    }
+    buckets {
+      name: "tryserver.chromium.linux"
+      builders {
+        name: "android_arm64_dbg_recipe"
+      }
+      builders {
+        name: "linux_chromium_rel_ng"
+        experiment_percentage: 10
+      }
+    }
+    buckets {
+      name: "tryserver.chromium.mac"
+      builders {
+        name: "ios_dbg_simulator_ninja"
+        experiment_percentage: 100
+      }
+    }
+    try_job_retry_config {
+      try_job_retry_quota: 10
+      global_retry_quota: 11
+      failure_retry_weight: 12
+      transient_failure_retry_weight: 13
+    }
+  }
+}
diff --git a/third_party/cq_client/testdata/cq_gerrit.cfg b/third_party/cq_client/testdata/cq_gerrit.cfg
index 1d59227304d24fbcce2ab6ced4dcb11e1db65884..79ebd4c9a8594e60f739daf61c360fd7dcead86c 100644
--- a/third_party/cq_client/testdata/cq_gerrit.cfg
+++ b/third_party/cq_client/testdata/cq_gerrit.cfg
@@ -1,7 +1,6 @@
 version: 1
 cq_name: "infra"
 cq_status_url: "https://chromium-cq-status.appspot.com"
-hide_ref_in_committed_msg: true
 commit_burst_delay: 600
 max_commit_burst: 10
 in_production: false
@@ -10,6 +9,7 @@ target_ref: "refs/pending/heads/master"
 
 gerrit {
   cq_verified_label: "Commit-Queue-Verified"
+  dry_run_sets_cq_verified_label: true
 }
 
 verifiers {
diff --git a/third_party/cq_client/testdata/cq_rietveld.cfg b/third_party/cq_client/testdata/cq_rietveld.cfg
index 941fecc06642f27367f25bec75a1c06536c54846..fb3f5b8a2c8136ad4868713ee9d1c50436ba694a 100644
--- a/third_party/cq_client/testdata/cq_rietveld.cfg
+++ b/third_party/cq_client/testdata/cq_rietveld.cfg
@@ -1,7 +1,6 @@
 version: 1
 cq_name: "infra"
 cq_status_url: "https://chromium-cq-status.appspot.com"
-hide_ref_in_committed_msg: true
 commit_burst_delay: 600
 max_commit_burst: 10
 in_production: false
@@ -10,7 +9,6 @@ target_ref: "refs/pending/heads/master"
 
 rietveld {
   url: "https://codereview.chromium.org"
-  project_bases: "https://chromium.googlesource.com/infra/infra.git@master"
 }
 
 verifiers {