diff --git a/jsc_custom/handler/share_handler.py b/jsc_custom/handler/share_handler.py
index f8a0b5047dd98dd72a611c3235ab2d87132de3d6..ff7d0d9ea6cad8f12f77f9d508af41a95928e909 100644
--- a/jsc_custom/handler/share_handler.py
+++ b/jsc_custom/handler/share_handler.py
@@ -111,14 +111,13 @@ class ShareUserOptionsSpawnHandler(SpawnHandler):
             self.db.add(db_entry)
             self.db.commit()
         spawner.user_options = user_options
-        service = db_entry.user_options.get("service", "jupyterlab")
         spawner.user_options["share_id"] = secret
         spawner.orm_spawner.user_options = db_entry.user_options
         self.db.add(spawner.orm_spawner)
         self.db.commit()
 
-        url = url_path_join(self.hub.base_url, "home")
-        self.redirect(f"{url}?service={service}&row={spawner.name}")
+        url = url_path_join(self.hub.base_url, "start", user.name, spawner.name)
+        self.redirect(url)
 
 
 class R2DHandler(SpawnHandler):
@@ -229,10 +228,8 @@ class R2DHandler(SpawnHandler):
         self.db.add(spawner.orm_spawner)
         self.db.commit()
 
-        url = url_path_join(self.hub.base_url, "home")
-        self.redirect(
-            f"{url}?service={user_options.get('service', 'jupyterlab')}&row={spawner.name}&start"
-        )
+        url = url_path_join(self.hub.base_url, "start", user.name, spawner.name)
+        self.redirect(url)
 
 
 default_handlers.append((r"/share/user_options/([^/]+)", ShareUserOptionsSpawnHandler))
diff --git a/jsc_custom/handler/workshop_manage.py b/jsc_custom/handler/workshop_manage.py
index d3b45aafc4cad6b01f0b3bd2e6be96ac525c625d..29b54fbe8fe0f3bbcf6fbb38f0ebe64020587067 100644
--- a/jsc_custom/handler/workshop_manage.py
+++ b/jsc_custom/handler/workshop_manage.py
@@ -118,5 +118,71 @@ class WorkshopHandler(SpawnHandler):
         self.finish(form)
 
 
+class StartHandler(SpawnHandler):
+    async def _render_form(self, for_user, spawner):
+        url = url_path_join(self.base_url, "user", for_user.escaped_name, spawner.name)
+        auth_state = await for_user.get_auth_state()
+        return await self.render_template(
+            "start.html",
+            for_user=for_user,
+            auth_state=auth_state,
+            spawner=spawner,
+            url=url,
+        )
+
+    @web.authenticated
+    async def get(self, user_name, server_name=""):
+        for_user = user_name
+
+        user = self.current_user
+        if for_user != user.name:
+            user = self.find_user(for_user)
+            if user is None:
+                raise web.HTTPError(404, f"No such user: {for_user}")
+
+        if server_name:
+            if not self.allow_named_servers:
+                raise web.HTTPError(400, "Named servers are not enabled.")
+
+            named_server_limit_per_user = (
+                await self.get_current_user_named_server_limit()
+            )
+
+            if named_server_limit_per_user > 0 and server_name not in user.orm_spawners:
+                named_spawners = list(user.all_spawners(include_default=False))
+                if named_server_limit_per_user <= len(named_spawners):
+                    raise web.HTTPError(
+                        400,
+                        f"User {user.name} already has the maximum of {named_server_limit_per_user} named servers."
+                        "  One must be deleted before a new server can be created",
+                    )
+
+        if not self.allow_named_servers and user.running:
+            url = self.get_next_url(user, default=user.server_url(""))
+            self.log.info("User is running: %s", user.name)
+            self.redirect(url)
+            return
+
+        spawner = user.get_spawner(server_name, replace_failed=True)
+        self.db.refresh(spawner.orm_spawner)
+
+        # spawner is active, redirect back to get progress, etc.
+        if spawner.ready:
+            self.log.info("Server %s is already running", spawner._log_name)
+            next_url = self.get_next_url(user, default=user.server_url(server_name))
+            self.redirect(next_url)
+            return
+
+        elif spawner.active:
+            pending_url = self._get_pending_url(user, server_name)
+            self.log.info("Server %s is already active", spawner._log_name)
+            self.redirect(pending_url)
+            return
+
+        form = await self._render_form(user, spawner=spawner.orm_spawner)
+        self.finish(form)
+
+
 default_handlers.append((r"/workshopmanager", WorkshopManageHandler))
 default_handlers.append((r"/workshops/([^/]+)", WorkshopHandler))
+default_handlers.append((r"/start/([^/]+)/([^/]+)", StartHandler))