mSkill;
 
     public EditSkillViewModel() {
-        mHasChanges = new MutableLiveData<>(false);
-        ChangeTrackedLiveData.OnValueDirtiedCallback onDirtied = () -> mHasChanges.setValue(true);
-
-        mAbilityScore = new ChangeTrackedLiveData<>(AbilityScore.STRENGTH, onDirtied);
-        mAdvantageType = new ChangeTrackedLiveData<>(AdvantageType.NONE, onDirtied);
-        mProficiencyType = new ChangeTrackedLiveData<>(ProficiencyType.NONE, onDirtied);
-        mName = new ChangeTrackedLiveData<>("Unknown Skill", onDirtied);
-        mSkill = new ChangeTrackedLiveData<>(makeSkill(), onDirtied);
+        super();
+        mAbilityScore = new ChangeTrackedLiveData<>(AbilityScore.STRENGTH, this::makeDirty);
+        mAdvantageType = new ChangeTrackedLiveData<>(AdvantageType.NONE, this::makeDirty);
+        mProficiencyType = new ChangeTrackedLiveData<>(ProficiencyType.NONE, this::makeDirty);
+        mName = new ChangeTrackedLiveData<>("Unknown Skill", this::makeDirty);
+        mSkill = new ChangeTrackedLiveData<>(makeSkill(), this::makeDirty);
     }
 
     public void copyFromSkill(Skill skill) {
@@ -76,11 +72,6 @@ public class EditSkillViewModel extends ViewModel {
         mSkill.setValue(makeSkill());
     }
 
-    public boolean hasChanges() {
-        Boolean value = mHasChanges.getValue();
-        return value != null && value;
-    }
-
     private Skill makeSkill() {
         return new Skill(mName.getValue(), mAbilityScore.getValue(), mAdvantageType.getValue(), mProficiencyType.getValue());
     }
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSkillsFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSkillsFragment.java
index 538addd..608896f 100644
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSkillsFragment.java
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSkillsFragment.java
@@ -20,14 +20,13 @@ import androidx.recyclerview.widget.RecyclerView;
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
 import com.majinnaibu.monstercards.R;
 import com.majinnaibu.monstercards.models.Skill;
-import com.majinnaibu.monstercards.ui.MCFragment;
+import com.majinnaibu.monstercards.ui.shared.MCFragment;
 import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback;
 import com.majinnaibu.monstercards.utils.Logger;
 
 /**
  * A fragment representing a list of Items.
  */
-@SuppressWarnings("FieldCanBeLocal")
 public class EditSkillsFragment extends MCFragment {
     private EditMonsterViewModel mViewModel;
     private ViewHolder mHolder;
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSpeedFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSpeedFragment.java
index c667624..2708e01 100644
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSpeedFragment.java
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSpeedFragment.java
@@ -13,8 +13,8 @@ import androidx.navigation.NavController;
 import androidx.navigation.Navigation;
 
 import com.majinnaibu.monstercards.R;
-import com.majinnaibu.monstercards.ui.MCFragment;
 import com.majinnaibu.monstercards.ui.components.Stepper;
+import com.majinnaibu.monstercards.ui.shared.MCFragment;
 import com.majinnaibu.monstercards.utils.TextChangedListener;
 
 public class EditSpeedFragment extends MCFragment {
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/placeholder/PlaceholderContent.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/placeholder/PlaceholderContent.java
deleted file mode 100644
index d6519c6..0000000
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/placeholder/PlaceholderContent.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.majinnaibu.monstercards.ui.editmonster.placeholder;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Helper class for providing sample content for user interfaces created by
- * Android template wizards.
- * 
- * TODO: Replace all uses of this class before publishing your app.
- */
-public class PlaceholderContent {
-
-    /**
-     * An array of sample (placeholder) items.
-     */
-    public static final List ITEMS = new ArrayList();
-
-    /**
-     * A map of sample (placeholder) items, by ID.
-     */
-    public static final Map ITEM_MAP = new HashMap();
-
-    private static final int COUNT = 25;
-
-    static {
-        // Add some sample items.
-        for (int i = 1; i <= COUNT; i++) {
-            addItem(createPlaceholderItem(i));
-        }
-    }
-
-    private static void addItem(PlaceholderItem item) {
-        ITEMS.add(item);
-        ITEM_MAP.put(item.id, item);
-    }
-
-    private static PlaceholderItem createPlaceholderItem(int position) {
-        return new PlaceholderItem(String.valueOf(position), "Item " + position, makeDetails(position));
-    }
-
-    private static String makeDetails(int position) {
-        StringBuilder builder = new StringBuilder();
-        builder.append("Details about Item: ").append(position);
-        for (int i = 0; i < position; i++) {
-            builder.append("\nMore details information here.");
-        }
-        return builder.toString();
-    }
-
-    /**
-     * A placeholder item representing a piece of content.
-     */
-    public static class PlaceholderItem {
-        public final String id;
-        public final String content;
-        public final String details;
-
-        public PlaceholderItem(String id, String content, String details) {
-            this.id = id;
-            this.content = content;
-            this.details = details;
-        }
-
-        @Override
-        public String toString() {
-            return content;
-        }
-    }
-}
\ No newline at end of file
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/library/LibraryFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/library/LibraryFragment.java
index 373950e..b1881b6 100644
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/library/LibraryFragment.java
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/library/LibraryFragment.java
@@ -19,7 +19,7 @@ import com.google.android.material.snackbar.Snackbar;
 import com.majinnaibu.monstercards.R;
 import com.majinnaibu.monstercards.data.MonsterRepository;
 import com.majinnaibu.monstercards.models.Monster;
-import com.majinnaibu.monstercards.ui.MCFragment;
+import com.majinnaibu.monstercards.ui.shared.MCFragment;
 import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback;
 import com.majinnaibu.monstercards.utils.Logger;
 
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java
index 10f4ff7..cf0031d 100644
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java
@@ -26,7 +26,7 @@ import com.majinnaibu.monstercards.data.MonsterRepository;
 import com.majinnaibu.monstercards.helpers.CommonMarkHelper;
 import com.majinnaibu.monstercards.helpers.StringHelper;
 import com.majinnaibu.monstercards.models.Monster;
-import com.majinnaibu.monstercards.ui.MCFragment;
+import com.majinnaibu.monstercards.ui.shared.MCFragment;
 import com.majinnaibu.monstercards.utils.Logger;
 
 import java.util.UUID;
@@ -241,10 +241,15 @@ public class MonsterDetailFragment extends MCFragment {
     @Override
     public boolean onOptionsItemSelected(@NonNull MenuItem item) {
         if (item.getItemId() == R.id.menu_action_edit_monster) {
-            NavDirections action = MonsterDetailFragmentDirections.actionNavigationMonsterToEditMonsterFragment(monsterDetailViewModel.getId().getValue().toString());
-            View view = getView();
-            assert view != null;
-            Navigation.findNavController(view).navigate(action);
+            UUID monsterId = monsterDetailViewModel.getId().getValue();
+            if (monsterId != null) {
+                NavDirections action = MonsterDetailFragmentDirections.actionNavigationMonsterToEditMonsterFragment(monsterId.toString());
+                View view = getView();
+                assert view != null;
+                Navigation.findNavController(view).navigate(action);
+            } else {
+                Logger.logWTF("monsterId cannot be null.");
+            }
             return true;
         }
         return super.onOptionsItemSelected(item);
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/search/SearchFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/search/SearchFragment.java
index ff62b72..12ab602 100644
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/search/SearchFragment.java
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/search/SearchFragment.java
@@ -14,10 +14,10 @@ import androidx.recyclerview.widget.RecyclerView;
 
 import com.majinnaibu.monstercards.R;
 import com.majinnaibu.monstercards.data.MonsterRepository;
-import com.majinnaibu.monstercards.ui.MCFragment;
+import com.majinnaibu.monstercards.ui.shared.MCFragment;
 
 public class SearchFragment extends MCFragment {
-    
+
     public View onCreateView(@NonNull LayoutInflater inflater,
                              ViewGroup container, Bundle savedInstanceState) {
         View root = inflater.inflate(R.layout.fragment_search, container, false);
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/search/SearchResultsRecyclerViewAdapter.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/search/SearchResultsRecyclerViewAdapter.java
index c437486..c9f62e2 100644
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/search/SearchResultsRecyclerViewAdapter.java
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/search/SearchResultsRecyclerViewAdapter.java
@@ -13,6 +13,8 @@ import com.majinnaibu.monstercards.data.MonsterRepository;
 import com.majinnaibu.monstercards.models.Monster;
 import com.majinnaibu.monstercards.utils.Logger;
 
+import org.jetbrains.annotations.NotNull;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -20,16 +22,11 @@ import io.reactivex.rxjava3.core.Flowable;
 import io.reactivex.rxjava3.disposables.Disposable;
 
 public class SearchResultsRecyclerViewAdapter extends RecyclerView.Adapter {
-    public interface ItemCallback {
-        void onItem(Monster monster);
-    }
-
     private final MonsterRepository mRepository;
+    private final ItemCallback mOnClickHandler;
     private String mSearchText;
     private List mValues;
     private Disposable mSubscriptionHandler;
-    private final ItemCallback mOnClickHandler;
-
     public SearchResultsRecyclerViewAdapter(MonsterRepository repository,
                                             ItemCallback onClick) {
         mRepository = repository;
@@ -54,6 +51,7 @@ public class SearchResultsRecyclerViewAdapter extends RecyclerView.Adapter Logger.logError("Error performing search", throwable));
     }
 
+    @NotNull
     @Override
     public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         View view = LayoutInflater.from(parent.getContext())
@@ -79,7 +77,11 @@ public class SearchResultsRecyclerViewAdapter extends RecyclerView.Adapter