diff --git a/jsc_custom/handler/share_handler.py b/jsc_custom/handler/share_handler.py
index 883003efa39dbd6b3a256c8c9789ebc1d8f784c8..d289d08c19ae0fb81451a103b4259efeb59e05bd 100644
--- a/jsc_custom/handler/share_handler.py
+++ b/jsc_custom/handler/share_handler.py
@@ -32,6 +32,59 @@ class ShareUserOptionsSpawnHandler(SpawnHandler):
             "home.html", for_user=for_user, auth_state=auth_state, row=server_name
         )
 
+    def upgrade_user_options(self, user_options):
+        # In the past we had a different structure for our share user options
+        # To support old share links, we have to upgrade them to the newest structure
+        if user_options.get("profile", "").startswith("JupyterLab/"):
+            name = user_options.get("name", "Unnamed")
+            option_dict = {
+                "JupyterLab/repo2docker": "repo2docker",
+                "JupyterLab/custom": "custom",
+            }
+            profile = option = option_dict.get(user_options.get("profile", ""))
+            service = "jupyterlab"
+            secret_keys = []
+            system = user_options.get("system", "unknown")
+            flavor = user_options.get("flavor", None)
+            r2dnotebooktype = user_options.get("notebook_type", "file")
+            r2drepo = user_options.get("repo", None)
+            if r2drepo and r2drepo.startswith("https://github.com/"):
+                r2dtype = "gh"
+                r2drepo = r2drepo[len("https://github.com/") :]
+            else:
+                r2dtype = "git"
+            r2dgitref = user_options.get("gitref", "")
+            r2dnotebook = user_options.get("notebook", None)
+            ret = {
+                "name": name,
+                "service": service,
+                "option": option,
+                "profile": profile,
+                "system": system,
+                "secrets": secret_keys,
+            }
+            if flavor:
+                ret["flavor"] = flavor
+            if r2drepo:
+                ret["repo2docker"] = {
+                    "repotype": r2dtype,
+                    "repourl": r2drepo,
+                    "reporef": r2dgitref,
+                }
+                if r2dnotebook:
+                    ret["repo2docker"]["repopath"] = r2dnotebook
+                    ret["repo2docker"]["repopathtype"] = r2dnotebooktype
+
+            image = user_options.get("image", None)
+            if image:
+                ret["custom"] = {"customimage": image}
+            userdata_path = user_options.get("userdata_path", None)
+            if userdata_path:
+                ret["storage"] = {"localstoragepath": userdata_path}
+            return True, ret
+        else:
+            return False, user_options
+
     @web.authenticated
     async def get(self, secret):
         user = self.current_user
@@ -52,8 +105,12 @@ class ShareUserOptionsSpawnHandler(SpawnHandler):
             server_name = generate_random_id()
 
         spawner = user.get_spawner(server_name, replace_failed=True)
-
-        spawner.user_options = db_entry.user_options
+        upgrade, user_options = self.upgrade_user_options(db_entry.user_options)
+        if upgrade:
+            db_entry.user_options = user_options
+            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