diff --git a/CHANGELOG.md b/CHANGELOG.md
index 92478a24..5085e058 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,17 +11,16 @@ All notable changes to this project will be documented in this file. For commit
 
  **New Features**:
  - New access control system that works like shares. You can add new allow / deny rules for users/groups for specific paths on specific sources.
- #- The concept of 'groups', either automatically from OIDC groups claim or defined https://github.com/gtsteffaniak/filebrowser/issues/545
+ - The concept of 'groups', either automatically from OIDC groups claim or defined https://github.com/gtsteffaniak/filebrowser/issues/545
  - share view changes -- now aligns with the standard listing view. This means files can be viewed and edited (if permission allows) just like a normal listing.
  - many share links customization enhancements
-   #- only share to certain authenticated users https://github.com/gtsteffaniak/filebrowser/issues/656 https://github.com/gtsteffaniak/filebrowser/issues/985
-   #- one-time download links
-   #- customize share theme, banner image, and icons https://github.com/gtsteffaniak/filebrowser/issues/827 https://github.com/gtsteffaniak/filebrowser/issues/1029
-   #- share link info customization https://github.com/gtsteffaniak/filebrowser/issues/792 https://github.com/gtsteffaniak/filebrowser/issues/841 https://github.com/gtsteffaniak/filebrowser/issues/520
-   #- "shared with me" and "share history" https://github.com/gtsteffaniak/filebrowser/issues/943
+   - only share to certain authenticated users https://github.com/gtsteffaniak/filebrowser/issues/656 https://github.com/gtsteffaniak/filebrowser/issues/985
+   - one-time download links
+   - customize share theme, banner image, and icons https://github.com/gtsteffaniak/filebrowser/issues/827 https://github.com/gtsteffaniak/filebrowser/issues/1029
+   - share link info customization https://github.com/gtsteffaniak/filebrowser/issues/792 https://github.com/gtsteffaniak/filebrowser/issues/841 https://github.com/gtsteffaniak/filebrowser/issues/520
+   - "shared with me" and "share history" https://github.com/gtsteffaniak/filebrowser/issues/943
    - upload to share links https://github.com/gtsteffaniak/filebrowser/issues/661
    - share link public changes https://github.com/gtsteffaniak/filebrowser/issues/473
-   - 
  - public/private folder logic https://github.com/gtsteffaniak/filebrowser/issues/505
 
  **BugFixes**:
diff --git a/backend/http/middleware.go b/backend/http/middleware.go
index 5ba397fe..595f00e1 100644
--- a/backend/http/middleware.go
+++ b/backend/http/middleware.go
@@ -6,7 +6,6 @@ import (
 	"encoding/json"
 	"fmt"
 	"net/http"
-	"net/url"
 	"runtime"
 	"strings"
 	"time"
@@ -44,14 +43,8 @@ type handleFunc func(w http.ResponseWriter, r *http.Request, data *requestContex
 // Middleware to handle file requests by hash and pass it to the handler
 func withHashFileHelper(fn handleFunc) handleFunc {
 	return withOrWithoutUserHelper(func(w http.ResponseWriter, r *http.Request, data *requestContext) (int, error) {
+		path := r.URL.Query().Get("path")
 		hash := r.URL.Query().Get("hash")
-		encodedPath := r.URL.Query().Get("path")
-		// Decode the URL-encoded path
-		path, err := url.QueryUnescape(encodedPath)
-		if err != nil {
-			return http.StatusBadRequest, fmt.Errorf("invalid path encoding: %v", err)
-		}
-		data.path = path
 		// Get the file link by hash
 		link, err := store.Share.GetByHash(hash)
 		if err != nil {
@@ -71,6 +64,11 @@ func withHashFileHelper(fn handleFunc) handleFunc {
 				return status, fmt.Errorf("could not authenticate share request")
 			}
 		}
+		data.path = strings.TrimSuffix(link.Path, "/") + "/" + strings.TrimPrefix(path, "/")
+		if path == "" || path == "/" {
+			data.path = link.Path
+		}
+
 		source, ok := config.Server.SourceMap[link.Source]
 		if !ok {
 			return http.StatusNotFound, fmt.Errorf("source not found")
diff --git a/backend/http/middleware_test.go b/backend/http/middleware_test.go
index ff7c173e..eb257951 100644
--- a/backend/http/middleware_test.go
+++ b/backend/http/middleware_test.go
@@ -155,20 +155,6 @@ func TestPublicShareHandlerAuthentication(t *testing.T) {
 			},
 			expectedStatusCode: 0, // zero means 200 on helpers
 		},
-		{
-			name: "Private share, valid password when token exists",
-			share: &share.Link{
-				Hash:         "pw_and_token_hash",
-				UserID:       1,
-				PasswordHash: passwordBcrypt,
-				Token:        "some_random_token",
-				Source:       "/srv",
-			},
-			extraHeaders: map[string]string{
-				"X-SHARE-PASSWORD": "password",
-			},
-			expectedStatusCode: 0, // zero means 200 on helpers
-		},
 		{
 			name: "Private share, no auth provided",
 			share: &share.Link{
diff --git a/backend/http/public.go b/backend/http/public.go
index ef65dfa6..0e641fbd 100644
--- a/backend/http/public.go
+++ b/backend/http/public.go
@@ -7,6 +7,9 @@ import (
 	"net/url"
 	"strings"
 
+	"github.com/gtsteffaniak/filebrowser/backend/adapters/fs/files"
+	"github.com/gtsteffaniak/filebrowser/backend/common/utils"
+	"github.com/gtsteffaniak/filebrowser/backend/indexing/iteminfo"
 	"github.com/gtsteffaniak/go-logger/logger"
 
 	_ "github.com/gtsteffaniak/filebrowser/backend/swagger/docs"
@@ -49,7 +52,7 @@ func publicRawHandler(w http.ResponseWriter, r *http.Request, d *requestContext)
 }
 
 func publicShareHandler(w http.ResponseWriter, r *http.Request, d *requestContext) (int, error) {
-	d.fileInfo.Path = "/" + strings.TrimPrefix(d.fileInfo.Path, d.share.Path)
+	d.fileInfo.Path = strings.TrimPrefix(d.fileInfo.Path, d.share.Path)
 	return renderJSON(w, r, d.fileInfo)
 }
 
@@ -91,5 +94,24 @@ func publicPreviewHandler(w http.ResponseWriter, r *http.Request, d *requestCont
 	if config.Server.DisablePreviews {
 		return http.StatusNotImplemented, fmt.Errorf("preview is disabled")
 	}
+	path := r.URL.Query().Get("path")
+	var err error
+	if path == "" {
+		return http.StatusBadRequest, fmt.Errorf("invalid request path")
+	}
+	fileInfo, err := files.FileInfoFaster(iteminfo.FileOptions{
+		Path:   utils.JoinPathAsUnix(d.share.Path, path),
+		Modify: false, // TODO make this configurable
+		Source: d.fileInfo.Source,
+		Expand: true,
+	})
+	if err != nil {
+		logger.Debugf("public preview handler: error getting file info: %v", err)
+		return 400, fmt.Errorf("file not found")
+	}
+	if fileInfo.Type == "directory" {
+		return http.StatusBadRequest, fmt.Errorf("can't create preview for directory")
+	}
+	d.fileInfo = fileInfo
 	return previewHelperFunc(w, r, d)
 }
diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js
index 9399a292..2ef5f38e 100644
--- a/frontend/src/api/index.js
+++ b/frontend/src/api/index.js
@@ -7,3 +7,6 @@ import search from "./search";
 
 // Note: shareApi has been consolidated into publicApi
 export { filesApi, publicApi, usersApi, settingsApi, search, accessApi };
+
+// For backward compatibility, export publicApi as shareApi as well
+export { publicApi as shareApi };
diff --git a/frontend/src/api/public.js b/frontend/src/api/public.js
index 1dcb4125..d94713c5 100644
--- a/frontend/src/api/public.js
+++ b/frontend/src/api/public.js
@@ -2,7 +2,6 @@ import { fetchURL, fetchJSON, adjustedData } from "./utils";
 import { notify } from "@/notify";
 import { getApiPath, removePrefix } from "@/utils/url.js";
 import { externalUrl, baseURL } from "@/utils/constants";
-import { state } from "@/store";
 
 // ============================================================================
 // PUBLIC API ENDPOINTS (hash-based authentication)
@@ -13,8 +12,7 @@ export async function fetchPub(path, hash, password = "", content = false) {
   const params = {
     path,
     hash,
-    ...(content && { content: 'true' }),
-    ...(state.share.token && { token: state.share.token })
+    ...(content && { content: 'true' })
   }
   const apiPath = getApiPath("public/api/shared", params);
   const response = await fetch(apiPath, {
@@ -24,17 +22,7 @@ export async function fetchPub(path, hash, password = "", content = false) {
   });
 
   if (!response.ok) {
-    const error = new Error(response.statusText);
-    // attempt to marshal json response
-    let data = null;
-    try {
-      data = await response.json()
-    } catch (e) {
-      // ignore
-    }
-    if (data) {
-      error.message = data.message;
-    }
+    const error = new Error("Failed to connect to the server.");
     error.status = response.status;
     throw error;
   }
@@ -57,14 +45,13 @@ export function getDownloadURL(share, files) {
 }
 
 // Generate a preview URL for public shares
-export function getPreviewURL(path) {
+export function getPreviewURL(hash, path) {
   try {
     const params = {
       path: encodeURIComponent(path),
       size: 'small',
-      hash: state.share.hash,
-      inline: 'true',
-      ...(state.share.token && { token: state.share.token })
+      hash: hash,
+      inline: 'true'
     }
     const apiPath = getApiPath('public/api/preview', params)
     return window.origin + apiPath
diff --git a/frontend/src/api/share.js b/frontend/src/api/share.js
new file mode 100644
index 00000000..729b7599
--- /dev/null
+++ b/frontend/src/api/share.js
@@ -0,0 +1,66 @@
+import { fetchURL, fetchJSON, adjustedData } from "./utils";
+import { notify } from "@/notify";
+import { getApiPath } from "@/utils/url.js";
+import { externalUrl } from "@/utils/constants";
+
+export async function list() {
+  const apiPath = getApiPath("api/shares");
+  return fetchJSON(apiPath);
+}
+
+export async function get(path, source) {
+  try {
+    const params = { path: encodeURIComponent(path), source: encodeURIComponent(source) };
+    const apiPath = getApiPath("api/share",params);
+    let data = fetchJSON(apiPath);
+    return adjustedData(data, path);
+  } catch (err) {
+    notify.showError(err.message || "Error fetching data");
+    throw err;
+  }
+}
+
+export async function remove(hash) {
+  const params = { hash };
+  const apiPath = getApiPath("api/share",params);
+  await fetchURL(apiPath, {
+    method: "DELETE",
+  });
+}
+
+export async function create(path, source, password = "", expires = "", unit = "hours") {
+  const params = { path: encodeURIComponent(path), source: encodeURIComponent(source) };
+  const apiPath = getApiPath("api/share",params);
+  let body = "{}";
+  if (password != "" || expires !== "" || unit !== "hours") {
+    body = JSON.stringify({ password: password, expires: expires, unit: unit });
+  }
+  return fetchJSON(apiPath, {
+    method: "POST",
+    body: body,
+  });
+}
+
+export function getShareURL(share) {
+  if (externalUrl) {
+    const apiPath = getApiPath(`share/${share.hash}`)
+    return externalUrl + apiPath
+  }
+  return window.origin+getApiPath(`share/${share.hash}`);
+}
+
+export function getPreviewURL(hash, path) {
+  try {
+    const params = {
+      path: encodeURIComponent(path),
+      size: 'small',
+      hash: hash,
+      inline: 'true'
+    }
+    const apiPath = getApiPath('api/public/preview', params)
+    return window.origin + apiPath
+  } catch (err) {
+    notify.showError(err.message || 'Error getting preview URL')
+    throw err
+  }
+}
diff --git a/frontend/src/components/files/ListingItem.vue b/frontend/src/components/files/ListingItem.vue
index 29c2749f..93848c1c 100644
--- a/frontend/src/components/files/ListingItem.vue
+++ b/frontend/src/components/files/ListingItem.vue
@@ -67,7 +67,7 @@ import { enableThumbs } from "@/utils/constants";
 import downloadFiles from "@/utils/download";
 
 import { getHumanReadableFilesize } from "@/utils/filesizes";
-import { filesApi,publicApi } from "@/api";
+import { filesApi, shareApi } from "@/api";
 import * as upload from "@/utils/upload";
 import { state, getters, mutations } from "@/store"; // Import your custom store
 import { url } from "@/utils";
@@ -162,8 +162,8 @@ export default {
       // @ts-ignore
       let path = url.removeTrailingSlash(state.req.path) + "/" + this.name;
       if (getters.isShare()) {
-        let urlPath = getters.getSharePath(this.name) ;
-        return publicApi.getPreviewURL(urlPath);
+        let urlPath = getters.getSharePath() + "/" + this.name;
+        return shareApi.getPreviewURL(state.share.hash, urlPath, state.req.modified);
       }
       // @ts-ignore
       return filesApi.getPreviewURL(state.req.source, path, this.modified);
@@ -226,7 +226,7 @@ export default {
     },
     getUrl() {
       if (this.hash) {
-        return baseURL + "public/share/" + this.hash + "/" + url.encodedPath(this.path);
+        return baseURL + "share/" + this.hash + url.encodedPath(this.path);
       }
       if (serverHasMultipleSources) {
         return baseURL + "files/" + encodeURIComponent(this.source) + url.encodedPath(this.path);
diff --git a/frontend/src/components/prompts/ActionApi.vue b/frontend/src/components/prompts/ActionApi.vue
index f2ebaa3f..1a381565 100644
--- a/frontend/src/components/prompts/ActionApi.vue
+++ b/frontend/src/components/prompts/ActionApi.vue
@@ -90,3 +90,20 @@ export default {
   },
 };
 </script>
+
+<style>
+/* Basic styling for the prompt */
+.card.floating {
+  padding: 20px;
+}
+.card-content {
+  margin-bottom: 16px;
+}
+.card-action {
+  display: flex;
+  justify-content: flex-end;
+}
+.card-action .button {
+  margin-left: 8px;
+}
+</style>
diff --git a/frontend/src/components/prompts/Share.vue b/frontend/src/components/prompts/Share.vue
index be1ad5ad..8689100d 100644
--- a/frontend/src/components/prompts/Share.vue
+++ b/frontend/src/components/prompts/Share.vue
@@ -2,11 +2,10 @@
   <div class="card-title">
     <h2>{{ $t("buttons.share") }}</h2>
   </div>
-  <div class="card-content">
-    <div aria-label="share-path" class="searchContext"> {{ $t('search.path') }} {{ subpath }}</div>
-    <p> {{ $t('share.notice') }} </p>
-
-    <div v-if="listing">
+  <div aria-label="share-path" class="searchContext"> {{ $t('search.path') }} {{ subpath }}</div>
+  <p> {{ $t('share.notice') }} </p>
+  <template v-if="listing">
+    <div class="card-content">
       <table>
         <tbody>
           <tr>
@@ -46,7 +45,20 @@
       </table>
     </div>
 
-    <div v-else>
+    <div class="card-action">
+      <button class="button button--flat button--grey" @click="closeHovers" :aria-label="$t('buttons.close')"
+        :title="$t('buttons.close')">
+        {{ $t("buttons.close") }}
+      </button>
+      <button class="button button--flat button--blue" @click="() => switchListing()" :aria-label="$t('buttons.new')"
+        :title="$t('buttons.new')">
+        {{ $t("buttons.new") }}
+      </button>
+    </div>
+  </template>
+
+  <template v-else>
+    <div class="card-content">
       <p>{{ $t("settings.shareDuration") }}</p>
       <div class="form-flex-group">
         <input class="form-grow input flat-right" v-focus type="number" max="2147483647" min="1" @keyup.enter="submit" v-model.trim="time" />
@@ -58,7 +70,7 @@
         </select>
       </div>
       <p>{{ $t("prompts.optionalPassword") }}</p>
-      <input class="input" type="password" autocomplete="off" v-model.trim="password" />
+      <input class="input" type="password" v-model.trim="password" />
 
       <div class="settings-items">
         <ToggleSwitch class="item" v-model="readOnly" :name="'Read-only access'" />
@@ -80,32 +92,23 @@
         </select>
       </div>
     </div>
-  </div>
 
-  <div class="card-action">
-    <button v-if="listing" class="button button--flat button--grey" @click="closeHovers" :aria-label="$t('buttons.close')"
-      :title="$t('buttons.close')">
-      {{ $t("buttons.close") }}
-    </button>
-    <button v-if="listing" class="button button--flat button--blue" @click="() => switchListing()" :aria-label="$t('buttons.new')"
-      :title="$t('buttons.new')">
-      {{ $t("buttons.new") }}
-    </button>
-
-    <button v-if="!listing" class="button button--flat button--grey" @click="() => switchListing()" :aria-label="$t('buttons.cancel')"
-      :title="$t('buttons.cancel')">
-      {{ $t("buttons.cancel") }}
-    </button>
-    <button v-if="!listing" class="button button--flat button--blue" @click="submit" aria-label="Share-Confirm"
-      :title="$t('buttons.share')">
-      {{ $t("buttons.share") }}
-    </button>
-  </div>
+    <div class="card-action">
+      <button class="button button--flat button--grey" @click="() => switchListing()" :aria-label="$t('buttons.cancel')"
+        :title="$t('buttons.cancel')">
+        {{ $t("buttons.cancel") }}
+      </button>
+      <button class="button button--flat button--blue" @click="submit" aria-label="Share-Confirm"
+        :title="$t('buttons.share')">
+        {{ $t("buttons.share") }}
+      </button>
+    </div>
+  </template>
 </template>
 <script>
 import { notify } from "@/notify";
 import { state, getters, mutations } from "@/store";
-import { publicApi } from "@/api";
+import { shareApi, publicApi } from "@/api";
 import Clipboard from "clipboard";
 import { fromNow } from "@/utils/moment";
 import { buildItemUrl } from "@/utils/url";
@@ -188,7 +191,7 @@ export default {
 
     try {
       // get last element of the path
-      const links = await publicApi.get(this.subpath, this.source);
+      const links = await shareApi.get(this.subpath, this.source);
       this.links = links;
     } catch (err) {
       notify.showError(err);
@@ -215,9 +218,9 @@ export default {
         let isPermanent = !this.time || this.time == 0;
         let res = null;
         if (isPermanent) {
-          res = await publicApi.create(this.subpath, this.source, this.password);
+          res = await shareApi.create(this.subpath, this.source, this.password);
         } else {
-          res = await publicApi.create(
+          res = await shareApi.create(
             this.subpath,
             this.source,
             this.password,
@@ -241,7 +244,7 @@ export default {
     async deleteLink(event, link) {
       event.preventDefault();
       try {
-        await publicApi.remove(link.hash);
+        await shareApi.remove(link.hash);
         this.links = this.links.filter((item) => item.hash !== link.hash);
         if (this.links.length === 0) {
           this.listing = false;
@@ -254,7 +257,7 @@ export default {
       return fromNow(time, state.user.locale)
     },
     buildLink(share) {
-      return publicApi.getShareURL(share);
+      return shareApi.getShareURL(share);
     },
     hasDownloadLink() {
       if (state.isSearchActive) {
diff --git a/frontend/src/components/sidebar/General.vue b/frontend/src/components/sidebar/General.vue
index 58f02c10..0e030aeb 100644
--- a/frontend/src/components/sidebar/General.vue
+++ b/frontend/src/components/sidebar/General.vue
@@ -159,7 +159,7 @@ export default {
     isStickySidebar: () => getters.isStickySidebar(),
     isMobile: () => getters.isMobile(),
     isListingView: () => getters.currentView() == "listingView",
-    user: () => (state.user),
+    user: () => (console.log(state.user), state.user),
     isDarkMode: () => getters.isDarkMode(),
     showSources: () => !getters.isShare(),
     currentPrompt: () => getters.currentPrompt(),
diff --git a/frontend/src/css/dashboard.css b/frontend/src/css/dashboard.css
index 2e1fbc8f..77da5938 100644
--- a/frontend/src/css/dashboard.css
+++ b/frontend/src/css/dashboard.css
@@ -226,10 +226,6 @@ body.rtl .card-title>*:first-child {
   overflow: auto;
 }
 
-.card-content h3 {
-  text-align: center;
-}
-
 .card h2 {
   font-weight: 500;
 }
diff --git a/frontend/src/store/getters.js b/frontend/src/store/getters.js
index cb062702..d97e7eed 100644
--- a/frontend/src/store/getters.js
+++ b/frontend/src/store/getters.js
@@ -201,9 +201,10 @@ export const getters = {
   sharePathBase: () => {
     return '/public/share/' + getters.shareHash() + '/'
   },
-  getSharePath: (subPath = "") => {
+  getSharePath: () => {
     let urlPath = getters.routePath('public/share')
-    return "/" + removeLeadingSlash(urlPath.split(state.share.hash)[1]) + "/" + subPath
+    let parts = urlPath.split('/')
+    return "/" + removeLeadingSlash(parts.slice(2).join('/'))
   },
   currentView: () => {
     let listingView = ''
@@ -288,6 +289,7 @@ export const getters = {
   },
 
   currentPromptName: () => {
+    console.log("currentPromptName", state.prompts);
     // Ensure state.prompts is an array
     if (!Array.isArray(state.prompts) || state.prompts.length === 0) {
       return ""
diff --git a/frontend/src/store/mutations.js b/frontend/src/store/mutations.js
index 8dc0b19f..b2b13461 100644
--- a/frontend/src/store/mutations.js
+++ b/frontend/src/store/mutations.js
@@ -191,6 +191,7 @@ export const mutations = {
     emitStateChanged();
   },
   showHover: (value) => {
+    console.log("showHover", value);
     if (typeof value === "object") {
       state.prompts.push({
         name: value?.name,
@@ -206,6 +207,7 @@ export const mutations = {
         props: value?.props,
       });
     }
+    console.log("showHover", state.prompts);
     emitStateChanged();
   },
   setLoading: (loadType, status) => {
@@ -221,6 +223,7 @@ export const mutations = {
     emitStateChanged();
   },
   setCurrentUser: (value) => {
+    console.log('setCurrentUser', value);
     try {
       // If value is null or undefined, emit state change and exit early
       if (!value) {
@@ -243,6 +246,7 @@ export const mutations = {
     } catch (error) {
       console.log(error);
     }
+    console.log('setCurrentUser', state.user);
     emitStateChanged();
   },
   setJWT: (value) => {
@@ -303,6 +307,7 @@ export const mutations = {
     if (!state.user) {
       state.user = {};
     }
+    console.log('updateCurrentUser', value);
     // Store previous state for comparison
     const previousUser = { ...state.user };
 
@@ -315,12 +320,14 @@ export const mutations = {
       i18n.default.locale = state.user.locale;
       localStorage.setItem("userLocale", state.user.locale);
     }
+    console.log('updateCurrentUser2', state.user);
     // Update localStorage if stickySidebar exists
     if (state.user.stickySidebar && getters.currentView() == "listingView") {
       state.multiButtonState = "menu";
     } else if (state.showSidebar) {
       state.multiButtonState = "back";
     }
+    console.log('updateCurrentUser3', state.user);
     // Update users if there's any change in state.user
     if (JSON.stringify(state.user) !== JSON.stringify(previousUser)) {
       // Only update the properties that were actually provided in the input
diff --git a/frontend/src/views/Files.vue b/frontend/src/views/Files.vue
index 4c69ecd7..6f8b892b 100644
--- a/frontend/src/views/Files.vue
+++ b/frontend/src/views/Files.vue
@@ -9,9 +9,8 @@
       <div class="card-title">
         <h2>{{ $t("general.password") }}</h2>
       </div>
-      <div class="card-content form-flex-group">
+      <div class="card-content">
         <input
-          class="input share-password"
           v-focus
           type="password"
           :placeholder="$t('general.password')"
@@ -149,10 +148,8 @@ export default {
           });
           // Add glow effect
           element.classList.add('scroll-glow');
-          console.log("scrollToHash", element)
           // Remove glow effect after animation completes
           setTimeout(() => {
-            console.log("scrollToHash remove glow", element)
             element.classList.remove('scroll-glow');
           }, 1000);
         }
@@ -211,15 +208,19 @@ export default {
       this.shareHash = parts[1]
       this.shareSubPath = "/" + parts.slice(2).join("/");
 
+      // Store share data in state for use by components
+      mutations.setShareData({
+        hash: this.shareHash,
+        token: this.shareToken,
+        subPath: this.shareSubPath,
+      });
+
       // Handle password
-      if (this.sharePassword === "") {
+      if (this.sharePassword === "" || this.sharePassword === null) {
         this.sharePassword = localStorage.getItem("sharepass:" + this.shareHash);
       } else {
         localStorage.setItem("sharepass:" + this.shareHash, this.sharePassword);
       }
-      if (this.sharePassword === null) {
-        this.sharePassword = "";
-      }
 
       mutations.resetSelected();
       mutations.setMultiple(false);
@@ -229,15 +230,11 @@ export default {
       let file = await publicApi.fetchPub(this.shareSubPath, this.shareHash, this.sharePassword);
       file.hash = this.shareHash;
       this.shareToken = file.token;
-      // Store share data in state for use by components
-      mutations.setShareData({
-        hash: this.shareHash,
-        token: this.shareToken,
-        subPath: this.shareSubPath,
-      });
+
       // If not a directory, fetch content for preview components
       if (file.type != "directory") {
         const content = !getters.fileViewingDisabled(file.name);
+
         file = await publicApi.fetchPub(this.shareSubPath, this.shareHash, this.sharePassword, content);
         file.hash = this.shareHash;
         this.shareToken = file.token;
@@ -324,7 +321,7 @@ export default {
 };
 </script>
 
-<style>
+<style scoped>
 .share__wrong__password {
   color: #ff4757;
   text-align: center;
@@ -351,8 +348,4 @@ export default {
     color: inherit;
   }
 }
-
-.share-password {
-  width: 100%;
-}
 </style>
diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue
index 4547e3d2..38d75dc1 100644
--- a/frontend/src/views/Settings.vue
+++ b/frontend/src/views/Settings.vue
@@ -122,4 +122,7 @@ export default {
   background-color: var(--surfaceSecondary);
 }
 
+.card-content {
+  padding: 1em;
+}
 </style>
diff --git a/frontend/src/views/settings/Profile.vue b/frontend/src/views/settings/Profile.vue
index f65fe30f..e34e405a 100644
--- a/frontend/src/views/settings/Profile.vue
+++ b/frontend/src/views/settings/Profile.vue
@@ -428,6 +428,9 @@ export default {
 </script>
 
 <style scoped>
+.card-content h3 {
+  text-align: center;
+}
 
 #disablePreviews,
 #disableViewing,
diff --git a/frontend/src/views/settings/Shares.vue b/frontend/src/views/settings/Shares.vue
index cd28af70..6d39166e 100644
--- a/frontend/src/views/settings/Shares.vue
+++ b/frontend/src/views/settings/Shares.vue
@@ -49,7 +49,7 @@
 
 <script>
 import { notify } from "@/notify";
-import { publicApi } from "@/api";
+import { shareApi } from "@/api";
 import { state, mutations, getters } from "@/store";
 import Clipboard from "clipboard";
 import Errors from "@/views/Errors.vue";
@@ -70,7 +70,7 @@ export default {
   async created() {
     mutations.setLoading("shares", true);
     try {
-      let links = await publicApi.list();
+      let links = await shareApi.list();
       if (links.length === 0) {
         this.links = [];
         return;
@@ -115,7 +115,7 @@ export default {
           mutations.closeHovers();
 
           try {
-            publicApi.remove(link.hash);
+            shareApi.remove(link.hash);
             this.links = this.links.filter((item) => item.hash !== link.hash);
             notify.showSuccess(this.$t("settings.shareDeleted"));
           } catch (e) {
@@ -128,7 +128,7 @@ export default {
       return fromNow(time);
     },
     buildLink(share) {
-      return publicApi.getShareURL(share);
+      return shareApi.getShareURL(share);
     },
   },
 };
