diff --git a/package-lock.json b/package-lock.json
index 3cbbd321d7d..36574a2d60e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22887,10 +22887,10 @@
     },
     "packages/backend-core": {
       "name": "@clerk/backend-core",
-      "version": "0.7.0-alpha.1",
+      "version": "0.8.0-alpha.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/types": "^2.1.0-alpha.0",
         "camelcase-keys": "^7.0.1",
         "query-string": "^7.0.1",
         "snakecase-keys": "^5.1.2",
@@ -22917,10 +22917,10 @@
     },
     "packages/clerk-js": {
       "name": "@clerk/clerk-js",
-      "version": "3.0.1-alpha.3",
+      "version": "3.1.0-alpha.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/types": "^2.1.0-alpha.0",
         "@popperjs/core": "^2.4.4",
         "browser-tabs-lock": "^1.2.15",
         "classnames": "^2.3.1",
@@ -22940,7 +22940,7 @@
         "@babel/preset-env": "^7.12.1",
         "@babel/preset-react": "^7.12.5",
         "@babel/preset-typescript": "^7.12.1",
-        "@clerk/shared": "^0.0.16-alpha.3",
+        "@clerk/shared": "^0.0.16-alpha.4",
         "@pmmmwh/react-refresh-webpack-plugin": "^0.5.2",
         "@svgr/webpack": "^6.2.1",
         "@testing-library/dom": "^7.28.1",
@@ -23023,10 +23023,10 @@
     },
     "packages/edge": {
       "name": "@clerk/edge",
-      "version": "1.1.0-alpha.1",
+      "version": "1.2.0-alpha.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/backend-core": "^0.7.0-alpha.1",
+        "@clerk/backend-core": "^0.8.0-alpha.1",
         "@peculiar/webcrypto": "^1.2.3",
         "next": "^12.0.7"
       },
@@ -23049,15 +23049,15 @@
     },
     "packages/expo": {
       "name": "@clerk/clerk-expo",
-      "version": "0.8.18-alpha.3",
+      "version": "0.9.0-alpha.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/clerk-js": "^3.0.1-alpha.3",
-        "@clerk/clerk-react": "^3.0.1-alpha.3",
+        "@clerk/clerk-js": "^3.1.0-alpha.0",
+        "@clerk/clerk-react": "^3.1.0-alpha.1",
         "base-64": "^1.0.0"
       },
       "devDependencies": {
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/types": "^2.1.0-alpha.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.9",
         "@types/react": "^17.0.39",
@@ -23084,13 +23084,13 @@
     },
     "packages/nextjs": {
       "name": "@clerk/nextjs",
-      "version": "3.1.0-alpha.1",
+      "version": "3.2.0-alpha.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/clerk-react": "^3.0.1-alpha.3",
-        "@clerk/clerk-sdk-node": "^3.1.0-alpha.1",
-        "@clerk/edge": "^1.1.0-alpha.1",
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/clerk-react": "^3.1.0-alpha.1",
+        "@clerk/clerk-sdk-node": "^3.2.0-alpha.1",
+        "@clerk/edge": "^1.2.0-alpha.1",
+        "@clerk/types": "^2.1.0-alpha.0",
         "tslib": "^2.3.1"
       },
       "devDependencies": {
@@ -23120,10 +23120,10 @@
     },
     "packages/react": {
       "name": "@clerk/clerk-react",
-      "version": "3.0.1-alpha.3",
+      "version": "3.1.0-alpha.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/types": "^2.1.0-alpha.0",
         "tslib": "^2.3.1"
       },
       "devDependencies": {
@@ -23160,12 +23160,12 @@
     },
     "packages/remix": {
       "name": "@clerk/remix",
-      "version": "0.2.0-alpha.1",
+      "version": "0.3.0-alpha.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/clerk-react": "^3.0.1-alpha.3",
-        "@clerk/clerk-sdk-node": "^3.1.0-alpha.1",
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/clerk-react": "^3.1.0-alpha.1",
+        "@clerk/clerk-sdk-node": "^3.2.0-alpha.1",
+        "@clerk/types": "^2.1.0-alpha.0",
         "cookie": "^0.4.2",
         "tslib": "^2.3.1"
       },
@@ -23206,10 +23206,10 @@
     },
     "packages/sdk-node": {
       "name": "@clerk/clerk-sdk-node",
-      "version": "3.1.0-alpha.1",
+      "version": "3.2.0-alpha.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/backend-core": "^0.7.0-alpha.1",
+        "@clerk/backend-core": "^0.8.0-alpha.1",
         "@peculiar/webcrypto": "^1.2.3",
         "camelcase-keys": "^6.2.2",
         "cookies": "^0.8.0",
@@ -23282,12 +23282,12 @@
     },
     "packages/shared": {
       "name": "@clerk/shared",
-      "version": "0.0.16-alpha.3",
+      "version": "0.0.16-alpha.4",
       "devDependencies": {
         "@babel/core": "^7.13.14",
         "@babel/preset-env": "^7.13.12",
         "@babel/preset-react": "^7.13.13",
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/types": "^2.1.0-alpha.0",
         "@popperjs/core": "^2.5.4",
         "@sentry/browser": "^6.3.0",
         "@svgr/webpack": "^6.2.1",
@@ -23341,7 +23341,7 @@
     },
     "packages/types": {
       "name": "@clerk/types",
-      "version": "2.0.1-alpha.3",
+      "version": "2.1.0-alpha.0",
       "license": "MIT",
       "devDependencies": {
         "@types/jest": "^27.4.0",
@@ -24643,7 +24643,7 @@
     "@clerk/backend-core": {
       "version": "file:packages/backend-core",
       "requires": {
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/types": "^2.1.0-alpha.0",
         "@peculiar/webcrypto": "^1.3.2",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.12",
@@ -24671,9 +24671,9 @@
     "@clerk/clerk-expo": {
       "version": "file:packages/expo",
       "requires": {
-        "@clerk/clerk-js": "^3.0.1-alpha.3",
-        "@clerk/clerk-react": "^3.0.1-alpha.3",
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/clerk-js": "^3.1.0-alpha.0",
+        "@clerk/clerk-react": "^3.1.0-alpha.1",
+        "@clerk/types": "^2.1.0-alpha.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.9",
         "@types/react": "^17.0.39",
@@ -24704,8 +24704,8 @@
         "@babel/preset-env": "^7.12.1",
         "@babel/preset-react": "^7.12.5",
         "@babel/preset-typescript": "^7.12.1",
-        "@clerk/shared": "^0.0.16-alpha.3",
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/shared": "^0.0.16-alpha.4",
+        "@clerk/types": "^2.1.0-alpha.0",
         "@pmmmwh/react-refresh-webpack-plugin": "^0.5.2",
         "@popperjs/core": "^2.4.4",
         "@svgr/webpack": "^6.2.1",
@@ -24789,7 +24789,7 @@
     "@clerk/clerk-react": {
       "version": "file:packages/react",
       "requires": {
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/types": "^2.1.0-alpha.0",
         "@testing-library/dom": "^7.28.1",
         "@testing-library/jest-dom": "^5.11.6",
         "@testing-library/react": "^11.2.1",
@@ -24821,7 +24821,7 @@
     "@clerk/clerk-sdk-node": {
       "version": "file:packages/sdk-node",
       "requires": {
-        "@clerk/backend-core": "^0.7.0-alpha.1",
+        "@clerk/backend-core": "^0.8.0-alpha.1",
         "@peculiar/webcrypto": "^1.2.3",
         "@types/cookies": "^0.7.7",
         "@types/express": "^4.17.11",
@@ -24877,7 +24877,7 @@
     "@clerk/edge": {
       "version": "file:packages/edge",
       "requires": {
-        "@clerk/backend-core": "^0.7.0-alpha.1",
+        "@clerk/backend-core": "^0.8.0-alpha.1",
         "@peculiar/webcrypto": "^1.2.3",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.12",
@@ -24898,10 +24898,10 @@
     "@clerk/nextjs": {
       "version": "file:packages/nextjs",
       "requires": {
-        "@clerk/clerk-react": "^3.0.1-alpha.3",
-        "@clerk/clerk-sdk-node": "^3.1.0-alpha.1",
-        "@clerk/edge": "^1.1.0-alpha.1",
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/clerk-react": "^3.1.0-alpha.1",
+        "@clerk/clerk-sdk-node": "^3.2.0-alpha.1",
+        "@clerk/edge": "^1.2.0-alpha.1",
+        "@clerk/types": "^2.1.0-alpha.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.9",
         "@types/react": "^17.0.39",
@@ -24926,9 +24926,9 @@
     "@clerk/remix": {
       "version": "file:packages/remix",
       "requires": {
-        "@clerk/clerk-react": "^3.0.1-alpha.3",
-        "@clerk/clerk-sdk-node": "^3.1.0-alpha.1",
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/clerk-react": "^3.1.0-alpha.1",
+        "@clerk/clerk-sdk-node": "^3.2.0-alpha.1",
+        "@clerk/types": "^2.1.0-alpha.0",
         "@types/cookie": "^0.4.1",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.9",
@@ -24962,7 +24962,7 @@
         "@babel/core": "^7.13.14",
         "@babel/preset-env": "^7.13.12",
         "@babel/preset-react": "^7.13.13",
-        "@clerk/types": "^2.0.1-alpha.3",
+        "@clerk/types": "^2.1.0-alpha.0",
         "@popperjs/core": "^2.5.4",
         "@sentry/browser": "^6.3.0",
         "@svgr/webpack": "^6.2.1",
diff --git a/packages/backend-core/CHANGELOG.md b/packages/backend-core/CHANGELOG.md
index ddfd66b8366..3e2f179d1b5 100644
--- a/packages/backend-core/CHANGELOG.md
+++ b/packages/backend-core/CHANGELOG.md
@@ -3,6 +3,17 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [0.8.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/backend-core@0.7.0-alpha.1...@clerk/backend-core@0.8.0-alpha.1) (2022-03-23)
+
+### Features
+
+- **backend-core,clerk-sdk-node,nextjs,remix:** Add injected jwtKey option ([53e56e7](https://github.com/clerkinc/javascript/commit/53e56e76d59984d4d3f5b7e1e2d276adb8b2dc77))
+- **backend-core:** Add capability for injected JWT key on getAuthState and verifySessionToken ([8b318cc](https://github.com/clerkinc/javascript/commit/8b318cc8cf6f4730c92239d5f9da4d72177449d5))
+
+## [0.8.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/backend-core@0.7.0-alpha.1...@clerk/backend-core@0.8.0-alpha.0) (2022-03-22)
+
+**Note:** Version bump only for package @clerk/backend-core
+
 ## [0.7.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/backend-core@0.7.0-alpha.0...@clerk/backend-core@0.7.0-alpha.1) (2022-03-22)
 
 ### Bug Fixes
diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index 0e668b3ab36..7b361bd001a 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/backend-core",
-  "version": "0.7.0-alpha.1",
+  "version": "0.8.0-alpha.1",
   "license": "MIT",
   "description": "Clerk Backend API core resources and authentication utilities for JavaScript environments.",
   "scripts": {
@@ -12,7 +12,7 @@
   "main": "dist/cjs/index.js",
   "module": "dist/mjs/index.js",
   "dependencies": {
-    "@clerk/types": "^2.0.1-alpha.3",
+    "@clerk/types": "^2.1.0-alpha.0",
     "camelcase-keys": "^7.0.1",
     "query-string": "^7.0.1",
     "snakecase-keys": "^5.1.2",
diff --git a/packages/backend-core/src/Base.ts b/packages/backend-core/src/Base.ts
index 2c25c37e3ac..7323e448d4c 100644
--- a/packages/backend-core/src/Base.ts
+++ b/packages/backend-core/src/Base.ts
@@ -27,10 +27,7 @@ export type Session = {
 
 export type VerifySessionTokenOptions = {
   authorizedParties?: string[];
-};
-
-const verifySessionTokenDefaultOptions: VerifySessionTokenOptions = {
-  authorizedParties: [],
+  jwtKey?: string;
 };
 
 type AuthState = {
@@ -65,6 +62,8 @@ type AuthStateParams = {
   authorizedParties?: string[];
   /* HTTP utility for fetching a text/html string */
   fetchInterstitial: () => Promise<string>;
+  /* Value corresponding to the JWT verification key */
+  jwtKey?: string;
 };
 
 export class Base {
@@ -105,14 +104,18 @@ export class Base {
    */
   verifySessionToken = async (
     token: string,
-    { authorizedParties }: VerifySessionTokenOptions = verifySessionTokenDefaultOptions,
+    { authorizedParties, jwtKey }: VerifySessionTokenOptions,
   ): Promise<JWTPayload> => {
-    // Try to load the PK from supplied function and
-    // if there is no custom load function
-    // try to load from the environment.
-    const availableKey = this.loadCryptoKeyFunction
-      ? await this.loadCryptoKeyFunction(token)
-      : await this.loadCryptoKeyFromEnv();
+    /**
+     * Priority of JWT key search
+     * 1. Use supplied key
+     * 2. Use load function
+     * 3. Try to load from env
+     */
+    const availableKey =
+      !jwtKey && this.loadCryptoKeyFunction
+        ? await this.loadCryptoKeyFunction(token)
+        : await this.loadCryptoKey(jwtKey || process.env.CLERK_JWT_KEY);
 
     const claims = await this.verifyJwt(availableKey, token);
     checkClaims(claims, authorizedParties);
@@ -121,13 +124,12 @@ export class Base {
 
   /**
    *
-   * Modify the RSA public key from the PEM retrieved from the CLERK_JWT_KEY environment variable
-   * and return a contructed CryptoKey.
+   * @param {string} token Clerk JWT verification token
+   * Modify the RSA public key from the Clerk PEM supplied and return a contructed CryptoKey.
    * You will find that at your application dashboard (https://dashboard.clerk.dev) under Settings ->  API keys
    *
    */
-  loadCryptoKeyFromEnv = async (): Promise<CryptoKey> => {
-    const key = process.env.CLERK_JWT_KEY;
+  loadCryptoKey = async (key?: string): Promise<CryptoKey> => {
     if (!key) {
       throw new Error('Missing jwt key');
     }
@@ -219,18 +221,20 @@ export class Base {
     userAgent,
     authorizedParties,
     fetchInterstitial,
+    jwtKey,
   }: AuthStateParams): Promise<AuthState> => {
     let sessionClaims;
     if (headerToken) {
       try {
         sessionClaims = await this.verifySessionToken(headerToken, {
           authorizedParties,
+          jwtKey,
         });
         return {
           status: AuthStatus.SignedIn,
           session: {
-            id: sessionClaims.sid as string,
-            userId: sessionClaims.sub as string,
+            id: sessionClaims.sid,
+            userId: sessionClaims.sub,
           },
           sessionClaims,
         };
@@ -322,6 +326,7 @@ export class Base {
     try {
       sessionClaims = await this.verifySessionToken(cookieToken as string, {
         authorizedParties,
+        jwtKey,
       });
     } catch (err) {
       if (err instanceof JWTExpiredError) {
@@ -334,12 +339,12 @@ export class Base {
       }
     }
 
-    if (cookieToken && clientUat && sessionClaims?.iat && sessionClaims.iat >= Number(clientUat)) {
+    if (cookieToken && clientUat && sessionClaims.iat >= Number(clientUat)) {
       return {
         status: AuthStatus.SignedIn,
         session: {
-          id: sessionClaims.sid as string,
-          userId: sessionClaims.sub as string,
+          id: sessionClaims.sid,
+          userId: sessionClaims.sub,
         },
         sessionClaims,
       };
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index 8206b6d56de..2bff3a60d9b 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -3,6 +3,16 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [3.1.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/clerk-js@3.0.1-alpha.3...@clerk/clerk-js@3.1.0-alpha.0) (2022-03-23)
+
+### Features
+
+- **clerk-js,types:** Rename UserButton params to afterSignOutUrl, afterMultiSessionSingleSignOutUrl ([c4cb76a](https://github.com/clerkinc/javascript/commit/c4cb76a1133fd2308b217cacaffb086b175f6347))
+
+### Bug Fixes
+
+- **clerk-js:** Stop parsing deprecated params from query strings ([8280d96](https://github.com/clerkinc/javascript/commit/8280d96f3cc99290687a551627c675e2b6a1edf0))
+
 ### [3.0.1-alpha.3](https://github.com/clerkinc/javascript/compare/@clerk/clerk-js@3.0.1-alpha.2...@clerk/clerk-js@3.0.1-alpha.3) (2022-03-22)
 
 ### Bug Fixes
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 8b21112a451..b87bdd9d30c 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/clerk-js",
-  "version": "3.0.1-alpha.3",
+  "version": "3.1.0-alpha.0",
   "license": "MIT",
   "description": "Clerk.dev JS library",
   "keywords": [
@@ -38,7 +38,7 @@
     "test:coverage": "jest --collectCoverage"
   },
   "dependencies": {
-    "@clerk/types": "^2.0.1-alpha.3",
+    "@clerk/types": "^2.1.0-alpha.0",
     "@popperjs/core": "^2.4.4",
     "browser-tabs-lock": "^1.2.15",
     "classnames": "^2.3.1",
@@ -58,7 +58,7 @@
     "@babel/preset-env": "^7.12.1",
     "@babel/preset-react": "^7.12.5",
     "@babel/preset-typescript": "^7.12.1",
-    "@clerk/shared": "^0.0.16-alpha.3",
+    "@clerk/shared": "^0.0.16-alpha.4",
     "@pmmmwh/react-refresh-webpack-plugin": "^0.5.2",
     "@svgr/webpack": "^6.2.1",
     "@testing-library/dom": "^7.28.1",
diff --git a/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.test.tsx b/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.test.tsx
index c355c85ffc6..1b635d89e86 100644
--- a/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.test.tsx
+++ b/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.test.tsx
@@ -83,7 +83,7 @@ describe('ActiveAccountsManager', () => {
     const tree = renderJSON(
       <ActiveAccountsManager
         sessions={sessions}
-        navigateAfterSignOutAll={noop}
+        navigateAfterSignOut={noop}
         navigateAfterSwitchSession={noop}
         userProfileUrl={'user_profile_url'}
         signInUrl={'sign_in_url'}
@@ -99,7 +99,7 @@ describe('ActiveAccountsManager', () => {
       <ActiveAccountsManager
         showActiveAccountButtons={false}
         sessions={[session]}
-        navigateAfterSignOutAll={noop}
+        navigateAfterSignOut={noop}
         navigateAfterSwitchSession={noop}
         userProfileUrl={'user_profile_url'}
         signInUrl={'sign_in_url'}
@@ -115,7 +115,7 @@ describe('ActiveAccountsManager', () => {
       <ActiveAccountsManager
         showActiveAccountButtons={false}
         sessions={[session]}
-        navigateAfterSignOutAll={noop}
+        navigateAfterSignOut={noop}
         navigateAfterSwitchSession={noop}
         userProfileUrl={'user_profile_url'}
         signInUrl={'sign_in_url'}
diff --git a/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.tsx b/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.tsx
index 12c67adc582..494c9abcb14 100644
--- a/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.tsx
+++ b/packages/clerk-js/src/ui/common/activeAccountsManager/ActiveAccountsManager.tsx
@@ -12,9 +12,9 @@ import SignOutAll from './SignOutAll';
 
 interface ActiveAccountsManagerProps {
   sessions: SessionResource[];
-  navigateAfterSignOutAll: () => void;
+  navigateAfterSignOut: () => void;
   navigateAfterSwitchSession: () => void;
-  navigateAfterSignOutOne?: () => void;
+  navigateAfterMultiSessionSingleSignOut?: () => void;
   userProfileUrl: string;
   signInUrl: string;
   showActiveAccountButtons?: boolean;
@@ -22,8 +22,8 @@ interface ActiveAccountsManagerProps {
 
 export function ActiveAccountsManager({
   sessions,
-  navigateAfterSignOutAll,
-  navigateAfterSignOutOne,
+  navigateAfterSignOut,
+  navigateAfterMultiSessionSingleSignOut,
   navigateAfterSwitchSession,
   signInUrl,
   userProfileUrl,
@@ -46,7 +46,9 @@ export function ActiveAccountsManager({
       return;
     }
 
-    signOut(navigateAfterSignOutOne, { sessionId: currentSessionId }).catch(() => setSignoutInProgress(false));
+    signOut(navigateAfterMultiSessionSingleSignOut, { sessionId: currentSessionId }).catch(() =>
+      setSignoutInProgress(false),
+    );
   };
 
   const handleManageAccountClick = () => {
@@ -71,7 +73,7 @@ export function ActiveAccountsManager({
   };
 
   const handleSignOutAll = () => {
-    return signOut(navigateAfterSignOutAll);
+    return signOut(navigateAfterSignOut);
   };
 
   const shouldRenderAccountSwitcher = sessions.length || !authConfig.singleSessionMode;
diff --git a/packages/clerk-js/src/ui/common/authPropHelpers.ts b/packages/clerk-js/src/ui/common/authPropHelpers.ts
index ee41c313065..6850c0115e4 100644
--- a/packages/clerk-js/src/ui/common/authPropHelpers.ts
+++ b/packages/clerk-js/src/ui/common/authPropHelpers.ts
@@ -20,21 +20,12 @@ type ParseAuthPropArgs =
 
 export const parseAuthProp = ({ ctx, queryParams, displayConfig, field }: ParseAuthPropArgs): string => {
   const snakeCaseField = camelToSnake(field);
-
-  // Todo: Dx: Deprecate afterSignIn and afterSignUp legacy fields
-  const legacyField = field.replace('Url', '');
-  let legacyFieldValue: string | undefined = undefined;
-  if (legacyField in ctx) {
-    // @ts-ignore
-    legacyFieldValue = ctx[legacyField];
-  }
   const queryParamValue = queryParams[snakeCaseField];
 
   return (
     (typeof queryParamValue === 'string' ? queryParamValue : null) ||
     (typeof queryParams.redirect_url === 'string' ? queryParams.redirect_url : null) ||
     ctx[field] ||
-    legacyFieldValue ||
     ctx.redirectUrl ||
     displayConfig[field]
   );
diff --git a/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx b/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
index ddfb50996ec..0813c980d23 100644
--- a/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
+++ b/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
@@ -169,24 +169,24 @@ export const useUserButtonContext = () => {
   const signInUrl = ctx.signInUrl || displayConfig.signInUrl;
   const userProfileUrl = ctx.userProfileUrl || displayConfig.userProfileUrl;
 
-  const afterSignOutOneUrl = ctx.afterSignOutOneUrl || displayConfig.afterSignOutOneUrl;
-  const navigateAfterSignOutOne = () => navigate(afterSignOutOneUrl);
+  const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
+  const navigateAfterMultiSessionSingleSignOut = () => navigate(afterMultiSessionSingleSignOutUrl);
 
-  const afterSignOutAllUrl = ctx.afterSignOutAllUrl || displayConfig.afterSignOutAllUrl;
-  const navigateAfterSignOutAll = () => navigate(afterSignOutAllUrl);
+  const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
+  const navigateAfterSignOut = () => navigate(afterSignOutUrl);
 
   const afterSwitchSessionUrl = (ctx.afterSwitchSessionUrl = displayConfig.afterSwitchSessionUrl);
   const navigateAfterSwitchSession = () => navigate(afterSwitchSessionUrl);
 
   return {
     ...ctx,
-    navigateAfterSignOutOne,
-    navigateAfterSignOutAll,
+    navigateAfterMultiSessionSingleSignOut,
+    navigateAfterSignOut,
     navigateAfterSwitchSession,
     signInUrl,
     userProfileUrl,
-    afterSignOutOneUrl,
-    afterSignOutAllUrl,
+    afterMultiSessionSingleSignOutUrl,
+    afterSignOutUrl,
     afterSwitchSessionUrl,
   };
 };
diff --git a/packages/clerk-js/src/ui/signIn/SignInAccountSwitcher.tsx b/packages/clerk-js/src/ui/signIn/SignInAccountSwitcher.tsx
index a2bb59522d0..a4271ab18ae 100644
--- a/packages/clerk-js/src/ui/signIn/SignInAccountSwitcher.tsx
+++ b/packages/clerk-js/src/ui/signIn/SignInAccountSwitcher.tsx
@@ -19,7 +19,7 @@ function _SignInAccountSwitcher(): JSX.Element | null {
         <ActiveAccountsManager
           sessions={sessions}
           showActiveAccountButtons={false}
-          navigateAfterSignOutAll={() => {
+          navigateAfterSignOut={() => {
             navigate(displayConfig.afterSignOutAllUrl);
           }}
           navigateAfterSwitchSession={navigateAfterSignIn}
diff --git a/packages/clerk-js/src/ui/userButton/UserButton.test.tsx b/packages/clerk-js/src/ui/userButton/UserButton.test.tsx
index 7728dc07a3f..0b20f907761 100644
--- a/packages/clerk-js/src/ui/userButton/UserButton.test.tsx
+++ b/packages/clerk-js/src/ui/userButton/UserButton.test.tsx
@@ -52,8 +52,8 @@ jest.mock('ui/contexts', () => {
     useUserButtonContext: () => {
       return {
         useUserButtonContext: jest.fn(() => ({
-          navigateAfterSignOutOne: jest.fn(),
-          navigateAfterSignOutAll: jest.fn(),
+          navigateAfterMultiSessionSingleSignOut: jest.fn(),
+          navigateAfterSignOut: jest.fn(),
           navigateAfterSwitchSession: jest.fn(),
           userProfileURL: 'http://test.host/profile',
           signInUrl: 'http://test.host/signin',
diff --git a/packages/clerk-js/src/ui/userButton/UserButtonPopup.test.tsx b/packages/clerk-js/src/ui/userButton/UserButtonPopup.test.tsx
index 68326d26376..b545bac7927 100644
--- a/packages/clerk-js/src/ui/userButton/UserButtonPopup.test.tsx
+++ b/packages/clerk-js/src/ui/userButton/UserButtonPopup.test.tsx
@@ -69,8 +69,8 @@ jest.mock('ui/contexts', () => {
       },
     })),
     useUserButtonContext: jest.fn(() => ({
-      navigateAfterSignOutOne: jest.fn(),
-      navigateAfterSignOutAll: jest.fn(),
+      navigateAfterMultiSessionSingleSignOut: jest.fn(),
+      navigateAfterSignOut: jest.fn(),
       navigateAfterSwitchSession: jest.fn(),
       userProfileURL: 'http://test.host/profile',
       signInUrl: 'http://test.host/signin',
diff --git a/packages/edge/CHANGELOG.md b/packages/edge/CHANGELOG.md
index 95455ab6457..dbb33b33700 100644
--- a/packages/edge/CHANGELOG.md
+++ b/packages/edge/CHANGELOG.md
@@ -3,6 +3,16 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [1.2.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/edge@1.1.0-alpha.1...@clerk/edge@1.2.0-alpha.1) (2022-03-23)
+
+### Features
+
+- **backend-core,clerk-sdk-node,nextjs,remix:** Add injected jwtKey option ([53e56e7](https://github.com/clerkinc/javascript/commit/53e56e76d59984d4d3f5b7e1e2d276adb8b2dc77))
+
+## [1.2.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/edge@1.1.0-alpha.1...@clerk/edge@1.2.0-alpha.0) (2022-03-22)
+
+**Note:** Version bump only for package @clerk/edge
+
 ## [1.1.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/edge@1.1.0-alpha.0...@clerk/edge@1.1.0-alpha.1) (2022-03-22)
 
 **Note:** Version bump only for package @clerk/edge
diff --git a/packages/edge/package.json b/packages/edge/package.json
index d75c7a1e1af..ae7486cf4e0 100644
--- a/packages/edge/package.json
+++ b/packages/edge/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/edge",
-  "version": "1.1.0-alpha.1",
+  "version": "1.2.0-alpha.1",
   "license": "MIT",
   "description": "Clerk SDK for serverless and edge environments",
   "keywords": [
@@ -36,7 +36,7 @@
     "build": "node ./scripts/info.cjs && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && ./moduleTypeFix"
   },
   "dependencies": {
-    "@clerk/backend-core": "^0.7.0-alpha.1",
+    "@clerk/backend-core": "^0.8.0-alpha.1",
     "@peculiar/webcrypto": "^1.2.3",
     "next": "^12.0.7"
   },
diff --git a/packages/edge/scripts/info.cjs b/packages/edge/scripts/info.cjs
index 3baf5ea4f50..b09d04d8cb2 100644
--- a/packages/edge/scripts/info.cjs
+++ b/packages/edge/scripts/info.cjs
@@ -4,10 +4,9 @@ const path = require('path');
 
 fs.writeFileSync(
   path.resolve(__dirname, '../src/info.ts'),
-  `
-/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION="${packageJson.version}";
-export const LIB_NAME="${packageJson.name}";
+  `/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
+export const LIB_VERSION = '${packageJson.version}';
+export const LIB_NAME = '${packageJson.name}';
 `,
   { encoding: 'utf-8' },
 );
diff --git a/packages/edge/src/info.ts b/packages/edge/src/info.ts
index e71bf3761ee..8dd96d8db22 100644
--- a/packages/edge/src/info.ts
+++ b/packages/edge/src/info.ts
@@ -1,3 +1,3 @@
 /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION = '1.1.0-alpha.1';
+export const LIB_VERSION = '1.2.0-alpha.1';
 export const LIB_NAME = '@clerk/edge';
diff --git a/packages/edge/src/vercel-edge/index.ts b/packages/edge/src/vercel-edge/index.ts
index e1796a9fc86..48326a12299 100644
--- a/packages/edge/src/vercel-edge/index.ts
+++ b/packages/edge/src/vercel-edge/index.ts
@@ -68,12 +68,12 @@ export function withEdgeMiddlewareAuth<
 export function withEdgeMiddlewareAuth(
   handler: any,
   options: any = {
-    authorizedParties: [],
     loadSession: false,
     loadUser: false,
   },
 ): any {
   return async function clerkAuth(req: NextRequest, event: NextFetchEvent) {
+    const { loadUser, loadSession, jwtKey, authorizedParties } = options;
     const cookieToken = req.cookies['__session'];
     const headerToken = req.headers.get('authorization');
     const { status, interstitial, sessionClaims } = await vercelEdgeBase.getAuthState({
@@ -86,7 +86,8 @@ export function withEdgeMiddlewareAuth(
       forwardedPort: req.headers.get('x-forwarded-port'),
       forwardedHost: req.headers.get('x-forwarded-host'),
       referrer: req.headers.get('referrer'),
-      authorizedParties: options.authorizedParties,
+      authorizedParties,
+      jwtKey,
       fetchInterstitial,
     });
 
@@ -106,8 +107,8 @@ export function withEdgeMiddlewareAuth(
     const userId = sessionClaims!.sub;
 
     const [user, session] = await Promise.all([
-      options.loadUser ? ClerkAPI.users.getUser(userId) : Promise.resolve(undefined),
-      options.loadSession ? ClerkAPI.sessions.getSession(sessionId) : Promise.resolve(undefined),
+      loadUser ? ClerkAPI.users.getUser(userId) : Promise.resolve(undefined),
+      loadSession ? ClerkAPI.sessions.getSession(sessionId) : Promise.resolve(undefined),
     ]);
 
     const getToken = createGetToken({
diff --git a/packages/edge/src/vercel-edge/types.ts b/packages/edge/src/vercel-edge/types.ts
index 793b936a631..4446dd5c66e 100644
--- a/packages/edge/src/vercel-edge/types.ts
+++ b/packages/edge/src/vercel-edge/types.ts
@@ -6,6 +6,7 @@ export type WithEdgeMiddlewareAuthOptions = {
   loadUser?: boolean;
   loadSession?: boolean;
   authorizedParties?: string[];
+  jwtKey?: string;
 };
 
 export type WithEdgeMiddlewareAuthCallback<Return, Options> = (
diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md
index 4373c21c73d..242a50819a9 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -3,6 +3,16 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [0.9.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-expo@0.8.18-alpha.3...@clerk/clerk-expo@0.9.0-alpha.1) (2022-03-23)
+
+### Bug Fixes
+
+- **clerk-expo:** Make Clerk loading smarter ([#136](https://github.com/clerkinc/javascript/issues/136)) ([2405d81](https://github.com/clerkinc/javascript/commit/2405d813b41c1f3c345c894c18e65710891bd710))
+
+## [0.9.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/clerk-expo@0.8.18-alpha.3...@clerk/clerk-expo@0.9.0-alpha.0) (2022-03-22)
+
+**Note:** Version bump only for package @clerk/clerk-expo
+
 ### [0.8.18-alpha.3](https://github.com/clerkinc/javascript/compare/@clerk/clerk-expo@0.8.18-alpha.2...@clerk/clerk-expo@0.8.18-alpha.3) (2022-03-22)
 
 **Note:** Version bump only for package @clerk/clerk-expo
diff --git a/packages/expo/package.json b/packages/expo/package.json
index d39e9d871ee..04ee526cbaf 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/clerk-expo",
-  "version": "0.8.18-alpha.3",
+  "version": "0.9.0-alpha.1",
   "license": "MIT",
   "description": "Clerk.dev React Native/Expo library",
   "keywords": [
@@ -26,12 +26,12 @@
     "dev": "tsc -p tsconfig.build.json --watch"
   },
   "dependencies": {
-    "@clerk/clerk-js": "^3.0.1-alpha.3",
-    "@clerk/clerk-react": "^3.0.1-alpha.3",
+    "@clerk/clerk-js": "^3.1.0-alpha.0",
+    "@clerk/clerk-react": "^3.1.0-alpha.1",
     "base-64": "^1.0.0"
   },
   "devDependencies": {
-    "@clerk/types": "^2.0.1-alpha.3",
+    "@clerk/types": "^2.1.0-alpha.0",
     "@types/jest": "^27.4.0",
     "@types/node": "^16.11.9",
     "@types/react": "^17.0.39",
diff --git a/packages/expo/src/ClerkProvider.tsx b/packages/expo/src/ClerkProvider.tsx
index c912bc152f5..002043529e3 100644
--- a/packages/expo/src/ClerkProvider.tsx
+++ b/packages/expo/src/ClerkProvider.tsx
@@ -9,16 +9,17 @@ import { buildClerk } from './singleton';
 export type ClerkProviderProps = ClerkReactProviderProps & {
   children: React.ReactNode;
   tokenCache?: TokenCache;
+  hotload?: boolean;
 };
 
 export function ClerkProvider(props: ClerkProviderProps): JSX.Element {
-  const { children, tokenCache, ...rest } = props;
+  const { children, tokenCache, hotload, ...rest } = props;
   const frontendApi = props.frontendApi || process.env.CLERK_FRONTEND_API || '';
 
   const clerkRef = React.useRef<ReturnType<typeof buildClerk> | null>(null);
 
   function getClerk() {
-    if (clerkRef.current === null) {
+    if (clerkRef.current === null && !hotload) {
       clerkRef.current = buildClerk({
         frontendApi,
         tokenCache,
diff --git a/packages/expo/src/singleton.ts b/packages/expo/src/singleton.ts
index cf57d99c239..fef817d875c 100644
--- a/packages/expo/src/singleton.ts
+++ b/packages/expo/src/singleton.ts
@@ -22,8 +22,7 @@ export function buildClerk({ frontendApi, tokenCache }: BuildClerkOptions): Cler
     clerk = new Clerk(frontendApi);
 
     if (!tokenCache) {
-      // Exit early if tokenCache is not provided, assuming web platform
-      return;
+      return clerk;
     }
 
     // @ts-expect-error
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index 7d622cfad63..3c60c7f56d6 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -3,6 +3,16 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [3.2.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/nextjs@3.1.0-alpha.1...@clerk/nextjs@3.2.0-alpha.1) (2022-03-23)
+
+### Features
+
+- **backend-core,clerk-sdk-node,nextjs,remix:** Add injected jwtKey option ([53e56e7](https://github.com/clerkinc/javascript/commit/53e56e76d59984d4d3f5b7e1e2d276adb8b2dc77))
+
+## [3.2.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/nextjs@3.1.0-alpha.1...@clerk/nextjs@3.2.0-alpha.0) (2022-03-22)
+
+**Note:** Version bump only for package @clerk/nextjs
+
 ## [3.1.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/nextjs@3.1.0-alpha.0...@clerk/nextjs@3.1.0-alpha.1) (2022-03-22)
 
 **Note:** Version bump only for package @clerk/nextjs
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index b16c93ecbe2..6310b83866e 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/nextjs",
-  "version": "3.1.0-alpha.1",
+  "version": "3.2.0-alpha.1",
   "license": "MIT",
   "description": "Clerk.dev SDK for NextJS",
   "keywords": [
@@ -32,10 +32,10 @@
     "dev": "tsc -p tsconfig.build.json --watch"
   },
   "dependencies": {
-    "@clerk/clerk-react": "^3.0.1-alpha.3",
-    "@clerk/clerk-sdk-node": "^3.1.0-alpha.1",
-    "@clerk/edge": "^1.1.0-alpha.1",
-    "@clerk/types": "^2.0.1-alpha.3",
+    "@clerk/clerk-react": "^3.1.0-alpha.1",
+    "@clerk/clerk-sdk-node": "^3.2.0-alpha.1",
+    "@clerk/edge": "^1.2.0-alpha.1",
+    "@clerk/types": "^2.1.0-alpha.0",
     "tslib": "^2.3.1"
   },
   "devDependencies": {
diff --git a/packages/nextjs/src/middleware/types.ts b/packages/nextjs/src/middleware/types.ts
index 240bed6cf84..75f98ed2578 100644
--- a/packages/nextjs/src/middleware/types.ts
+++ b/packages/nextjs/src/middleware/types.ts
@@ -8,6 +8,8 @@ export type Awaited<T> = T extends PromiseLike<infer U> ? U : T;
 export type WithServerSideAuthOptions = {
   loadUser?: boolean;
   loadSession?: boolean;
+  jwtKey?: string;
+  authorizedParties?: string[];
 };
 
 export type WithServerSideAuthCallback<Return, Options> = (context: ContextWithAuth<Options>) => Return;
diff --git a/packages/nextjs/src/middleware/utils/getAuthData.ts b/packages/nextjs/src/middleware/utils/getAuthData.ts
index b4aefbabc9c..ba5e47d0414 100644
--- a/packages/nextjs/src/middleware/utils/getAuthData.ts
+++ b/packages/nextjs/src/middleware/utils/getAuthData.ts
@@ -12,7 +12,7 @@ export async function getAuthData(
   opts: WithServerSideAuthOptions = {},
 ): Promise<AuthData | null> {
   const { headers, cookies } = ctx.req;
-  const { loadSession, loadUser } = opts;
+  const { loadSession, loadUser, jwtKey, authorizedParties } = opts;
 
   try {
     const cookieToken = cookies['__session'];
@@ -28,6 +28,8 @@ export async function getAuthData(
       referrer: headers.referer,
       userAgent: headers['user-agent'] as string,
       fetchInterstitial: () => Clerk.fetchInterstitial(),
+      jwtKey,
+      authorizedParties,
     });
 
     if (status === AuthStatus.Interstitial) {
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index 2891a0c06d7..b4ae01ac7c3 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -3,6 +3,16 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [3.1.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-react@3.0.1-alpha.3...@clerk/clerk-react@3.1.0-alpha.1) (2022-03-23)
+
+### Features
+
+- **clerk-js,types:** Rename UserButton params to afterSignOutUrl, afterMultiSessionSingleSignOutUrl ([c4cb76a](https://github.com/clerkinc/javascript/commit/c4cb76a1133fd2308b217cacaffb086b175f6347))
+
+## [3.1.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/clerk-react@3.0.1-alpha.3...@clerk/clerk-react@3.1.0-alpha.0) (2022-03-22)
+
+**Note:** Version bump only for package @clerk/clerk-react
+
 ### [3.0.1-alpha.3](https://github.com/clerkinc/javascript/compare/@clerk/clerk-react@3.0.1-alpha.2...@clerk/clerk-react@3.0.1-alpha.3) (2022-03-22)
 
 **Note:** Version bump only for package @clerk/clerk-react
diff --git a/packages/react/README.md b/packages/react/README.md
index 45131187be6..49f8209bd58 100644
--- a/packages/react/README.md
+++ b/packages/react/README.md
@@ -79,7 +79,7 @@ function App() {
     <>
       <h1>Hello Clerk!</h1>
       <SignedIn>
-        <UserButton afterSignOutAllUrl={window.location.href} />
+        <UserButton afterSignOutUrl={window.location.href} />
       </SignedIn>
       <SignedOut>
         <SignInButton mode='modal' />
diff --git a/packages/react/package.json b/packages/react/package.json
index 867c72e6cba..3b7eed1d9a5 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/clerk-react",
-  "version": "3.0.1-alpha.3",
+  "version": "3.1.0-alpha.1",
   "license": "MIT",
   "description": "Clerk.dev React library",
   "keywords": [
@@ -28,7 +28,7 @@
     "test": "jest"
   },
   "dependencies": {
-    "@clerk/types": "^2.0.1-alpha.3",
+    "@clerk/types": "^2.1.0-alpha.0",
     "tslib": "^2.3.1"
   },
   "devDependencies": {
diff --git a/packages/react/scripts/info.js b/packages/react/scripts/info.js
index f07d87a85d5..b09d04d8cb2 100644
--- a/packages/react/scripts/info.js
+++ b/packages/react/scripts/info.js
@@ -4,10 +4,9 @@ const path = require('path');
 
 fs.writeFileSync(
   path.resolve(__dirname, '../src/info.ts'),
-  `
-/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION='${packageJson.version}';
-export const LIB_NAME='${packageJson.name}';
+  `/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
+export const LIB_VERSION = '${packageJson.version}';
+export const LIB_NAME = '${packageJson.name}';
 `,
   { encoding: 'utf-8' },
 );
diff --git a/packages/react/src/info.ts b/packages/react/src/info.ts
index 390bdfab75a..96f8dff035d 100644
--- a/packages/react/src/info.ts
+++ b/packages/react/src/info.ts
@@ -1,3 +1,3 @@
 /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION = '3.0.1-alpha.3';
+export const LIB_VERSION = '3.1.0-alpha.1';
 export const LIB_NAME = '@clerk/clerk-react';
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index 7e831ad904b..ae3ca698cfe 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -3,6 +3,16 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [0.3.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/remix@0.2.0-alpha.1...@clerk/remix@0.3.0-alpha.1) (2022-03-23)
+
+### Features
+
+- **backend-core,clerk-sdk-node,nextjs,remix:** Add injected jwtKey option ([53e56e7](https://github.com/clerkinc/javascript/commit/53e56e76d59984d4d3f5b7e1e2d276adb8b2dc77))
+
+## [0.3.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/remix@0.2.0-alpha.1...@clerk/remix@0.3.0-alpha.0) (2022-03-22)
+
+**Note:** Version bump only for package @clerk/remix
+
 ## [0.2.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/remix@0.2.0-alpha.0...@clerk/remix@0.2.0-alpha.1) (2022-03-22)
 
 **Note:** Version bump only for package @clerk/remix
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 785ea66d3ef..9d873cfc0ac 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/remix",
-  "version": "0.2.0-alpha.1",
+  "version": "0.3.0-alpha.1",
   "license": "MIT",
   "description": "Clerk.dev SDK for Remix",
   "keywords": [
@@ -32,9 +32,9 @@
     "dev": "tsc -p tsconfig.build.json --watch"
   },
   "dependencies": {
-    "@clerk/clerk-react": "^3.0.1-alpha.3",
-    "@clerk/clerk-sdk-node": "^3.1.0-alpha.1",
-    "@clerk/types": "^2.0.1-alpha.3",
+    "@clerk/clerk-react": "^3.1.0-alpha.1",
+    "@clerk/clerk-sdk-node": "^3.2.0-alpha.1",
+    "@clerk/types": "^2.1.0-alpha.0",
     "cookie": "^0.4.2",
     "tslib": "^2.3.1"
   },
diff --git a/packages/remix/src/ssr/getAuthData.ts b/packages/remix/src/ssr/getAuthData.ts
index 975282f18b9..dafe4d6e738 100644
--- a/packages/remix/src/ssr/getAuthData.ts
+++ b/packages/remix/src/ssr/getAuthData.ts
@@ -20,7 +20,7 @@ export async function getAuthData(
   req: Request,
   opts: RootAuthLoaderOptions = {},
 ): Promise<{ authData: AuthData | null; showInterstitial?: boolean }> {
-  const { loadSession, loadUser } = opts;
+  const { loadSession, loadUser, jwtKey, authorizedParties } = opts;
   const { headers } = req;
   const cookies = parseCookies(req);
 
@@ -38,6 +38,8 @@ export async function getAuthData(
       referrer: headers.get('referer'),
       userAgent: headers.get('user-agent') as string,
       fetchInterstitial: () => Promise.resolve(''),
+      authorizedParties,
+      jwtKey,
     });
 
     if (status === AuthStatus.Interstitial) {
diff --git a/packages/remix/src/ssr/types.ts b/packages/remix/src/ssr/types.ts
index 7b5dbd7ec18..67f2bc2d870 100644
--- a/packages/remix/src/ssr/types.ts
+++ b/packages/remix/src/ssr/types.ts
@@ -8,6 +8,8 @@ export type RootAuthLoaderOptions = {
   frontendApi?: string;
   loadUser?: boolean;
   loadSession?: boolean;
+  jwtKey?: string;
+  authorizedParties?: [];
 };
 
 export type RootAuthLoaderCallback<Options> = (
diff --git a/packages/sdk-node/CHANGELOG.md b/packages/sdk-node/CHANGELOG.md
index 4d0477dc33d..b3b2369225a 100644
--- a/packages/sdk-node/CHANGELOG.md
+++ b/packages/sdk-node/CHANGELOG.md
@@ -3,6 +3,16 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [3.2.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-sdk-node@3.1.0-alpha.1...@clerk/clerk-sdk-node@3.2.0-alpha.1) (2022-03-23)
+
+### Features
+
+- **backend-core,clerk-sdk-node,nextjs,remix:** Add injected jwtKey option ([53e56e7](https://github.com/clerkinc/javascript/commit/53e56e76d59984d4d3f5b7e1e2d276adb8b2dc77))
+
+## [3.2.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/clerk-sdk-node@3.1.0-alpha.1...@clerk/clerk-sdk-node@3.2.0-alpha.0) (2022-03-22)
+
+**Note:** Version bump only for package @clerk/clerk-sdk-node
+
 ## [3.1.0-alpha.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-sdk-node@3.1.0-alpha.0...@clerk/clerk-sdk-node@3.1.0-alpha.1) (2022-03-22)
 
 **Note:** Version bump only for package @clerk/clerk-sdk-node
diff --git a/packages/sdk-node/README.md b/packages/sdk-node/README.md
index 64acfd47130..2cde579673a 100644
--- a/packages/sdk-node/README.md
+++ b/packages/sdk-node/README.md
@@ -713,6 +713,32 @@ export clerk.withAuth(handler);
 export clerk.requireAuth(handler);
 ```
 
+## Networkless token verification using the JWT verification key
+
+Clerk's JWT session token can be verified in a networkless manner using the JWT verification key. By default Clerk will use our JWKs endpoint to fetch and cache the key for any subsequent verification. If you use the `CLERK_JWT_KEY` environment variable to supply the key, Clerk will pick it up and do networkless verification for session tokens using it.
+
+To learn more about Clerk's token verification you can find more information on our [documentation](https://docs.clerk.dev/popular-guides/validating-session-tokens).
+
+The value of the JWT verification key can also be added on the instance level or on any single middleware call e.g.
+
+```ts
+import { withAuth } from '@clerk/clerk-sdk-node';
+
+const handler = (req, res) => {
+  // ...
+};
+
+withAuth(handler, { jwtKey: 'my_clerk_public_key' });
+```
+
+Custom instance initialization:
+
+```ts
+import Clerk from '@clerk/clerk-sdk-node/instance';
+
+const clerk = new Clerk({ jwtKey: 'my_clerk_public_key' });
+```
+
 ## Validate the Authorized Party of a session token
 
 Clerk's JWT session token, contains the azp claim, which equals the Origin of the request during token generation. You can provide the middlewares with a list of whitelisted origins to verify against, to protect your application of the subdomain cookie leaking attack. You can find an example below:
diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json
index 0b9b3d56236..e60017b64f5 100644
--- a/packages/sdk-node/package.json
+++ b/packages/sdk-node/package.json
@@ -1,5 +1,5 @@
 {
-  "version": "3.1.0-alpha.1",
+  "version": "3.2.0-alpha.1",
   "license": "MIT",
   "main": "dist/index.js",
   "module": "esm/index.js",
@@ -47,7 +47,7 @@
     "typescript": "^4.6.2"
   },
   "dependencies": {
-    "@clerk/backend-core": "^0.7.0-alpha.1",
+    "@clerk/backend-core": "^0.8.0-alpha.1",
     "@peculiar/webcrypto": "^1.2.3",
     "camelcase-keys": "^6.2.2",
     "cookies": "^0.8.0",
diff --git a/packages/sdk-node/scripts/info.js b/packages/sdk-node/scripts/info.js
index f7551ec5ac2..5305fa0aa0c 100644
--- a/packages/sdk-node/scripts/info.js
+++ b/packages/sdk-node/scripts/info.js
@@ -4,10 +4,9 @@ const path = require('path');
 
 fs.writeFileSync(
   path.resolve(__dirname, '../src/info.ts'),
-  `
-/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION="${packageJson.version}";
-export const LIB_NAME="${packageJson.name}";
+  `/** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
+export const LIB_VERSION = '${packageJson.version}';
+export const LIB_NAME = '${packageJson.name}';
 `,
   { encoding: 'utf-8' }
 );
diff --git a/packages/sdk-node/src/Clerk.ts b/packages/sdk-node/src/Clerk.ts
index 798a1092b36..88ee211075d 100644
--- a/packages/sdk-node/src/Clerk.ts
+++ b/packages/sdk-node/src/Clerk.ts
@@ -25,6 +25,7 @@ import { Crypto, CryptoKey } from '@peculiar/webcrypto';
 import { decodeBase64, toSPKIDer } from './utils/crypto';
 
 const defaultApiKey = process.env.CLERK_API_KEY || '';
+const defaultJWTKey = process.env.CLERK_JWT_KEY;
 const defaultApiVersion = process.env.CLERK_API_VERSION || 'v1';
 const defaultServerApiUrl =
   process.env.CLERK_API_URL || 'https://api.clerk.dev';
@@ -34,6 +35,7 @@ const packageRepo = 'https://github.com/clerkinc/clerk-sdk-node';
 export type MiddlewareOptions = {
   onError?: Function;
   authorizedParties?: string[];
+  jwtKey?: string;
 };
 
 export type WithAuthProp<T> = T & {
@@ -67,6 +69,7 @@ const verifySignature = async (
 
 export default class Clerk extends ClerkBackendAPI {
   base: Base;
+  jwtKey?: string;
   httpOptions: OptionsOfUnknownResponseBody;
 
   _jwksClient: JwksClient;
@@ -76,12 +79,14 @@ export default class Clerk extends ClerkBackendAPI {
 
   constructor({
     apiKey = defaultApiKey,
+    jwtKey = defaultJWTKey,
     serverApiUrl = defaultServerApiUrl,
     apiVersion = defaultApiVersion,
     httpOptions = {},
     jwksCacheMaxAge = JWKS_MAX_AGE,
   }: {
     apiKey?: string;
+    jwtKey?: string;
     serverApiUrl?: string;
     apiVersion?: string;
     httpOptions?: OptionsOfUnknownResponseBody;
@@ -122,6 +127,7 @@ export default class Clerk extends ClerkBackendAPI {
     }
 
     this.httpOptions = httpOptions;
+    this.jwtKey = jwtKey;
 
     this._jwksClient = jwks({
       jwksUri: `${serverApiUrl}/${apiVersion}/jwks`,
@@ -163,7 +169,7 @@ export default class Clerk extends ClerkBackendAPI {
       importKey,
       verifySignature,
       decodeBase64,
-      process.env.CLERK_JWT_KEY ? undefined : loadCryptoKey
+      loadCryptoKey
     );
   }
 
@@ -230,7 +236,7 @@ export default class Clerk extends ClerkBackendAPI {
   }
 
   expressWithAuth(
-    { onError, authorizedParties }: MiddlewareOptions = {
+    { onError, authorizedParties, jwtKey }: MiddlewareOptions = {
       onError: this.defaultOnError,
     }
   ): (req: Request, res: Response, next: NextFunction) => Promise<void> {
@@ -261,6 +267,7 @@ export default class Clerk extends ClerkBackendAPI {
             referrer: req.headers.referer,
             userAgent: req.headers['user-agent'] as string,
             authorizedParties,
+            jwtKey: jwtKey || this.jwtKey,
             fetchInterstitial: () => this.fetchInterstitial(),
           });
 
@@ -315,11 +322,11 @@ export default class Clerk extends ClerkBackendAPI {
   }
 
   expressRequireAuth(
-    { onError, authorizedParties }: MiddlewareOptions = {
+    options: MiddlewareOptions = {
       onError: this.strictOnError,
     }
   ) {
-    return this.expressWithAuth({ onError, authorizedParties });
+    return this.expressWithAuth(options);
   }
 
   // Credits to https://nextjs.org/docs/api-routes/api-middlewares
@@ -342,7 +349,7 @@ export default class Clerk extends ClerkBackendAPI {
   // Set the session on the request and then call provided handler
   withAuth(
     handler: Function,
-    { onError, authorizedParties }: MiddlewareOptions = {
+    options: MiddlewareOptions = {
       onError: this.defaultOnError,
     }
   ) {
@@ -352,11 +359,7 @@ export default class Clerk extends ClerkBackendAPI {
       next?: NextFunction
     ) => {
       try {
-        await this._runMiddleware(
-          req,
-          res,
-          this.expressWithAuth({ onError, authorizedParties })
-        );
+        await this._runMiddleware(req, res, this.expressWithAuth(options));
         return handler(req, res, next);
       } catch (error) {
         // @ts-ignore
@@ -376,10 +379,10 @@ export default class Clerk extends ClerkBackendAPI {
   // Stricter version, short-circuits if session can't be determined
   requireAuth(
     handler: Function,
-    { onError, authorizedParties }: MiddlewareOptions = {
+    options: MiddlewareOptions = {
       onError: this.strictOnError,
     }
   ) {
-    return this.withAuth(handler, { onError, authorizedParties });
+    return this.withAuth(handler, options);
   }
 }
diff --git a/packages/sdk-node/src/__tests__/instance.test.ts b/packages/sdk-node/src/__tests__/instance.test.ts
index af64a7f1883..422a905dad7 100644
--- a/packages/sdk-node/src/__tests__/instance.test.ts
+++ b/packages/sdk-node/src/__tests__/instance.test.ts
@@ -1,4 +1,5 @@
 const TEST_API_KEY = 'TEST_API_KEY';
+const TEST_JWT_KEY = 'TEST_JWT_KEY';
 
 describe('Custom Clerk instance initialization', () => {
   test('throw error when initialized without apiKey', () => {
@@ -26,17 +27,21 @@ describe('Custom Clerk instance initialization', () => {
   test('custom keys overrides process env and default params', () => {
     jest.resetModules();
     process.env.CLERK_API_KEY = TEST_API_KEY;
+    process.env.CLERK_JWT_KEY = TEST_JWT_KEY;
     const Clerk = require('../instance').default;
     expect(() => {
-      const customKey = 'custom_key';
+      const customAPIKey = 'custom_api_key';
+      const customJWTKey = 'custom_jwt_key';
       const customAPIVersion = 'v0';
       const customAPIUrl = 'https://customdomain.com';
       const instance = new Clerk({
-        apiKey: customKey,
+        apiKey: customAPIKey,
+        jwtKey: customJWTKey,
         serverApiUrl: customAPIUrl,
         apiVersion: customAPIVersion,
       });
-      expect(instance._restClient.apiKey).toBe(customKey);
+      expect(instance._restClient.apiKey).toBe(customAPIKey);
+      expect(instance.jwtKey).toBe(customJWTKey);
       expect(instance._restClient.serverApiUrl).toBe(customAPIUrl);
       expect(instance._restClient.apiVersion).toBe(customAPIVersion);
     }).not.toThrow(Error);
diff --git a/packages/sdk-node/src/info.ts b/packages/sdk-node/src/info.ts
index e5cd7297199..33de90a7158 100644
--- a/packages/sdk-node/src/info.ts
+++ b/packages/sdk-node/src/info.ts
@@ -1,3 +1,3 @@
 /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION = '3.1.0-alpha.1';
+export const LIB_VERSION = '3.2.0-alpha.1';
 export const LIB_NAME = '@clerk/clerk-sdk-node';
diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md
index 3a8209e7e8e..153af515563 100644
--- a/packages/shared/CHANGELOG.md
+++ b/packages/shared/CHANGELOG.md
@@ -3,6 +3,10 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+### [0.0.16-alpha.4](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.16-alpha.3...@clerk/shared@0.0.16-alpha.4) (2022-03-23)
+
+**Note:** Version bump only for package @clerk/shared
+
 ### [0.0.16-alpha.3](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.16-alpha.2...@clerk/shared@0.0.16-alpha.3) (2022-03-22)
 
 **Note:** Version bump only for package @clerk/shared
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 1d473359fb7..7559796c83a 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/shared",
-  "version": "0.0.16-alpha.3",
+  "version": "0.0.16-alpha.4",
   "private": true,
   "main": "index.js",
   "module": "index.js",
@@ -26,7 +26,7 @@
     "@babel/core": "^7.13.14",
     "@babel/preset-env": "^7.13.12",
     "@babel/preset-react": "^7.13.13",
-    "@clerk/types": "^2.0.1-alpha.3",
+    "@clerk/types": "^2.1.0-alpha.0",
     "@popperjs/core": "^2.5.4",
     "@sentry/browser": "^6.3.0",
     "@svgr/webpack": "^6.2.1",
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index 236c5120b50..811a53e4da3 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -3,6 +3,12 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [2.1.0-alpha.0](https://github.com/clerkinc/javascript/compare/@clerk/types@2.0.1-alpha.3...@clerk/types@2.1.0-alpha.0) (2022-03-23)
+
+### Features
+
+- **clerk-js,types:** Rename UserButton params to afterSignOutUrl, afterMultiSessionSingleSignOutUrl ([c4cb76a](https://github.com/clerkinc/javascript/commit/c4cb76a1133fd2308b217cacaffb086b175f6347))
+
 ### [2.0.1-alpha.3](https://github.com/clerkinc/javascript/compare/@clerk/types@2.0.1-alpha.2...@clerk/types@2.0.1-alpha.3) (2022-03-22)
 
 ### Bug Fixes
diff --git a/packages/types/package.json b/packages/types/package.json
index 445c36e90fd..44f7e29f7c9 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/types",
-  "version": "2.0.1-alpha.3",
+  "version": "2.1.0-alpha.0",
   "license": "MIT",
   "description": "Typings for Clerk libraries.",
   "keywords": [
diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts
index 956d3099ede..042e05f7d07 100644
--- a/packages/types/src/clerk.ts
+++ b/packages/types/src/clerk.ts
@@ -374,15 +374,15 @@ export type UserButtonProps = {
   showName?: boolean;
 
   /**
-   * Full URL or path to navigate after sign-out is complete
-   * and there are not other active sessions on this client.
+   * Full URL or path to navigate after sign out is complete
    */
-  afterSignOutAllUrl?: string;
+  afterSignOutUrl?: string;
 
   /**
-   * Full URL or path to navigate after sign-out is complete.
+   * Full URL or path to navigate after signing out the current user is complete.
+   * This option applies to multi-session applications.
    */
-  afterSignOutOneUrl?: string;
+  afterMultiSessionSingleSignOutUrl?: string;
 
   /*
    * Full URL or path leading to the