diff --git a/assets/fonts/Lato-Black.eot b/assets/fonts/Lato-Black.eot
new file mode 100644
index 0000000000000000000000000000000000000000..444bc3aa2e3ba3675ae15408be55fb075902484f
Binary files /dev/null and b/assets/fonts/Lato-Black.eot differ
diff --git a/assets/fonts/Lato-Bold.eot b/assets/fonts/Lato-Bold.eot
new file mode 100644
index 0000000000000000000000000000000000000000..3361183a419c188282a8545eaa8d8e298b8ffaab
Binary files /dev/null and b/assets/fonts/Lato-Bold.eot differ
diff --git a/assets/fonts/Lato-Bold.ttf b/assets/fonts/Lato-Bold.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..29f691d5ed0c2d3d224423bb0288e6bd59292511
Binary files /dev/null and b/assets/fonts/Lato-Bold.ttf differ
diff --git a/assets/fonts/Lato-Bold.woff b/assets/fonts/Lato-Bold.woff
new file mode 100644
index 0000000000000000000000000000000000000000..c6dff51f063cc732fdb5fe786a8966de85f4ebec
Binary files /dev/null and b/assets/fonts/Lato-Bold.woff differ
diff --git a/assets/fonts/Lato-Bold.woff2 b/assets/fonts/Lato-Bold.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..bb195043cfc07fa52741c6144d7378b5ba8be4c5
Binary files /dev/null and b/assets/fonts/Lato-Bold.woff2 differ
diff --git a/assets/fonts/Lato-BoldItalic.eot b/assets/fonts/Lato-BoldItalic.eot
new file mode 100644
index 0000000000000000000000000000000000000000..3d4154936b42522fac84900c689a901ac12875c0
Binary files /dev/null and b/assets/fonts/Lato-BoldItalic.eot differ
diff --git a/assets/fonts/Lato-BoldItalic.ttf b/assets/fonts/Lato-BoldItalic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..f402040b3e5360b90f3a12ca2afab2cd7244e16f
Binary files /dev/null and b/assets/fonts/Lato-BoldItalic.ttf differ
diff --git a/assets/fonts/Lato-BoldItalic.woff b/assets/fonts/Lato-BoldItalic.woff
new file mode 100644
index 0000000000000000000000000000000000000000..88ad05b9ff413055b4d4e89dd3eec1c193fa20c6
Binary files /dev/null and b/assets/fonts/Lato-BoldItalic.woff differ
diff --git a/assets/fonts/Lato-BoldItalic.woff2 b/assets/fonts/Lato-BoldItalic.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..c4e3d804b57b625b16a36d767bfca6bbf63d414e
Binary files /dev/null and b/assets/fonts/Lato-BoldItalic.woff2 differ
diff --git a/assets/fonts/Lato-Italic.eot b/assets/fonts/Lato-Italic.eot
new file mode 100644
index 0000000000000000000000000000000000000000..3f826421a1d97b09797fad3d781a666a39eb45c9
Binary files /dev/null and b/assets/fonts/Lato-Italic.eot differ
diff --git a/assets/fonts/Lato-Italic.ttf b/assets/fonts/Lato-Italic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..b4bfc9b24aa993977662352c881c6e42f99f77e0
Binary files /dev/null and b/assets/fonts/Lato-Italic.ttf differ
diff --git a/assets/fonts/Lato-Italic.woff b/assets/fonts/Lato-Italic.woff
new file mode 100644
index 0000000000000000000000000000000000000000..76114bc03362242c3325ecda6ce6d02bb737880f
Binary files /dev/null and b/assets/fonts/Lato-Italic.woff differ
diff --git a/assets/fonts/Lato-Italic.woff2 b/assets/fonts/Lato-Italic.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..3404f37e2e312757841abe20343588a7740768ca
Binary files /dev/null and b/assets/fonts/Lato-Italic.woff2 differ
diff --git a/assets/fonts/Lato-Regular.eot b/assets/fonts/Lato-Regular.eot
new file mode 100644
index 0000000000000000000000000000000000000000..11e3f2a5f0f9b8c7ef6affae8c543d20f7c112be
Binary files /dev/null and b/assets/fonts/Lato-Regular.eot differ
diff --git a/assets/fonts/Lato-Regular.ttf b/assets/fonts/Lato-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..74decd9ebb8d805201934266b3bda6a9d5831024
Binary files /dev/null and b/assets/fonts/Lato-Regular.ttf differ
diff --git a/assets/fonts/Lato-Regular.woff b/assets/fonts/Lato-Regular.woff
new file mode 100644
index 0000000000000000000000000000000000000000..ae1307ff5f4c48678621c240f8972d5a6e20b22c
Binary files /dev/null and b/assets/fonts/Lato-Regular.woff differ
diff --git a/assets/fonts/Lato-Regular.woff2 b/assets/fonts/Lato-Regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..3bf9843328a6359b6bd06e50010319c63da0d717
Binary files /dev/null and b/assets/fonts/Lato-Regular.woff2 differ
diff --git a/assets/fonts/icons.eot b/assets/fonts/icons.eot
new file mode 100644
index 0000000000000000000000000000000000000000..c60c9103fca724c32dc9c91f18769b391fc3624c
Binary files /dev/null and b/assets/fonts/icons.eot differ
diff --git a/assets/fonts/icons.svg b/assets/fonts/icons.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e3933635f72b24cec01ebe0b457076b217027185
--- /dev/null
+++ b/assets/fonts/icons.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Copyright (C) 2017 by original authors @ fontello.com</metadata>
+<defs>
+<font id="fontello" horiz-adv-x="1000" >
+<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
+<missing-glyph horiz-adv-x="1000" />
+<glyph glyph-name="download" unicode="&#xe800;" d="M714 100q0 15-10 25t-25 11-25-11-11-25 11-25 25-11 25 11 10 25z m143 0q0 15-10 25t-26 11-25-11-10-25 10-25 25-11 26 11 10 25z m72 125v-179q0-22-16-37t-38-16h-821q-23 0-38 16t-16 37v179q0 22 16 38t38 16h259l75-76q33-32 76-32t76 32l76 76h259q22 0 38-16t16-38z m-182 318q10-23-8-39l-250-250q-10-11-25-11t-25 11l-250 250q-17 16-8 39 10 21 33 21h143v250q0 15 11 25t25 11h143q14 0 25-11t10-25v-250h143q24 0 33-21z" horiz-adv-x="928.6" />
+
+<glyph glyph-name="github" unicode="&#xf09b;" d="M429 779q116 0 215-58t156-156 57-215q0-140-82-252t-211-155q-15-3-22 4t-7 17q0 1 0 43t0 75q0 54-29 79 32 3 57 10t53 22 45 37 30 58 11 84q0 67-44 115 21 51-4 114-16 5-46-6t-51-25l-21-13q-52 15-107 15t-108-15q-8 6-23 15t-47 22-47 7q-25-63-5-114-44-48-44-115 0-47 12-83t29-59 45-37 52-22 57-10q-21-20-27-58-12-5-25-8t-32-3-36 12-31 35q-11 18-27 29t-28 14l-11 1q-12 0-16-2t-3-7 5-8 7-6l4-3q12-6 24-21t18-29l6-13q7-21 24-34t37-17 39-3 31 1l13 3q0-22 0-50t1-30q0-10-8-17t-22-4q-129 43-211 155t-82 252q0 117 58 215t155 156 216 58z m-267-616q2 4-3 7-6 1-8-1-1-4 4-7 5-3 7 1z m18-19q4 3-1 9-6 5-9 2-4-3 1-9 5-6 9-2z m16-25q6 4 0 11-4 7-9 3-5-3 0-10t9-4z m24-23q4 4-2 10-7 7-11 2-5-5 2-11 6-6 11-1z m32-14q1 6-8 9-8 2-10-4t7-9q8-3 11 4z m35-3q0 7-10 6-9 0-9-6 0-7 10-6 9 0 9 6z m32 5q-1 7-10 5-9-1-8-8t10-4 8 7z" horiz-adv-x="857.1" />
+</font>
+</defs>
+</svg>
\ No newline at end of file
diff --git a/assets/fonts/icons.ttf b/assets/fonts/icons.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..90de2769e2b135e10653cee9e275e4991cb593a1
Binary files /dev/null and b/assets/fonts/icons.ttf differ
diff --git a/assets/fonts/icons.woff b/assets/fonts/icons.woff
new file mode 100644
index 0000000000000000000000000000000000000000..dbe80bdf902fcd04519caaedcbb43c8638153915
Binary files /dev/null and b/assets/fonts/icons.woff differ
diff --git a/assets/fonts/icons.woff2 b/assets/fonts/icons.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..64ca517d96891fd6df6eb7fc5b47fa972ddf541e
Binary files /dev/null and b/assets/fonts/icons.woff2 differ
diff --git a/assets/sass/fonts.sass b/assets/sass/fonts.sass
new file mode 100644
index 0000000000000000000000000000000000000000..e0b855b982e0cf6f578c7dba58d98a41cf01e640
--- /dev/null
+++ b/assets/sass/fonts.sass
@@ -0,0 +1,31 @@
+@font-face
+  font-family: 'Lato'
+  src: url('/assets/fonts/Lato-Regular.eot')
+  src: url('/assets/fonts/Lato-Regular.eot?#iefix') format('embedded-opentype'), url('/assets/fonts/Lato-Regular.woff2') format('woff2'), url('/assets/fonts/Lato-Regular.woff') format('woff'), url('/assets/fonts/Lato-Regular.ttf') format('truetype')
+  font-style: normal
+  font-weight: normal
+  text-rendering: optimizeLegibility
+
+@font-face
+  font-family: 'Lato'
+  src: url('/assets/fonts/Lato-Bold.eot')
+  src: url('/assets/fonts/Lato-Bold.eot?#iefix') format('embedded-opentype'), url('/assets/fonts/Lato-Bold.woff2') format('woff2'), url('/assets/fonts/Lato-Bold.woff') format('woff'), url('/assets/fonts/Lato-Bold.ttf') format('truetype')
+  font-style: normal
+  font-weight: bold
+  text-rendering: optimizeLegibility
+
+@font-face
+  font-family: 'Lato'
+  src: url('/assets/fonts/Lato-BoldItalic.eot')
+  src: url('/assets/fonts/Lato-BoldItalic.eot?#iefix') format('embedded-opentype'), url('/assets/fonts/Lato-BoldItalic.woff2') format('woff2'), url('/assets/fonts/Lato-BoldItalic.woff') format('woff'), url('/assets/fonts/Lato-BoldItalic.ttf') format('truetype')
+  font-style: italic
+  font-weight: bold
+  text-rendering: optimizeLegibility
+
+@font-face
+  font-family: 'Lato'
+  src: url('/assets/fonts/Lato-Italic.eot')
+  src: url('/assets/fonts/Lato-Italic.eot?#iefix') format('embedded-opentype'), url('/assets/fonts/Lato-Italic.woff2') format('woff2'), url('/assets/fonts/Lato-Italic.woff') format('woff'), url('/assets/fonts/Lato-Italic.ttf') format('truetype')
+  font-style: italic
+  font-weight: normal
+  text-rendering: optimizeLegibility
\ No newline at end of file
diff --git a/assets/sass/style.sass b/assets/sass/style.sass
index 866f866e80d8d65d2dba2a56826674c0de861481..a734bc4cc53c396eb1e818bb722972e348dba81b 100644
--- a/assets/sass/style.sass
+++ b/assets/sass/style.sass
@@ -1,30 +1,46 @@
+* 
+  margin:  0
+  padding:  0
+
+body
+  background: #F2F2F2
+  font-family: 'Lato', sans-serif
+  font-size: 81.25%
+
 .images 
   display: flex
   max-width: 1024px
   margin: 0 auto
 
   .image
-    display: flex
-    height: 160px
-    width: 160px
-    justify-content: center
-    align-content: center
-    justify-items: center
-    align-items: center
-    padding: 4px
-    margin: 4px
+    padding: 8px
+    margin: 8px
     position: relative
-    box-shadow: 0 2px 4px rgba(33, 33, 33, 0.2)
+    box-shadow: 0 2px 4px rgba(33,33,33,0.2)
     transition: all 200ms
-
-    .info
-      display: none
-      position: absolute
-      right: 0
+    text-decoration:  none
+    width:  160px
+    background: #ffffff
 
     &:hover
       margin-top: 2px
-      box-shadow: 0 4px 6px rgba(33, 33, 33, 0.3)
+      box-shadow: 0 4px 6px rgba(33,33,33,0.3)
+
+    .image-container
+      display: flex
+      justify-content: center
+      align-content: center
+      justify-items: center
+      align-items: center
+      flex-direction: column
+      height: 160px
+      width: 160px
+
+    .info
+      display: block
+      z-index:  1
+      color:  #212121
+      line-height:  1.25
+      font-size:  10pt
+      padding-top:  4px
 
-      .info
-        display: block
\ No newline at end of file
diff --git a/main.go b/main.go
index 22d04ce2a85af5cbf20e4ec2b36a63b3d627b150..f5f67475676c8740f781eacd601db8379831ce99 100644
--- a/main.go
+++ b/main.go
@@ -76,23 +76,6 @@ func createImage(config *Config, body io.ReadCloser, fileHeader *multipart.FileH
 	return image, nil
 }
 
-func returnResult(writer http.ResponseWriter, result Result) error {
-	writer.Header().Add("Content-Type", "text/html")
-	body, err := json.Marshal(result)
-	if err != nil {
-		return err
-	}
-	writer.Write([]byte("<pre>"))
-	writer.Write(body)
-	writer.Write([]byte("</pre>"))
-	if result.Success {
-		writer.Write([]byte("<p><a href=\""))
-		writer.Write([]byte(fmt.Sprintf("https://i.k8r.eu/i/%s", result.Id)))
-		writer.Write([]byte("\">Uploaded Image</a></p>"))
-	}
-	return nil
-}
-
 type UserInfo struct {
 	Id    string
 	Name  string
@@ -107,6 +90,31 @@ func parseUser(r *http.Request) UserInfo {
 	}
 }
 
+type UploadData struct {
+	User   UserInfo
+	Result Result
+}
+
+func returnResult(w http.ResponseWriter, data UploadData) error {
+	var pageTemplate *template.Template
+	var err error
+	if data.Result.Success {
+		pageTemplate, err = template.New("upload_success.html").ParseFiles("templates/upload_success.html")
+	} else {
+		pageTemplate, err = template.New("upload_failure.html").ParseFiles("templates/upload_failure.html")
+	}
+	if err != nil {
+		return err
+	}
+
+	err = pageTemplate.Execute(w, data)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 func main() {
 	config := NewConfigFromEnv()
 
@@ -131,10 +139,13 @@ func main() {
 			file, header, err := r.FormFile("file")
 			image, err := createImage(&config, file, header)
 			if err != nil {
-				returnResult(w, Result{
-					Id:      "",
-					Success: false,
-					Errors:  []string{err.Error()},
+				returnResult(w, UploadData{
+					user,
+					Result{
+						Id:      "",
+						Success: false,
+						Errors:  []string{err.Error()},
+					},
 				})
 				return
 			}
@@ -148,10 +159,13 @@ func main() {
 
 			data, err := json.Marshal(image)
 			if err != nil {
-				returnResult(w, Result{
-					Id:      image.Id,
-					Success: false,
-					Errors:  []string{err.Error()},
+				returnResult(w, UploadData{
+					user,
+					Result{
+						Id:      image.Id,
+						Success: false,
+						Errors:  []string{err.Error()},
+					},
 				})
 				return
 			}
@@ -165,10 +179,13 @@ func main() {
 			for waiting {
 				message, err := pubsub.ReceiveMessage()
 				if err != nil {
-					returnResult(w, Result{
-						Id:      image.Id,
-						Success: false,
-						Errors:  []string{err.Error()},
+					returnResult(w, UploadData{
+						user,
+						Result{
+							Id:      image.Id,
+							Success: false,
+							Errors:  []string{err.Error()},
+						},
 					})
 					return
 				}
@@ -176,10 +193,13 @@ func main() {
 				result := Result{}
 				err = json.Unmarshal([]byte(message.Payload), &result)
 				if err != nil {
-					returnResult(w, Result{
-						Id:      image.Id,
-						Success: false,
-						Errors:  []string{err.Error()},
+					returnResult(w, UploadData{
+						user,
+						Result{
+							Id:      image.Id,
+							Success: false,
+							Errors:  []string{err.Error()},
+						},
 					})
 					return
 				}
@@ -189,7 +209,10 @@ func main() {
 				if result.Id == image.Id {
 					waiting = false
 
-					returnResult(w, result)
+					returnResult(w, UploadData{
+						user,
+						result,
+					})
 					return
 				}
 			}
@@ -200,7 +223,7 @@ func main() {
 				User UserInfo
 			}
 
-			tmpl, err := template.New("upload").ParseFiles("templates/upload")
+			tmpl, err := template.New("upload.html").ParseFiles("templates/upload.html")
 			if err != nil {
 				panic(err)
 			}
@@ -246,7 +269,7 @@ func main() {
 			images = append(images, info)
 		}
 
-		pageTemplate, err := template.New("me_images").ParseFiles("templates/me_images")
+		pageTemplate, err := template.New("me_images.html").ParseFiles("templates/me_images.html")
 		if err != nil {
 			panic(err)
 		}
@@ -268,7 +291,7 @@ func main() {
 			User UserInfo
 		}
 
-		tmpl, err := template.New("index").ParseFiles("templates/index")
+		tmpl, err := template.New("index.html").ParseFiles("templates/index.html")
 		if err != nil {
 			panic(err)
 		}
diff --git a/templates/index b/templates/index.html
similarity index 60%
rename from templates/index
rename to templates/index.html
index 858580743218cdf68a5b4dd3a0d59d52a2e5bcf8..9574e78ff1367459a0453fc84b4fc5fb83c1cf92 100644
--- a/templates/index
+++ b/templates/index.html
@@ -1,4 +1,8 @@
 <!DOCTYPE html>
+<meta charset="utf-8">
+<title>ik8r</title>
+<link href="/assets/css/style.css" rel="stylesheet">
+<link href="/assets/css/fonts.css" rel="stylesheet">
 
 {{ if .User.Id }}
     <p>Welcome, {{ .User.Name }}</p>
diff --git a/templates/me_images b/templates/me_images.html
similarity index 57%
rename from templates/me_images
rename to templates/me_images.html
index 808f8d95a828c6d16f4781ba5bd7fd03c029da08..43c759af556e9378f7aa05f08c2d0260c86fb64f 100644
--- a/templates/me_images
+++ b/templates/me_images.html
@@ -2,6 +2,7 @@
 <meta charset="utf-8">
 <title>My Images | ik8r</title>
 <link href="/assets/css/style.css" rel="stylesheet">
+<link href="/assets/css/fonts.css" rel="stylesheet">
 
 <p>Welcome, {{ .User.Name }}</p>
 <p>
@@ -13,11 +14,13 @@
 <div class="images">
     {{ range .Images }}
         <a class="image" href="/i/{{ .Id }}">
-            <img src="/i/{{ .Id }}t" >
-            <div class="text">
-                <p>{{ .OriginalName }}</p>
-                <p>{{ .CreatedAt }}</p>
-                <p>{{ .MimeType }}</p>
+            <div class="image-container">
+              <img src="/i/{{ .Id }}t" >
+            </div>
+            <div class="info">
+              <span>{{ .OriginalName }}</span>
+              <span>{{ .CreatedAt }}</span>
+              <span>{{ .MimeType }}</span>
             </div>
         </a>
     {{ end }}
diff --git a/templates/upload b/templates/upload.html
similarity index 66%
rename from templates/upload
rename to templates/upload.html
index 7a4f1d0ecc09583c806e35aead1ee13d25ded113..d3e7a4cb454514b2b4c74f07176f1bdddcd0d977 100644
--- a/templates/upload
+++ b/templates/upload.html
@@ -1,4 +1,8 @@
 <!DOCTYPE html>
+<meta charset="utf-8">
+<title>Upload | ik8r</title>
+<link href="/assets/css/style.css" rel="stylesheet">
+<link href="/assets/css/fonts.css" rel="stylesheet">
 
 <p>Welcome, {{ .User.Name }}</p>
 <p>
diff --git a/templates/upload_failure.html b/templates/upload_failure.html
new file mode 100644
index 0000000000000000000000000000000000000000..9816479edd969e1ff49a8f08c9784df62446190e
--- /dev/null
+++ b/templates/upload_failure.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Upload | ik8r</title>
+<link href="/assets/css/style.css" rel="stylesheet">
+<link href="/assets/css/fonts.css" rel="stylesheet">
+
+<p>Welcome, {{ .User.Name }}</p>
+<p>
+    <a href="/me/images">My Images</a> |
+    <a href="/me/albums">My Albums</a> |
+    <a href="/upload">Upload</a>
+</p>
+
+<div class="info error">
+    <h2>Upload of {{ .Result.Id }} failed.</h2>
+    {{ range .Result.Errors }}
+    <pre>{{ . }}</pre>
+    {{ end }}
+</div>
+
+<form action="/upload/" method="POST" enctype="multipart/form-data">
+    <input type="file" name="file"/>
+    <input type="submit"/>
+</form>
\ No newline at end of file
diff --git a/templates/upload_success.html b/templates/upload_success.html
new file mode 100644
index 0000000000000000000000000000000000000000..1d7fbaffe9e7c65555cb8b8b952144dca789c95c
--- /dev/null
+++ b/templates/upload_success.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Upload | ik8r</title>
+<link href="/assets/css/style.css" rel="stylesheet">
+<link href="/assets/css/fonts.css" rel="stylesheet">
+
+<p>Welcome, {{ .User.Name }}</p>
+<p>
+    <a href="/me/images">My Images</a> |
+    <a href="/me/albums">My Albums</a> |
+    <a href="/upload">Upload</a>
+</p>
+
+<div class="info success">
+    <h2>Upload of {{ .Result.Id }} finished. <a href="/i/{{ .Result.Id }}">View</a>.</h2>
+</div>
+
+<form action="/upload/" method="POST" enctype="multipart/form-data">
+    <input type="file" name="file"/>
+    <input type="submit"/>
+</form>
\ No newline at end of file