diff --git a/.gitignore b/.gitignore
index a1338d68517ee2ad6ee11214b201e5958cb2bbc3..96733244ab3f3a360b957d83181cc65fdcc1ede1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,10 @@
+/.idea
+/bin
+/pkg
+
+vendor/pkg
+vendor/src
+
 # Binaries for programs and plugins
 *.exe
 *.dll
diff --git a/README.md b/README.md
index 8d26f7eb10cc99b7f34c4bc390be3050eea4aec3..68bd725ddca08142482143d1b5e74bbb26a3062f 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,19 @@
 # matrix-media-repo
 A domain-aware media repository for matrix
+
+# Installing
+
+Assuming Go 1.9 and JDK 1.8 are already installed on your PATH:
+```
+# Get it
+git clone https://github.com/turt2live/matrix-media-repo
+cd matrix-media-repo
+
+# Build it
+go get github.com/constabulary/gb/...
+gb vendor restore
+gb build
+
+# Run it
+bin/matrix-media-repo
+```
diff --git a/src/github.com/turt2live/matrix-media-repo/client/r0/download.go b/src/github.com/turt2live/matrix-media-repo/client/r0/download.go
new file mode 100644
index 0000000000000000000000000000000000000000..6078a4ff204a857dd7f7017cf4388a29d85eaab3
--- /dev/null
+++ b/src/github.com/turt2live/matrix-media-repo/client/r0/download.go
@@ -0,0 +1,29 @@
+package r0
+
+import (
+	"net/http"
+	"github.com/gorilla/mux"
+	"io"
+)
+
+// Request:
+//   Path params: {serverName}, {mediaId}
+//   Optional path param: {filename}
+//
+// Response:
+//   Headers: Content-Type, Content-Disposition
+//   Body: <byte[]>
+
+func DownloadMedia(w http.ResponseWriter, r *http.Request) {
+	params := mux.Vars(r)
+
+	server := params["server"]
+	mediaId := params["mediaId"]
+	filename := params["filename"]
+
+	if filename == "" {
+		filename = "testasdasdasd.jpg"
+	}
+
+	io.WriteString(w, "Server = " + server + "; mediaId = " + mediaId +"; filename = " + filename)
+}
diff --git a/src/github.com/turt2live/matrix-media-repo/client/r0/thumbnail.go b/src/github.com/turt2live/matrix-media-repo/client/r0/thumbnail.go
new file mode 100644
index 0000000000000000000000000000000000000000..3bcc46090467ab518687d7ca6a3af442b7632e71
--- /dev/null
+++ b/src/github.com/turt2live/matrix-media-repo/client/r0/thumbnail.go
@@ -0,0 +1,16 @@
+package r0
+
+import "net/http"
+
+// Request:
+//   Path params: {serverName}, {mediaId}
+//   QS: ?width=&height=&method=
+//       "method" can be crop or scale
+//
+// Response:
+//   Headers: Content-Type
+//   Body: <byte[]>
+
+func ThumbnailMedia(w http.ResponseWriter, r *http.Request) {
+
+}
diff --git a/src/github.com/turt2live/matrix-media-repo/client/r0/upload.go b/src/github.com/turt2live/matrix-media-repo/client/r0/upload.go
new file mode 100644
index 0000000000000000000000000000000000000000..edf9f92eedeeb481578554e33345cc13a6de5bde
--- /dev/null
+++ b/src/github.com/turt2live/matrix-media-repo/client/r0/upload.go
@@ -0,0 +1,15 @@
+package r0
+
+import "net/http"
+
+// Request:
+//   QS: ?filename=
+//   Headers: Content-Type
+//   Body: <byte[]>
+//
+// Response:
+//   Body: {"content_uri":"mxc://domain.com/media_id"}
+
+func UploadMedia(w http.ResponseWriter, r *http.Request) {
+
+}
diff --git a/src/github.com/turt2live/matrix-media-repo/media_repo.go b/src/github.com/turt2live/matrix-media-repo/media_repo.go
new file mode 100644
index 0000000000000000000000000000000000000000..dbcfc0d566dd1a6a2983b55f37cdcdc3d6cc86d2
--- /dev/null
+++ b/src/github.com/turt2live/matrix-media-repo/media_repo.go
@@ -0,0 +1,19 @@
+package main
+
+import (
+	"net/http"
+	"github.com/turt2live/matrix-media-repo/client/r0"
+	"github.com/gorilla/mux"
+)
+
+func main() {
+	rtr := mux.NewRouter()
+
+	rtr.HandleFunc("/_matrix/client/r0/media/upload", r0.UploadMedia).Methods("POST")
+	rtr.HandleFunc("/_matrix/client/r0/media/download/{server:[a-zA-Z0-9.]+}/{mediaId:[a-zA-Z0-9]+}", r0.DownloadMedia).Methods("GET")
+	rtr.HandleFunc("/_matrix/client/r0/media/download/{server:[a-zA-Z0-9.]+}/{mediaId:[a-zA-Z0-9]+}/{filename:[a-zA-Z0-9._-]+}", r0.DownloadMedia).Methods("GET")
+	rtr.HandleFunc("/_matrix/client/r0/media/thumbnail/{server:[a-zA-Z0-9.]+}/{mediaId:[a-zA-Z0-9]+}", r0.ThumbnailMedia).Methods("GET")
+
+	http.Handle("/", rtr)
+	http.ListenAndServe(":8000", nil)
+}
\ No newline at end of file
diff --git a/vendor/manifest b/vendor/manifest
new file mode 100644
index 0000000000000000000000000000000000000000..0d1370a58832ac38e421b9c3c596f347e1f4f83e
--- /dev/null
+++ b/vendor/manifest
@@ -0,0 +1,11 @@
+{
+	"version": 0,
+	"dependencies": [
+		{
+			"importpath": "github.com/gorilla/mux",
+			"repository": "https://github.com/gorilla/mux",
+			"revision": "2d5fef06b891c971b14aa6f71ca5ab6c03a36e0e",
+			"branch": "master"
+		}
+	]
+}