diff --git a/lib/shift73k_web.ex b/lib/shift73k_web.ex
index 0eaba35a..e5193f6d 100644
--- a/lib/shift73k_web.ex
+++ b/lib/shift73k_web.ex
@@ -46,7 +46,7 @@ defmodule Shift73kWeb do
   def live_view do
     quote do
       use Phoenix.LiveView,
-        layout: {Shift73kWeb.LayoutView, "live.html"}
+        layout: {Shift73kWeb.LayoutView, :live}
 
       unquote(view_helpers())
       import Shift73kWeb.LiveHelpers
@@ -100,7 +100,7 @@ defmodule Shift73kWeb do
       use Phoenix.HTML
 
       # Import LiveView helpers (live_render, live_component, live_patch, etc)
-      import Phoenix.LiveView.Helpers
+      import Phoenix.Component
 
       # Import basic rendering functionality (render, render_layout, etc)
       import Phoenix.View
diff --git a/lib/shift73k_web/live/live_helpers.ex b/lib/shift73k_web/live/live_helpers.ex
index 36c33170..3afad08b 100644
--- a/lib/shift73k_web/live/live_helpers.ex
+++ b/lib/shift73k_web/live/live_helpers.ex
@@ -1,5 +1,6 @@
 defmodule Shift73kWeb.LiveHelpers do
   import Phoenix.LiveView
+  import Phoenix.Component
 
   alias Shift73k.Accounts
   alias Shift73k.Accounts.User
diff --git a/lib/shift73k_web/live/shift_template_live/form_component.html.heex b/lib/shift73k_web/live/shift_template_live/form_component.html.heex
index 66f944d9..ca4c00a1 100644
--- a/lib/shift73k_web/live/shift_template_live/form_component.html.heex
+++ b/lib/shift73k_web/live/shift_template_live/form_component.html.heex
@@ -1,6 +1,6 @@
 <div>
 
-  <.form let={f} for={@changeset} phx-change="validate" phx-submit="save" phx-target={@myself} id="shift_template-form">
+  <.form :let={f} for={@changeset} phx-change="validate" phx-submit="save" phx-target={@myself} id="shift_template-form">
 
     <div class="modal-body">
 
diff --git a/lib/shift73k_web/live/user/registration.html.heex b/lib/shift73k_web/live/user/registration.html.heex
index ca00d39c..6394c930 100644
--- a/lib/shift73k_web/live/user/registration.html.heex
+++ b/lib/shift73k_web/live/user/registration.html.heex
@@ -6,7 +6,7 @@
   </h2>
   <p class="lead">Create an account to manage your work shifts with us.</p>
 
-  <.form let={f} for={@changeset} phx-change="validate" phx-submit="save" novalidate id="reg_form">
+  <.form :let={f} for={@changeset} phx-change="validate" phx-submit="save" novalidate id="reg_form">
 
     <%= label f, :email, class: "form-label" %>
     <div class="inner-addon left-addon mb-3" phx-feedback-for={input_id(f, :email)}>
diff --git a/lib/shift73k_web/live/user/reset_password.html.heex b/lib/shift73k_web/live/user/reset_password.html.heex
index 7650f451..5bfd3888 100644
--- a/lib/shift73k_web/live/user/reset_password.html.heex
+++ b/lib/shift73k_web/live/user/reset_password.html.heex
@@ -6,7 +6,7 @@
   </h2>
   <p class="lead">Hi <%= @user.email %> &mdash; tell us your new password, please.</p>
 
-  <.form let={f} for={@changeset} phx-change="validate" phx-submit="save" novalidate id="pw_reset_form">
+  <.form :let={f} for={@changeset} phx-change="validate" phx-submit="save" novalidate id="pw_reset_form">
 
     <%= label f, :password, "New password", class: "form-label" %>
     <div class="inner-addon left-addon mb-3" phx-feedback-for={input_id(f, :password)}>
diff --git a/lib/shift73k_web/live/user_management/index.html.heex b/lib/shift73k_web/live/user_management/index.html.heex
index 110cd7de..6a5b5ac5 100644
--- a/lib/shift73k_web/live/user_management/index.html.heex
+++ b/lib/shift73k_web/live/user_management/index.html.heex
@@ -243,7 +243,7 @@
       <%# page buttons %>
       <%= for page_num <- generate_page_list(@page.page_number, @page.total_pages) do %>
         <%= cond do %>
-        <%=   page_num < 1 -> %>
+        <%    page_num < 1 -> %>
             <li class="page-item disabled">
               <span class="page-link" aria-hidden="true">&hellip;</span>
               <span class="visually-hidden" role="img" aria-label="ellipses">&hellip;</span>
diff --git a/lib/shift73k_web/templates/layout/root.html.heex b/lib/shift73k_web/templates/layout/root.html.heex
index 9ec8e974..88d14f0b 100644
--- a/lib/shift73k_web/templates/layout/root.html.heex
+++ b/lib/shift73k_web/templates/layout/root.html.heex
@@ -5,7 +5,9 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
     <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
     <%= csrf_meta_tag() %>
-    <%= live_title_tag assigns[:page_title] || "", suffix: assigns[:page_title] && " · Shift73k" || "Shift73k" %>
+    <Phoenix.Component.live_title suffix=" · Shift73k">
+      <%= assigns[:page_title] || "Hi!" %>
+    </Phoenix.Component.live_title>
     <%= render "_preamble.html", assigns %>
     <link rel="apple-touch-icon" sizes="180x180" href={Routes.static_path(@conn, "/apple-touch-icon.png")}>
     <link rel="icon" type="image/png" sizes="32x32" href={Routes.static_path(@conn, "/favicon-32x32.png")}>
diff --git a/mix.exs b/mix.exs
index e56d94c8..13dca206 100644
--- a/mix.exs
+++ b/mix.exs
@@ -40,7 +40,7 @@ defmodule Shift73k.MixProject do
       {:postgrex, ">= 0.0.0"},
       {:phoenix_html, "~> 3.0"},
       {:phoenix_live_reload, "~> 1.2", only: :dev},
-      {:phoenix_live_view, "~> 0.17.5"},
+      {:phoenix_live_view, "~> 0.18"},
       {:floki, ">= 0.30.0", only: :test},
       {:swoosh, "~> 1.7"},
       {:gen_smtp, "~> 1.2"},
diff --git a/mix.lock b/mix.lock
index eea25248..b7abe68d 100644
--- a/mix.lock
+++ b/mix.lock
@@ -34,7 +34,7 @@
   "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
   "phoenix_html": {:hex, :phoenix_html, "3.2.0", "1c1219d4b6cb22ac72f12f73dc5fad6c7563104d083f711c3fcd8551a1f4ae11", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "36ec97ba56d25c0136ef1992c37957e4246b649d620958a1f9fa86165f8bc54f"},
   "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.1", "2aff698f5e47369decde4357ba91fc9c37c6487a512b41732818f2204a8ef1d3", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab"},
-  "phoenix_live_view": {:hex, :phoenix_live_view, "0.17.11", "205f6aa5405648c76f2abcd57716f42fc07d8f21dd8ea7b262dd12b324b50c95", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7177791944b7f90ed18f5935a6a5f07f760b36f7b3bdfb9d28c57440a3c43f99"},
+  "phoenix_live_view": {:hex, :phoenix_live_view, "0.18.11", "c50eac83dae6b5488859180422dfb27b2c609de87f4aa5b9c926ecd0501cd44f", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "76c99a0ffb47cd95bf06a917e74f282a603f3e77b00375f3c2dd95110971b102"},
   "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
   "phoenix_template": {:hex, :phoenix_template, "1.0.0", "c57bc5044f25f007dc86ab21895688c098a9f846a8dda6bc40e2d0ddc146e38f", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "1b066f99a26fd22064c12b2600a9a6e56700f591bf7b20b418054ea38b4d4357"},
   "phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"},