diff --git a/org.eclipse.osee.ote.core.test/data/attribute.json b/org.eclipse.osee.ote.core.test/data/attribute.json
new file mode 100644
index 0000000..1761f22
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/data/attribute.json
@@ -0,0 +1 @@
+{"typeName":"Outfile URL","value":"TBD"}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core.test/data/createArtifacts.json b/org.eclipse.osee.ote.core.test/data/createArtifacts.json
new file mode 100644
index 0000000..c3f90e7
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/data/createArtifacts.json
@@ -0,0 +1 @@
+{"typeName":"TestRun","scriptName":"TBD","attribute":[{"typeName":"Outfile URL","value":"TBD"},{"typeName":"ElapsedDate","value":"0:08:15"}]}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core.test/data/testRunTransactionEndpoint.json b/org.eclipse.osee.ote.core.test/data/testRunTransactionEndpoint.json
new file mode 100644
index 0000000..c64da72
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/data/testRunTransactionEndpoint.json
@@ -0,0 +1 @@
+{"branch":"testRunBranch","txComment":"Created by ScriptJsonOutLogHandler","createArtifacts":{"typeName":"TestRun","scriptName":"TBD","attribute":[{"typeName":"Outfile URL","value":"TBD"},{"typeName":"ElapsedDate","value":"0:08:15"}]}}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core.test/data/testRunTransactionEndpointPublisher.json b/org.eclipse.osee.ote.core.test/data/testRunTransactionEndpointPublisher.json
new file mode 100644
index 0000000..51f4a2c
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/data/testRunTransactionEndpointPublisher.json
@@ -0,0 +1 @@
+{"branch":"ote_test_run_transaction_endpoint_HARDCODED","txComment":"Created by TestRunTransactionEndpointPublisher","createArtifacts":{"typeName":"TestRun","scriptName":"org.eclipse.ote.simple.test.script.SimpleTestScript","attribute":[{"typeName":"Elapsed Date","value":"0:01:48"},{"typeName":"End Date","value":"Thu May 19 16:58:44 MST 2022"},{"typeName":"Start Date","value":"Thu May 19 16:56:55 MST 2022"},{"typeName":"Passed","value":"1"},{"typeName":"Failed","value":"0"},{"typeName":"Script Aborted","value":"true"},{"typeName":"Total Test Points","value":"1"},{"typeName":"OS Name","value":"Windows 10"},{"typeName":"OS Architecture","value":"amd64"},{"typeName":"OS Version","value":"10.0"},{"typeName":"OSEE Version","value":"1.0.0.v202202031707-DEV"},{"typeName":"OSEE Server Title","value":"OTE_CI"}]}}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/AttributeJsonPojoTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/AttributeJsonPojoTest.java
new file mode 100644
index 0000000..2d9edfb
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/AttributeJsonPojoTest.java
@@ -0,0 +1,42 @@
+/*********************************************************************
+ * 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.osee.ote.core.framework.outfile;
+
+import static org.junit.Assert.assertEquals;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import org.junit.Test;
+
+/**
+ * @author Andy Jury
+ */
+public class AttributeJsonPojoTest {
+
+   @Test
+   public void testAttributeJsonPojoTest() throws Exception {
+
+      String path = "data/attribute.json";
+      String jsonFileString = new String(Files.readAllBytes(Paths.get(path)));
+
+      AttributeJsonPojo attribute = new AttributeJsonPojo();
+      attribute.setTypeName("Outfile URL");
+      attribute.setValue("TBD");
+
+      ObjectMapper objectMapper = new ObjectMapper();
+      String inputJson = objectMapper.writeValueAsString(attribute);
+
+      assertEquals(jsonFileString, inputJson);
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/CreateArtifactsJsonPojoTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/CreateArtifactsJsonPojoTest.java
new file mode 100644
index 0000000..4a16c9a
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/CreateArtifactsJsonPojoTest.java
@@ -0,0 +1,53 @@
+/*********************************************************************
+ * 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.osee.ote.core.framework.outfile;
+
+import static org.junit.Assert.assertEquals;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import org.junit.Test;
+
+/**
+ * @author Andy Jury
+ */
+public class CreateArtifactsJsonPojoTest {
+
+   @Test
+   public void testCreateArtifactsJsonPojoTest() throws Exception {
+
+      String path = "data/createArtifacts.json";
+      String jsonFileString = new String(Files.readAllBytes(Paths.get(path)));
+
+      CreateArtifactsJsonPojo createArtifacts = new CreateArtifactsJsonPojo();
+      createArtifacts.setTypeName("TestRun");
+      createArtifacts.setScriptName("TBD");
+
+      AttributeJsonPojo attribute1 = new AttributeJsonPojo();
+      attribute1.setTypeName("Outfile URL");
+      attribute1.setValue("TBD");
+
+      AttributeJsonPojo attribute2 = new AttributeJsonPojo();
+      attribute2.setTypeName("ElapsedDate");
+      attribute2.setValue("0:08:15");
+
+      createArtifacts.addAttribute(attribute1);
+      createArtifacts.addAttribute(attribute2);
+
+      ObjectMapper objectMapper = new ObjectMapper();
+      String inputJson = objectMapper.writeValueAsString(createArtifacts);
+
+      assertEquals(jsonFileString, inputJson);
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointJsonPojoTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointJsonPojoTest.java
new file mode 100644
index 0000000..ca8a5a0
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointJsonPojoTest.java
@@ -0,0 +1,60 @@
+/*********************************************************************
+ * 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.osee.ote.core.framework.outfile;
+
+import static org.junit.Assert.assertEquals;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import org.junit.Test;
+
+/**
+ * @author Andy Jury
+ */
+public class TestRunTransactionEndpointJsonPojoTest {
+
+   @Test
+   public void testTestRunTransactionEndpointsJsonPojoTest() throws Exception {
+
+      String path = "data/testRunTransactionEndpoint.json";
+      String jsonFileString = new String(Files.readAllBytes(Paths.get(path)));
+
+      TestRunTransactionEndpointJsonPojo testRunTransactionEndpoint = new TestRunTransactionEndpointJsonPojo();
+
+      testRunTransactionEndpoint.setBranch("testRunBranch");
+      testRunTransactionEndpoint.setTxComment("Created by ScriptJsonOutLogHandler");
+
+      CreateArtifactsJsonPojo createArtifacts = new CreateArtifactsJsonPojo();
+      createArtifacts.setTypeName("TestRun");
+      createArtifacts.setScriptName("TBD");
+
+      AttributeJsonPojo attribute1 = new AttributeJsonPojo();
+      attribute1.setTypeName("Outfile URL");
+      attribute1.setValue("TBD");
+
+      AttributeJsonPojo attribute2 = new AttributeJsonPojo();
+      attribute2.setTypeName("ElapsedDate");
+      attribute2.setValue("0:08:15");
+
+      createArtifacts.addAttribute(attribute1);
+      createArtifacts.addAttribute(attribute2);
+
+      testRunTransactionEndpoint.setCreateArtifacts(createArtifacts);
+
+      ObjectMapper objectMapper = new ObjectMapper();
+      String inputJson = objectMapper.writeValueAsString(testRunTransactionEndpoint);
+
+      assertEquals(jsonFileString, inputJson);
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointPublisherTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointPublisherTest.java
new file mode 100644
index 0000000..0d6017b
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointPublisherTest.java
@@ -0,0 +1,111 @@
+/*********************************************************************
+ * 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.osee.ote.core.framework.outfile;
+
+import static org.junit.Assert.assertEquals;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import org.junit.Test;
+
+/**
+ * @author Andy Jury
+ */
+public class TestRunTransactionEndpointPublisherTest {
+
+   @Test
+   public void testTestRunTransactionEndpointPublisher() throws IOException {
+
+      String path = "data/testRunTransactionEndpointPublisher.json";
+      String jsonFileString = new String(Files.readAllBytes(Paths.get(path)));
+
+      TestRunTransactionEndpointJsonPojo testRunTransactionEndpoint = new TestRunTransactionEndpointJsonPojo();
+
+      testRunTransactionEndpoint.setBranch("ote_test_run_transaction_endpoint_HARDCODED");
+      testRunTransactionEndpoint.setTxComment("Created by TestRunTransactionEndpointPublisher");
+
+      CreateArtifactsJsonPojo createArtifacts = new CreateArtifactsJsonPojo();
+      createArtifacts.setTypeName("TestRun");
+      createArtifacts.setScriptName("org.eclipse.ote.simple.test.script.SimpleTestScript");
+
+      AttributeJsonPojo attribute1 = new AttributeJsonPojo();
+      attribute1.setTypeName("Elapsed Date");
+      attribute1.setValue("0:01:48");
+      createArtifacts.addAttribute(attribute1);
+
+      AttributeJsonPojo attribute2 = new AttributeJsonPojo();
+      attribute2.setTypeName("End Date");
+      attribute2.setValue("Thu May 19 16:58:44 MST 2022");
+      createArtifacts.addAttribute(attribute2);
+
+      AttributeJsonPojo attribute3 = new AttributeJsonPojo();
+      attribute3.setTypeName("Start Date");
+      attribute3.setValue("Thu May 19 16:56:55 MST 2022");
+      createArtifacts.addAttribute(attribute3);
+
+      AttributeJsonPojo attribute4 = new AttributeJsonPojo();
+      attribute4.setTypeName("Passed");
+      attribute4.setValue("1");
+      createArtifacts.addAttribute(attribute4);
+
+      AttributeJsonPojo attribute5 = new AttributeJsonPojo();
+      attribute5.setTypeName("Failed");
+      attribute5.setValue("0");
+      createArtifacts.addAttribute(attribute5);
+
+      AttributeJsonPojo attribute6 = new AttributeJsonPojo();
+      attribute6.setTypeName("Script Aborted");
+      attribute6.setValue("true");
+      createArtifacts.addAttribute(attribute6);
+
+      AttributeJsonPojo attribute7 = new AttributeJsonPojo();
+      attribute7.setTypeName("Total Test Points");
+      attribute7.setValue("1");
+      createArtifacts.addAttribute(attribute7);
+
+      AttributeJsonPojo attribute8 = new AttributeJsonPojo();
+      attribute8.setTypeName("OS Name");
+      attribute8.setValue("Windows 10");
+      createArtifacts.addAttribute(attribute8);
+
+      AttributeJsonPojo attribute9 = new AttributeJsonPojo();
+      attribute9.setTypeName("OS Architecture");
+      attribute9.setValue("amd64");
+      createArtifacts.addAttribute(attribute9);
+
+      AttributeJsonPojo attribute10 = new AttributeJsonPojo();
+      attribute10.setTypeName("OS Version");
+      attribute10.setValue("10.0");
+      createArtifacts.addAttribute(attribute10);
+
+      AttributeJsonPojo attribute11 = new AttributeJsonPojo();
+      attribute11.setTypeName("OSEE Version");
+      attribute11.setValue("1.0.0.v202202031707-DEV");
+      createArtifacts.addAttribute(attribute11);
+
+      AttributeJsonPojo attribute12 = new AttributeJsonPojo();
+      attribute12.setTypeName("OSEE Server Title");
+      attribute12.setValue("OTE_CI");
+      createArtifacts.addAttribute(attribute12);
+
+      testRunTransactionEndpoint.setCreateArtifacts(createArtifacts);
+
+      ObjectMapper objectMapper = new ObjectMapper();
+      String inputJson = objectMapper.writeValueAsString(testRunTransactionEndpoint);
+
+      assertEquals(jsonFileString, inputJson);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.core/META-INF/MANIFEST.MF
index 7985420..19183f3 100644
--- a/org.eclipse.osee.ote.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.osee.ote.core/META-INF/MANIFEST.MF
@@ -74,6 +74,7 @@
  com.fasterxml.jackson.databind;version="2.9.2",
  com.fasterxml.jackson.databind.jsontype;version="2.9.2",
  com.fasterxml.jackson.databind.module;version="2.9.2",
+ javax.ws.rs.client,
  javax.xml.parsers,
  org.apache.xml.serialize,
  org.eclipse.osee.framework.core.data,
diff --git a/org.eclipse.osee.ote.core/plugin.xml b/org.eclipse.osee.ote.core/plugin.xml
index 56d6721..d66628a 100644
--- a/org.eclipse.osee.ote.core/plugin.xml
+++ b/org.eclipse.osee.ote.core/plugin.xml
@@ -20,10 +20,10 @@
          point="org.eclipse.core.runtime.products">
       <product
             application="org.eclipse.osee.ote.core.server"
-            name="OteTestServer">
+            name="F18OteCiTestServer">
          <property
                name="appName"
-               value="OteTestServer">
+               value="F18OteCiTestServer">
          </property>
       </product>
    </extension>
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/AttributeJsonPojo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/AttributeJsonPojo.java
new file mode 100644
index 0000000..5032dff
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/AttributeJsonPojo.java
@@ -0,0 +1,40 @@
+/*********************************************************************
+ * 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.osee.ote.core.framework.outfile;
+
+/**
+ * @author Andy Jury
+ */
+public class AttributeJsonPojo {
+
+   private String typeName;
+   private String value;
+
+   public String getTypeName() {
+      return typeName;
+   }
+
+   public void setTypeName(String typeName) {
+      this.typeName = typeName;
+   }
+
+   public String getValue() {
+      return value;
+   }
+
+   public void setValue(String value) {
+      this.value = value;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/CreateArtifactsJsonPojo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/CreateArtifactsJsonPojo.java
new file mode 100644
index 0000000..214ea0b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/CreateArtifactsJsonPojo.java
@@ -0,0 +1,55 @@
+/*********************************************************************
+ * 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.osee.ote.core.framework.outfile;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.ArrayList;
+
+/**
+ * @author Andy Jury
+ */
+public class CreateArtifactsJsonPojo {
+
+   private String typeName;
+   private String scriptName;
+   private ArrayList<AttributeJsonPojo> attribute;
+
+   public String getTypeName() {
+      return typeName;
+   }
+
+   public void setTypeName(String typeName) {
+      this.typeName = typeName;
+   }
+
+   public String getScriptName() {
+      return scriptName;
+   }
+
+   public void setScriptName(String scriptName) {
+      this.scriptName = scriptName;
+   }
+
+   @JsonProperty("attribute")
+   public ArrayList<AttributeJsonPojo> getAttributes() {
+      return attribute;
+   }
+
+   public void addAttribute(AttributeJsonPojo attribute1) {
+      if (attribute == null) {
+         attribute = new ArrayList<AttributeJsonPojo>();
+      }
+      this.attribute.add(attribute1);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/MinimumPublisher.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/MinimumPublisher.java
new file mode 100644
index 0000000..52c59f9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/MinimumPublisher.java
@@ -0,0 +1,127 @@
+/*********************************************************************
+ * 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.osee.ote.core.framework.outfile;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.LogRecord;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.eclipse.osee.ote.core.framework.outfile.xml.TestPointResults;
+import org.eclipse.osee.ote.core.framework.outfile.xml.TimeSummary;
+import org.eclipse.osee.ote.core.log.record.ScriptResultRecord;
+import org.eclipse.osee.ote.core.log.record.TestPointRecord;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.core.testPoint.Operation;
+
+/**
+ * @author Andy Jury
+ */
+public class MinimumPublisher {
+
+   private final Map<String, Object> minimum;
+
+   public MinimumPublisher(Map<String, Object> minimum) {
+      this.minimum = minimum;
+   }
+
+   void publish(LogRecord logRecord) {
+      try {
+         minimum.put("machineName", InetAddress.getLocalHost().getHostName());
+      } catch (UnknownHostException ex) {
+         logError(ex, "Unable to determine machine name");
+      }
+      if (logRecord instanceof ScriptResultRecord) {
+         ScriptResultRecord srr = (ScriptResultRecord) logRecord;
+         minimum.put("ScriptName", logRecord.getMessage());
+         for (XmlizableStream rec : srr.getResults()) {
+            if (rec instanceof TimeSummary) {
+               TimeSummary ts = (TimeSummary) rec;
+               minimum.put("elapsedTime", ts.getElapsedTime());
+               minimum.put("startTime", ts.getStartTime());
+               minimum.put("endTime", ts.getEndTime());
+            } else if (rec instanceof TestPointResults) {
+               Map<String, Object> results = new HashMap<String, Object>();
+               results.put("passes", ((TestPointResults) rec).getPasses());
+               results.put("fails", ((TestPointResults) rec).getFails());
+               results.put("interactives", ((TestPointResults) rec).getInteractives());
+               results.put("aborted", ((TestPointResults) rec).isAborted());
+               results.put("total", ((TestPointResults) rec).getTotal());
+               minimum.put("results", results);
+            }
+         }
+      } else if (logRecord instanceof TestPointRecord) {
+         @SuppressWarnings("unchecked")
+         List<Object> testPoints = (List<Object>) minimum.get("testPoints");
+         if (testPoints == null) {
+            testPoints = new ArrayList<Object>();
+            minimum.put("testPoints", testPoints);
+         }
+         ITestPoint testPoint = ((TestPointRecord) logRecord).getTestPoint();
+         int number = ((TestPointRecord) logRecord).getNumber();
+         boolean overall = testPoint.isPass();
+         handleTestPoint(testPoint, testPoints, number, "", overall, String.valueOf(number));
+      }
+   }
+
+   private void handleTestPoint(ITestPoint testPoint, List<Object> testPoints, int number, String groupName, boolean overallPass, String levelNum) {
+      if (testPoint instanceof CheckPoint) {
+         Map<String, Object> point =
+            convertCheckPoint((CheckPoint) testPoint, number, groupName, overallPass, levelNum);
+         testPoints.add(point);
+      } else if (testPoint instanceof CheckGroup) {
+         CheckGroup group = (CheckGroup) testPoint;
+         ArrayList<ITestPoint> groupPoints = group.getTestPoints();
+         Operation op = group.getOperation();
+         String curGroupName = group.getGroupName() + " [" + op.getName() + "]";
+         for (int i = 0; i < groupPoints.size(); i++) {
+            ITestPoint tp = groupPoints.get(i);
+            handleTestPoint(tp, testPoints, number, curGroupName, overallPass, levelNum + "." + (i + 1));
+         }
+      }
+   }
+
+   private Map<String, Object> convertCheckPoint(CheckPoint checkPoint, int number, String groupName, boolean overallPass, String levelNum) {
+      Map<String, Object> tpMap = new HashMap<String, Object>();
+      tpMap.put("name", checkPoint.getTestPointName());
+      tpMap.put("expected", checkPoint.getExpected());
+      tpMap.put("actual", checkPoint.getActual());
+      tpMap.put("pass", checkPoint.isPass());
+      tpMap.put("isInteractive", checkPoint.isInteractive());
+      tpMap.put("number", number);
+      tpMap.put("overall", overallPass);
+      if (!groupName.isEmpty()) {
+         tpMap.put("groupName", groupName);
+      }
+      tpMap.put("tpLevel", levelNum);
+      return tpMap;
+   }
+
+   private void logError(final Exception ex, final String message) {
+      if (message != null && message.trim().length() > 0) {
+         System.err.println(message);
+      }
+      if (ex != null) {
+         ex.printStackTrace();
+      } else {
+         Throwable throwable = new Throwable();
+         throwable.printStackTrace();
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/ScriptJsonOutLogHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/ScriptJsonOutLogHandler.java
index 0001686..f0a696c 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/ScriptJsonOutLogHandler.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/ScriptJsonOutLogHandler.java
@@ -27,41 +27,34 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.logging.Handler;
 import java.util.logging.LogRecord;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
-import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
-import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
-import org.eclipse.osee.ote.core.framework.outfile.xml.TestPointResults;
-import org.eclipse.osee.ote.core.framework.outfile.xml.TimeSummary;
 import org.eclipse.osee.ote.core.log.record.ScriptResultRecord;
-import org.eclipse.osee.ote.core.log.record.TestPointRecord;
 import org.eclipse.osee.ote.core.log.record.json.LogRecordModule;
-import org.eclipse.osee.ote.core.testPoint.CheckGroup;
-import org.eclipse.osee.ote.core.testPoint.CheckPoint;
-import org.eclipse.osee.ote.core.testPoint.Operation;
 
 /**
  * @author Andy Jury
  */
 public class ScriptJsonOutLogHandler extends Handler {
    private final Map<String, Object> minimum = new HashMap<String, Object>();
+   private final MinimumPublisher minimumPublisher;
    private final ObjectMapper mapper = new ObjectMapper();
    private final File outfile;
    private ZipOutputStream zip;
    private final String distrStatement;
+   private final StringBuilder testRunTransactionEndpointJson = new StringBuilder();
+   private final TestRunTransactionEndpointPublisher testRunTransactionEndpointPublisher;
 
    public ScriptJsonOutLogHandler(final File outFile, final String distributionStatement) {
       super();
       outfile = outFile;
       distrStatement = distributionStatement;
+      this.minimumPublisher = new MinimumPublisher(minimum);
+      this.testRunTransactionEndpointPublisher = new TestRunTransactionEndpointPublisher();
    }
 
    public ScriptJsonOutLogHandler(File outFile) {
@@ -72,84 +65,16 @@
    public synchronized void publish(final LogRecord logRecord) {
       if (isLoggable(logRecord)) {
          try {
-            publisihMinimum(logRecord);
-         } catch (Exception ex) {
-            logError(ex);
-         }
-      }
-   }
-
-   private void publisihMinimum(LogRecord logRecord) {
-      try {
-         minimum.put("machineName", InetAddress.getLocalHost().getHostName());
-      } catch (UnknownHostException ex) {
-         logError(ex, "Unable to determine machine name");
-      }
-      if (logRecord instanceof ScriptResultRecord) {
-         ScriptResultRecord srr = (ScriptResultRecord) logRecord;
-         minimum.put("ScriptName", logRecord.getMessage());
-         for (XmlizableStream rec : srr.getResults()) {
-            if (rec instanceof TimeSummary) {
-               TimeSummary ts = (TimeSummary) rec;
-               minimum.put("elapsedTime", ts.getElapsedTime());
-               minimum.put("startTime", ts.getStartTime());
-               minimum.put("endTime", ts.getEndTime());
-            } else if (rec instanceof TestPointResults) {
-               Map<String, Object> results = new HashMap<String, Object>();
-               results.put("passes", ((TestPointResults) rec).getPasses());
-               results.put("fails", ((TestPointResults) rec).getFails());
-               results.put("interactives", ((TestPointResults) rec).getInteractives());
-               results.put("aborted", ((TestPointResults) rec).isAborted());
-               results.put("total", ((TestPointResults) rec).getTotal());
-               minimum.put("results", results);
+            minimumPublisher.publish(logRecord);
+            if (logRecord instanceof ScriptResultRecord) {
+               testRunTransactionEndpointJson.append(testRunTransactionEndpointPublisher.publish(logRecord));
             }
-         }
-      } else if (logRecord instanceof TestPointRecord) {
-         @SuppressWarnings("unchecked")
-         List<Object> testPoints = (List<Object>) minimum.get("testPoints");
-         if (testPoints == null) {
-            testPoints = new ArrayList<Object>();
-            minimum.put("testPoints", testPoints);
-         }
-         ITestPoint testPoint = ((TestPointRecord) logRecord).getTestPoint();
-         int number = ((TestPointRecord) logRecord).getNumber();
-         boolean overall = testPoint.isPass();
-         handleTestPoint(testPoint, testPoints, number, "", overall, String.valueOf(number));
-      }
-   }
-
-   private void handleTestPoint(ITestPoint testPoint, List<Object> testPoints, int number, String groupName, boolean overallPass, String levelNum) {
-      if (testPoint instanceof CheckPoint) {
-         Map<String, Object> point = convertCheckPoint((CheckPoint) testPoint, number, groupName, overallPass, levelNum);
-         testPoints.add(point);
-      } else if (testPoint instanceof CheckGroup) {
-         CheckGroup group = (CheckGroup) testPoint;
-         ArrayList<ITestPoint> groupPoints = group.getTestPoints();
-         Operation op = group.getOperation();
-         String curGroupName = group.getGroupName() + " [" + op.getName() + "]";
-         for (int i = 0; i < groupPoints.size(); i++) {
-            ITestPoint tp = groupPoints.get(i);
-            handleTestPoint(tp, testPoints, number, curGroupName, overallPass, levelNum + "." + (i + 1));
+         } catch (Exception ex) {
+            logError(ex, "Exception publishing items from outfile to json entries!");
          }
       }
    }
 
-   private Map<String, Object> convertCheckPoint(CheckPoint checkPoint, int number, String groupName, boolean overallPass, String levelNum) {
-      Map<String, Object> tpMap = new HashMap<String, Object>();
-      tpMap.put("name", checkPoint.getTestPointName());
-      tpMap.put("expected", checkPoint.getExpected());
-      tpMap.put("actual", checkPoint.getActual());
-      tpMap.put("pass", checkPoint.isPass());
-      tpMap.put("isInteractive", checkPoint.isInteractive());
-      tpMap.put("number", number);
-      tpMap.put("overall", overallPass);
-      if (!groupName.isEmpty()) {
-         tpMap.put("groupName", groupName);
-      }
-      tpMap.put("tpLevel", levelNum);
-      return tpMap;
-   }
-
    private boolean prepareToFlush() {
       setupJson();
       return setupOutputFile();
@@ -187,7 +112,7 @@
             result = false;
          }
       } catch (IOException ex) {
-         logError(ex, "Failed to get canaonical path from outFile");
+         logError(ex, "Failed to get canonical path from outFile");
          result = false;
       }
       return result;
@@ -197,6 +122,19 @@
       if (prepareToFlush()) {
          writeZipEntry("Minimum", minimum);
          writeZipEntry("DistributionStatement", distrStatement);
+         writeZipEntrySB("TestRunTransactionEndpoint", testRunTransactionEndpointJson);
+      }
+   }
+
+   private void writeZipEntrySB(String basename, StringBuilder testRunTransactionEndpointJson2) {
+      try {
+         ZipEntry entry = new ZipEntry(basename + ".json");
+         zip.putNextEntry(entry);
+
+         byte[] data = testRunTransactionEndpointJson2.toString().getBytes();
+         zip.write(data, 0, data.length);
+      } catch (IOException ex) {
+         logError(ex, "Exception generating zip archive with json files in it!");
       }
    }
 
@@ -215,11 +153,11 @@
          input.close();
          temp.delete();
       } catch (JsonGenerationException ex) {
-         logError(ex);
+         logError(ex, "Exception generating json!");
       } catch (JsonMappingException ex) {
-         logError(ex);
+         logError(ex, "Exception mapping json!");
       } catch (IOException ex) {
-         logError(ex);
+         logError(ex, "Exception generating zip archive with json files in it!");
       }
    }
 
@@ -228,7 +166,7 @@
       try {
          zip.close();
       } catch (Exception ex) {
-         logError(ex);
+         logError(ex, "Exception closing zip archive!");
       }
    }
 
@@ -237,10 +175,6 @@
       // don't call this method
    }
 
-   private void logError(final Exception ex) {
-      logError(ex);
-   }
-
    private void logError(final Exception ex, final String message) {
       if (message != null && message.trim().length() > 0) {
          System.err.println(message);
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointJsonPojo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointJsonPojo.java
new file mode 100644
index 0000000..131616f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointJsonPojo.java
@@ -0,0 +1,49 @@
+/*********************************************************************
+ * 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.osee.ote.core.framework.outfile;
+
+/**
+ * @author Andy Jury
+ */
+public class TestRunTransactionEndpointJsonPojo {
+
+   private String branch;
+   private String txComment;
+
+   private CreateArtifactsJsonPojo createArtifacts;
+
+   public String getBranch() {
+      return branch;
+   }
+
+   public void setBranch(String branch) {
+      this.branch = branch;
+   }
+
+   public String getTxComment() {
+      return txComment;
+   }
+
+   public void setTxComment(String txComment) {
+      this.txComment = txComment;
+   }
+
+   public CreateArtifactsJsonPojo getCreateArtifacts() {
+      return createArtifacts;
+   }
+
+   public void setCreateArtifacts(CreateArtifactsJsonPojo createArtifacts) {
+      this.createArtifacts = createArtifacts;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointPublisher.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointPublisher.java
new file mode 100644
index 0000000..8737bc5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/TestRunTransactionEndpointPublisher.java
@@ -0,0 +1,86 @@
+/*********************************************************************
+ * 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.osee.ote.core.framework.outfile;
+
+import java.util.logging.LogRecord;
+import org.eclipse.osee.framework.core.util.JsonUtil;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.framework.outfile.xml.SystemInfo;
+import org.eclipse.osee.ote.core.framework.outfile.xml.TestPointResults;
+import org.eclipse.osee.ote.core.framework.outfile.xml.TimeSummary;
+import org.eclipse.osee.ote.core.log.record.ScriptResultRecord;
+
+/**
+ * @author Andy Jury
+ */
+public class TestRunTransactionEndpointPublisher {
+
+   private final TestRunTransactionEndpointJsonPojo testRunTransactionEndpointJsonPojo =
+      new TestRunTransactionEndpointJsonPojo();
+   private String testRunTransactionEndpointJson = new String();
+   private final String branchName = "ote_test_run_transaction_endpoint_HARDCODED"; //This should be connected to user supplied branch in future
+   private final CreateArtifactsJsonPojo createArtifacts = new CreateArtifactsJsonPojo();
+
+   public String publish(LogRecord logRecord) {
+
+      testRunTransactionEndpointJsonPojo.setBranch(branchName);
+      testRunTransactionEndpointJsonPojo.setTxComment("Created by TestRunTransactionEndpointPublisher");
+
+      createArtifacts.setTypeName("TestRun");
+
+      if (logRecord instanceof ScriptResultRecord) {
+         ScriptResultRecord srr = (ScriptResultRecord) logRecord;
+         createArtifacts.setScriptName(logRecord.getMessage());
+         AttributeJsonPojo attribute = new AttributeJsonPojo();
+
+         for (XmlizableStream rec : srr.getResults()) {
+            if (rec instanceof TimeSummary) {
+               TimeSummary timeSummary = (TimeSummary) rec;
+               addAttributeToCreateArtifacts("Elapsed Date", timeSummary.getElapsed());
+               addAttributeToCreateArtifacts("End Date", timeSummary.getEndTime().toString());
+               addAttributeToCreateArtifacts("Start Date", timeSummary.getStartTime().toString());
+            } else if (rec instanceof TestPointResults) {
+               TestPointResults testPointResults = (TestPointResults) rec;
+
+               addAttributeToCreateArtifacts("Passed", Integer.toString(testPointResults.getPasses()));
+               addAttributeToCreateArtifacts("Failed", Integer.toString(testPointResults.getFails()));
+               addAttributeToCreateArtifacts("Script Aborted", Boolean.toString(testPointResults.isAborted()));
+               addAttributeToCreateArtifacts("Total Test Points", Integer.toString(testPointResults.getTotal()));
+            } else if (rec instanceof SystemInfo) {
+               SystemInfo systemInfo = (SystemInfo) rec;
+
+               addAttributeToCreateArtifacts("OS Name", (systemInfo.getOperatingSystemName()));
+               addAttributeToCreateArtifacts("OS Architecture", (systemInfo.getOperatingSystemArchitecture()));
+               addAttributeToCreateArtifacts("OS Version", (systemInfo.getOperatingSystemVersion()));
+               addAttributeToCreateArtifacts("OSEE Version", (systemInfo.getOseeCodeVersion()));
+               addAttributeToCreateArtifacts("OSEE Server Title", (systemInfo.getOteServerTitle()));
+            }
+
+         }
+      }
+
+      testRunTransactionEndpointJsonPojo.setCreateArtifacts(createArtifacts);
+
+      testRunTransactionEndpointJson = JsonUtil.toJson(testRunTransactionEndpointJsonPojo);
+      return testRunTransactionEndpointJson;
+   }
+
+   private void addAttributeToCreateArtifacts(String typeName, String value) {
+      AttributeJsonPojo attribute = new AttributeJsonPojo();
+      attribute.setTypeName(typeName);
+      attribute.setValue(value);
+      createArtifacts.addAttribute(attribute);
+
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/xml/SystemInfo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/xml/SystemInfo.java
index d21bec9..4f5cef5 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/xml/SystemInfo.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/outfile/xml/SystemInfo.java
@@ -13,10 +13,9 @@
 
 package org.eclipse.osee.ote.core.framework.outfile.xml;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
 import org.eclipse.osee.framework.core.data.OseeCodeVersion;
 import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
 import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
@@ -59,7 +58,7 @@
    }
 
    @JsonProperty
-   public String getOperatingSystem() {
+   public String getOperatingSystemName() {
       return System.getProperty("os.name");
    }
 
@@ -69,7 +68,7 @@
    }
 
    @JsonProperty
-   public String getArchitecture() {
+   public String getOperatingSystemArchitecture() {
       return System.getProperty("os.arch");
    }
 
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java
index c1a8cf5..dfeba15 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java
@@ -58,7 +58,7 @@
    /**
     * ScriptLogHandler Constructor. Sets the outfile to log to and the test script that will be logged. It also
     * establishes the xml format to be used.
-    * 
+    *
     * @param outFile Reference to the outfile that will be used to output the log.
     */
    public ScriptLogHandler(File outFile, TestEnvironment testEnvironment) {
@@ -74,13 +74,12 @@
          OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
       }
 
-      ProcessingInstruction processingInstruction =
-         document.createProcessingInstruction("xml-stylesheet",
-            "type=\"text/xsl\" href=\"" + getXSLTransformName() + "\"");
+      ProcessingInstruction processingInstruction = document.createProcessingInstruction("xml-stylesheet",
+         "type=\"text/xsl\" href=\"" + getXSLTransformName() + "\"");
       document.appendChild(processingInstruction);
       records = new ArrayList<>();
 
-      document.appendChild(document.createComment("OUTFILE_COMMNET"));
+      document.appendChild(document.createComment("OUTFILE_COMMENT"));
 
       this.testScriptElement = document.createElement("TestScript");
       this.scriptInitElement = document.createElement("ScriptInit");
