var genreLimsa = new Genre(uint.MaxValue - 3, "Starting in Limsa Lominsa", 1,
             new uint[] { 108, 109 }.Concat(limsaStart.Quest.Select(x => x.Row))
                 .Where(x => x != 0)
-                .Select(x => (QuestInfo)questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
+                .Select(x => questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
                 .ToList());
         var genreGridania = new Genre(uint.MaxValue - 2, "Starting in Gridania", 1,
             new uint[] { 85, 123, 124 }.Concat(gridaniaStart.Quest.Select(x => x.Row))
                 .Where(x => x != 0)
-                .Select(x => (QuestInfo)questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
+                .Select(x => questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
                 .ToList());
         var genreUldah = new Genre(uint.MaxValue - 1, "Starting in Ul'dah", 1,
             new uint[] { 568, 569, 570 }.Concat(uldahStart.Quest.Select(x => x.Row))
                 .Where(x => x != 0)
-                .Select(x => (QuestInfo)questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
+                .Select(x => questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
                 .ToList());
         genres.InsertRange(0, [genreLimsa, genreGridania, genreUldah]);
         genres.Single(x => x.Id == 1)
 
     internal sealed class Genre
     {
-        public Genre(JournalGenre journalGenre, List<QuestInfo> quests)
+        public Genre(JournalGenre journalGenre, List<IQuestInfo> quests)
         {
             Id = journalGenre.RowId;
             Name = journalGenre.Name.ToString();
             Quests = quests;
         }
 
-        public Genre(uint id, string name, uint categoryId, List<QuestInfo> quests)
+        public Genre(uint id, string name, uint categoryId, List<IQuestInfo> quests)
         {
             Id = id;
             Name = name;
         public uint Id { get; }
         public string Name { get; }
         public uint CategoryId { get; }
-        public List<QuestInfo> Quests { get; }
+        public List<IQuestInfo> Quests { get; }
         public int QuestCount => Quests.Count;
     }
 
 
 
     public bool IsIssuerOfAnyQuest(uint targetId) => _quests.Values.Any(x => x.IssuerDataId == targetId);
 
-    public List<QuestInfo> GetAllByJournalGenre(uint journalGenre)
+    public List<IQuestInfo> GetAllByJournalGenre(uint journalGenre)
     {
         return _quests.Values
-            .Where(x => x is QuestInfo { IsSeasonalEvent: false })
-            .Cast<QuestInfo>()
+            .Where(x => x is QuestInfo { IsSeasonalEvent: false } or not QuestInfo)
             .Where(x => x.JournalGenre == journalGenre)
             .OrderBy(x => x.SortKey)
             .ThenBy(x => x.QuestId)
 
     public bool IsRepeatable { get; }
     public ushort Level { get; }
     public EBeastTribe BeastTribe { get; }
+    public uint? JournalGenre { get; }
+    public ushort SortKey { get; }
     public bool IsMainScenarioQuest { get; }
     public IReadOnlyList<EClassJob> ClassJobs { get; }
     public EExpansionVersion Expansion { get; }
 
         QuestId = new LeveId((ushort)leve.RowId);
         Name = leve.Name;
         Level = leve.ClassJobLevel;
+        JournalGenre = leve.JournalGenre.Row;
+        SortKey = QuestId.Value;
         IssuerDataId = leve.LevelLevemete.Value!.Object;
         ClassJobs = QuestInfoUtils.AsList(leve.ClassJobCategory.Value!);
         Expansion = (EExpansionVersion)leve.LevelLevemete.Value.Territory.Value!.ExVersion.Row;
     public bool IsRepeatable => true;
     public ushort Level { get; }
     public EBeastTribe BeastTribe => EBeastTribe.None;
+    public uint? JournalGenre { get; }
+    public ushort SortKey { get; }
     public bool IsMainScenarioQuest => false;
     public IReadOnlyList<EClassJob> ClassJobs { get; }
     public EExpansionVersion Expansion { get; }
 
     public List<ushort> PreviousInstanceContent { get; }
     public QuestJoin PreviousInstanceContentJoin { get; }
     public uint? JournalGenre { get; }
-    public ushort SortKey { get; set; }
+    public ushort SortKey { get; }
     public bool IsMainScenarioQuest { get; }
     public bool CompletesInstantly { get; }
     public GrandCompany GrandCompany { get; }
 
         Name = npc.Npc.Value!.Singular;
         IssuerDataId = npc.Npc.Row;
         Level = npc.LevelUnlock;
+        SortKey = QuestId.Value;
         Expansion = (EExpansionVersion)npc.QuestRequired.Value!.Expansion.Row;
     }
 
     public bool IsRepeatable => true;
     public ushort Level { get; }
     public EBeastTribe BeastTribe => EBeastTribe.None;
+    public uint? JournalGenre => null;
+    public ushort SortKey { get; }
     public bool IsMainScenarioQuest => false;
     public EExpansionVersion Expansion { get; }
 
 
         }
     }
 
-    private void DrawQuest(QuestInfo questInfo)
+    private void DrawQuest(IQuestInfo questInfo)
     {
         _questRegistry.TryGetQuest(questInfo.QuestId, out var quest);
 
             ImGuiTreeNodeFlags.Leaf | ImGuiTreeNodeFlags.NoTreePushOnOpen | ImGuiTreeNodeFlags.SpanFullWidth);
 
 
-        if (ImGui.IsItemClicked() && _commandManager.Commands.TryGetValue("/questinfo", out var commandInfo))
+        if (questInfo is QuestInfo && ImGui.IsItemClicked() && _commandManager.Commands.TryGetValue("/questinfo", out var commandInfo))
         {
             _commandManager.DispatchCommand("/questinfo", questInfo.QuestId.ToString() ?? string.Empty, commandInfo);
         }
             return new FilteredGenre(genre, genre.Quests);
         else
         {
-            List<QuestInfo> filteredQuests = genre.Quests
+            List<IQuestInfo> filteredQuests = genre.Quests
                 .Where(x => match(x.Name))
                 .ToList();
             if (filteredQuests.Count > 0)
 
     private sealed record FilteredCategory(JournalData.Category Category, List<FilteredGenre> Genres);
 
-    private sealed record FilteredGenre(JournalData.Genre Genre, List<QuestInfo> Quests);
+    private sealed record FilteredGenre(JournalData.Genre Genre, List<IQuestInfo> Quests);
 }