Index: KernelRecordsMVC.Web/Views/Account/Login.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Account/Login.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Account/Login.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,66 @@
+﻿@model KernelRecordsMVC.Application.ViewModels.LoginViewModel
+
+<h2>Login</h2>
+
+<form asp-action="Login" method="post">
+
+    <div asp-validation-summary="ModelOnly"
+         class="text-danger">
+    </div>
+
+
+    <div class="mb-3">
+
+        <label asp-for="Username"
+               class="form-label">
+        </label>
+
+        <input asp-for="Username"
+               class="form-control"/>
+
+        <span asp-validation-for="Username"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <div class="mb-3">
+
+        <label asp-for="Password"
+               class="form-label">
+        </label>
+
+        <input asp-for="Password"
+               class="form-control"/>
+
+        <span asp-validation-for="Password"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <button type="submit"
+            class="btn btn-primary">
+
+        Login
+
+    </button>
+
+</form>
+
+<div class="mt-3">
+
+    Don't have an account?
+
+    <a asp-action="Register">
+        Register
+    </a>
+
+</div>
+
+@section Scripts
+{
+    <partial name="_ValidationScriptsPartial"/>
+}
Index: KernelRecordsMVC.Web/Views/Account/Register.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Account/Register.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Account/Register.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,101 @@
+﻿@model KernelRecordsMVC.Application.ViewModels.RegisterViewModel
+
+<h2>Register</h2>
+
+<form asp-action="Register" method="post">
+
+    <div class="mb-3">
+        <label asp-for="Email" class="form-label"></label>
+
+        <input asp-for="Email"
+               class="form-control"/>
+
+        <span asp-validation-for="Email"
+              class="text-danger"></span>
+    </div>
+
+
+    <div class="mb-3">
+        <label asp-for="Username" class="form-label"></label>
+
+        <input asp-for="Username"
+               class="form-control"/>
+
+        <span asp-validation-for="Username"
+              class="text-danger"></span>
+    </div>
+
+
+    <div class="mb-3">
+        <label asp-for="Password"
+               class="form-label"></label>
+
+        <input asp-for="Password"
+               class="form-control"/>
+
+        <span asp-validation-for="Password"
+              class="text-danger"></span>
+    </div>
+
+
+    <div class="mb-3">
+        <label asp-for="ConfirmPassword"
+               class="form-label"></label>
+
+        <input asp-for="ConfirmPassword"
+               class="form-control"/>
+
+        <span asp-validation-for="ConfirmPassword"
+              class="text-danger"></span>
+    </div>
+
+
+    <div class="mb-3">
+        <label asp-for="ShippingAddress"
+               class="form-label">
+
+            Shipping Address
+
+        </label>
+
+        <input asp-for="ShippingAddress"
+               class="form-control"/>
+    </div>
+
+
+    <div class="mb-3">
+        <label asp-for="TelephoneNumber"
+               class="form-label">
+
+            Telephone Number
+
+        </label>
+
+        <input asp-for="TelephoneNumber"
+               class="form-control"/>
+    </div>
+
+
+    <button type="submit"
+            class="btn btn-primary">
+
+        Register
+
+    </button>
+
+</form>
+
+<div class="mt-3">
+
+    Already have an account?
+
+    <a asp-action="Login">
+        Login
+    </a>
+
+</div>
+
+@section Scripts
+{
+    <partial name="_ValidationScriptsPartial"/>
+}
Index: KernelRecordsMVC.Web/Views/Admin/CreateProduct.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Admin/CreateProduct.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Admin/CreateProduct.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,168 @@
+﻿@model KernelRecordsMVC.Application.ViewModels.CreateProductViewModel
+
+<h1>New Product</h1>
+
+<p class="text-muted">
+    Add a physical product format for an existing release.
+</p>
+
+<form asp-action="CreateProduct"
+      method="post">
+
+    @Html.AntiForgeryToken()
+
+    <div asp-validation-summary="ModelOnly"
+         class="text-danger mb-3">
+    </div>
+
+
+    <!-- RELEASE -->
+
+    <div class="mb-3">
+
+        <label asp-for="ReleaseId"
+               class="form-label">
+        </label>
+
+        <select asp-for="ReleaseId"
+                class="form-select">
+
+            <option value="">
+                -- Select Release --
+            </option>
+
+            @foreach (var release in ViewBag.Releases)
+            {
+                <option value="@release.ReleaseId">
+
+                    @release.Title
+                    (@release.ReleaseDate.ToString("yyyy"))
+
+                </option>
+            }
+
+        </select>
+
+        <span asp-validation-for="ReleaseId"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <!-- FORMAT -->
+
+    <div class="mb-3">
+
+        <label asp-for="Format"
+               class="form-label">
+        </label>
+
+        <select asp-for="Format"
+                asp-items="Html.GetEnumSelectList<KernelRecordsMVC.Domain.Enums.ProductFormat>()"
+                class="form-select">
+
+            <option value="">
+                -- Select Format --
+            </option>
+
+        </select>
+
+        <span asp-validation-for="Format"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <!-- PRICE -->
+
+    <div class="mb-3">
+
+        <label asp-for="Price"
+               class="form-label">
+        </label>
+
+        <div class="input-group">
+
+            <span class="input-group-text">
+                $
+            </span>
+
+            <input asp-for="Price"
+                   class="form-control"
+                   step="0.01"/>
+
+        </div>
+
+        <span asp-validation-for="Price"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <!-- DESCRIPTION -->
+
+    <div class="mb-3">
+
+        <label asp-for="ProductDescription"
+               class="form-label">
+        </label>
+
+        <textarea asp-for="ProductDescription"
+                  class="form-control"
+                  rows="4">
+        </textarea>
+
+        <span asp-validation-for="ProductDescription"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <!-- STOCK -->
+
+    <div class="mb-3">
+
+        <label asp-for="Stock"
+               class="form-label">
+        </label>
+
+        <input asp-for="Stock"
+               type="number"
+               min="0"
+               class="form-control"/>
+
+        <span asp-validation-for="Stock"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <div class="d-flex gap-2">
+
+        <button type="submit"
+                class="btn btn-success">
+
+            Create Product
+
+        </button>
+
+        <a asp-action="Index"
+           class="btn btn-secondary">
+
+            Cancel
+
+        </a>
+
+    </div>
+
+</form>
+
+@section Scripts
+{
+    <partial name="_ValidationScriptsPartial"/>
+}
Index: KernelRecordsMVC.Web/Views/Admin/EditProduct.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Admin/EditProduct.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Admin/EditProduct.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,206 @@
+﻿@model KernelRecordsMVC.Application.ViewModels.EditProductViewModel
+
+<h1>Modify Product</h1>
+
+<div class="card mb-4">
+
+    <div class="card-body">
+
+        <h4>@Model.ReleaseTitle</h4>
+
+        <p class="text-muted mb-0">
+
+            Format:
+
+            <strong>
+                @Model.Format
+            </strong>
+
+        </p>
+
+    </div>
+
+</div>
+
+
+<form asp-action="EditProduct"
+      method="post">
+
+    @Html.AntiForgeryToken()
+
+    <input type="hidden"
+           asp-for="ProductId" />
+
+    <div asp-validation-summary="ModelOnly"
+         class="text-danger mb-3">
+    </div>
+
+
+    <!-- MODIFICATION TYPE -->
+
+    <div class="mb-3">
+
+        <label asp-for="ModificationType"
+               class="form-label">
+
+            Modification Type
+
+        </label>
+
+        <select asp-for="ModificationType"
+                class="form-select">
+
+            <option value="UPDATE">
+                Update Product
+            </option>
+
+            <option value="DISCOUNT">
+                Apply Discount
+            </option>
+
+        </select>
+
+        <span asp-validation-for="ModificationType"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <!-- PRICE -->
+
+    <div class="mb-3">
+
+        <label asp-for="Price"
+               class="form-label">
+
+            Price
+
+        </label>
+
+        <div class="input-group">
+
+            <span class="input-group-text">
+                $
+            </span>
+
+            <input asp-for="Price"
+                   class="form-control"
+                   step="0.01" />
+
+        </div>
+
+        <span asp-validation-for="Price"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <!-- DISCOUNT -->
+
+    <div class="mb-3">
+
+        <label asp-for="Discount"
+               class="form-label">
+
+            Discount Percentage
+
+        </label>
+
+        <div class="input-group">
+
+            <input asp-for="Discount"
+                   class="form-control"
+                   type="number"
+                   min="0"
+                   max="100"
+                   step="0.01" />
+
+            <span class="input-group-text">
+                %
+            </span>
+
+        </div>
+
+        <small class="text-muted">
+            Only used when "Apply Discount" is selected.
+        </small>
+
+        <span asp-validation-for="Discount"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <!-- DESCRIPTION -->
+
+    <div class="mb-3">
+
+        <label asp-for="ProductDescription"
+               class="form-label">
+
+            Description
+
+        </label>
+
+        <textarea asp-for="ProductDescription"
+                  class="form-control"
+                  rows="4">
+        </textarea>
+
+        <span asp-validation-for="ProductDescription"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <!-- STOCK -->
+
+    <div class="mb-3">
+
+        <label asp-for="Stock"
+               class="form-label">
+
+            Stock
+
+        </label>
+
+        <input asp-for="Stock"
+               class="form-control"
+               type="number"
+               min="0" />
+
+        <span asp-validation-for="Stock"
+              class="text-danger">
+        </span>
+
+    </div>
+
+
+    <div class="d-flex gap-2">
+
+        <button type="submit"
+                class="btn btn-success">
+
+            Save Changes
+
+        </button>
+
+        <a asp-action="Index"
+           class="btn btn-secondary">
+
+            Cancel
+
+        </a>
+
+    </div>
+
+</form>
+
+@section Scripts
+{
+    <partial name="_ValidationScriptsPartial"/>
+}
Index: KernelRecordsMVC.Web/Views/Admin/Index.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Admin/Index.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Admin/Index.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,49 @@
+﻿@{
+    ViewData["Title"] = "Admin Dashboard";
+}
+
+<h1>Admin Dashboard</h1>
+
+@if (TempData["Success"] != null)
+{
+    <div class="alert alert-success">
+        @TempData["Success"]
+    </div>
+}
+
+<div class="row mt-4">
+
+    <div class="col-md-6 mb-3">
+
+        <div class="card h-100">
+
+            <div class="card-body">
+
+                <h4>Products</h4>
+
+                <p>
+                    Create and modify products available
+                    in the music store.
+                </p>
+
+                <a asp-action="Products"
+                   class="btn btn-primary">
+
+                    Manage Products
+
+                </a>
+
+                <a asp-action="CreateProduct"
+                   class="btn btn-success">
+
+                    New Product
+
+                </a>
+
+            </div>
+
+        </div>
+
+    </div>
+
+</div>
Index: KernelRecordsMVC.Web/Views/Admin/Products.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Admin/Products.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Admin/Products.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,131 @@
+﻿@model IEnumerable<KernelRecordsMVC.Models.Product>
+
+<div class="d-flex justify-content-between align-items-center mb-4">
+
+    <div>
+
+        <h1>Product Management</h1>
+
+        <p class="text-muted">
+            Create and modify products in the store.
+        </p>
+
+    </div>
+
+
+    <a asp-action="CreateProduct"
+       class="btn btn-success">
+
+        + New Product
+
+    </a>
+
+</div>
+
+
+@if (TempData["Success"] != null)
+{
+    <div class="alert alert-success">
+
+        @TempData["Success"]
+
+    </div>
+}
+
+
+<div class="table-responsive">
+
+    <table class="table table-hover align-middle">
+
+        <thead>
+
+        <tr>
+
+            <th>Release</th>
+
+            <th>Format</th>
+
+            <th>Price</th>
+
+            <th>Stock</th>
+
+            <th></th>
+
+        </tr>
+
+        </thead>
+
+
+        <tbody>
+
+        @foreach (var product in Model)
+        {
+            <tr>
+
+                <td>
+
+                    <strong>
+                        @product.Release.Title
+                    </strong>
+
+                </td>
+
+
+                <td>
+
+                    <span class="badge bg-secondary">
+
+                        @product.Format
+
+                    </span>
+
+                </td>
+
+
+                <td>
+
+                    $@product.Price.ToString("0.00")
+
+                </td>
+
+
+                <td>
+
+                    @if (product.Stock > 0)
+                    {
+                        <span class="text-success">
+
+                            @product.Stock
+
+                        </span>
+                    }
+                    else
+                    {
+                        <span class="text-danger">
+                            Out of stock
+                        </span>
+                    }
+
+                </td>
+
+
+                <td>
+
+                    <a asp-action="EditProduct"
+                       asp-route-id="@product.ProductId"
+                       class="btn btn-outline-primary">
+
+                        Modify
+
+                    </a>
+
+                </td>
+
+            </tr>
+        }
+
+        </tbody>
+
+    </table>
+
+</div>
Index: KernelRecordsMVC.Web/Views/Home/Index.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Home/Index.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Home/Index.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,23 @@
+﻿<div class="text-center py-5">
+
+    <h1 class="display-3">
+        Music Store
+    </h1>
+
+    <p class="lead mt-3">
+        CDs · Vinyl · Cassettes
+    </p>
+
+    <p class="text-muted">
+        Discover your next favorite release.
+    </p>
+
+    <a asp-controller="Release"
+       asp-action="Index"
+       class="btn btn-primary btn-lg mt-3">
+
+        Browse Releases
+
+    </a>
+
+</div>
Index: KernelRecordsMVC.Web/Views/Home/Privacy.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Home/Privacy.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Home/Privacy.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,6 @@
+﻿@{
+    ViewData["Title"] = "Privacy Policy";
+}
+<h1>@ViewData["Title"]</h1>
+
+<p>Use this page to detail your site's privacy policy.</p>
Index: KernelRecordsMVC.Web/Views/Order/Cart.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Order/Cart.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Order/Cart.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,225 @@
+﻿@model KernelRecordsMVC.Application.ViewModels.CartViewModel
+
+<div class="d-flex justify-content-between align-items-center mb-4">
+
+    <h1>Your Cart</h1>
+
+    <a asp-controller="Release"
+       asp-action="Index"
+       class="btn btn-outline-primary">
+
+        Continue Shopping
+
+    </a>
+
+</div>
+
+
+@if (TempData["Error"] != null)
+{
+    <div class="alert alert-danger">
+
+        @TempData["Error"]
+
+    </div>
+}
+
+
+@if (!Model.Items.Any())
+{
+    <div class="text-center py-5">
+
+        <h3>Your cart is empty.</h3>
+
+        <p class="text-muted">
+            Browse our releases and add something to your order.
+        </p>
+
+        <a asp-controller="Release"
+           asp-action="Index"
+           class="btn btn-primary">
+
+            Browse Releases
+
+        </a>
+
+    </div>
+
+    return;
+}
+
+
+<div class="table-responsive">
+
+    <table class="table align-middle">
+
+        <thead>
+
+        <tr>
+
+            <th>Release</th>
+
+            <th>Format</th>
+
+            <th>Price</th>
+
+            <th>Quantity</th>
+
+            <th>Total</th>
+
+            <th></th>
+
+        </tr>
+
+        </thead>
+
+
+        <tbody>
+
+        @foreach (var item in Model.Items)
+        {
+            <tr>
+
+                <td>
+
+                    <a asp-controller="Release"
+                       asp-action="Details"
+                       asp-route-id="@item.ReleaseId">
+
+                        @item.ReleaseTitle
+
+                    </a>
+
+                </td>
+
+
+                <td>
+
+                    <span class="badge bg-secondary">
+
+                        @item.Format
+
+                    </span>
+
+                </td>
+
+
+                <td>
+
+                    $@item.Price.ToString("0.00")
+
+                </td>
+
+
+                <td>
+
+                    <form asp-action="UpdateQuantity"
+                          method="post"
+                          class="d-flex">
+
+                        @Html.AntiForgeryToken()
+
+                        <input type="hidden"
+                               name="id"
+                               value="@item.ProductId" />
+
+                        <input type="number"
+                               name="quantity"
+                               value="@item.Quantity"
+                               min="1"
+                               max="@item.Stock"
+                               class="form-control"
+                               style="width:90px;" />
+
+                        <button type="submit"
+                                class="btn btn-outline-secondary ms-2">
+
+                            Update
+
+                        </button>
+
+                    </form>
+
+                </td>
+
+
+                <td>
+
+                    <strong>
+
+                        $@item.Total.ToString("0.00")
+
+                    </strong>
+
+                </td>
+
+
+                <td>
+
+                    <form asp-action="RemoveProduct"
+                          method="post">
+
+                        @Html.AntiForgeryToken()
+
+                        <input type="hidden"
+                               name="id"
+                               value="@item.ProductId" />
+
+                        <button type="submit"
+                                class="btn btn-outline-danger">
+
+                            Remove
+
+                        </button>
+
+                    </form>
+
+                </td>
+
+            </tr>
+        }
+
+        </tbody>
+
+    </table>
+
+</div>
+
+
+<div class="row justify-content-end">
+
+    <div class="col-md-4">
+
+        <div class="card">
+
+            <div class="card-body">
+
+                <h4>Order Summary</h4>
+
+                <hr />
+
+                <div class="d-flex justify-content-between">
+
+                    <span>Total</span>
+
+                    <strong>
+                        $@Model.Total.ToString("0.00")
+                    </strong>
+
+                </div>
+
+
+                <a asp-action="Checkout"
+                   class="btn btn-success w-100 mt-3">
+
+                    Proceed to Checkout
+
+                </a>
+
+            </div>
+
+        </div>
+
+    </div>
+
+</div>
Index: KernelRecordsMVC.Web/Views/Release/Details.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Release/Details.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Release/Details.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,147 @@
+﻿@model KernelRecordsMVC.Models.Release
+
+<div class="row">
+
+    <div class="col-md-5">
+
+        <img src="@Model.CoverPhoto"
+             class="img-fluid rounded"
+             alt="@Model.Title" />
+
+    </div>
+
+
+    <div class="col-md-7">
+
+        <h1>@Model.Title</h1>
+
+        <p class="lead">
+            @Model.Genre
+        </p>
+
+        <p>
+            <strong>Record Label:</strong>
+            @Model.RecordLabel
+        </p>
+
+        <p>
+            <strong>Release Date:</strong>
+            @Model.ReleaseDate.ToString("MMMM dd, yyyy")
+        </p>
+
+
+        <h5>Artists</h5>
+
+        <p>
+
+            @string.Join(
+                ", ",
+                Model.ReleaseArtists
+                    .OrderBy(x => x.ReleaseOrdinal)
+                    .Select(x => x.Artist.ArtistName)
+            )
+
+        </p>
+
+    </div>
+
+</div>
+
+
+<hr />
+
+
+<h2>Available Products</h2>
+
+<div class="row">
+
+@foreach (var product in Model.Products)
+{
+    <div class="col-md-4 mb-3">
+
+        <div class="card h-100">
+
+            <div class="card-body">
+
+                <h4>
+                    @product.Format
+                </h4>
+
+                <h5>
+                    $@product.Price
+                </h5>
+
+                <p>
+                    @product.ProductDescription
+                </p>
+
+
+                @if (product.Stock > 0)
+                {
+                    <p class="text-success">
+                        In stock: @product.Stock
+                    </p>
+
+                    <a asp-controller="Order"
+                       asp-action="AddProduct"
+                       asp-route-id="@product.ProductId"
+                       class="btn btn-success">
+
+                        Add to Cart
+
+                    </a>
+                }
+                else
+                {
+                    <p class="text-danger">
+                        Out of stock
+                    </p>
+                }
+
+            </div>
+
+        </div>
+
+    </div>
+}
+
+</div>
+
+
+@if (Model.Album != null)
+{
+    <hr />
+
+    <h2>Track List</h2>
+
+    <ol>
+
+    @foreach (var albumSong in Model.Album.AlbumSongs
+        .OrderBy(x => x.SongId))
+    {
+        <li>
+
+            @albumSong.Song.SongName
+
+            <span class="text-muted">
+                (@albumSong.Song.SongDuration)
+            </span>
+
+        </li>
+    }
+
+    </ol>
+}
+
+
+@if (Model.SingleRelease != null)
+{
+    <hr />
+
+    <h2>Single</h2>
+
+    <p>
+        Duration:
+        @Model.SingleRelease.Duration
+    </p>
+}
Index: KernelRecordsMVC.Web/Views/Release/Index.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Release/Index.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Release/Index.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,148 @@
+﻿@model IEnumerable<KernelRecordsMVC.Models.Release>
+
+<div class="d-flex justify-content-between align-items-center mb-4">
+
+    <div>
+        <h1>Music Store</h1>
+        <p class="text-muted">
+            Browse CDs, vinyl records and cassettes.
+        </p>
+    </div>
+
+</div>
+
+
+<!-- SEARCH -->
+
+<form asp-action="Index"
+      method="get"
+      class="row g-2 mb-4">
+
+    <div class="col-md-6">
+
+        <input type="text"
+               name="search"
+               value="@ViewBag.Search"
+               class="form-control"
+               placeholder="Search releases..." />
+
+    </div>
+
+
+    <div class="col-md-3">
+
+        <select name="genre"
+                class="form-select">
+
+            <option value="">
+                All genres
+            </option>
+
+            @foreach (var genre in ViewBag.Genres)
+            {
+                <option value="@genre"
+                        selected="@(ViewBag.Genre == genre)">
+
+                    @genre
+
+                </option>
+            }
+
+        </select>
+
+    </div>
+
+
+    <div class="col-md-3">
+
+        <button type="submit"
+                class="btn btn-primary w-100">
+
+            Search
+
+        </button>
+
+    </div>
+
+</form>
+
+
+<!-- RELEASES -->
+
+<div class="row">
+
+@foreach (var release in Model)
+{
+    <div class="col-md-4 mb-4">
+
+        <div class="card h-100 shadow-sm">
+
+            @if (!string.IsNullOrEmpty(release.CoverPhoto))
+            {
+                <img src="@release.CoverPhoto"
+                     class="card-img-top"
+                     style="height:300px; object-fit:cover;"
+                     alt="@release.Title" />
+            }
+
+            <div class="card-body">
+
+                <h4 class="card-title">
+                    @release.Title
+                </h4>
+
+                <p class="text-muted mb-1">
+                    @release.Genre
+                </p>
+
+                <p class="small">
+                    @release.ReleaseDate.ToString("yyyy")
+                </p>
+
+
+                <!-- ARTISTS -->
+
+                <p>
+
+                    @string.Join(
+                        ", ",
+                        release.ReleaseArtists
+                            .OrderBy(x => x.ReleaseOrdinal)
+                            .Select(x => x.Artist.ArtistName)
+                    )
+
+                </p>
+
+
+                <!-- AVAILABLE FORMATS -->
+
+                <div class="mb-3">
+
+                    @foreach (var product in release.Products)
+                    {
+                        <span class="badge bg-secondary me-1">
+
+                            @product.Format
+
+                        </span>
+                    }
+
+                </div>
+
+
+                <a asp-action="Details"
+                   asp-route-id="@release.ReleaseId"
+                   class="btn btn-primary">
+
+                    View Release
+
+                </a>
+
+            </div>
+
+        </div>
+
+    </div>
+}
+
+</div>
Index: KernelRecordsMVC.Web/Views/Shared/Error.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Shared/Error.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Shared/Error.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,25 @@
+﻿@model ErrorViewModel
+@{
+    ViewData["Title"] = "Error";
+}
+
+<h1 class="text-danger">Error.</h1>
+<h2 class="text-danger">An error occurred while processing your request.</h2>
+
+@if (Model.ShowRequestId)
+{
+    <p>
+        <strong>Request ID:</strong> <code>@Model.RequestId</code>
+    </p>
+}
+
+<h3>Development Mode</h3>
+<p>
+    Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
+</p>
+<p>
+    <strong>The Development environment shouldn't be enabled for deployed applications.</strong>
+    It can result in displaying sensitive information from exceptions to end users.
+    For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
+    and restarting the app.
+</p>
Index: KernelRecordsMVC.Web/Views/Shared/_Layout.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Shared/_Layout.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Shared/_Layout.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,49 @@
+﻿<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+    <title>@ViewData["Title"] - KernelRecordsMVC</title>
+    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css"/>
+    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true"/>
+    <link rel="stylesheet" href="~/KernelRecordsMVC.styles.css" asp-append-version="true"/>
+</head>
+<body>
+<header>
+    <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
+        <div class="container-fluid">
+            <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">KernelRecordsMVC</a>
+            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
+                    aria-expanded="false" aria-label="Toggle navigation">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
+                <ul class="navbar-nav flex-grow-1">
+                    <li class="nav-item">
+                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
+                    </li>
+                </ul>
+            </div>
+        </div>
+    </nav>
+</header>
+<div class="container">
+    <main role="main" class="pb-3">
+        @RenderBody()
+    </main>
+</div>
+
+<footer class="border-top footer text-muted">
+    <div class="container">
+        &copy; 2026 - KernelRecordsMVC - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
+    </div>
+</footer>
+<script src="~/lib/jquery/dist/jquery.min.js"></script>
+<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
+<script src="~/js/site.js" asp-append-version="true"></script>
+@await RenderSectionAsync("Scripts", required: false)
+</body>
+</html>
Index: KernelRecordsMVC.Web/Views/Shared/_Layout.cshtml.css
===================================================================
--- KernelRecordsMVC.Web/Views/Shared/_Layout.cshtml.css	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Shared/_Layout.cshtml.css	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,48 @@
+﻿/* Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
+for details on configuring this project to bundle and minify static web assets. */
+
+a.navbar-brand {
+  white-space: normal;
+  text-align: center;
+  word-break: break-all;
+}
+
+a {
+  color: #0077cc;
+}
+
+.btn-primary {
+  color: #fff;
+  background-color: #1b6ec2;
+  border-color: #1861ac;
+}
+
+.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
+  color: #fff;
+  background-color: #1b6ec2;
+  border-color: #1861ac;
+}
+
+.border-top {
+  border-top: 1px solid #e5e5e5;
+}
+.border-bottom {
+  border-bottom: 1px solid #e5e5e5;
+}
+
+.box-shadow {
+  box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
+}
+
+button.accept-policy {
+  font-size: 1rem;
+  line-height: inherit;
+}
+
+.footer {
+  position: absolute;
+  bottom: 0;
+  width: 100%;
+  white-space: nowrap;
+  line-height: 60px;
+}
Index: KernelRecordsMVC.Web/Views/Shared/_ValidationScriptsPartial.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Shared/_ValidationScriptsPartial.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Shared/_ValidationScriptsPartial.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,2 @@
+﻿<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
+<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
Index: KernelRecordsMVC.Web/Views/_ViewImports.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/_ViewImports.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/_ViewImports.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,3 @@
+﻿@using KernelRecordsMVC
+@using KernelRecordsMVC.Models
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Index: KernelRecordsMVC.Web/Views/_ViewStart.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/_ViewStart.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/_ViewStart.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
@@ -0,0 +1,3 @@
+﻿@{
+    Layout = "_Layout";
+}
