diff --git a/src/App.vue b/src/App.vue
index ac86be1..d222465 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -11,11 +11,11 @@
 
 <script setup lang="ts">
 import { computed, toRef, unref } from "vue";
-import Game from "./components/system/Game.vue";
-import GameOverScreen from "./components/system/GameOverScreen.vue";
-import NaNScreen from "./components/system/NaNScreen.vue";
-import Nav from "./components/system/Nav.vue";
-import TPS from "./components/system/TPS.vue";
+import Game from "./components/Game.vue";
+import GameOverScreen from "./components/GameOverScreen.vue";
+import NaNScreen from "./components/NaNScreen.vue";
+import Nav from "./components/Nav.vue";
+import TPS from "./components/TPS.vue";
 import modInfo from "./data/modInfo.json";
 import themes from "./data/themes";
 import settings from "./game/settings";
diff --git a/src/components/system/Game.vue b/src/components/Game.vue
similarity index 100%
rename from src/components/system/Game.vue
rename to src/components/Game.vue
diff --git a/src/components/system/GameOverScreen.vue b/src/components/GameOverScreen.vue
similarity index 98%
rename from src/components/system/GameOverScreen.vue
rename to src/components/GameOverScreen.vue
index 0914e92..cb274d7 100644
--- a/src/components/system/GameOverScreen.vue
+++ b/src/components/GameOverScreen.vue
@@ -36,7 +36,7 @@
 </template>
 
 <script setup lang="ts">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import { hasWon } from "@/data/mod";
 import modInfo from "@/data/modInfo.json";
 import player from "@/game/player";
diff --git a/src/components/system/Info.vue b/src/components/Info.vue
similarity index 97%
rename from src/components/system/Info.vue
rename to src/components/Info.vue
index e72929a..3fd17ce 100644
--- a/src/components/system/Info.vue
+++ b/src/components/Info.vue
@@ -48,13 +48,12 @@
 </template>
 
 <script setup lang="ts">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import type Changelog from "@/data/Changelog.vue";
 import modInfo from "@/data/modInfo.json";
 import player from "@/game/player";
 import { formatTime } from "@/util/bignum";
 import { computed, ref, toRefs, unref } from "vue";
-import Profectus from "./Profectus.vue";
 
 const { title, logo, author, discordName, discordLink, versionNumber, versionTitle } = modInfo;
 
diff --git a/src/components/system/Layer.vue b/src/components/Layer.vue
similarity index 99%
rename from src/components/system/Layer.vue
rename to src/components/Layer.vue
index 934cbbf..8fd0838 100644
--- a/src/components/system/Layer.vue
+++ b/src/components/Layer.vue
@@ -21,7 +21,7 @@
 </template>
 
 <script lang="ts">
-import Links from "@/components/system/Links.vue";
+import Links from "@/components/links/Links.vue";
 import modInfo from "@/data/modInfo.json";
 import { CoercableComponent, PersistentRef, StyleValue } from "@/features/feature";
 import { Link } from "@/features/links";
diff --git a/src/components/features/MarkNode.vue b/src/components/MarkNode.vue
similarity index 100%
rename from src/components/features/MarkNode.vue
rename to src/components/MarkNode.vue
diff --git a/src/components/system/Modal.vue b/src/components/Modal.vue
similarity index 98%
rename from src/components/system/Modal.vue
rename to src/components/Modal.vue
index 7c67fc2..7b8a5fd 100644
--- a/src/components/system/Modal.vue
+++ b/src/components/Modal.vue
@@ -42,7 +42,7 @@
 <script setup lang="ts">
 import { Link } from "@/features/links";
 import { computed, ref, toRefs } from "vue";
-import Links from "./Links.vue";
+import Links from "./links/Links.vue";
 
 const _props = defineProps<{
     modelValue: boolean;
diff --git a/src/components/system/NaNScreen.vue b/src/components/NaNScreen.vue
similarity index 97%
rename from src/components/system/NaNScreen.vue
rename to src/components/NaNScreen.vue
index 27c88bc..d3cfef7 100644
--- a/src/components/system/NaNScreen.vue
+++ b/src/components/NaNScreen.vue
@@ -43,13 +43,13 @@
 </template>
 
 <script setup lang="ts">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import modInfo from "@/data/modInfo.json";
 import player from "@/game/player";
 import state from "@/game/state";
 import Decimal, { DecimalSource, format } from "@/util/bignum";
 import { ComponentPublicInstance, computed, ref, toRef } from "vue";
-import Toggle from "../fields/Toggle.vue";
+import Toggle from "./fields/Toggle.vue";
 import SavesManager from "./SavesManager.vue";
 
 const { discordName, discordLink } = modInfo;
diff --git a/src/components/system/Nav.vue b/src/components/Nav.vue
similarity index 100%
rename from src/components/system/Nav.vue
rename to src/components/Nav.vue
diff --git a/src/components/system/Options.vue b/src/components/Options.vue
similarity index 92%
rename from src/components/system/Options.vue
rename to src/components/Options.vue
index af8abb4..f7636dc 100644
--- a/src/components/system/Options.vue
+++ b/src/components/Options.vue
@@ -19,15 +19,15 @@
 </template>
 
 <script setup lang="tsx">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import rawThemes from "@/data/themes";
-import { MilestoneDisplay } from "@/features/milestone";
+import { MilestoneDisplay } from "@/features/milestones/milestone";
 import player from "@/game/player";
 import settings from "@/game/settings";
 import { camelToTitle } from "@/util/common";
 import { computed, ref, toRefs } from "vue";
-import Toggle from "../fields/Toggle.vue";
-import Select from "../fields/Select.vue";
+import Toggle from "./fields/Toggle.vue";
+import Select from "./fields/Select.vue";
 import Tooltip from "./Tooltip.vue";
 import { jsx } from "@/features/feature";
 
diff --git a/src/components/system/Profectus.vue b/src/components/Profectus.vue
similarity index 100%
rename from src/components/system/Profectus.vue
rename to src/components/Profectus.vue
diff --git a/src/components/system/Save.vue b/src/components/Save.vue
similarity index 93%
rename from src/components/system/Save.vue
rename to src/components/Save.vue
index 9400b28..9eaf60b 100644
--- a/src/components/system/Save.vue
+++ b/src/components/Save.vue
@@ -51,16 +51,18 @@
         <div class="details" v-else-if="save.error == undefined && isEditing">
             <Text v-model="newName" class="editname" @submit="changeName" />
         </div>
-        <div v-else class="details error">Error: Failed to load save with id {{ save.id }}<br/>{{ save.error }}</div>
+        <div v-else class="details error">
+            Error: Failed to load save with id {{ save.id }}<br />{{ save.error }}
+        </div>
     </div>
 </template>
 
 <script setup lang="ts">
 import player from "@/game/player";
 import { computed, ref, toRefs, watch } from "vue";
-import DangerButton from "../fields/DangerButton.vue";
-import FeedbackButton from "../fields/FeedbackButton.vue";
-import Text from "../fields/Text.vue";
+import DangerButton from "./fields/DangerButton.vue";
+import FeedbackButton from "./fields/FeedbackButton.vue";
+import Text from "./fields/Text.vue";
 import { LoadablePlayerData } from "./SavesManager.vue";
 
 const _props = defineProps<{
diff --git a/src/components/system/SavesManager.vue b/src/components/SavesManager.vue
similarity index 97%
rename from src/components/system/SavesManager.vue
rename to src/components/SavesManager.vue
index 4375fee..d09fb3b 100644
--- a/src/components/system/SavesManager.vue
+++ b/src/components/SavesManager.vue
@@ -57,7 +57,7 @@
 </template>
 
 <script setup lang="ts">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import player, { PlayerData } from "@/game/player";
 import settings from "@/game/settings";
 import { getUniqueID, loadSave, save, newSave } from "@/util/save";
@@ -70,8 +70,8 @@ import {
     unref,
     watch
 } from "vue";
-import Select from "../fields/Select.vue";
-import Text from "../fields/Text.vue";
+import Select from "./fields/Select.vue";
+import Text from "./fields/Text.vue";
 import Save from "./Save.vue";
 import Draggable from "vuedraggable";
 
@@ -117,7 +117,7 @@ watch(saveToImport, save => {
     }
 });
 
-let bankContext = require.context("raw-loader!../../../saves", true, /\.txt$/);
+let bankContext = require.context("raw-loader!../../saves", true, /\.txt$/);
 let bank = ref(
     bankContext.keys().reduce((acc: Array<{ label: string; value: string }>, curr) => {
         // .slice(2, -4) strips the leading ./ and the trailing .txt
diff --git a/src/components/system/TPS.vue b/src/components/TPS.vue
similarity index 100%
rename from src/components/system/TPS.vue
rename to src/components/TPS.vue
diff --git a/src/components/system/Tooltip.vue b/src/components/Tooltip.vue
similarity index 100%
rename from src/components/system/Tooltip.vue
rename to src/components/Tooltip.vue
diff --git a/src/components/fields/Slider.vue b/src/components/fields/Slider.vue
index fdcf561..7ad7433 100644
--- a/src/components/fields/Slider.vue
+++ b/src/components/fields/Slider.vue
@@ -9,7 +9,7 @@
 
 <script setup lang="ts">
 import { computed, toRefs, unref } from "vue";
-import Tooltip from "../system/Tooltip.vue";
+import Tooltip from "../Tooltip.vue";
 import "@/components/common/fields.css";
 
 const _props = defineProps<{
diff --git a/src/components/system/Column.vue b/src/components/layout/Column.vue
similarity index 100%
rename from src/components/system/Column.vue
rename to src/components/layout/Column.vue
diff --git a/src/components/system/Row.vue b/src/components/layout/Row.vue
similarity index 100%
rename from src/components/system/Row.vue
rename to src/components/layout/Row.vue
diff --git a/src/components/system/Spacer.vue b/src/components/layout/Spacer.vue
similarity index 100%
rename from src/components/system/Spacer.vue
rename to src/components/layout/Spacer.vue
diff --git a/src/components/system/Sticky.vue b/src/components/layout/Sticky.vue
similarity index 100%
rename from src/components/system/Sticky.vue
rename to src/components/layout/Sticky.vue
diff --git a/src/components/system/VerticalRule.vue b/src/components/layout/VerticalRule.vue
similarity index 100%
rename from src/components/system/VerticalRule.vue
rename to src/components/layout/VerticalRule.vue
diff --git a/src/components/system/Link.vue b/src/components/links/Link.vue
similarity index 100%
rename from src/components/system/Link.vue
rename to src/components/links/Link.vue
diff --git a/src/components/system/LinkNode.vue b/src/components/links/LinkNode.vue
similarity index 100%
rename from src/components/system/LinkNode.vue
rename to src/components/links/LinkNode.vue
diff --git a/src/components/system/Links.vue b/src/components/links/Links.vue
similarity index 100%
rename from src/components/system/Links.vue
rename to src/components/links/Links.vue
diff --git a/src/data/Changelog.vue b/src/data/Changelog.vue
index 24a37bf..76a2ffd 100644
--- a/src/data/Changelog.vue
+++ b/src/data/Changelog.vue
@@ -19,7 +19,7 @@
 </template>
 
 <script setup lang="ts">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import { ref } from "vue";
 
 const isOpen = ref(false);
diff --git a/src/data/common.tsx b/src/data/common.tsx
index 2f88747..5fc2ce1 100644
--- a/src/data/common.tsx
+++ b/src/data/common.tsx
@@ -3,17 +3,17 @@ import {
     ClickableOptions,
     createClickable,
     GenericClickable
-} from "@/features/clickable";
+} from "@/features/clickables/clickable";
 import { GenericConversion } from "@/features/conversion";
 import { CoercableComponent, jsx, Replace, setDefault } from "@/features/feature";
-import { displayResource } from "@/features/resource";
+import { displayResource } from "@/features/resources/resource";
 import {
     createTreeNode,
     GenericTree,
     GenericTreeNode,
     TreeNode,
     TreeNodeOptions
-} from "@/features/tree";
+} from "@/features/trees/tree";
 import player from "@/game/player";
 import Decimal from "@/util/bignum";
 import {
diff --git a/src/data/layers/aca/a.tsx b/src/data/layers/aca/a.tsx
index efa819e..e143ba7 100644
--- a/src/data/layers/aca/a.tsx
+++ b/src/data/layers/aca/a.tsx
@@ -1,11 +1,11 @@
-import Row from "@/components/system/Row.vue";
-import Tooltip from "@/components/system/Tooltip.vue";
+import Row from "@/components/layout/Row.vue";
+import Tooltip from "@/components/Tooltip.vue";
 import { main } from "@/data/mod";
-import { createAchievement } from "@/features/achievement";
+import { createAchievement } from "@/features/achievements/achievement";
 import { jsx } from "@/features/feature";
-import { createGrid } from "@/features/grid";
-import { createResource } from "@/features/resource";
-import { createTreeNode } from "@/features/tree";
+import { createGrid } from "@/features/grids/grid";
+import { createResource } from "@/features/resources/resource";
+import { createTreeNode } from "@/features/trees/tree";
 import { createLayer } from "@/game/layers";
 import { DecimalSource } from "@/lib/break_eternity";
 import Decimal from "@/util/bignum";
diff --git a/src/data/layers/aca/c.tsx b/src/data/layers/aca/c.tsx
index a29010e..ebb2357 100644
--- a/src/data/layers/aca/c.tsx
+++ b/src/data/layers/aca/c.tsx
@@ -1,21 +1,19 @@
-import MainDisplay from "@/components/features/MainDisplay.vue";
 import Slider from "@/components/fields/Slider.vue";
 import Text from "@/components/fields/Text.vue";
 import Toggle from "@/components/fields/Toggle.vue";
-import Column from "@/components/system/Column.vue";
-import Modal from "@/components/system/Modal.vue";
-import Resource from "@/components/system/Resource.vue";
-import Row from "@/components/system/Row.vue";
-import Spacer from "@/components/system/Spacer.vue";
-import Sticky from "@/components/system/Sticky.vue";
-import VerticalRule from "@/components/system/VerticalRule.vue";
+import Column from "@/components/layout/Column.vue";
+import Row from "@/components/layout/Row.vue";
+import Spacer from "@/components/layout/Spacer.vue";
+import Sticky from "@/components/layout/Sticky.vue";
+import VerticalRule from "@/components/layout/VerticalRule.vue";
+import Modal from "@/components/Modal.vue";
 import { createLayerTreeNode, createResetButton } from "@/data/common";
 import { main } from "@/data/mod";
 import themes from "@/data/themes";
-import { createBar, Direction } from "@/features/bar";
+import { createBar, Direction } from "@/features/bars/bar";
 import { createBuyable } from "@/features/buyable";
-import { createChallenge } from "@/features/challenge";
-import { createClickable } from "@/features/clickable";
+import { createChallenge } from "@/features/challenges/challenge";
+import { createClickable } from "@/features/clickables/clickable";
 import {
     addSoftcap,
     createCumulativeConversion,
@@ -23,14 +21,16 @@ import {
 } from "@/features/conversion";
 import { jsx, persistent, showIf, Visibility } from "@/features/feature";
 import { createHotkey } from "@/features/hotkey";
-import { createInfobox } from "@/features/infobox";
-import { createMilestone } from "@/features/milestone";
+import { createInfobox } from "@/features/infoboxes/infobox";
+import { createMilestone } from "@/features/milestones/milestone";
 import { createReset } from "@/features/reset";
-import { createResource, displayResource, trackBest } from "@/features/resource";
-import { createTab } from "@/features/tab";
-import { createTabButton, createTabFamily } from "@/features/tabFamily";
-import { createTree, createTreeNode, GenericTreeNode, TreeBranch } from "@/features/tree";
-import { createUpgrade } from "@/features/upgrade";
+import MainDisplay from "@/features/resources/MainDisplay.vue";
+import { createResource, displayResource, trackBest } from "@/features/resources/resource";
+import Resource from "@/features/resources/Resource.vue";
+import { createTab } from "@/features/tabs/tab";
+import { createTabButton, createTabFamily } from "@/features/tabs/tabFamily";
+import { createTree, createTreeNode, GenericTreeNode, TreeBranch } from "@/features/trees/tree";
+import { createUpgrade } from "@/features/upgrades/upgrade";
 import { createLayer } from "@/game/layers";
 import settings from "@/game/settings";
 import { DecimalSource } from "@/lib/break_eternity";
@@ -121,12 +121,14 @@ const layer = createLayer(() => {
             return showIf(Decimal.gt(best.value, 0));
         },
         goal: 20,
-        reset,
         resource: main.points,
         onComplete() {
             console.log("hiii");
         },
         onEnter() {
+            main.points.value = 0;
+            main.best.value = main.points.value;
+            main.total.value = main.points.value;
             console.log("So challenging");
         },
         onExit() {
diff --git a/src/data/layers/aca/f.tsx b/src/data/layers/aca/f.tsx
index 878a852..416dfec 100644
--- a/src/data/layers/aca/f.tsx
+++ b/src/data/layers/aca/f.tsx
@@ -1,12 +1,12 @@
-import MainDisplay from "@/components/features/MainDisplay.vue";
 import { createLayerTreeNode, createResetButton } from "@/data/common";
 import { main } from "@/data/mod";
-import { createClickable } from "@/features/clickable";
+import { createClickable } from "@/features/clickables/clickable";
 import { createExponentialScaling, createIndependentConversion } from "@/features/conversion";
 import { jsx, persistent } from "@/features/feature";
-import { createInfobox } from "@/features/infobox";
+import { createInfobox } from "@/features/infoboxes/infobox";
 import { createReset } from "@/features/reset";
-import { createResource, displayResource } from "@/features/resource";
+import MainDisplay from "@/features/resources/MainDisplay.vue";
+import { createResource, displayResource } from "@/features/resources/resource";
 import { createLayer } from "@/game/layers";
 import Decimal, { DecimalSource, formatWhole } from "@/util/bignum";
 import { render } from "@/util/vue";
diff --git a/src/data/mod.tsx b/src/data/mod.tsx
index a96845f..02f98ac 100644
--- a/src/data/mod.tsx
+++ b/src/data/mod.tsx
@@ -1,9 +1,9 @@
-import Modal from "@/components/system/Modal.vue";
-import Profectus from "@/components/system/Profectus.vue";
-import Spacer from "@/components/system/Spacer.vue";
+import Modal from "@/components/Modal.vue";
+import Profectus from "@/components/Profectus.vue";
+import Spacer from "@/components/layout/Spacer.vue";
 import { jsx } from "@/features/feature";
-import { createResource, trackBest, trackOOMPS, trackTotal } from "@/features/resource";
-import { branchedResetPropagation, createTree, GenericTree } from "@/features/tree";
+import { createResource, trackBest, trackOOMPS, trackTotal } from "@/features/resources/resource";
+import { branchedResetPropagation, createTree, GenericTree } from "@/features/trees/tree";
 import { globalBus } from "@/game/events";
 import { createLayer, GenericLayer } from "@/game/layers";
 import player, { PlayerData } from "@/game/player";
diff --git a/src/components/features/Achievement.vue b/src/features/achievements/Achievement.vue
similarity index 93%
rename from src/components/features/Achievement.vue
rename to src/features/achievements/Achievement.vue
index 55f4347..cae4c7b 100644
--- a/src/components/features/Achievement.vue
+++ b/src/features/achievements/Achievement.vue
@@ -26,9 +26,9 @@
 import { CoercableComponent, Visibility } from "@/features/feature";
 import { computeOptionalComponent, processedPropType } from "@/util/vue";
 import { defineComponent, StyleValue, toRefs, unref } from "vue";
-import Tooltip from "@/components/system/Tooltip.vue";
-import LinkNode from "../system/LinkNode.vue";
-import MarkNode from "./MarkNode.vue";
+import Tooltip from "@/components/Tooltip.vue";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
 import "@/components/common/features.css";
 
 export default defineComponent({
diff --git a/src/features/achievement.tsx b/src/features/achievements/achievement.tsx
similarity index 98%
rename from src/features/achievement.tsx
rename to src/features/achievements/achievement.tsx
index 2d0a84c..27279e3 100644
--- a/src/features/achievement.tsx
+++ b/src/features/achievements/achievement.tsx
@@ -1,4 +1,4 @@
-import AchievementComponent from "@/components/features/Achievement.vue";
+import AchievementComponent from "@/features/achievements/Achievement.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/components/features/Bar.vue b/src/features/bars/Bar.vue
similarity index 97%
rename from src/components/features/Bar.vue
rename to src/features/bars/Bar.vue
index 8e82aa4..8d6129d 100644
--- a/src/components/features/Bar.vue
+++ b/src/features/bars/Bar.vue
@@ -45,13 +45,13 @@
 </template>
 
 <script lang="ts">
-import { Direction } from "@/features/bar";
+import { Direction } from "./bar";
 import { CoercableComponent, Visibility } from "@/features/feature";
 import Decimal, { DecimalSource } from "@/util/bignum";
 import { computeOptionalComponent, processedPropType, unwrapRef } from "@/util/vue";
 import { computed, CSSProperties, defineComponent, StyleValue, toRefs, unref } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import MarkNode from "./MarkNode.vue";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/bar.ts b/src/features/bars/bar.ts
similarity index 98%
rename from src/features/bar.ts
rename to src/features/bars/bar.ts
index dc5a16a..a166e51 100644
--- a/src/features/bar.ts
+++ b/src/features/bars/bar.ts
@@ -1,4 +1,4 @@
-import BarComponent from "@/components/features/Bar.vue";
+import BarComponent from "@/features/bars/Bar.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/components/features/board/Board.vue b/src/features/boards/Board.vue
similarity index 99%
rename from src/components/features/board/Board.vue
rename to src/features/boards/Board.vue
index e04cc0c..55f2b37 100644
--- a/src/components/features/board/Board.vue
+++ b/src/features/boards/Board.vue
@@ -51,7 +51,7 @@
 </template>
 
 <script setup lang="ts">
-import { BoardNode, GenericBoard, getNodeProperty } from "@/features/board";
+import { BoardNode, GenericBoard, getNodeProperty } from "@/features/boards/board";
 import { FeatureComponent, PersistentState, Visibility } from "@/features/feature";
 import { computed, ref, toRefs } from "vue";
 import panZoom from "vue-panzoom";
diff --git a/src/components/features/board/BoardLink.vue b/src/features/boards/BoardLink.vue
similarity index 95%
rename from src/components/features/board/BoardLink.vue
rename to src/features/boards/BoardLink.vue
index 3e90176..387b7b6 100644
--- a/src/components/features/board/BoardLink.vue
+++ b/src/features/boards/BoardLink.vue
@@ -11,7 +11,7 @@
 </template>
 
 <script setup lang="ts">
-import { BoardNodeLink } from "@/features/board";
+import { BoardNodeLink } from "@/features/boards/board";
 import { computed, toRefs, unref } from "vue";
 
 const _props = defineProps<{
diff --git a/src/components/features/board/BoardNode.vue b/src/features/boards/BoardNode.vue
similarity index 99%
rename from src/components/features/board/BoardNode.vue
rename to src/features/boards/BoardNode.vue
index b2c09d0..efd3d5d 100644
--- a/src/components/features/board/BoardNode.vue
+++ b/src/features/boards/BoardNode.vue
@@ -175,7 +175,7 @@ import {
     getNodeProperty,
     ProgressDisplay,
     Shape
-} from "@/features/board";
+} from "@/features/boards/board";
 import { Visibility } from "@/features/feature";
 import settings from "@/game/settings";
 import { computed, ref, toRefs, unref, watch } from "vue";
diff --git a/src/features/board.ts b/src/features/boards/board.ts
similarity index 99%
rename from src/features/board.ts
rename to src/features/boards/board.ts
index 48597e1..2833721 100644
--- a/src/features/board.ts
+++ b/src/features/boards/board.ts
@@ -1,4 +1,4 @@
-import BoardComponent from "@/components/features/board/Board.vue";
+import BoardComponent from "@/features/boards/Board.vue";
 import {
     Component,
     findFeatures,
@@ -26,7 +26,7 @@ import {
 import { createLazyProxy } from "@/util/proxies";
 import { Unsubscribe } from "nanoevents";
 import { computed, Ref, unref } from "vue";
-import { Link } from "./links";
+import { Link } from "../links";
 
 export const BoardType = Symbol("Board");
 
diff --git a/src/features/buyable.tsx b/src/features/buyable.tsx
index 9eb0aaf..3df26e6 100644
--- a/src/features/buyable.tsx
+++ b/src/features/buyable.tsx
@@ -1,5 +1,5 @@
-import ClickableComponent from "@/components/features/Clickable.vue";
-import { Resource } from "@/features/resource";
+import ClickableComponent from "@/features/clickables/Clickable.vue";
+import { Resource } from "@/features/resources/resource";
 import Decimal, { DecimalSource, format, formatWhole } from "@/util/bignum";
 import {
     Computable,
diff --git a/src/components/features/Challenge.vue b/src/features/challenges/Challenge.vue
similarity index 97%
rename from src/components/features/Challenge.vue
rename to src/features/challenges/Challenge.vue
index 11a8e47..6af08fb 100644
--- a/src/components/features/Challenge.vue
+++ b/src/features/challenges/Challenge.vue
@@ -28,7 +28,7 @@
 
 <script lang="tsx">
 import "@/components/common/features.css";
-import { GenericChallenge } from "@/features/challenge";
+import { GenericChallenge } from "@/features/challenges/challenge";
 import { jsx, StyleValue, Visibility } from "@/features/feature";
 import { getHighNotifyStyle, getNotifyStyle } from "@/game/notifications";
 import { coerceComponent, isCoercableComponent, processedPropType, unwrapRef } from "@/util/vue";
@@ -43,8 +43,8 @@ import {
     UnwrapRef,
     watchEffect
 } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import MarkNode from "./MarkNode.vue";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/challenge.ts b/src/features/challenges/challenge.ts
similarity index 98%
rename from src/features/challenge.ts
rename to src/features/challenges/challenge.ts
index b4e98d5..c8e9740 100644
--- a/src/features/challenge.ts
+++ b/src/features/challenges/challenge.ts
@@ -1,4 +1,4 @@
-import ChallengeComponent from "@/components/features/Challenge.vue";
+import ChallengeComponent from "@/features/challenges/Challenge.vue";
 import {
     CoercableComponent,
     Component,
@@ -11,7 +11,8 @@ import {
     StyleValue,
     Visibility
 } from "@/features/feature";
-import { Resource } from "@/features/resource";
+import { GenericReset } from "@/features/reset";
+import { Resource } from "@/features/resources/resource";
 import { globalBus } from "@/game/events";
 import settings from "@/game/settings";
 import Decimal, { DecimalSource } from "@/util/bignum";
@@ -24,7 +25,6 @@ import {
 } from "@/util/computed";
 import { createLazyProxy } from "@/util/proxies";
 import { computed, Ref, unref } from "vue";
-import { GenericReset } from "./reset";
 
 export const ChallengeType = Symbol("ChallengeType");
 
diff --git a/src/components/features/Clickable.vue b/src/features/clickables/Clickable.vue
similarity index 95%
rename from src/components/features/Clickable.vue
rename to src/features/clickables/Clickable.vue
index 2b72928..d8b5b4a 100644
--- a/src/components/features/Clickable.vue
+++ b/src/features/clickables/Clickable.vue
@@ -30,7 +30,10 @@
 </template>
 
 <script lang="tsx">
-import { GenericClickable } from "@/features/clickable";
+import "@/components/common/features.css";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
+import { GenericClickable } from "@/features/clickables/clickable";
 import { jsx, StyleValue, Visibility } from "@/features/feature";
 import {
     coerceComponent,
@@ -49,9 +52,6 @@ import {
     UnwrapRef,
     watchEffect
 } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import MarkNode from "./MarkNode.vue";
-import "@/components/common/features.css";
 
 export default defineComponent({
     props: {
diff --git a/src/features/clickable.ts b/src/features/clickables/clickable.ts
similarity index 98%
rename from src/features/clickable.ts
rename to src/features/clickables/clickable.ts
index bf7fcda..df991ca 100644
--- a/src/features/clickable.ts
+++ b/src/features/clickables/clickable.ts
@@ -1,4 +1,4 @@
-import ClickableComponent from "@/components/features/Clickable.vue";
+import ClickableComponent from "@/features/clickables/Clickable.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/features/conversion.ts b/src/features/conversion.ts
index 66ca732..bd46b2f 100644
--- a/src/features/conversion.ts
+++ b/src/features/conversion.ts
@@ -9,7 +9,7 @@ import {
 import { createLazyProxy } from "@/util/proxies";
 import { computed, isRef, Ref, unref } from "vue";
 import { Replace, setDefault } from "./feature";
-import { Resource } from "./resource";
+import { Resource } from "./resources/resource";
 
 export interface ConversionOptions {
     scaling: ScalingFunction;
diff --git a/src/components/features/Grid.vue b/src/features/grids/Grid.vue
similarity index 97%
rename from src/components/features/Grid.vue
rename to src/features/grids/Grid.vue
index f496384..d8f7f91 100644
--- a/src/components/features/Grid.vue
+++ b/src/features/grids/Grid.vue
@@ -17,14 +17,14 @@
 </template>
 
 <script lang="ts">
+import "@/components/common/table.css";
+import themes from "@/data/themes";
 import { Visibility } from "@/features/feature";
-import { GridCell } from "@/features/grid";
+import { GridCell } from "@/features/grids/grid";
+import settings from "@/game/settings";
 import { processedPropType } from "@/util/vue";
 import { computed, defineComponent, unref } from "vue";
 import GridCellVue from "./GridCell.vue";
-import "@/components/common/table.css";
-import settings from "@/game/settings";
-import themes from "@/data/themes";
 
 export default defineComponent({
     props: {
diff --git a/src/components/features/GridCell.vue b/src/features/grids/GridCell.vue
similarity index 97%
rename from src/components/features/GridCell.vue
rename to src/features/grids/GridCell.vue
index 741befb..fb88b67 100644
--- a/src/components/features/GridCell.vue
+++ b/src/features/grids/GridCell.vue
@@ -24,6 +24,8 @@
 </template>
 
 <script lang="ts">
+import "@/components/common/features.css";
+import LinkNode from "@/components/links/LinkNode.vue";
 import { CoercableComponent, StyleValue, Visibility } from "@/features/feature";
 import {
     computeComponent,
@@ -32,8 +34,6 @@ import {
     setupHoldToClick
 } from "@/util/vue";
 import { defineComponent, PropType, toRefs, unref } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import "@/components/common/features.css";
 
 export default defineComponent({
     props: {
diff --git a/src/features/grid.ts b/src/features/grids/grid.ts
similarity index 99%
rename from src/features/grid.ts
rename to src/features/grids/grid.ts
index 1e403b2..8081642 100644
--- a/src/features/grid.ts
+++ b/src/features/grids/grid.ts
@@ -1,4 +1,4 @@
-import GridComponent from "@/components/features/Grid.vue";
+import GridComponent from "@/features/grids/Grid.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/components/features/Infobox.vue b/src/features/infoboxes/Infobox.vue
similarity index 98%
rename from src/components/features/Infobox.vue
rename to src/features/infoboxes/Infobox.vue
index de6275f..3b5f4b8 100644
--- a/src/components/features/Infobox.vue
+++ b/src/features/infoboxes/Infobox.vue
@@ -29,13 +29,13 @@
 </template>
 
 <script lang="ts">
+import LinkNode from "@/components/links/LinkNode.vue";
 import themes from "@/data/themes";
 import { CoercableComponent, Visibility } from "@/features/feature";
 import settings from "@/game/settings";
 import { computeComponent, processedPropType } from "@/util/vue";
 import CollapseTransition from "@ivanv/vue-collapse-transition/src/CollapseTransition.vue";
 import { computed, defineComponent, PropType, Ref, StyleValue, toRefs, unref } from "vue";
-import LinkNode from "../system/LinkNode.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/infobox.ts b/src/features/infoboxes/infobox.ts
similarity index 98%
rename from src/features/infobox.ts
rename to src/features/infoboxes/infobox.ts
index bcf82ed..d86a22e 100644
--- a/src/features/infobox.ts
+++ b/src/features/infoboxes/infobox.ts
@@ -1,4 +1,4 @@
-import InfoboxComponent from "@/components/features/Infobox.vue";
+import InfoboxComponent from "@/features/infoboxes/Infobox.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/components/features/Milestone.vue b/src/features/milestones/Milestone.vue
similarity index 96%
rename from src/components/features/Milestone.vue
rename to src/features/milestones/Milestone.vue
index fb422df..8771f01 100644
--- a/src/components/features/Milestone.vue
+++ b/src/features/milestones/Milestone.vue
@@ -15,12 +15,12 @@
 </template>
 
 <script lang="tsx">
+import "@/components/common/features.css";
 import { jsx, StyleValue, Visibility } from "@/features/feature";
-import { GenericMilestone } from "@/features/milestone";
+import { GenericMilestone } from "@/features/milestones/milestone";
 import { coerceComponent, isCoercableComponent, processedPropType, unwrapRef } from "@/util/vue";
 import { Component, defineComponent, shallowRef, toRefs, unref, UnwrapRef, watchEffect } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import "@/components/common/features.css";
+import LinkNode from "../../components/links/LinkNode.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/milestone.tsx b/src/features/milestones/milestone.tsx
similarity index 98%
rename from src/features/milestone.tsx
rename to src/features/milestones/milestone.tsx
index b30c85f..ea9a3c8 100644
--- a/src/features/milestone.tsx
+++ b/src/features/milestones/milestone.tsx
@@ -1,4 +1,4 @@
-import MilestoneComponent from "@/components/features/Milestone.vue";
+import MilestoneComponent from "@/features/milestones/Milestone.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/components/features/MainDisplay.vue b/src/features/resources/MainDisplay.vue
similarity index 89%
rename from src/components/features/MainDisplay.vue
rename to src/features/resources/MainDisplay.vue
index a829e66..6fc28fe 100644
--- a/src/components/features/MainDisplay.vue
+++ b/src/features/resources/MainDisplay.vue
@@ -11,11 +11,11 @@
 
 <script setup lang="ts">
 import { CoercableComponent } from "@/features/feature";
-import { Resource } from "@/features/resource";
+import { Resource } from "@/features/resources/resource";
 import Decimal from "@/util/bignum";
 import { computeOptionalComponent } from "@/util/vue";
 import { computed, Ref, StyleValue, toRefs } from "vue";
-import ResourceVue from "../system/Resource.vue";
+import ResourceVue from "@/features/resources/Resource.vue";
 
 const _props = defineProps<{
     resource: Resource;
diff --git a/src/components/system/Resource.vue b/src/features/resources/Resource.vue
similarity index 81%
rename from src/components/system/Resource.vue
rename to src/features/resources/Resource.vue
index 408957a..8485869 100644
--- a/src/components/system/Resource.vue
+++ b/src/features/resources/Resource.vue
@@ -5,7 +5,7 @@
 </template>
 
 <script setup lang="ts">
-import { displayResource, Resource } from "@/features/resource";
+import { displayResource, Resource } from "@/features/resources/resource";
 import { computed } from "vue";
 
 const props = defineProps<{
diff --git a/src/features/resource.ts b/src/features/resources/resource.ts
similarity index 100%
rename from src/features/resource.ts
rename to src/features/resources/resource.ts
diff --git a/src/components/features/Tab.vue b/src/features/tabs/Tab.vue
similarity index 100%
rename from src/components/features/Tab.vue
rename to src/features/tabs/Tab.vue
diff --git a/src/components/features/TabButton.vue b/src/features/tabs/TabButton.vue
similarity index 100%
rename from src/components/features/TabButton.vue
rename to src/features/tabs/TabButton.vue
diff --git a/src/components/features/TabFamily.vue b/src/features/tabs/TabFamily.vue
similarity index 96%
rename from src/components/features/TabFamily.vue
rename to src/features/tabs/TabFamily.vue
index 058827b..0592a2a 100644
--- a/src/components/features/TabFamily.vue
+++ b/src/features/tabs/TabFamily.vue
@@ -30,10 +30,12 @@
 </template>
 
 <script lang="ts">
+import Sticky from "@/components/layout/Sticky.vue";
 import themes from "@/data/themes";
 import { CoercableComponent, StyleValue, Visibility } from "@/features/feature";
-import { GenericTab } from "@/features/tab";
-import { GenericTabButton } from "@/features/tabFamily";
+import { GenericTab } from "@/features/tabs/tab";
+import TabButton from "@/features/tabs/TabButton.vue";
+import { GenericTabButton } from "@/features/tabs/tabFamily";
 import settings from "@/game/settings";
 import { coerceComponent, isCoercableComponent, processedPropType, unwrapRef } from "@/util/vue";
 import {
@@ -47,8 +49,6 @@ import {
     unref,
     watchEffect
 } from "vue";
-import Sticky from "../system/Sticky.vue";
-import TabButton from "./TabButton.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/tab.ts b/src/features/tabs/tab.ts
similarity index 94%
rename from src/features/tab.ts
rename to src/features/tabs/tab.ts
index 86218db..49a1e8a 100644
--- a/src/features/tab.ts
+++ b/src/features/tabs/tab.ts
@@ -1,6 +1,3 @@
-import TabComponent from "@/components/features/Tab.vue";
-import { Computable, GetComputableType } from "@/util/computed";
-import { createLazyProxy } from "@/util/proxies";
 import {
     CoercableComponent,
     Component,
@@ -8,7 +5,10 @@ import {
     getUniqueID,
     Replace,
     StyleValue
-} from "./feature";
+} from "@/features/feature";
+import TabComponent from "@/features/tabs/Tab.vue";
+import { Computable, GetComputableType } from "@/util/computed";
+import { createLazyProxy } from "@/util/proxies";
 
 export const TabType = Symbol("Tab");
 
diff --git a/src/features/tabFamily.ts b/src/features/tabs/tabFamily.ts
similarity index 96%
rename from src/features/tabFamily.ts
rename to src/features/tabs/tabFamily.ts
index c0eba79..871f7bd 100644
--- a/src/features/tabFamily.ts
+++ b/src/features/tabs/tabFamily.ts
@@ -1,14 +1,3 @@
-import TabButtonComponent from "@/components/features/TabButton.vue";
-import TabFamilyComponent from "@/components/features/TabFamily.vue";
-import {
-    Computable,
-    GetComputableType,
-    GetComputableTypeWithDefault,
-    processComputable,
-    ProcessedComputable
-} from "@/util/computed";
-import { createLazyProxy } from "@/util/proxies";
-import { computed, Ref, unref } from "vue";
 import {
     CoercableComponent,
     Component,
@@ -21,7 +10,18 @@ import {
     setDefault,
     StyleValue,
     Visibility
-} from "./feature";
+} from "@/features/feature";
+import TabButtonComponent from "@/features/tabs/TabButton.vue";
+import TabFamilyComponent from "@/features/tabs/TabFamily.vue";
+import {
+    Computable,
+    GetComputableType,
+    GetComputableTypeWithDefault,
+    processComputable,
+    ProcessedComputable
+} from "@/util/computed";
+import { createLazyProxy } from "@/util/proxies";
+import { computed, Ref, unref } from "vue";
 import { GenericTab } from "./tab";
 
 export const TabButtonType = Symbol("TabButton");
diff --git a/src/components/features/tree/Tree.vue b/src/features/trees/Tree.vue
similarity index 97%
rename from src/components/features/tree/Tree.vue
rename to src/features/trees/Tree.vue
index 0a1cd9f..1362909 100644
--- a/src/components/features/tree/Tree.vue
+++ b/src/features/trees/Tree.vue
@@ -29,7 +29,7 @@
 
 <script lang="ts">
 import "@/components/common/table.css";
-import { GenericTreeNode } from "@/features/tree";
+import { GenericTreeNode } from "@/features/trees/tree";
 import { processedPropType } from "@/util/vue";
 import { defineComponent, unref } from "vue";
 import TreeNode from "./TreeNode.vue";
diff --git a/src/components/features/tree/TreeNode.vue b/src/features/trees/TreeNode.vue
similarity index 96%
rename from src/components/features/tree/TreeNode.vue
rename to src/features/trees/TreeNode.vue
index 37e64db..97f639e 100644
--- a/src/components/features/tree/TreeNode.vue
+++ b/src/features/trees/TreeNode.vue
@@ -39,7 +39,9 @@
 </template>
 
 <script lang="ts">
-import TooltipVue from "@/components/system/Tooltip.vue";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
+import TooltipVue from "@/components/Tooltip.vue";
 import { CoercableComponent, StyleValue, Visibility } from "@/features/feature";
 import { gatherTooltipProps, Tooltip } from "@/features/tooltip";
 import { ProcessedComputable } from "@/util/computed";
@@ -60,8 +62,6 @@ import {
     unref,
     watchEffect
 } from "vue";
-import LinkNode from "../../system/LinkNode.vue";
-import MarkNode from "../MarkNode.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/tree.ts b/src/features/trees/tree.ts
similarity index 97%
rename from src/features/tree.ts
rename to src/features/trees/tree.ts
index 32577b9..8b634e9 100644
--- a/src/features/tree.ts
+++ b/src/features/trees/tree.ts
@@ -1,4 +1,3 @@
-import TreeComponent from "@/components/features/tree/Tree.vue";
 import {
     CoercableComponent,
     Component,
@@ -10,7 +9,11 @@ import {
     StyleValue,
     Visibility
 } from "@/features/feature";
-import { displayResource, Resource } from "@/features/resource";
+import { Link } from "@/features/links";
+import { GenericReset } from "@/features/reset";
+import { displayResource, Resource } from "@/features/resources/resource";
+import { Tooltip } from "@/features/tooltip";
+import TreeComponent from "@/features/trees/Tree.vue";
 import { DecimalSource, format } from "@/util/bignum";
 import Decimal, { formatWhole } from "@/util/break_eternity";
 import {
@@ -23,9 +26,6 @@ import {
 } from "@/util/computed";
 import { createLazyProxy } from "@/util/proxies";
 import { computed, ref, Ref, unref } from "vue";
-import { Link } from "./links";
-import { GenericReset } from "./reset";
-import { Tooltip } from "./tooltip";
 
 export const TreeNodeType = Symbol("TreeNode");
 export const TreeType = Symbol("Tree");
diff --git a/src/components/features/Upgrade.vue b/src/features/upgrades/Upgrade.vue
similarity index 94%
rename from src/components/features/Upgrade.vue
rename to src/features/upgrades/Upgrade.vue
index 12f4a74..2d34548 100644
--- a/src/components/features/Upgrade.vue
+++ b/src/features/upgrades/Upgrade.vue
@@ -25,9 +25,12 @@
 </template>
 
 <script lang="tsx">
+import "@/components/common/features.css";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
 import { jsx, StyleValue, Visibility } from "@/features/feature";
-import { displayResource, Resource } from "@/features/resource";
-import { GenericUpgrade } from "@/features/upgrade";
+import { displayResource, Resource } from "@/features/resources/resource";
+import { GenericUpgrade } from "@/features/upgrades/upgrade";
 import { DecimalSource } from "@/lib/break_eternity";
 import { coerceComponent, isCoercableComponent, processedPropType, unwrapRef } from "@/util/vue";
 import {
@@ -40,9 +43,6 @@ import {
     UnwrapRef,
     watchEffect
 } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import MarkNode from "./MarkNode.vue";
-import "@/components/common/features.css";
 
 export default defineComponent({
     props: {
diff --git a/src/features/upgrade.ts b/src/features/upgrades/upgrade.ts
similarity index 97%
rename from src/features/upgrade.ts
rename to src/features/upgrades/upgrade.ts
index db52c9e..1036c9a 100644
--- a/src/features/upgrade.ts
+++ b/src/features/upgrades/upgrade.ts
@@ -1,4 +1,4 @@
-import UpgradeComponent from "@/components/features/Upgrade.vue";
+import UpgradeComponent from "@/features/upgrades/Upgrade.vue";
 import {
     CoercableComponent,
     Component,
@@ -13,7 +13,7 @@ import {
     StyleValue,
     Visibility
 } from "@/features/feature";
-import { Resource } from "@/features/resource";
+import { Resource } from "@/features/resources/resource";
 import { GenericLayer } from "@/game/layers";
 import Decimal, { DecimalSource } from "@/util/bignum";
 import { isFunction } from "@/util/common";
diff --git a/src/util/vue.tsx b/src/util/vue.tsx
index f244e16..105e3c1 100644
--- a/src/util/vue.tsx
+++ b/src/util/vue.tsx
@@ -1,5 +1,5 @@
-import Col from "@/components/system/Column.vue";
-import Row from "@/components/system/Row.vue";
+import Col from "@/components/layout/Column.vue";
+import Row from "@/components/layout/Row.vue";
 import {
     CoercableComponent,
     Component as ComponentKey,