Index: KernelRecordsMVC.Web/Controllers/AdminController.cs
===================================================================
--- KernelRecordsMVC.Web/Controllers/AdminController.cs	(revision d89d25b3a7f785676877cf198c9cc706308ab4a3)
+++ KernelRecordsMVC.Web/Controllers/AdminController.cs	(revision 595d2e58cf322a776ba1d3cedcb86e9bb2ee8093)
@@ -497,7 +497,12 @@
 
 
-        // =====================================================
-        // RELEASE TYPE VALIDATION
-        // =====================================================
+        // =========================================================
+        // NORMALIZE RELEASE TYPE
+        // =========================================================
+
+        model.ReleaseType =
+            model.ReleaseType?.Trim().ToUpperInvariant()
+            ?? string.Empty;
+
 
         if (model.ReleaseType != "ALBUM" &&
@@ -510,12 +515,11 @@
 
 
-        // =====================================================
+        // =========================================================
         // MAIN ARTIST VALIDATION
-        // =====================================================
+        // =========================================================
 
         var mainArtistExists =
             _context.Artists.Any(a =>
-                a.ArtistId ==
-                model.MainArtistId);
+                a.ArtistId == model.MainArtistId);
 
 
@@ -528,7 +532,7 @@
 
 
-        // =====================================================
+        // =========================================================
         // FEATURED ARTISTS
-        // =====================================================
+        // =========================================================
 
         model.FeaturedArtistIds ??=
@@ -539,14 +543,9 @@
             model.FeaturedArtistIds
                 .Distinct()
+                .Where(id =>
+                    id != model.MainArtistId)
                 .ToList();
 
 
-        // Do not allow the main artist
-        // to also be a featured artist.
-        model.FeaturedArtistIds.Remove(
-            model.MainArtistId);
-
-
-        // Validate that featured artists exist.
         if (model.FeaturedArtistIds.Count > 0)
         {
@@ -567,12 +566,32 @@
 
 
-        // =====================================================
+        // =========================================================
         // SINGLE VALIDATION
-        // =====================================================
+        // =========================================================
 
         if (model.ReleaseType == "SINGLE")
         {
+            // Album track values do not apply to a single.
+            model.Tracks =
+                new List<CreateTrackViewModel>();
+
+
+            var trackModelStateKeys =
+                ModelState.Keys
+                    .Where(key =>
+                        key.StartsWith(
+                            "Tracks[",
+                            StringComparison.OrdinalIgnoreCase))
+                    .ToList();
+
+
+            foreach (var key in trackModelStateKeys)
+            {
+                ModelState.Remove(key);
+            }
+
+
             if (string.IsNullOrWhiteSpace(
-                model.SingleDuration))
+                    model.SingleDuration))
             {
                 ModelState.AddModelError(
@@ -580,18 +599,51 @@
                     "Duration is required for a single.");
             }
-        }
-
-
-        // =====================================================
+            else if (!System.Text.RegularExpressions.Regex.IsMatch(
+                         model.SingleDuration.Trim(),
+                         @"^\d{1,2}:[0-5]\d$"))
+            {
+                ModelState.AddModelError(
+                    nameof(model.SingleDuration),
+                    "Duration must be in MM:SS format, for example 03:42.");
+            }
+        }
+
+
+        // =========================================================
         // ALBUM VALIDATION
-        // =====================================================
+        // =========================================================
 
         if (model.ReleaseType == "ALBUM")
         {
+            // Single duration does not apply to an album.
+            ModelState.Remove(
+                nameof(model.SingleDuration));
+
+            model.SingleDuration =
+                null;
+
+
             model.Tracks ??=
                 new List<CreateTrackViewModel>();
 
 
-            // Remove completely empty rows.
+            // The model binder may already have added validation
+            // errors for blank track rows. Remove those and validate
+            // the cleaned list ourselves.
+            var existingTrackKeys =
+                ModelState.Keys
+                    .Where(key =>
+                        key.StartsWith(
+                            "Tracks[",
+                            StringComparison.OrdinalIgnoreCase))
+                    .ToList();
+
+
+            foreach (var key in existingTrackKeys)
+            {
+                ModelState.Remove(key);
+            }
+
+
             model.Tracks =
                 model.Tracks
@@ -625,5 +677,5 @@
                     ModelState.AddModelError(
                         $"Tracks[{i}].SongName",
-                        "Track name is required.");
+                        $"Track {i + 1}: name is required.");
                 }
 
@@ -634,5 +686,5 @@
                     ModelState.AddModelError(
                         $"Tracks[{i}].SongDuration",
-                        "Track duration is required.");
+                        $"Track {i + 1}: duration is required.");
                 }
 
@@ -648,5 +700,4 @@
 
 
-                // Validate selected track artists.
                 if (track.ArtistIds.Count > 0)
                 {
@@ -662,5 +713,5 @@
                         ModelState.AddModelError(
                             $"Tracks[{i}].ArtistIds",
-                            "One or more selected track artists are invalid.");
+                            $"Track {i + 1}: one or more artists are invalid.");
                     }
                 }
@@ -669,4 +720,8 @@
 
 
+        // =========================================================
+        // VALIDATION FAILED
+        // =========================================================
+
         if (!ModelState.IsValid)
         {
@@ -676,4 +731,8 @@
         }
 
+
+        // =========================================================
+        // DATABASE TRANSACTION
+        // =========================================================
 
         using var transaction =
@@ -683,7 +742,7 @@
         try
         {
-            // =================================================
-            // CREATE RELEASE
-            // =================================================
+            // =====================================================
+            // RELEASE
+            // =====================================================
 
             var release =
@@ -719,9 +778,9 @@
 
 
-            // =================================================
-            // MAIN RELEASE ARTIST
-            // =================================================
-
-            var mainReleaseArtist =
+            // =====================================================
+            // RELEASE ARTISTS
+            // =====================================================
+
+            _context.ReleaseArtists.Add(
                 new ReleaseArtist
                 {
@@ -732,18 +791,11 @@
                         model.MainArtistId,
 
-                    ReleaseOrdinal = 1,
+                    ReleaseOrdinal =
+                        1,
 
                     Type =
                         ArtistReleaseType.MAIN
-                };
-
-
-            _context.ReleaseArtists.Add(
-                mainReleaseArtist);
-
-
-            // =================================================
-            // FEATURED RELEASE ARTISTS
-            // =================================================
+                });
+
 
             long releaseOrdinal = 2;
@@ -753,5 +805,5 @@
                      in model.FeaturedArtistIds)
             {
-                var featuredArtist =
+                _context.ReleaseArtists.Add(
                     new ReleaseArtist
                     {
@@ -767,9 +819,5 @@
                         Type =
                             ArtistReleaseType.FEATURE
-                    };
-
-
-                _context.ReleaseArtists.Add(
-                    featuredArtist);
+                    });
             }
 
@@ -778,7 +826,7 @@
 
 
-            // =================================================
+            // =====================================================
             // ALBUM
-            // =================================================
+            // =====================================================
 
             if (model.ReleaseType == "ALBUM")
@@ -798,7 +846,9 @@
 
 
-                // =============================================
-                // TRACKS
-                // =============================================
+                // Get the next song ID once for this request.
+                // Each track then gets a unique incremented ID.
+                var nextSongId =
+                    GetNextSongId();
+
 
                 foreach (var trackModel
@@ -809,15 +859,11 @@
                         {
                             SongId =
-                                GetNextSongId(),
+                                nextSongId++,
 
                             SongName =
-                                trackModel
-                                    .SongName
-                                    .Trim(),
+                                trackModel.SongName.Trim(),
 
                             SongDuration =
-                                trackModel
-                                    .SongDuration
-                                    .Trim()
+                                trackModel.SongDuration.Trim()
                         };
 
@@ -829,9 +875,5 @@
 
 
-                    // =========================================
-                    // LINK SONG TO ALBUM
-                    // =========================================
-
-                    var albumSong =
+                    _context.AlbumSongs.Add(
                         new AlbumSong
                         {
@@ -841,14 +883,6 @@
                             SongId =
                                 song.SongId
-                        };
-
-
-                    _context.AlbumSongs.Add(
-                        albumSong);
-
-
-                    // =========================================
-                    // SONG ARTISTS
-                    // =========================================
+                        });
+
 
                     var trackArtistIds =
@@ -858,7 +892,6 @@
 
 
-                    // If no track artists were selected,
-                    // automatically use the release's
-                    // main artist.
+                    // Default to the main release artist when
+                    // no track-specific artists were selected.
                     if (trackArtistIds.Count == 0)
                     {
@@ -874,5 +907,5 @@
                              in trackArtistIds)
                     {
-                        var songArtist =
+                        _context.SongArtists.Add(
                             new SongArtist
                             {
@@ -885,9 +918,5 @@
                                 SongOrdinal =
                                     songOrdinal++
-                            };
-
-
-                        _context.SongArtists.Add(
-                            songArtist);
+                            });
                     }
 
@@ -898,11 +927,11 @@
 
 
-            // =================================================
+            // =====================================================
             // SINGLE
-            // =================================================
+            // =====================================================
 
             else
             {
-                var single =
+                _context.SingleReleases.Add(
                     new SingleRelease
                     {
@@ -911,11 +940,7 @@
 
                         Duration =
-                            model.SingleDuration!
-                                .Trim()
-                    };
-
-
-                _context.SingleReleases.Add(
-                    single);
+                            model.SingleDuration!.Trim()
+                    });
+
 
                 _context.SaveChanges();
@@ -931,11 +956,27 @@
 
             return RedirectToAction(
-                nameof(Index));
-        }
-        catch
+                nameof(Releases));
+        }
+        catch (Exception ex)
         {
             transaction.Rollback();
 
-            throw;
+
+            Console.WriteLine(
+                "CREATE RELEASE FAILED:");
+
+            Console.WriteLine(ex);
+
+
+            ModelState.AddModelError(
+                string.Empty,
+                ex.InnerException?.Message
+                ?? ex.Message);
+
+
+            LoadArtists();
+
+
+            return View(model);
         }
     }
Index: KernelRecordsMVC.Web/Controllers/ReleaseController.cs
===================================================================
--- KernelRecordsMVC.Web/Controllers/ReleaseController.cs	(revision d89d25b3a7f785676877cf198c9cc706308ab4a3)
+++ KernelRecordsMVC.Web/Controllers/ReleaseController.cs	(revision 595d2e58cf322a776ba1d3cedcb86e9bb2ee8093)
@@ -139,14 +139,16 @@
     {
         var release = _context.Releases
+            .Include(r => r.ReleaseArtists)
+            .ThenInclude(ra => ra.Artist)
+
             .Include(r => r.Products)
-
-            .Include(r => r.ReleaseArtists)
-                .ThenInclude(ra => ra.Artist)
+            .ThenInclude(p => p.ModificationProducts)
+            .ThenInclude(mp => mp.Modification)
 
             .Include(r => r.Album)
-                .ThenInclude(a => a!.AlbumSongs)
-                    .ThenInclude(x => x.Song)
-                        .ThenInclude(s => s.SongArtists)
-                            .ThenInclude(sa => sa.Artist)
+            .ThenInclude(a => a.AlbumSongs)
+            .ThenInclude(albumSong => albumSong.Song)
+            .ThenInclude(song => song.SongArtists)
+            .ThenInclude(songArtist => songArtist.Artist)
 
             .Include(r => r.SingleRelease)
