diff --git a/app/Entities/Bookshelf.php b/app/Entities/Bookshelf.php
index 08ce8d8cb..1de767fec 100644
--- a/app/Entities/Bookshelf.php
+++ b/app/Entities/Bookshelf.php
@@ -26,7 +26,9 @@ class Bookshelf extends Entity
      */
     public function books()
     {
-        return $this->belongsToMany(Book::class, 'bookshelves_books', 'bookshelf_id', 'book_id')->orderBy('order', 'asc');
+        return $this->belongsToMany(Book::class, 'bookshelves_books', 'bookshelf_id', 'book_id')
+            ->withPivot('order')
+            ->orderBy('order', 'asc');
     }
 
     /**
diff --git a/app/Entities/Repos/EntityRepo.php b/app/Entities/Repos/EntityRepo.php
index 6fc2689a5..3bf70c327 100644
--- a/app/Entities/Repos/EntityRepo.php
+++ b/app/Entities/Repos/EntityRepo.php
@@ -577,6 +577,21 @@ class EntityRepo
         $shelf->books()->sync($syncData);
     }
 
+    /**
+     * Append a Book to a BookShelf.
+     * @param Bookshelf $shelf
+     * @param Book $book
+     */
+    public function appendBookToShelf(Bookshelf $shelf, Book $book)
+    {
+        if ($shelf->contains($book)) {
+            return;
+        }
+
+        $maxOrder = $shelf->books()->max('order');
+        $shelf->books()->attach($book->id, ['order' => $maxOrder + 1]);
+    }
+
     /**
      * Change the book that an entity belongs to.
      * @param string $type
diff --git a/app/Http/Controllers/BookController.php b/app/Http/Controllers/BookController.php
index 862d2b021..24e0d784d 100644
--- a/app/Http/Controllers/BookController.php
+++ b/app/Http/Controllers/BookController.php
@@ -75,15 +75,16 @@ class BookController extends Controller
 
     /**
      * Show the form for creating a new book.
+     * @param string $shelfSlug
      * @return Response
+     * @throws \BookStack\Exceptions\NotFoundException
      */
-    public function create($shelfSlug = null)
+    public function create(string $shelfSlug = null)
     {
+        $bookshelf = null;
         if ($shelfSlug !== null) {
             $bookshelf = $this->entityRepo->getBySlug('bookshelf', $shelfSlug);
             $this->checkOwnablePermission('bookshelf-update', $bookshelf);
-        } else {
-            $bookshelf = null;
         }
 
         $this->checkPermission('book-create-all');
@@ -97,39 +98,30 @@ class BookController extends Controller
      * Store a newly created book in storage.
      *
      * @param Request $request
-     * @param $shelfSlug
+     * @param string $shelfSlug
      * @return Response
+     * @throws \BookStack\Exceptions\NotFoundException
      */
-    public function store(Request $request, $shelfSlug = null)
+    public function store(Request $request, string $shelfSlug = null)
     {
-        if ($shelfSlug !== null) {
-            $bookshelf = $this->entityRepo->getBySlug('bookshelf', $shelfSlug);
-            $this->checkOwnablePermission('bookshelf-update', $bookshelf);
-
-            $shelfBooks = $this->entityRepo->getBookshelfChildren($bookshelf);
-            $shelfBookIds = $shelfBooks->pluck('id');
-        } else {
-            $bookshelf = null;
-        }
-
         $this->checkPermission('book-create-all');
         $this->validate($request, [
             'name' => 'required|string|max:255',
             'description' => 'string|max:1000'
         ]);
+
+        $bookshelf = null;
+        if ($shelfSlug !== null) {
+            $bookshelf = $this->entityRepo->getBySlug('bookshelf', $shelfSlug);
+            $this->checkOwnablePermission('bookshelf-update', $bookshelf);
+        }
+
         $book = $this->entityRepo->createFromInput('book', $request->all());
         Activity::add($book, 'book_create', $book->id);
 
         if ($bookshelf) {
-            $shelfBookIds = $shelfBookIds->toArray();
-            array_unshift($shelfBookIds, $book->id);
-
-            $shelfBookIds = implode(',', $shelfBookIds);
-
-            $this->entityRepo->updateShelfBooks($bookshelf, $shelfBookIds);
+            $this->entityRepo->appendBookToShelf($bookshelf, $book);
             Activity::add($bookshelf, 'bookshelf_update');
-
-            return redirect($bookshelf->getUrl());
         }
 
         return redirect($book->getUrl());
diff --git a/resources/lang/en/entities.php b/resources/lang/en/entities.php
index c2c15d72f..8a3aeb022 100644
--- a/resources/lang/en/entities.php
+++ b/resources/lang/en/entities.php
@@ -74,6 +74,7 @@ return [
     'shelves_create' => 'Create New Shelf',
     'shelves_popular' => 'Popular Shelves',
     'shelves_new' => 'New Shelves',
+    'shelves_new_action' => 'New Shelf',
     'shelves_popular_empty' => 'The most popular shelves will appear here.',
     'shelves_new_empty' => 'The most recently created shelves will appear here.',
     'shelves_save' => 'Save Shelf',
@@ -104,6 +105,7 @@ return [
     'books_popular' => 'Popular Books',
     'books_recent' => 'Recent Books',
     'books_new' => 'New Books',
+    'books_new_action' => 'New Book',
     'books_popular_empty' => 'The most popular books will appear here.',
     'books_new_empty' => 'The most recently created books will appear here.',
     'books_create' => 'Create New Book',
diff --git a/resources/views/shelves/index.blade.php b/resources/views/shelves/index.blade.php
index 76f26c694..8cf959b1e 100644
--- a/resources/views/shelves/index.blade.php
+++ b/resources/views/shelves/index.blade.php
@@ -12,7 +12,7 @@
             @if($currentUser->can('bookshelf-create-all'))
                 <a href="{{ baseUrl("/create-shelf") }}" class="icon-list-item">
                     <span>@icon('add')</span>
-                    <span>{{ trans('entities.shelves_create') }}</span>
+                    <span>{{ trans('entities.shelves_new_action') }}</span>
                 </a>
             @endif
             @include('partials.view-toggle', ['view' => $view, 'type' => 'shelf'])
diff --git a/resources/views/shelves/show.blade.php b/resources/views/shelves/show.blade.php
index a57abecb3..3a9d59951 100644
--- a/resources/views/shelves/show.blade.php
+++ b/resources/views/shelves/show.blade.php
@@ -23,8 +23,8 @@
                     <hr>
                     <p class="text-muted italic mt-xl mb-m">{{ trans('entities.shelves_empty_contents') }}</p>
                     <div class="icon-list inline block">
-                        @if($currentUser->can('book-create-all'))
-                            <a href="{{ $shelf->getUrl('/create-book') }}" class="icon-list-item">
+                        @if(userCan('book-create-all') && userCan('bookshelf-update', $shelf))
+                            <a href="{{ $shelf->getUrl('/create-book') }}" class="icon-list-item text-book">
                                 <span class="icon">@icon('add')</span>
                                 <span>{{ trans('entities.books_create') }}</span>
                             </a>
@@ -80,13 +80,15 @@
         <h5>{{ trans('common.actions') }}</h5>
         <div class="icon-list text-primary">
 
-            @if($currentUser->can('book-create-all'))
+            @if(userCan('book-create-all') && userCan('bookshelf-update', $shelf))
                 <a href="{{ $shelf->getUrl('/create-book') }}" class="icon-list-item">
                     <span class="icon">@icon('add')</span>
-                    <span>{{ trans('entities.books_create') }}</span>
+                    <span>{{ trans('entities.books_new_action') }}</span>
                 </a>
             @endif
 
+            <hr class="primary-background">
+
             @if(userCan('bookshelf-update', $shelf))
                 <a href="{{ $shelf->getUrl('/edit') }}" class="icon-list-item">
                     <span>@icon('edit')</span>
diff --git a/routes/web.php b/routes/web.php
index 831d54c85..d1a8b7969 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -26,8 +26,9 @@ Route::group(['middleware' => 'auth'], function () {
         Route::get('/{slug}/permissions', 'BookshelfController@showPermissions');
         Route::put('/{slug}/permissions', 'BookshelfController@permissions');
         Route::post('/{slug}/copy-permissions', 'BookshelfController@copyPermissions');
-        Route::get('/{slug}/create-book', 'BookController@create');
-        Route::post('/{slug}/create-book', 'BookController@store');
+
+        Route::get('/{shelfSlug}/create-book', 'BookController@create');
+        Route::post('/{shelfSlug}/create-book', 'BookController@store');
     });
 
     Route::get('/create-book', 'BookController@create');
diff --git a/tests/Entity/BookShelfTest.php b/tests/Entity/BookShelfTest.php
index e49c24739..158fb5ca1 100644
--- a/tests/Entity/BookShelfTest.php
+++ b/tests/Entity/BookShelfTest.php
@@ -48,7 +48,7 @@ class BookShelfTest extends TestCase
     public function test_shelves_page_contains_create_link()
     {
         $resp = $this->asEditor()->get('/shelves');
-        $resp->assertElementContains('a', 'Create New Shelf');
+        $resp->assertElementContains('a', 'New Shelf');
     }
 
     public function test_shelves_create()
@@ -103,7 +103,7 @@ class BookShelfTest extends TestCase
         $resp->assertSee($shelf->getUrl('/edit'));
         $resp->assertSee($shelf->getUrl('/permissions'));
         $resp->assertSee($shelf->getUrl('/delete'));
-        $resp->assertElementContains('a', 'Create New Book');
+        $resp->assertElementContains('a', 'New Book');
         $resp->assertElementContains('a', 'Edit');
         $resp->assertElementContains('a', 'Permissions');
         $resp->assertElementContains('a', 'Delete');
@@ -164,9 +164,15 @@ class BookShelfTest extends TestCase
             'name' => $testName,
             'description' => 'Book in shelf description'
         ]);
+        $createBookResp->assertRedirect();
+
+        $newBook = Book::query()->orderBy('id', 'desc')->first();
+        $this->assertDatabaseHas('bookshelves_books', [
+            'bookshelf_id' => $shelf->id,
+            'book_id' => $newBook->id,
+        ]);
 
         $resp = $this->asEditor()->get($shelf->getUrl());
-
         $resp->assertSee($testName);
     }
 
diff --git a/tests/Permissions/RolesTest.php b/tests/Permissions/RolesTest.php
index 423db1bf0..5bbdcf0bb 100644
--- a/tests/Permissions/RolesTest.php
+++ b/tests/Permissions/RolesTest.php
@@ -215,7 +215,7 @@ class RolesTest extends BrowserKitTest
         $this->checkAccessPermission('bookshelf-create-all', [
             '/create-shelf'
         ], [
-            '/shelves' => 'Create New Shelf'
+            '/shelves' => 'New Shelf'
         ]);
 
         $this->visit('/create-shelf')