diff --git a/src/web/app/common/scripts/gcd.js b/src/web/app/common/scripts/gcd.js
new file mode 100644
index 0000000000..43bfbc57ae
--- /dev/null
+++ b/src/web/app/common/scripts/gcd.js
@@ -0,0 +1,2 @@
+const gcd = (a, b) => !b ? a : gcd(b, a % b);
+module.exports = gcd;
diff --git a/src/web/app/common/tags/file-type-icon.tag b/src/web/app/common/tags/file-type-icon.tag
index 054457bf03..b4b0c88d66 100644
--- a/src/web/app/common/tags/file-type-icon.tag
+++ b/src/web/app/common/tags/file-type-icon.tag
@@ -1,11 +1,10 @@
-<mk-file-type-icon><i class="fa fa-file-image-o" if={ kind == 'image' }></i>
+<mk-file-type-icon>
+	<i class="fa fa-file-image-o" if={ kind == 'image' }></i>
 	<style type="stylus">
 		:scope
 			display inline
-
 	</style>
 	<script>
-		@file = @opts.file
-		@kind = @file.type.split \/ .0
+		@kind = @opts.type.split \/ .0
 	</script>
 </mk-file-type-icon>
diff --git a/src/web/app/mobile/tags/drive.tag b/src/web/app/mobile/tags/drive.tag
index 903a660173..c4e7c0e6d7 100644
--- a/src/web/app/mobile/tags/drive.tag
+++ b/src/web/app/mobile/tags/drive.tag
@@ -5,8 +5,14 @@
 			<span><i class="fa fa-angle-right"></i></span>
 			<p onclick={ _move }>{ folder.name }</p>
 		</virtual>
-		<span if={ folder != null }><i class="fa fa-angle-right"></i></span>
-		<p if={ folder != null }>{ folder.name }</p>
+		<virtual if={ folder != null }>
+			<span><i class="fa fa-angle-right"></i></span>
+			<p>{ folder.name }</p>
+		</virtual>
+		<virtual if={ file != null }>
+			<span><i class="fa fa-angle-right"></i></span>
+			<p>{ file.name }</p>
+		</virtual>
 	</nav>
 	<div class="browser { loading: loading }" if={ file == null }>
 		<div class="folders" if={ folders.length > 0 }>
@@ -150,6 +156,8 @@
 			#if @opts.folder?
 			if @opts.folder? and @opts.folder != ''
 				@cd @opts.folder
+			else if @opts.file? and @opts.file != ''
+				@cf @opts.file
 			else
 				@load!
 
@@ -186,6 +194,8 @@
 			@cd target-folder, true
 
 		@cd = (target-folder, is-move) ~>
+			@file = null
+
 			if target-folder? and typeof target-folder == \object
 				target-folder = target-folder.id
 
@@ -263,7 +273,8 @@
 			@update!
 
 		@go-root = ~>
-			if @folder != null
+			if @folder != null or @file != null
+				@file = null
 				@folder = null
 				@hierarchy-folders = []
 				@update!
@@ -337,7 +348,30 @@
 				@update!
 				@trigger \change-selected @selected-files
 			else
+				@cf file
+
+		@cf = (file) ~>
+			if typeof file == \object
+				file = file.id
+
+			@loading = true
+			@update!
+
+			@api \drive/files/show do
+				file_id: file
+			.then (file) ~>
 				@file = file
+				@folder = null
+				@hierarchy-folders = []
+
+				x = (f) ~>
+					@hierarchy-folders.unshift f
+					if f.parent?
+						x f.parent
+
+				if file.folder?
+					x file.folder
+
 				@update!
 				@trigger \open-file @file
 	</script>
diff --git a/src/web/app/mobile/tags/drive/file-viewer.tag b/src/web/app/mobile/tags/drive/file-viewer.tag
index ac426278b3..406f2f09fb 100644
--- a/src/web/app/mobile/tags/drive/file-viewer.tag
+++ b/src/web/app/mobile/tags/drive/file-viewer.tag
@@ -1,9 +1,189 @@
 <mk-drive-file-viewer>
-	<p class="name">{ file.name }</p>
+	<div class="preview">
+		<img if={ kind == 'image' } src={ file.url } alt={ file.name } title={ file.name }>
+		<i if={ kind != 'image' } class="fa fa-file"></i>
+		<footer if={ kind == 'image' }>
+			<span class="size">
+				<span class="width">{ file.properties.width }</span>
+				<span class="time">×</span>
+				<span class="height">{ file.properties.height }</span>
+				<span class="px">px</span>
+			</span>
+			<span class="separator"></span>
+			<span class="aspect-ratio">
+				<span class="width">{ file.properties.width / getGcd(file.properties.width, file.properties.height) }</span>
+				<span class="colon">:</span>
+				<span class="height">{ file.properties.height / getGcd(file.properties.width, file.properties.height) }</span>
+			</span>
+		</footer>
+	</div>
+	<div class="info">
+		<div>
+			<span class="type"><mk-file-type-icon type={ file.type }></mk-file-type-icon>{ file.type }</span>
+			<span class="separator"></span>
+			<span class="data-size">{ bytesToSize(file.datasize) }</span>
+			<span class="separator"></span>
+			<span class="created-at"><mk-time time={ file.created_at }></mk-time></span>
+		</div>
+	</div>
+	<div class="menu">
+		<div>
+			<a href={ file.url + '?download' } download={ file.name }>
+				<i class="fa fa-download"></i>ダウンロード
+			</a>
+			<button onclick={ rename }>
+				<i class="fa fa-pencil"></i>名前を変更
+			</button>
+		</div>
+	</div>
+	<div class="hash">
+		<div>
+			<p>
+				<i class="fa fa-hashtag"></i>ファイルのハッシュ値
+			</p>
+			<code>{ file.hash }</code>
+		</div>
+	</div>
 	<style type="stylus">
 		:scope
 			display block
 
+			> .preview
+				padding 8px
+				background #f0f0f0
+
+				> img
+					display block
+					max-width 100%
+					max-height 300px
+					margin 0 auto
+					box-shadow 1px 1px 4px rgba(0, 0, 0, 0.2)
+
+				> footer
+					padding 8px 8px 0 8px
+					font-size 0.8em
+					color #888
+					text-align center
+
+					> .separator
+						display inline
+						padding 0 4px
+
+					> .size
+						display inline
+
+						.time
+							margin 0 2px
+
+						.px
+							margin-left 4px
+
+					> .aspect-ratio
+						display inline
+						opacity 0.7
+
+						&:before
+							content "("
+
+						&:after
+							content ")"
+
+			> .info
+				padding 14px
+				font-size 0.8em
+				border-top solid 1px #dfdfdf
+
+				> div
+					max-width 500px
+					margin 0 auto
+
+					> .separator
+						padding 0 4px
+						color #cdcdcd
+
+					> .type
+					> .data-size
+						color #9d9d9d
+
+						> mk-file-type-icon
+							margin-right 4px
+
+					> .created-at
+						color #bdbdbd
+
+						> i
+							margin-right 2px
+
+			> .menu
+				padding 14px
+				border-top solid 1px #dfdfdf
+
+				> div
+					max-width 500px
+					margin 0 auto
+
+					> *
+						display block
+						width 100%
+						padding 10px 16px
+						margin 0 0 12px 0
+						color #333
+						font-size 0.9em
+						text-align center
+						text-decoration none
+						text-shadow 0 1px 0 rgba(255, 255, 255, 0.9)
+						background-image linear-gradient(#fafafa, #eaeaea)
+						border 1px solid #ddd
+						border-bottom-color #cecece
+						border-radius 3px
+
+						&:last-child
+							margin-bottom 0
+
+						&:active
+							background-color #767676
+							background-image none
+							border-color #444
+							box-shadow 0 1px 3px rgba(0, 0, 0, 0.075), inset 0 0 5px rgba(0, 0, 0, 0.2)
+
+						> i
+							margin-right 4px
+
+			> .hash
+				padding 14px
+				border-top solid 1px #dfdfdf
+
+				> div
+					max-width 500px
+					margin 0 auto
+
+					> p
+						display block
+						margin 0
+						padding 0
+						color #555
+						font-size 0.9em
+
+						> i
+							margin-right 4px
+
+					> code
+						display block
+						width 100%
+						margin 6px 0 0 0
+						padding 8px
+						overflow auto
+						font-size 0.8em
+						border solid 1px #dfdfdf
+						border-radius 2px
+						background #f5f5f5
+
 	</style>
-	<script>@file = @opts.file</script>
+	<script>
+		@bytes-to-size = require '../../../common/scripts/bytes-to-size.js'
+		@get-gcd = require '../../../common/scripts/gcd.js'
+
+		@file = @opts.file
+		@kind = @file.type.split \/ .0
+	</script>
 </mk-drive-file-viewer>
diff --git a/src/web/app/mobile/tags/drive/file.tag b/src/web/app/mobile/tags/drive/file.tag
index 1ce8297ea3..7a4d444693 100644
--- a/src/web/app/mobile/tags/drive/file.tag
+++ b/src/web/app/mobile/tags/drive/file.tag
@@ -11,7 +11,7 @@
 			-->
 			<footer>
 				<p class="type">
-					<mk-file-type-icon file={ file }></mk-file-type-icon>{ file.type }
+					<mk-file-type-icon type={ file.type }></mk-file-type-icon>{ file.type }
 				</p>
 				<p class="separator"></p>
 				<p class="data-size">{ bytesToSize(file.datasize) }</p>
@@ -122,7 +122,7 @@
 
 	</style>
 	<script>
-		@mixin \bytes-to-size
+		@bytes-to-size = require '../../../common/scripts/bytes-to-size.js'
 
 		@browser = @parent
 		@file = @opts.file
diff --git a/src/web/app/mobile/tags/page/drive.tag b/src/web/app/mobile/tags/page/drive.tag
index ac1796ec43..e903ccfb0e 100644
--- a/src/web/app/mobile/tags/page/drive.tag
+++ b/src/web/app/mobile/tags/page/drive.tag
@@ -41,11 +41,10 @@
 			@refs.ui.refs.browser.on \open-file (file) ~>
 				# TODO: escape html characters in file.name
 				@ui.trigger \title '<mk-file-type-icon class="icon"></mk-file-type-icon>' + file.name
+				riot.mount \mk-file-type-icon do
+					type: file.type
 
 				# Rewrite URL
 				history.push-state null null '/i/drive/file/' + file.id
-
-				riot.mount \mk-file-type-icon do
-					file: file
 	</script>
 </mk-drive-page>
diff --git a/src/web/app/mobile/tags/ui-header.tag b/src/web/app/mobile/tags/ui-header.tag
index f63ca47239..6e23a4b9cc 100644
--- a/src/web/app/mobile/tags/ui-header.tag
+++ b/src/web/app/mobile/tags/ui-header.tag
@@ -50,6 +50,7 @@
 						text-overflow ellipsis
 
 						> i
+						> .icon
 							margin-right 8px
 
 						> img
@@ -93,7 +94,7 @@
 		@on \mount ~>
 			@opts.ready!
 
-		@ui.one \title (title) ~>
+		@ui.on \title (title) ~>
 			if @refs.title?
 				@refs.title.innerHTML = title