diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..1a3aa415d08379b00960de398808e771c299f2ca 100644
--- a/browser/components/tabbrowser/content/tabs.js
+++ b/browser/components/tabbrowser/content/tabs.js
@@ -83,7 +83,7 @@
       };
       this.arrowScrollbox._canScrollToElement = element => {
         if (isTab(element)) {
-          return !element.pinned || !this.hasAttribute("positionpinnedtabs");
+          return !element.hasAttribute("zen-essential") || !this.hasAttribute("positionpinnedtabs");
         }
         return true;
       };
@@ -342,7 +342,7 @@
       // and we're not hitting the scroll buttons.
       if (
         event.button != 0 ||
-        event.target != this.arrowScrollbox ||
+        event.target != document.getElementById("zen-tabs-wrapper") ||
         event.composedTarget.localName == "toolbarbutton"
       ) {
         return;
@@ -391,6 +391,7 @@
             // Reset the "ignored click" flag
             target._ignoredCloseButtonClicks = false;
           }
+          gZenUIManager.saveScrollbarState();
         }
 
         /* Protects from close-tab-button errant doubleclick:
@@ -692,7 +693,7 @@
       if (this.#isContainerVerticalPinnedGrid(tab)) {
         // In expanded vertical mode, the max number of pinned tabs per row is dynamic
         // Set this before adjusting dragged tab's position
-        let pinnedTabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
+        let pinnedTabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numZenEssentials);
         let tabsPerRow = 0;
         let position = 0;
         for (let pinnedTab of pinnedTabs) {
@@ -764,7 +765,7 @@
         } else if (isTabGroupLabel(tab) && !tab.group.collapsed) {
           this._lockTabSizing();
           this.#keepTabSizeLocked = true;
-          tab.group.collapsed = true;
+          tab.group.collapsed = !tab.group.hasAttribute("split-view-group");
           expandGroupOnDrop = true;
         }
       }
@@ -913,6 +914,10 @@
       }
 
       let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
+      if (draggedTab && effects === "move") {
+        gZenPinnedTabManager.applyDragoverClass(event, draggedTab);
+        gZenViewSplitter.onBrowserDragEndToSplit(event);
+      }
       if (
         (effects == "move" || effects == "copy") &&
         document == draggedTab.ownerDocument &&
@@ -1069,6 +1074,18 @@
 
       this._tabDropIndicator.hidden = true;
       event.stopPropagation();
+      if (draggedTab?.hasAttribute("zen-has-splitted")) {
+        draggedTab.removeAttribute("zen-has-splitted");
+        draggedTab._visuallySelected = false;
+      }
+      if (draggedTab && dropEffect == "move") {
+        let moved = gZenPinnedTabManager.moveToAnotherTabContainerIfNecessary(event, movingTabs);
+
+        if (moved) {
+          this.finishMoveTogetherSelectedTabs(draggedTab);
+          return;
+        }
+      }
       if (draggedTab && dropEffect == "copy") {
         let duplicatedDraggedTab;
         let duplicatedTabs = [];
@@ -1108,10 +1125,11 @@
           }
         } else {
           let isPinned = draggedTab.pinned;
-          let numPinned = gBrowser.pinnedTabCount;
-          let tabs = this.ariaFocusableItems.slice(
-            isPinned ? 0 : numPinned,
-            isPinned ? numPinned : undefined
+          let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
+          let essential = draggedTab.hasAttribute("zen-essential");
+          let tabs = this.ariaFocusableItems.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
+            isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
+            isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined
           );
           let size = this.verticalMode ? "height" : "width";
           let screenAxis = this.verticalMode ? "screenY" : "screenX";
@@ -1203,7 +1221,7 @@
                 item.removeAttribute("tabdrop-samewindow");
                 resolve();
               };
-              if (gReduceMotion) {
+              if (true || gReduceMotion) {
                 postTransitionCleanup();
               } else {
                 let onTransitionEnd = transitionendEvent => {
@@ -1327,6 +1345,7 @@
 
           let nextItem = this.ariaFocusableItems[newIndex];
           let tabGroup = isTab(nextItem) && nextItem.group;
+          if (gZenViewSplitter.handleTabDrop(event, urls, replace, inBackground)) return;
           gBrowser.loadTabs(urls, {
             inBackground,
             replace,
@@ -1359,6 +1378,17 @@
 
       this.finishMoveTogetherSelectedTabs(draggedTab);
       this.finishAnimateTabMove();
+
+      if (!dt.mozUserCancelled && dt.dropEffect == "none" && !this._isCustomizing) {
+        const moved = gZenViewSplitter.moveTabToSplitView(event, draggedTab);
+        if (moved) {
+          delete draggedTab._dragData;
+          return;
+        }
+      } else if (dt.mozUserCancelled) {
+        if (gZenViewSplitter._lastOpenedTab) gZenViewSplitter._lastOpenedTab._visuallySelected = false;
+      }
+
       this.#expandGroupOnDrop(draggedTab);
 
       if (
@@ -1582,7 +1612,7 @@
     }
 
     get newTabButton() {
-      return this.querySelector("#tabs-newtab-button");
+      return ZenWorkspaces.activeWorkspaceStrip.querySelector("#tabs-newtab-button");
     }
 
     get verticalMode() {
@@ -1606,29 +1636,41 @@
       if (this.#allTabs) {
         return this.#allTabs;
       }
-      let children = Array.from(this.arrowScrollbox.children);
+      let children = ZenWorkspaces.tabboxChildren;
       // remove arrowScrollbox periphery element
       children.pop();
 
       // explode tab groups
       // Iterate backwards over the array to preserve indices while we modify
       // things in place
-      for (let i = children.length - 1; i >= 0; i--) {
-        if (children[i].tagName == "tab-group") {
-          children.splice(i, 1, ...children[i].tabs);
-        }
-      }
 
       this.#allTabs = [
-        ...this.verticalPinnedTabsContainer.children,
+        ...ZenWorkspaces.getCurrentEssentialsContainer().children, ...this.verticalPinnedTabsContainer.children,
         ...children,
       ];
+      const lastPinnedTabIdx = gBrowser.pinnedTabCount;
+      for (let i = 0; i < this.#allTabs.length; i++) {
+        // add glance tabs (tabs inside tabs) to the list
+        const glanceTab = this.#allTabs[i].querySelector("tab[zen-glance-tab]");
+        if (glanceTab) {
+          // insert right after the parent tab. note: it must be inserted before
+          // the last pinned tab so it can be inserted in the correct order
+          this.#allTabs.splice(Math.max(i + 1, lastPinnedTabIdx), 0, glanceTab);
+          i++;
+        } else if (this.#allTabs[i].classList.contains("vertical-pinned-tabs-container-separator")) {
+          // remove the separator from the list
+          this.#allTabs.splice(i, 1);
+          i--;
+        } else if (this.#allTabs[i].tagName == "tab-group") {
+          this.#allTabs.splice(i, 1, ...this.#allTabs[i].tabs);
+        }
+      }
       return this.#allTabs;
     }
 
     get allGroups() {
       let children = Array.from(this.arrowScrollbox.children);
-      return children.filter(node => node.tagName == "tab-group");
+      return ZenWorkspaces.allTabGroups;
     }
 
     /**
@@ -1648,7 +1690,7 @@
      */
     get visibleTabs() {
       if (!this.#visibleTabs) {
-        this.#visibleTabs = this.openTabs.filter(tab => tab.visible);
+        this.#visibleTabs = this.openTabs.filter(tab => tab.visible && !tab.hasAttribute("zen-empty-tab"));
       }
       return this.#visibleTabs;
     }
@@ -1683,23 +1725,18 @@
       }
 
       let elementIndex = 0;
-      let verticalPinnedTabsContainer = document.getElementById(
-        "vertical-pinned-tabs-container"
-      );
-      for (let i = 0; i < verticalPinnedTabsContainer.childElementCount; i++) {
-        verticalPinnedTabsContainer.children[i].elementIndex = elementIndex++;
-      }
-      let children = Array.from(this.arrowScrollbox.children);
+      let verticalPinnedTabsContainer = this.verticalPinnedTabsContainer
+      let children = ZenWorkspaces.tabboxChildrenWithoutEmpty;
 
       let focusableItems = [];
-      for (let child of children) {
+      for (let child of [...ZenWorkspaces.getCurrentEssentialsContainer().children, ...verticalPinnedTabsContainer.children, ...children]) {
         if (isTab(child) && child.visible) {
           child.elementIndex = elementIndex++;
           focusableItems.push(child);
         } else if (isTabGroup(child)) {
           child.labelElement.elementIndex = elementIndex++;
           focusableItems.push(child.labelElement);
-          if (!child.collapsed) {
+          if (!child.collapsed && !child.hasAttribute("split-view-group")) {
             let visibleTabsInGroup = child.tabs.filter(tab => tab.visible);
             visibleTabsInGroup.forEach(tab => {
               tab.elementIndex = elementIndex++;
@@ -1707,12 +1744,14 @@
             focusableItems.push(...visibleTabsInGroup);
           }
         }
+        let glanceTab = child.querySelector("tab[zen-glance-tab]");
+        if (isTab(child) && glanceTab) {
+          glanceTab.elementIndex = elementIndex++;
+          focusableItems.push(glanceTab);
+        }
       }
 
-      this.#focusableItems = [
-        ...verticalPinnedTabsContainer.children,
-        ...focusableItems,
-      ];
+      this.#focusableItems = focusableItems;
 
       return this.#focusableItems;
     }
@@ -1720,6 +1759,7 @@
     _invalidateCachedTabs() {
       this.#allTabs = null;
       this._invalidateCachedVisibleTabs();
+      ZenWorkspaces._allStoredTabs = null;
     }
 
     _invalidateCachedVisibleTabs() {
@@ -1734,8 +1774,8 @@
     #isContainerVerticalPinnedGrid(tab) {
       return (
         this.verticalMode &&
-        tab.hasAttribute("pinned") &&
-        this.hasAttribute("expanded") &&
+        (tab.hasAttribute("zen-essential")) &&
+        (this.hasAttribute("expanded") || document.documentElement.hasAttribute("zen-sidebar-expanded")) &&
         !this.expandOnHover
       );
     }
@@ -1751,7 +1791,7 @@
 
       if (node == null) {
         // We have a container for non-tab elements at the end of the scrollbox.
-        node = this.arrowScrollbox.lastChild;
+        node = ZenWorkspaces.activeWorkspaceStrip.lastChild;
       }
 
       node.before(tab);
@@ -1846,7 +1886,7 @@
           // There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and
           // for when the tab strip is overflowed (which is shared by vertical and horizontal tabs);
           // Attach the long click popup to all of them.
-          const newTab = document.getElementById("new-tab-button");
+          const newTab = ZenWorkspaces.activeWorkspaceStrip.querySelector("#tabs-newtab-button");
           const newTab2 = this.newTabButton;
           const newTabVertical = document.getElementById(
             "vertical-tabs-newtab-button"
@@ -1941,10 +1981,12 @@
 
     _handleTabSelect(aInstant) {
       let selectedTab = this.selectedItem;
+      if (!selectedTab) return;
       if (this.overflowing) {
         this.arrowScrollbox.ensureElementIsVisible(selectedTab, aInstant);
       }
 
+      gZenCompactModeManager.flashSidebarIfNecessary(aInstant);
       selectedTab._notselectedsinceload = false;
     }
 
@@ -2085,16 +2127,15 @@
       // Move pinned tabs to another container when the tabstrip is toggled to vertical
       // and when session restore code calls _positionPinnedTabs; update styling whenever
       // the number of pinned tabs changes.
-      let verticalTabsContainer = document.getElementById(
-        "vertical-pinned-tabs-container"
-      );
+      let verticalTabsContainer = this.verticalPinnedTabsContainer;
       let numPinned = gBrowser.pinnedTabCount;
-
-      if (gBrowser.pinnedTabCount !== verticalTabsContainer.children.length) {
-        let tabs = this.visibleTabs;
+      if (!ZenWorkspaces._hasInitializedTabsStrip) return;
+      let count = ZenWorkspaces.makeSurePinTabIsInCorrectPosition();
+      if (gBrowser.pinnedTabCount !== (verticalTabsContainer.children.length - count - 1 + ZenWorkspaces.getCurrentEssentialsContainer().children.length)) {
+        let tabs = this.allTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
         for (let i = 0; i < numPinned; i++) {
           tabs[i].style.marginInlineStart = "";
-          verticalTabsContainer.appendChild(tabs[i]);
+          tabs[i].hasAttribute("zen-essential") ? ZenWorkspaces.getCurrentEssentialsContainer().appendChild(tabs[i].group?.hasAttribute("split-view-group") ? tabs[i].group : tabs[i]) : verticalTabsContainer.insertBefore(tabs[i].group?.hasAttribute("split-view-group") ? tabs[i].group : tabs[i], verticalTabsContainer.lastChild);
         }
       }
 
@@ -2102,9 +2143,7 @@
     }
 
     _resetVerticalPinnedTabs() {
-      let verticalTabsContainer = document.getElementById(
-        "vertical-pinned-tabs-container"
-      );
+      let verticalTabsContainer = this.verticalPinnedTabsContainer;
 
       if (!verticalTabsContainer.children.length) {
         return;
@@ -2117,7 +2156,7 @@
     }
 
     _positionPinnedTabs() {
-      let tabs = this.visibleTabs;
+      let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
       let numPinned = gBrowser.pinnedTabCount;
       let absPositionHorizontalTabs =
         this.overflowing && tabs.length > numPinned && numPinned > 0;
@@ -2127,7 +2166,7 @@
 
       if (this.verticalMode) {
         this._updateVerticalPinnedTabs();
-      } else if (absPositionHorizontalTabs) {
+      } else if (absPositionHorizontalTabs && false) {
         let layoutData = this._pinnedTabsLayoutCache;
         let uiDensity = document.documentElement.getAttribute("uidensity");
         if (!layoutData || layoutData.uiDensity != uiDensity) {
@@ -2191,7 +2230,7 @@
         return;
       }
 
-      let tabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
+      let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numZenEssentials);
 
       let directionX = screenX > dragData.animLastScreenX;
       let directionY = screenY > dragData.animLastScreenY;
@@ -2199,7 +2238,7 @@
       dragData.animLastScreenX = screenX;
 
       let { width: tabWidth, height: tabHeight } =
-        draggedTab.getBoundingClientRect();
+        (draggedTab.group?.hasAttribute("split-view-group") ? draggedTab.group : draggedTab).getBoundingClientRect();
       let shiftSizeX = tabWidth * movingTabs.length;
       let shiftSizeY = tabHeight;
       dragData.tabWidth = tabWidth;
@@ -2374,12 +2413,16 @@
 
       this.#clearDragOverCreateGroupTimer();
 
-      let isPinned = draggedTab.pinned;
-      let numPinned = gBrowser.pinnedTabCount;
-      let tabs = this.ariaFocusableItems.slice(
-        isPinned ? 0 : numPinned,
-        isPinned ? numPinned : undefined
+      let isPinned = draggedTab?.group ? draggedTab.group.pinned : draggedTab.pinned;
+      let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
+      let essential = draggedTab.hasAttribute("zen-essential");
+      let tabs = this.ariaFocusableItems.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
+        isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
+        isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined
       );
+      if (draggedTab.group?.hasAttribute("split-view-group")) {
+        draggedTab = draggedTab.group.labelElement;
+      }
 
       if (this.#rtlMode) {
         tabs.reverse();
@@ -2393,7 +2436,7 @@
       let size = this.verticalMode ? "height" : "width";
       let translateAxis = this.verticalMode ? "translateY" : "translateX";
       let scrollDirection = this.verticalMode ? "scrollTop" : "scrollLeft";
-      let { width: tabWidth, height: tabHeight } = bounds(draggedTab);
+      let { width: tabWidth, height: tabHeight } = bounds(draggedTab.group?.hasAttribute("split-view-group") ? draggedTab.group : draggedTab);
       let translateX = event.screenX - dragData.screenX;
       let translateY = event.screenY - dragData.screenY;
 
@@ -2407,10 +2450,19 @@
       let lastTab = tabs.at(-1);
       let lastMovingTab = movingTabs.at(-1);
       let firstMovingTab = movingTabs[0];
+      if (lastMovingTab.group?.hasAttribute("split-view-group")) {
+        lastMovingTab = lastMovingTab.group;
+      }
+      if (firstMovingTab.group?.hasAttribute("split-view-group")) {
+        firstMovingTab = firstMovingTab.group;
+      }
       let endEdge = ele => ele[screenAxis] + bounds(ele)[size];
       let lastMovingTabScreen = endEdge(lastMovingTab);
       let firstMovingTabScreen = firstMovingTab[screenAxis];
       let shiftSize = lastMovingTabScreen - firstMovingTabScreen;
+      if (firstMovingTab.hasAttribute("split-view-group")) {
+        shiftSize += 5; // A hack to allow more space for the group
+      }
       let translate = screen - dragData[screenAxis];
       if (!isPinned) {
         translate +=
@@ -2431,6 +2483,9 @@
           // Shift the `.tab-group-label-container` to shift the label element.
           item = item.parentElement;
         }
+        if (item.parentElement?.hasAttribute("split-view-group")) {
+          item = item.parentElement;
+        }
         item.style.transform = `${translateAxis}(${translate}px)`;
       }
 
@@ -2568,6 +2623,9 @@
             break;
           }
           let element = tabs[mid];
+          if (element?.group?.hasAttribute("split-view-group")) {
+            element = element.group.labelElement;
+          }
           let elementForSize = isTabGroupLabel(element)
             ? element.parentElement
             : element;
@@ -2590,6 +2648,10 @@
       if (!dropElement) {
         dropElement = this.ariaFocusableItems[oldDropElementIndex];
       }
+      if (dropElement?.group?.hasAttribute("split-view-group")) {
+        // We focus the group label element, not the group itself.
+        dropElement = dropElement.group.labelElement;
+      }
       let newDropElementIndex = dropElement
         ? dropElement.elementIndex
         : oldDropElementIndex;
@@ -2598,7 +2660,7 @@
       let shouldCreateGroupOnDrop;
       let dropBefore;
       if (dropElement) {
-        let dropElementForOverlap = isTabGroupLabel(dropElement)
+        let dropElementForOverlap = isTabGroupLabel(dropElement) && !dropElement.closest("tab-group")?.hasAttribute("split-view-group")
           ? dropElement.parentElement
           : dropElement;
 
@@ -2660,12 +2722,12 @@
         }
       }
 
-      if (gBrowser._tabGroupsEnabled && isTab(draggedTab) && !isPinned) {
+      if (true) {
         let dragOverGroupingThreshold = 1 - moveOverThreshold;
 
         // When dragging tab(s) over an ungrouped tab, signal to the user
         // that dropping the tab(s) will create a new tab group.
-        shouldCreateGroupOnDrop =
+        shouldCreateGroupOnDrop = false &&
           dropElement != draggedTab &&
           isTab(dropElement) &&
           !dropElement?.group &&
@@ -2735,7 +2797,7 @@
       // Shift background tabs to leave a gap where the dragged tab
       // would currently be dropped.
       for (let item of tabs) {
-        if (item == draggedTab) {
+        if (item == draggedTab || (item.group?.hasAttribute("split-view-group") && item.group == draggedTab.group)) {
           continue;
         }
 
@@ -2744,6 +2806,9 @@
         if (isTabGroupLabel(item)) {
           // Shift the `.tab-group-label-container` to shift the label element.
           item = item.parentElement;
+          if (item.parentElement?.hasAttribute("split-view-group")) {
+            item = item.parentElement;
+          }
         }
         item.style.transform = transform;
       }
@@ -2796,8 +2861,9 @@
       );
     }
 
-    finishAnimateTabMove() {
-      if (!this.#isMovingTab()) {
+    finishAnimateTabMove(always = false) {
+      gZenPinnedTabManager.removeTabContainersDragoverClass();
+      if (!this.#isMovingTab() && !always) {
         return;
       }
 
@@ -2809,6 +2875,12 @@
           item = item.parentElement;
         }
         item.style.transform = "";
+        if (item.closest("tab-group")?.hasAttribute("split-view-group")) item.closest("tab-group").style.transform = "";
+        if (item.closest("tab-group")?.hasAttribute("split-view-group")) {
+          for (let tab of item.closest("tab-group").tabs) {
+            tab.style.transform = "";
+          }
+        }
         item.removeAttribute("dragover-createGroup");
       }
       this.removeAttribute("movingtab-createGroup");
@@ -2855,7 +2927,7 @@
         let postTransitionCleanup = () => {
           movingTab._moveTogetherSelectedTabsData.animate = false;
         };
-        if (gReduceMotion) {
+        if (true || gReduceMotion) {
           postTransitionCleanup();
         } else {
           let onTransitionEnd = transitionendEvent => {
@@ -3028,7 +3100,7 @@
     }
 
     _notifyBackgroundTab(aTab) {
-      if (aTab.pinned || !aTab.visible || !this.overflowing) {
+      if (aTab.hasAttribute("zen-essential") || !aTab.visible || !this.overflowing) {
         return;
       }
 
@@ -3154,6 +3226,9 @@
           return null;
         }
       }
+      if (target?.group?.hasAttribute("split-view-group")) {
+        target = target.group.labelElement;
+      }
       return target;
     }
 
