diff --git a/procedural/constraints/src/test/java/gov/nasa/ammos/aerie/procedural/constraints/NotImplementedPlan.java b/procedural/constraints/src/test/java/gov/nasa/ammos/aerie/procedural/constraints/NotImplementedPlan.java
new file mode 100644
index 0000000000..430457a978
--- /dev/null
+++ b/procedural/constraints/src/test/java/gov/nasa/ammos/aerie/procedural/constraints/NotImplementedPlan.java
@@ -0,0 +1,42 @@
+package gov.nasa.ammos.aerie.procedural.constraints;
+
+import gov.nasa.ammos.aerie.procedural.timeline.Interval;
+import gov.nasa.ammos.aerie.procedural.timeline.collections.Directives;
+import gov.nasa.ammos.aerie.procedural.timeline.plan.Plan;
+import gov.nasa.jpl.aerie.merlin.protocol.types.Duration;
+import gov.nasa.jpl.aerie.merlin.protocol.types.SerializedValue;
+import kotlin.NotImplementedError;
+import kotlin.jvm.functions.Function1;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.time.Instant;
+
+public class NotImplementedPlan implements Plan {
+ @NotNull
+ @Override
+ public Interval totalBounds() {
+ throw new NotImplementedError();
+ }
+
+ @NotNull
+ @Override
+ public Duration toRelative(@NotNull final Instant abs) {
+ throw new NotImplementedError();
+ }
+
+ @NotNull
+ @Override
+ public Instant toAbsolute(@NotNull final Duration rel) {
+ throw new NotImplementedError();
+ }
+
+ @NotNull
+ @Override
+ public Directives directives(
+ @Nullable final String type,
+ @NotNull final Function1 super SerializedValue, ? extends A> deserializer)
+ {
+ throw new NotImplementedError();
+ }
+}
diff --git a/procedural/constraints/src/test/kotlin/gov/nasa/ammos/aerie/procedural/constraints/NotImplementedPlan.kt b/procedural/constraints/src/test/kotlin/gov/nasa/ammos/aerie/procedural/constraints/NotImplementedPlan.kt
deleted file mode 100644
index 786cf5f370..0000000000
--- a/procedural/constraints/src/test/kotlin/gov/nasa/ammos/aerie/procedural/constraints/NotImplementedPlan.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package gov.nasa.ammos.aerie.procedural.constraints
-
-import gov.nasa.ammos.aerie.procedural.timeline.Interval
-import gov.nasa.ammos.aerie.procedural.timeline.collections.Directives
-import gov.nasa.ammos.aerie.procedural.timeline.plan.Plan
-import gov.nasa.jpl.aerie.merlin.protocol.types.Duration
-import gov.nasa.jpl.aerie.merlin.protocol.types.SerializedValue
-import java.time.Instant
-
-open class NotImplementedPlan: Plan {
- override fun totalBounds(): Interval = TODO()
- override fun toRelative(abs: Instant): Duration = TODO()
- override fun toAbsolute(rel: Duration): Instant = TODO()
- override fun directives(type: String?, deserializer: (SerializedValue) -> A): Directives = TODO()
-}