diff --git a/test/array.t/data.pi b/test/array/data.pi
similarity index 100%
rename from test/array.t/data.pi
rename to test/array/data.pi
diff --git a/test/array/dune b/test/array/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/array/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/array.t/run.t b/test/array/run.t
similarity index 100%
rename from test/array.t/run.t
rename to test/array/run.t
diff --git a/test/char.t/data.pi b/test/char/data.pi
similarity index 100%
rename from test/char.t/data.pi
rename to test/char/data.pi
diff --git a/test/char/dune b/test/char/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/char/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/char.t/run.t b/test/char/run.t
similarity index 100%
rename from test/char.t/run.t
rename to test/char/run.t
diff --git a/test/component.t/Sub/SubComponent.pi b/test/component/Sub/SubComponent.pi
similarity index 100%
rename from test/component.t/Sub/SubComponent.pi
rename to test/component/Sub/SubComponent.pi
diff --git a/test/component.t/data.pi b/test/component/data.pi
similarity index 100%
rename from test/component.t/data.pi
rename to test/component/data.pi
diff --git a/test/component/dune b/test/component/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/component/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/component.t/run.t b/test/component/run.t
similarity index 100%
rename from test/component.t/run.t
rename to test/component/run.t
diff --git a/test/context.t/HeadlineSecondary.pi b/test/context/HeadlineSecondary.pi
similarity index 100%
rename from test/context.t/HeadlineSecondary.pi
rename to test/context/HeadlineSecondary.pi
diff --git a/test/context.t/SubComponent.pi b/test/context/SubComponent.pi
similarity index 100%
rename from test/context.t/SubComponent.pi
rename to test/context/SubComponent.pi
diff --git a/test/context.t/data.pi b/test/context/data.pi
similarity index 100%
rename from test/context.t/data.pi
rename to test/context/data.pi
diff --git a/test/context/dune b/test/context/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/context/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/context.t/run.t b/test/context/run.t
similarity index 100%
rename from test/context.t/run.t
rename to test/context/run.t
diff --git a/test/dune b/test/dune
deleted file mode 100644
index 85e846c..0000000
--- a/test/dune
+++ /dev/null
@@ -1,2 +0,0 @@
-(cram
- (deps %{bin:print}))
diff --git a/test/function.t/data.pi b/test/function/data.pi
similarity index 100%
rename from test/function.t/data.pi
rename to test/function/data.pi
diff --git a/test/function/dune b/test/function/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/function/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/function.t/library.pi b/test/function/library.pi
similarity index 100%
rename from test/function.t/library.pi
rename to test/function/library.pi
diff --git a/test/function.t/run.t b/test/function/run.t
similarity index 100%
rename from test/function.t/run.t
rename to test/function/run.t
diff --git a/test/interpreter_error.t/data.pi b/test/interpreter_error/data.pi
similarity index 100%
rename from test/interpreter_error.t/data.pi
rename to test/interpreter_error/data.pi
diff --git a/test/interpreter_error/dune b/test/interpreter_error/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/interpreter_error/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/interpreter_error.t/run.t b/test/interpreter_error/run.t
similarity index 100%
rename from test/interpreter_error.t/run.t
rename to test/interpreter_error/run.t
diff --git a/test/loop.t/data.pi b/test/loop/data.pi
similarity index 100%
rename from test/loop.t/data.pi
rename to test/loop/data.pi
diff --git a/test/loop/dune b/test/loop/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/loop/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/loop.t/run.t b/test/loop/run.t
similarity index 100%
rename from test/loop.t/run.t
rename to test/loop/run.t
diff --git a/test/mutation.t/data.pi b/test/mutation/data.pi
similarity index 100%
rename from test/mutation.t/data.pi
rename to test/mutation/data.pi
diff --git a/test/mutation/dune b/test/mutation/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/mutation/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/mutation.t/run.t b/test/mutation/run.t
similarity index 100%
rename from test/mutation.t/run.t
rename to test/mutation/run.t
diff --git a/test/operators.t/data.pi b/test/operators/data.pi
similarity index 100%
rename from test/operators.t/data.pi
rename to test/operators/data.pi
diff --git a/test/operators/dune b/test/operators/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/operators/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/operators.t/run.t b/test/operators/run.t
similarity index 100%
rename from test/operators.t/run.t
rename to test/operators/run.t
diff --git a/test/parse_error/dune b/test/parse_error/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/parse_error/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/parse_error.t/empty_template_expression.pi b/test/parse_error/empty_template_expression.pi
similarity index 100%
rename from test/parse_error.t/empty_template_expression.pi
rename to test/parse_error/empty_template_expression.pi
diff --git a/test/parse_error.t/let_without_expression.pi b/test/parse_error/let_without_expression.pi
similarity index 100%
rename from test/parse_error.t/let_without_expression.pi
rename to test/parse_error/let_without_expression.pi
diff --git a/test/parse_error.t/mutation_without_expression.pi b/test/parse_error/mutation_without_expression.pi
similarity index 100%
rename from test/parse_error.t/mutation_without_expression.pi
rename to test/parse_error/mutation_without_expression.pi
diff --git a/test/parse_error.t/run.t b/test/parse_error/run.t
similarity index 100%
rename from test/parse_error.t/run.t
rename to test/parse_error/run.t
diff --git a/test/parse_error.t/string_interpolation.pi b/test/parse_error/string_interpolation.pi
similarity index 100%
rename from test/parse_error.t/string_interpolation.pi
rename to test/parse_error/string_interpolation.pi
diff --git a/test/parse_error.t/tag_transformer_function.pi b/test/parse_error/tag_transformer_function.pi
similarity index 100%
rename from test/parse_error.t/tag_transformer_function.pi
rename to test/parse_error/tag_transformer_function.pi
diff --git a/test/portal/dune b/test/portal/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/portal/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/portal.t/main.pi b/test/portal/main.pi
similarity index 100%
rename from test/portal.t/main.pi
rename to test/portal/main.pi
diff --git a/test/portal.t/run.t b/test/portal/run.t
similarity index 100%
rename from test/portal.t/run.t
rename to test/portal/run.t
diff --git a/test/record.t/data.pi b/test/record/data.pi
similarity index 100%
rename from test/record.t/data.pi
rename to test/record/data.pi
diff --git a/test/record/dune b/test/record/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/record/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/record.t/run.t b/test/record/run.t
similarity index 100%
rename from test/record.t/run.t
rename to test/record/run.t
diff --git a/test/slot.t/SlotProvider.pi b/test/slot/SlotProvider.pi
similarity index 100%
rename from test/slot.t/SlotProvider.pi
rename to test/slot/SlotProvider.pi
diff --git a/test/slot.t/SubComponent.pi b/test/slot/SubComponent.pi
similarity index 100%
rename from test/slot.t/SubComponent.pi
rename to test/slot/SubComponent.pi
diff --git a/test/slot.t/data.pi b/test/slot/data.pi
similarity index 100%
rename from test/slot.t/data.pi
rename to test/slot/data.pi
diff --git a/test/slot/dune b/test/slot/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/slot/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/slot.t/run.t b/test/slot/run.t
similarity index 100%
rename from test/slot.t/run.t
rename to test/slot/run.t
diff --git a/test/store.t/StoreValueProvider.pi b/test/store/StoreValueProvider.pi
similarity index 100%
rename from test/store.t/StoreValueProvider.pi
rename to test/store/StoreValueProvider.pi
diff --git a/test/store/dune b/test/store/dune
new file mode 100644
index 0000000..35d1cce
--- /dev/null
+++ b/test/store/dune
@@ -0,0 +1,4 @@
+(cram
+ (deps
+ %{bin:print}
+ (source_tree .)))
diff --git a/test/store.t/run.t b/test/store/run.t
similarity index 100%
rename from test/store.t/run.t
rename to test/store/run.t
diff --git a/test/store.t/stores.pi b/test/store/stores.pi
similarity index 100%
rename from test/store.t/stores.pi
rename to test/store/stores.pi
diff --git a/test/template.t/data.pi b/test/template.t/data.pi
deleted file mode 100644
index bafe75f..0000000
--- a/test/template.t/data.pi
+++ /dev/null
@@ -1,28 +0,0 @@
-component Component(
- label: "Section",
- icon: "/images/icons/group.svg",
- group: "Structure",
-) {
- let intro = true;
- let name = if (intro) "String Template" else "World";
- let content = "Hello, $(name)!";
-
-