diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java
index 024531a..b78ef39 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java
@@ -109,7 +109,7 @@
       this.associatedObjectListeners = new HashMap<>();
       this.associatedObjects = new HashMap<>(100);
       this.batchMode = OteProperties.isOseeOteInBatchModeEnabled();
-
+      
    }
 
    public void init(IServiceConnector connector) {
@@ -592,25 +592,25 @@
    public void prompt() {
       getRunManager().getCurrentScript().prompt();
    }
-   
+
    public void prompt(String message) {
       getRunManager().getCurrentScript().prompt(new TestPrompt(message, PromptResponseType.NONE));
    }
-   
+
    public void promptPassFail(String message) {
       getRunManager().getCurrentScript().promptPassFail(message);
    }
-   
+
    public void promptPause(String message) {
       getRunManager().getCurrentScript().promptPause(message);
    }
-   
+
    public void promptStep(String message) {
       getRunManager().getCurrentScript().prompt(new TestPrompt(message, PromptResponseType.SCRIPT_STEP));
    }
-   
+
    public String promptInput(String message) {
       return getRunManager().getCurrentScript().prompt(new TestPrompt(message, PromptResponseType.USER_INPUT));
    }
-   
+
 }
diff --git a/org.eclipse.ote.simple.test.environment/src/org/eclipse/ote/simple/test/environment/SimpleOteApi.java b/org.eclipse.ote.simple.test.environment/src/org/eclipse/ote/simple/test/environment/SimpleOteApi.java
new file mode 100644
index 0000000..f6d501b
--- /dev/null
+++ b/org.eclipse.ote.simple.test.environment/src/org/eclipse/ote/simple/test/environment/SimpleOteApi.java
@@ -0,0 +1,35 @@
+/*********************************************************************
+ * Copyright (c) 2022 Boeing
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ **********************************************************************/
+package org.eclipse.ote.simple.test.environment;
+
+import org.eclipse.osee.framework.jdk.core.type.NamedId;
+import org.eclipse.osee.ote.core.environment.OteApi;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Nydia Delgado
+ */
+public class SimpleOteApi implements OteApi {
+
+   private TestEnvironment testEnv;
+
+   @Override
+   public void logTestPoint(boolean isPassed, String testPointName, String expected, String actual) {
+      testEnv.getTestScript().logTestPoint(isPassed, testPointName, expected, actual);
+   }
+
+   @Override
+   public void logTestPoint(boolean isPassed, String testPointName, NamedId expected, NamedId actual) {
+      logTestPoint(isPassed, testPointName, expected.getName(), actual.getName());
+   }
+}
diff --git a/org.eclipse.ote.simple.test.script/META-INF/MANIFEST.MF b/org.eclipse.ote.simple.test.script/META-INF/MANIFEST.MF
index c39723f..da000a1 100644
--- a/org.eclipse.ote.simple.test.script/META-INF/MANIFEST.MF
+++ b/org.eclipse.ote.simple.test.script/META-INF/MANIFEST.MF
@@ -3,13 +3,16 @@
 Bundle-Name: OTE Simple Test Script
 Bundle-SymbolicName: org.eclipse.ote.simple.test.script
 Bundle-Version: 0.26.3.qualifier
-Require-Bundle: org.eclipse.core.runtime
+Require-Bundle: org.eclipse.core.runtime,
+ org.junit
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.eclipse.ote.simple.test.script
 Import-Package: org.eclipse.osee.framework.jdk.core.persistence,
+ org.eclipse.osee.framework.jdk.core.type,
  org.eclipse.osee.framework.logging,
  org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.annotations,
  org.eclipse.osee.ote.core.enums,
  org.eclipse.osee.ote.core.environment,
  org.eclipse.osee.ote.core.environment.interfaces,
diff --git a/org.eclipse.ote.simple.test.script/src/org/eclipse/ote/simple/test/script/SimpleTestScript.java b/org.eclipse.ote.simple.test.script/src/org/eclipse/ote/simple/test/script/SimpleTestScript.java
index 7e3a0ff..3e37902 100644
--- a/org.eclipse.ote.simple.test.script/src/org/eclipse/ote/simple/test/script/SimpleTestScript.java
+++ b/org.eclipse.ote.simple.test.script/src/org/eclipse/ote/simple/test/script/SimpleTestScript.java
@@ -19,13 +19,11 @@
 import java.nio.ByteBuffer;
 import java.nio.channels.DatagramChannel;
 import java.util.logging.Level;
+
 import org.eclipse.osee.framework.logging.OseeLog;
-import org.eclipse.osee.ote.core.TestCase;
 import org.eclipse.osee.ote.core.TestException;
-import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.annotations.Order;
 import org.eclipse.osee.ote.core.environment.EnvironmentTask;
-import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
-import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
 import org.eclipse.osee.ote.core.environment.jini.ITestEnvironmentCommandCallback;
 import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
 import org.eclipse.ote.io.mux.MuxHeader;
@@ -34,6 +32,8 @@
 import org.eclipse.ote.simple.io.message.HELLO_WORLD;
 import org.eclipse.ote.simple.io.message.SIMPLE_MUX_R_MSG;
 import org.eclipse.ote.simple.io.message.lookup.SimpleMuxReceiverHeader;
+import org.eclipse.ote.simple.test.environment.SimpleOteApi;
+import org.junit.Test;
 
 /**
  * @author Andy Jury
@@ -46,91 +46,52 @@
       super(testEnvironment, callback);
 
       this.writer = getMessageWriter(HELLO_WORLD.class);
-
-      new TestCase1(this);
-      new TestCase2(this);
-      new TestCaseSend(this);
+      setupTestScript((SimpleOteApi) testEnvironment.getOteApi());
    }
 
-   private class LocalSetupTestCase extends TestCase {
-
-      protected LocalSetupTestCase(TestScript parent) {
-
-         super(parent, false, false);
-      }
-
-      @Override
-      public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) {
-         // Intentionally empty block
-      }
+   protected void setupTestScript(SimpleOteApi oteApi) {
+      // Intentionally empty block
    }
 
-   @Override
-   protected TestCase getSetupTestCase() {
-
-      return new LocalSetupTestCase(this);
+   @Test
+   @Order(1)
+   public void testCase1(SimpleOteApi oteApi) {
+      prompt("In TestCase1");
+      promptPause("In TestCase1");
+      promptPassFail("Pass/Fail?");
    }
 
-   public class TestCase1 extends TestCase {
-
-      public TestCase1(TestScript parent) {
-
-         super(parent);
-      }
-
-      @Override
-      public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) {
-         prompt("In TestCase1");
-         promptPause("In TestCase1");
-         promptPassFail("Pass/Fail?");
-      }
+   @Test
+   @Order(2)
+   public void testCase2(SimpleOteApi oteApi) {
+      // This test case will fail when running in an environment with Mux
+      // unless you uncomment the following line to force the message mem type
+      writer.setMemSource(SimpleDataType.SIMPLE);
+      prompt("In the LocalSetupTestCase");
+      writer.PRINT_ME.setNoLog("TEST1");
+      testWait(1000);
+      writer.PRINT_ME.setNoLog("TEST2");
+      testWait(1000);
+      writer.PRINT_ME.setNoLog("TEST3");
+      testWait(1000);
+      writer.PRINT_ME.setNoLog("TEST4");
+      writer.ONLY_IN_SIMPLE.setNoLog(64);
+      writer.send();
+      testWait(1000);
+      writer.unschedule();
    }
 
-   public class TestCase2 extends TestCase {
+   @Test
+   @Order(3)
+   public void testCaseSend(SimpleOteApi oteApi) {
+      try {
+         MuxChannelSender sender = new MuxChannelSender();
+         environment.addTask(sender);
 
-      public TestCase2(TestScript parent) {
-
-         super(parent);
-      }
-
-      @Override
-      public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) {
-         // This test case will fail when running in an environment with Mux
-         // unless you uncomment the following line to force the message mem type
-         writer.setMemSource(SimpleDataType.SIMPLE);
-         prompt("In the LocalSetupTestCase");
-         writer.PRINT_ME.set(this, "TEST1");
-         testWait(1000);
-         writer.PRINT_ME.setNoLog("TEST2");
-         testWait(1000);
-         writer.PRINT_ME.setNoLog("TEST3");
-         testWait(1000);
-         writer.PRINT_ME.setNoLog("TEST4");
-         writer.ONLY_IN_SIMPLE.set(this, 64);
-         writer.send();
-         testWait(1000);
-         writer.unschedule();
-      }
-   }
-
-   public class TestCaseSend extends TestCase {
-
-      public TestCaseSend(TestScript parent) {
-
-         super(parent);
-      }
-
-      @Override
-      public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) {
-         try {
-            MuxChannelSender sender = new MuxChannelSender();
-            environment.addTask(sender);
-
-            testWait(10000);
-            sender.disable();
-         } catch (IOException ex) {
-            logTestPoint(false, "Error starting packet sender", "N/A", ex.getMessage());
-         }
+         testWait(10000);
+         sender.disable();
+      } catch (IOException ex) {
+         logTestPoint(false, "Error starting packet sender", "N/A", ex.getMessage());
       }
    }
 
diff --git a/org.eclipse.ote.simple.test.script/src/org/eclipse/ote/simple/test/script/SimpleTestScriptType.java b/org.eclipse.ote.simple.test.script/src/org/eclipse/ote/simple/test/script/SimpleTestScriptType.java
index 8afc2cd..b861d0e 100644
--- a/org.eclipse.ote.simple.test.script/src/org/eclipse/ote/simple/test/script/SimpleTestScriptType.java
+++ b/org.eclipse.ote.simple.test.script/src/org/eclipse/ote/simple/test/script/SimpleTestScriptType.java
@@ -13,31 +13,44 @@
 
 package org.eclipse.ote.simple.test.script;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.eclipse.osee.framework.jdk.core.type.OseeArgumentException;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.ote.core.TestCase;
 import org.eclipse.osee.ote.core.TestScript;
 import org.eclipse.osee.ote.core.enums.ScriptTypeEnum;
+import org.eclipse.osee.ote.core.environment.OteApi;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
 import org.eclipse.osee.ote.core.environment.jini.ITestEnvironmentCommandCallback;
 import org.eclipse.osee.ote.message.Message;
 import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
 import org.eclipse.osee.ote.message.interfaces.IMessageRequestor;
+import org.eclipse.ote.simple.test.environment.SimpleOteApi;
 
 /**
  * @author Michael P. Masterson
  */
 public class SimpleTestScriptType extends TestScript {
-   
+
    protected IMessageRequestor<Message> messageRequestor;
+   protected OteApi oteApi;
 
    @SuppressWarnings("unchecked")
    public SimpleTestScriptType(MessageSystemTestEnvironment testEnvironment, ITestEnvironmentCommandCallback callback) {
       super(testEnvironment, null, ScriptTypeEnum.FUNCTIONAL_TEST, true);
 
       messageRequestor = testEnvironment.getMsgManager().createMessageRequestor(getClass().getName());
+      this.oteApi = new SimpleOteApi();
+      testEnvironment.setOteApi(oteApi);
    }
-   
+
    protected <CLASSTYPE extends Message> CLASSTYPE getMessageWriter(Class<CLASSTYPE> type) {
       return messageRequestor.getMessageWriter(type);
    }
-   
+
    /**
     * Any time a requestor is created, it should be disposed of when done
     */
@@ -46,5 +59,33 @@
       messageRequestor.dispose();
       super.dispose();
    }
-   
-}
\ No newline at end of file
+
+   @Override
+   protected void addMethodAsTestCase(Method method) {
+      Class<?>[] parameterTypes = method.getParameterTypes();
+      if (parameterTypes.length != 1) {
+         throw new OseeArgumentException("Wrong method signature for test case method %s", method.getName());
+      }
+      if (parameterTypes[0].isAssignableFrom(this.oteApi.getClass()) || parameterTypes[0].equals(OteApi.class)) {
+         addTestCase(new TestCase(this, false, false) {
+
+            @Override
+            public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger)
+                  throws InterruptedException {
+               try {
+                  method.invoke(getTestScript(), oteApi);
+               } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
+                  Throwable realThrowable = ex;
+                  while (realThrowable.getCause() != null) {
+                     realThrowable = realThrowable.getCause();
+                  }
+                  ex.printStackTrace(System.err);
+                  OseeCoreException.wrapAndThrow(realThrowable);
+               }
+            }
+         });
+      } else {
+         System.out.println("NOT RUNNING TEST CASE BASED ON CONFIGURATION NOT MATCHING - " + method.getName());
+      }
+   }
+}
