diff --git a/reader/templates/reader/book_read/invalid_filetype.html b/reader/templates/reader/book_read/invalid_filetype.html
new file mode 100644
index 0000000000000000000000000000000000000000..29e1d5476c4c14f02fba73819ba63667af0047c7
--- /dev/null
+++ b/reader/templates/reader/book_read/invalid_filetype.html
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% block content %}
+    <h1 class="title">
+        Invalid file type.
+    </h1>
+    <p>
+        Unfortunately this file type is not available at the moment. Please try again later.
+        {% if request.META.HTTP_REFERER %}
+            <a href="{{ request.META.HTTP_REFERER }}">Go back</a>
+        {% endif %}
+    </p>
+{% endblock %}
\ No newline at end of file
diff --git a/reader/templates/reader/pdf_viewer.html b/reader/templates/reader/book_read/pdf_viewer.html
similarity index 99%
rename from reader/templates/reader/pdf_viewer.html
rename to reader/templates/reader/book_read/pdf_viewer.html
index 4270dab5d5e20acfb9b13cfee2d7d7c0c0cd101f..7c81704c1c71ed152f2ad9ec16509d1c23425dca 100644
--- a/reader/templates/reader/pdf_viewer.html
+++ b/reader/templates/reader/book_read/pdf_viewer.html
@@ -1,6 +1,10 @@
 {% load static %}
 <!DOCTYPE html>
 <!--
+Based on PDF.js.
+Modified for use here - original code is at https://github.com/mozilla/pdf.js
+Original comment below:
+
 Copyright 2012 Mozilla Foundation
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,7 +39,7 @@ See https://github.com/adobe-type-tools/cmap-resources
     <link rel="stylesheet" href="{% static "pdfjs/viewer.css" %}">
 
   <script type="module">
-      {% include "reader/viewer.mjs" %}
+      {% include "reader/book_read/viewer.mjs" %}
   </script>
   </head>
 
diff --git a/reader/templates/reader/viewer.mjs b/reader/templates/reader/book_read/viewer.mjs
similarity index 100%
rename from reader/templates/reader/viewer.mjs
rename to reader/templates/reader/book_read/viewer.mjs
diff --git a/reader/templates/reader/view_book.html b/reader/templates/reader/view_book.html
index ef6611ebfb33d5009e6ffe2cfc7af2ced0699772..b33c2fb5ff957090c963b6d7adfe825b615984cb 100644
--- a/reader/templates/reader/view_book.html
+++ b/reader/templates/reader/view_book.html
@@ -38,7 +38,7 @@
                         <span>{{ user_book.percentage_read_whole }}%</span>
                     </div>
                     <div class="column is-narrow">
-                        <a href="#" class="button is-success">Read</a>
+                        <a href="{% url 'read_book' book_id=book.id %}" class="button is-success">Read</a>
                     </div>
                 </div>
             {% elif user.is_authenticated %}
diff --git a/reader/urls.py b/reader/urls.py
index 201a8cab1d5c30a11f4cec5408c3445417ca91d8..fe79163a827b3d2c599e3c509d740d5140b4090f 100644
--- a/reader/urls.py
+++ b/reader/urls.py
@@ -8,4 +8,5 @@ urlpatterns = [
     path("books/create", views.create_book, name='create_book'),
     path("books/<int:book_id>", views.view_book, name='view_book'),
     path("books/<int:book_id>/to_library", views.add_to_library, name='add_to_library'),
+    path("books/<int:book_id>/read", views.read_book, name='read_book'),
 ]
\ No newline at end of file
diff --git a/reader/views.py b/reader/views.py
index 806dddfd72f267b9f81bbb06d46531995dbef766..6a1139b2b7b07db69439d8983899be71ae543656 100644
--- a/reader/views.py
+++ b/reader/views.py
@@ -132,3 +132,22 @@ def add_to_library(request, book_id):
     userbook = UserBook(book=book, user=request.user)
     userbook.save()
     return redirect("view_book", book_id=book_id)
+
+
+def read_book(request, book_id):
+    book = get_object_or_404(Book, id=book_id)
+    if not user_can_access_book(request, book):
+        raise PermissionDenied
+    userbook = get_object_or_404(UserBook, book=book, user=request.user)
+    # Check file type
+    match book.file_type:
+        case "pdf":
+            reader_template = "reader/book_read/pdf_viewer.html"
+        case "epub":
+            reader_template = "reader/book_read/epub_viewer.html"
+        case _:
+            reader_template = "reader/book_read/invalid_filetype.html"
+    return render(request, reader_template, {
+        "book": book,
+        "userbook": userbook
+    })
\ No newline at end of file