diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee4aa3be28 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -129,6 +129,9 @@ const TAB_EVENTS = [
   "TabSplitViewActivate",
   "SplitViewRemoved",
   "SplitViewCreated",
+  "TabAddedToEssentials",
+  "TabRemovedFromEssentials",
+  "ZenWorkspaceDataChanged",
 ];
 
 const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
@@ -201,6 +204,8 @@ ChromeUtils.defineESModuleGetters(lazy, {
   TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs",
   TabStateFlusher: "resource:///modules/sessionstore/TabStateFlusher.sys.mjs",
   setTimeout: "resource://gre/modules/Timer.sys.mjs",
+  ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
+  ZenWindowSync: "resource:///modules/zen/ZenWindowSync.sys.mjs",
 });
 
 ChromeUtils.defineLazyGetter(lazy, "blankURI", () => {
@@ -1300,10 +1305,7 @@ var SessionStoreInternal = {
    */
   get willAutoRestore() {
     return (
-      !PrivateBrowsingUtils.permanentPrivateBrowsing &&
-      (Services.prefs.getBoolPref("browser.sessionstore.resume_session_once") ||
-        Services.prefs.getIntPref("browser.startup.page") ==
-          BROWSER_STARTUP_RESUME_SESSION)
+      true
     );
   },
 
@@ -1990,6 +1992,9 @@ var SessionStoreInternal = {
       case "TabPinned":
       case "TabUnpinned":
       case "SwapDocShells":
+      case "TabRemovedFromEssentials":
+      case "TabAddedToEssentials":
+      case "ZenWorkspaceDataChanged":
         this.saveStateDelayed(win);
         break;
       case "TabGroupCreate":
@@ -2099,6 +2104,10 @@ var SessionStoreInternal = {
       this._windows[aWindow.__SSi].isTaskbarTab = true;
     }
 
+    if (aWindow.document.documentElement.hasAttribute("zen-unsynced-window")) {
+      this._windows[aWindow.__SSi].isZenUnsynced = true;
+    }
+
     if (lazy.AIWindow.isAIWindowActiveAndEnabled(aWindow)) {
       this._windows[aWindow.__SSi].isAIWindow = true;
     }
@@ -2135,7 +2144,7 @@ var SessionStoreInternal = {
     let isTaskbarTab = this._windows[aWindow.__SSi].isTaskbarTab;
     // A regular window is not a private window, taskbar tab window, or popup window
     let isRegularWindow =
-      !isPrivateWindow && !isTaskbarTab && aWindow.toolbar.visible;
+      !isPrivateWindow && !isTaskbarTab && aWindow.toolbar.visible && !this._windows[aWindow.__SSi].isZenUnsynced;
 
     // perform additional initialization when the first window is loading
     if (lazy.RunState.isStopped) {
@@ -2147,7 +2156,7 @@ var SessionStoreInternal = {
         // to disk to NOW() to enforce a full interval before the next write.
         lazy.SessionSaver.updateLastSaveTime();
 
-        if (isPrivateWindow || isTaskbarTab) {
+        if (isPrivateWindow || isTaskbarTab || aWindow.document.documentElement.hasAttribute("zen-unsynced-window")) {
           this._log.debug(
             "initializeWindow, the window is private or a web app. Saving SessionStartup.state for possibly restoring later"
           );
@@ -2191,6 +2200,7 @@ var SessionStoreInternal = {
           null,
           "sessionstore-one-or-no-tab-restored"
         );
+        lazy.ZenSessionStore.onNewEmptySession(aWindow);
         this._deferredAllWindowsRestored.resolve();
       }
       // this window was opened by _openWindowWithState
@@ -2240,7 +2250,6 @@ var SessionStoreInternal = {
       if (closedWindowState) {
         let newWindowState;
         if (
-          AppConstants.platform == "macosx" ||
           !lazy.SessionStartup.willRestore()
         ) {
           // We want to split the window up into pinned tabs and unpinned tabs.
@@ -2276,6 +2285,7 @@ var SessionStoreInternal = {
         }
 
         if (newWindowState) {
+          lazy.ZenSessionStore.onRestoringClosedWindow(newWindowState);
           // Ensure that the window state isn't hidden
           this._restoreCount = 1;
           let state = { windows: [newWindowState] };
@@ -2312,6 +2322,9 @@ var SessionStoreInternal = {
       });
       this._shouldRestoreLastSession = false;
     }
+    else if (!aInitialState && isRegularWindow) {
+      lazy.ZenSessionStore.restoreNewWindow(aWindow, this);
+    }
 
     if (this._restoreLastWindow && aWindow.toolbar.visible) {
       // always reset (if not a popup window)
@@ -2462,7 +2475,7 @@ var SessionStoreInternal = {
 
     var tabbrowser = aWindow.gBrowser;
 
-    let browsers = Array.from(tabbrowser.browsers);
+    let browsers = aWindow.gZenWorkspaces.allUsedBrowsers;
 
     TAB_EVENTS.forEach(function (aEvent) {
       tabbrowser.tabContainer.removeEventListener(aEvent, this, true);
@@ -2513,7 +2526,7 @@ var SessionStoreInternal = {
 
       let isLastRegularWindow =
         Object.values(this._windows).filter(
-          wData => !wData.isPrivate && !wData.isTaskbarTab
+          wData => !wData.isPrivate && !wData.isTaskbarTab && !wData.isZenUnsynced
         ).length == 1;
       this._log.debug(
         `onClose, closing window isLastRegularWindow? ${isLastRegularWindow}`
@@ -2570,8 +2583,8 @@ var SessionStoreInternal = {
       // 2) Flush the window.
       // 3) When the flush is complete, revisit our decision to store the window
       //    in _closedWindows, and add/remove as necessary.
-      if (!winData.isPrivate && !winData.isTaskbarTab) {
-        this.maybeSaveClosedWindow(winData, isLastWindow);
+      if (!winData.isPrivate && !winData.isTaskbarTab && !winData.isZenUnsynced) {
+        this.maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow);
       }
 
       completionPromise = lazy.TabStateFlusher.flushWindow(aWindow).then(() => {
@@ -2591,8 +2604,9 @@ var SessionStoreInternal = {
 
         // Save non-private windows if they have at
         // least one saveable tab or are the last window.
-        if (!winData.isPrivate && !winData.isTaskbarTab) {
-          this.maybeSaveClosedWindow(winData, isLastWindow);
+        lazy.ZenWindowSync.on_WindowCloseAndBrowserFlushed(browsers);
+        if (!winData.isPrivate && !winData.isTaskbarTab && !winData.isZenUnsynced) {
+          this.maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow);
 
           if (!isLastWindow && winData.closedId > -1) {
             this._addClosedAction(
@@ -2668,7 +2682,7 @@ var SessionStoreInternal = {
    *        to call this method again asynchronously (for example, after
    *        a window flush).
    */
-  maybeSaveClosedWindow(winData, isLastWindow) {
+  maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow = false) {
     // Make sure SessionStore is still running, and make sure that we
     // haven't chosen to forget this window.
     if (
@@ -2685,6 +2699,7 @@ var SessionStoreInternal = {
       // _closedWindows from a previous call to this function.
       let winIndex = this._closedWindows.indexOf(winData);
       let alreadyStored = winIndex != -1;
+      lazy.ZenSessionStore.maybeSaveClosedWindow(winData, isLastRegularWindow);
       // If sidebar command is truthy, i.e. sidebar is open, store sidebar settings
       let shouldStore = hasSaveableTabs || isLastWindow;
 
@@ -3507,7 +3522,7 @@ var SessionStoreInternal = {
     if (!isPrivateWindow && tabState.isPrivate) {
       return;
     }
-    if (aTab == aWindow.FirefoxViewHandler.tab) {
+    if (aTab == aWindow.FirefoxViewHandler.tab || aTab.hasAttribute("zen-empty-tab")) {
       return;
     }
 
@@ -4246,6 +4261,12 @@ var SessionStoreInternal = {
         Math.min(tabState.index, tabState.entries.length)
       );
       tabState.pinned = false;
+      tabState.zenEssential = false;
+      tabState.zenSyncId = null;
+      tabState.zenIsGlance = false;
+      tabState.zenGlanceId = null;
+      tabState.zenHasStaticLabel = false;
+      tabState.zenWorkspace = aWindow.gZenWorkspaces.activeWorkspace;
 
       if (inBackground === false) {
         aWindow.gBrowser.selectedTab = newTab;
@@ -4679,6 +4700,8 @@ var SessionStoreInternal = {
       // Append the tab if we're opening into a different window,
       tabIndex: aSource == aTargetWindow ? pos : Infinity,
       pinned: state.pinned,
+      essential: state.zenEssential,
+      zenWorkspaceId: state.zenWorkspace,
       userContextId: state.userContextId,
       skipLoad: true,
       preferredRemoteType,
@@ -5176,9 +5199,10 @@ var SessionStoreInternal = {
       if (activePageData.title && activePageData.title != activePageData.url) {
         win.gBrowser.setInitialTabTitle(tab, activePageData.title, {
           isContentTitle: true,
+          _zenChangeLabelFlag: true,
         });
       } else {
-        win.gBrowser.setInitialTabTitle(tab, activePageData.url);
+        win.gBrowser.setInitialTabTitle(tab, activePageData.url, { _zenChangeLabelFlag: true });
       }
     }
 
@@ -5543,7 +5567,7 @@ var SessionStoreInternal = {
 
     for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) {
       let tab = tabbrowser.tabs[i];
-      if (homePages.includes(tab.linkedBrowser.currentURI.spec)) {
+      if (homePages.includes(tab.linkedBrowser.currentURI.spec) && !tab.hasAttribute("zen-empty-tab")) {
         removableTabs.push(tab);
       }
     }
@@ -5656,7 +5680,7 @@ var SessionStoreInternal = {
 
     // collect the data for all windows
     for (ix in this._windows) {
-      if (this._windows[ix]._restoring || this._windows[ix].isTaskbarTab) {
+      if (this._windows[ix]._restoring || this._windows[ix].isTaskbarTab && !this._windows[ix].isZenUnsynced) {
         // window data is still in _statesToRestore
         continue;
       }
@@ -5800,11 +5824,12 @@ var SessionStoreInternal = {
     }
 
     let tabbrowser = aWindow.gBrowser;
-    let tabs = tabbrowser.tabs;
+    let tabs = aWindow.gZenWorkspaces.allStoredTabs;
     /** @type {WindowStateData} */
     let winData = this._windows[aWindow.__SSi];
     let tabsData = (winData.tabs = []);
 
+    winData.splitViewData = aWindow.gZenViewSplitter?.storeDataForSessionStore();
     // update the internal state data for this window
     for (let tab of tabs) {
       if (tab == aWindow.FirefoxViewHandler.tab) {
@@ -5815,6 +5840,9 @@ var SessionStoreInternal = {
       tabsData.push(tabData);
     }
 
+    winData.folders = aWindow.gZenFolders?.storeDataForSessionStore() || [];
+    winData.activeZenSpace = aWindow.gZenWorkspaces?.activeWorkspace || null;
+    winData.spaces = aWindow.gZenWorkspaces?.getWorkspacesForSessionStore();
     // update tab group state for this window
     winData.groups = [];
     for (let tabGroup of aWindow.gBrowser.tabGroups) {
@@ -5831,7 +5859,7 @@ var SessionStoreInternal = {
     // a window is closed, point to the first item in the tab strip instead (it will never be the Firefox View tab,
     // since it's only inserted into the tab strip after it's selected).
     if (aWindow.FirefoxViewHandler.tab?.selected) {
-      selectedIndex = 1;
+      selectedIndex = 0;
       winData.title = tabbrowser.tabs[0].label;
     }
     winData.selected = selectedIndex;
@@ -6033,8 +6061,8 @@ var SessionStoreInternal = {
     // selectTab represents.
     let selectTab = 0;
     if (overwriteTabs) {
-      selectTab = parseInt(winData.selected || 1, 10);
-      selectTab = Math.max(selectTab, 1);
+      selectTab = parseInt(winData.selected || 0, 10);
+      selectTab = Math.max(selectTab, 0);
       selectTab = Math.min(selectTab, winData.tabs.length);
     }
 
@@ -6056,6 +6084,7 @@ var SessionStoreInternal = {
     if (overwriteTabs) {
       for (let i = tabbrowser.browsers.length - 1; i >= 0; i--) {
         if (!tabbrowser.tabs[i].selected) {
+          aWindow.gZenWorkspaces._shouldOverrideTabs = true;
           tabbrowser.removeTab(tabbrowser.tabs[i]);
         }
       }
@@ -6090,6 +6119,12 @@ var SessionStoreInternal = {
         savedTabGroup => !openTabGroupIdsInWindow.has(savedTabGroup.id)
       );
     }
+    if (winData.isZenUnsynced) {
+      aWindow.document.documentElement.setAttribute("zen-unsynced-window", "true");
+    }
+    aWindow.gZenFolders?.restoreDataFromSessionStore(winData.folders);
+    aWindow.gZenWorkspaces?.restoreWorkspacesFromSessionStore(winData);
+    aWindow.gZenViewSplitter?.restoreDataFromSessionStore(winData.splitViewData);
 
     // Move the originally open tabs to the end.
     if (initialTabs) {
@@ -6656,6 +6691,25 @@ var SessionStoreInternal = {
 
     // Most of tabData has been restored, now continue with restoring
     // attributes that may trigger external events.
+    if (tabData.zenEssential) {
+      tab.setAttribute("zen-essential", "true");
+      tabData.pinned = true; // Essential tabs are always pinned.
+    }
+    if (tabData.zenIsEmpty) {
+      tab.setAttribute("zen-empty-tab", "true");
+    }
+    if (typeof tabData.zenStaticLabel === "string") {
+      tab.zenStaticLabel = tabData.zenStaticLabel;
+    }
+    if (tabData.zenHasStaticIcon && tabData.image) {
+      tab.zenStaticIcon = tabData.image;
+    }
+    if (tabData.zenDefaultUserContextId) {
+      tab.setAttribute("zenDefaultUserContextId", true);
+    }
+    if (tabData.zenWorkspace) {
+      tab.setAttribute("zen-workspace-id", tabData.zenWorkspace);
+    }
 
     if (tabData.pinned) {
       tabbrowser.pinTab(tab);
@@ -6838,6 +6892,9 @@ var SessionStoreInternal = {
         aWindow.gURLBar.readOnly = false;
       }
     }
+    if (aWinData.isZenUnsynced) {
+      this._windows[aWindow.__SSi].isZenUnsynced = true;
+    }
 
     let promiseParts = Promise.withResolvers();
     aWindow.setTimeout(() => {
@@ -7633,7 +7690,7 @@ var SessionStoreInternal = {
 
       let groupsToSave = new Map();
       for (let tIndex = 0; tIndex < window.tabs.length; ) {
-        if (window.tabs[tIndex].pinned) {
+        if (window.tabs[tIndex].pinned && false) {
           // Adjust window.selected
           if (tIndex + 1 < window.selected) {
             window.selected -= 1;
@@ -7648,7 +7705,7 @@ var SessionStoreInternal = {
           );
           // We don't want to increment tIndex here.
           continue;
-        } else if (window.tabs[tIndex].groupId) {
+        } else if (window.tabs[tIndex].groupId && false) {
           // Convert any open groups into saved groups.
           let groupStateToSave = window.groups.find(
             groupState => groupState.id == window.tabs[tIndex].groupId
@@ -8193,7 +8250,6 @@ var SessionStoreInternal = {
     timer.initWithCallback(
       function () {
         if (beats <= 0) {
-          this._log.debug(`looseTimer of ${delay} timed out`);
           Glean.sessionRestore.shutdownFlushAllOutcomes.timed_out.add(1);
           deferred.resolve();
         }
@@ -8671,6 +8727,7 @@ var SessionStoreInternal = {
     if (
       !savedTabGroupState.tabs.length ||
       this.getSavedTabGroup(savedTabGroupState.id)
+      && false
     ) {
       return;
     }
