diff --git a/core/base-service/base-json.spec.js b/core/base-service/base-json.spec.js
index 4ecbc36d9effb92d12f85a059d70cfd53302f410..a5286e9ca71ab105fd4cd3c8fca2b5575c88ab1e 100644
--- a/core/base-service/base-json.spec.js
+++ b/core/base-service/base-json.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const BaseJsonService = require('./base-json')
diff --git a/core/base-service/base-svg-scraping.spec.js b/core/base-service/base-svg-scraping.spec.js
index 7cc37ac3ea1b654f7df7f2b70d74dbf0a0c3003f..82eb0787df9594617d6f5ca30ec041b466b5b627 100644
--- a/core/base-service/base-svg-scraping.spec.js
+++ b/core/base-service/base-svg-scraping.spec.js
@@ -2,7 +2,7 @@
 
 const { expect } = require('chai')
 const sinon = require('sinon')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const makeBadge = require('../../gh-badges/lib/make-badge')
 const BaseSvgScrapingService = require('./base-svg-scraping')
 
diff --git a/core/base-service/base-xml.spec.js b/core/base-service/base-xml.spec.js
index 3c20ab371dfa51e68eed95141fab0545cbe2e36e..fea06c2a906420d57d0b7b9b14df2fd49d1690e9 100644
--- a/core/base-service/base-xml.spec.js
+++ b/core/base-service/base-xml.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const BaseXmlService = require('./base-xml')
diff --git a/core/base-service/base-yaml.spec.js b/core/base-service/base-yaml.spec.js
index 7d2e7a4bd766e1850451a6f5add42fabede2eded..8098501a0efbdf8b6acc73ad99ae5df4df98b9a9 100644
--- a/core/base-service/base-yaml.spec.js
+++ b/core/base-service/base-yaml.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const BaseYamlService = require('./base-yaml')
diff --git a/core/base-service/base.js b/core/base-service/base.js
index b4a4292a73730a7adbe6c62c1f93713ec60ab949..310da7029f13100d8026c782428aac0f1c65d433 100644
--- a/core/base-service/base.js
+++ b/core/base-service/base.js
@@ -3,7 +3,7 @@
 const decamelize = require('decamelize')
 // See available emoji at http://emoji.muan.co/
 const emojic = require('emojic')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { assertValidCategory } = require('./categories')
 const checkErrorResponse = require('./check-error-response')
 const coalesceBadge = require('./coalesce-badge')
diff --git a/core/base-service/base.spec.js b/core/base-service/base.spec.js
index 274daf6ece1d2d75f52071440308cccac9b5a16e..4c2f99a4baf274a7f0a5cf64cb2360adf7003424 100644
--- a/core/base-service/base.spec.js
+++ b/core/base-service/base.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const trace = require('./trace')
diff --git a/core/base-service/cache-headers.js b/core/base-service/cache-headers.js
index eace49007970b3071b62fdf57f4d789e87532b09..ba3455fdca0b32b32fe26ff9211395a9f3da4f9d 100644
--- a/core/base-service/cache-headers.js
+++ b/core/base-service/cache-headers.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const assert = require('assert')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const coalesce = require('./coalesce')
 
 const serverStartTimeGMTString = new Date().toGMTString()
diff --git a/core/base-service/categories.js b/core/base-service/categories.js
index 760590ced45ca90c580458e984e305b5fcccde5a..44fb27351069a89d4a7c1c05521eaaeb6f97da12 100644
--- a/core/base-service/categories.js
+++ b/core/base-service/categories.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const categories = require('../../services/categories')
 
 const isRealCategory = Joi.equal(categories.map(({ id }) => id)).required()
diff --git a/core/base-service/deprecated-service.js b/core/base-service/deprecated-service.js
index 8358e1f0f1a78c9bcdccf21006ba7597b72abdd0..81942ca7586323c6c0a415e03146a4eb512c69ae 100644
--- a/core/base-service/deprecated-service.js
+++ b/core/base-service/deprecated-service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const camelcase = require('camelcase')
 const BaseService = require('./base')
 const { isValidCategory } = require('./categories')
diff --git a/core/base-service/examples.js b/core/base-service/examples.js
index 602ad533bf98635a35dac45936307ac9780817ec..ca92ec97c604b9e57df4f965eb1c0911025130e2 100644
--- a/core/base-service/examples.js
+++ b/core/base-service/examples.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const pathToRegexp = require('path-to-regexp')
 const coalesceBadge = require('./coalesce-badge')
 const { makeFullUrl } = require('./route')
diff --git a/core/base-service/redirector.js b/core/base-service/redirector.js
index 490296e4b6c065a257bf07992f2513f4e3ee75b5..ab4879faa26687512e8500d0c768efb4f5b1ab4b 100644
--- a/core/base-service/redirector.js
+++ b/core/base-service/redirector.js
@@ -2,7 +2,7 @@
 
 const camelcase = require('camelcase')
 const emojic = require('emojic')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const queryString = require('query-string')
 const BaseService = require('./base')
 const {
diff --git a/core/base-service/route.js b/core/base-service/route.js
index ecae022e686e0a4f5a77124f60f19bf40fcc30df..e9678eb28abc186abc73291d485f7367dc389f46 100644
--- a/core/base-service/route.js
+++ b/core/base-service/route.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const pathToRegexp = require('path-to-regexp')
 
 function makeFullUrl(base, partialUrl) {
diff --git a/core/base-service/route.spec.js b/core/base-service/route.spec.js
index b3f9c2e23c6b007abdc397d588cc880016e79dac..8eda13d66669d5887d7c274b5cb70e06d843d55a 100644
--- a/core/base-service/route.spec.js
+++ b/core/base-service/route.spec.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { expect } = require('chai')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { test, given, forCases } = require('sazerac')
 const {
   prepareRoute,
diff --git a/core/base-service/service-definitions.js b/core/base-service/service-definitions.js
index b38b04efae937c6a0459b87625a4001c7936265c..a98c6163033144b95e35ec608f2d08f639885ed4 100644
--- a/core/base-service/service-definitions.js
+++ b/core/base-service/service-definitions.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 // This should be kept in sync with the schema in
 // `frontend/lib/service-definitions/service-definition-prop-types.js`.
diff --git a/core/base-service/validate.js b/core/base-service/validate.js
index 60369a5ca52407e21c601c27c8c6faf20c3d3ec7..f27ee660181da3d980fa2fac576d2eb1a6e030f9 100644
--- a/core/base-service/validate.js
+++ b/core/base-service/validate.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const emojic = require('emojic')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const trace = require('./trace')
 
 function validate(
diff --git a/core/base-service/validate.spec.js b/core/base-service/validate.spec.js
index a2680f0d034be13389d36b4c2f2db6f845ed0dfa..72e34698dab758e0be5923713dc6f30188e2a230 100644
--- a/core/base-service/validate.spec.js
+++ b/core/base-service/validate.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const trace = require('./trace')
diff --git a/core/server/server.js b/core/server/server.js
index d8c21943ad6d8828003a70b6d85a23eb86eda0a8..27b0a199aff400f4cb1ddbcf7f7f266aac81cf29 100644
--- a/core/server/server.js
+++ b/core/server/server.js
@@ -4,7 +4,7 @@ const fs = require('fs')
 const path = require('path')
 const url = require('url')
 const bytes = require('bytes')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const Camp = require('camp')
 const makeBadge = require('../../gh-badges/lib/make-badge')
 const GithubConstellation = require('../../services/github/github-constellation')
diff --git a/core/service-test-runner/icedfrisby-shields.js b/core/service-test-runner/icedfrisby-shields.js
index c227963c3131f5b7088163fc290bb09fb189f860..e846c6539347e1fe91b6ada11f6032c3dafb743a 100644
--- a/core/service-test-runner/icedfrisby-shields.js
+++ b/core/service-test-runner/icedfrisby-shields.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 
 // based on https://github.com/paulmelnikow/icedfrisby-nock/blob/master/icedfrisby-nock.js
diff --git a/doc/TUTORIAL.md b/doc/TUTORIAL.md
index 27ff5237a07a394d64f29ea38fa3cfb9d32c4881..77af23ae4b70d9250f4004fa65f2cdeacbf5bf06 100644
--- a/doc/TUTORIAL.md
+++ b/doc/TUTORIAL.md
@@ -188,7 +188,7 @@ const { renderVersionBadge } = require('..//version')
 const { BaseJsonService } = require('..')
 
 // (4)
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const schema = Joi.object({
   version: Joi.string().required(),
 }).required()
diff --git a/doc/rewriting-services.md b/doc/rewriting-services.md
index df7145b2548986353d58143a03093dcc06fc770b..217af55515ff7bc9b61a70bb5f2aff6cf08c33f0 100644
--- a/doc/rewriting-services.md
+++ b/doc/rewriting-services.md
@@ -152,7 +152,7 @@ Once the route is working, fill out `render()` and `handle()`.
 <details>
 
 ```js
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { errorMessagesFor } = require('./github-helpers')
 
 const issueSchema = Joi.object({
@@ -181,7 +181,7 @@ or create an abstract superclass like **PypiBase**:
 <details>
 
 ```js
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const BaseJsonService = require('../base-json')
 
 const schema = Joi.object({
diff --git a/lib/logos.js b/lib/logos.js
index dd639d7bffd8dc889bd0665471b8ecf52e77e956..adbda6c0b6e47651f77dee5b8ba7884f112a22be 100644
--- a/lib/logos.js
+++ b/lib/logos.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { toSvgColor } = require('../gh-badges/lib/color')
 const coalesce = require('../core/base-service/coalesce')
 const { svg2base64 } = require('./svg-helpers')
diff --git a/package-lock.json b/package-lock.json
index 6a51f9334f82e6a8f12be262ddfb8677dc15e7a3..82aa052e99dd7e42758137765046ead5cc8085c5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2082,6 +2082,34 @@
         }
       }
     },
+    "@hapi/address": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz",
+      "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw=="
+    },
+    "@hapi/hoek": {
+      "version": "6.2.4",
+      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.4.tgz",
+      "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A=="
+    },
+    "@hapi/joi": {
+      "version": "15.0.3",
+      "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.0.3.tgz",
+      "integrity": "sha512-z6CesJ2YBwgVCi+ci8SI8zixoj8bGFn/vZb9MBPbSyoxsS2PnWYjHcyTM17VLK6tx64YVK38SDIh10hJypB+ig==",
+      "requires": {
+        "@hapi/address": "2.x.x",
+        "@hapi/hoek": "6.x.x",
+        "@hapi/topo": "3.x.x"
+      }
+    },
+    "@hapi/topo": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.0.tgz",
+      "integrity": "sha512-gZDI/eXOIk8kP2PkUKjWu9RW8GGVd2Hkgjxyr/S7Z+JF+0mr7bAlbw+DkTRxnD580o8Kqxlnba9wvqp5aOHBww==",
+      "requires": {
+        "@hapi/hoek": "6.x.x"
+      }
+    },
     "@mapbox/react-click-to-select": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/@mapbox/react-click-to-select/-/react-click-to-select-2.2.0.tgz",
@@ -5265,9 +5293,9 @@
       }
     },
     "check-types": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.2.tgz",
-      "integrity": "sha512-rS6P/iiI/5YVTKc2uYi30l6rp3ygz3+C8woEGQMsJ/77tl5LiSrLxOIm4cNAG3RhjHeKXUn1GrzTED3heX3tPw==",
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz",
+      "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==",
       "dev": true
     },
     "cheerio": {
@@ -12134,6 +12162,16 @@
         "svgo": "^1.1.1"
       },
       "dependencies": {
+        "@hapi/joi": {
+          "version": "15.0.3",
+          "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.0.3.tgz",
+          "integrity": "sha512-z6CesJ2YBwgVCi+ci8SI8zixoj8bGFn/vZb9MBPbSyoxsS2PnWYjHcyTM17VLK6tx64YVK38SDIh10hJypB+ig==",
+          "requires": {
+            "@hapi/address": "2.x.x",
+            "@hapi/hoek": "6.x.x",
+            "@hapi/topo": "3.x.x"
+          }
+        },
         "anafanafo": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-1.0.0.tgz",
@@ -12645,7 +12683,8 @@
     "hoek": {
       "version": "6.1.2",
       "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.2.tgz",
-      "integrity": "sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q=="
+      "integrity": "sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q==",
+      "dev": true
     },
     "hoist-non-react-statics": {
       "version": "3.3.0",
@@ -13132,17 +13171,17 @@
       "dev": true
     },
     "icedfrisby": {
-      "version": "2.0.0-alpha.5",
-      "resolved": "https://registry.npmjs.org/icedfrisby/-/icedfrisby-2.0.0-alpha.5.tgz",
-      "integrity": "sha512-6Eqk/1P+yLWbvZOh9mblfAfDQWnNVadt7eoyJAaqEvnRSarvdj+qgTgAXKSLe2c3gF/PlcK9hSHIFJTyLj9Kpg==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/icedfrisby/-/icedfrisby-2.0.0.tgz",
+      "integrity": "sha512-jtFPSjvMEsGJwnJXWElXs6gKzelktiqjlf4rR4P/M5pNPnUJFZDMMStiW4SUUxGC24FwTfn0e6rths0aQnAL5A==",
       "dev": true,
       "requires": {
+        "@hapi/joi": "*",
         "chai": "^4.0.1",
         "chai-subset": "^1.3.0",
         "chai-things": "^0.2.0",
         "chalk": "^2.0.1",
         "check-types": "^8.0.1",
-        "joi": "*",
         "lodash": "^4.16.6",
         "qs": "^6.3.0",
         "request": "^2.76.0",
@@ -13964,6 +14003,7 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz",
       "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
+      "dev": true,
       "requires": {
         "punycode": "2.x.x"
       },
@@ -13971,7 +14011,8 @@
         "punycode": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+          "dev": true
         }
       }
     },
@@ -14324,6 +14365,7 @@
       "version": "14.3.1",
       "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
       "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
+      "dev": true,
       "requires": {
         "hoek": "6.x.x",
         "isemail": "3.x.x",
@@ -14331,17 +14373,17 @@
       }
     },
     "joi-extension-semver": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/joi-extension-semver/-/joi-extension-semver-2.0.0.tgz",
-      "integrity": "sha1-/XTCn1nDm2hlIlj0MCVDV2qYVQU=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/joi-extension-semver/-/joi-extension-semver-3.0.0.tgz",
+      "integrity": "sha512-uN1MwgMyUsXif7CH1CCxhrsr9cfbSkvSs8l/rMDzTBJNqbFijkNZ1dEI/7s8RlKOc0ljuPQFQYx6g1LBFNn93Q==",
       "requires": {
-        "semver": "^5.3.0"
+        "semver": "^6.1.1"
       },
       "dependencies": {
         "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz",
+          "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ=="
         }
       }
     },
@@ -23292,6 +23334,7 @@
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz",
       "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
+      "dev": true,
       "requires": {
         "hoek": "6.x.x"
       }
diff --git a/package.json b/package.json
index 70407b3bad4159a9ccd2dda1e842cb2cb48dc1ab..9b5f368a689a613726c0388a713d064bfac5154c 100644
--- a/package.json
+++ b/package.json
@@ -37,8 +37,8 @@
     "fsos": "^1.1.3",
     "gh-badges": "file:gh-badges",
     "glob": "^7.1.4",
-    "joi": "14.3.1",
-    "joi-extension-semver": "2.0.0",
+    "@hapi/joi": "^15.0.3",
+    "joi-extension-semver": "3.0.0",
     "js-yaml": "^3.13.1",
     "jsonpath": "~1.0.1",
     "lodash.countby": "^4.6.0",
@@ -192,7 +192,7 @@
     "got": "^9.6.0",
     "humanize-string": "^2.1.0",
     "husky": "^2.3.0",
-    "icedfrisby": "2.0.0-alpha.5",
+    "icedfrisby": "2.0.0",
     "icedfrisby-nock": "^1.1.0",
     "is-png": "^2.0.0",
     "is-svg": "^4.1.0",
diff --git a/services/amo/amo-base.js b/services/amo/amo-base.js
index 394f4014cf078148babc4333dfb3799e2186e183..20f1815786fdd34bdeb3ed3402be471cf26a640a 100644
--- a/services/amo/amo-base.js
+++ b/services/amo/amo-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/amo/amo-rating.tester.js b/services/amo/amo-rating.tester.js
index f17a90656f67ee0b20d190bbdf340063c3d9d264..55d83c436e2ffd04c3bc057e039594bc68ab6d34 100644
--- a/services/amo/amo-rating.tester.js
+++ b/services/amo/amo-rating.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isStarRating } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/ansible/ansible-quality.service.js b/services/ansible/ansible-quality.service.js
index b73e7805b070953478d45aeec17d749883743953..3590e03f6a2c521bc6de7dd00a9430c4b814d4ea 100644
--- a/services/ansible/ansible-quality.service.js
+++ b/services/ansible/ansible-quality.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { floorCount } = require('../color-formatters')
 const { BaseJsonService, InvalidResponse } = require('..')
 
diff --git a/services/ansible/ansible-role.service.js b/services/ansible/ansible-role.service.js
index 023219860badfea25f42e666f4bea3803920a164..4a121de3fb6333eba2946d42723e2e39bec64aca 100644
--- a/services/ansible/ansible-role.service.js
+++ b/services/ansible/ansible-role.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/apm/apm.service.js b/services/apm/apm.service.js
index d125b8bea2af34f49565c94c0bf1e3bd4528293e..1077daa9b82d6cb2ed89995879356d1092724f7f 100644
--- a/services/apm/apm.service.js
+++ b/services/apm/apm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderLicenseBadge } = require('../licenses')
 const { renderVersionBadge } = require('../version')
 const { metric } = require('../text-formatters')
diff --git a/services/appveyor/appveyor-base.js b/services/appveyor/appveyor-base.js
index 6dea851976c32b1ebe80cde012ca403f913b1bf7..9ba151d59e7cafce6b4ab0fc9be71ece970e8799 100644
--- a/services/appveyor/appveyor-base.js
+++ b/services/appveyor/appveyor-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 const { isBuildStatus } = require('../build-status')
diff --git a/services/appveyor/appveyor-tests.tester.js b/services/appveyor/appveyor-tests.tester.js
index df81a2de2e521254e73835008387b352311f360a..a08bc2937ac3394d1d215da367f6d7df5d238678 100644
--- a/services/appveyor/appveyor-tests.tester.js
+++ b/services/appveyor/appveyor-tests.tester.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const queryString = require('querystring')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isAppveyorTestTotals = Joi.string().regex(
diff --git a/services/archlinux/archlinux.service.js b/services/archlinux/archlinux.service.js
index 4e44952991cac90adbe7dcc6537ea20a305318df..8f3b8d32575bede9b28f2e8001803a367f76f2e5 100644
--- a/services/archlinux/archlinux.service.js
+++ b/services/archlinux/archlinux.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/aur/aur.service.js b/services/aur/aur.service.js
index 1abee0c2e32b5f159e864e4ba777f0b616f45bb5..fcbecb199ca3cb215d6b2e5224f0c869d7789eda 100644
--- a/services/aur/aur.service.js
+++ b/services/aur/aur.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { addv, metric } = require('../text-formatters')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/azure-devops/azure-devops-base.js b/services/azure-devops/azure-devops-base.js
index a628e97fbf83c4e0831f8e035fc3be28adf0b691..803156c6c66deda126387bb1fe95bb29f82f1464 100644
--- a/services/azure-devops/azure-devops-base.js
+++ b/services/azure-devops/azure-devops-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 
 const latestBuildSchema = Joi.object({
diff --git a/services/azure-devops/azure-devops-coverage.service.js b/services/azure-devops/azure-devops-coverage.service.js
index 4570d6c0ae20d8516df4920ddfeb5470fe06efc5..9a72c5b1ff4853c08c81a388969bbd4546834fae 100644
--- a/services/azure-devops/azure-devops-coverage.service.js
+++ b/services/azure-devops/azure-devops-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
diff --git a/services/azure-devops/azure-devops-helpers.js b/services/azure-devops/azure-devops-helpers.js
index 645e80a692ed907dda5be9c529bfc7f4c52682ab..2bfbc66d38e29a6e4160157644a1a1f0c24a4300 100644
--- a/services/azure-devops/azure-devops-helpers.js
+++ b/services/azure-devops/azure-devops-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { isBuildStatus } = require('../build-status')
 
diff --git a/services/azure-devops/azure-devops-tests.service.js b/services/azure-devops/azure-devops-tests.service.js
index 53c78400bcfcd0f12d3eff332cae68b9afa1f3bc..dac59b834acad4aea883aba81e25b20d2de95541 100644
--- a/services/azure-devops/azure-devops-tests.service.js
+++ b/services/azure-devops/azure-devops-tests.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   testResultQueryParamSchema,
   renderTestResultBadge,
diff --git a/services/azure-devops/azure-devops-tests.tester.js b/services/azure-devops/azure-devops-tests.tester.js
index bcc1bc8f226216de88194e45b05beb8d8ff68f04..23b1a94fdfc880f447c412e3ce7e933c11fbbb62 100644
--- a/services/azure-devops/azure-devops-tests.tester.js
+++ b/services/azure-devops/azure-devops-tests.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const org = 'azuredevops-powershell'
diff --git a/services/beerpay/beerpay.service.js b/services/beerpay/beerpay.service.js
index 8b2f991b2641f93a7b60642f09af9b6e29112ffe..9e9619a09f4e374f705094b8f8eda0a0654e8049 100644
--- a/services/beerpay/beerpay.service.js
+++ b/services/beerpay/beerpay.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/bintray/bintray.service.js b/services/bintray/bintray.service.js
index e3f31577ef705825a84454845436e6a08171a081..09e3940558536bc9af9743307f5c427c1597b13d 100644
--- a/services/bintray/bintray.service.js
+++ b/services/bintray/bintray.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const serverSecrets = require('../../lib/server-secrets')
 const { BaseJsonService } = require('..')
diff --git a/services/bit/bit-components.service.js b/services/bit/bit-components.service.js
index 84b1a910049c33f25efd640f4ff748b96cc7dba8..41cd8992953bd97fb95454890293f098f97fb959 100644
--- a/services/bit/bit-components.service.js
+++ b/services/bit/bit-components.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/bitbucket/bitbucket-issues.service.js b/services/bitbucket/bitbucket-issues.service.js
index f4a88d440d0a9cfe91d1330d843a6a2a6f84cc6a..6acbbec2f1ca3d42509165ca9f96e99d941f991e 100644
--- a/services/bitbucket/bitbucket-issues.service.js
+++ b/services/bitbucket/bitbucket-issues.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/bitbucket/bitbucket-pipelines.service.js b/services/bitbucket/bitbucket-pipelines.service.js
index b4d1ae3b4dd71db20d4c7e63e884490a3caf4534..048d44788afbd8829ae70cecab258732e7353aa8 100644
--- a/services/bitbucket/bitbucket-pipelines.service.js
+++ b/services/bitbucket/bitbucket-pipelines.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bitbucket/bitbucket-pull-request.service.js b/services/bitbucket/bitbucket-pull-request.service.js
index aff30a50aa4bbcc94efb486d9894f91d980e7566..9e46c5dbff595358fd8c1affb457618e318c9ac6 100644
--- a/services/bitbucket/bitbucket-pull-request.service.js
+++ b/services/bitbucket/bitbucket-pull-request.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger, optionalUrl } = require('../validators')
diff --git a/services/bitrise/bitrise.service.js b/services/bitrise/bitrise.service.js
index bea0999be30d394873a2fa71a08467705123441d..95b635a4f137aab641c25b09708027ac4d2004b0 100644
--- a/services/bitrise/bitrise.service.js
+++ b/services/bitrise/bitrise.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 // https://devcenter.bitrise.io/api/app-status-badge/
diff --git a/services/bountysource/bountysource.service.js b/services/bountysource/bountysource.service.js
index 9226c9b00113b60c7db14c8f82ec35399c446767..7f1a05b9e32a8bb057cab9a2fe28d067b0b8ff8a 100644
--- a/services/bountysource/bountysource.service.js
+++ b/services/bountysource/bountysource.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { BaseJsonService } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
 
diff --git a/services/bower/bower-base.js b/services/bower/bower-base.js
index 035844993acfcfb304cde7ba7ec8ab7f7a80d17b..793102d70a631a93e77bc289d75a1932b73cffbc 100644
--- a/services/bower/bower-base.js
+++ b/services/bower/bower-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object()
diff --git a/services/bower/bower-version.tester.js b/services/bower/bower-version.tester.js
index 15ed9f06d07069eb2694186d219142099ad409f9..1d2af8795b6f07459f31eb1fe854ca2b3aaea251 100644
--- a/services/bower/bower-version.tester.js
+++ b/services/bower/bower-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/bstats/bstats-players.service.js b/services/bstats/bstats-players.service.js
index 14754368958c38ed09493c23447b7e0d8eb4bec6..38258ac9dde4d7454449696f20cdf214a0647b08 100644
--- a/services/bstats/bstats-players.service.js
+++ b/services/bstats/bstats-players.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bstats/bstats-servers.service.js b/services/bstats/bstats-servers.service.js
index b5efdb38a31ffd1570f936bd49e6c2902f2a11ba..27c7df73956ec0209416a435b685543e43644530 100644
--- a/services/bstats/bstats-servers.service.js
+++ b/services/bstats/bstats-servers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bugzilla/bugzilla.service.js b/services/bugzilla/bugzilla.service.js
index f957e605df1841eb72cfcacda72f884ffa635b28..29ae2045c55ba1750e55ea524d1b86f2a908ca4a 100644
--- a/services/bugzilla/bugzilla.service.js
+++ b/services/bugzilla/bugzilla.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/bugzilla/bugzilla.tester.js b/services/bugzilla/bugzilla.tester.js
index 4f13773f442e14d791ea74e20f182e6451b5ebd8..fd8f4ba9dfa6413fb58b77524349e09633b3d068 100644
--- a/services/bugzilla/bugzilla.tester.js
+++ b/services/bugzilla/bugzilla.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const bzBugStatus = Joi.equal(
diff --git a/services/build-status.js b/services/build-status.js
index 400de71f3387da4e0fa47b19d5bc7a866e84092d..f203de9796670c68e066e6d719b2813efacf61fd 100644
--- a/services/build-status.js
+++ b/services/build-status.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const greenStatuses = [
   'fixed',
diff --git a/services/buildkite/buildkite.service.js b/services/buildkite/buildkite.service.js
index f9578cfddf8ff228e8758028dee2dba5e40b6675..510c37562c7baead206c37f571fab4c7fca019a6 100644
--- a/services/buildkite/buildkite.service.js
+++ b/services/buildkite/buildkite.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 
diff --git a/services/buildkite/buildkite.tester.js b/services/buildkite/buildkite.tester.js
index bca5c506e74e6ff7f2552696c4af6e6e7e2420ce..fe15e3d088a12fb317a92bae705d53f1a1a5b7de 100644
--- a/services/buildkite/buildkite.tester.js
+++ b/services/buildkite/buildkite.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/bundlephobia/bundlephobia.service.js b/services/bundlephobia/bundlephobia.service.js
index 869d24175ff36565393ce8fd79e3b65f3ac35fdb..fb8ccf924b2ad38e2e10b77d77e1d7e667383d44 100644
--- a/services/bundlephobia/bundlephobia.service.js
+++ b/services/bundlephobia/bundlephobia.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const prettyBytes = require('pretty-bytes')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/cdnjs/cdnjs.service.js b/services/cdnjs/cdnjs.service.js
index c993c5bba191d5024f5901639d417f98325486b3..a9b600d710c2a6ba20ad0b1f33117dac70bdcd2e 100644
--- a/services/cdnjs/cdnjs.service.js
+++ b/services/cdnjs/cdnjs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/chrome-web-store/chrome-web-store-price.tester.js b/services/chrome-web-store/chrome-web-store-price.tester.js
index cc2ffaa587f181b4ae3677e3403b1be7ef015593..4f0201aa71e35de93bb78df7aa0c196cb831aa0d 100644
--- a/services/chrome-web-store/chrome-web-store-price.tester.js
+++ b/services/chrome-web-store/chrome-web-store-price.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Price')
diff --git a/services/chrome-web-store/chrome-web-store-rating.tester.js b/services/chrome-web-store/chrome-web-store-rating.tester.js
index bf5d670442cc642504236bc985c9b7e9eb96abfa..a364b0fde151a54ddca4d828a6bff3d3bdde2436 100644
--- a/services/chrome-web-store/chrome-web-store-rating.tester.js
+++ b/services/chrome-web-store/chrome-web-store-rating.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isStarRating } = require('../test-validators')
 const { ServiceTester } = require('../tester')
 
diff --git a/services/cii-best-practices/cii-best-practices.service.js b/services/cii-best-practices/cii-best-practices.service.js
index 5a479aac590bd80aaab9022ef8a72d7eb610bf69..bc7eda1469e1efa187eb4a0df218d26df7387d91 100644
--- a/services/cii-best-practices/cii-best-practices.service.js
+++ b/services/cii-best-practices/cii-best-practices.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { colorScale, coveragePercentage } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/circleci/circleci.service.js b/services/circleci/circleci.service.js
index 02e3dfc8d39814236b48128fe2f154d30e044c22..5979a1bf7aa727268b49ef0ca7aa62721a67ef8b 100644
--- a/services/circleci/circleci.service.js
+++ b/services/circleci/circleci.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, redirector } = require('..')
 
diff --git a/services/clojars/clojars-base.js b/services/clojars/clojars-base.js
index 091cea7a4010e81087c06f3563cff3a23bb94ed7..f9e042499f630e12a7aec14d4e2e3c4944341c4f 100644
--- a/services/clojars/clojars-base.js
+++ b/services/clojars/clojars-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { version: versionColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/cocoapods/cocoapods-base.js b/services/cocoapods/cocoapods-base.js
index 240d69d59a92a554c2784e06b010ce30c218b406..505196f48341de9fa31a3ab876eb7e3b4a006389 100644
--- a/services/cocoapods/cocoapods-base.js
+++ b/services/cocoapods/cocoapods-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/cocoapods/cocoapods-docs.service.js b/services/cocoapods/cocoapods-docs.service.js
index 97ee6af84ac83c0ad0d05d848a726be30c52fe4f..b2b0e8932e8c6705bc14a5dc846a602aa0fddb73 100644
--- a/services/cocoapods/cocoapods-docs.service.js
+++ b/services/cocoapods/cocoapods-docs.service.js
@@ -3,7 +3,7 @@
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/cocoapods/cocoapods-platform.tester.js b/services/cocoapods/cocoapods-platform.tester.js
index 74f8c3f40d08aaf99052ab947e51bbf23495c242..d8ffe1672363dc2cc0b8ee93f6f325a9cd5dd2f3 100644
--- a/services/cocoapods/cocoapods-platform.tester.js
+++ b/services/cocoapods/cocoapods-platform.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isPlatform = Joi.string().regex(
diff --git a/services/codacy/codacy-coverage.service.js b/services/codacy/codacy-coverage.service.js
index fe8da74e6177e5caaaf7929a26bc1b8d3b23a69d..dc4436b8dd2f5c1b1a8be68c419987a9fc94719e 100644
--- a/services/codacy/codacy-coverage.service.js
+++ b/services/codacy/codacy-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
diff --git a/services/codacy/codacy-grade.service.js b/services/codacy/codacy-grade.service.js
index b375fa829b768fa9387c90fe6447fe68fa35f4f0..337a835ae469238238cdb251e948fee67adc7b18 100644
--- a/services/codacy/codacy-grade.service.js
+++ b/services/codacy/codacy-grade.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseSvgScrapingService } = require('..')
 const { codacyGrade } = require('./codacy-helpers')
 
diff --git a/services/codacy/codacy-helpers.js b/services/codacy/codacy-helpers.js
index 9c222194c34c9752ad5ef1571e8e4c1f88890760..308456981bd40802cf30d3f166902c7f4f934dd4 100644
--- a/services/codacy/codacy-helpers.js
+++ b/services/codacy/codacy-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const codacyGrade = Joi.equal('A', 'B', 'C', 'D', 'E', 'F')
 
diff --git a/services/codeclimate/codeclimate-analysis.service.js b/services/codeclimate/codeclimate-analysis.service.js
index e41ff49979a90dba6014f77a65461726bcaee7b1..c5686cbec8ce22edd616ab01e15299f8caa66e58 100644
--- a/services/codeclimate/codeclimate-analysis.service.js
+++ b/services/codeclimate/codeclimate-analysis.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { colorScale, letterScore } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/codeclimate/codeclimate-analysis.tester.js b/services/codeclimate/codeclimate-analysis.tester.js
index 27b272f2b344f190178564233dfb484101cb3750..1b2dc6d70a0ba3dadd00fc2248193a0983322ea5 100644
--- a/services/codeclimate/codeclimate-analysis.tester.js
+++ b/services/codeclimate/codeclimate-analysis.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isIntegerPercentage } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/codeclimate/codeclimate-common.js b/services/codeclimate/codeclimate-common.js
index 94c441a5ca5e236adc4bbbba345d09b0ee75301d..fc5b09fca7e1a28d483477b2c3f68cea17a07f1a 100644
--- a/services/codeclimate/codeclimate-common.js
+++ b/services/codeclimate/codeclimate-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { NotFound } = require('..')
 
 const keywords = ['codeclimate']
diff --git a/services/codeclimate/codeclimate-coverage.service.js b/services/codeclimate/codeclimate-coverage.service.js
index 96c7972d06027714a42ed9ae1cc7091708ea0159..c7c59ea8d6d4a405e0dd5fb922282c5bb9bb680d 100644
--- a/services/codeclimate/codeclimate-coverage.service.js
+++ b/services/codeclimate/codeclimate-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { coveragePercentage, letterScore } = require('../color-formatters')
 const { keywords, isLetterGrade, fetchRepo } = require('./codeclimate-common')
diff --git a/services/codeclimate/codeclimate-coverage.tester.js b/services/codeclimate/codeclimate-coverage.tester.js
index ebda92499ace89b857eee3ce2c56f7019972441e..0157c9fb157aaa605bae738f51a1d6f5dd5ffc97 100644
--- a/services/codeclimate/codeclimate-coverage.tester.js
+++ b/services/codeclimate/codeclimate-coverage.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isIntegerPercentage } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/codecov/codecov.service.js b/services/codecov/codecov.service.js
index ac945a1e80c23c1702a81797ed766177a4aaabfe..f69cfe76538dd3645d7deaddec29da54d5f9141c 100644
--- a/services/codecov/codecov.service.js
+++ b/services/codecov/codecov.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { coveragePercentage } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/codeship/codeship.service.js b/services/codeship/codeship.service.js
index 5768fee7b9d0b28433f1f9f96881dbbe6b54d50f..64f966c93af9e42af7308b40843b7aeb4e9c8bff 100644
--- a/services/codeship/codeship.service.js
+++ b/services/codeship/codeship.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseSvgScrapingService } = require('..')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 
diff --git a/services/codetally/codetally.service.js b/services/codetally/codetally.service.js
index 657d6efc3ff73baccf25279f9537465253b248ce..22f5698a33c1a74d833b89ef5bfb61204f7352c6 100644
--- a/services/codetally/codetally.service.js
+++ b/services/codetally/codetally.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/codetally/codetally.tester.js b/services/codetally/codetally.tester.js
index 3fc5e5b0ab1739e466d752e199c098ea9a501f99..88384254c63bf568787dfd663eb39ddd36d4064e 100644
--- a/services/codetally/codetally.tester.js
+++ b/services/codetally/codetally.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 // This test will extract the currency value from the
diff --git a/services/conda/conda-base.js b/services/conda/conda-base.js
index 897318af0354ddc375fc718268f4cb25a631af0e..0752f22184946889fc621f68e936fe3f4b739307 100644
--- a/services/conda/conda-base.js
+++ b/services/conda/conda-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/conda/conda.tester.js b/services/conda/conda.tester.js
index 8d222f21a3aa369a63d98592c4dce08a0e3de15a..12e3f69f2c876af59698e9426e33b83baaf71b1a 100644
--- a/services/conda/conda.tester.js
+++ b/services/conda/conda.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isVPlusTripleDottedVersion, isMetric } = require('../test-validators')
 
diff --git a/services/continuousphp/continuousphp.service.js b/services/continuousphp/continuousphp.service.js
index a56b8284a2f91824c94d38ee4943ad4ca02eabde..69f3bf460ca8df74a6586aa696d7f4fdb19235d4 100644
--- a/services/continuousphp/continuousphp.service.js
+++ b/services/continuousphp/continuousphp.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/continuousphp/continuousphp.tester.js b/services/continuousphp/continuousphp.tester.js
index 6fa7f59fc592a31468ec14177b91cbf0e98d542a..7f597be6b53c96a4256026bdd1b2955e6128ab5a 100644
--- a/services/continuousphp/continuousphp.tester.js
+++ b/services/continuousphp/continuousphp.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/cookbook/cookbook.service.js b/services/cookbook/cookbook.service.js
index 249d8f4a922bae57f3c03312c32b540ec54d4d95..98106e6df76fa53d40c7beacf69b52bfabd469a7 100644
--- a/services/cookbook/cookbook.service.js
+++ b/services/cookbook/cookbook.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/coveralls/coveralls.service.js b/services/coveralls/coveralls.service.js
index a65720cf048199e558339f2195a7e6f886b092b3..5c1467fadca4f3f9e5ee4942e11e5e8dc93f0709 100644
--- a/services/coveralls/coveralls.service.js
+++ b/services/coveralls/coveralls.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { coveragePercentage } = require('../color-formatters')
 
diff --git a/services/coverity/coverity-scan.service.js b/services/coverity/coverity-scan.service.js
index ab3a0d866a122e0ec59cd107ac89bafc2e1f182f..ac8e95b5097f07b98cab3dee09ae57081a9b6e8d 100644
--- a/services/coverity/coverity-scan.service.js
+++ b/services/coverity/coverity-scan.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const messageRegex = /passed|passed .* new defects|pending|failed/
diff --git a/services/coverity/coverity-scan.tester.js b/services/coverity/coverity-scan.tester.js
index acbd517cc500affcf6998e34a1a4ecb0d8f4c599..7dbb39ccf36225d8be73d659f6f95571de94f34a 100644
--- a/services/coverity/coverity-scan.tester.js
+++ b/services/coverity/coverity-scan.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('live: known project id')
diff --git a/services/cpan/cpan.js b/services/cpan/cpan.js
index 8c0932a453b6ea252c2f538ae6a33f3e4a3d7ce4..818b0f80e412583d0861e28768b3751892be0433 100644
--- a/services/cpan/cpan.js
+++ b/services/cpan/cpan.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/cran/cran.service.js b/services/cran/cran.service.js
index d91c59fc7911ea1191cab1bfec6bbce8cd495005..d54800a231b12a404572a1b07e73a82d10c016bb 100644
--- a/services/cran/cran.service.js
+++ b/services/cran/cran.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/crates/crates-base.js b/services/crates/crates-base.js
index f7ba70734f14ab00ee4174ec1753cbed34795b35..7713ad745620e9d56e7d6c08d572b60fea89d754 100644
--- a/services/crates/crates-base.js
+++ b/services/crates/crates-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/ctan/ctan.service.js b/services/ctan/ctan.service.js
index 646bf24fd4a2634ab5f46ba9e5a300aa8d2e9318..342bbfa924eef64ca2c78cf3770709b6c407eddf 100644
--- a/services/ctan/ctan.service.js
+++ b/services/ctan/ctan.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderLicenseBadge } = require('../licenses')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
diff --git a/services/david/david.service.js b/services/david/david.service.js
index 030bf4b4999d7c594a98151bb81c84fa3245db37..a48874ea95fd4b6f1487a355a3e665a378e4dd63 100644
--- a/services/david/david.service.js
+++ b/services/david/david.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/david/david.tester.js b/services/david/david.tester.js
index 21400f45a8aaf8e6dc89992e9e339e431bb76a10..72f50c5057cb0fc5bf568dc140f96aeb526d17c4 100644
--- a/services/david/david.tester.js
+++ b/services/david/david.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isDependencyStatus = Joi.string().valid(
diff --git a/services/debian/debian.service.js b/services/debian/debian.service.js
index c993ad2902fa2753464c9f49bd957a1a8a481642..fecfb8b0f17784a5e606209c309eb2c3fd84ed77 100644
--- a/services/debian/debian.service.js
+++ b/services/debian/debian.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { latest, renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/debug/debug.tester.js b/services/debug/debug.tester.js
index 2885b9479d1852a352d1a7570f8cceb1e8e0c176..745862ad3f97f427b72eed0ad8a78647828c1e62 100644
--- a/services/debug/debug.tester.js
+++ b/services/debug/debug.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('start time')
diff --git a/services/dependabot/dependabot.service.js b/services/dependabot/dependabot.service.js
index d403048e64ff50e7b2c5bf9a4e579f724aedc0b9..73b683415f4325175c9926989115826e8bbaff3f 100644
--- a/services/dependabot/dependabot.service.js
+++ b/services/dependabot/dependabot.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const url = require('url')
 const { BaseJsonService } = require('..')
 
diff --git a/services/depfu/depfu.service.js b/services/depfu/depfu.service.js
index 489302b57c30d57c8c11d9e8036e92094899ef22..77fe36b02443cf6da9af65c40bc0dec646e6a36a 100644
--- a/services/depfu/depfu.service.js
+++ b/services/depfu/depfu.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const depfuSchema = Joi.object({
diff --git a/services/depfu/depfu.tester.js b/services/depfu/depfu.tester.js
index 957704f3c47cbe4072e801402d068bbdea2efe35..d8fea928d4037e5d389fef2137cc543464509fe5 100644
--- a/services/depfu/depfu.tester.js
+++ b/services/depfu/depfu.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 
 const isDependencyStatus = Joi.string().valid(
diff --git a/services/discord/discord.service.js b/services/discord/discord.service.js
index d112b3ea745d00b012eb312670fdb4d6662c9cf1..3791781be0ae7091cbbea706e797e1756ef91747 100644
--- a/services/discord/discord.service.js
+++ b/services/discord/discord.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const discordSchema = Joi.object({
diff --git a/services/discord/discord.tester.js b/services/discord/discord.tester.js
index 5e3d8aff381b62f3a146a78dded1b6efa1959ed2..86517e1a40a7da873ec74b9196bcf6acd2938a1d 100644
--- a/services/discord/discord.tester.js
+++ b/services/discord/discord.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('gets status for Reactiflux')
diff --git a/services/discourse/discourse.service.js b/services/discourse/discourse.service.js
index ab5e38c29cd10e1740081f212b597f2741ec17e5..485030d02a129ebdfb8e9ccc1008dcf563857c7a 100644
--- a/services/discourse/discourse.service.js
+++ b/services/discourse/discourse.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const camelcase = require('camelcase')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/discourse/discourse.tester.js b/services/discourse/discourse.tester.js
index 39ef838eda55974df78550fce89483df7f5a1f95..ba1f07e655e17b191a3add255a526b3d71bf14c8 100644
--- a/services/discourse/discourse.tester.js
+++ b/services/discourse/discourse.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 
 const t = (module.exports = new ServiceTester({
diff --git a/services/docker/docker-automated.service.js b/services/docker/docker-automated.service.js
index 80cc56f3857090a766bbfda9735dab807faa5c03..509a85a19a64dd2b0c6ea06aaae8253de5b8ba70 100644
--- a/services/docker/docker-automated.service.js
+++ b/services/docker/docker-automated.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const {
   dockerBlue,
diff --git a/services/docker/docker-automated.tester.js b/services/docker/docker-automated.tester.js
index 4cc144d7ceb9ac87ad9d3a237e35d8facf743663..f98d2144282d86be26f004df6d6cf51b2bf45d23 100644
--- a/services/docker/docker-automated.tester.js
+++ b/services/docker/docker-automated.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { dockerBlue } = require('./docker-helpers')
 
diff --git a/services/docker/docker-build.service.js b/services/docker/docker-build.service.js
index 698c58b396a743ff754eeee524d8da3839a0701f..0dc6000f860baf521602760c7b83a70ed2e6eb6d 100644
--- a/services/docker/docker-build.service.js
+++ b/services/docker/docker-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { anyInteger } = require('../validators')
 const {
diff --git a/services/docker/docker-cloud-automated.tester.js b/services/docker/docker-cloud-automated.tester.js
index 22d508dcc3be25ee681d6f82ab4dbc9848ddee10..e3827f21b51c496096bbd78e7128a7bf2c716492 100644
--- a/services/docker/docker-cloud-automated.tester.js
+++ b/services/docker/docker-cloud-automated.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { dockerBlue } = require('./docker-helpers')
 
diff --git a/services/docker/docker-cloud-common-fetch.js b/services/docker/docker-cloud-common-fetch.js
index 8ac3db1fa4f69ab30c8d7398d893fbb061b89169..2f10c52eebf1aaa406846d5e3eff497751d98a73 100644
--- a/services/docker/docker-cloud-common-fetch.js
+++ b/services/docker/docker-cloud-common-fetch.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const cloudBuildSchema = Joi.object({
   objects: Joi.array()
diff --git a/services/docker/docker-pulls.service.js b/services/docker/docker-pulls.service.js
index 12bdcd69ebe101ee2338a5c4343d52cf54c83994..deddccd4e74dfd3b9f1ad39e4cded1d36964424a 100644
--- a/services/docker/docker-pulls.service.js
+++ b/services/docker/docker-pulls.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/drone/drone-build.service.js b/services/drone/drone-build.service.js
index 77018457e16498a88f83817381305a82701d84f6..3375fed785a2b3896a63ebf8537342c165bd5bd5 100644
--- a/services/drone/drone-build.service.js
+++ b/services/drone/drone-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { optionalUrl } = require('../validators')
diff --git a/services/drone/drone-build.tester.js b/services/drone/drone-build.tester.js
index 1ea88667cfb383f6956c930d9ff109234d657720..9a9f3e07da50de50073d3d01da1dcc1f15a63668 100644
--- a/services/drone/drone-build.tester.js
+++ b/services/drone/drone-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 const { mockDroneCreds, token, restore } = require('./drone-test-helpers')
diff --git a/services/dub/dub-download.service.js b/services/dub/dub-download.service.js
index 188a1cb690e90c0da7fc9987046b1dec336fdb68..f25d94893c6c6863ddd257ffaf4944c419d19cc2 100644
--- a/services/dub/dub-download.service.js
+++ b/services/dub/dub-download.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/dub/dub-download.tester.js b/services/dub/dub-download.tester.js
index 22d3407ecf6c6ba6e6989bbf112dfcde8eacfbd6..32f06a887b187f1e79c48d328a99bfddadabab01 100644
--- a/services/dub/dub-download.tester.js
+++ b/services/dub/dub-download.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isMetric, isMetricOverTimePeriod } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/dub/dub-license.service.js b/services/dub/dub-license.service.js
index 86982292e0a4051605d358e556fe43b28ad18e44..3a68c843f73a85a5eec6d9d8e2d27c44f4e8be87 100644
--- a/services/dub/dub-license.service.js
+++ b/services/dub/dub-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderLicenseBadge } = require('../licenses')
 const { BaseJsonService } = require('..')
 
diff --git a/services/dub/dub-version.service.js b/services/dub/dub-version.service.js
index c4eb2ff6ca4d527ab6478989fc516b06d8f04263..e209feba84e4506ca51c441bcee5ba6b6ff91df5 100644
--- a/services/dub/dub-version.service.js
+++ b/services/dub/dub-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/dub/dub-version.tester.js b/services/dub/dub-version.tester.js
index 972c7256e377ce99e316ab40d55c44504c16233c..26824bdee41c56c47ecb5cc5d16c087e9d48f215 100644
--- a/services/dub/dub-version.tester.js
+++ b/services/dub/dub-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
diff --git a/services/dynamic-common.js b/services/dynamic-common.js
index 060b075982e02058584cfd5178283e0f4a5ea35a..80e25754fcb284d614550f5a69b371279229b5db 100644
--- a/services/dynamic-common.js
+++ b/services/dynamic-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const toArray = require('../core/base-service/to-array')
 const validate = require('../core/base-service/validate')
 const { InvalidResponse } = require('.')
diff --git a/services/dynamic/dynamic-helpers.js b/services/dynamic/dynamic-helpers.js
index 6921857674490eaa1153794bebe07aced9bd62d8..ceddf69f747dd590f5b76d398ccf39e990c2183d 100644
--- a/services/dynamic/dynamic-helpers.js
+++ b/services/dynamic/dynamic-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { optionalUrl } = require('../validators')
 
 const queryParamSchema = Joi.object({
diff --git a/services/dynamic/dynamic-json.service.js b/services/dynamic/dynamic-json.service.js
index abce5fc774d0b999f05f86be4c4a1826d0e676ac..7b0f6443a72529b06174f8ed45bc16985a77c1b1 100644
--- a/services/dynamic/dynamic-json.service.js
+++ b/services/dynamic/dynamic-json.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const jp = require('jsonpath')
 const { BaseJsonService, InvalidResponse } = require('..')
 const { renderDynamicBadge, errorMessages } = require('../dynamic-common')
diff --git a/services/dynamic/dynamic-json.tester.js b/services/dynamic/dynamic-json.tester.js
index 41b74354791c488c6bf1e2feb7434a52174ff505..605748af2ac9486abc33bdef91226e7a94df99a7 100644
--- a/services/dynamic/dynamic-json.tester.js
+++ b/services/dynamic/dynamic-json.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/dynamic/dynamic-yaml.service.js b/services/dynamic/dynamic-yaml.service.js
index 800467f29a010a838945825c06138aa0da56e05a..1cf8a07851893cf0478d0cd9c6a75bf08f71194c 100644
--- a/services/dynamic/dynamic-yaml.service.js
+++ b/services/dynamic/dynamic-yaml.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const jp = require('jsonpath')
 const { BaseYamlService, InvalidResponse } = require('..')
 const { renderDynamicBadge, errorMessages } = require('../dynamic-common')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js b/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js
index 45b1f3fe206caef820659a9a0d23c9e03129cb1a..abd347f20c9f09869c807545e507171880e557af 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js b/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js
index 2a2d5acbb697c8d417b6f34c2fd63d32a63924f0..7406cf51fb637438c3319820141340f131097025 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const EclipseMarketplaceBase = require('./eclipse-marketplace-base')
 
diff --git a/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js b/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js
index 3a3c9070e81afb54622ad9e3020a1cd29753b7aa..e8c2f77b5a3f187b5c4cb4f77bf7bbee2bc491ee 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('favorites count')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-license.service.js b/services/eclipse-marketplace/eclipse-marketplace-license.service.js
index 44ab9d76ea7d7f2b59a00b5aab61e48240f83f12..856e6d24d3f3bf8c6263915829f0ef3157af5005 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-license.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const EclipseMarketplaceBase = require('./eclipse-marketplace-base')
 
 const licenseResponseSchema = Joi.object({
diff --git a/services/eclipse-marketplace/eclipse-marketplace-update.service.js b/services/eclipse-marketplace/eclipse-marketplace-update.service.js
index e931f6e2743964600587c0c332ad369a511e09ca..2fa6e325539e81d3080b63be656a6b234179f74b 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-update.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-update.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { formatDate } = require('../text-formatters')
 const { age: ageColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-version.service.js b/services/eclipse-marketplace/eclipse-marketplace-version.service.js
index bf05533df9635d4cc0ceead48c8a04acfd9898ef..5d35707b6dfc1576c9e070b424c90a56bffa57d9 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-version.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const EclipseMarketplaceBase = require('./eclipse-marketplace-base')
 
diff --git a/services/elm-package/elm-package.service.js b/services/elm-package/elm-package.service.js
index 6b4a180e67c001bf8f79becec4faad05af839c93..7ee72c11d95b5b8be453bb15924ffa3bff7a385a 100644
--- a/services/elm-package/elm-package.service.js
+++ b/services/elm-package/elm-package.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 const { semver } = require('../validators')
diff --git a/services/endpoint-common.js b/services/endpoint-common.js
index c404a5e2e34d011e287d3e64252da0cac56ee2ad..6794a20d84f32aca51e8ce72a62947c4d4ed2a0d 100644
--- a/services/endpoint-common.js
+++ b/services/endpoint-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const validate = require('../core/base-service/validate')
 const { InvalidResponse } = require('.')
 
diff --git a/services/endpoint/endpoint.service.js b/services/endpoint/endpoint.service.js
index 65e1504db6e71c71df6a93f9a796c0756d20918a..8b8ad69c1af549d025a4daa6354d33f9a8bd58ca 100644
--- a/services/endpoint/endpoint.service.js
+++ b/services/endpoint/endpoint.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { URL } = require('url')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, InvalidParameter } = require('..')
 const { errorMessages } = require('../dynamic-common')
 const { optionalUrl } = require('../validators')
diff --git a/services/f-droid/f-droid.service.js b/services/f-droid/f-droid.service.js
index 89209c71602774e22a7e460caf36fcfeeaf4dde0..df87f325f988cc155a7ea70b86c2d7a539a37308 100644
--- a/services/f-droid/f-droid.service.js
+++ b/services/f-droid/f-droid.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { addv } = require('../text-formatters')
 const { version: versionColor } = require('../color-formatters')
 const { BaseYamlService, InvalidResponse } = require('..')
diff --git a/services/fedora/fedora.service.js b/services/fedora/fedora.service.js
index ee087866c02d34f154cc0a0100837a006dbd9b21..240df13c935c11ecdb7f5130a70c9343f68b2232 100644
--- a/services/fedora/fedora.service.js
+++ b/services/fedora/fedora.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/gem/gem-downloads.service.js b/services/gem/gem-downloads.service.js
index 8b940c94ab10ed2e3c297ac7a57aeeebb8b11dab..db5848a5213fbdf0bb198637f3aafe978ba550ec 100644
--- a/services/gem/gem-downloads.service.js
+++ b/services/gem/gem-downloads.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const semver = require('semver')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { latest: latestVersion } = require('../version')
diff --git a/services/gem/gem-owner.service.js b/services/gem/gem-owner.service.js
index 68ad57f7be63b867b645939d198b7aefac2e1e49..19932243fccee1303fba51889be0effc79e64b34 100644
--- a/services/gem/gem-owner.service.js
+++ b/services/gem/gem-owner.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { floorCount: floorCountColor } = require('../color-formatters')
 
diff --git a/services/gem/gem-owner.tester.js b/services/gem/gem-owner.tester.js
index 80d1d9286c8d7fbb2caca23af47363ef0269f0aa..4513dce24622531a47f7c15860bbf26deea7a2ca 100644
--- a/services/gem/gem-owner.tester.js
+++ b/services/gem/gem-owner.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('users (valid)')
diff --git a/services/gem/gem-rank.service.js b/services/gem/gem-rank.service.js
index 557914024c947b2193f0fad3a0a8e6fb29fc0e04..e63470d4137ccb7122f1495003a15aa6eb261758 100644
--- a/services/gem/gem-rank.service.js
+++ b/services/gem/gem-rank.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { floorCount } = require('../color-formatters')
 const { ordinalNumber } = require('../text-formatters')
 const { BaseJsonService, InvalidResponse } = require('..')
diff --git a/services/gem/gem-rank.tester.js b/services/gem/gem-rank.tester.js
index 6546d889deb57d2d4478bcbada80358e8ce19089..5a8bd5b4fc8a0e9add56d1b1ba4efb15fca84468 100644
--- a/services/gem/gem-rank.tester.js
+++ b/services/gem/gem-rank.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isOrdinalNumber = Joi.string().regex(/^[1-9][0-9]+(ᵗʰ|ˢᵗ|ⁿᵈ|ʳᵈ)$/)
diff --git a/services/gem/gem-version.service.js b/services/gem/gem-version.service.js
index 160b083eb39cd8d42c12407cb8d5a06372a9089e..abbdfecce41cd98c600bb0c3d8e6035b15d08480 100644
--- a/services/gem/gem-version.service.js
+++ b/services/gem/gem-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/github/github-api-provider.js b/services/github/github-api-provider.js
index b2c1663add66335061dd24c0b4c1d77d036121bb..6def1f9fcb5cc7494f74dc8ecb016f976c6ed9e4 100644
--- a/services/github/github-api-provider.js
+++ b/services/github/github-api-provider.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { TokenPool } = require('../../core/token-pooling/token-pool')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/github/github-commit-activity.service.js b/services/github/github-commit-activity.service.js
index 73c5723f501899a27d25d336152f7c0427d7a8d5..e5701b2e98054d4b6319858a27e83dc026b7bc6a 100644
--- a/services/github/github-commit-activity.service.js
+++ b/services/github/github-commit-activity.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-commit-status.service.js b/services/github/github-commit-status.service.js
index 90af2856e994c4133b18e856d343375e11577b8c..f6be212f767b75e5e7a457872878dc025892eb94 100644
--- a/services/github/github-commit-status.service.js
+++ b/services/github/github-commit-status.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { NotFound, InvalidParameter } = require('..')
 const { GithubAuthService } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-commits-since.service.js b/services/github/github-commits-since.service.js
index 175e2c53a48a1416eae3a9fe83c90edff19a0fb3..8794d77e2ff5d49edd0ec25ecf21cd3b25dbc44d 100644
--- a/services/github/github-commits-since.service.js
+++ b/services/github/github-commits-since.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-commits-since.tester.js b/services/github/github-commits-since.tester.js
index 2e22511892b1ef5624f40c3b632272d574cfc198..4bcc23d123f1ddbffa281d83ed37a82410134b71 100644
--- a/services/github/github-commits-since.tester.js
+++ b/services/github/github-commits-since.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Commits since')
diff --git a/services/github/github-common-fetch.js b/services/github/github-common-fetch.js
index eeac823d31b763a2648b68d87de3642806b83e02..fd4d189e2dea4a814d4713a462b55a5b9d88702b 100644
--- a/services/github/github-common-fetch.js
+++ b/services/github/github-common-fetch.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { InvalidResponse } = require('..')
 const { errorMessagesFor } = require('./github-helpers')
 
diff --git a/services/github/github-contributors.service.js b/services/github/github-contributors.service.js
index a02c2a698f17044a30e4a88ed845e303c12ddab2..ee07898098eff994b12d011dd9674afabc786eee 100644
--- a/services/github/github-contributors.service.js
+++ b/services/github/github-contributors.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const parseLinkHeader = require('parse-link-header')
 const { renderContributorBadge } = require('../contributor-count')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-downloads.service.js b/services/github/github-downloads.service.js
index d9738bf4fb14174ac47244a479f1ed9ccebdd3ec..7c9861d578b4d0f24840346ace6a7c347300bb84 100644
--- a/services/github/github-downloads.service.js
+++ b/services/github/github-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { NotFound } = require('..')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/github/github-downloads.tester.js b/services/github/github-downloads.tester.js
index c48af0175458b718bc77275a3ffea426a3db2478..9f741ad5f87d30350436ae2cc52e917a7a2cddfc 100644
--- a/services/github/github-downloads.tester.js
+++ b/services/github/github-downloads.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isMetric } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/github/github-followers.service.js b/services/github/github-followers.service.js
index 4e14a08edff0e0bbdd0a07a3b31be4df495982b1..6415837492bd867eac5c26381f2725c9d34c27f6 100644
--- a/services/github/github-followers.service.js
+++ b/services/github/github-followers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-followers.tester.js b/services/github/github-followers.tester.js
index 8e1fd07505c67eae7918510eaefcdeeaf0327cbf..852d29c79c8cb7bcc697d4571a1ca39c6499f53f 100644
--- a/services/github/github-followers.tester.js
+++ b/services/github/github-followers.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Followers')
diff --git a/services/github/github-forks.service.js b/services/github/github-forks.service.js
index 9d2747eb3621afe4caa2b6213fee608b05df16a0..5a4db261ab6080ecc1657364516e2540daba9603 100644
--- a/services/github/github-forks.service.js
+++ b/services/github/github-forks.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-issue-detail.service.js b/services/github/github-issue-detail.service.js
index 31324ddc316f00d3f504a450dd747c2bfe17651a..b4e71ac550555d3da4e345f16af6b821d86c2d51 100644
--- a/services/github/github-issue-detail.service.js
+++ b/services/github/github-issue-detail.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { InvalidResponse } = require('..')
 const { nonNegativeInteger } = require('../validators')
 const { formatDate, metric } = require('../text-formatters')
diff --git a/services/github/github-issue-detail.tester.js b/services/github/github-issue-detail.tester.js
index 0a9de66414ee365918ca664d22a3801613d62daf..8b5775d928c0dd5d9eb01a1af878f8858a55085d 100644
--- a/services/github/github-issue-detail.tester.js
+++ b/services/github/github-issue-detail.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isFormattedDate } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/github/github-issues.service.js b/services/github/github-issues.service.js
index 5e65dca3dc1bde57edc2052874d00d28ca8fad1a..a8bce133b5e56b4108709dc40a3ceec3890cd9c5 100644
--- a/services/github/github-issues.service.js
+++ b/services/github/github-issues.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-issues.tester.js b/services/github/github-issues.tester.js
index fd9cb2e870b26b9935c4bb953be6fa0a74543233..556eb10cfcfcb3c11665e60d36e0f4f78a744f31 100644
--- a/services/github/github-issues.tester.js
+++ b/services/github/github-issues.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isMetric, isMetricOpenIssues } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/github/github-language-count.tester.js b/services/github/github-language-count.tester.js
index 97120c5376d88a23331b51c1a6120d8e3ac277bb..6de2a888f5bcfe738a1f2920d9878e36808d0857 100644
--- a/services/github/github-language-count.tester.js
+++ b/services/github/github-language-count.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('language count')
diff --git a/services/github/github-languages-base.js b/services/github/github-languages-base.js
index eb1f4800d770d2c69a2603d0801869ed64ba97de..e6662f4e350183ed674999c76c53c82535aa1608 100644
--- a/services/github/github-languages-base.js
+++ b/services/github/github-languages-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
 const { errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-last-commit.service.js b/services/github/github-last-commit.service.js
index 0e277690fb61fb377037691e2962b615df07c4cf..f8658ec53e315b4e67ce8b69accfca0685d44255 100644
--- a/services/github/github-last-commit.service.js
+++ b/services/github/github-last-commit.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { formatDate } = require('../text-formatters')
 const { age: ageColor } = require('../color-formatters')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-license.service.js b/services/github/github-license.service.js
index 479187742b1603a87b0623b41e3f026be42b31a2..5970caa89b7b39b9e88a4464fb4c12983dc6fad0 100644
--- a/services/github/github-license.service.js
+++ b/services/github/github-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderLicenseBadge } = require('../licenses')
 const { GithubAuthService } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-manifest.service.js b/services/github/github-manifest.service.js
index b9491c469cccb81533fca483960297c87e4a16ad..d930a82d28adf0cc8ac4e588ddf1b3c84f077903 100644
--- a/services/github/github-manifest.service.js
+++ b/services/github/github-manifest.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const {
   individualValueSchema,
diff --git a/services/github/github-manifest.tester.js b/services/github/github-manifest.tester.js
index 0223d6dff006dc2197b243c480e500def08a0ee9..3811c77f0ed4ff9bab6451d3229d5ecb7a29a66d 100644
--- a/services/github/github-manifest.tester.js
+++ b/services/github/github-manifest.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 
diff --git a/services/github/github-package-json.service.js b/services/github/github-package-json.service.js
index aa239786133acd20dd2d61f27c31d98421b0f790..df061452e562573bf0ca2fc309fcda34372b04e1 100644
--- a/services/github/github-package-json.service.js
+++ b/services/github/github-package-json.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const {
   transformAndValidate,
diff --git a/services/github/github-package-json.tester.js b/services/github/github-package-json.tester.js
index 0fd455fe1f4c967781f50e5f1db83ec6b39c114d..e9548029c4774d47ca3721ce68c28cffb6eb6644 100644
--- a/services/github/github-package-json.tester.js
+++ b/services/github/github-package-json.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isSemver } = require('../test-validators')
 const { semverRange } = require('../validators')
diff --git a/services/github/github-pull-request-check-state.service.js b/services/github/github-pull-request-check-state.service.js
index eed3b537a9132c2eb569875a30b4980f922f4d95..3c764dc2d405f8db1989123f72c7b86583cff4c0 100644
--- a/services/github/github-pull-request-check-state.service.js
+++ b/services/github/github-pull-request-check-state.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const countBy = require('lodash.countby')
 const { GithubAuthService } = require('./github-auth-service')
 const { fetchIssue } = require('./github-common-fetch')
diff --git a/services/github/github-release-date.service.js b/services/github/github-release-date.service.js
index a1dbe3db6384308b3b03de7b2b4437b224bf5b1a..7bbd8585b90aa62bfc1a0eae457b453154dc047f 100644
--- a/services/github/github-release-date.service.js
+++ b/services/github/github-release-date.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const moment = require('moment')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { age } = require('../color-formatters')
 const { formatDate } = require('../text-formatters')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-repo-size.service.js b/services/github/github-repo-size.service.js
index bab07e5863f8c18bc9f6574023aba8d27f7c77f9..c802028fad73be0ecfc88c18ee8eb5cd098196d5 100644
--- a/services/github/github-repo-size.service.js
+++ b/services/github/github-repo-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-search.service.js b/services/github/github-search.service.js
index 0e1d65b0af6d5fd1a703b54d3ecddcc4f5c4d292..c2433ecf94b90468c1e6277f5aca5188f8add5be 100644
--- a/services/github/github-search.service.js
+++ b/services/github/github-search.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-size.service.js b/services/github/github-size.service.js
index c5c9531c2303df425522bb0a4cd9b778a1d67808..46b9a6cd2cd294f87c2e05a9f1b574fd133245a4 100644
--- a/services/github/github-size.service.js
+++ b/services/github/github-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-stars.service.js b/services/github/github-stars.service.js
index d5c1f72cfad70ffd747c826515cdd7edf3bc6900..832f635795ea9f68f6e0aec0c46f4f44c46ac400 100644
--- a/services/github/github-stars.service.js
+++ b/services/github/github-stars.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-stars.tester.js b/services/github/github-stars.tester.js
index 1c1c55ca184875999d11c731078aa74b260bbae3..92ad07afef137ed835d7b390570dcd1ea2a1285b 100644
--- a/services/github/github-stars.tester.js
+++ b/services/github/github-stars.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Stars')
diff --git a/services/github/github-tag.service.js b/services/github/github-tag.service.js
index f0408ec85da1c905e129e8ff6e11bb8beddb7af5..b6963ab40bda518bd49fe684ae9312e8b69ef5db 100644
--- a/services/github/github-tag.service.js
+++ b/services/github/github-tag.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { NotFound } = require('..')
 const { addv } = require('../text-formatters')
 const { version: versionColor } = require('../color-formatters')
diff --git a/services/github/github-tag.tester.js b/services/github/github-tag.tester.js
index 69fb6d5e8eed69a5555b478fe595b90aaf589ad3..b51d5123b9fb43a44a8d43cf83a6b53006cc7592 100644
--- a/services/github/github-tag.tester.js
+++ b/services/github/github-tag.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Tag')
diff --git a/services/github/github-top-language.tester.js b/services/github/github-top-language.tester.js
index 348d0dbf2c5d5d00cc8cdb04d0ba26819e644094..f6d5c805db1c243f1fe5d48e7eb63541efed69c1 100644
--- a/services/github/github-top-language.tester.js
+++ b/services/github/github-top-language.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('top language')
diff --git a/services/github/github-watchers.service.js b/services/github/github-watchers.service.js
index 905bb3efc7ba611f802415cfcbaa1d0560bcd62d..35ea30f09335222474efddb89fb692452ea10f32 100644
--- a/services/github/github-watchers.service.js
+++ b/services/github/github-watchers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-watchers.tester.js b/services/github/github-watchers.tester.js
index e31ddcbdc28864020b9ff47baf9f462f1236330b..814c7d06982fbfc78ed32058cdeb1bb77d2e1e64 100644
--- a/services/github/github-watchers.tester.js
+++ b/services/github/github-watchers.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Watchers')
diff --git a/services/gitlab/gitlab-pipeline-status.service.js b/services/gitlab/gitlab-pipeline-status.service.js
index f9e12aacce3429f9929ed305025c0021675f3979..c1d47c6bcb1a8852d497d97fd71681eb71a0ee86 100644
--- a/services/gitlab/gitlab-pipeline-status.service.js
+++ b/services/gitlab/gitlab-pipeline-status.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, NotFound } = require('..')
 const { optionalUrl } = require('../validators')
diff --git a/services/hackage/hackage-deps.tester.js b/services/hackage/hackage-deps.tester.js
index caab395b12f29b8234cf4cb1d0dc17400ef996d1..3b60d7c6eac9fb4f9cc2a49cf884a9c8fe768ae8 100644
--- a/services/hackage/hackage-deps.tester.js
+++ b/services/hackage/hackage-deps.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('hackage deps (valid)')
diff --git a/services/hexpm/hexpm.service.js b/services/hexpm/hexpm.service.js
index 098ed7f503e2d05c18bc0d25a7e68d693032aa45..457ee9ad9b5bed666adc961574fb619fb3b60f2e 100644
--- a/services/hexpm/hexpm.service.js
+++ b/services/hexpm/hexpm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric, addv, maybePluralize } = require('../text-formatters')
 const { downloadCount, version: versionColor } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/hexpm/hexpm.tester.js b/services/hexpm/hexpm.tester.js
index 12637e5560caabbdc6af9c1128878dfb5888ee20..0ef89e35f11c01993679af6842a0e10f308313d4 100644
--- a/services/hexpm/hexpm.tester.js
+++ b/services/hexpm/hexpm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isMetric, isMetricOverTimePeriod } = require('../test-validators')
 
diff --git a/services/homebrew/homebrew.service.js b/services/homebrew/homebrew.service.js
index 71f4b07a07521a95ce7884cca8020905cb0bdb50..7e87c5d56ba7eb51cee9fe4070284ea9f77e5230 100644
--- a/services/homebrew/homebrew.service.js
+++ b/services/homebrew/homebrew.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/hsts/hsts.service.js b/services/hsts/hsts.service.js
index 3c07b0340dd06200c39ed3e2d83e07f3f5140cfc..42dbd1ea36b45a3f7c56ff2266c46ebadd05dbe2 100644
--- a/services/hsts/hsts.service.js
+++ b/services/hsts/hsts.service.js
@@ -2,7 +2,7 @@
 
 const label = 'hsts preloaded'
 const { BaseJsonService } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const schema = Joi.object({
   status: Joi.string().required(),
 }).required()
diff --git a/services/itunes/itunes.service.js b/services/itunes/itunes.service.js
index c1324afb5f0f277349803f57c92f4005e846a4b9..2c531bd91fab8bc695d8a98979f7b014ce8dbfc4 100644
--- a/services/itunes/itunes.service.js
+++ b/services/itunes/itunes.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/jenkins/jenkins-build.service.js b/services/jenkins/jenkins-build.service.js
index 4ce4412bdec5f2f2c697feb98dca2c1f173eafdc..b8db081ad5c5963bad89460b12a6255e3a7c8923 100644
--- a/services/jenkins/jenkins-build.service.js
+++ b/services/jenkins/jenkins-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const JenkinsBase = require('./jenkins-base')
 const {
diff --git a/services/jenkins/jenkins-build.tester.js b/services/jenkins/jenkins-build.tester.js
index f4d85132e633d95073b1bf5e3e06f7a325b2b4b2..c9e6d0f1dcefc5ea9544431c131869f36f91d4e1 100644
--- a/services/jenkins/jenkins-build.tester.js
+++ b/services/jenkins/jenkins-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const sinon = require('sinon')
 const serverSecrets = require('../../lib/server-secrets')
 const { isBuildStatus } = require('../build-status')
diff --git a/services/jenkins/jenkins-common.js b/services/jenkins/jenkins-common.js
index 06e65097faf9b0c7c4c6337f346ce7404e11d994..bf71e8949be5fb99f9cd39adc535e162d239f39f 100644
--- a/services/jenkins/jenkins-common.js
+++ b/services/jenkins/jenkins-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const queryParamSchema = Joi.object({
   disableStrictSSL: Joi.equal(''),
diff --git a/services/jenkins/jenkins-coverage.service.js b/services/jenkins/jenkins-coverage.service.js
index f6b96613d0c921dc3bdc15f102775198d5f58a89..9f30530f2ba37569868c1b30998152e216c92a54 100644
--- a/services/jenkins/jenkins-coverage.service.js
+++ b/services/jenkins/jenkins-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { coveragePercentage } = require('../color-formatters')
 const JenkinsBase = require('./jenkins-base')
 const {
diff --git a/services/jenkins/jenkins-plugin-installs.service.js b/services/jenkins/jenkins-plugin-installs.service.js
index 39543c20e6b71b8d79f4857ed88425c10280e29e..c98d76febd9af3e69c4e5b3f049cb81b6c90a322 100644
--- a/services/jenkins/jenkins-plugin-installs.service.js
+++ b/services/jenkins/jenkins-plugin-installs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/jenkins/jenkins-plugin-version.tester.js b/services/jenkins/jenkins-plugin-version.tester.js
index 9a64bcbae05c17768778ff8a481f717c1a62ab0b..2681a9eb0eedfcea02f57abd5b3f14603236bacf 100644
--- a/services/jenkins/jenkins-plugin-version.tester.js
+++ b/services/jenkins/jenkins-plugin-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 
 const t = new ServiceTester({
diff --git a/services/jenkins/jenkins-tests.service.js b/services/jenkins/jenkins-tests.service.js
index d1d22408e18f58b6fd6bef1e2a5a48b7dfbb41ac..8d2f98f155a1fd0e0b6da6e79599e053c7cc2418 100644
--- a/services/jenkins/jenkins-tests.service.js
+++ b/services/jenkins/jenkins-tests.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { InvalidResponse } = require('..')
 const {
   documentation,
diff --git a/services/jetbrains/jetbrains-downloads.service.js b/services/jetbrains/jetbrains-downloads.service.js
index 68bd8a7607ec16db14cdb9de50c675f8dae7c38b..0baff0afe6029b1711f0f3ce27cdfb7c400ea41f 100644
--- a/services/jetbrains/jetbrains-downloads.service.js
+++ b/services/jetbrains/jetbrains-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/jetbrains/jetbrains-version.service.js b/services/jetbrains/jetbrains-version.service.js
index 34083cf35e923e1f81580c077891b9d9b9402728..22d1cd90959f23cf222a1261947651c8c1b03d66 100644
--- a/services/jetbrains/jetbrains-version.service.js
+++ b/services/jetbrains/jetbrains-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const JetbrainsBase = require('./jetbrains-base')
 
diff --git a/services/jira/jira-issue.service.js b/services/jira/jira-issue.service.js
index c3d99b7a998893cccf618756cd21efd2766a53e2..fe95067f418ca675956b1a79a45fe8a9704e7f91 100644
--- a/services/jira/jira-issue.service.js
+++ b/services/jira/jira-issue.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const JiraBase = require('./jira-base')
 
 const schema = Joi.object({
diff --git a/services/jira/jira-sprint.service.js b/services/jira/jira-sprint.service.js
index 004a3d2dedb08e68c8925693ba17e7bc4c38c6fe..7722477b44b58719fa1af61257554c820efa8b2a 100644
--- a/services/jira/jira-sprint.service.js
+++ b/services/jira/jira-sprint.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const JiraBase = require('./jira-base')
 
 const schema = Joi.object({
diff --git a/services/jitpack/jitpack-version.service.js b/services/jitpack/jitpack-version.service.js
index 250d6efb65c5284e94a5a23da13cff88e2353276..2449489329dfe6a2d36cd86894226134bc1cdfce 100644
--- a/services/jitpack/jitpack-version.service.js
+++ b/services/jitpack/jitpack-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/jitpack/jitpack-version.tester.js b/services/jitpack/jitpack-version.tester.js
index 695a32d76e52f89600abf4b3e8f36fd76704dc2b..1debcd801b1b4ce32c58275caed973b79033f3ac 100644
--- a/services/jitpack/jitpack-version.tester.js
+++ b/services/jitpack/jitpack-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 // Github allows versions with chars, etc.
diff --git a/services/jsdelivr/jsdelivr-base.js b/services/jsdelivr/jsdelivr-base.js
index f40bac5b11436b8df0b337b4a202cee602d5f9a7..c8a78069acab5e156fa5c136a2911d05a1e7f977 100644
--- a/services/jsdelivr/jsdelivr-base.js
+++ b/services/jsdelivr/jsdelivr-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/keybase/keybase-btc.service.js b/services/keybase/keybase-btc.service.js
index 992886d9e53ade0be98c386dd567cdb9131941f9..fa8b8e4210e774914569226c62ee1caf9155bbd1 100644
--- a/services/keybase/keybase-btc.service.js
+++ b/services/keybase/keybase-btc.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/keybase/keybase-pgp.service.js b/services/keybase/keybase-pgp.service.js
index 6f8e6a6720aaf8d5c78c879aae19ce9ce47d35ac..4cd402f532bde1a28e7e39f0690517a6d43b7c91 100644
--- a/services/keybase/keybase-pgp.service.js
+++ b/services/keybase/keybase-pgp.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/keybase/keybase-pgp.tester.js b/services/keybase/keybase-pgp.tester.js
index ecc1388a76f26b9522a06a82944323815ffcb901..40d90d0a355c78756ce11810da3f7afd34cd9336 100644
--- a/services/keybase/keybase-pgp.tester.js
+++ b/services/keybase/keybase-pgp.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('existing key fingerprint')
diff --git a/services/keybase/keybase-xlm.service.js b/services/keybase/keybase-xlm.service.js
index 148fc342770f4d159aa9791b1a793b4259ee3a79..f3051c4f0fe1d6df9f0c519292d82432cda3632a 100644
--- a/services/keybase/keybase-xlm.service.js
+++ b/services/keybase/keybase-xlm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/keybase/keybase-zec.service.js b/services/keybase/keybase-zec.service.js
index 31992da517ceb07f6e2bf6577f5702202c2cfa76..442ab51859037565cdc42396d60ff5807e52b795 100644
--- a/services/keybase/keybase-zec.service.js
+++ b/services/keybase/keybase-zec.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/leanpub/leanpub-book-summary.service.js b/services/leanpub/leanpub-book-summary.service.js
index f90cdc2fb5f8e56a6ebff6275fc15e3765a900c9..e175e1eba48574acbbc894ada16dbb20ec74f1ed 100644
--- a/services/leanpub/leanpub-book-summary.service.js
+++ b/services/leanpub/leanpub-book-summary.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const bookSummarySchema = Joi.object({
diff --git a/services/leanpub/leanpub-book-summary.tester.js b/services/leanpub/leanpub-book-summary.tester.js
index 8c019fea97c1122dd9e77e4ae4cbde6755d7f51d..f1631294b03e235b3e8123074c6a121f0efa1882 100644
--- a/services/leanpub/leanpub-book-summary.tester.js
+++ b/services/leanpub/leanpub-book-summary.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const knownValidBook = 'juice-shop'
diff --git a/services/lgtm/lgtm-base.js b/services/lgtm/lgtm-base.js
index f85de912b38ba74b5c5c2f8b4a1d0a1ba26831bc..916675d77aa25e802f772211976d60e3726a9388 100644
--- a/services/lgtm/lgtm-base.js
+++ b/services/lgtm/lgtm-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/lgtm/lgtm.tester.js b/services/lgtm/lgtm.tester.js
index 874cd8bb9ebbf0e588cfd1477d645add9b8517e1..8e1b66b80f31ad316bead8ac476b1866e249a4a4 100644
--- a/services/lgtm/lgtm.tester.js
+++ b/services/lgtm/lgtm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const t = new ServiceTester({ id: 'lgtm', title: 'LGTM' })
 module.exports = t
diff --git a/services/liberapay/liberapay-base.js b/services/liberapay/liberapay-base.js
index f4978f5cb4d558341cdf6570e1372252fe4a3aa1..c1d0daeb1c7d124c7696454b2f12e74be54c6815 100644
--- a/services/liberapay/liberapay-base.js
+++ b/services/liberapay/liberapay-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 const { colorScale } = require('../color-formatters')
diff --git a/services/librariesio/librariesio-common.js b/services/librariesio/librariesio-common.js
index 8407d06b658e2a3d18bcf3ef8feee3c4a129d64d..a56014b92cf9a9b7b743516de11a5098ffd80e44 100644
--- a/services/librariesio/librariesio-common.js
+++ b/services/librariesio/librariesio-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger, anyInteger } = require('../validators')
 
 // API doc: https://libraries.io/api#project
diff --git a/services/librariesio/librariesio-dependencies.service.js b/services/librariesio/librariesio-dependencies.service.js
index fd4e6280096bd518b158e18f7b7ac7bb05b0aeef..1763369f9ebd10b8f7828add3b54fb3211e64bec 100644
--- a/services/librariesio/librariesio-dependencies.service.js
+++ b/services/librariesio/librariesio-dependencies.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const {
   transform,
diff --git a/services/luarocks/luarocks.service.js b/services/luarocks/luarocks.service.js
index ed5507f9e2f28a7c626bfde140f8bbd5616499f6..0fde7c645230a549b901db07953d8fe8804ac5df 100644
--- a/services/luarocks/luarocks.service.js
+++ b/services/luarocks/luarocks.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { addv } = require('../text-formatters')
 const { latestVersion } = require('./luarocks-version-helpers')
diff --git a/services/luarocks/luarocks.tester.js b/services/luarocks/luarocks.tester.js
index 87074a360e018be93bd04065625afbf7275c4d66..19910f08fe75b71c564dcd2b00636cc38e5d54aa 100644
--- a/services/luarocks/luarocks.tester.js
+++ b/services/luarocks/luarocks.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isLuaVersion = Joi.string()
diff --git a/services/mastodon/mastodon-follow.service.js b/services/mastodon/mastodon-follow.service.js
index 481ccd2c31040b3fe0ba7a2f0e9533cd6489c5d9..9c53a1714e122d0cb382f124c82f23366184bca2 100644
--- a/services/mastodon/mastodon-follow.service.js
+++ b/services/mastodon/mastodon-follow.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { metric } = require('../text-formatters')
 const { optionalUrl, nonNegativeInteger } = require('../validators')
diff --git a/services/matrix/matrix.service.js b/services/matrix/matrix.service.js
index 1fab19414f2d45e75fdb962b9bdaa1fff78fb841..8d63d665a17da635954cd65959c03172be4d7d7a 100644
--- a/services/matrix/matrix.service.js
+++ b/services/matrix/matrix.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, InvalidParameter } = require('..')
 
 const queryParamSchema = Joi.object({
diff --git a/services/matrix/matrix.tester.js b/services/matrix/matrix.tester.js
index d6853010fdbff3299c7662177e28e83a02c91fda..43035127b620a5628826914b9cb1137d2dc7ba23 100644
--- a/services/matrix/matrix.tester.js
+++ b/services/matrix/matrix.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('get room state as guest')
diff --git a/services/maven-central/maven-central.service.js b/services/maven-central/maven-central.service.js
index 6c108924d9222d8d4ab45295a91013dfc0543ba0..c9a204b67efc06ebfffaad6b79f9f5814e787c06 100644
--- a/services/maven-central/maven-central.service.js
+++ b/services/maven-central/maven-central.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseXmlService, NotFound } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/maven-metadata/maven-metadata.service.js b/services/maven-metadata/maven-metadata.service.js
index 04740fcb31a2e27d68ad073bc631f82228e4a99c..cf98027b9b8fb9ababec7600b1d1aeabc5f50028 100644
--- a/services/maven-metadata/maven-metadata.service.js
+++ b/services/maven-metadata/maven-metadata.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseXmlService } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/microbadger/microbadger-base.js b/services/microbadger/microbadger-base.js
index 59a01c5dd51ec947050be648d724e14b75e7591b..571aa7af03a9ed67d4e709288a78d8b0fa8dc055 100644
--- a/services/microbadger/microbadger-base.js
+++ b/services/microbadger/microbadger-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/microbadger/microbadger-layers.tester.js b/services/microbadger/microbadger-layers.tester.js
index ec9adfafb20840a17615a140fb909736f0abac41..59bc15314b899b154b86a46b11936349b5e95674 100644
--- a/services/microbadger/microbadger-layers.tester.js
+++ b/services/microbadger/microbadger-layers.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('layers without a specified tag')
diff --git a/services/mozilla-observatory/mozilla-observatory.service.js b/services/mozilla-observatory/mozilla-observatory.service.js
index 832ee74c58cfd42b4166e6241d320df3887a60a9..7190c27461c5462c1226044e9d3988d94f5bfdc5 100644
--- a/services/mozilla-observatory/mozilla-observatory.service.js
+++ b/services/mozilla-observatory/mozilla-observatory.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/mozilla-observatory/mozilla-observatory.tester.js b/services/mozilla-observatory/mozilla-observatory.tester.js
index 1c5921965ade1951afd25980bfa9934b069f5464..0b5d3cc357d7f958ca23ec85cd78db7d3327df4c 100644
--- a/services/mozilla-observatory/mozilla-observatory.tester.js
+++ b/services/mozilla-observatory/mozilla-observatory.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const validColors = ['brightgreen', 'green', 'yellow', 'orange', 'red']
diff --git a/services/nexus/nexus.service.js b/services/nexus/nexus.service.js
index 4704db708f9adb453e3996e416839f8eafdf9caa..d4042ce48ab9b720b8a97f150710ca5233f2c490 100644
--- a/services/nexus/nexus.service.js
+++ b/services/nexus/nexus.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { version: versionColor } = require('../color-formatters')
 const { addv } = require('../text-formatters')
 const serverSecrets = require('../../lib/server-secrets')
diff --git a/services/nodeping/nodeping-status.service.js b/services/nodeping/nodeping-status.service.js
index ee4c9bf897ff61ee6d9805553306d75228e11322..68a7e0895855d1e9036b9a48bd82c2ae24d2fc39 100644
--- a/services/nodeping/nodeping-status.service.js
+++ b/services/nodeping/nodeping-status.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { BaseJsonService } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   queryParamSchema,
   exampleQueryParams,
diff --git a/services/nodeping/nodeping-status.tester.js b/services/nodeping/nodeping-status.tester.js
index da4e5691a183f43d81fe3d8618c36794dc5cd5b7..5a8b46815cf9d01d4b54a3c57eee8a4e34ea3aa2 100644
--- a/services/nodeping/nodeping-status.tester.js
+++ b/services/nodeping/nodeping-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('NodePing status - live')
diff --git a/services/nodeping/nodeping-uptime.service.js b/services/nodeping/nodeping-uptime.service.js
index 8b59db4b0d73660c0f575c756a645742522b7852..dadbd7f7411aad596e38c561db8ce78fa057ef0a 100644
--- a/services/nodeping/nodeping-uptime.service.js
+++ b/services/nodeping/nodeping-uptime.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { BaseJsonService } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { colorScale } = require('../color-formatters')
 
 const colorFormatter = colorScale([99, 99.5, 100])
diff --git a/services/npm/npm-base.js b/services/npm/npm-base.js
index 21b9547b40253ae79b2bf6ed406535b888bb6f53..023088a0c6f2dd50bc3fb2376cc8e2dd31e8fc88 100644
--- a/services/npm/npm-base.js
+++ b/services/npm/npm-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { BaseJsonService, InvalidResponse, NotFound } = require('..')
 const { optionalUrl } = require('../validators')
diff --git a/services/npm/npm-downloads.service.js b/services/npm/npm-downloads.service.js
index f5f5f64c70a79be97ddcf3c0003af0b0ab13e8c8..7bebf18cf669288ca5539318581df8eb64937651 100644
--- a/services/npm/npm-downloads.service.js
+++ b/services/npm/npm-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/npm/npm-type-definitions.tester.js b/services/npm/npm-type-definitions.tester.js
index 2f2ae0cc375788ff24b27832e49bb22a70f588ea..319d9a2707f972c8162828d668359469ce8a7e76 100644
--- a/services/npm/npm-type-definitions.tester.js
+++ b/services/npm/npm-type-definitions.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isTypeDefinition = Joi.string().regex(
diff --git a/services/npm/npm-version.service.js b/services/npm/npm-version.service.js
index bf3fdef3ecd7c518e10f30eb4390e8e21adff88d..1c590305b90fb02084e8893a6f5d29bb0b00af06 100644
--- a/services/npm/npm-version.service.js
+++ b/services/npm/npm-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { NotFound } = require('..')
 const NpmBase = require('./npm-base')
diff --git a/services/nuget/nuget-v2-service-family.js b/services/nuget/nuget-v2-service-family.js
index 4d02a3b6abe851e8f9153aa400cbc91e29a30242..8a59aaa8ca95f443f6e0112a1a62d39403c88400 100644
--- a/services/nuget/nuget-v2-service-family.js
+++ b/services/nuget/nuget-v2-service-family.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, BaseXmlService, NotFound } = require('..')
 const { nonNegativeInteger } = require('../validators')
 const {
diff --git a/services/nuget/nuget-v3-service-family.js b/services/nuget/nuget-v3-service-family.js
index 93104a13f3b54ee2d264faeff4d57611f9fa11a5..cc41653e639112b9dfef0512cc9144960f9531ad 100644
--- a/services/nuget/nuget-v3-service-family.js
+++ b/services/nuget/nuget-v3-service-family.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { promisify } = require('util')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { regularUpdate } = require('../../core/legacy/regular-update')
 const RouteBuilder = require('../route-builder')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/opencollective/opencollective-base.js b/services/opencollective/opencollective-base.js
index 41ba077f4e29f412880c49c09a1b00ba0343a8ec..f6bf42dc2c6494d2b54c0ad5856f4da1899727a2 100644
--- a/services/opencollective/opencollective-base.js
+++ b/services/opencollective/opencollective-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/package-json-helpers.js b/services/package-json-helpers.js
index 79f41e903c24712a0d8b508eb609a892cef2ec65..2906132870f0a5929492c19edb7efbfa1ba9affe 100644
--- a/services/package-json-helpers.js
+++ b/services/package-json-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { InvalidParameter } = require('.')
 
 const isDependencyMap = Joi.object()
diff --git a/services/packagecontrol/packagecontrol.service.js b/services/packagecontrol/packagecontrol.service.js
index 800950b85d7882126219cd87f10634a178ae4836..1ec817d5f1a149a3c899551f52ff2e845038fdba 100644
--- a/services/packagecontrol/packagecontrol.service.js
+++ b/services/packagecontrol/packagecontrol.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/packagist/packagist-base.js b/services/packagist/packagist-base.js
index 5e1b065f2ab99dac4269a4d82e7406498cc3c4f1..c4279cce64ca3c363454463729d7f5d20367702c 100644
--- a/services/packagist/packagist-base.js
+++ b/services/packagist/packagist-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const allVersionsSchema = Joi.object({
diff --git a/services/packagist/packagist-downloads.service.js b/services/packagist/packagist-downloads.service.js
index 319b86c4c376e4cd118a1b1c2fb403534129046c..8cb5ea929b8d9dc411221fb0743de788ae3e00cb 100644
--- a/services/packagist/packagist-downloads.service.js
+++ b/services/packagist/packagist-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { keywords, BasePackagistService } = require('./packagist-base')
diff --git a/services/packagist/packagist-license.service.js b/services/packagist/packagist-license.service.js
index df14391a692a286b3c8c933abebe6c58287bde35..ad438b9266f6cde59071abc0522455496d1d95ad 100644
--- a/services/packagist/packagist-license.service.js
+++ b/services/packagist/packagist-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderLicenseBadge } = require('../licenses')
 const { keywords, BasePackagistService } = require('./packagist-base')
 
diff --git a/services/packagist/packagist-version.service.js b/services/packagist/packagist-version.service.js
index bea6e9aa4f652a496510411a7e6927b9e5cdb09e..968fbfd4d3f011da58f93f331035c38218646c22 100644
--- a/services/packagist/packagist-version.service.js
+++ b/services/packagist/packagist-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { compare, isStable, latest } = require('../php-version')
 const {
diff --git a/services/packagist/packagist-version.tester.js b/services/packagist/packagist-version.tester.js
index 33f528010c4714ebb5e2a582fdb268873fbb1eac..ab89e78fed6a7a2450f5d398edff7dec3f817281 100644
--- a/services/packagist/packagist-version.tester.js
+++ b/services/packagist/packagist-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
diff --git a/services/powershellgallery/powershellgallery.tester.js b/services/powershellgallery/powershellgallery.tester.js
index abad1b6c74f499a594244ad300591a4a1d52f250..776f8febd3ee5d916f023a4d8788762f11e66a36 100644
--- a/services/powershellgallery/powershellgallery.tester.js
+++ b/services/powershellgallery/powershellgallery.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const {
   isMetric,
diff --git a/services/pub/pub.service.js b/services/pub/pub.service.js
index 15c4524b28c4f245ad4a24a1d31c1275a64dbccb..c230cf644bc7292fe6a4b117c9198ce15999eb17 100644
--- a/services/pub/pub.service.js
+++ b/services/pub/pub.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { latest, renderVersionBadge } = require('../version')
 
diff --git a/services/puppetforge/puppetforge-base.js b/services/puppetforge/puppetforge-base.js
index e8b876a12dd54cc25847f83e331997b24f01decb..f9af192354829de90b6504854aa061064ad424d9 100644
--- a/services/puppetforge/puppetforge-base.js
+++ b/services/puppetforge/puppetforge-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger, semver } = require('../validators')
 
diff --git a/services/pypi/pypi-base.js b/services/pypi/pypi-base.js
index 4179f3eea13cb83c88e62263bb874e4c05dd95d2..f77b7cf5fcbcbebc1b667bc36ca6b4f12dcae015 100644
--- a/services/pypi/pypi-base.js
+++ b/services/pypi/pypi-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/pypi/pypi-downloads.service.js b/services/pypi/pypi-downloads.service.js
index 617a62b6c1908a0d9efe2ff98d3aa189c4bc8580..09cec5098b565ae50d0cc21fc60589bc8013c411 100644
--- a/services/pypi/pypi-downloads.service.js
+++ b/services/pypi/pypi-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/pypi/pypi.tester.js b/services/pypi/pypi.tester.js
index 28d61829aedffd113ad3a1ffe01177d0f9ab8651..a2ef616cf521f02f3315fc316a4621533c5c33a4 100644
--- a/services/pypi/pypi.tester.js
+++ b/services/pypi/pypi.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isMetricOverTimePeriod, isSemver } = require('../test-validators')
 
diff --git a/services/readthedocs/readthedocs.service.js b/services/readthedocs/readthedocs.service.js
index a9537f108f230705c9dd1299ff57102efba9ac6d..18ae244e6432bb02bd2b0b31f3634d750e6b70f3 100644
--- a/services/readthedocs/readthedocs.service.js
+++ b/services/readthedocs/readthedocs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, NotFound } = require('..')
 
diff --git a/services/readthedocs/readthedocs.tester.js b/services/readthedocs/readthedocs.tester.js
index 2ed6c8bdb45c437f8c7cf51bd42d1fe8519cd1df..eab0e3e4b4a8561e58a6e0670c5cae1a0175e40f 100644
--- a/services/readthedocs/readthedocs.tester.js
+++ b/services/readthedocs/readthedocs.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/reddit/subreddit-subscribers.service.js b/services/reddit/subreddit-subscribers.service.js
index 26e35047ae9ac4cb8b4d5f347c361d6cd9e3e0cf..5c47593b665a3a98029b1c66d35a63e8bcda5ed7 100644
--- a/services/reddit/subreddit-subscribers.service.js
+++ b/services/reddit/subreddit-subscribers.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { BaseJsonService, NotFound } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { optionalNonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
 
diff --git a/services/redmine/redmine.service.js b/services/redmine/redmine.service.js
index 03645746623d5991abe8b6a1e563508d3bec9585..e05a3841c65b3a188faf3f1ec1a7d7ae0dfdca6e 100644
--- a/services/redmine/redmine.service.js
+++ b/services/redmine/redmine.service.js
@@ -2,7 +2,7 @@
 
 const { starRating } = require('../text-formatters')
 const { floorCount: floorCountColor } = require('../color-formatters')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseXmlService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/redmine/redmine.tester.js b/services/redmine/redmine.tester.js
index 720d8a77e819dbae61446d5f765c401d987cd963..f83d51049c6cb3e1667278f63c0dcf451eea4add 100644
--- a/services/redmine/redmine.tester.js
+++ b/services/redmine/redmine.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isStarRating } = require('../test-validators')
 
diff --git a/services/requires/requires.service.js b/services/requires/requires.service.js
index 5e8ea1a0947ad4e47d2af6aeeba3bcb8b3d9cdda..ec3a105a7237e1fbfbdaffbd49aeb42c08b76a4d 100644
--- a/services/requires/requires.service.js
+++ b/services/requires/requires.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { BaseJsonService } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const statusSchema = Joi.object({
   status: Joi.string().required(),
diff --git a/services/requires/requires.tester.js b/services/requires/requires.tester.js
index 92545be604469e1fce369c22f784ba850f05ce21..46751adc2469678d1ff2429962e9242cc4b9f288 100644
--- a/services/requires/requires.tester.js
+++ b/services/requires/requires.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isRequireStatus = Joi.string().regex(
diff --git a/services/scrutinizer/scrutinizer-build.service.js b/services/scrutinizer/scrutinizer-build.service.js
index 50e04e28323f75122e485084825f9b6af3ecfe36..1166fd11248bba9c36c7c90f181ae7e39f3ca5a5 100644
--- a/services/scrutinizer/scrutinizer-build.service.js
+++ b/services/scrutinizer/scrutinizer-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const ScrutinizerBase = require('./scrutinizer-base')
 
diff --git a/services/scrutinizer/scrutinizer-build.tester.js b/services/scrutinizer/scrutinizer-build.tester.js
index aaa3a5bd96c5c598b00dea09716b4b46fe34f6dc..5547c9f4778da739aa59efb05b220c0f2714b27f 100644
--- a/services/scrutinizer/scrutinizer-build.tester.js
+++ b/services/scrutinizer/scrutinizer-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
diff --git a/services/scrutinizer/scrutinizer-coverage.service.js b/services/scrutinizer/scrutinizer-coverage.service.js
index 1af74c7c9eb8e3dc3b29037c2b4c33e341037cdd..a5e74277f7b39dbf1c422702da13f5c53d85497e 100644
--- a/services/scrutinizer/scrutinizer-coverage.service.js
+++ b/services/scrutinizer/scrutinizer-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { NotFound } = require('..')
 const { colorScale } = require('../color-formatters')
 const ScrutinizerBase = require('./scrutinizer-base')
diff --git a/services/scrutinizer/scrutinizer-quality.service.js b/services/scrutinizer/scrutinizer-quality.service.js
index 50b6e32751da9acd1d1c2e2868e74d79a16dcc94..74f7f4d227da8a45fa8d95edf70de252e9c15989 100644
--- a/services/scrutinizer/scrutinizer-quality.service.js
+++ b/services/scrutinizer/scrutinizer-quality.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { colorScale } = require('../color-formatters')
 const ScrutinizerBase = require('./scrutinizer-base')
 
diff --git a/services/scrutinizer/scrutinizer-quality.tester.js b/services/scrutinizer/scrutinizer-quality.tester.js
index 48ce6d198c16f7fd3ff96d262f7a159e22bcad58..fe7a0539df945a0eb7e9d718cb32627448d3c150 100644
--- a/services/scrutinizer/scrutinizer-quality.tester.js
+++ b/services/scrutinizer/scrutinizer-quality.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
   id: 'ScrutinizerQuality',
diff --git a/services/shippable/shippable.service.js b/services/shippable/shippable.service.js
index d5ed18fa8c67a4bb919e58c0dba82f7089443fe5..23a06456c5e03578102c4f57f10104e64185334b 100644
--- a/services/shippable/shippable.service.js
+++ b/services/shippable/shippable.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/snyk/snyk-vulnerability-base.js b/services/snyk/snyk-vulnerability-base.js
index 900f452b3bcf226bc9d87a5c919719ca09c6a796..98bc2944ff18ef9ca9967f7837a5f7ee5160cfff 100644
--- a/services/snyk/snyk-vulnerability-base.js
+++ b/services/snyk/snyk-vulnerability-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseSvgScrapingService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/snyk/snyk-vulnerability-github.tester.js b/services/snyk/snyk-vulnerability-github.tester.js
index 6a73abcaae3858661bd416be66d1204dd4996202..e899f001735544cef86dee8d2280ac5cbfa9fe42 100644
--- a/services/snyk/snyk-vulnerability-github.tester.js
+++ b/services/snyk/snyk-vulnerability-github.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
   twoVulnerabilitiesSvg,
diff --git a/services/snyk/snyk-vulnerability-npm.tester.js b/services/snyk/snyk-vulnerability-npm.tester.js
index 8dc8f62851340940a3f39a314cb672476d3a7f1f..1b56542d7cb0e7ff222aaaa4ef986c7f6f37f161 100644
--- a/services/snyk/snyk-vulnerability-npm.tester.js
+++ b/services/snyk/snyk-vulnerability-npm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
   twoVulnerabilitiesSvg,
diff --git a/services/sonar/sonar-base.js b/services/sonar/sonar-base.js
index d7bf177d26f7d441d699f99d6418e3dd822b0a51..709a06f757f4bdcdc742abddd0eb597a5d102437 100644
--- a/services/sonar/sonar-base.js
+++ b/services/sonar/sonar-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { BaseJsonService } = require('..')
 const { isLegacyVersion } = require('./sonar-helpers')
diff --git a/services/sonar/sonar-helpers.js b/services/sonar/sonar-helpers.js
index aa1093a12447ec4e8dcb633db4406fd3ff85fd86..9167d0c43a8b4867619238a246e4df42bca470b5 100644
--- a/services/sonar/sonar-helpers.js
+++ b/services/sonar/sonar-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { colorScale } = require('../color-formatters')
 
 const patternBase = ':protocol(http|https)/:host(.+)/:component(.+)'
diff --git a/services/sonar/sonar-quality-gate.tester.js b/services/sonar/sonar-quality-gate.tester.js
index eeed30dd3bb8f33a23d98ead95fcf4793db61b36..d03e29b64170297fd25d851d48bc0cafcd64aa6f 100644
--- a/services/sonar/sonar-quality-gate.tester.js
+++ b/services/sonar/sonar-quality-gate.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isQualityGateStatus = Joi.allow('passed', 'failed')
diff --git a/services/sonar/sonar-violations.tester.js b/services/sonar/sonar-violations.tester.js
index 44929da52dba5ccc245b11e4cfdbe2d8763c27aa..724a303d67b07b103143ca6fa6ec09091f3b2ea0 100644
--- a/services/sonar/sonar-violations.tester.js
+++ b/services/sonar/sonar-violations.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isMetric, withRegex } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 const isViolationsLongFormMetric = Joi.alternatives(
diff --git a/services/sourceforge/sourceforge.service.js b/services/sourceforge/sourceforge.service.js
index 122c4b0e867fea34e507b6656ed1927ab7dafed1..f158cfabadd961bf445f58b249150a77a485c16e 100644
--- a/services/sourceforge/sourceforge.service.js
+++ b/services/sourceforge/sourceforge.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const moment = require('moment')
 const { BaseJsonService } = require('..')
 const { metric } = require('../text-formatters')
diff --git a/services/sourcegraph/sourcegraph.service.js b/services/sourcegraph/sourcegraph.service.js
index 052bb066669ff2ba301a13a7294d847c7a7674f2..6222eec08656c614dd06a65e9f66ae5a4eb1d87f 100644
--- a/services/sourcegraph/sourcegraph.service.js
+++ b/services/sourcegraph/sourcegraph.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const projectsCountRegex = /^\s[0-9]*(\.[0-9]k)?\sprojects$/
diff --git a/services/spiget/spiget-base.js b/services/spiget/spiget-base.js
index 67643786fa704104fc25d1f22d9825b845afae80..f8d6ed137adbfdca9ca1f05c1c1c72b73c30b7b4 100644
--- a/services/spiget/spiget-base.js
+++ b/services/spiget/spiget-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const resourceSchema = Joi.object({
diff --git a/services/spiget/spiget-latest-version.service.js b/services/spiget/spiget-latest-version.service.js
index 4cc81404d29d4916bdd09fca57b1a6c45473e410..da9717f5763d030318edef6189fed22c6acbbcb7 100644
--- a/services/spiget/spiget-latest-version.service.js
+++ b/services/spiget/spiget-latest-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseSpigetService, documentation, keywords } = require('./spiget-base')
 
diff --git a/services/stackexchange/stackexchange-monthlyquestions.service.js b/services/stackexchange/stackexchange-monthlyquestions.service.js
index e2110a6213db62eed4ec92663da23d64cab3d71a..a2b83b5c37f7d7a20acc58b71f0b359cc3f8530e 100644
--- a/services/stackexchange/stackexchange-monthlyquestions.service.js
+++ b/services/stackexchange/stackexchange-monthlyquestions.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const moment = require('moment')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 const renderQuestionsBadge = require('./stackexchange-helpers')
diff --git a/services/stackexchange/stackexchange-reputation.service.js b/services/stackexchange/stackexchange-reputation.service.js
index fd7d6adf57930d8ee21e3b309b0f37905834dd96..0d00d8c4bf65e00a62328e706054ce405f9a1268 100644
--- a/services/stackexchange/stackexchange-reputation.service.js
+++ b/services/stackexchange/stackexchange-reputation.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/stackexchange/stackexchange-taginfo.service.js b/services/stackexchange/stackexchange-taginfo.service.js
index 254591fab5ee8cdc6c0d566505ecc3b605d874bf..9736e85bffdabd7561e713059d29f6f3081d53f1 100644
--- a/services/stackexchange/stackexchange-taginfo.service.js
+++ b/services/stackexchange/stackexchange-taginfo.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const renderQuestionsBadge = require('./stackexchange-helpers')
 
diff --git a/services/static-badge/query-string-static.service.js b/services/static-badge/query-string-static.service.js
index a17eaf915dad16a0d387eed684f113b48e9802d5..185ed358784e3c22a7158e49b81ed6ac2f248e2c 100644
--- a/services/static-badge/query-string-static.service.js
+++ b/services/static-badge/query-string-static.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseStaticService } = require('..')
 
 const queryParamSchema = Joi.object({
diff --git a/services/steam/steam-workshop.service.js b/services/steam/steam-workshop.service.js
index 360aad3d68494f33ef7cd05d3e81f92c038ce1a4..d53598d2768c38104b5fde6aeab71e8ed282dd53 100644
--- a/services/steam/steam-workshop.service.js
+++ b/services/steam/steam-workshop.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const prettyBytes = require('pretty-bytes')
 const { metric, formatDate } = require('../text-formatters')
 const { age: ageColor, downloadCount } = require('../color-formatters')
diff --git a/services/swagger/swagger.service.js b/services/swagger/swagger.service.js
index f084048dd46c633df93ddd4bc4bc792163d8c344..cdeac3eb4d15a45e63d0af4916402c7480b39d3f 100644
--- a/services/swagger/swagger.service.js
+++ b/services/swagger/swagger.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const validatorSchema = Joi.object()
diff --git a/services/symfony/symfony-insight-base.js b/services/symfony/symfony-insight-base.js
index 3305fced6cc02f91d9f1eef58722bb752ca18033..0150cd2e5567cddbfd1087b59a24ebe0b1d9ca30 100644
--- a/services/symfony/symfony-insight-base.js
+++ b/services/symfony/symfony-insight-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { BaseXmlService, Inaccessible } = require('..')
 
diff --git a/services/symfony/symfony-insight-grade.tester.js b/services/symfony/symfony-insight-grade.tester.js
index 7e742e2817262fcb6e14b579a8cc8ecbf6defaa1..647f6a63a4a1c83e33fafa099e604e1e5c41ff95 100644
--- a/services/symfony/symfony-insight-grade.tester.js
+++ b/services/symfony/symfony-insight-grade.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
   createTest,
diff --git a/services/teamcity/teamcity-build.service.js b/services/teamcity/teamcity-build.service.js
index f3e7e8fb4a9964b78dee2cf5266ad17ec0c858a9..c1dca1bb8f54fe99370242b13117d682e24ea004 100644
--- a/services/teamcity/teamcity-build.service.js
+++ b/services/teamcity/teamcity-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const TeamCityBase = require('./teamcity-base')
 
 // The statusText field will start with a summary, potentially including test details, followed by an optional suffix.
diff --git a/services/teamcity/teamcity-build.tester.js b/services/teamcity/teamcity-build.tester.js
index cab7a1765ea6df32056edbc79c68dea6738624a1..21e47fb7e063ad902148e9cd7b7cb5a7b042753e 100644
--- a/services/teamcity/teamcity-build.tester.js
+++ b/services/teamcity/teamcity-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { withRegex } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
diff --git a/services/teamcity/teamcity-coverage.service.js b/services/teamcity/teamcity-coverage.service.js
index dc41fea87b8f51f5a9a30d88d40268180841c6b1..41827d5fcf9443ca5b7d2f41a607f96cb809b0fd 100644
--- a/services/teamcity/teamcity-coverage.service.js
+++ b/services/teamcity/teamcity-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { coveragePercentage } = require('../color-formatters')
 const { InvalidResponse } = require('..')
 const TeamCityBase = require('./teamcity-base')
diff --git a/services/test-results.js b/services/test-results.js
index a46841939e65ac4cf0b98289e81261fc1bcb1a99..eaa139f11d790edb9775d8f68db0690a5f946566 100644
--- a/services/test-results.js
+++ b/services/test-results.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const testResultQueryParamSchema = Joi.object({
   compact_message: Joi.equal(''),
diff --git a/services/test-validators.js b/services/test-validators.js
index 61d9861419b59cd23641e5148fd3c4de4f5b3dc4..ed6519a41c2a13f0509daecdceca559dcd81925b 100644
--- a/services/test-validators.js
+++ b/services/test-validators.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { semver: isSemver } = require('./validators')
 
 /*
diff --git a/services/travis/travis-build.service.js b/services/travis/travis-build.service.js
index f601031af0ad0da57a1d5db544bcad9f9a14e7e7..a27eeee9807e1624445321fdbe62521c0ee87d6e 100644
--- a/services/travis/travis-build.service.js
+++ b/services/travis/travis-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService } = require('..')
 
diff --git a/services/travis/travis-build.tester.js b/services/travis/travis-build.tester.js
index 80167d111dd8f404e49af3c0821da343e41019d2..0809ec9f0f2df12ffd4dd8b89da310a9dce309f7 100644
--- a/services/travis/travis-build.tester.js
+++ b/services/travis/travis-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const { ServiceTester } = require('../tester')
 
diff --git a/services/travis/travis-php-version.service.js b/services/travis/travis-php-version.service.js
index cb528213754aa5ff64aa585154a151da2a65e24e..b2b4e573ca5ce48bad7f64fbe235ea2a0bbf9f63 100644
--- a/services/travis/travis-php-version.service.js
+++ b/services/travis/travis-php-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const {
   minorVersion,
diff --git a/services/twitter/twitter.service.js b/services/twitter/twitter.service.js
index 4344036f319fb80d11ffb17a6fe57c8139c01bc7..84c63222b163ace350f7c5ed2bbe7d56578028ec 100644
--- a/services/twitter/twitter.service.js
+++ b/services/twitter/twitter.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseService, BaseJsonService, NotFound } = require('..')
 const { metric } = require('../text-formatters')
 
diff --git a/services/ubuntu/ubuntu.service.js b/services/ubuntu/ubuntu.service.js
index 0345ef7f9f8a7533fc1166eb428a87b5bf5200be..746b703558e07ba18e8c543ee91a98e21492df1b 100644
--- a/services/ubuntu/ubuntu.service.js
+++ b/services/ubuntu/ubuntu.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/uptimerobot/uptimerobot-base.js b/services/uptimerobot/uptimerobot-base.js
index 7920f9e22c0f542f27c3a50481603fdb070d8f3b..641237ac587bfea1bdd6c64630b87e12c5cc31db 100644
--- a/services/uptimerobot/uptimerobot-base.js
+++ b/services/uptimerobot/uptimerobot-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, InvalidParameter, InvalidResponse } = require('..')
 
 // https://uptimerobot.com/api
diff --git a/services/uptimerobot/uptimerobot-status.tester.js b/services/uptimerobot/uptimerobot-status.tester.js
index e6128498d70ed6bb28be3fcb72109c9da9d99844..da6d6d1847ca007b03acc414a368f16ad71f6004 100644
--- a/services/uptimerobot/uptimerobot-status.tester.js
+++ b/services/uptimerobot/uptimerobot-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { invalidJSON } = require('../response-fixtures')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/vaadin-directory/vaadin-directory-base.js b/services/vaadin-directory/vaadin-directory-base.js
index c64ec77da914ab5c857a0a0eb0aec60d3a3ec191..9e82c8683725c34d8756c7cd20cd475d873f7e64 100644
--- a/services/vaadin-directory/vaadin-directory-base.js
+++ b/services/vaadin-directory/vaadin-directory-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/vaadin-directory/vaadin-directory-rating-count.tester.js b/services/vaadin-directory/vaadin-directory-rating-count.tester.js
index fe096f2d0ef4e50b76a856b07f75d3f7c5202ee4..f6b602e757930696005603aa6e2900f12044dbd7 100644
--- a/services/vaadin-directory/vaadin-directory-rating-count.tester.js
+++ b/services/vaadin-directory/vaadin-directory-rating-count.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('rating count of component')
diff --git a/services/vaadin-directory/vaadin-directory-rating.tester.js b/services/vaadin-directory/vaadin-directory-rating.tester.js
index 87cb3db2ccba9e8f1c81887b97638777405147b6..48d762dfacb7d9e0fa10ff7d5df6aacd53330a7a 100644
--- a/services/vaadin-directory/vaadin-directory-rating.tester.js
+++ b/services/vaadin-directory/vaadin-directory-rating.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isStarRating } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/vaadin-directory/vaadin-directory-status.tester.js b/services/vaadin-directory/vaadin-directory-status.tester.js
index 51abd9b9e1fe5bd4d597bc7df54496c3445d0065..52f5773e1d47f00ed1183472712a086aad8fe44b 100644
--- a/services/vaadin-directory/vaadin-directory-status.tester.js
+++ b/services/vaadin-directory/vaadin-directory-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('publish status of the component')
diff --git a/services/validators.js b/services/validators.js
index 762022058684d137e96939cd00d70151c221cf84..1e8aadd03f6725b7f15740df574251a62fcbbcd9 100644
--- a/services/validators.js
+++ b/services/validators.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi').extend(require('joi-extension-semver'))
+const Joi = require('@hapi/joi').extend(require('joi-extension-semver'))
 
 const optionalNonNegativeInteger = Joi.number()
   .integer()
diff --git a/services/visual-studio-marketplace/visual-studio-marketplace-base.js b/services/visual-studio-marketplace/visual-studio-marketplace-base.js
index c414dedb83c6e92996272822ebac77d328c3e08d..d370069bd67ae0a131695d5fb1455aa0c2405458 100644
--- a/services/visual-studio-marketplace/visual-studio-marketplace-base.js
+++ b/services/visual-studio-marketplace/visual-studio-marketplace-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const validate = require('../../core/base-service/validate')
 
diff --git a/services/website-status.js b/services/website-status.js
index c22cf690bde61599952afff479434627f23a4a20..1f36662ca4a5adb91ad63923ceed7617adac0fc6 100644
--- a/services/website-status.js
+++ b/services/website-status.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const queryParamSchema = Joi.object({
   up_message: Joi.string(),
diff --git a/services/wercker/wercker.service.js b/services/wercker/wercker.service.js
index 267887e92c62555d1bdb7bd8bf0f662389a57fd7..7a444c15f734f56285f24bd0138989b153b9029d 100644
--- a/services/wercker/wercker.service.js
+++ b/services/wercker/wercker.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/wheelmap/wheelmap.service.js b/services/wheelmap/wheelmap.service.js
index f6861b3ad9365717bc2f680451ee32da6056ee23..1c16724a6d306c651d894409c31c31593da81ee8 100644
--- a/services/wheelmap/wheelmap.service.js
+++ b/services/wheelmap/wheelmap.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { BaseJsonService } = require('..')
 
diff --git a/services/wordpress/wordpress-base.js b/services/wordpress/wordpress-base.js
index 3a7c67588fa0fdff7ca67b8b50f70c9cb149995d..0e919283dcc79ca7584df4162e9a18a5322f6d11 100644
--- a/services/wordpress/wordpress-base.js
+++ b/services/wordpress/wordpress-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/wordpress/wordpress-downloads.service.js b/services/wordpress/wordpress-downloads.service.js
index c77baf1f683ec361d52deeccee7848eb461e70d3..6874ceb55dfed4fbdd4dd958db3a5312af87fe57 100644
--- a/services/wordpress/wordpress-downloads.service.js
+++ b/services/wordpress/wordpress-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/wordpress/wordpress-downloads.tester.js b/services/wordpress/wordpress-downloads.tester.js
index 891d5512d708da24381f71950ec9f77c230f61d2..45d5c620545ada5590a6c25e82456d47a1a2f939 100644
--- a/services/wordpress/wordpress-downloads.tester.js
+++ b/services/wordpress/wordpress-downloads.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isMetric, isMetricOverTimePeriod } = require('../test-validators')
 
diff --git a/services/wordpress/wordpress-platform.tester.js b/services/wordpress/wordpress-platform.tester.js
index a9ca45ea7291736e2e4cc95c1e8f1a0164705d7c..f0c9c9e2320d6d247803bd2d5e7c0fa72e0414a0 100644
--- a/services/wordpress/wordpress-platform.tester.js
+++ b/services/wordpress/wordpress-platform.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')