diff --git a/js/components/FolderContent.vue b/js/components/FolderContent.vue
index 581d2269bd8201016e43441ca23d6d79bc99293b..2991ca0208610b1d0f0e4a85c982c021b90a9bbd 100644
--- a/js/components/FolderContent.vue
+++ b/js/components/FolderContent.vue
@@ -6,7 +6,8 @@
 			<template v-else>
 				<MessageList/>
 				<NewMessageDetail v-if="newMessage"/>
-				<Message v-else/>
+				<Message v-else-if="message"/>
+				<NoMessageInFolder v-else />
 			</template>
 		</div>
 	</div>
@@ -17,10 +18,12 @@
 	import MessageList from "./MessageList";
 	import NewMessageDetail from "./NewMessageDetail";
 	import Loading from "./Loading";
+	import NoMessageInFolder from "./NoMessageInFolder";
 
 	export default {
 		name: "FolderContent",
 		components: {
+			NoMessageInFolder,
 			Loading,
 			NewMessageDetail,
 			Message,
@@ -29,7 +32,8 @@
 		data () {
 			return {
 				loading: true,
-				newMessage: true,
+				newMessage: false,
+				message: false,
 			}
 		},
 		created () {
@@ -43,6 +47,9 @@
 				if (envelopes.length > 0) {
 					// Show first message
 					let first = envelopes[0];
+
+					this.message = true;
+
 					this.$router.replace({
 						name: 'message',
 						params: {
diff --git a/js/components/Message.vue b/js/components/Message.vue
index 775f26d49b5181e2a030a25194bef8b6d936ec80..6e6aced0e566f563fa307b4a865f502f16e0ad8a 100644
--- a/js/components/Message.vue
+++ b/js/components/Message.vue
@@ -1,43 +1,48 @@
 <template>
 	<div class="app-content-details">
-		<div id="mail-message-header" class="section">
-			<h2 :title="subject">{{subject}}</h2>
-			<p class="transparency">
-				<AddressList :entries="from"/>
-				to <!-- TODO: translate -->
-				<AddressList :entries="to"/>
-				<template v-if="cc.length">
-					(cc <!-- TODO: translate -->
-					<AddressList :entries="cc"/><!--
-					-->)
-				</template>
-			</p>
-		</div>
-		<div class="mail-message-body">
-			<div id="mail-content">
-				<MessageHTMLBody v-if="hasHtmlBody"/>
-				<MessagePlainTextBody v-else
-									  :body="body"
-									  :signature="signature"/>
+		<Loading v-if="loading"/>
+		<template v-else>
+			<div id="mail-message-header" class="section">
+				<h2 :title="message.subject">{{message.subject}}</h2>
+				<p class="transparency">
+					<AddressList :entries="message.from"/>
+					to <!-- TODO: translate -->
+					<AddressList :entries="message.to"/>
+					<template v-if="message.cc.length">
+						(cc <!-- TODO: translate -->
+						<AddressList :entries="message.cc"/><!--
+						-->)
+					</template>
+				</p>
 			</div>
-			<div class="mail-message-attachments"></div>
-			<div id="reply-composer"></div>
-			<input type="button" id="forward-button" value="Forward">
-		</div>
-		<Composer :send="sendReply"
-				  :draft="saveReplyDraft"/>
+			<div class="mail-message-body">
+				<div id="mail-content">
+					<MessageHTMLBody v-if="message.hasHtmlBody"/>
+					<MessagePlainTextBody v-else
+										  :body="message.body"
+										  :signature="message.signature"/>
+				</div>
+				<div class="mail-message-attachments"></div>
+				<div id="reply-composer"></div>
+				<input type="button" id="forward-button" value="Forward">
+			</div>
+			<Composer :send="sendReply"
+					  :draft="saveReplyDraft"/>
+		</template>
 	</div>
 </template>
 
 <script>
-	import AddressList from "./AddressList";
-	import Composer from "./Composer";
-	import MessageHTMLBody from "./MessageHTMLBody";
-	import MessagePlainTextBody from "./MessagePlainTextBody";
+	import AddressList from "./AddressList"
+	import Composer from "./Composer"
+	import MessageHTMLBody from "./MessageHTMLBody"
+	import MessagePlainTextBody from "./MessagePlainTextBody"
+	import Loading from "./Loading"
 
 	export default {
 		name: "Message",
 		components: {
+			Loading,
 			AddressList,
 			Composer,
 			MessageHTMLBody,
@@ -45,46 +50,43 @@
 		},
 		data () {
 			return {
-				from: [
-					{
-						label: 'Backbone Marionette',
-						email: 'backbone.marionette@frameworks.js',
-					}
-				],
-				to: [
-					{
-						label: 'React',
-						email: 'react@frameworks.js',
-					},
-					{
-						label: 'Angular',
-						email: 'angular@frameworks.js',
-					}
-				],
-				cc: [
-					{
-						label: 'Underscore Jayes',
-						email: 'underscore@frameworks.js',
-					}
-				],
-				subject: 'Do you enjoy the Vue?',
-				hasHtmlBody: false,
-				body: 'Henlo!',
-				signature: 'Backbone Marionette',
+				loading: true,
+				message: undefined,
 			};
 		},
+		created () {
+			this.fetchMessage()
+		},
+		watch: {
+			'$route' (to, from) {
+				this.fetchMessage()
+			}
+		},
 		methods: {
-			sendReply() {
-				console.log('todo: sending reply');
+			fetchMessage () {
+				this.loading = true
+				this.message = undefined
+				this.$store.dispatch(
+					'fetchMessage', {
+						accountId: this.$route.params.accountId,
+						folderId: this.$route.params.folderId,
+						folderId: this.$route.params.messageId,
+					}).then(message => {
+					this.message = message
+					this.loading = false
+				})
+			},
+			sendReply () {
+				console.log('todo: sending reply')
 				return new Promise((res, _) => {
 					setTimeout(() => res, 1000);
-				});
+				})
 			},
-			saveReplyDraft() {
-				console.log('todo: saving reply draft');
+			saveReplyDraft () {
+				console.log('todo: saving reply draft')
 				return new Promise((res, _) => {
-					setTimeout(() => res, 1000);
-				});
+					setTimeout(() => res, 1000)
+				})
 			}
 		}
 	}
diff --git a/js/components/NewMessageDetail.vue b/js/components/NewMessageDetail.vue
index 2e890a0748ca7aa2e214bda5cb96db8bc44e0cb8..0a914c289694f2f5f1f1694ee656bee1bb671c70 100644
--- a/js/components/NewMessageDetail.vue
+++ b/js/components/NewMessageDetail.vue
@@ -19,7 +19,6 @@
 				return Promise.resolve();
 			},
 			sendMessage () {
-				console.info('sending message');
 				console.info('sending message');
 				return Promise.resolve();
 			}
diff --git a/js/components/NoMessageInFolder.vue b/js/components/NoMessageInFolder.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c6a59cccb58d88d416639f712271a506b97e480f
--- /dev/null
+++ b/js/components/NoMessageInFolder.vue
@@ -0,0 +1,11 @@
+<template>
+	<div class="app-content-details">
+		{{ t('mail', 'No messages in this folder') }}
+	</div>
+</template>
+
+<script>
+	export default {
+		name: "NoMessageInFolder"
+	}
+</script>
diff --git a/js/service/MessageService.js b/js/service/MessageService.js
index 195e7f9cf6b41c228594607ada05431f0e0fd098..bd8d832f4e54f5c5fd5c6ac2d2c10f411041bed8 100644
--- a/js/service/MessageService.js
+++ b/js/service/MessageService.js
@@ -24,3 +24,39 @@ export function fetchEnvelopes () {
 		}, 800)
 	})
 }
+
+export function fetchMessage (accountId, folderId, id) {
+	return new Promise((res, rej) => {
+		setTimeout(() => {
+			res({
+				id: id,
+				from: [
+					{
+						label: 'Backbone Marionette',
+						email: 'backbone.marionette@frameworks.js',
+					}
+				],
+				to: [
+					{
+						label: 'React',
+						email: 'react@frameworks.js',
+					},
+					{
+						label: 'Angular',
+						email: 'angular@frameworks.js',
+					}
+				],
+				cc: [
+					{
+						label: 'Underscore Jayes',
+						email: 'underscore@frameworks.js',
+					}
+				],
+				subject: 'Do you enjoy the Vue?',
+				hasHtmlBody: false,
+				body: 'Henlo!',
+				signature: 'Backbone Marionette',
+			})
+		}, 1500)
+	})
+}
diff --git a/js/store.js b/js/store.js
index d3878df79d68e8d2dff99865399203d64ab641c5..5de88160a8f2f7616066017a5ce8ff0136ea026b 100644
--- a/js/store.js
+++ b/js/store.js
@@ -5,7 +5,10 @@ import {
 	fetch as fetchAccount,
 	fetchAll as fetchAllAccounts
 } from './service/AccountService'
-import {fetchEnvelopes} from './service/MessageService'
+import {
+	fetchEnvelopes,
+	fetchMessage
+} from './service/MessageService'
 
 Vue.use(Vuex)
 
@@ -16,6 +19,9 @@ export const mutations = {
 	addEnvelope (state, {accountId, folderId, envelope}) {
 		// TODO: append/add to folder envelopes list
 		Vue.set(state.envelopes, accountId + '-' + folderId + '-' + envelope.id, envelope)
+	},
+	addMessage (state, {accountId, folderId, message}) {
+		Vue.set(state.messages, accountId + '-' + folderId + '-' + message.id, message)
 	}
 }
 
@@ -41,6 +47,16 @@ export const actions = {
 			}))
 			return envs
 		})
+	},
+	fetchMessage ({commit}, {accountId, folderId, id}) {
+		return fetchMessage(accountId, folderId, id).then(message => {
+			commit('addMessage', {
+				accountId,
+				folderId,
+				message
+			})
+			return message
+		})
 	}
 }
 
@@ -56,7 +72,11 @@ export const getters = {
 	},
 	getEnvelopes: (state, getters) => (accountId, folderId) => {
 		return getters.getFolder(accountId, folderId).envelopes.map(msgId => state.envelopes[msgId])
-	}
+	},
+	getMessage: (state, getters) => (accountId, folderId, id) => {
+		console.debug('store::getMessage', accountId, folderId, id, ':', state.messages[accountId + '-' + folderId + '-' + id])
+		return state.messages[accountId + '-' + folderId + '-' + id]
+	},
 }
 
 export default new Vuex.Store({