diff --git a/.firefox.metadata b/.firefox.metadata
index 42045ba..73701e6 100644
--- a/.firefox.metadata
+++ b/.firefox.metadata
@@ -1,7 +1,5 @@
52f2d51d0e17d137571bf3a766f514d34e28e556 SOURCES/cbindgen-vendor.tar.xz
-6aa448bcbabf2b9410b916e8290b0f58ee725186 SOURCES/firefox-102.11.0esr.b2.processed-source.tar.xz
-a26fce6c1a21e026f550ee9e4431200ddd041e36 SOURCES/firefox-langpacks-102.11.0esr-20230504.tar.xz
-2dbf669fa4742e7065cc54cec19f96423032658b SOURCES/firefox-symbolic.svg
-da39a3ee5e6b4b0d3255bfef95601890afd80709 SOURCES/mochitest-python.tar.gz
+ad6fa8c1048c81bedd369efcb30642a8bea003d9 SOURCES/firefox-102.12.0esr.processed-source.tar.xz
+422709954a376fb2cb4d5f89310372e664cb2cf3 SOURCES/firefox-langpacks-102.12.0esr-20230531.tar.xz
af58b3c87a8b5491dde63b07efaeb3d7f1ec56c1 SOURCES/nspr-4.34.0-3.el8_1.src.rpm
a9dd43799ab2ccbc248cfbba1cc5639c1ab18769 SOURCES/nss-3.79.0-11.el8_1.src.rpm
diff --git a/.gitignore b/.gitignore
index a521f31..b84053a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,5 @@
SOURCES/cbindgen-vendor.tar.xz
-SOURCES/firefox-102.11.0esr.b2.processed-source.tar.xz
-SOURCES/firefox-langpacks-102.11.0esr-20230504.tar.xz
-SOURCES/firefox-symbolic.svg
-SOURCES/mochitest-python.tar.gz
+SOURCES/firefox-102.12.0esr.processed-source.tar.xz
+SOURCES/firefox-langpacks-102.12.0esr-20230531.tar.xz
SOURCES/nspr-4.34.0-3.el8_1.src.rpm
SOURCES/nss-3.79.0-11.el8_1.src.rpm
diff --git a/SOURCES/firefox-redhat-default-prefs.js b/SOURCES/firefox-redhat-default-prefs.js
index 9f6c0f1..e1013e5 100644
--- a/SOURCES/firefox-redhat-default-prefs.js
+++ b/SOURCES/firefox-redhat-default-prefs.js
@@ -36,3 +36,6 @@ pref("browser.gnome-search-provider.enabled",true);
pref("media.navigator.mediadatadecoder_vpx_enabled", true);
/* See https://bugzilla.redhat.com/show_bug.cgi?id=1672424 */
pref("storage.nfs_filesystem", true);
+pref("datareporting.healthreport.uploadEnabled", false);
+pref("datareporting.policy.dataSubmissionEnabled", false);
+pref("toolkit.telemetry.archive.enabled", false);
diff --git a/SOURCES/firefox-symbolic.svg b/SOURCES/firefox-symbolic.svg
new file mode 100644
index 0000000..8ecd135
--- /dev/null
+++ b/SOURCES/firefox-symbolic.svg
@@ -0,0 +1,3 @@
+
diff --git a/SOURCES/mochitest-python.tar.gz b/SOURCES/mochitest-python.tar.gz
new file mode 100644
index 0000000..e69de29
diff --git a/SOURCES/mozilla-1833330.patch b/SOURCES/mozilla-1833330.patch
new file mode 100644
index 0000000..2c1af64
--- /dev/null
+++ b/SOURCES/mozilla-1833330.patch
@@ -0,0 +1,632 @@
+diff --git a/security/manager/locales/en-US/security/certificates/certManager.ftl b/security/manager/locales/en-US/security/certificates/certManager.ftl
+--- a/security/manager/locales/en-US/security/certificates/certManager.ftl
++++ b/security/manager/locales/en-US/security/certificates/certManager.ftl
+@@ -51,9 +51,6 @@ certmgr-cert-name =
+ certmgr-cert-server =
+ .label = Server
+
+-certmgr-override-lifetime =
+- .label = Lifetime
+-
+ certmgr-token-name =
+ .label = Security Device
+
+@@ -69,6 +66,9 @@ certmgr-email =
+ certmgr-serial =
+ .label = Serial Number
+
++certmgr-fingerprint-sha-256 =
++ .label = SHA-256 Fingerprint
++
+ certmgr-view =
+ .label = View…
+ .accesskey = V
+diff --git a/security/manager/pki/resources/content/certManager.js b/security/manager/pki/resources/content/certManager.js
+--- a/security/manager/pki/resources/content/certManager.js
++++ b/security/manager/pki/resources/content/certManager.js
+@@ -64,22 +64,16 @@ var serverRichList = {
+
+ buildRichList() {
+ let overrides = overrideService.getOverrides().map(item => {
+- let cert = null;
+- if (item.dbKey !== "") {
+- cert = certdb.findCertByDBKey(item.dbKey);
+- }
+ return {
+ hostPort: item.hostPort,
+- dbKey: item.dbKey,
+ asciiHost: item.asciiHost,
+ port: item.port,
+ originAttributes: item.originAttributes,
+- isTemporary: item.isTemporary,
+- displayName: cert !== null ? cert.displayName : "",
++ fingerprint: item.fingerprint,
+ };
+ });
+ overrides.sort((a, b) => {
+- let criteria = ["hostPort", "displayName"];
++ let criteria = ["hostPort", "fingerprint"];
+ for (let c of criteria) {
+ let res = a[c].localeCompare(b[c]);
+ if (res !== 0) {
+@@ -106,10 +100,10 @@ var serverRichList = {
+ _richBoxAddItem(item) {
+ let richlistitem = document.createXULElement("richlistitem");
+
+- richlistitem.setAttribute("dbKey", item.dbKey);
+ richlistitem.setAttribute("host", item.asciiHost);
+ richlistitem.setAttribute("port", item.port);
+ richlistitem.setAttribute("hostPort", item.hostPort);
++ richlistitem.setAttribute("fingerprint", item.fingerprint);
+ richlistitem.setAttribute(
+ "originAttributes",
+ JSON.stringify(item.originAttributes)
+@@ -120,18 +114,7 @@ var serverRichList = {
+ hbox.setAttribute("equalsize", "always");
+
+ hbox.appendChild(createRichlistItem({ raw: item.hostPort }));
+- hbox.appendChild(
+- createRichlistItem(
+- item.displayName !== ""
+- ? { raw: item.displayName }
+- : { l10nid: "no-cert-stored-for-override" }
+- )
+- );
+- hbox.appendChild(
+- createRichlistItem({
+- l10nid: item.isTemporary ? "temporary-override" : "permanent-override",
+- })
+- );
++ hbox.appendChild(createRichlistItem({ raw: item.fingerprint }));
+
+ richlistitem.appendChild(hbox);
+
+@@ -170,32 +153,6 @@ var serverRichList = {
+ }
+ },
+
+- viewSelectedRichListItem() {
+- let selectedItem = this.richlist.selectedItem;
+- if (!selectedItem) {
+- return;
+- }
+-
+- let dbKey = selectedItem.getAttribute("dbKey");
+- if (dbKey) {
+- let cert = certdb.findCertByDBKey(dbKey);
+- viewCertHelper(window, cert);
+- }
+- },
+-
+- exportSelectedRichListItem() {
+- let selectedItem = this.richlist.selectedItem;
+- if (!selectedItem) {
+- return;
+- }
+-
+- let dbKey = selectedItem.getAttribute("dbKey");
+- if (dbKey) {
+- let cert = certdb.findCertByDBKey(dbKey);
+- exportToFile(window, cert);
+- }
+- },
+-
+ addException() {
+ let retval = {
+ exceptionAdded: false,
+@@ -212,16 +169,8 @@ var serverRichList = {
+ },
+
+ _setButtonState() {
+- let websiteViewButton = document.getElementById("websites_viewButton");
+- let websiteExportButton = document.getElementById("websites_exportButton");
+ let websiteDeleteButton = document.getElementById("websites_deleteButton");
+-
+- let certKey = this.richlist.selectedItem?.getAttribute("dbKey");
+- let cert = certKey && certdb.findCertByDBKey(certKey);
+-
+ websiteDeleteButton.disabled = this.richlist.selectedIndex < 0;
+- websiteExportButton.disabled = !cert;
+- websiteViewButton.disabled = websiteExportButton.disabled;
+ },
+ };
+ /**
+diff --git a/security/manager/pki/resources/content/certManager.xhtml b/security/manager/pki/resources/content/certManager.xhtml
+--- a/security/manager/pki/resources/content/certManager.xhtml
++++ b/security/manager/pki/resources/content/certManager.xhtml
+@@ -157,18 +157,13 @@
+
+
+
+-
+-
++
+
+
+
+
+
+
+-
+-
+
+