diff --git a/app/Http/Controllers/BookController.php b/app/Http/Controllers/BookController.php
index 9eb19ce65..325fd1ffa 100644
--- a/app/Http/Controllers/BookController.php
+++ b/app/Http/Controllers/BookController.php
@@ -77,21 +77,42 @@ class BookController extends Controller
      * Show the form for creating a new book.
      * @return Response
      */
-    public function create()
+    public function create($shelfSlug = null)
     {
+        if ($shelfSlug !== null) {
+            $bookshelf = $this->entityRepo->getBySlug('bookshelf', $shelfSlug);
+            $this->checkOwnablePermission('bookshelf-update', $bookshelf);
+        } else {
+            $bookshelf = null;
+        }
+
         $this->checkPermission('book-create-all');
         $this->setPageTitle(trans('entities.books_create'));
-        return view('books.create');
+        return view('books.create', [
+            'bookshelf' => $bookshelf
+        ]);
     }
 
     /**
      * Store a newly created book in storage.
      *
-     * @param  Request $request
+     * @param Request $request
+     * @param $shelfSlug
      * @return Response
      */
-    public function store(Request $request)
+    public function store(Request $request, $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',
@@ -99,6 +120,19 @@ class BookController extends Controller
         ]);
         $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);
+            Activity::add($bookshelf, 'bookshelf_update');
+
+            return redirect($bookshelf->getUrl());
+        }
+
         return redirect($book->getUrl());
     }
 
diff --git a/resources/views/books/create.blade.php b/resources/views/books/create.blade.php
index 9079a3bf9..e33ae2bae 100644
--- a/resources/views/books/create.blade.php
+++ b/resources/views/books/create.blade.php
@@ -17,7 +17,7 @@
 
         <div class="content-wrap card">
             <h1 class="list-heading">{{ trans('entities.books_create') }}</h1>
-            <form action="{{ baseUrl("/books") }}" method="POST" enctype="multipart/form-data">
+            <form action="{{ isset($bookshelf) ? $bookshelf->getUrl('/create-book') : baseUrl('/books') }}" method="POST" enctype="multipart/form-data">
                 @include('books.form')
             </form>
         </div>
diff --git a/resources/views/shelves/show.blade.php b/resources/views/shelves/show.blade.php
index 0cfaebbd7..77423c144 100644
--- a/resources/views/shelves/show.blade.php
+++ b/resources/views/shelves/show.blade.php
@@ -23,6 +23,12 @@
                     <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 text-bookshelf">
+                                <span class="icon">@icon('add')</span>
+                                <span>{{ trans('entities.books_create') }}</span>
+                            </a>
+                        @endif
                         @if(userCan('bookshelf-update', $shelf))
                             <a href="{{ $shelf->getUrl('/edit') }}" class="icon-list-item text-bookshelf">
                                 <span class="icon">@icon('edit')</span>
diff --git a/routes/web.php b/routes/web.php
index 7c2c5917e..831d54c85 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -26,6 +26,8 @@ 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('/create-book', 'BookController@create');
diff --git a/tests/Entity/BookShelfTest.php b/tests/Entity/BookShelfTest.php
index 0707fc5ff..a95f31b52 100644
--- a/tests/Entity/BookShelfTest.php
+++ b/tests/Entity/BookShelfTest.php
@@ -99,9 +99,11 @@ class BookShelfTest extends TestCase
     {
         $shelf = Bookshelf::first();
         $resp = $this->asAdmin()->get($shelf->getUrl());
+        $resp->assertSee($shelf->getUrl('/create-book'));
         $resp->assertSee($shelf->getUrl('/edit'));
         $resp->assertSee($shelf->getUrl('/permissions'));
         $resp->assertSee($shelf->getUrl('/delete'));
+        $resp->assertElementContains('a', 'Create New Book');
         $resp->assertElementContains('a', 'Edit');
         $resp->assertElementContains('a', 'Permissions');
         $resp->assertElementContains('a', 'Delete');
@@ -148,6 +150,14 @@ class BookShelfTest extends TestCase
         $this->assertDatabaseHas('bookshelves_books', ['bookshelf_id' => $shelf->id, 'book_id' => $booksToInclude[1]->id]);
     }
 
+    public function test_shelf_create_new_book()
+    {
+        $shelf = Bookshelf::first();
+        $resp = $this->asEditor()->get($shelf->getUrl('/create-book'));
+
+        $resp->assertSeeText('Create New Book');
+    }
+
     public function test_shelf_delete()
     {
         $shelf = Bookshelf::first();