diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 0db6399..31a9855 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,5 +1,5 @@
 [versions]
-toolbox-plugin-api = "1.1.41749"
+toolbox-plugin-api = "1.3.46097"
 kotlin = "2.1.10"
 coroutines = "1.10.1"
 serialization = "1.8.0"
diff --git a/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt b/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt
index 101cf71..9816596 100644
--- a/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt
+++ b/src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt
@@ -63,7 +63,7 @@ class CoderRemoteProvider(
     // On the first load, automatically log in if we can.
     private var firstRun = true
     private val isInitialized: MutableStateFlow<Boolean> = MutableStateFlow(false)
-    private var coderHeaderPage = NewEnvironmentPage(context, context.i18n.pnotr(context.deploymentUrl.toString()))
+    private val coderHeaderPage = NewEnvironmentPage(context.i18n.pnotr(context.deploymentUrl.toString()))
     private val linkHandler = CoderProtocolHandler(context, dialogUi, isInitialized)
 
     override val environments: MutableStateFlow<LoadableState<List<CoderRemoteEnvironment>>> = MutableStateFlow(
@@ -167,7 +167,7 @@ class CoderRemoteProvider(
                     close()
                     // force auto-login
                     firstRun = true
-                    goToEnvironmentsPage()
+                    context.envPageManager.showPluginEnvironmentsPage()
                     break
                 }
             }
@@ -317,25 +317,13 @@ class CoderRemoteProvider(
             close()
             // start initialization with the new settings
             this@CoderRemoteProvider.client = restClient
-            coderHeaderPage = NewEnvironmentPage(context, context.i18n.pnotr(restClient.url.toString()))
+            coderHeaderPage.setTitle(context.i18n.pnotr(restClient.url.toString()))
 
             environments.showLoadingMessage()
             pollJob = poll(restClient, cli)
         }
     }
 
-    /**
-     * Make Toolbox ask for the page again.  Use any time we need to change the
-     * root page (for example, sign-in or the environment list).
-     *
-     * When moving between related pages, instead use ui.showUiPage() and
-     * ui.hideUiPage() which stacks and has built-in back navigation, rather
-     * than using multiple root pages.
-     */
-    private fun goToEnvironmentsPage() {
-        context.envPageManager.showPluginEnvironmentsPage()
-    }
-
     /**
      * Return the sign-in page if we do not have a valid client.
 
@@ -377,7 +365,7 @@ class CoderRemoteProvider(
 
     private fun shouldDoAutoSetup(): Boolean = firstRun && context.secrets.rememberMe == true
 
-    private suspend fun onConnect(client: CoderRestClient, cli: CoderCLIManager) {
+    private fun onConnect(client: CoderRestClient, cli: CoderCLIManager) {
         // Store the URL and token for use next time.
         context.secrets.lastDeploymentURL = client.url.toString()
         context.secrets.lastToken = client.token ?: ""
@@ -387,9 +375,9 @@ class CoderRemoteProvider(
         this.client = client
         pollJob?.cancel()
         environments.showLoadingMessage()
-        coderHeaderPage = NewEnvironmentPage(context, context.i18n.pnotr(client.url.toString()))
+        coderHeaderPage.setTitle(context.i18n.pnotr(client.url.toString()))
         pollJob = poll(client, cli)
-        context.refreshMainPage()
+        context.envPageManager.showPluginEnvironmentsPage()
     }
 
     private fun MutableStateFlow<LoadableState<List<CoderRemoteEnvironment>>>.showLoadingMessage() {
diff --git a/src/main/kotlin/com/coder/toolbox/models/WorkspaceAndAgentStatus.kt b/src/main/kotlin/com/coder/toolbox/models/WorkspaceAndAgentStatus.kt
index cc04dfe..28cc14b 100644
--- a/src/main/kotlin/com/coder/toolbox/models/WorkspaceAndAgentStatus.kt
+++ b/src/main/kotlin/com/coder/toolbox/models/WorkspaceAndAgentStatus.kt
@@ -65,9 +65,10 @@ enum class WorkspaceAndAgentStatus(val label: String, val description: String) {
         return CustomRemoteEnvironmentStateV2(
             context.i18n.pnotr(label),
             color = getStateColor(context),
-            reachable = ready() || unhealthy(),
+            isReachable = ready() || unhealthy(),
             // TODO@JB: How does this work?  Would like a spinner for pending states.
-            icon = getStateIcon()
+            iconId = getStateIcon().id,
+            isPriorityShow = true
         )
     }
 
diff --git a/src/main/kotlin/com/coder/toolbox/views/CoderCliSetupWizardPage.kt b/src/main/kotlin/com/coder/toolbox/views/CoderCliSetupWizardPage.kt
index c6193da..5115204 100644
--- a/src/main/kotlin/com/coder/toolbox/views/CoderCliSetupWizardPage.kt
+++ b/src/main/kotlin/com/coder/toolbox/views/CoderCliSetupWizardPage.kt
@@ -25,7 +25,7 @@ class CoderCliSetupWizardPage(
         client: CoderRestClient,
         cli: CoderCLIManager,
     ) -> Unit,
-) : CoderPage(context.i18n.ptrl("Setting up Coder"), false) {
+) : CoderPage(MutableStateFlow(context.i18n.ptrl("Setting up Coder")), false) {
     private val shouldAutoSetup = MutableStateFlow(initialAutoSetup)
     private val settingsAction = Action(context.i18n.ptrl("Settings"), actionBlock = {
         context.ui.showUiPage(settingsPage)
diff --git a/src/main/kotlin/com/coder/toolbox/views/CoderPage.kt b/src/main/kotlin/com/coder/toolbox/views/CoderPage.kt
index 9b83f45..363d618 100644
--- a/src/main/kotlin/com/coder/toolbox/views/CoderPage.kt
+++ b/src/main/kotlin/com/coder/toolbox/views/CoderPage.kt
@@ -7,6 +7,7 @@ import com.jetbrains.toolbox.api.localization.LocalizableString
 import com.jetbrains.toolbox.api.ui.actions.RunnableActionDescription
 import com.jetbrains.toolbox.api.ui.components.UiPage
 import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.update
 
 /**
  * Base page that handles the icon, displaying error notifications, and
@@ -19,9 +20,15 @@ import kotlinx.coroutines.flow.MutableStateFlow
  *       to use the mouse.
  */
 abstract class CoderPage(
-    title: LocalizableString,
+    private val titleObservable: MutableStateFlow<LocalizableString>,
     showIcon: Boolean = true,
-) : UiPage(title) {
+) : UiPage(titleObservable) {
+
+    fun setTitle(title: LocalizableString) {
+        titleObservable.update {
+            title
+        }
+    }
 
     /**
      * Return the icon, if showing one.
diff --git a/src/main/kotlin/com/coder/toolbox/views/CoderSettingsPage.kt b/src/main/kotlin/com/coder/toolbox/views/CoderSettingsPage.kt
index de2ce0b..61827be 100644
--- a/src/main/kotlin/com/coder/toolbox/views/CoderSettingsPage.kt
+++ b/src/main/kotlin/com/coder/toolbox/views/CoderSettingsPage.kt
@@ -20,7 +20,7 @@ import kotlinx.coroutines.launch
  *          I have not been able to test this page.
  */
 class CoderSettingsPage(context: CoderToolboxContext, triggerSshConfig: Channel<Boolean>) :
-    CoderPage(context.i18n.ptrl("Coder Settings"), false) {
+    CoderPage(MutableStateFlow(context.i18n.ptrl("Coder Settings")), false) {
     private val settings = context.settingsStore.readOnly()
 
     // TODO: Copy over the descriptions, holding until I can test this page.
diff --git a/src/main/kotlin/com/coder/toolbox/views/NewEnvironmentPage.kt b/src/main/kotlin/com/coder/toolbox/views/NewEnvironmentPage.kt
index 83e07c7..cde23b2 100644
--- a/src/main/kotlin/com/coder/toolbox/views/NewEnvironmentPage.kt
+++ b/src/main/kotlin/com/coder/toolbox/views/NewEnvironmentPage.kt
@@ -1,6 +1,5 @@
 package com.coder.toolbox.views
 
-import com.coder.toolbox.CoderToolboxContext
 import com.jetbrains.toolbox.api.localization.LocalizableString
 import com.jetbrains.toolbox.api.ui.components.UiField
 import kotlinx.coroutines.flow.MutableStateFlow
@@ -14,7 +13,7 @@ import kotlinx.coroutines.flow.StateFlow
  * For now we just use this to display the deployment URL since we do not
  * support creating environments from the plugin.
  */
-class NewEnvironmentPage(context: CoderToolboxContext, deploymentURL: LocalizableString) :
-    CoderPage(deploymentURL) {
+class NewEnvironmentPage(deploymentURL: LocalizableString) :
+    CoderPage(MutableStateFlow(deploymentURL)) {
     override val fields: StateFlow<List<UiField>> = MutableStateFlow(emptyList())
 }
diff --git a/src/test/kotlin/com/coder/toolbox/sdk/CoderRestClientTest.kt b/src/test/kotlin/com/coder/toolbox/sdk/CoderRestClientTest.kt
index 2727228..c42ead2 100644
--- a/src/test/kotlin/com/coder/toolbox/sdk/CoderRestClientTest.kt
+++ b/src/test/kotlin/com/coder/toolbox/sdk/CoderRestClientTest.kt
@@ -24,6 +24,7 @@ import com.jetbrains.toolbox.api.core.diagnostics.Logger
 import com.jetbrains.toolbox.api.core.os.LocalDesktopManager
 import com.jetbrains.toolbox.api.localization.LocalizableStringFactory
 import com.jetbrains.toolbox.api.remoteDev.connection.ClientHelper
+import com.jetbrains.toolbox.api.remoteDev.connection.ProxyAuth
 import com.jetbrains.toolbox.api.remoteDev.connection.RemoteToolsHelper
 import com.jetbrains.toolbox.api.remoteDev.connection.ToolboxProxySettings
 import com.jetbrains.toolbox.api.remoteDev.states.EnvironmentStateColorPalette
@@ -114,6 +115,8 @@ class CoderRestClientTest {
         object : ToolboxProxySettings {
             override fun getProxy(): Proxy? = null
             override fun getProxySelector(): ProxySelector? = null
+            override fun getProxyAuth(): ProxyAuth? = null
+
             override fun addProxyChangeListener(listener: Runnable) {
             }
 
@@ -579,6 +582,7 @@ class CoderRestClientTest {
                         }
                     }
 
+                    override fun getProxyAuth(): ProxyAuth? = null
                     override fun addProxyChangeListener(listener: Runnable) {
                     }