diff --git a/firebase-perf/firebase-perf.gradle b/firebase-perf/firebase-perf.gradle
index b6028e75b61..3dc2fd5a38d 100644
--- a/firebase-perf/firebase-perf.gradle
+++ b/firebase-perf/firebase-perf.gradle
@@ -118,7 +118,7 @@ dependencies {
     api("com.google.firebase:firebase-components:18.0.0")
     api("com.google.firebase:firebase-config:21.5.0")
     api("com.google.firebase:firebase-installations:17.2.0")
-    api("com.google.firebase:firebase-sessions:2.0.7") {
+    api(project(":firebase-sessions")) {
         exclude group: 'com.google.firebase', module: 'firebase-common'
         exclude group: 'com.google.firebase', module: 'firebase-common-ktx'
         exclude group: 'com.google.firebase', module: 'firebase-components'
diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java
index c01f035af1f..daffc2de81a 100644
--- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java
+++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java
@@ -30,6 +30,8 @@
 import com.google.firebase.perf.injection.modules.FirebasePerformanceModule;
 import com.google.firebase.platforminfo.LibraryVersionComponent;
 import com.google.firebase.remoteconfig.RemoteConfigComponent;
+import com.google.firebase.sessions.api.FirebaseSessionsDependencies;
+import com.google.firebase.sessions.api.SessionSubscriber;
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.Executor;
@@ -47,6 +49,11 @@ public class FirebasePerfRegistrar implements ComponentRegistrar {
   private static final String LIBRARY_NAME = "fire-perf";
   private static final String EARLY_LIBRARY_NAME = "fire-perf-early";
 
+  static {
+    // Add Firebase Performance as a dependency of Sessions when this class is loaded into memory.
+    FirebaseSessionsDependencies.addDependency(SessionSubscriber.Name.PERFORMANCE);
+  }
+
   @Override
   @Keep
   public List<Component<?>> getComponents() {
diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java
index 3cc49896ce0..e4ddfcd600c 100644
--- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java
+++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java
@@ -36,12 +36,14 @@
 import com.google.firebase.perf.logging.ConsoleUrlGenerator;
 import com.google.firebase.perf.metrics.HttpMetric;
 import com.google.firebase.perf.metrics.Trace;
+import com.google.firebase.perf.session.FirebasePerformanceSessionSubscriber;
 import com.google.firebase.perf.session.SessionManager;
 import com.google.firebase.perf.transport.TransportManager;
 import com.google.firebase.perf.util.Constants;
 import com.google.firebase.perf.util.ImmutableBundle;
 import com.google.firebase.perf.util.Timer;
 import com.google.firebase.remoteconfig.RemoteConfigComponent;
+import com.google.firebase.sessions.api.FirebaseSessionsDependencies;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.net.URL;
@@ -136,11 +138,6 @@ public static FirebasePerformance getInstance() {
   // to false if it's been force disabled or it is set to null if neither.
   @Nullable private Boolean mPerformanceCollectionForceEnabledState = null;
 
-  private final FirebaseApp firebaseApp;
-  private final Provider<RemoteConfigComponent> firebaseRemoteConfigProvider;
-  private final FirebaseInstallationsApi firebaseInstallationsApi;
-  private final Provider<TransportFactory> transportFactoryProvider;
-
   /**
    * Constructs the FirebasePerformance class and allows injecting dependencies.
    *
@@ -166,11 +163,6 @@ public static FirebasePerformance getInstance() {
       ConfigResolver configResolver,
       SessionManager sessionManager) {
 
-    this.firebaseApp = firebaseApp;
-    this.firebaseRemoteConfigProvider = firebaseRemoteConfigProvider;
-    this.firebaseInstallationsApi = firebaseInstallationsApi;
-    this.transportFactoryProvider = transportFactoryProvider;
-
     if (firebaseApp == null) {
       this.mPerformanceCollectionForceEnabledState = false;
       this.configResolver = configResolver;
@@ -191,6 +183,9 @@ public static FirebasePerformance getInstance() {
     sessionManager.setApplicationContext(appContext);
 
     mPerformanceCollectionForceEnabledState = configResolver.getIsPerformanceCollectionEnabled();
+    FirebaseSessionsDependencies.register(
+        new FirebasePerformanceSessionSubscriber(isPerformanceCollectionEnabled()));
+
     if (logger.isLogcatEnabled() && isPerformanceCollectionEnabled()) {
       logger.info(
           String.format(
@@ -281,7 +276,7 @@ public synchronized void setPerformanceCollectionEnabled(@Nullable Boolean enabl
       return;
     }
 
-    if (configResolver.getIsPerformanceCollectionDeactivated()) {
+    if (Boolean.TRUE.equals(configResolver.getIsPerformanceCollectionDeactivated())) {
       logger.info("Firebase Performance is permanently disabled");
       return;
     }
diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt b/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt
new file mode 100644
index 00000000000..b6a3d30c139
--- /dev/null
+++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2025 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.firebase.perf.session
+
+import com.google.firebase.perf.session.gauges.GaugeManager
+import com.google.firebase.perf.v1.ApplicationProcessState
+import com.google.firebase.sessions.api.SessionSubscriber
+import java.util.UUID
+
+class FirebasePerformanceSessionSubscriber(override val isDataCollectionEnabled: Boolean) :
+  SessionSubscriber {
+
+  override val sessionSubscriberName: SessionSubscriber.Name = SessionSubscriber.Name.PERFORMANCE
+
+  override fun onSessionChanged(sessionDetails: SessionSubscriber.SessionDetails) {
+    val currentPerfSession = SessionManager.getInstance().perfSession()
+
+    // A [PerfSession] was created before a session was started.
+    if (currentPerfSession.aqsSessionId() == null) {
+      currentPerfSession.setAQSId(sessionDetails)
+      GaugeManager.getInstance()
+        .logGaugeMetadata(currentPerfSession.aqsSessionId(), ApplicationProcessState.FOREGROUND)
+      return
+    }
+
+    val updatedSession = PerfSession.createWithId(UUID.randomUUID().toString())
+    updatedSession.setAQSId(sessionDetails)
+    SessionManager.getInstance().updatePerfSession(updatedSession)
+    GaugeManager.getInstance()
+      .logGaugeMetadata(updatedSession.aqsSessionId(), ApplicationProcessState.FOREGROUND)
+  }
+}
diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/PerfSession.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/PerfSession.java
index 160a4507560..075848ab747 100644
--- a/firebase-perf/src/main/java/com/google/firebase/perf/session/PerfSession.java
+++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/PerfSession.java
@@ -23,6 +23,7 @@
 import com.google.firebase.perf.util.Clock;
 import com.google.firebase.perf.util.Timer;
 import com.google.firebase.perf.v1.SessionVerbosity;
+import com.google.firebase.sessions.api.SessionSubscriber;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
@@ -31,6 +32,7 @@ public class PerfSession implements Parcelable {
 
   private final String sessionId;
   private final Timer creationTime;
+  @Nullable private String aqsSessionId;
 
   private boolean isGaugeAndEventCollectionEnabled = false;
 
@@ -59,11 +61,24 @@ private PerfSession(@NonNull Parcel in) {
     creationTime = in.readParcelable(Timer.class.getClassLoader());
   }
 
-  /** Returns the sessionId of the object. */
+  /** Returns the sessionId of the session. */
   public String sessionId() {
     return sessionId;
   }
 
+  /** Returns the AQS sessionId for the given session. */
+  @Nullable
+  public String aqsSessionId() {
+    return aqsSessionId;
+  }
+
+  /** Sets the AQS sessionId for the given session. */
+  public void setAQSId(SessionSubscriber.SessionDetails aqs) {
+    if (aqsSessionId == null) {
+      aqsSessionId = aqs.getSessionId();
+    }
+  }
+
   /**
    * Returns a timer object that has been seeded with the system time at which the session began.
    */
@@ -113,6 +128,7 @@ public boolean isSessionRunningTooLong() {
 
   /** Creates and returns the proto object for PerfSession object. */
   public com.google.firebase.perf.v1.PerfSession build() {
+    // TODO(b/394127311): Switch to using AQS.
     com.google.firebase.perf.v1.PerfSession.Builder sessionMetric =
         com.google.firebase.perf.v1.PerfSession.newBuilder().setSessionId(sessionId);
 
diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java
index 29ffb988ba0..cf99c1e52ea 100644
--- a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java
+++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java
@@ -19,7 +19,6 @@
 import androidx.annotation.Keep;
 import androidx.annotation.VisibleForTesting;
 import com.google.firebase.perf.application.AppStateMonitor;
-import com.google.firebase.perf.application.AppStateUpdateHandler;
 import com.google.firebase.perf.session.gauges.GaugeManager;
 import com.google.firebase.perf.v1.ApplicationProcessState;
 import com.google.firebase.perf.v1.GaugeMetadata;
@@ -27,15 +26,13 @@
 import java.lang.ref.WeakReference;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Objects;
 import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
 
 /** Session manager to generate sessionIDs and broadcast to the application. */
 @Keep // Needed because of b/117526359.
-public class SessionManager extends AppStateUpdateHandler {
+public class SessionManager {
 
   @SuppressLint("StaticFieldLeak")
   private static final SessionManager instance = new SessionManager();
@@ -45,7 +42,6 @@ public class SessionManager extends AppStateUpdateHandler {
   private final Set<WeakReference<SessionAwareObject>> clients = new HashSet<>();
 
   private PerfSession perfSession;
-  private Future syncInitFuture;
 
   /** Returns the singleton instance of SessionManager. */
   public static SessionManager getInstance() {
@@ -71,7 +67,6 @@ public SessionManager(
     this.gaugeManager = gaugeManager;
     this.perfSession = perfSession;
     this.appStateMonitor = appStateMonitor;
-    registerForAppState();
   }
 
   /**
@@ -79,42 +74,7 @@ public SessionManager(
    * (currently that is before onResume finishes) to ensure gauge collection starts on time.
    */
   public void setApplicationContext(final Context appContext) {
-    // TODO(b/258263016): Migrate to go/firebase-android-executors
-    @SuppressLint("ThreadPoolCreation")
-    ExecutorService executorService = Executors.newSingleThreadExecutor();
-    syncInitFuture =
-        executorService.submit(
-            () -> {
-              gaugeManager.initializeGaugeMetadataManager(appContext);
-            });
-  }
-
-  @Override
-  public void onUpdateAppState(ApplicationProcessState newAppState) {
-    super.onUpdateAppState(newAppState);
-
-    if (appStateMonitor.isColdStart()) {
-      // We want the Session to remain unchanged if this is a cold start of the app since we already
-      // update the PerfSession in FirebasePerfProvider#onAttachInfo().
-      return;
-    }
-
-    if (newAppState == ApplicationProcessState.FOREGROUND) {
-      // A new foregrounding of app will force a new sessionID generation.
-      PerfSession session = PerfSession.createWithId(UUID.randomUUID().toString());
-      updatePerfSession(session);
-    } else {
-      // If the session is running for too long, generate a new session and collect gauges as
-      // necessary.
-      if (perfSession.isSessionRunningTooLong()) {
-        PerfSession session = PerfSession.createWithId(UUID.randomUUID().toString());
-        updatePerfSession(session);
-      } else {
-        // For any other state change of the application, modify gauge collection state as
-        // necessary.
-        startOrStopCollectingGauges(newAppState);
-      }
-    }
+    gaugeManager.initializeGaugeMetadataManager(appContext);
   }
 
   /**
@@ -138,7 +98,7 @@ public void stopGaugeCollectionIfSessionRunningTooLong() {
    */
   public void updatePerfSession(PerfSession perfSession) {
     // Do not update the perf session if it is the exact same sessionId.
-    if (perfSession.sessionId() == this.perfSession.sessionId()) {
+    if (Objects.equals(perfSession.sessionId(), this.perfSession.sessionId())) {
       return;
     }
 
@@ -207,9 +167,4 @@ private void startOrStopCollectingGauges(ApplicationProcessState appState) {
   public void setPerfSession(PerfSession perfSession) {
     this.perfSession = perfSession;
   }
-
-  @VisibleForTesting
-  public Future getSyncInitFuture() {
-    return this.syncInitFuture;
-  }
 }
diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeManager.java
index 30da2f0160f..1c06ceac9dd 100644
--- a/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeManager.java
+++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeManager.java
@@ -136,6 +136,7 @@ public void startCollectingGauges(
     final String sessionIdForScheduledTask = sessionId;
     final ApplicationProcessState applicationProcessStateForScheduledTask = applicationProcessState;
 
+    // TODO(b/394127311): Switch to using AQS.
     try {
       gaugeManagerDataCollectionJob =
           gaugeManagerExecutor
@@ -204,6 +205,7 @@ public void stopCollectingGauges() {
       gaugeManagerDataCollectionJob.cancel(false);
     }
 
+    // TODO(b/394127311): Switch to using AQS.
     // Flush any data that was collected for this session one last time.
     @SuppressWarnings("FutureReturnValueIgnored")
     ScheduledFuture unusedFuture =
@@ -242,6 +244,7 @@ private void syncFlush(String sessionId, ApplicationProcessState appState) {
     }
 
     // Adding Session ID info.
+    // TODO(b/394127311): Switch to using AQS.
     gaugeMetricBuilder.setSessionId(sessionId);
 
     transportManager.log(gaugeMetricBuilder.build(), appState);
@@ -250,17 +253,16 @@ private void syncFlush(String sessionId, ApplicationProcessState appState) {
   /**
    * Log the Gauge Metadata information to the transport.
    *
-   * @param sessionId The {@link PerfSession#sessionId()} to which the collected Gauge Metrics
+   * @param aqsSessionId The {@link PerfSession#aqsSessionId()} ()} to which the collected Gauge Metrics
    *     should be associated with.
    * @param appState The {@link ApplicationProcessState} for which these gauges are collected.
    * @return true if GaugeMetadata was logged, false otherwise.
    */
-  public boolean logGaugeMetadata(String sessionId, ApplicationProcessState appState) {
-    // TODO(b/394127311): Re-introduce logging of metadata for AQS.
+  public boolean logGaugeMetadata(String aqsSessionId, ApplicationProcessState appState) {
     if (gaugeMetadataManager != null) {
       GaugeMetric gaugeMetric =
           GaugeMetric.newBuilder()
-              .setSessionId(sessionId)
+              .setSessionId(aqsSessionId)
               .setGaugeMetadata(getGaugeMetadata())
               .build();
       transportManager.log(gaugeMetric, appState);
diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java
index 9600b099a6d..159af53d3d3 100644
--- a/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java
+++ b/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java
@@ -354,6 +354,7 @@ public void log(final GaugeMetric gaugeMetric) {
    * {@link #isAllowedToDispatch(PerfMetric)}).
    */
   public void log(final GaugeMetric gaugeMetric, final ApplicationProcessState appState) {
+    // TODO(b/394127311): This *might* potentially be the right place to get AQS.
     executorService.execute(
         () -> syncLog(PerfMetric.newBuilder().setGaugeMetric(gaugeMetric), appState));
   }
diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/session/SessionManagerTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/session/SessionManagerTest.java
index 37b9ff7215b..954b0ae88d3 100644
--- a/firebase-perf/src/test/java/com/google/firebase/perf/session/SessionManagerTest.java
+++ b/firebase-perf/src/test/java/com/google/firebase/perf/session/SessionManagerTest.java
@@ -16,9 +16,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
@@ -40,7 +37,6 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.AdditionalMatchers;
 import org.mockito.ArgumentMatchers;
 import org.mockito.InOrder;
 import org.mockito.Mock;
@@ -82,105 +78,15 @@ public void setApplicationContext_initializeGaugeMetadataManager()
         new SessionManager(mockGaugeManager, mockPerfSession, mockAppStateMonitor);
     testSessionManager.setApplicationContext(mockApplicationContext);
 
-    testSessionManager.getSyncInitFuture().get();
     inOrder.verify(mockGaugeManager).initializeGaugeMetadataManager(any());
   }
 
-  @Test
-  public void testOnUpdateAppStateDoesNothingDuringAppStart() {
-    String oldSessionId = SessionManager.getInstance().perfSession().sessionId();
-
-    assertThat(oldSessionId).isNotNull();
-    assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId());
-
-    AppStateMonitor.getInstance().setIsColdStart(true);
-
-    SessionManager.getInstance().onUpdateAppState(ApplicationProcessState.FOREGROUND);
-    assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId());
-  }
-
-  @Test
-  public void testOnUpdateAppStateGeneratesNewSessionIdOnForegroundState() {
-    String oldSessionId = SessionManager.getInstance().perfSession().sessionId();
-
-    assertThat(oldSessionId).isNotNull();
-    assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId());
-
-    SessionManager.getInstance().onUpdateAppState(ApplicationProcessState.FOREGROUND);
-    assertThat(oldSessionId).isNotEqualTo(SessionManager.getInstance().perfSession().sessionId());
-  }
-
-  @Test
-  public void testOnUpdateAppStateDoesntGenerateNewSessionIdOnBackgroundState() {
-    String oldSessionId = SessionManager.getInstance().perfSession().sessionId();
-
-    assertThat(oldSessionId).isNotNull();
-    assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId());
-
-    SessionManager.getInstance().onUpdateAppState(ApplicationProcessState.BACKGROUND);
-    assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId());
-  }
-
-  @Test
-  public void testOnUpdateAppStateGeneratesNewSessionIdOnBackgroundStateIfPerfSessionExpires() {
-    when(mockPerfSession.isSessionRunningTooLong()).thenReturn(true);
-    SessionManager testSessionManager =
-        new SessionManager(mockGaugeManager, mockPerfSession, mockAppStateMonitor);
-    String oldSessionId = testSessionManager.perfSession().sessionId();
-
-    assertThat(oldSessionId).isNotNull();
-    assertThat(oldSessionId).isEqualTo(testSessionManager.perfSession().sessionId());
-
-    testSessionManager.onUpdateAppState(ApplicationProcessState.BACKGROUND);
-    assertThat(oldSessionId).isNotEqualTo(testSessionManager.perfSession().sessionId());
-  }
-
-  @Test
-  public void
-      testOnUpdateAppStateDoesntMakeGaugeManagerLogGaugeMetadataOnForegroundStateIfSessionIsNonVerbose() {
-    forceNonVerboseSession();
-
-    SessionManager testSessionManager =
-        new SessionManager(mockGaugeManager, mockPerfSession, mockAppStateMonitor);
-    testSessionManager.onUpdateAppState(ApplicationProcessState.FOREGROUND);
-
-    verify(mockGaugeManager, never())
-        .logGaugeMetadata(
-            anyString(), nullable(com.google.firebase.perf.v1.ApplicationProcessState.class));
-  }
-
-  @Test
-  public void
-      testOnUpdateAppStateDoesntMakeGaugeManagerLogGaugeMetadataOnBackgroundStateEvenIfSessionIsVerbose() {
-    forceVerboseSession();
-
-    SessionManager testSessionManager =
-        new SessionManager(mockGaugeManager, mockPerfSession, mockAppStateMonitor);
-    testSessionManager.onUpdateAppState(ApplicationProcessState.BACKGROUND);
-
-    verify(mockGaugeManager, never())
-        .logGaugeMetadata(
-            anyString(), nullable(com.google.firebase.perf.v1.ApplicationProcessState.class));
-  }
-
-  @Test
-  public void testOnUpdateAppStateMakesGaugeManagerStartCollectingGaugesIfSessionIsVerbose() {
-    forceVerboseSession();
-
-    SessionManager testSessionManager =
-        new SessionManager(mockGaugeManager, mockPerfSession, mockAppStateMonitor);
-    testSessionManager.onUpdateAppState(ApplicationProcessState.FOREGROUND);
-
-    verify(mockGaugeManager)
-        .startCollectingGauges(AdditionalMatchers.not(eq(mockPerfSession)), any());
-  }
-
   // LogGaugeData on new perf session when Verbose
   // NotLogGaugeData on new perf session when not Verbose
   // Mark Session as expired after time limit.
 
   @Test
-  public void testOnUpdateAppStateMakesGaugeManagerStopCollectingGaugesIfSessionIsNonVerbose() {
+  public void testUpdatePerfSessionMakesGaugeManagerStopCollectingGaugesIfSessionIsNonVerbose() {
     forceNonVerboseSession();
 
     SessionManager testSessionManager =
@@ -191,7 +97,7 @@ public void testOnUpdateAppStateMakesGaugeManagerStopCollectingGaugesIfSessionIs
   }
 
   @Test
-  public void testOnUpdateAppStateMakesGaugeManagerStopCollectingGaugesWhenSessionsDisabled() {
+  public void testUpdatePerfSessionMakesGaugeManagerStopCollectingGaugesWhenSessionsDisabled() {
     forceSessionsFeatureDisabled();
 
     SessionManager testSessionManager =
@@ -221,22 +127,25 @@ public void testSessionIdDoesNotUpdateIfPerfSessionRunsTooLong() {
   }
 
   @Test
-  public void testPerfSessionExpiredMakesGaugeManagerStopsCollectingGaugesIfSessionIsVerbose() {
-    forceVerboseSession();
+  public void testUpdatePerfSessionStartsCollectingGaugesIfSessionIsVerbose() {
     Timer mockTimer = mock(Timer.class);
     when(mockClock.getTime()).thenReturn(mockTimer);
+    when(mockAppStateMonitor.getAppState()).thenReturn(ApplicationProcessState.FOREGROUND);
 
-    PerfSession session = new PerfSession("sessionId", mockClock);
-    SessionManager testSessionManager =
-        new SessionManager(mockGaugeManager, session, mockAppStateMonitor);
+    PerfSession previousSession = new PerfSession("previousSession", mockClock);
+    previousSession.setGaugeAndEventCollectionEnabled(false);
 
-    assertThat(session.isSessionRunningTooLong()).isFalse();
+    PerfSession newSession = new PerfSession("newSession", mockClock);
+    newSession.setGaugeAndEventCollectionEnabled(true);
 
-    when(mockTimer.getDurationMicros())
-        .thenReturn(TimeUnit.HOURS.toMicros(5)); // Default Max Session Length is 4 hours
+    SessionManager testSessionManager =
+        new SessionManager(mockGaugeManager, previousSession, mockAppStateMonitor);
+    testSessionManager.updatePerfSession(newSession);
+    testSessionManager.setApplicationContext(mockApplicationContext);
 
-    assertThat(session.isSessionRunningTooLong()).isTrue();
-    verify(mockGaugeManager, times(0)).logGaugeMetadata(any(), any());
+    verify(mockGaugeManager, times(1)).initializeGaugeMetadataManager(mockApplicationContext);
+    verify(mockGaugeManager, times(1))
+        .startCollectingGauges(newSession, ApplicationProcessState.FOREGROUND);
   }
 
   @Test
diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/api/FirebaseSessionsDependencies.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/api/FirebaseSessionsDependencies.kt
index 8d3548c8f4b..4b636a155e0 100644
--- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/api/FirebaseSessionsDependencies.kt
+++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/api/FirebaseSessionsDependencies.kt
@@ -40,19 +40,6 @@ object FirebaseSessionsDependencies {
    */
   @JvmStatic
   fun addDependency(subscriberName: SessionSubscriber.Name) {
-    if (subscriberName == SessionSubscriber.Name.PERFORMANCE) {
-      throw IllegalArgumentException(
-        """
-          Incompatible versions of Firebase Perf and Firebase Sessions.
-          A safe combination would be:
-            firebase-sessions:1.1.0
-            firebase-crashlytics:18.5.0
-            firebase-perf:20.5.0
-          For more information contact Firebase Support.
-        """
-          .trimIndent()
-      )
-    }
     if (dependencies.containsKey(subscriberName)) {
       Log.d(TAG, "Dependency $subscriberName already added.")
       return