diff --git a/.clang-format-ignore b/.clang-format-ignore
index 315877cf66c30e4d5a72a14a83c1e740b6fd634f..4097de03209db8d81882bdf6a8e4ea21d1b00a13 100644
--- a/.clang-format-ignore
+++ b/.clang-format-ignore
@@ -71,7 +71,6 @@ toolkit/components/uniffi-js/UniFFIFixtureScaffolding.cpp
 
 # Generated from ./tools/rewriting/ThirdPartyPaths.txt
 # awk '{print ""$1".*"}' ./tools/rewriting/ThirdPartyPaths.txt
-browser/components/translation/cld2/.*
 browser/extensions/mortar/ppapi/.*
 devtools/client/shared/sourceeditor/codemirror/.*
 dom/canvas/test/webgl-conf/checkout/closure-library/.*
@@ -200,6 +199,7 @@ testing/web-platform/tests/tools/third_party/.*
 third_party/.*
 toolkit/components/jsoncpp/.*
 toolkit/components/protobuf/.*
+toolkit/components/translation/cld2/.*
 toolkit/components/url-classifier/chromium/.*
 toolkit/components/url-classifier/protobuf/.*
 toolkit/crashreporter/breakpad-client/.*
diff --git a/.eslintignore b/.eslintignore
index a02e6d32ad447e21999c957fd59e7242166b1fb0..536a29499a5894492b6185563b2dacd550d7d99d 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -38,8 +38,6 @@ browser/components/sessionstore/test/unit/data/sessionstore_invalid.js
 # for documentation purposes (policies.json) but to be accessed by the
 # code as a .jsm (schema.jsm)
 browser/components/enterprisepolicies/schemas/schema.jsm
-# generated & special files in cld2
-browser/components/translation/cld2/
 # generated or library files in pocket
 browser/components/pocket/content/panels/js/tmpl.js
 browser/components/pocket/content/panels/js/vendor.bundle.js
@@ -213,6 +211,9 @@ toolkit/components/reader/JSDOMParser.js
 # Uses preprocessing
 toolkit/components/reader/Readerable.jsm
 
+# Generated & special files in cld2
+toolkit/components/translation/cld2/
+
 # Uses preprocessing
 toolkit/mozapps/update/tests/data/xpcshellConstantsPP.js
 toolkit/modules/AppConstants.jsm
diff --git a/browser/components/translation/TranslationChild.jsm b/browser/components/translation/TranslationChild.jsm
index 1cce1206b02ef027f36c55c72bae940261a6c6a6..d1cd3f726c6c8e07feff2a6cf48e002956eb20b6 100644
--- a/browser/components/translation/TranslationChild.jsm
+++ b/browser/components/translation/TranslationChild.jsm
@@ -10,7 +10,7 @@ const lazy = {};
 ChromeUtils.defineModuleGetter(
   lazy,
   "LanguageDetector",
-  "resource:///modules/translation/LanguageDetector.jsm"
+  "resource://gre/modules/translation/LanguageDetector.jsm"
 );
 
 const STATE_OFFER = 0;
diff --git a/browser/components/translation/moz.build b/browser/components/translation/moz.build
index 99217d9e828fbaed72f04d4fa73bd5a27463be60..02968f17a95d76658aaefe2c7e5631ea107fd7d3 100644
--- a/browser/components/translation/moz.build
+++ b/browser/components/translation/moz.build
@@ -11,10 +11,7 @@ with Files("**"):
 
 EXTRA_JS_MODULES.translation = [
     "BingTranslator.jsm",
-    "cld2/cld-worker.js",
-    "cld2/cld-worker.js.mem",
     "GoogleTranslator.jsm",
-    "LanguageDetector.jsm",
     "TranslationChild.jsm",
     "TranslationDocument.jsm",
     "TranslationParent.jsm",
@@ -22,5 +19,3 @@ EXTRA_JS_MODULES.translation = [
 ]
 
 BROWSER_CHROME_MANIFESTS += ["test/browser.ini"]
-
-XPCSHELL_TESTS_MANIFESTS += ["test/unit/xpcshell.ini"]
diff --git a/browser/installer/allowed-dupes.mn b/browser/installer/allowed-dupes.mn
index b59fe4b1854fec7cb329139f9c6773498fb9de51..0e7fdcc21e4af0dbbb9898e9e4b39c41a70cdbea 100644
--- a/browser/installer/allowed-dupes.mn
+++ b/browser/installer/allowed-dupes.mn
@@ -113,8 +113,3 @@ browser/chrome/browser/skin/classic/browser/customize.svg
 # Bug 1718144 - De-duplicate lightbulb icon
 browser/features/webcompat-reporter@mozilla.org/icons/lightbulb.svg
 chrome/toolkit/skin/classic/global/icons/lightbulb.svg
-
-# Bug 1710546 - Bundle Firefox extension as a builtin addon Nighly only
-# We plan to remove this duplicity after Firefox Translations become pref'd on
-browser/chrome/browser/builtin-addons/translations/wasm/cld-worker.js.mem
-browser/modules/translation/cld-worker.js.mem
diff --git a/dom/security/nsContentSecurityUtils.cpp b/dom/security/nsContentSecurityUtils.cpp
index e8f50a85862f0dc1b96faf37076913b685b56414..ddf89afaf827a9b1d1e0c1612f47aeaeffad03f8 100644
--- a/dom/security/nsContentSecurityUtils.cpp
+++ b/dom/security/nsContentSecurityUtils.cpp
@@ -602,7 +602,7 @@ bool nsContentSecurityUtils::IsEvalAllowed(JSContext* cx,
       "resource://testing-common/content-task.js"_ns,
 
       // Tracked by Bug 1584605
-      "resource:///modules/translation/cld-worker.js"_ns,
+      "resource://gre/modules/translation/cld-worker.js"_ns,
 
       // require.js implements a script loader for workers. It uses eval
       // to load the script; but injection is only possible in situations
diff --git a/toolkit/components/extensions/ExtensionContent.jsm b/toolkit/components/extensions/ExtensionContent.jsm
index 2b23bc9207835bdbf0f54a207a5e46d225057660..0f0f709b51203a576d4ff9b4fbbffad1f02f1724 100644
--- a/toolkit/components/extensions/ExtensionContent.jsm
+++ b/toolkit/components/extensions/ExtensionContent.jsm
@@ -19,7 +19,7 @@ const lazy = {};
 XPCOMUtils.defineLazyModuleGetters(lazy, {
   ExtensionProcessScript: "resource://gre/modules/ExtensionProcessScript.jsm",
   ExtensionTelemetry: "resource://gre/modules/ExtensionTelemetry.jsm",
-  LanguageDetector: "resource:///modules/translation/LanguageDetector.jsm",
+  LanguageDetector: "resource://gre/modules/translation/LanguageDetector.jsm",
   Schemas: "resource://gre/modules/Schemas.jsm",
   WebNavigationFrames: "resource://gre/modules/WebNavigationFrames.jsm",
 });
diff --git a/toolkit/components/extensions/parent/ext-i18n.js b/toolkit/components/extensions/parent/ext-i18n.js
index 72ffc5b8692134f30e86b5a7a0a47f5e92d6a907..57a3d600816a3b1bcfece3217cd7711962415155 100644
--- a/toolkit/components/extensions/parent/ext-i18n.js
+++ b/toolkit/components/extensions/parent/ext-i18n.js
@@ -7,7 +7,7 @@
 ChromeUtils.defineModuleGetter(
   this,
   "LanguageDetector",
-  "resource:///modules/translation/LanguageDetector.jsm"
+  "resource://gre/modules/translation/LanguageDetector.jsm"
 );
 
 this.i18n = class extends ExtensionAPI {
diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_i18n.js b/toolkit/components/extensions/test/xpcshell/test_ext_i18n.js
index 9709df842d07d2ce2ecc82a06edfe0bad81dfa82..af7d0fc71830eab27b69b25011e6a40f8871cb0c 100644
--- a/toolkit/components/extensions/test/xpcshell/test_ext_i18n.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_i18n.js
@@ -351,7 +351,10 @@ add_task(async function test_get_accept_languages() {
   await extension.startup();
   await extension.awaitMessage("content-loaded");
 
-  let expectedLangs = ["en-US", "en"];
+  // TODO bug 1765375: ", en" is missing on Android.
+  // TODO bug 1785807: "en-us" should be "en-US" on Android
+  let expectedLangs =
+    AppConstants.platform == "android" ? ["en-us"] : ["en-US", "en"];
   extension.sendMessage(["expect-results", expectedLangs]);
   await extension.awaitMessage("background-done");
   await extension.awaitMessage("content-done");
@@ -452,11 +455,6 @@ add_task(async function test_get_ui_language() {
 });
 
 add_task(async function test_detect_language() {
-  if (AppConstants.MOZ_BUILD_APP !== "browser") {
-    // This is not supported on Android.
-    return;
-  }
-
   const af_string =
     " aam skukuza die naam beteken hy wat skoonvee of hy wat alles onderstebo keer wysig " +
     "bosveldkampe boskampe is kleiner afgeleë ruskampe wat oor min fasiliteite beskik daar is geen restaurante " +
diff --git a/toolkit/components/extensions/test/xpcshell/xpcshell-content.ini b/toolkit/components/extensions/test/xpcshell/xpcshell-content.ini
index 25ec39f1d954a5ec4a6ce337a93590612b11d474..5afb0e2f217295055e86e5463382d83b24c82fcb 100644
--- a/toolkit/components/extensions/test/xpcshell/xpcshell-content.ini
+++ b/toolkit/components/extensions/test/xpcshell/xpcshell-content.ini
@@ -1,5 +1,5 @@
 [test_ext_i18n.js]
-skip-if = os == "android" || (os == "win" && debug) || (os == "linux")
+skip-if = (os == "win" && debug) || (os == "linux")
 [test_ext_i18n_css.js]
 skip-if =
   os == "mac" && debug && fission # Bug 1762638
diff --git a/toolkit/components/moz.build b/toolkit/components/moz.build
index c078363f8b27abb09880ae7c1be0458a3530f161..641697102a631c73f1517e5a52d578b7c80c08c7 100644
--- a/toolkit/components/moz.build
+++ b/toolkit/components/moz.build
@@ -72,6 +72,7 @@ DIRS += [
     "startup",
     "statusfilter",
     "telemetry",
+    "translation",
     "thumbnails",
     "timermanager",
     "tooltiptext",
diff --git a/toolkit/components/reader/ReaderMode.jsm b/toolkit/components/reader/ReaderMode.jsm
index cc25160ed266f19f28799a8d1f2f2bf227384771..1449338e2a610e89db7aab39b0642e5af577f766 100644
--- a/toolkit/components/reader/ReaderMode.jsm
+++ b/toolkit/components/reader/ReaderMode.jsm
@@ -45,7 +45,7 @@ ChromeUtils.defineModuleGetter(
 ChromeUtils.defineModuleGetter(
   lazy,
   "LanguageDetector",
-  "resource:///modules/translation/LanguageDetector.jsm"
+  "resource://gre/modules/translation/LanguageDetector.jsm"
 );
 ChromeUtils.defineModuleGetter(
   lazy,
diff --git a/browser/components/translation/LanguageDetector.jsm b/toolkit/components/translation/LanguageDetector.jsm
similarity index 98%
rename from browser/components/translation/LanguageDetector.jsm
rename to toolkit/components/translation/LanguageDetector.jsm
index 573b6eadd37dc448b4813f8bf516179cca7ea412..57ce66146295d4253d1f3893128198b0449319a5 100644
--- a/browser/components/translation/LanguageDetector.jsm
+++ b/toolkit/components/translation/LanguageDetector.jsm
@@ -11,7 +11,7 @@ const { clearTimeout, setTimeout } = ChromeUtils.import(
   "resource://gre/modules/Timer.jsm"
 );
 
-const WORKER_URL = "resource:///modules/translation/cld-worker.js";
+const WORKER_URL = "resource://gre/modules/translation/cld-worker.js";
 
 var workerManager = {
   // Since Emscripten can handle heap growth, but not heap shrinkage, we
diff --git a/browser/components/translation/cld2/Makefile b/toolkit/components/translation/cld2/Makefile
similarity index 100%
rename from browser/components/translation/cld2/Makefile
rename to toolkit/components/translation/cld2/Makefile
diff --git a/browser/components/translation/cld2/cld-worker.js b/toolkit/components/translation/cld2/cld-worker.js
similarity index 100%
rename from browser/components/translation/cld2/cld-worker.js
rename to toolkit/components/translation/cld2/cld-worker.js
diff --git a/browser/components/translation/cld2/cld-worker.js.mem b/toolkit/components/translation/cld2/cld-worker.js.mem
similarity index 100%
rename from browser/components/translation/cld2/cld-worker.js.mem
rename to toolkit/components/translation/cld2/cld-worker.js.mem
diff --git a/browser/components/translation/cld2/cld.idl b/toolkit/components/translation/cld2/cld.idl
similarity index 100%
rename from browser/components/translation/cld2/cld.idl
rename to toolkit/components/translation/cld2/cld.idl
diff --git a/browser/components/translation/cld2/cldapp.cc b/toolkit/components/translation/cld2/cldapp.cc
similarity index 100%
rename from browser/components/translation/cld2/cldapp.cc
rename to toolkit/components/translation/cld2/cldapp.cc
diff --git a/browser/components/translation/cld2/internal/LICENSE b/toolkit/components/translation/cld2/internal/LICENSE
similarity index 100%
rename from browser/components/translation/cld2/internal/LICENSE
rename to toolkit/components/translation/cld2/internal/LICENSE
diff --git a/browser/components/translation/cld2/internal/cld2_dynamic_data.h b/toolkit/components/translation/cld2/internal/cld2_dynamic_data.h
similarity index 100%
rename from browser/components/translation/cld2/internal/cld2_dynamic_data.h
rename to toolkit/components/translation/cld2/internal/cld2_dynamic_data.h
diff --git a/browser/components/translation/cld2/internal/cld2_dynamic_data_loader.h b/toolkit/components/translation/cld2/internal/cld2_dynamic_data_loader.h
similarity index 100%
rename from browser/components/translation/cld2/internal/cld2_dynamic_data_loader.h
rename to toolkit/components/translation/cld2/internal/cld2_dynamic_data_loader.h
diff --git a/browser/components/translation/cld2/internal/cld2_generated_cjk_compatible.cc b/toolkit/components/translation/cld2/internal/cld2_generated_cjk_compatible.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/cld2_generated_cjk_compatible.cc
rename to toolkit/components/translation/cld2/internal/cld2_generated_cjk_compatible.cc
diff --git a/browser/components/translation/cld2/internal/cld2_generated_deltaoctachrome0122.cc b/toolkit/components/translation/cld2/internal/cld2_generated_deltaoctachrome0122.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/cld2_generated_deltaoctachrome0122.cc
rename to toolkit/components/translation/cld2/internal/cld2_generated_deltaoctachrome0122.cc
diff --git a/browser/components/translation/cld2/internal/cld2_generated_distinctoctachrome0122.cc b/toolkit/components/translation/cld2/internal/cld2_generated_distinctoctachrome0122.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/cld2_generated_distinctoctachrome0122.cc
rename to toolkit/components/translation/cld2/internal/cld2_generated_distinctoctachrome0122.cc
diff --git a/browser/components/translation/cld2/internal/cld2_generated_quadchrome0122_16.cc b/toolkit/components/translation/cld2/internal/cld2_generated_quadchrome0122_16.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/cld2_generated_quadchrome0122_16.cc
rename to toolkit/components/translation/cld2/internal/cld2_generated_quadchrome0122_16.cc
diff --git a/browser/components/translation/cld2/internal/cld2tablesummary.h b/toolkit/components/translation/cld2/internal/cld2tablesummary.h
similarity index 100%
rename from browser/components/translation/cld2/internal/cld2tablesummary.h
rename to toolkit/components/translation/cld2/internal/cld2tablesummary.h
diff --git a/browser/components/translation/cld2/internal/cld_generated_cjk_delta_bi_4.cc b/toolkit/components/translation/cld2/internal/cld_generated_cjk_delta_bi_4.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/cld_generated_cjk_delta_bi_4.cc
rename to toolkit/components/translation/cld2/internal/cld_generated_cjk_delta_bi_4.cc
diff --git a/browser/components/translation/cld2/internal/cld_generated_cjk_uni_prop_80.cc b/toolkit/components/translation/cld2/internal/cld_generated_cjk_uni_prop_80.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/cld_generated_cjk_uni_prop_80.cc
rename to toolkit/components/translation/cld2/internal/cld_generated_cjk_uni_prop_80.cc
diff --git a/browser/components/translation/cld2/internal/cld_generated_score_quad_octa_0122_2.cc b/toolkit/components/translation/cld2/internal/cld_generated_score_quad_octa_0122_2.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/cld_generated_score_quad_octa_0122_2.cc
rename to toolkit/components/translation/cld2/internal/cld_generated_score_quad_octa_0122_2.cc
diff --git a/browser/components/translation/cld2/internal/cldutil.cc b/toolkit/components/translation/cld2/internal/cldutil.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/cldutil.cc
rename to toolkit/components/translation/cld2/internal/cldutil.cc
diff --git a/browser/components/translation/cld2/internal/cldutil.h b/toolkit/components/translation/cld2/internal/cldutil.h
similarity index 100%
rename from browser/components/translation/cld2/internal/cldutil.h
rename to toolkit/components/translation/cld2/internal/cldutil.h
diff --git a/browser/components/translation/cld2/internal/cldutil_shared.cc b/toolkit/components/translation/cld2/internal/cldutil_shared.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/cldutil_shared.cc
rename to toolkit/components/translation/cld2/internal/cldutil_shared.cc
diff --git a/browser/components/translation/cld2/internal/cldutil_shared.h b/toolkit/components/translation/cld2/internal/cldutil_shared.h
similarity index 100%
rename from browser/components/translation/cld2/internal/cldutil_shared.h
rename to toolkit/components/translation/cld2/internal/cldutil_shared.h
diff --git a/browser/components/translation/cld2/internal/compact_lang_det.cc b/toolkit/components/translation/cld2/internal/compact_lang_det.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/compact_lang_det.cc
rename to toolkit/components/translation/cld2/internal/compact_lang_det.cc
diff --git a/browser/components/translation/cld2/internal/compact_lang_det_hint_code.cc b/toolkit/components/translation/cld2/internal/compact_lang_det_hint_code.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/compact_lang_det_hint_code.cc
rename to toolkit/components/translation/cld2/internal/compact_lang_det_hint_code.cc
diff --git a/browser/components/translation/cld2/internal/compact_lang_det_hint_code.h b/toolkit/components/translation/cld2/internal/compact_lang_det_hint_code.h
similarity index 100%
rename from browser/components/translation/cld2/internal/compact_lang_det_hint_code.h
rename to toolkit/components/translation/cld2/internal/compact_lang_det_hint_code.h
diff --git a/browser/components/translation/cld2/internal/compact_lang_det_impl.cc b/toolkit/components/translation/cld2/internal/compact_lang_det_impl.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/compact_lang_det_impl.cc
rename to toolkit/components/translation/cld2/internal/compact_lang_det_impl.cc
diff --git a/browser/components/translation/cld2/internal/compact_lang_det_impl.h b/toolkit/components/translation/cld2/internal/compact_lang_det_impl.h
similarity index 100%
rename from browser/components/translation/cld2/internal/compact_lang_det_impl.h
rename to toolkit/components/translation/cld2/internal/compact_lang_det_impl.h
diff --git a/browser/components/translation/cld2/internal/debug.h b/toolkit/components/translation/cld2/internal/debug.h
similarity index 100%
rename from browser/components/translation/cld2/internal/debug.h
rename to toolkit/components/translation/cld2/internal/debug.h
diff --git a/browser/components/translation/cld2/internal/debug_empty.cc b/toolkit/components/translation/cld2/internal/debug_empty.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/debug_empty.cc
rename to toolkit/components/translation/cld2/internal/debug_empty.cc
diff --git a/browser/components/translation/cld2/internal/fixunicodevalue.cc b/toolkit/components/translation/cld2/internal/fixunicodevalue.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/fixunicodevalue.cc
rename to toolkit/components/translation/cld2/internal/fixunicodevalue.cc
diff --git a/browser/components/translation/cld2/internal/fixunicodevalue.h b/toolkit/components/translation/cld2/internal/fixunicodevalue.h
similarity index 100%
rename from browser/components/translation/cld2/internal/fixunicodevalue.h
rename to toolkit/components/translation/cld2/internal/fixunicodevalue.h
diff --git a/browser/components/translation/cld2/internal/generated_distinct_bi_0.cc b/toolkit/components/translation/cld2/internal/generated_distinct_bi_0.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/generated_distinct_bi_0.cc
rename to toolkit/components/translation/cld2/internal/generated_distinct_bi_0.cc
diff --git a/browser/components/translation/cld2/internal/generated_entities.cc b/toolkit/components/translation/cld2/internal/generated_entities.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/generated_entities.cc
rename to toolkit/components/translation/cld2/internal/generated_entities.cc
diff --git a/browser/components/translation/cld2/internal/generated_language.cc b/toolkit/components/translation/cld2/internal/generated_language.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/generated_language.cc
rename to toolkit/components/translation/cld2/internal/generated_language.cc
diff --git a/browser/components/translation/cld2/internal/generated_language.h b/toolkit/components/translation/cld2/internal/generated_language.h
similarity index 100%
rename from browser/components/translation/cld2/internal/generated_language.h
rename to toolkit/components/translation/cld2/internal/generated_language.h
diff --git a/browser/components/translation/cld2/internal/generated_ulscript.cc b/toolkit/components/translation/cld2/internal/generated_ulscript.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/generated_ulscript.cc
rename to toolkit/components/translation/cld2/internal/generated_ulscript.cc
diff --git a/browser/components/translation/cld2/internal/generated_ulscript.h b/toolkit/components/translation/cld2/internal/generated_ulscript.h
similarity index 100%
rename from browser/components/translation/cld2/internal/generated_ulscript.h
rename to toolkit/components/translation/cld2/internal/generated_ulscript.h
diff --git a/browser/components/translation/cld2/internal/getonescriptspan.cc b/toolkit/components/translation/cld2/internal/getonescriptspan.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/getonescriptspan.cc
rename to toolkit/components/translation/cld2/internal/getonescriptspan.cc
diff --git a/browser/components/translation/cld2/internal/getonescriptspan.h b/toolkit/components/translation/cld2/internal/getonescriptspan.h
similarity index 100%
rename from browser/components/translation/cld2/internal/getonescriptspan.h
rename to toolkit/components/translation/cld2/internal/getonescriptspan.h
diff --git a/browser/components/translation/cld2/internal/integral_types.h b/toolkit/components/translation/cld2/internal/integral_types.h
similarity index 100%
rename from browser/components/translation/cld2/internal/integral_types.h
rename to toolkit/components/translation/cld2/internal/integral_types.h
diff --git a/browser/components/translation/cld2/internal/lang_script.cc b/toolkit/components/translation/cld2/internal/lang_script.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/lang_script.cc
rename to toolkit/components/translation/cld2/internal/lang_script.cc
diff --git a/browser/components/translation/cld2/internal/lang_script.h b/toolkit/components/translation/cld2/internal/lang_script.h
similarity index 100%
rename from browser/components/translation/cld2/internal/lang_script.h
rename to toolkit/components/translation/cld2/internal/lang_script.h
diff --git a/browser/components/translation/cld2/internal/langspan.h b/toolkit/components/translation/cld2/internal/langspan.h
similarity index 100%
rename from browser/components/translation/cld2/internal/langspan.h
rename to toolkit/components/translation/cld2/internal/langspan.h
diff --git a/browser/components/translation/cld2/internal/offsetmap.cc b/toolkit/components/translation/cld2/internal/offsetmap.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/offsetmap.cc
rename to toolkit/components/translation/cld2/internal/offsetmap.cc
diff --git a/browser/components/translation/cld2/internal/offsetmap.h b/toolkit/components/translation/cld2/internal/offsetmap.h
similarity index 100%
rename from browser/components/translation/cld2/internal/offsetmap.h
rename to toolkit/components/translation/cld2/internal/offsetmap.h
diff --git a/browser/components/translation/cld2/internal/port.h b/toolkit/components/translation/cld2/internal/port.h
similarity index 100%
rename from browser/components/translation/cld2/internal/port.h
rename to toolkit/components/translation/cld2/internal/port.h
diff --git a/browser/components/translation/cld2/internal/scoreonescriptspan.cc b/toolkit/components/translation/cld2/internal/scoreonescriptspan.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/scoreonescriptspan.cc
rename to toolkit/components/translation/cld2/internal/scoreonescriptspan.cc
diff --git a/browser/components/translation/cld2/internal/scoreonescriptspan.h b/toolkit/components/translation/cld2/internal/scoreonescriptspan.h
similarity index 100%
rename from browser/components/translation/cld2/internal/scoreonescriptspan.h
rename to toolkit/components/translation/cld2/internal/scoreonescriptspan.h
diff --git a/browser/components/translation/cld2/internal/stringpiece.h b/toolkit/components/translation/cld2/internal/stringpiece.h
similarity index 100%
rename from browser/components/translation/cld2/internal/stringpiece.h
rename to toolkit/components/translation/cld2/internal/stringpiece.h
diff --git a/browser/components/translation/cld2/internal/tote.cc b/toolkit/components/translation/cld2/internal/tote.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/tote.cc
rename to toolkit/components/translation/cld2/internal/tote.cc
diff --git a/browser/components/translation/cld2/internal/tote.h b/toolkit/components/translation/cld2/internal/tote.h
similarity index 100%
rename from browser/components/translation/cld2/internal/tote.h
rename to toolkit/components/translation/cld2/internal/tote.h
diff --git a/browser/components/translation/cld2/internal/utf8prop_lettermarkscriptnum.h b/toolkit/components/translation/cld2/internal/utf8prop_lettermarkscriptnum.h
similarity index 100%
rename from browser/components/translation/cld2/internal/utf8prop_lettermarkscriptnum.h
rename to toolkit/components/translation/cld2/internal/utf8prop_lettermarkscriptnum.h
diff --git a/browser/components/translation/cld2/internal/utf8repl_lettermarklower.h b/toolkit/components/translation/cld2/internal/utf8repl_lettermarklower.h
similarity index 100%
rename from browser/components/translation/cld2/internal/utf8repl_lettermarklower.h
rename to toolkit/components/translation/cld2/internal/utf8repl_lettermarklower.h
diff --git a/browser/components/translation/cld2/internal/utf8scannot_lettermarkspecial.h b/toolkit/components/translation/cld2/internal/utf8scannot_lettermarkspecial.h
similarity index 100%
rename from browser/components/translation/cld2/internal/utf8scannot_lettermarkspecial.h
rename to toolkit/components/translation/cld2/internal/utf8scannot_lettermarkspecial.h
diff --git a/browser/components/translation/cld2/internal/utf8statetable.cc b/toolkit/components/translation/cld2/internal/utf8statetable.cc
similarity index 100%
rename from browser/components/translation/cld2/internal/utf8statetable.cc
rename to toolkit/components/translation/cld2/internal/utf8statetable.cc
diff --git a/browser/components/translation/cld2/internal/utf8statetable.h b/toolkit/components/translation/cld2/internal/utf8statetable.h
similarity index 100%
rename from browser/components/translation/cld2/internal/utf8statetable.h
rename to toolkit/components/translation/cld2/internal/utf8statetable.h
diff --git a/browser/components/translation/cld2/post.js b/toolkit/components/translation/cld2/post.js
similarity index 100%
rename from browser/components/translation/cld2/post.js
rename to toolkit/components/translation/cld2/post.js
diff --git a/browser/components/translation/cld2/public/compact_lang_det.h b/toolkit/components/translation/cld2/public/compact_lang_det.h
similarity index 100%
rename from browser/components/translation/cld2/public/compact_lang_det.h
rename to toolkit/components/translation/cld2/public/compact_lang_det.h
diff --git a/browser/components/translation/cld2/public/encodings.h b/toolkit/components/translation/cld2/public/encodings.h
similarity index 100%
rename from browser/components/translation/cld2/public/encodings.h
rename to toolkit/components/translation/cld2/public/encodings.h
diff --git a/toolkit/components/translation/moz.build b/toolkit/components/translation/moz.build
new file mode 100644
index 0000000000000000000000000000000000000000..23311ad1ea94c677cbb80036a1d44b4ccbc60906
--- /dev/null
+++ b/toolkit/components/translation/moz.build
@@ -0,0 +1,14 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+with Files("**"):
+    BUG_COMPONENT = ("Firefox", "Translation")
+
+EXTRA_JS_MODULES.translation = [
+    "cld2/cld-worker.js",
+    "cld2/cld-worker.js.mem",
+    "LanguageDetector.jsm",
+]
+
+XPCSHELL_TESTS_MANIFESTS += ["test/unit/xpcshell.ini"]
diff --git a/browser/components/translation/test/unit/test_cld2.js b/toolkit/components/translation/test/unit/test_cld2.js
similarity index 99%
rename from browser/components/translation/test/unit/test_cld2.js
rename to toolkit/components/translation/test/unit/test_cld2.js
index caf236a7c72f63233a53a9b212917772c5430323..e1da1a46e20b79d8091456a2310956b3d42566b4 100644
--- a/browser/components/translation/test/unit/test_cld2.js
+++ b/toolkit/components/translation/test/unit/test_cld2.js
@@ -569,7 +569,7 @@ const kTestPairs = [
 
 const { setTimeout } = ChromeUtils.import("resource://gre/modules/Timer.jsm");
 let { LanguageDetector, workerManager } = ChromeUtils.import(
-  "resource:///modules/translation/LanguageDetector.jsm"
+  "resource://gre/modules/translation/LanguageDetector.jsm"
 );
 
 function check_result(result, langCode, expected) {
diff --git a/browser/components/translation/test/unit/xpcshell.ini b/toolkit/components/translation/test/unit/xpcshell.ini
similarity index 56%
rename from browser/components/translation/test/unit/xpcshell.ini
rename to toolkit/components/translation/test/unit/xpcshell.ini
index b1754a82b2e319e73e59ef2a57a0929822480937..8eb7506cc361e58e191fc83278b8fb5d08797ff4 100644
--- a/browser/components/translation/test/unit/xpcshell.ini
+++ b/toolkit/components/translation/test/unit/xpcshell.ini
@@ -1,6 +1,5 @@
 [DEFAULT]
 head = 
 firefox-appdir = browser
-skip-if = toolkit == 'android' # bug 1730213
 
 [test_cld2.js]
diff --git a/tools/esmify/map.json b/tools/esmify/map.json
index bc254554296291597d9133124a6f1089d6ab41df..4d58c32f5d45b4bad9c9ffbad23a8348479c1f92 100644
--- a/tools/esmify/map.json
+++ b/tools/esmify/map.json
@@ -792,8 +792,6 @@
     "browser/components/syncedtabs/util.js",
   "resource:///modules/translation/BingTranslator.jsm":
     "browser/components/translation/BingTranslator.jsm",
-  "resource:///modules/translation/LanguageDetector.jsm":
-    "browser/components/translation/LanguageDetector.jsm",
   "resource:///modules/translation/TranslationChild.jsm":
     "browser/components/translation/TranslationChild.jsm",
   "resource:///modules/translation/TranslationDocument.jsm":
@@ -1944,6 +1942,8 @@
     "toolkit/modules/third_party/fathom/fathom.jsm",
   "resource://gre/modules/third_party/jsesc/jsesc.js":
     "toolkit/modules/third_party/jsesc/jsesc.js",
+  "resource://gre/modules/translation/LanguageDetector.jsm":
+    "toolkit/components/translation/LanguageDetector.jsm",
   "resource://gre/modules/txEXSLTRegExFunctions.jsm":
     "dom/xslt/xslt/txEXSLTRegExFunctions.jsm",
   "resource://gre/modules/vtt.jsm": "dom/media/webvtt/vtt.jsm",
diff --git a/tools/rewriting/ThirdPartyPaths.txt b/tools/rewriting/ThirdPartyPaths.txt
index 891dea05303366f0be5125ea3eea1e5096bf428d..488d2663e02e75574de0febb67c3d7c0a3e94e24 100644
--- a/tools/rewriting/ThirdPartyPaths.txt
+++ b/tools/rewriting/ThirdPartyPaths.txt
@@ -1,7 +1,6 @@
 browser/components/newtab/vendor/
 browser/components/pocket/content/panels/js/vendor/
 browser/components/storybook/node_modules/
-browser/components/translation/cld2/
 browser/extensions/formautofill/content/third-party/
 browser/extensions/formautofill/test/fixtures/third_party/
 browser/extensions/screenshots/build/raven.js
@@ -171,6 +170,7 @@ toolkit/components/jsoncpp/
 toolkit/components/normandy/vendor/
 toolkit/components/passwordmgr/PasswordRulesParser.jsm
 toolkit/components/protobuf/
+toolkit/components/translation/cld2/
 toolkit/components/url-classifier/chromium/
 toolkit/components/utils/mozjexl.js
 toolkit/components/viaduct/fetch_msg_types.pb.cc