diff --git a/services/base-json.spec.js b/services/base-json.spec.js
index bc8ba92a1081525a4b49b667875d33d2205fd7be..41bcc32306afe2c6247277526155c253443fbfbf 100644
--- a/services/base-json.spec.js
+++ b/services/base-json.spec.js
@@ -109,6 +109,7 @@ describe('BaseJsonService', function() {
           { handleInternalErrors: false }
         )
       ).to.deep.equal({
+        isError: true,
         color: 'lightgray',
         message: 'invalid response data',
       })
@@ -125,6 +126,7 @@ describe('BaseJsonService', function() {
           { handleInternalErrors: false }
         )
       ).to.deep.equal({
+        isError: true,
         color: 'lightgray',
         message: 'unparseable json response',
       })
diff --git a/services/base-svg-scraping.spec.js b/services/base-svg-scraping.spec.js
index cfa37b2bcea82147bf956660d44252b1df0dfcd0..da484af58e6964145d0397b37121dbabb3fde757 100644
--- a/services/base-svg-scraping.spec.js
+++ b/services/base-svg-scraping.spec.js
@@ -157,6 +157,7 @@ describe('BaseSvgScrapingService', function() {
           { handleInternalErrors: false }
         )
       ).to.deep.equal({
+        isError: true,
         color: 'lightgray',
         message: 'unparseable svg response',
       })
diff --git a/services/base-xml.spec.js b/services/base-xml.spec.js
index 5c3ad696abc5de5f33672f3755526171d3fce59d..a02ac9709cf2ab49e54ca04ac8361e46bc10f1f9 100644
--- a/services/base-xml.spec.js
+++ b/services/base-xml.spec.js
@@ -136,6 +136,7 @@ describe('BaseXmlService', function() {
           { handleInternalErrors: false }
         )
       ).to.deep.equal({
+        isError: true,
         color: 'lightgray',
         message: 'invalid response data',
       })
@@ -152,6 +153,7 @@ describe('BaseXmlService', function() {
           { handleInternalErrors: false }
         )
       ).to.deep.equal({
+        isError: true,
         color: 'lightgray',
         message: 'unparseable xml response',
       })
diff --git a/services/base-yaml.spec.js b/services/base-yaml.spec.js
index 134236472b894373f39b98395f270d43a6663d20..b7a6be4d25941336286831c64b9df8fa2a41f625 100644
--- a/services/base-yaml.spec.js
+++ b/services/base-yaml.spec.js
@@ -132,6 +132,7 @@ describe('BaseYamlService', function() {
           { handleInternalErrors: false }
         )
       ).to.deep.equal({
+        isError: true,
         color: 'lightgray',
         message: 'invalid response data',
       })
@@ -148,6 +149,7 @@ describe('BaseYamlService', function() {
           { handleInternalErrors: false }
         )
       ).to.deep.equal({
+        isError: true,
         color: 'lightgray',
         message: 'unparseable yaml response',
       })
diff --git a/services/base.js b/services/base.js
index 5b1329529f360d395f5aba0a40b09337e37b0ac9..86aa7f1bbc86a2dead84e37d1cabea98416316ea 100644
--- a/services/base.js
+++ b/services/base.js
@@ -244,6 +244,7 @@ class BaseService {
     if (error instanceof NotFound || error instanceof InvalidParameter) {
       trace.logTrace('outbound', emojic.noGoodWoman, 'Handled error', error)
       return {
+        isError: true,
         message: error.prettyMessage,
         color: 'red',
       }
@@ -254,6 +255,7 @@ class BaseService {
     ) {
       trace.logTrace('outbound', emojic.noGoodWoman, 'Handled error', error)
       return {
+        isError: true,
         message: error.prettyMessage,
         color: 'lightgray',
       }
@@ -271,6 +273,7 @@ class BaseService {
         console.log(error)
       }
       return {
+        isError: true,
         label: 'shields',
         message: 'internal error',
         color: 'lightgray',
@@ -318,11 +321,12 @@ class BaseService {
       logoColor: overrideLogoColor,
       logoWidth: overrideLogoWidth,
       link: overrideLink,
-      colorA: overrideColorA,
-      colorB: overrideColorB,
+      colorA: overrideLabelColor,
+      colorB: overrideColor,
     } = overrides
 
     const {
+      isError,
       label: serviceLabel,
       message: serviceMessage,
       color: serviceColor,
@@ -349,9 +353,16 @@ class BaseService {
       }),
       logoWidth: +overrideLogoWidth,
       links: toArray(overrideLink || serviceLink),
-      colorA: makeColor(overrideColorA),
+      colorA: makeColor(overrideLabelColor),
+    }
+
+    let color
+    if (isError) {
+      // Disregard the override color.
+      color = coalesce(serviceColor, defaultColor, 'lightgrey')
+    } else {
+      color = coalesce(overrideColor, serviceColor, defaultColor, 'lightgrey')
     }
-    const color = overrideColorB || serviceColor || defaultColor || 'lightgrey'
     setBadgeColor(badgeData, color)
 
     return badgeData
diff --git a/services/base.spec.js b/services/base.spec.js
index f8c954211fbad455e2084e56591bc915c391292f..7de1269aff20dbd6e08ded3f984ac38658fb0eaa 100644
--- a/services/base.spec.js
+++ b/services/base.spec.js
@@ -260,6 +260,7 @@ describe('BaseService', function() {
           { namedParamA: 'bar.bar.bar' }
         )
       ).to.deep.equal({
+        isError: true,
         color: 'lightgray',
         label: 'shields',
         message: 'internal error',
@@ -276,6 +277,7 @@ describe('BaseService', function() {
         expect(
           await ThrowingService.invoke({}, {}, { namedParamA: 'bar.bar.bar' })
         ).to.deep.equal({
+          isError: true,
           color: 'red',
           message: 'not found',
         })
@@ -290,6 +292,7 @@ describe('BaseService', function() {
         expect(
           await ThrowingService.invoke({}, {}, { namedParamA: 'bar.bar.bar' })
         ).to.deep.equal({
+          isError: true,
           color: 'lightgray',
           message: 'inaccessible',
         })
@@ -304,6 +307,7 @@ describe('BaseService', function() {
         expect(
           await ThrowingService.invoke({}, {}, { namedParamA: 'bar.bar.bar' })
         ).to.deep.equal({
+          isError: true,
           color: 'lightgray',
           message: 'invalid',
         })
@@ -318,6 +322,7 @@ describe('BaseService', function() {
         expect(
           await ThrowingService.invoke({}, {}, { namedParamA: 'bar.bar.bar' })
         ).to.deep.equal({
+          isError: true,
           color: 'lightgray',
           message: 'no longer available',
         })
@@ -332,6 +337,7 @@ describe('BaseService', function() {
         expect(
           await ThrowingService.invoke({}, {}, { namedParamA: 'bar.bar.bar' })
         ).to.deep.equal({
+          isError: true,
           color: 'red',
           message: 'invalid parameter',
         })
@@ -357,7 +363,7 @@ describe('BaseService', function() {
         expect(badgeData.colorA).to.equal('#42f483')
       })
 
-      it('overrides the colorB', function() {
+      it('overrides the color', function() {
         const badgeData = DummyService._makeBadgeData(
           { colorB: '10ADED' },
           { color: 'red' }
@@ -365,6 +371,15 @@ describe('BaseService', function() {
         expect(badgeData.colorB).to.equal('#10ADED')
       })
 
+      it('does not override the color in case of an error', function() {
+        const badgeData = DummyService._makeBadgeData(
+          { colorB: '10ADED' },
+          { isError: true, color: 'lightgray' }
+        )
+        expect(badgeData.colorB).to.be.undefined
+        expect(badgeData.colorscheme).to.equal('lightgray')
+      })
+
       it('overrides the logo', function() {
         const expLogo =
           'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMTIgMTIgNDAgNDAiPgo8cGF0aCBmaWxsPSIjMzMzMzMzIiBkPSJNMzIsMTMuNGMtMTAuNSwwLTE5LDguNS0xOSwxOWMwLDguNCw1LjUsMTUuNSwxMywxOGMxLDAuMiwxLjMtMC40LDEuMy0wLjljMC0wLjUsMC0xLjcsMC0zLjIgYy01LjMsMS4xLTYuNC0yLjYtNi40LTIuNkMyMCw0MS42LDE4LjgsNDEsMTguOCw0MWMtMS43LTEuMiwwLjEtMS4xLDAuMS0xLjFjMS45LDAuMSwyLjksMiwyLjksMmMxLjcsMi45LDQuNSwyLjEsNS41LDEuNiBjMC4yLTEuMiwwLjctMi4xLDEuMi0yLjZjLTQuMi0wLjUtOC43LTIuMS04LjctOS40YzAtMi4xLDAuNy0zLjcsMi01LjFjLTAuMi0wLjUtMC44LTIuNCwwLjItNWMwLDAsMS42LTAuNSw1LjIsMiBjMS41LTAuNCwzLjEtMC43LDQuOC0wLjdjMS42LDAsMy4zLDAuMiw0LjcsMC43YzMuNi0yLjQsNS4yLTIsNS4yLTJjMSwyLjYsMC40LDQuNiwwLjIsNWMxLjIsMS4zLDIsMywyLDUuMWMwLDcuMy00LjUsOC45LTguNyw5LjQgYzAuNywwLjYsMS4zLDEuNywxLjMsMy41YzAsMi42LDAsNC42LDAsNS4yYzAsMC41LDAuNCwxLjEsMS4zLDAuOWM3LjUtMi42LDEzLTkuNywxMy0xOC4xQzUxLDIxLjksNDIuNSwxMy40LDMyLDEzLjR6Ii8+Cjwvc3ZnPgo='
diff --git a/services/dynamic/dynamic-json.tester.js b/services/dynamic/dynamic-json.tester.js
index 93fb7835f743648fbf4fd55edf6beb1350662839..1370b61527ff584718cfa81324e92f23c72f830a 100644
--- a/services/dynamic/dynamic-json.tester.js
+++ b/services/dynamic/dynamic-json.tester.js
@@ -129,14 +129,13 @@ t.create('JSON from url | error color overrides default')
     colorB: colorsB.red,
   })
 
-// FIXME This is a regression which should be fixed in BaseService.
-// t.create('JSON from url | error color overrides user specified')
-//   .get('.json?query=$.version&colorB=10ADED&style=_shields_test')
-//   .expectJSON({
-//     name: 'custom badge',
-//     value: 'invalid query parameter: url',
-//     colorB: colorsB.red,
-//   })
+t.create('JSON from url | error color overrides user specified')
+  .get('.json?query=$.version&colorB=10ADED&style=_shields_test')
+  .expectJSON({
+    name: 'custom badge',
+    value: 'invalid query parameter: url',
+    colorB: colorsB.red,
+  })
 
 let headers
 t.create('JSON from url | request should set Accept header')
diff --git a/services/dynamic/dynamic-xml.tester.js b/services/dynamic/dynamic-xml.tester.js
index 2690931b1a3ecd22ec7f9b2b50f86d7e7a7ebf5f..ecd567bf5515e2140675187a1a540e0a90085d80 100644
--- a/services/dynamic/dynamic-xml.tester.js
+++ b/services/dynamic/dynamic-xml.tester.js
@@ -131,25 +131,23 @@ t.create('XML from url | user color overrides default')
     colorB: '#10ADED',
   })
 
-// bug: https://github.com/badges/shields/issues/1446
-// t.create('XML from url | error color overrides default')
-//   .get(
-//     '.json?url=https://github.com/badges/shields/raw/master/notafile.xml&query=//version&style=_shields_test'
-//   )
-//   .expectJSON({
-//     name: 'custom badge',
-//     value: 'resource not found',
-//     colorB: colorsB.lightgrey,
-//   })
-
-// bug: https://github.com/badges/shields/issues/1446
-// t.create('XML from url | error color overrides user specified')
-//   .get('.json?query=//version&colorB=10ADED&style=_shields_test')
-//   .expectJSON({
-//     name: 'custom badge',
-//     value: 'invalid query parameter: url',
-//     colorB: colorsB.red,
-//   })
+t.create('XML from url | error color overrides default')
+  .get(
+    '.json?url=https://github.com/badges/shields/raw/master/notafile.xml&query=//version&style=_shields_test'
+  )
+  .expectJSON({
+    name: 'custom badge',
+    value: 'resource not found',
+    colorB: colorsB.red,
+  })
+
+t.create('XML from url | error color overrides user specified')
+  .get('.json?query=//version&colorB=10ADED&style=_shields_test')
+  .expectJSON({
+    name: 'custom badge',
+    value: 'invalid query parameter: url',
+    colorB: colorsB.red,
+  })
 
 let headers
 t.create('XML from url | request should set Accept header')
diff --git a/services/dynamic/dynamic-yaml.tester.js b/services/dynamic/dynamic-yaml.tester.js
index 08aaa0b9ff947af34f2c005f83485d9297a02161..d88ab35cefa3d380052cb19149e6e10a4588fb4e 100644
--- a/services/dynamic/dynamic-yaml.tester.js
+++ b/services/dynamic/dynamic-yaml.tester.js
@@ -80,29 +80,26 @@ t.create('YAML from url | invalid url')
     colorB: colorsB.red,
   })
 
-// bug: https://github.com/badges/shields/issues/1446
-// t.create('YAML from url | user color overrides default')
-//   .get(
-//     '.json?url=https://raw.githubusercontent.com/kubernetes/charts/568291d6e476c39ca8322c30c3f601d0383d4760/stable/coredns/Chart.yaml&query=$.name&colorB=10ADED&style=_shields_test'
-//   )
-//   .expectJSON({ name: 'custom badge', value: 'coredns', colorB: '#10ADED' })
+t.create('YAML from url | user color overrides default')
+  .get(
+    '.json?url=https://raw.githubusercontent.com/kubernetes/charts/568291d6e476c39ca8322c30c3f601d0383d4760/stable/coredns/Chart.yaml&query=$.name&colorB=10ADED&style=_shields_test'
+  )
+  .expectJSON({ name: 'custom badge', value: 'coredns', colorB: '#10ADED' })
 
-// bug: https://github.com/badges/shields/issues/1446
-// t.create('YAML from url | error color overrides default')
-//   .get(
-//     '.json?url=https://raw.githubusercontent.com/kubernetes/charts/568291d6e476c39ca8322c30c3f601d0383d4760/stable/coredns/notafile.yaml&query=$.version&style=_shields_test'
-//   )
-//   .expectJSON({
-//     name: 'custom badge',
-//     value: 'resource not found',
-//     colorB: colorsB.lightgrey,
-//   })
+t.create('YAML from url | error color overrides default')
+  .get(
+    '.json?url=https://raw.githubusercontent.com/kubernetes/charts/568291d6e476c39ca8322c30c3f601d0383d4760/stable/coredns/notafile.yaml&query=$.version&style=_shields_test'
+  )
+  .expectJSON({
+    name: 'custom badge',
+    value: 'resource not found',
+    colorB: colorsB.red,
+  })
 
-// bug: https://github.com/badges/shields/issues/1446
-// t.create('YAML from url | error color overrides user specified')
-//   .get('.json?query=$.version&colorB=10ADED&style=_shields_test')
-//   .expectJSON({
-//     name: 'custom badge',
-//     value: 'invalid query parameter: url',
-//     colorB: colorsB.red,
-//   })
+t.create('YAML from url | error color overrides user specified')
+  .get('.json?query=$.version&colorB=10ADED&style=_shields_test')
+  .expectJSON({
+    name: 'custom badge',
+    value: 'invalid query parameter: url',
+    colorB: colorsB.red,
+  })