diff --git a/lib/philomena_web/controllers/admin/advert/image_controller.ex b/lib/philomena_web/controllers/admin/advert/image_controller.ex
index c3bae8c0..7eacf39e 100644
--- a/lib/philomena_web/controllers/admin/advert/image_controller.ex
+++ b/lib/philomena_web/controllers/admin/advert/image_controller.ex
@@ -19,9 +19,10 @@ defmodule PhilomenaWeb.Admin.Advert.ImageController do
 
   def update(conn, %{"advert" => advert_params}) do
     case Adverts.update_advert_image(conn.assigns.advert, advert_params) do
-      {:ok, _advert} ->
+      {:ok, advert} ->
         conn
         |> put_flash(:info, "Advert was successfully updated.")
+        |> moderation_log(details: &log_details/2, data: advert)
         |> redirect(to: ~p"/admin/adverts")
 
       {:error, changeset} ->
@@ -35,4 +36,8 @@ defmodule PhilomenaWeb.Admin.Advert.ImageController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(_action, advert) do
+    %{body: "Updated image for advert #{advert.id}", subject_path: ~p"/admin/adverts"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/advert_controller.ex b/lib/philomena_web/controllers/admin/advert_controller.ex
index 12b1dfbe..4c3236c7 100644
--- a/lib/philomena_web/controllers/admin/advert_controller.ex
+++ b/lib/philomena_web/controllers/admin/advert_controller.ex
@@ -29,9 +29,10 @@ defmodule PhilomenaWeb.Admin.AdvertController do
 
   def create(conn, %{"advert" => advert_params}) do
     case Adverts.create_advert(advert_params) do
-      {:ok, _advert} ->
+      {:ok, advert} ->
         conn
         |> put_flash(:info, "Advert was successfully created.")
+        |> moderation_log(details: &log_details/2, data: advert)
         |> redirect(to: ~p"/admin/adverts")
 
       {:error, changeset} ->
@@ -46,9 +47,10 @@ defmodule PhilomenaWeb.Admin.AdvertController do
 
   def update(conn, %{"advert" => advert_params}) do
     case Adverts.update_advert(conn.assigns.advert, advert_params) do
-      {:ok, _advert} ->
+      {:ok, advert} ->
         conn
         |> put_flash(:info, "Advert was successfully updated.")
+        |> moderation_log(details: &log_details/2, data: advert)
         |> redirect(to: ~p"/admin/adverts")
 
       {:error, changeset} ->
@@ -57,10 +59,11 @@ defmodule PhilomenaWeb.Admin.AdvertController do
   end
 
   def delete(conn, _params) do
-    {:ok, _advert} = Adverts.delete_advert(conn.assigns.advert)
+    {:ok, advert} = Adverts.delete_advert(conn.assigns.advert)
 
     conn
     |> put_flash(:info, "Advert was successfully deleted.")
+    |> moderation_log(details: &log_details/2, data: advert)
     |> redirect(to: ~p"/admin/adverts")
   end
 
@@ -70,4 +73,15 @@ defmodule PhilomenaWeb.Admin.AdvertController do
       false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(action, advert) do
+    body =
+      case action do
+        :create -> "Created advert #{advert.id}"
+        :update -> "Updated advert #{advert.id}"
+        :delete -> "Deleted advert #{advert.id}"
+      end
+
+    %{body: body, subject_path: ~p"/admin/adverts"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/badge/image_controller.ex b/lib/philomena_web/controllers/admin/badge/image_controller.ex
index 069b8f0b..c37407a7 100644
--- a/lib/philomena_web/controllers/admin/badge/image_controller.ex
+++ b/lib/philomena_web/controllers/admin/badge/image_controller.ex
@@ -14,9 +14,10 @@ defmodule PhilomenaWeb.Admin.Badge.ImageController do
 
   def update(conn, %{"badge" => badge_params}) do
     case Badges.update_badge_image(conn.assigns.badge, badge_params) do
-      {:ok, _badge} ->
+      {:ok, badge} ->
         conn
         |> put_flash(:info, "Badge updated successfully.")
+        |> moderation_log(details: &log_details/2, data: badge)
         |> redirect(to: ~p"/admin/badges")
 
       {:error, :badge, changeset, _changes} ->
@@ -30,4 +31,8 @@ defmodule PhilomenaWeb.Admin.Badge.ImageController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(_action, badge) do
+    %{body: "Updated image of badge '#{badge.title}'", subject_path: ~p"/admin/badges"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/badge_controller.ex b/lib/philomena_web/controllers/admin/badge_controller.ex
index f253f647..d80bc008 100644
--- a/lib/philomena_web/controllers/admin/badge_controller.ex
+++ b/lib/philomena_web/controllers/admin/badge_controller.ex
@@ -25,9 +25,10 @@ defmodule PhilomenaWeb.Admin.BadgeController do
 
   def create(conn, %{"badge" => badge_params}) do
     case Badges.create_badge(badge_params) do
-      {:ok, _badge} ->
+      {:ok, badge} ->
         conn
         |> put_flash(:info, "Badge created successfully.")
+        |> moderation_log(details: &log_details/2, data: badge)
         |> redirect(to: ~p"/admin/badges")
 
       {:error, :badge, changeset, _changes} ->
@@ -42,9 +43,10 @@ defmodule PhilomenaWeb.Admin.BadgeController do
 
   def update(conn, %{"badge" => badge_params}) do
     case Badges.update_badge(conn.assigns.badge, badge_params) do
-      {:ok, _badge} ->
+      {:ok, badge} ->
         conn
         |> put_flash(:info, "Badge updated successfully.")
+        |> moderation_log(details: &log_details/2, data: badge)
         |> redirect(to: ~p"/admin/badges")
 
       {:error, :badge, changeset, _changes} ->
@@ -58,4 +60,14 @@ defmodule PhilomenaWeb.Admin.BadgeController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(action, badge) do
+    body =
+      case action do
+        :create -> "Created badge '#{badge.title}'"
+        :update -> "Updated badge '#{badge.title}'"
+      end
+
+    %{body: body, subject_path: ~p"/admin/badges"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/user/activation_controller.ex b/lib/philomena_web/controllers/admin/user/activation_controller.ex
index f261ab1b..f19073fa 100644
--- a/lib/philomena_web/controllers/admin/user/activation_controller.ex
+++ b/lib/philomena_web/controllers/admin/user/activation_controller.ex
@@ -12,6 +12,7 @@ defmodule PhilomenaWeb.Admin.User.ActivationController do
 
     conn
     |> put_flash(:info, "User was reactivated.")
+    |> moderation_log(details: &log_details/2, data: user)
     |> redirect(to: ~p"/profiles/#{user}")
   end
 
@@ -20,6 +21,7 @@ defmodule PhilomenaWeb.Admin.User.ActivationController do
 
     conn
     |> put_flash(:info, "User was deactivated.")
+    |> moderation_log(details: &log_details/2, data: user)
     |> redirect(to: ~p"/profiles/#{user}")
   end
 
@@ -29,4 +31,14 @@ defmodule PhilomenaWeb.Admin.User.ActivationController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(action, user) do
+    body =
+      case action do
+        :create -> "Reactivated #{user.name}"
+        :delete -> "Deactivated #{user.name}"
+      end
+
+    %{body: body, subject_path: ~p"/profiles/#{user}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/user/api_key_controller.ex b/lib/philomena_web/controllers/admin/user/api_key_controller.ex
index 19b1eb64..f855819b 100644
--- a/lib/philomena_web/controllers/admin/user/api_key_controller.ex
+++ b/lib/philomena_web/controllers/admin/user/api_key_controller.ex
@@ -12,6 +12,7 @@ defmodule PhilomenaWeb.Admin.User.ApiKeyController do
 
     conn
     |> put_flash(:info, "API token successfully reset.")
+    |> moderation_log(details: &log_details/2, data: user)
     |> redirect(to: ~p"/profiles/#{user}")
   end
 
@@ -21,4 +22,8 @@ defmodule PhilomenaWeb.Admin.User.ApiKeyController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(_action, user) do
+    %{body: "Reset API key for #{user.name}", subject_path: ~p"/profiles/#{user}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/user/avatar_controller.ex b/lib/philomena_web/controllers/admin/user/avatar_controller.ex
index 80c1e262..79eba114 100644
--- a/lib/philomena_web/controllers/admin/user/avatar_controller.ex
+++ b/lib/philomena_web/controllers/admin/user/avatar_controller.ex
@@ -8,10 +8,11 @@ defmodule PhilomenaWeb.Admin.User.AvatarController do
   plug :load_resource, model: User, id_name: "user_id", id_field: "slug", persisted: true
 
   def delete(conn, _params) do
-    {:ok, _user} = Users.remove_avatar(conn.assigns.user)
+    {:ok, user} = Users.remove_avatar(conn.assigns.user)
 
     conn
     |> put_flash(:info, "Successfully removed avatar.")
+    |> moderation_log(details: &log_details/2, data: user)
     |> redirect(to: ~p"/admin/users/#{conn.assigns.user}/edit")
   end
 
@@ -21,4 +22,8 @@ defmodule PhilomenaWeb.Admin.User.AvatarController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(_action, user) do
+    %{body: "Removed avatar for #{user.name}", subject_path: ~p"/profiles/#{user}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/user/downvote_controller.ex b/lib/philomena_web/controllers/admin/user/downvote_controller.ex
index df5cb145..a982c0a5 100644
--- a/lib/philomena_web/controllers/admin/user/downvote_controller.ex
+++ b/lib/philomena_web/controllers/admin/user/downvote_controller.ex
@@ -8,11 +8,14 @@ defmodule PhilomenaWeb.Admin.User.DownvoteController do
   plug :load_resource, model: User, id_name: "user_id", id_field: "slug", persisted: true
 
   def delete(conn, _params) do
-    Exq.enqueue(Exq, "indexing", UserUnvoteWorker, [conn.assigns.user.id, false])
+    user = conn.assigns.user
+
+    Exq.enqueue(Exq, "indexing", UserUnvoteWorker, [user.id, false])
 
     conn
     |> put_flash(:info, "Downvote wipe started.")
-    |> redirect(to: ~p"/profiles/#{conn.assigns.user}")
+    |> moderation_log(details: &log_details/2, data: user)
+    |> redirect(to: ~p"/profiles/#{user}")
   end
 
   defp verify_authorized(conn, _opts) do
@@ -21,4 +24,8 @@ defmodule PhilomenaWeb.Admin.User.DownvoteController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(_action, user) do
+    %{body: "Wiped downvotes for #{user.name}", subject_path: ~p"/profiles/#{user}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/user/erase_controller.ex b/lib/philomena_web/controllers/admin/user/erase_controller.ex
index f0a926df..d2f8af5a 100644
--- a/lib/philomena_web/controllers/admin/user/erase_controller.ex
+++ b/lib/philomena_web/controllers/admin/user/erase_controller.ex
@@ -26,6 +26,7 @@ defmodule PhilomenaWeb.Admin.User.EraseController do
 
     conn
     |> put_flash(:info, "User erase started")
+    |> moderation_log(details: &log_details/2, data: {conn.assigns.user, user})
     |> redirect(to: ~p"/profiles/#{user}")
   end
 
@@ -68,4 +69,8 @@ defmodule PhilomenaWeb.Admin.User.EraseController do
       conn
     end
   end
+
+  defp log_details(_action, {old_user, new_user}) do
+    %{body: "Erased #{old_user.name}", subject_path: ~p"/profiles/#{new_user}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/user/force_filter_controller.ex b/lib/philomena_web/controllers/admin/user/force_filter_controller.ex
index 74266ef5..2d50d56f 100644
--- a/lib/philomena_web/controllers/admin/user/force_filter_controller.ex
+++ b/lib/philomena_web/controllers/admin/user/force_filter_controller.ex
@@ -18,6 +18,7 @@ defmodule PhilomenaWeb.Admin.User.ForceFilterController do
 
     conn
     |> put_flash(:info, "Filter was forced.")
+    |> moderation_log(details: &log_details/2, data: user)
     |> redirect(to: ~p"/profiles/#{user}")
   end
 
@@ -26,6 +27,7 @@ defmodule PhilomenaWeb.Admin.User.ForceFilterController do
 
     conn
     |> put_flash(:info, "Forced filter was removed.")
+    |> moderation_log(details: &log_details/2, data: user)
     |> redirect(to: ~p"/profiles/#{user}")
   end
 
@@ -35,4 +37,14 @@ defmodule PhilomenaWeb.Admin.User.ForceFilterController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(action, user) do
+    body =
+      case action do
+        :create -> "Forced filter #{user.forced_filter_id} for #{user.name}"
+        :delete -> "Removed forced filter for #{user.name}"
+      end
+
+    %{body: body, subject_path: ~p"/profiles/#{user}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/user/unlock_controller.ex b/lib/philomena_web/controllers/admin/user/unlock_controller.ex
index 54610fda..01ed56e0 100644
--- a/lib/philomena_web/controllers/admin/user/unlock_controller.ex
+++ b/lib/philomena_web/controllers/admin/user/unlock_controller.ex
@@ -12,6 +12,7 @@ defmodule PhilomenaWeb.Admin.User.UnlockController do
 
     conn
     |> put_flash(:info, "User was unlocked.")
+    |> moderation_log(details: &log_details/2, data: user)
     |> redirect(to: ~p"/profiles/#{user}")
   end
 
@@ -21,4 +22,8 @@ defmodule PhilomenaWeb.Admin.User.UnlockController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(_action, user) do
+    %{body: "Unlocked #{user.name}", subject_path: ~p"/profiles/#{user}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/user/vote_controller.ex b/lib/philomena_web/controllers/admin/user/vote_controller.ex
index 310f3575..d3730e75 100644
--- a/lib/philomena_web/controllers/admin/user/vote_controller.ex
+++ b/lib/philomena_web/controllers/admin/user/vote_controller.ex
@@ -8,11 +8,14 @@ defmodule PhilomenaWeb.Admin.User.VoteController do
   plug :load_resource, model: User, id_name: "user_id", id_field: "slug", persisted: true
 
   def delete(conn, _params) do
-    Exq.enqueue(Exq, "indexing", UserUnvoteWorker, [conn.assigns.user.id, true])
+    user = conn.assigns.user
+
+    Exq.enqueue(Exq, "indexing", UserUnvoteWorker, [user.id, true])
 
     conn
     |> put_flash(:info, "Vote and fave wipe started.")
-    |> redirect(to: ~p"/profiles/#{conn.assigns.user}")
+    |> moderation_log(details: &log_details/2, data: user)
+    |> redirect(to: ~p"/profiles/#{user}")
   end
 
   defp verify_authorized(conn, _opts) do
@@ -21,4 +24,8 @@ defmodule PhilomenaWeb.Admin.User.VoteController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(_action, user) do
+    %{body: "Wiped votes and faves for #{user.name}", subject_path: ~p"/profiles/#{user}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/admin/user/wipe_controller.ex b/lib/philomena_web/controllers/admin/user/wipe_controller.ex
index 3bc64a82..c079295a 100644
--- a/lib/philomena_web/controllers/admin/user/wipe_controller.ex
+++ b/lib/philomena_web/controllers/admin/user/wipe_controller.ex
@@ -8,14 +8,17 @@ defmodule PhilomenaWeb.Admin.User.WipeController do
   plug :load_resource, model: User, id_name: "user_id", id_field: "slug", persisted: true
 
   def create(conn, _params) do
-    Exq.enqueue(Exq, "indexing", UserWipeWorker, [conn.assigns.user.id])
+    user = conn.assigns.user
+
+    Exq.enqueue(Exq, "indexing", UserWipeWorker, [user.id])
 
     conn
     |> put_flash(
       :info,
       "PII wipe queued, please verify and then deactivate the account as necessary."
     )
-    |> redirect(to: ~p"/profiles/#{conn.assigns.user}")
+    |> moderation_log(details: &log_details/2, data: user)
+    |> redirect(to: ~p"/profiles/#{user}")
   end
 
   defp verify_authorized(conn, _opts) do
@@ -24,4 +27,8 @@ defmodule PhilomenaWeb.Admin.User.WipeController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(_action, user) do
+    %{body: "Wiped PII for #{user.name}", subject_path: ~p"/profiles/#{user}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/image/anonymous_controller.ex b/lib/philomena_web/controllers/image/anonymous_controller.ex
index e36b5020..69906c05 100644
--- a/lib/philomena_web/controllers/image/anonymous_controller.ex
+++ b/lib/philomena_web/controllers/image/anonymous_controller.ex
@@ -35,7 +35,7 @@ defmodule PhilomenaWeb.Image.AnonymousController do
 
   defp log_details(_action, image) do
     %{
-      body: "Updated anonymity of image >>#{image.id}",
+      body: "Updated anonymity of image #{image.id}",
       subject_path: ~p"/images/#{image}"
     }
   end
diff --git a/lib/philomena_web/controllers/image/comment/approve_controller.ex b/lib/philomena_web/controllers/image/comment/approve_controller.ex
index 617d0280..8dce5a81 100644
--- a/lib/philomena_web/controllers/image/comment/approve_controller.ex
+++ b/lib/philomena_web/controllers/image/comment/approve_controller.ex
@@ -28,7 +28,7 @@ defmodule PhilomenaWeb.Image.Comment.ApproveController do
 
   defp log_details(_action, comment) do
     %{
-      body: "Approved comment on image >>#{comment.image_id}",
+      body: "Approved comment on image #{comment.image_id}",
       subject_path: ~p"/images/#{comment.image_id}" <> "#comment_#{comment.id}"
     }
   end
diff --git a/lib/philomena_web/controllers/image/comment/delete_controller.ex b/lib/philomena_web/controllers/image/comment/delete_controller.ex
index 2cf8fb39..ac5125d5 100644
--- a/lib/philomena_web/controllers/image/comment/delete_controller.ex
+++ b/lib/philomena_web/controllers/image/comment/delete_controller.ex
@@ -28,7 +28,7 @@ defmodule PhilomenaWeb.Image.Comment.DeleteController do
 
   defp log_details(_action, comment) do
     %{
-      body: "Destroyed comment on image >>#{comment.image_id}",
+      body: "Destroyed comment on image #{comment.image_id}",
       subject_path: ~p"/images/#{comment.image_id}" <> "#comment_#{comment.id}"
     }
   end
diff --git a/lib/philomena_web/controllers/image/comment/hide_controller.ex b/lib/philomena_web/controllers/image/comment/hide_controller.ex
index 2fe709a5..b10b3154 100644
--- a/lib/philomena_web/controllers/image/comment/hide_controller.ex
+++ b/lib/philomena_web/controllers/image/comment/hide_controller.ex
@@ -45,8 +45,8 @@ defmodule PhilomenaWeb.Image.Comment.HideController do
   defp log_details(action, comment) do
     body =
       case action do
-        :create -> "Hidden comment on image >>#{comment.image_id} (#{comment.deletion_reason})"
-        :delete -> "Restored comment on image >>#{comment.image_id}"
+        :create -> "Hidden comment on image #{comment.image_id} (#{comment.deletion_reason})"
+        :delete -> "Restored comment on image #{comment.image_id}"
       end
 
     %{
diff --git a/lib/philomena_web/controllers/image/comment_lock_controller.ex b/lib/philomena_web/controllers/image/comment_lock_controller.ex
index 432d1283..303f9f42 100644
--- a/lib/philomena_web/controllers/image/comment_lock_controller.ex
+++ b/lib/philomena_web/controllers/image/comment_lock_controller.ex
@@ -28,8 +28,8 @@ defmodule PhilomenaWeb.Image.CommentLockController do
   defp log_details(action, image) do
     body =
       case action do
-        :create -> "Locked comments on image >>#{image.id}"
-        :delete -> "Unlocked comments on image >>#{image.id}"
+        :create -> "Locked comments on image #{image.id}"
+        :delete -> "Unlocked comments on image #{image.id}"
       end
 
     %{
diff --git a/lib/philomena_web/controllers/image/delete_controller.ex b/lib/philomena_web/controllers/image/delete_controller.ex
index c6b22d54..06cf7f87 100644
--- a/lib/philomena_web/controllers/image/delete_controller.ex
+++ b/lib/philomena_web/controllers/image/delete_controller.ex
@@ -73,9 +73,9 @@ defmodule PhilomenaWeb.Image.DeleteController do
   defp log_details(action, image) do
     body =
       case action do
-        :create -> "Hidden image >>#{image.id} (#{image.deletion_reason})"
-        :update -> "Changed hide reason of >>#{image.id} (#{image.deletion_reason})"
-        :delete -> "Restored image >>#{image.id}"
+        :create -> "Hidden image #{image.id} (#{image.deletion_reason})"
+        :update -> "Changed hide reason of #{image.id} (#{image.deletion_reason})"
+        :delete -> "Restored image #{image.id}"
       end
 
     %{
diff --git a/lib/philomena_web/controllers/image/description_lock_controller.ex b/lib/philomena_web/controllers/image/description_lock_controller.ex
index 9065ff6d..599d0aa2 100644
--- a/lib/philomena_web/controllers/image/description_lock_controller.ex
+++ b/lib/philomena_web/controllers/image/description_lock_controller.ex
@@ -28,8 +28,8 @@ defmodule PhilomenaWeb.Image.DescriptionLockController do
   defp log_details(action, image) do
     body =
       case action do
-        :create -> "Locked description editing on image >>#{image.id}"
-        :delete -> "Unlocked description editing on image >>#{image.id}"
+        :create -> "Locked description editing on image #{image.id}"
+        :delete -> "Unlocked description editing on image #{image.id}"
       end
 
     %{
diff --git a/lib/philomena_web/controllers/image/destroy_controller.ex b/lib/philomena_web/controllers/image/destroy_controller.ex
index 8685bc77..ef4dab2a 100644
--- a/lib/philomena_web/controllers/image/destroy_controller.ex
+++ b/lib/philomena_web/controllers/image/destroy_controller.ex
@@ -40,7 +40,7 @@ defmodule PhilomenaWeb.Image.DestroyController do
 
   defp log_details(_action, image) do
     %{
-      body: "Hard-deleted image >>#{image.id}",
+      body: "Hard-deleted image #{image.id}",
       subject_path: ~p"/images/#{image}"
     }
   end
diff --git a/lib/philomena_web/controllers/image/feature_controller.ex b/lib/philomena_web/controllers/image/feature_controller.ex
index 74214fcb..49edcd08 100644
--- a/lib/philomena_web/controllers/image/feature_controller.ex
+++ b/lib/philomena_web/controllers/image/feature_controller.ex
@@ -35,7 +35,7 @@ defmodule PhilomenaWeb.Image.FeatureController do
 
   defp log_details(_action, image) do
     %{
-      body: "Featured image >>#{image.id}",
+      body: "Featured image #{image.id}",
       subject_path: ~p"/images/#{image}"
     }
   end
diff --git a/lib/philomena_web/controllers/image/file_controller.ex b/lib/philomena_web/controllers/image/file_controller.ex
index f169d2f4..14e2c432 100644
--- a/lib/philomena_web/controllers/image/file_controller.ex
+++ b/lib/philomena_web/controllers/image/file_controller.ex
@@ -16,6 +16,7 @@ defmodule PhilomenaWeb.Image.FileController do
       {:ok, image} ->
         conn
         |> put_flash(:info, "Successfully updated file.")
+        |> moderation_log(details: &log_details/2, data: image)
         |> redirect(to: ~p"/images/#{image}")
 
       _error ->
@@ -37,4 +38,8 @@ defmodule PhilomenaWeb.Image.FileController do
         conn
     end
   end
+
+  defp log_details(_action, image) do
+    %{body: "Updated file of image #{image.id}", subject_path: ~p"/images/#{image}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/image/hash_controller.ex b/lib/philomena_web/controllers/image/hash_controller.ex
index ab929724..1e8191ae 100644
--- a/lib/philomena_web/controllers/image/hash_controller.ex
+++ b/lib/philomena_web/controllers/image/hash_controller.ex
@@ -18,7 +18,7 @@ defmodule PhilomenaWeb.Image.HashController do
 
   defp log_details(_action, image) do
     %{
-      body: "Cleared hash of image >>#{image.id}",
+      body: "Cleared hash of image #{image.id}",
       subject_path: ~p"/images/#{image}"
     }
   end
diff --git a/lib/philomena_web/controllers/image/repair_controller.ex b/lib/philomena_web/controllers/image/repair_controller.ex
index 972d79df..9dfb0c4e 100644
--- a/lib/philomena_web/controllers/image/repair_controller.ex
+++ b/lib/philomena_web/controllers/image/repair_controller.ex
@@ -19,7 +19,7 @@ defmodule PhilomenaWeb.Image.RepairController do
 
   defp log_details(_action, image) do
     %{
-      body: "Repaired image >>#{image.id}",
+      body: "Repaired image #{image.id}",
       subject_path: ~p"/images/#{image}"
     }
   end
diff --git a/lib/philomena_web/controllers/image/scratchpad_controller.ex b/lib/philomena_web/controllers/image/scratchpad_controller.ex
index 56ffe897..3a00b645 100644
--- a/lib/philomena_web/controllers/image/scratchpad_controller.ex
+++ b/lib/philomena_web/controllers/image/scratchpad_controller.ex
@@ -23,7 +23,7 @@ defmodule PhilomenaWeb.Image.ScratchpadController do
 
   defp log_details(_action, image) do
     %{
-      body: "Updated mod notes on image >>#{image.id} (#{image.scratchpad})",
+      body: "Updated mod notes on image #{image.id} (#{image.scratchpad})",
       subject_path: ~p"/images/#{image}"
     }
   end
diff --git a/lib/philomena_web/controllers/image/source_history_controller.ex b/lib/philomena_web/controllers/image/source_history_controller.ex
index f82a344f..58964080 100644
--- a/lib/philomena_web/controllers/image/source_history_controller.ex
+++ b/lib/philomena_web/controllers/image/source_history_controller.ex
@@ -20,7 +20,7 @@ defmodule PhilomenaWeb.Image.SourceHistoryController do
 
   defp log_details(_action, image) do
     %{
-      body: "Deleted source history for image >>#{image.id}",
+      body: "Deleted source history for image #{image.id}",
       subject_path: ~p"/images/#{image}"
     }
   end
diff --git a/lib/philomena_web/controllers/image/tag_change_controller.ex b/lib/philomena_web/controllers/image/tag_change_controller.ex
index fc35a782..dbcd8055 100644
--- a/lib/philomena_web/controllers/image/tag_change_controller.ex
+++ b/lib/philomena_web/controllers/image/tag_change_controller.ex
@@ -60,7 +60,7 @@ defmodule PhilomenaWeb.Image.TagChangeController do
 
   defp log_details(_action, %{image: image, details: details}) do
     %{
-      body: "Deleted tag change #{details} on >>#{image.id} from history",
+      body: "Deleted tag change #{details} on image #{image.id} from history",
       subject_path: ~p"/images/#{image}"
     }
   end
diff --git a/lib/philomena_web/controllers/image/tag_lock_controller.ex b/lib/philomena_web/controllers/image/tag_lock_controller.ex
index 028cbf4c..01846a2f 100644
--- a/lib/philomena_web/controllers/image/tag_lock_controller.ex
+++ b/lib/philomena_web/controllers/image/tag_lock_controller.ex
@@ -48,9 +48,9 @@ defmodule PhilomenaWeb.Image.TagLockController do
   defp log_details(action, image) do
     body =
       case action do
-        :create -> "Locked tags on image >>#{image.id}"
-        :update -> "Updated list of locked tags on image >>#{image.id}"
-        :delete -> "Unlocked tags on image >>#{image.id}"
+        :create -> "Locked tags on image #{image.id}"
+        :update -> "Updated list of locked tags on image #{image.id}"
+        :delete -> "Unlocked tags on image #{image.id}"
       end
 
     %{
diff --git a/lib/philomena_web/controllers/image/tamper_controller.ex b/lib/philomena_web/controllers/image/tamper_controller.ex
index ede16a46..2ee0d33a 100644
--- a/lib/philomena_web/controllers/image/tamper_controller.ex
+++ b/lib/philomena_web/controllers/image/tamper_controller.ex
@@ -42,7 +42,7 @@ defmodule PhilomenaWeb.Image.TamperController do
       end
 
     %{
-      body: "Deleted #{vote_type} by #{data.username} on image >>#{data.image.id}",
+      body: "Deleted #{vote_type} by #{data.username} on image #{data.image.id}",
       subject_path: ~p"/images/#{image}"
     }
   end
diff --git a/lib/philomena_web/controllers/tag/alias_controller.ex b/lib/philomena_web/controllers/tag/alias_controller.ex
index b0ed3483..934330f4 100644
--- a/lib/philomena_web/controllers/tag/alias_controller.ex
+++ b/lib/philomena_web/controllers/tag/alias_controller.ex
@@ -23,6 +23,7 @@ defmodule PhilomenaWeb.Tag.AliasController do
       {:ok, tag} ->
         conn
         |> put_flash(:info, "Tag alias queued.")
+        |> moderation_log(details: &log_details/2, data: tag)
         |> redirect(to: ~p"/tags/#{tag}/alias/edit")
 
       {:error, changeset} ->
@@ -35,6 +36,17 @@ defmodule PhilomenaWeb.Tag.AliasController do
 
     conn
     |> put_flash(:info, "Tag dealias queued.")
+    |> moderation_log(details: &log_details/2, data: tag)
     |> redirect(to: ~p"/tags/#{tag}")
   end
+
+  defp log_details(action, tag) do
+    body =
+      case action do
+        :update -> "Aliased tag '#{tag.name}' into '#{tag.aliased_tag.name}'"
+        :delete -> "Dealiased tag '#{tag.name}'"
+      end
+
+    %{body: body, subject_path: ~p"/tags/#{tag}"}
+  end
 end
diff --git a/lib/philomena_web/controllers/tag_change/full_revert_controller.ex b/lib/philomena_web/controllers/tag_change/full_revert_controller.ex
index 2f095715..4fccf7a0 100644
--- a/lib/philomena_web/controllers/tag_change/full_revert_controller.ex
+++ b/lib/philomena_web/controllers/tag_change/full_revert_controller.ex
@@ -1,6 +1,7 @@
 defmodule PhilomenaWeb.TagChange.FullRevertController do
   use PhilomenaWeb, :controller
 
+  alias Philomena.Users
   alias Philomena.TagChanges.TagChange
   alias Philomena.TagChanges
 
@@ -28,6 +29,10 @@ defmodule PhilomenaWeb.TagChange.FullRevertController do
 
     conn
     |> put_flash(:info, "Reversion of tag changes enqueued.")
+    |> moderation_log(
+      details: &log_details/2,
+      data: %{user: conn.assigns.current_user, params: params}
+    )
     |> redirect(external: conn.assigns.referrer)
   end
 
@@ -37,4 +42,22 @@ defmodule PhilomenaWeb.TagChange.FullRevertController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(_action, data) do
+    {subject, subject_path} =
+      case data.params do
+        %{"user_id" => user_id} ->
+          user = Users.get_user!(user_id)
+
+          {"user #{user.name}", ~p"/profiles/#{user.name}"}
+
+        %{"ip" => ip} ->
+          {"ip #{ip}", ~p"/ip_profiles/#{ip}"}
+
+        %{"fingerprint" => fp} ->
+          {"fingerprint #{fp}", ~p"/fingerprint_profiles/#{fp}"}
+      end
+
+    %{body: "Reverted all tag changes for #{subject}", subject_path: subject_path}
+  end
 end
diff --git a/lib/philomena_web/controllers/tag_change/revert_controller.ex b/lib/philomena_web/controllers/tag_change/revert_controller.ex
index 84782304..4c6a59df 100644
--- a/lib/philomena_web/controllers/tag_change/revert_controller.ex
+++ b/lib/philomena_web/controllers/tag_change/revert_controller.ex
@@ -20,6 +20,10 @@ defmodule PhilomenaWeb.TagChange.RevertController do
       {:ok, tag_changes} ->
         conn
         |> put_flash(:info, "Successfully reverted #{length(tag_changes)} tag changes.")
+        |> moderation_log(
+          details: &log_details/2,
+          data: %{user: conn.assigns.current_user, count: length(tag_changes)}
+        )
         |> redirect(external: conn.assigns.referrer)
 
       _error ->
@@ -35,4 +39,8 @@ defmodule PhilomenaWeb.TagChange.RevertController do
       _false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
     end
   end
+
+  defp log_details(_action, data) do
+    %{body: "Reverted #{data.count} tag changes", subject_path: ~p"/profiles/#{data.user}"}
+  end
 end