diff --git a/reader/models.py b/reader/models.py
index ba7b8d40a4b8f1f468a2186958f245c2cd168bd4..b86672f68adcafaa132a629702d81e71ebab4899 100644
--- a/reader/models.py
+++ b/reader/models.py
@@ -160,6 +160,9 @@ class UserBook(models.Model):
     # Last read
     last_read = models.DateTimeField(auto_now_add=True)
 
+    def percentage_read_whole(self):
+        return round(self.percentage_read * 100)
+
     class Meta:
         constraints = [
             UniqueConstraint(fields=['user', 'book'], name='unique_user_book'),
diff --git a/reader/templates/reader/view_book.html b/reader/templates/reader/view_book.html
index 3988bad978b51f94fd1f52f9d734c34e32da84f2..ef6611ebfb33d5009e6ffe2cfc7af2ced0699772 100644
--- a/reader/templates/reader/view_book.html
+++ b/reader/templates/reader/view_book.html
@@ -20,7 +20,35 @@
                     <i class="bi bi-lock"></i>
                 {% endif %}
             </h1>
+            <h2 class="subtitle">{{ book.author }}</h2>
             <br>
+            {% if book.description %}
+                <p>{{ book.description|escape|truncatewords:20 }}</p>
+            {% endif %}
+            {% if user_in_library  %}
+                <br>
+                <br>
+                <div class="columns">
+                    <div class="column">
+                        <progress class="progress is-success" value="{{ user_book.percentage_read_whole }}" max="100">
+                            {{ user_book.percentage_read_whole }}%
+                        </progress>
+                    </div>
+                    <div class="column is-narrow">
+                        <span>{{ user_book.percentage_read_whole }}%</span>
+                    </div>
+                    <div class="column is-narrow">
+                        <a href="#" class="button is-success">Read</a>
+                    </div>
+                </div>
+            {% elif user.is_authenticated %}
+                <form action="{% url 'add_to_library' book_id=book.id %}" method="post">
+                    {% csrf_token %}
+                    <button type="submit" class="button is-success">Add to library</button>
+                </form>
+            {% else %}
+                <a href="{% url 'login' %}" class="button is-primary">Login to read</a>
+            {% endif %}
         </div>
     </div>
 
diff --git a/reader/urls.py b/reader/urls.py
index 7ea7ba329a432cdec764109616de83b5212486bd..46633ebc1987b3e3f2db1ef3da4e7f79662dd869 100644
--- a/reader/urls.py
+++ b/reader/urls.py
@@ -7,4 +7,5 @@ urlpatterns = [
     path("library", views.library, name='library'),
     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='edit_book'),
 ]
\ No newline at end of file
diff --git a/reader/views.py b/reader/views.py
index 3287da7b5f1d8cbfb76bb4e4e59d6ee14379e3ef..c3aa5da6432c9a43fec7f2dcf503090b354ee7b4 100644
--- a/reader/views.py
+++ b/reader/views.py
@@ -1,11 +1,22 @@
 from django.contrib.auth.decorators import login_required
 from django.core.exceptions import PermissionDenied
 from django.shortcuts import render, redirect, get_object_or_404
+from django.views.decorators.http import require_POST
 
 from reader.forms import BookForm
 from reader.models import Book, UserBook
 
 
+def user_can_access_book(request, book) -> bool:
+    has_permission = False
+    if book.public or book.owner == request.user:
+        has_permission = True
+    elif request.user.is_authenticated:
+        has_permission = (request.user.has_perm("reader.book_view_others", book)
+                          or request.user.has_perm("reader.book_view_others"))
+    return has_permission
+
+
 def index(request):
     return render(request, "reader/index.html")
 
@@ -70,16 +81,7 @@ def view_book(request, book_id):
     book = get_object_or_404(Book, id=book_id)
 
     # Check user has permission to access this book
-    has_permission = False
-    if book.public:
-        has_permission = True
-    elif book.owner == request.user:
-        has_permission = True
-    elif request.user.is_authenticated:
-        has_permission = (request.user.has_perm("reader.book_view_others", book)
-                          or request.user.has_perm("reader.book_view_others"))
-
-    if not has_permission:
+    if not user_can_access_book(request, book):
         raise PermissionDenied
 
     # Get the user's book stats for this book
@@ -91,7 +93,7 @@ def view_book(request, book_id):
     # Render
     return render(request, "reader/view_book.html", {
         "book": book,
-        "user_book_q": user_book_q,
+        "user_book": user_book_q.first(),
         "user_in_library": user_in_library
     })
 
@@ -119,4 +121,14 @@ def library(request):
             "last_progress_device": userbook.last_progress_device,
         }
         books.append(ub)
-    return render(request, "reader/library.html", {"books": books, "page": "library"})
\ No newline at end of file
+    return render(request, "reader/library.html", {"books": books, "page": "library"})
+
+@require_POST
+@login_required(login_url='login')
+def add_to_library(request, book_id):
+    book = get_object_or_404(Book, id=book_id)
+    if not user_can_access_book(request, book):
+        raise PermissionDenied
+    userbook = UserBook(book=book, user=request.user)
+    userbook.save()
+    return redirect("library")