diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1c151ae32408c3c2fa70520ffffc186b607c4765..d9f9488e365a90081a6ec78f2497595ec3bd13ef 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -89,7 +89,6 @@ There are three places to get help:
   used by developers or which are widely used by developers
 - The left-hand side of a badge should not advertise. It should be a lowercase _noun_
   succinctly describing the meaning of the right-hand side.
-- Query parameters must be _declared by the service_. See `request-handler.js`.
 - Except for badges using the `social` style, logos should be _turned off by
   default_.
 
diff --git a/lib/request-handler.js b/core/base-service/legacy-request-handler.js
similarity index 95%
rename from lib/request-handler.js
rename to core/base-service/legacy-request-handler.js
index c49c8c6366f8097462bcd281aa3cad7203f6fd94..22cd4a266875d3b823f290a129be2e579cadbd88 100644
--- a/lib/request-handler.js
+++ b/core/base-service/legacy-request-handler.js
@@ -4,18 +4,18 @@
 const domain = require('domain')
 const request = require('request')
 const queryString = require('query-string')
-const log = require('../core/server/log')
-const analytics = require('../core/server/analytics')
-const LruCache = require('../gh-badges/lib/lru-cache')
-const makeBadge = require('../gh-badges/lib/make-badge')
+const log = require('../server/log')
+const analytics = require('../server/analytics')
+const LruCache = require('../../gh-badges/lib/lru-cache')
+const makeBadge = require('../../gh-badges/lib/make-badge')
 const {
   Inaccessible,
   InvalidResponse,
   ShieldsRuntimeError,
-} = require('../services/errors')
-const { setCacheHeaders } = require('../services/cache-headers')
-const { makeBadgeData: getBadgeData } = require('./badge-data')
-const { makeSend } = require('./result-sender')
+} = require('../../services')
+const { setCacheHeaders } = require('../../services/cache-headers')
+const { makeBadgeData: getBadgeData } = require('../../lib/badge-data')
+const { makeSend } = require('./legacy-result-sender')
 
 // We avoid calling the vendor's server for computation of the information in a
 // number of badges.
diff --git a/lib/request-handler.spec.js b/core/base-service/legacy-request-handler.spec.js
similarity index 98%
rename from lib/request-handler.spec.js
rename to core/base-service/legacy-request-handler.spec.js
index 3ca26550f2e9a1688ebf2be1c3ceeed9656258e0..f501a9eed5f9abbd6c3fc97c9d50199af2b7ece7 100644
--- a/lib/request-handler.spec.js
+++ b/core/base-service/legacy-request-handler.spec.js
@@ -5,13 +5,13 @@ const fetch = require('node-fetch')
 const nock = require('nock')
 const portfinder = require('portfinder')
 const Camp = require('camp')
-const analytics = require('../core/server/analytics')
-const { makeBadgeData: getBadgeData } = require('./badge-data')
+const analytics = require('../server/analytics')
+const { makeBadgeData: getBadgeData } = require('../../lib/badge-data')
 const {
   handleRequest,
   clearRequestCache,
   _requestCache,
-} = require('./request-handler')
+} = require('./legacy-request-handler')
 
 async function performTwoRequests(baseUrl, first, second) {
   expect((await fetch(`${baseUrl}${first}`)).ok).to.be.true
diff --git a/lib/result-sender.js b/core/base-service/legacy-result-sender.js
similarity index 93%
rename from lib/result-sender.js
rename to core/base-service/legacy-result-sender.js
index 9730cb0230e8ef08be24cf7898370b2155977985..75510f1d2cd18e42eb44ca25fa3b470dbcacf0f0 100644
--- a/lib/result-sender.js
+++ b/core/base-service/legacy-result-sender.js
@@ -1,8 +1,8 @@
 'use strict'
 
 const stream = require('stream')
-const log = require('../core/server/log')
-const svg2img = require('../gh-badges/lib/svg-to-img')
+const svg2img = require('../../gh-badges/lib/svg-to-img')
+const log = require('../server/log')
 
 function streamFromString(str) {
   const newStream = new stream.Readable()
diff --git a/core/server/server.js b/core/server/server.js
index c78e0e21fcbc240fd479672a6d496e0ee2ffb831..f4fe2869fea278af6bacca879291412a1d55a184 100644
--- a/core/server/server.js
+++ b/core/server/server.js
@@ -10,11 +10,11 @@ const GithubConstellation = require('../../services/github/github-constellation'
 const { loadServiceClasses } = require('../../services')
 const { makeBadgeData } = require('../../lib/badge-data')
 const suggest = require('../../lib/suggest')
-const { makeSend } = require('../../lib/result-sender')
+const { makeSend } = require('../base-service/legacy-result-sender')
 const {
   handleRequest,
   clearRequestCache,
-} = require('../../lib/request-handler')
+} = require('../base-service/legacy-request-handler')
 const { clearRegularUpdateCache } = require('../../lib/regular-update')
 const { staticBadgeUrl } = require('../badge-urls/make-badge-url')
 const analytics = require('./analytics')
diff --git a/doc/production-hosting.md b/doc/production-hosting.md
index 5a2d1d486f982097cacd10add0ea591e3a9fb747..d7d3246c29353d5eb6cb948bf103ebfd8fe4983f 100644
--- a/doc/production-hosting.md
+++ b/doc/production-hosting.md
@@ -72,7 +72,7 @@ Shields has mercifully little persistent state:
     - The [raster cache][]
 
 [github auth admin endpoint]: https://github.com/badges/shields/blob/master/services/github/auth/admin.js
-[request cache]: https://github.com/badges/shields/blob/master/lib/request-handler.js#L29-L30
+[request cache]: https://github.com/badges/shields/blob/master/core/base-service/legacy-request-handler.js#L29-L30
 [regular-update cache]: https://github.com/badges/shields/blob/master/lib/regular-update.js
 [raster cache]: https://github.com/badges/shields/blob/master/gh-badges/lib/svg-to-img.js#L9-L10
 [oauth transfer]: https://developer.github.com/apps/managing-oauth-apps/transferring-ownership-of-an-oauth-app/
diff --git a/now.json b/now.json
index 343e9ca034202c5b48fc59f3eb84ba8ec2eba1ee..9043b1cb11cbdfef5b85a15cbced9f0723be640d 100644
--- a/now.json
+++ b/now.json
@@ -9,6 +9,7 @@
     "frontend/",
     "gh-badges/",
     "lib/",
+    "core/",
     "logo/",
     "pages/",
     "public/",
diff --git a/services/base-non-memory-caching.js b/services/base-non-memory-caching.js
index 1f9e721cf2ef72fb04f8d3f4f83c439005d922de..953d1a3262f2cd2a2fae35881402e48217ebc24c 100644
--- a/services/base-non-memory-caching.js
+++ b/services/base-non-memory-caching.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const makeBadge = require('../gh-badges/lib/make-badge')
-const { makeSend } = require('../lib/result-sender')
+const { makeSend } = require('../core/base-service/legacy-result-sender')
 const BaseService = require('./base')
 const { setCacheHeaders } = require('./cache-headers')
 
diff --git a/services/base-static.js b/services/base-static.js
index 638d420bdd9aaa0373c4a9cdfd3d622ce5a84580..94f0b699550910e4bc49369aad6fcddb814d092d 100644
--- a/services/base-static.js
+++ b/services/base-static.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const makeBadge = require('../gh-badges/lib/make-badge')
-const { makeSend } = require('../lib/result-sender')
+const { makeSend } = require('../core/base-service/legacy-result-sender')
 const analytics = require('../core/server/analytics')
 const BaseService = require('./base')
 const {