diff --git a/server/apps/immich/src/api-v1/album/album-repository.ts b/server/apps/immich/src/api-v1/album/album-repository.ts
index 6336a257..4c489072 100644
--- a/server/apps/immich/src/api-v1/album/album-repository.ts
+++ b/server/apps/immich/src/api-v1/album/album-repository.ts
@@ -164,6 +164,7 @@ export class AlbumRepository implements IAlbumRepository {
       .leftJoinAndSelect('sharedUser.userInfo', 'userInfo')
       .leftJoinAndSelect('album.assets', 'assets')
       .leftJoinAndSelect('assets.assetInfo', 'assetInfo')
+      .leftJoinAndSelect('assetInfo.exifInfo', 'exifInfo')
       .orderBy('"assetInfo"."createdAt"::timestamptz', 'ASC')
       .getOne();
 
diff --git a/web/src/lib/components/album-page/album-viewer.svelte b/web/src/lib/components/album-page/album-viewer.svelte
index 908f9cb0..c78dd649 100644
--- a/web/src/lib/components/album-page/album-viewer.svelte
+++ b/web/src/lib/components/album-page/album-viewer.svelte
@@ -1,15 +1,21 @@
 
 
 
@@ -97,11 +147,26 @@
 		
 			{#each album.assets as asset}
 				{#if album.assets.length < 7}
-					
+					
 				{:else}
-					
+					
 				{/if}
 			{/each}
 		
 	
 
+
+
+{#if isShowAssetViewer}
+	
+{/if}
diff --git a/web/src/lib/components/asset-viewer-page/asser-viewer-nav-bar.svelte b/web/src/lib/components/asset-viewer/asser-viewer-nav-bar.svelte
similarity index 100%
rename from web/src/lib/components/asset-viewer-page/asser-viewer-nav-bar.svelte
rename to web/src/lib/components/asset-viewer/asser-viewer-nav-bar.svelte
diff --git a/web/src/lib/components/asset-viewer-page/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte
similarity index 69%
rename from web/src/lib/components/asset-viewer-page/asset-viewer.svelte
rename to web/src/lib/components/asset-viewer/asset-viewer.svelte
index 1539b867..e3cdbd3a 100644
--- a/web/src/lib/components/asset-viewer-page/asset-viewer.svelte
+++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte
@@ -2,7 +2,6 @@
 	import { createEventDispatcher, onDestroy, onMount } from 'svelte';
 	import { fly } from 'svelte/transition';
 	import AsserViewerNavBar from './asser-viewer-nav-bar.svelte';
-	import { flattenAssetGroupByDate } from '$lib/stores/assets';
 	import ChevronRight from 'svelte-material-icons/ChevronRight.svelte';
 	import ChevronLeft from 'svelte-material-icons/ChevronLeft.svelte';
 	import PhotoViewer from './photo-viewer.svelte';
@@ -14,31 +13,16 @@
 
 	const dispatch = createEventDispatcher();
 
-	export let selectedAsset: AssetResponseDto;
-
-	export let selectedIndex: number;
-
-	let viewDeviceId: string;
-	let viewAssetId: string;
+	export let asset: AssetResponseDto;
 
 	let halfLeftHover = false;
 	let halfRightHover = false;
 	let isShowDetail = false;
 
 	onMount(() => {
-		viewAssetId = selectedAsset.id;
-		viewDeviceId = selectedAsset.deviceId;
-		pushState(viewAssetId);
-
 		document.addEventListener('keydown', (keyInfo) => handleKeyboardPress(keyInfo.key));
 	});
 
-	onDestroy(() => {
-		document.removeEventListener('keydown', (b) => {
-			console.log('destroyed', b);
-		});
-	});
-
 	const handleKeyboardPress = (key: string) => {
 		switch (key) {
 			case 'Escape':
@@ -57,38 +41,17 @@
 	};
 
 	const closeViewer = () => {
-		history.pushState(null, '', `/photos`);
 		dispatch('close');
 	};
 
 	const navigateAssetForward = (e?: Event) => {
 		e?.stopPropagation();
-
-		const nextAsset = $flattenAssetGroupByDate[selectedIndex + 1];
-		viewDeviceId = nextAsset.deviceId;
-		viewAssetId = nextAsset.id;
-
-		selectedIndex = selectedIndex + 1;
-		selectedAsset = $flattenAssetGroupByDate[selectedIndex];
-		pushState(viewAssetId);
+		dispatch('navigate-forward');
 	};
 
 	const navigateAssetBackward = (e?: Event) => {
 		e?.stopPropagation();
-
-		const lastAsset = $flattenAssetGroupByDate[selectedIndex - 1];
-		viewDeviceId = lastAsset.deviceId;
-		viewAssetId = lastAsset.id;
-
-		selectedIndex = selectedIndex - 1;
-		selectedAsset = $flattenAssetGroupByDate[selectedIndex];
-		pushState(viewAssetId);
-	};
-
-	const pushState = (assetId: string) => {
-		// add a URL to the browser's history
-		// changes the current URL in the address bar but doesn't perform any SvelteKit navigation
-		history.pushState(null, '', `/photos/${assetId}`);
+		dispatch('navigate-backward');
 	};
 
 	const showDetailInfoHandler = () => {
@@ -98,19 +61,20 @@
 	const downloadFile = async () => {
 		if ($session.user) {
 			try {
-				const imageName = selectedAsset.exifInfo?.imageName ? selectedAsset.exifInfo?.imageName : selectedAsset.id;
-				const imageExtension = selectedAsset.originalPath.split('.')[1];
+				const imageName = asset.exifInfo?.imageName ? asset.exifInfo?.imageName : asset.id;
+				const imageExtension = asset.originalPath.split('.')[1];
 				const imageFileName = imageName + '.' + imageExtension;
 
 				// If assets is already download -> return;
 				if ($downloadAssets[imageFileName]) {
 					return;
 				}
+
 				$downloadAssets[imageFileName] = 0;
 
 				const { data, status } = await api.assetApi.downloadFile(
-					selectedAsset.deviceAssetId,
-					selectedAsset.deviceId,
+					asset.deviceAssetId,
+					asset.deviceId,
 					false,
 					false,
 					{
@@ -123,8 +87,8 @@
 
 								$downloadAssets[imageFileName] = percentCompleted;
 							}
-						},
-					},
+						}
+					}
 				);
 
 				if (!(data instanceof Blob)) {
@@ -162,12 +126,16 @@
 	class="absolute h-screen w-screen top-0 overflow-y-hidden bg-black z-[999] grid grid-rows-[64px_1fr] grid-cols-4  "
 >
 	
 
 	 {
 			halfLeftHover = true;
@@ -188,20 +156,18 @@
 	
 
 	
-		{#key selectedIndex}
-			{#if viewAssetId && viewDeviceId}
-				{#if selectedAsset.type == AssetTypeEnum.Image}
-					
-				{:else}
-					
-				{/if}
+		{#key asset.id}
+			{#if asset.type == AssetTypeEnum.Image}
+				
+			{:else}
+				
 			{/if}
 		{/key}
 	
 {
@@ -228,7 +194,7 @@
 			class="bg-immich-bg w-[360px] row-span-full transition-all "
 			translate="yes"
 		>
-			 (isShowDetail = false)} />
+			 (isShowDetail = false)} />
 		
 	{/if}
 
diff --git a/web/src/lib/components/asset-viewer-page/detail-panel.svelte b/web/src/lib/components/asset-viewer/detail-panel.svelte
similarity index 100%
rename from web/src/lib/components/asset-viewer-page/detail-panel.svelte
rename to web/src/lib/components/asset-viewer/detail-panel.svelte
diff --git a/web/src/lib/components/asset-viewer-page/download-panel.svelte b/web/src/lib/components/asset-viewer/download-panel.svelte
similarity index 100%
rename from web/src/lib/components/asset-viewer-page/download-panel.svelte
rename to web/src/lib/components/asset-viewer/download-panel.svelte
diff --git a/web/src/lib/components/asset-viewer-page/intersection-observer.svelte b/web/src/lib/components/asset-viewer/intersection-observer.svelte
similarity index 100%
rename from web/src/lib/components/asset-viewer-page/intersection-observer.svelte
rename to web/src/lib/components/asset-viewer/intersection-observer.svelte
diff --git a/web/src/lib/components/asset-viewer-page/photo-viewer.svelte b/web/src/lib/components/asset-viewer/photo-viewer.svelte
similarity index 100%
rename from web/src/lib/components/asset-viewer-page/photo-viewer.svelte
rename to web/src/lib/components/asset-viewer/photo-viewer.svelte
diff --git a/web/src/lib/components/asset-viewer-page/video-viewer.svelte b/web/src/lib/components/asset-viewer/video-viewer.svelte
similarity index 100%
rename from web/src/lib/components/asset-viewer-page/video-viewer.svelte
rename to web/src/lib/components/asset-viewer/video-viewer.svelte
diff --git a/web/src/lib/components/shared-components/immich-thumbnail.svelte b/web/src/lib/components/shared-components/immich-thumbnail.svelte
index 0ed4d964..9f13c3da 100644
--- a/web/src/lib/components/shared-components/immich-thumbnail.svelte
+++ b/web/src/lib/components/shared-components/immich-thumbnail.svelte
@@ -2,7 +2,7 @@
 	import { session } from '$app/stores';
 	import { createEventDispatcher, onDestroy } from 'svelte';
 	import { fade, fly } from 'svelte/transition';
-	import IntersectionObserver from '$lib/components/asset-viewer-page/intersection-observer.svelte';
+	import IntersectionObserver from '$lib/components/asset-viewer/intersection-observer.svelte';
 	import CheckCircle from 'svelte-material-icons/CheckCircle.svelte';
 	import PlayCircleOutline from 'svelte-material-icons/PlayCircleOutline.svelte';
 	import PauseCircleOutline from 'svelte-material-icons/PauseCircleOutline.svelte';
diff --git a/web/src/lib/components/sharing-page/shared-album-list-tile.svelte b/web/src/lib/components/sharing-page/shared-album-list-tile.svelte
index ae00957e..ab7d3a87 100644
--- a/web/src/lib/components/sharing-page/shared-album-list-tile.svelte
+++ b/web/src/lib/components/sharing-page/shared-album-list-tile.svelte
@@ -53,7 +53,7 @@
 			{#if user.email == albumOwner.email}
 				Owned
 			{:else}
-				Shared by {albumOwner.email}
+				Shared by {albumOwner.firstName} {albumOwner.lastName}
 			{/if}
 		{/await}
 	
diff --git a/web/src/routes/__layout.svelte b/web/src/routes/__layout.svelte
index 44435f8b..52b94e1b 100644
--- a/web/src/routes/__layout.svelte
+++ b/web/src/routes/__layout.svelte
@@ -18,7 +18,7 @@
 
 	import { blur, fade, slide } from 'svelte/transition';
 
-	import DownloadPanel from '$lib/components/asset-viewer-page/download-panel.svelte';
+	import DownloadPanel from '$lib/components/asset-viewer/download-panel.svelte';
 	import AnnouncementBox from '$lib/components/shared-components/announcement-box.svelte';
 	import UploadPanel from '$lib/components/shared-components/upload-panel.svelte';
 	import { onMount } from 'svelte';
diff --git a/web/src/routes/albums/[albumId].svelte b/web/src/routes/albums/[albumId]/index.svelte
similarity index 95%
rename from web/src/routes/albums/[albumId].svelte
rename to web/src/routes/albums/[albumId]/index.svelte
index 42e1ded4..2ac136ae 100644
--- a/web/src/routes/albums/[albumId].svelte
+++ b/web/src/routes/albums/[albumId]/index.svelte
@@ -35,8 +35,6 @@
 
 
 
diff --git a/web/src/routes/photos/index.svelte b/web/src/routes/photos/index.svelte
index e6d01009..4ca37978 100644
--- a/web/src/routes/photos/index.svelte
+++ b/web/src/routes/photos/index.svelte
@@ -33,7 +33,7 @@
 	import { assetsGroupByDate, flattenAssetGroupByDate } from '$lib/stores/assets';
 	import ImmichThumbnail from '$lib/components/shared-components/immich-thumbnail.svelte';
 	import moment from 'moment';
-	import AssetViewer from '$lib/components/asset-viewer-page/asset-viewer.svelte';
+	import AssetViewer from '$lib/components/asset-viewer/asset-viewer.svelte';
 	import { fileUploader } from '$lib/utils/file-uploader';
 	import { AssetResponseDto } from '@api';
 	import SideBar from '$lib/components/shared-components/side-bar/side-bar.svelte';
@@ -42,13 +42,14 @@
 
 	let selectedGroupThumbnail: number | null;
 	let isMouseOverGroup: boolean;
+
 	$: if (isMouseOverGroup == false) {
 		selectedGroupThumbnail = null;
 	}
 
-	let isShowAsset = false;
+	let isShowAssetViewer = false;
 	let currentViewAssetIndex = 0;
-	let currentSelectedAsset: AssetResponseDto;
+	let selectedAsset: AssetResponseDto;
 
 	const thumbnailMouseEventHandler = (event: CustomEvent) => {
 		const { selectedGroupIndex }: { selectedGroupIndex: number } = event.detail;
@@ -60,8 +61,9 @@
 		const { assetId, deviceId }: { assetId: string; deviceId: string } = event.detail;
 
 		currentViewAssetIndex = $flattenAssetGroupByDate.findIndex((a) => a.id == assetId);
-		currentSelectedAsset = $flattenAssetGroupByDate[currentViewAssetIndex];
-		isShowAsset = true;
+		selectedAsset = $flattenAssetGroupByDate[currentViewAssetIndex];
+		isShowAssetViewer = true;
+		pushState(selectedAsset.id);
 	};
 
 	const uploadClickedHandler = async () => {
@@ -91,6 +93,41 @@
 			}
 		}
 	};
+
+	const navigateAssetForward = () => {
+		try {
+			if (currentViewAssetIndex < $flattenAssetGroupByDate.length - 1) {
+				currentViewAssetIndex++;
+				selectedAsset = $flattenAssetGroupByDate[currentViewAssetIndex];
+				pushState(selectedAsset.id);
+			}
+		} catch (e) {
+			console.log('Error navigating asset forward', e);
+		}
+	};
+
+	const navigateAssetBackward = () => {
+		try {
+			if (currentViewAssetIndex > 0) {
+				currentViewAssetIndex--;
+				selectedAsset = $flattenAssetGroupByDate[currentViewAssetIndex];
+				pushState(selectedAsset.id);
+			}
+		} catch (e) {
+			console.log('Error navigating asset backward', e);
+		}
+	};
+
+	const pushState = (assetId: string) => {
+		// add a URL to the browser's history
+		// changes the current URL in the address bar but doesn't perform any SvelteKit navigation
+		history.pushState(null, '', `/photos/${assetId}`);
+	};
+
+	const closeViewer = () => {
+		isShowAssetViewer = false;
+		history.pushState(null, '', `/photos`);
+	};
 
 
 
@@ -149,10 +186,11 @@
 
 
 
-{#if isShowAsset}
+{#if isShowAssetViewer}
 	 (isShowAsset = false)}
+		asset={selectedAsset}
+		on:navigate-backward={navigateAssetBackward}
+		on:navigate-forward={navigateAssetForward}
+		on:close={closeViewer}
 	/>
 {/if}