feature[TW19358]: ICD - Create Node API

- Creates /nodes and /connections endpoints
- Creates /graph endpoint
- Updates message endpoint(s) to be connections/{connectionId}/messages

Change-Id: I53360f099dbe1cbc3a8645b30feb600f7ff967b2
Signed-off-by: Luciano T Vaglienti <luciano.t.vaglienti@boeing.com>
diff --git a/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/CoreArtifactTypes.java b/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/CoreArtifactTypes.java
index 40958a1..7c57cde 100644
--- a/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/CoreArtifactTypes.java
+++ b/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/CoreArtifactTypes.java
@@ -216,7 +216,8 @@
    ArtifactTypeToken DirectSoftwareRequirement = osee.add(osee.artifactType(22L, "Direct Software Requirement", true, AbstractSoftwareRequirement));
    ArtifactTypeToken HardwareRequirementMsWord = osee.add(osee.artifactType(33L, "Hardware Requirement - MS Word", false, MsWordTemplate, AbstractSpecRequirement));
    ArtifactTypeToken InterfaceNode = osee.add(osee.artifactType(6039606571486514295L, "Interface Node", false, Artifact));
-   ArtifactTypeToken InterfaceConnection = osee.add(osee.artifactType(126164394421696910L, "Interface Connection", false, Artifact));
+   ArtifactTypeToken InterfaceConnection = osee.add(osee.artifactType(126164394421696910L, "Interface Connection", false, Artifact)
+      .exactlyOne(InterfaceTransportType));
    ArtifactTypeToken InterfaceMessage = osee.add(osee.artifactType(2455059983007225775L, "Interface Message", false, Artifact)
       .exactlyOne(InterfaceMessageNumber)
       .exactlyOne(InterfaceMessagePeriodicity)
diff --git a/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/CoreAttributeTypes.java b/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/CoreAttributeTypes.java
index 153ce23..cbcc996 100644
--- a/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/CoreAttributeTypes.java
+++ b/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/CoreAttributeTypes.java
@@ -150,6 +150,7 @@
    AttributeTypeString InterfacePlatformTypeBitsResolution = osee.createString(3899709087455064786L, "Interface Platform Type Bits Resolution", MediaType.TEXT_PLAIN, "");
    AttributeTypeString InterfacePlatformTypeCompRate = osee.createString(3899709087455064787L, "Interface Platform Type Comp Rate", MediaType.TEXT_PLAIN, "");
    AttributeTypeString InterfacePlatformTypeAnalogAccuracy = osee.createString(3899709087455064788L, "Interface Platform Type Analog Accuracy", MediaType.TEXT_PLAIN, "");
+   AttributeTypeString InterfaceTransportType = osee.createString(4522496963078776538L, "Interface Transport Type", MediaType.TEXT_PLAIN, "Transport Type of Interface Connection");
    AttributeTypeInputStream ImageContent = osee.createInputStreamNoTag(1152921504606847868L, "Image Content", AttributeTypeToken.IMAGE, "Binary Image content");
    AttributeTypeString JavaCode = osee.createString(1253931606616948117L, "Java Code", MediaType.TEXT_PLAIN, "code that can be compiled into java");
    LegacyDalAttributeType LegacyDal = osee.createEnum(new LegacyDalAttributeType());
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceConnectionEndpoint.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceConnectionEndpoint.java
new file mode 100644
index 0000000..27bec8d
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceConnectionEndpoint.java
@@ -0,0 +1,99 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim;
+
+import java.util.Collection;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PATCH;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.eclipse.osee.framework.core.data.ArtifactId;
+import org.eclipse.osee.framework.jdk.core.result.XResultData;
+import org.eclipse.osee.mim.types.InterfaceConnection;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+@Path("connections")
+public interface InterfaceConnectionEndpoint {
+
+   @GET()
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Gets all connections
+    *
+    * @return all connections
+    */
+   Collection<InterfaceConnection> getAllConnections();
+
+   @POST()
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Creates a new Connection
+    *
+    * @param ConnectionToCreate Connection to insert into db
+    * @return results of operation
+    */
+   XResultData createNewConnection(InterfaceConnection ConnectionToCreate);
+
+   @PUT()
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Replaces a Connection with a Connection, requires matching id
+    *
+    * @param ConnectionToUpdate Connection to replace with
+    * @return results of operation
+    */
+   XResultData updateConnection(InterfaceConnection ConnectionToUpdate);
+
+   @PATCH()
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Updates the contents of a Connection, requires matching id
+    *
+    * @param ConnectionToUpdate Connection contents to update
+    * @return results of operation
+    */
+   XResultData patchConnection(InterfaceConnection ConnectionToPatch);
+
+   @GET()
+   @Path("{id}")
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Fetches a specific Connection
+    *
+    * @param ConnectionId id of Connection to fetch
+    * @return Connection
+    */
+   InterfaceConnection getConnection(@PathParam("id") ArtifactId ConnectionId);
+
+   @DELETE()
+   @Path("{id}")
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Deletes an interface Connection
+    *
+    * @param ConnectionId id of Connection to remove
+    * @return result of operation
+    */
+   XResultData deleteConnection(@PathParam("id") ArtifactId ConnectionId);
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceConnectionModificationEndpoint.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceConnectionModificationEndpoint.java
new file mode 100644
index 0000000..2901a27
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceConnectionModificationEndpoint.java
@@ -0,0 +1,68 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.PATCH;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.eclipse.osee.framework.core.data.ArtifactId;
+import org.eclipse.osee.framework.jdk.core.result.XResultData;
+import org.eclipse.osee.mim.types.InterfaceConnection;
+
+/**
+ * @author Luciano T. Vaglienti This endpoint handles creation/deletion of connections with their related nodes.
+ */
+@Path("connections")
+public interface InterfaceConnectionModificationEndpoint {
+
+   @POST()
+   @Path("{type}")
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Creates a new Connection
+    *
+    * @param ConnectionToCreate Connection to insert into db
+    * @param type type of connection primary/secondary
+    * @return results of operation
+    */
+   XResultData createNewConnection(InterfaceConnection ConnectionToCreate, @PathParam("type") String type);
+
+   @PATCH()
+   @Path("{id}/{type}")
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Relates a connection to another node
+    * 
+    * @param connectionId connection to relate
+    * @param type type of relation i.e. primary/secondary
+    * @return results of operation
+    */
+   XResultData relateConnection(@PathParam("id") ArtifactId connectionId, @PathParam("type") String type);
+
+   @DELETE()
+   @Path("{id}")
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Deletes an interface Connection
+    *
+    * @param ConnectionId id of Connection to remove
+    * @return result of operation
+    */
+   XResultData deleteConnection(@PathParam("id") ArtifactId ConnectionId);
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceConnectionViewApi.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceConnectionViewApi.java
new file mode 100644
index 0000000..378ef2e
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceConnectionViewApi.java
@@ -0,0 +1,24 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim;
+
+import org.eclipse.osee.mim.types.InterfaceConnection;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public interface InterfaceConnectionViewApi {
+   ArtifactAccessor<InterfaceConnection> getAccessor();
+
+   ArtifactInserter<InterfaceConnection> getInserter();
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceGraphEndpoint.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceGraphEndpoint.java
new file mode 100644
index 0000000..bfb9623
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceGraphEndpoint.java
@@ -0,0 +1,36 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.eclipse.osee.mim.types.GraphView;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+@Path("graph")
+public interface InterfaceGraphEndpoint {
+
+   @GET()
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Gets all nodes and edges in two lists
+    *
+    * @return graph of all nodes/edges
+    */
+   GraphView getAllNodesAndEdges();
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceNodeEndpoint.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceNodeEndpoint.java
new file mode 100644
index 0000000..30c9b2c
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceNodeEndpoint.java
@@ -0,0 +1,99 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim;
+
+import java.util.Collection;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PATCH;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.eclipse.osee.framework.core.data.ArtifactId;
+import org.eclipse.osee.framework.jdk.core.result.XResultData;
+import org.eclipse.osee.mim.types.InterfaceNode;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+@Path("nodes")
+public interface InterfaceNodeEndpoint {
+
+   @GET()
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Gets all nodes
+    *
+    * @return all nodes
+    */
+   Collection<InterfaceNode> getAllNodes();
+
+   @POST()
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Creates a new node
+    *
+    * @param nodeToCreate node to insert into db
+    * @return results of operation
+    */
+   XResultData createNewNode(InterfaceNode nodeToCreate);
+
+   @PUT()
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Replaces a node with a node, requires matching id
+    *
+    * @param nodeToUpdate node to replace with
+    * @return results of operation
+    */
+   XResultData updateNode(InterfaceNode nodeToUpdate);
+
+   @PATCH()
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Updates the contents of a node, requires matching id
+    *
+    * @param nodeToUpdate node contents to update
+    * @return results of operation
+    */
+   XResultData patchNode(InterfaceNode nodeToPatch);
+
+   @GET()
+   @Path("{id}")
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Fetches a specific node
+    * 
+    * @param nodeId id of node to fetch
+    * @return node
+    */
+   InterfaceNode getNode(@PathParam("id") ArtifactId nodeId);
+
+   @DELETE()
+   @Path("{id}")
+   @Produces(MediaType.APPLICATION_JSON)
+   /**
+    * Deletes an interface node
+    * 
+    * @param nodeId id of node to remove
+    * @return result of operation
+    */
+   XResultData deleteNode(@PathParam("id") ArtifactId nodeId);
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceNodeViewApi.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceNodeViewApi.java
new file mode 100644
index 0000000..3bc28d0
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/InterfaceNodeViewApi.java
@@ -0,0 +1,24 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim;
+
+import org.eclipse.osee.mim.types.InterfaceNode;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public interface InterfaceNodeViewApi {
+   ArtifactAccessor<InterfaceNode> getAccessor();
+
+   ArtifactInserter<InterfaceNode> getInserter();
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/MimApi.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/MimApi.java
index 05f4b39..1b2f354 100644
--- a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/MimApi.java
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/MimApi.java
@@ -35,5 +35,9 @@
 
    InterfacePlatformTypeApi getInterfacePlatformTypeApi();
 
+   InterfaceNodeViewApi getInterfaceNodeViewApi();
+
+   InterfaceConnectionViewApi getInterfaceConnectionViewApi();
+
    ConcurrentHashMap<Long, ? extends InterfaceLogicalTypeGeneric> getLogicalTypes();
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/ArtifactInserterImpl.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/ArtifactInserterImpl.java
index 66c73d5..fb6583c 100644
--- a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/ArtifactInserterImpl.java
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/ArtifactInserterImpl.java
@@ -259,7 +259,7 @@
       } catch (Exception ex) {
          results.error(Lib.exceptionToString(ex));
       }
-      return null;
+      return results;
    }
 
    private boolean replaceExistingArtifact(T newArtifact, BranchId branch, TransactionBuilder tx, XResultData results) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/BranchAccessor.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/BranchAccessor.java
index 139446d..8446645 100644
--- a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/BranchAccessor.java
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/BranchAccessor.java
@@ -22,10 +22,14 @@
 import org.eclipse.osee.framework.core.data.ArtifactId;
 import org.eclipse.osee.framework.core.data.BranchId;
 import org.eclipse.osee.framework.core.data.UserId;
+import org.eclipse.osee.mim.InterfaceConnectionEndpoint;
+import org.eclipse.osee.mim.InterfaceConnectionModificationEndpoint;
 import org.eclipse.osee.mim.InterfaceElementEndpoint;
 import org.eclipse.osee.mim.InterfaceElementSearchEndpoint;
+import org.eclipse.osee.mim.InterfaceGraphEndpoint;
 import org.eclipse.osee.mim.InterfaceMessageEndpoint;
 import org.eclipse.osee.mim.InterfaceMessageFilterEndpoint;
+import org.eclipse.osee.mim.InterfaceNodeEndpoint;
 import org.eclipse.osee.mim.InterfaceStructureEndpoint;
 import org.eclipse.osee.mim.InterfaceStructureFilterEndpoint;
 import org.eclipse.osee.mim.InterfaceStructureSearchEndpoint;
@@ -57,45 +61,45 @@
       return new PlatformTypesFilterEndpointImpl(branch, accountId, mimApi.getInterfacePlatformTypeApi());
    }
 
-   @Path("{branch}/messages")
+   @Path("{branch}/connections/{connectionId}/messages")
    @Produces(MediaType.APPLICATION_JSON)
-   public InterfaceMessageEndpoint getMessageEndpoint(@PathParam("branch") BranchId branch, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
-      return new InterfaceMessageEndpointImpl(branch, accountId, mimApi.getInterfaceMessageApi(),
+   public InterfaceMessageEndpoint getMessageEndpoint(@PathParam("branch") BranchId branch, @PathParam("connectionId") ArtifactId connectionId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
+      return new InterfaceMessageEndpointImpl(branch, connectionId, accountId, mimApi.getInterfaceMessageApi(),
          mimApi.getInterfaceSubMessageApi());
    }
 
-   @Path("{branch}/messages/filter")
+   @Path("{branch}/connections/{connectionId}/messages/filter")
    @Produces(MediaType.APPLICATION_JSON)
-   public InterfaceMessageFilterEndpoint getMessageFilterEndpoint(@PathParam("branch") BranchId branch, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
-      return new InterfaceMessageFilterEndpointImpl(branch, accountId, mimApi.getInterfaceMessageApi(),
+   public InterfaceMessageFilterEndpoint getMessageFilterEndpoint(@PathParam("branch") BranchId branch, @PathParam("connectionId") ArtifactId connectionId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
+      return new InterfaceMessageFilterEndpointImpl(branch, connectionId, accountId, mimApi.getInterfaceMessageApi(),
          mimApi.getInterfaceSubMessageApi());
    }
 
-   @Path("{branch}/messages/{messageId}/submessages")
+   @Path("{branch}/connections/{connectionId}/messages/{messageId}/submessages")
    @Produces(MediaType.APPLICATION_JSON)
-   public InterfaceSubMessageEndpoint getSubMessageEndpoint(@PathParam("branch") BranchId branch, @PathParam("messageId") ArtifactId messageId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
+   public InterfaceSubMessageEndpoint getSubMessageEndpoint(@PathParam("branch") BranchId branch, @PathParam("connectionId") ArtifactId connectionId, @PathParam("messageId") ArtifactId messageId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
       return new InterfaceSubMessageEndpointImpl(branch, accountId, messageId, mimApi.getInterfaceSubMessageApi());
    }
 
-   @Path("{branch}/messages/{messageId}/submessages/{submessageId}/structures")
+   @Path("{branch}/connections/{connectionId}/messages/{messageId}/submessages/{submessageId}/structures")
    @Produces(MediaType.APPLICATION_JSON)
-   public InterfaceStructureEndpoint getStructureEndpoint(@PathParam("branch") BranchId branch, @PathParam("messageId") ArtifactId messageId, @PathParam("submessageId") ArtifactId subMessageId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
+   public InterfaceStructureEndpoint getStructureEndpoint(@PathParam("branch") BranchId branch, @PathParam("connectionId") ArtifactId connectionId, @PathParam("messageId") ArtifactId messageId, @PathParam("submessageId") ArtifactId subMessageId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
       return new InterfaceStructureEndpointImpl(branch, accountId, messageId, subMessageId,
          mimApi.getInterfaceStructureApi(), mimApi.getInterfaceElementApi(), mimApi.getInterfaceElementArrayApi(),
          mimApi.getInterfacePlatformTypeApi());
    }
 
-   @Path("{branch}/messages/{messageId}/submessages/{submessageId}/structures/filter")
+   @Path("{branch}/connections/{connectionId}/messages/{messageId}/submessages/{submessageId}/structures/filter")
    @Produces(MediaType.APPLICATION_JSON)
-   public InterfaceStructureFilterEndpoint getStructureFilterEndpoint(@PathParam("branch") BranchId branch, @PathParam("messageId") ArtifactId messageId, @PathParam("submessageId") ArtifactId subMessageId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
+   public InterfaceStructureFilterEndpoint getStructureFilterEndpoint(@PathParam("branch") BranchId branch, @PathParam("connectionId") ArtifactId connectionId, @PathParam("messageId") ArtifactId messageId, @PathParam("submessageId") ArtifactId subMessageId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
       return new InterfaceStructureFilterEndpointImpl(branch, accountId, messageId, subMessageId,
          mimApi.getInterfaceStructureApi(), mimApi.getInterfaceElementApi(), mimApi.getInterfaceElementArrayApi(),
          mimApi.getInterfacePlatformTypeApi());
    }
 
-   @Path("{branch}/messages/{messageId}/submessages/{submessageId}/structures/{structureId}/elements")
+   @Path("{branch}/connections/{connectionId}/messages/{messageId}/submessages/{submessageId}/structures/{structureId}/elements")
    @Produces(MediaType.APPLICATION_JSON)
-   public InterfaceElementEndpoint getElementEndpoint(@PathParam("branch") BranchId branch, @PathParam("messageId") ArtifactId messageId, @PathParam("submessageId") ArtifactId subMessageId, @PathParam("structureId") ArtifactId structureId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
+   public InterfaceElementEndpoint getElementEndpoint(@PathParam("branch") BranchId branch, @PathParam("connectionId") ArtifactId connectionId, @PathParam("messageId") ArtifactId messageId, @PathParam("submessageId") ArtifactId subMessageId, @PathParam("structureId") ArtifactId structureId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
       return new InterfaceElementEndpointImpl(branch, accountId, messageId, subMessageId, structureId,
          mimApi.getInterfaceElementApi(), mimApi.getInterfaceElementArrayApi(), mimApi.getInterfacePlatformTypeApi());
    }
@@ -113,4 +117,32 @@
       return new InterfaceStructureSearchEndpointImpl(branch, accountId, mimApi.getInterfaceStructureApi(),
          mimApi.getInterfaceElementApi(), mimApi.getInterfaceElementArrayApi(), mimApi.getInterfacePlatformTypeApi());
    }
+
+   @Path("{branch}/graph")
+   @Produces(MediaType.APPLICATION_JSON)
+   public InterfaceGraphEndpoint getGraphEndpoint(@PathParam("branch") BranchId branch, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
+      return new InterfaceGraphEndpointImpl(branch, accountId, mimApi.getInterfaceNodeViewApi(),
+         mimApi.getInterfaceConnectionViewApi());
+   }
+
+   @Path("{branch}/nodes")
+   @Produces(MediaType.APPLICATION_JSON)
+   public InterfaceNodeEndpoint getNodeEndpoint(@PathParam("branch") BranchId branch, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
+      return new InterfaceNodeEndpointImpl(branch, accountId, mimApi.getInterfaceNodeViewApi(),
+         mimApi.getInterfaceConnectionViewApi());
+   }
+
+   @Path("{branch}/connections")
+   @Produces(MediaType.APPLICATION_JSON)
+   public InterfaceConnectionEndpoint getConnectionEndpoint(@PathParam("branch") BranchId branch, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
+      return new InterfaceConnectionEndpointImpl(branch, accountId, mimApi.getInterfaceNodeViewApi(),
+         mimApi.getInterfaceConnectionViewApi());
+   }
+
+   @Path("{branch}/nodes/{nodeId}/connections")
+   @Produces(MediaType.APPLICATION_JSON)
+   public InterfaceConnectionModificationEndpoint getConnectionModificationEndpoint(@PathParam("branch") BranchId branch, @PathParam("nodeId") ArtifactId nodeId, @HeaderParam(OSEE_ACCOUNT_ID) UserId accountId) {
+      return new InterfaceConnectionModificationEndpointImpl(branch, accountId, nodeId,
+         mimApi.getInterfaceNodeViewApi(), mimApi.getInterfaceConnectionViewApi());
+   }
 }
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionAccessor.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionAccessor.java
new file mode 100644
index 0000000..f10d259
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionAccessor.java
@@ -0,0 +1,28 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.internal;
+
+import org.eclipse.osee.framework.core.enums.CoreArtifactTypes;
+import org.eclipse.osee.mim.types.InterfaceConnection;
+import org.eclipse.osee.orcs.OrcsApi;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceConnectionAccessor extends ArtifactAccessorImpl<InterfaceConnection> {
+
+   public InterfaceConnectionAccessor(OrcsApi orcsApi) {
+      super(CoreArtifactTypes.InterfaceConnection, orcsApi);
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionEndpointImpl.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionEndpointImpl.java
new file mode 100644
index 0000000..89df798
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionEndpointImpl.java
@@ -0,0 +1,85 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import org.eclipse.osee.framework.core.data.ArtifactId;
+import org.eclipse.osee.framework.core.data.BranchId;
+import org.eclipse.osee.framework.core.data.UserId;
+import org.eclipse.osee.framework.jdk.core.result.XResultData;
+import org.eclipse.osee.mim.InterfaceConnectionEndpoint;
+import org.eclipse.osee.mim.InterfaceConnectionViewApi;
+import org.eclipse.osee.mim.InterfaceNodeViewApi;
+import org.eclipse.osee.mim.types.InterfaceConnection;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceConnectionEndpointImpl implements InterfaceConnectionEndpoint {
+
+   private final BranchId branch;
+   private final UserId account;
+   private final InterfaceNodeViewApi interfaceNodeApi;
+   private final InterfaceConnectionViewApi interfaceConnectionApi;
+
+   public InterfaceConnectionEndpointImpl(BranchId branch, UserId account, InterfaceNodeViewApi interfaceNodeApi, InterfaceConnectionViewApi interfaceConnectionViewApi) {
+      this.account = account;
+      this.branch = branch;
+      this.interfaceNodeApi = interfaceNodeApi;
+      this.interfaceConnectionApi = interfaceConnectionViewApi;
+   }
+
+   @Override
+   public Collection<InterfaceConnection> getAllConnections() {
+      try {
+         return interfaceConnectionApi.getAccessor().getAll(branch, InterfaceConnection.class);
+      } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+         | NoSuchMethodException | SecurityException ex) {
+         System.out.println(ex);
+      }
+      return null;
+   }
+
+   @Override
+   public XResultData createNewConnection(InterfaceConnection ConnectionToCreate) {
+      return interfaceConnectionApi.getInserter().addArtifact(ConnectionToCreate, account, branch);
+   }
+
+   @Override
+   public XResultData updateConnection(InterfaceConnection ConnectionToUpdate) {
+      return interfaceConnectionApi.getInserter().replaceArtifact(ConnectionToUpdate, account, branch);
+   }
+
+   @Override
+   public XResultData patchConnection(InterfaceConnection ConnectionToPatch) {
+      return interfaceConnectionApi.getInserter().patchArtifact(ConnectionToPatch, account, branch);
+   }
+
+   @Override
+   public InterfaceConnection getConnection(ArtifactId ConnectionId) {
+      try {
+         return interfaceConnectionApi.getAccessor().get(branch, ConnectionId, InterfaceConnection.class);
+      } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+         | NoSuchMethodException | SecurityException ex) {
+         System.out.println(ex);
+      }
+      return null;
+   }
+
+   @Override
+   public XResultData deleteConnection(ArtifactId ConnectionId) {
+      return interfaceConnectionApi.getInserter().removeArtifact(ConnectionId, account, branch);
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionInserter.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionInserter.java
new file mode 100644
index 0000000..db199b1
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionInserter.java
@@ -0,0 +1,30 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.internal;
+
+import org.eclipse.osee.framework.core.enums.CoreArtifactTokens;
+import org.eclipse.osee.framework.core.enums.CoreArtifactTypes;
+import org.eclipse.osee.mim.ArtifactAccessor;
+import org.eclipse.osee.mim.types.InterfaceConnection;
+import org.eclipse.osee.orcs.OrcsApi;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceConnectionInserter extends ArtifactInserterImpl<InterfaceConnection> {
+
+   public InterfaceConnectionInserter(OrcsApi orcsApi, ArtifactAccessor<InterfaceConnection> accessor) {
+      super(CoreArtifactTypes.InterfaceConnection, orcsApi, "Interface Connection", accessor,
+         CoreArtifactTokens.InterfaceMessagesFolder);
+   }
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionModificationEndpointImpl.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionModificationEndpointImpl.java
new file mode 100644
index 0000000..61f661c
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionModificationEndpointImpl.java
@@ -0,0 +1,109 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.osee.framework.core.data.ArtifactId;
+import org.eclipse.osee.framework.core.data.BranchId;
+import org.eclipse.osee.framework.core.data.UserId;
+import org.eclipse.osee.framework.core.enums.CoreRelationTypes;
+import org.eclipse.osee.framework.jdk.core.result.XResultData;
+import org.eclipse.osee.mim.InterfaceConnectionModificationEndpoint;
+import org.eclipse.osee.mim.InterfaceConnectionViewApi;
+import org.eclipse.osee.mim.InterfaceNodeViewApi;
+import org.eclipse.osee.mim.types.InterfaceConnection;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceConnectionModificationEndpointImpl implements InterfaceConnectionModificationEndpoint {
+
+   private final BranchId branch;
+   private final UserId account;
+   private final ArtifactId nodeId;
+   private final InterfaceNodeViewApi interfaceNodeApi;
+   private final InterfaceConnectionViewApi interfaceConnectionApi;
+
+   public InterfaceConnectionModificationEndpointImpl(BranchId branch, UserId account, ArtifactId nodeId, InterfaceNodeViewApi interfaceNodeApi, InterfaceConnectionViewApi interfaceConnectionViewApi) {
+      this.account = account;
+      this.branch = branch;
+      this.interfaceNodeApi = interfaceNodeApi;
+      this.interfaceConnectionApi = interfaceConnectionViewApi;
+      this.nodeId = nodeId;
+   }
+
+   @Override
+   public XResultData createNewConnection(InterfaceConnection ConnectionToCreate, String type) {
+      XResultData createResults = interfaceConnectionApi.getInserter().addArtifact(ConnectionToCreate, account, branch);
+      if (type.toLowerCase().equals("primary")) {
+         createResults.merge(interfaceConnectionApi.getInserter().relateArtifact(nodeId,
+            ArtifactId.valueOf(createResults.getIds().get(0)), CoreRelationTypes.InterfaceConnectionPrimary_Connection,
+            branch, account));
+      } else if (type.toLowerCase().equals("secondary")) {
+         createResults.merge(interfaceConnectionApi.getInserter().relateArtifact(nodeId,
+            ArtifactId.valueOf(createResults.getIds().get(0)),
+            CoreRelationTypes.InterfaceConnectionSecondary_Connection, branch, account));
+      }
+      return createResults;
+   }
+
+   @Override
+   public XResultData deleteConnection(ArtifactId ConnectionId) {
+      try {
+         if (interfaceConnectionApi.getAccessor().getByRelation(branch, nodeId,
+            CoreRelationTypes.InterfaceConnectionPrimary_Connection, ConnectionId,
+            InterfaceConnection.class).getId() > 0) {
+            return interfaceConnectionApi.getInserter().unrelateArtifact(nodeId, ConnectionId,
+               CoreRelationTypes.InterfaceConnectionPrimary_Connection, branch, account);
+         } else if (interfaceConnectionApi.getAccessor().getByRelation(branch, nodeId,
+            CoreRelationTypes.InterfaceConnectionSecondary_Connection, ConnectionId,
+            InterfaceConnection.class).getId() > 0) {
+            return interfaceConnectionApi.getInserter().unrelateArtifact(nodeId, ConnectionId,
+               CoreRelationTypes.InterfaceConnectionSecondary_Connection, branch, account);
+         } else {
+            XResultData results = new XResultData();
+            List<String> idList = new LinkedList<String>();
+            idList.add(String.valueOf(nodeId.getId()));
+            idList.add(String.valueOf(ConnectionId.getId()));
+            results.setIds(idList);
+            results.error("Could not find matching Node to unrelate Connection");
+            return results;
+         }
+      } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+         | NoSuchMethodException | SecurityException ex) {
+         System.out.println(ex);
+         XResultData results = new XResultData();
+         List<String> idList = new LinkedList<String>();
+         idList.add(String.valueOf(nodeId.getId()));
+         idList.add(String.valueOf(ConnectionId.getId()));
+         results.setIds(idList);
+         results.error("Could not find matching Node to unrelate Connection");
+         return results;
+      }
+   }
+
+   @Override
+   public XResultData relateConnection(ArtifactId connectionId, String type) {
+      if (type.toLowerCase().equals("primary")) {
+         return interfaceConnectionApi.getInserter().relateArtifact(nodeId, connectionId,
+            CoreRelationTypes.InterfaceConnectionPrimary_Connection, branch, account);
+      } else if (type.toLowerCase().equals("secondary")) {
+         return interfaceConnectionApi.getInserter().relateArtifact(nodeId, connectionId,
+            CoreRelationTypes.InterfaceConnectionSecondary_Connection, branch, account);
+      }
+      return null;
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionViewApiImpl.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionViewApiImpl.java
new file mode 100644
index 0000000..019cec7
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceConnectionViewApiImpl.java
@@ -0,0 +1,58 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.internal;
+
+import org.eclipse.osee.mim.ArtifactAccessor;
+import org.eclipse.osee.mim.ArtifactInserter;
+import org.eclipse.osee.mim.InterfaceConnectionViewApi;
+import org.eclipse.osee.mim.types.InterfaceConnection;
+import org.eclipse.osee.orcs.OrcsApi;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceConnectionViewApiImpl implements InterfaceConnectionViewApi {
+
+   private ArtifactAccessor<InterfaceConnection> accessor;
+   private ArtifactInserter<InterfaceConnection> inserter;
+
+   InterfaceConnectionViewApiImpl(OrcsApi orcsApi) {
+      this.setAccessor(new InterfaceConnectionAccessor(orcsApi));
+      this.setInserter(new InterfaceConnectionInserter(orcsApi, this.getAccessor()));
+   }
+
+   @Override
+   public ArtifactAccessor<InterfaceConnection> getAccessor() {
+      return this.accessor;
+   }
+
+   @Override
+   public ArtifactInserter<InterfaceConnection> getInserter() {
+      return this.inserter;
+   }
+
+   /**
+    * @param accessor the accessor to set
+    */
+   public void setAccessor(ArtifactAccessor<InterfaceConnection> accessor) {
+      this.accessor = accessor;
+   }
+
+   /**
+    * @param inserter the inserter to set
+    */
+   public void setInserter(ArtifactInserter<InterfaceConnection> inserter) {
+      this.inserter = inserter;
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceGraphEndpointImpl.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceGraphEndpointImpl.java
new file mode 100644
index 0000000..e7319fe
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceGraphEndpointImpl.java
@@ -0,0 +1,71 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.LinkedList;
+import org.eclipse.osee.framework.core.data.BranchId;
+import org.eclipse.osee.framework.core.data.UserId;
+import org.eclipse.osee.mim.InterfaceConnectionViewApi;
+import org.eclipse.osee.mim.InterfaceGraphEndpoint;
+import org.eclipse.osee.mim.InterfaceNodeViewApi;
+import org.eclipse.osee.mim.types.ConnectionView;
+import org.eclipse.osee.mim.types.GraphView;
+import org.eclipse.osee.mim.types.InterfaceConnection;
+import org.eclipse.osee.mim.types.InterfaceNode;
+import org.eclipse.osee.mim.types.NodeView;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceGraphEndpointImpl implements InterfaceGraphEndpoint {
+
+   private final BranchId branch;
+   private final UserId account;
+   private final InterfaceNodeViewApi interfaceNodeApi;
+   private final InterfaceConnectionViewApi interfaceConnectionApi;
+
+   public InterfaceGraphEndpointImpl(BranchId branch, UserId account, InterfaceNodeViewApi interfaceNodeApi, InterfaceConnectionViewApi interfaceConnectionViewApi) {
+      this.account = account;
+      this.branch = branch;
+      this.interfaceNodeApi = interfaceNodeApi;
+      this.interfaceConnectionApi = interfaceConnectionViewApi;
+   }
+
+   @Override
+   public GraphView getAllNodesAndEdges() {
+      try {
+         GraphView graph = new GraphView();
+         graph.setEdges(new LinkedList<ConnectionView>());
+         graph.setNodes(new LinkedList<NodeView>());
+         Collection<InterfaceNode> nodes = interfaceNodeApi.getAccessor().getAll(branch, InterfaceNode.class);
+         Collection<InterfaceConnection> edges =
+            interfaceConnectionApi.getAccessor().getAll(branch, InterfaceConnection.class);
+         for (InterfaceNode node : nodes) {
+            graph.addNode(new NodeView(node));
+         }
+         for (InterfaceConnection connection : edges) {
+            if (connection.getPrimaryNode() > -1 && connection.getSecondaryNode() > -1) {
+               graph.addEdges(new ConnectionView(connection));
+            }
+         }
+         return graph;
+      } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+         | NoSuchMethodException | SecurityException ex) {
+         System.out.println(ex);
+      }
+      return null;
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceMessageEndpointImpl.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceMessageEndpointImpl.java
index f7e9e5b..6f6b8d9 100644
--- a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceMessageEndpointImpl.java
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceMessageEndpointImpl.java
@@ -34,21 +34,24 @@
 
    private final BranchId branch;
    private final UserId account;
+   private final ArtifactId ConnectionId;
    private final InterfaceMessageApi messageApi;
    private final InterfaceSubMessageApi subMessageApi;
 
-   public InterfaceMessageEndpointImpl(BranchId branch, UserId account, InterfaceMessageApi interfaceMessageApi, InterfaceSubMessageApi interfaceSubMessageApi) {
+   public InterfaceMessageEndpointImpl(BranchId branch, ArtifactId connectionId, UserId account, InterfaceMessageApi interfaceMessageApi, InterfaceSubMessageApi interfaceSubMessageApi) {
       this.account = account;
       this.branch = branch;
       this.messageApi = interfaceMessageApi;
       this.subMessageApi = interfaceSubMessageApi;
+      this.ConnectionId = connectionId;
    }
 
    @Override
    public Collection<InterfaceMessageToken> getAllMessages() {
       try {
          List<InterfaceMessageToken> messageList =
-            (List<InterfaceMessageToken>) messageApi.getAccessor().getAll(branch, InterfaceMessageToken.class);
+            (List<InterfaceMessageToken>) messageApi.getAccessor().getAllByRelation(branch,
+               CoreRelationTypes.InterfaceConnectionContent_Connection, ConnectionId, InterfaceMessageToken.class);
          for (InterfaceMessageToken message : messageList) {
             List<InterfaceSubMessageToken> submessages = new LinkedList<InterfaceSubMessageToken>();
             for (InterfaceSubMessageToken submessage : this.subMessageApi.getAccessor().getAllByRelation(branch,
@@ -69,14 +72,17 @@
 
    @Override
    public XResultData addMessage(InterfaceMessageToken token) {
-      return messageApi.getInserter().addArtifact(token, account, branch);
+      XResultData createResults = messageApi.getInserter().addArtifact(token, account, branch);
+      createResults.merge(messageApi.getInserter().relateArtifact(ArtifactId.valueOf(createResults.getIds().get(0)),
+         ConnectionId, CoreRelationTypes.InterfaceConnectionContent_Message, branch, account));
+      return createResults;
    }
 
    @Override
    public InterfaceMessageToken getInterfaceMessage(ArtifactId messageId) {
       try {
-         InterfaceMessageToken message =
-            this.messageApi.getAccessor().get(branch, messageId, InterfaceMessageToken.class);
+         InterfaceMessageToken message = this.messageApi.getAccessor().getByRelation(branch, messageId,
+            CoreRelationTypes.InterfaceConnectionContent_Connection, ConnectionId, InterfaceMessageToken.class);
          List<InterfaceSubMessageToken> submessages = new LinkedList<InterfaceSubMessageToken>();
          for (InterfaceSubMessageToken submessage : this.subMessageApi.getAccessor().getAllByRelation(branch,
             CoreRelationTypes.InterfaceMessageSubMessageContent_Message, ArtifactId.valueOf(message.getId()),
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceMessageFilterEndpointImpl.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceMessageFilterEndpointImpl.java
index 4197248..8b3a34c 100644
--- a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceMessageFilterEndpointImpl.java
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceMessageFilterEndpointImpl.java
@@ -33,21 +33,24 @@
 
    private final BranchId branch;
    private final UserId account;
+   private final ArtifactId ConnectionId;
    private final InterfaceMessageApi messageApi;
    private final InterfaceSubMessageApi subMessageApi;
 
-   public InterfaceMessageFilterEndpointImpl(BranchId branch, UserId account, InterfaceMessageApi interfaceMessageApi, InterfaceSubMessageApi interfaceSubMessageApi) {
+   public InterfaceMessageFilterEndpointImpl(BranchId branch, ArtifactId connectionId, UserId account, InterfaceMessageApi interfaceMessageApi, InterfaceSubMessageApi interfaceSubMessageApi) {
       this.account = account;
       this.branch = branch;
       this.messageApi = interfaceMessageApi;
       this.subMessageApi = interfaceSubMessageApi;
+      this.ConnectionId = connectionId;
    }
 
    @Override
    public Collection<InterfaceMessageToken> getMessages() {
       try {
          List<InterfaceMessageToken> messageList =
-            (List<InterfaceMessageToken>) messageApi.getAccessor().getAll(branch, InterfaceMessageToken.class);
+            (List<InterfaceMessageToken>) messageApi.getAccessor().getAllByRelation(branch,
+               CoreRelationTypes.InterfaceConnectionContent_Connection, ConnectionId, InterfaceMessageToken.class);
          for (InterfaceMessageToken message : messageList) {
             List<InterfaceSubMessageToken> submessages = new LinkedList<InterfaceSubMessageToken>();
             for (InterfaceSubMessageToken submessage : this.subMessageApi.getAccessor().getAllByRelation(branch,
@@ -70,7 +73,8 @@
    public Collection<InterfaceMessageToken> getMessages(String filter) {
       try {
          List<InterfaceMessageToken> messageList =
-            (List<InterfaceMessageToken>) messageApi.getAccessor().getAllByFilter(branch, filter,
+            (List<InterfaceMessageToken>) messageApi.getAccessor().getAllByRelationAndFilter(branch,
+               CoreRelationTypes.InterfaceConnectionContent_Connection, ConnectionId, filter,
                InterfaceMessageToken.class);
          for (InterfaceMessageToken message : messageList) {
             message.setSubMessages((List<InterfaceSubMessageToken>) this.subMessageApi.getAccessor().getAllByRelation(
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeAccessor.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeAccessor.java
new file mode 100644
index 0000000..05b50b4
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeAccessor.java
@@ -0,0 +1,28 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.internal;
+
+import org.eclipse.osee.framework.core.enums.CoreArtifactTypes;
+import org.eclipse.osee.mim.types.InterfaceNode;
+import org.eclipse.osee.orcs.OrcsApi;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceNodeAccessor extends ArtifactAccessorImpl<InterfaceNode> {
+
+   public InterfaceNodeAccessor(OrcsApi orcsApi) {
+      super(CoreArtifactTypes.InterfaceNode, orcsApi);
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeEndpointImpl.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeEndpointImpl.java
new file mode 100644
index 0000000..92f946b
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeEndpointImpl.java
@@ -0,0 +1,85 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import org.eclipse.osee.framework.core.data.ArtifactId;
+import org.eclipse.osee.framework.core.data.BranchId;
+import org.eclipse.osee.framework.core.data.UserId;
+import org.eclipse.osee.framework.jdk.core.result.XResultData;
+import org.eclipse.osee.mim.InterfaceConnectionViewApi;
+import org.eclipse.osee.mim.InterfaceNodeEndpoint;
+import org.eclipse.osee.mim.InterfaceNodeViewApi;
+import org.eclipse.osee.mim.types.InterfaceNode;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceNodeEndpointImpl implements InterfaceNodeEndpoint {
+
+   private final BranchId branch;
+   private final UserId account;
+   private final InterfaceNodeViewApi interfaceNodeApi;
+   private final InterfaceConnectionViewApi interfaceConnectionApi;
+
+   public InterfaceNodeEndpointImpl(BranchId branch, UserId account, InterfaceNodeViewApi interfaceNodeApi, InterfaceConnectionViewApi interfaceConnectionViewApi) {
+      this.account = account;
+      this.branch = branch;
+      this.interfaceNodeApi = interfaceNodeApi;
+      this.interfaceConnectionApi = interfaceConnectionViewApi; //leaving this in here in case it's needed at a future date
+   }
+
+   @Override
+   public Collection<InterfaceNode> getAllNodes() {
+      try {
+         return interfaceNodeApi.getAccessor().getAll(branch, InterfaceNode.class);
+      } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+         | NoSuchMethodException | SecurityException ex) {
+         System.out.println(ex);
+      }
+      return null;
+   }
+
+   @Override
+   public XResultData createNewNode(InterfaceNode nodeToCreate) {
+      return interfaceNodeApi.getInserter().addArtifact(nodeToCreate, account, branch);
+   }
+
+   @Override
+   public XResultData updateNode(InterfaceNode nodeToUpdate) {
+      return interfaceNodeApi.getInserter().replaceArtifact(nodeToUpdate, account, branch);
+   }
+
+   @Override
+   public XResultData patchNode(InterfaceNode nodeToPatch) {
+      return interfaceNodeApi.getInserter().patchArtifact(nodeToPatch, account, branch);
+   }
+
+   @Override
+   public InterfaceNode getNode(ArtifactId nodeId) {
+      try {
+         return interfaceNodeApi.getAccessor().get(branch, nodeId, InterfaceNode.class);
+      } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+         | NoSuchMethodException | SecurityException ex) {
+         System.out.println(ex);
+      }
+      return null;
+   }
+
+   @Override
+   public XResultData deleteNode(ArtifactId nodeId) {
+      return interfaceNodeApi.getInserter().removeArtifact(nodeId, account, branch);
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeInserter.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeInserter.java
new file mode 100644
index 0000000..cd05bca
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeInserter.java
@@ -0,0 +1,30 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.internal;
+
+import org.eclipse.osee.framework.core.enums.CoreArtifactTokens;
+import org.eclipse.osee.framework.core.enums.CoreArtifactTypes;
+import org.eclipse.osee.mim.ArtifactAccessor;
+import org.eclipse.osee.mim.types.InterfaceNode;
+import org.eclipse.osee.orcs.OrcsApi;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceNodeInserter extends ArtifactInserterImpl<InterfaceNode> {
+
+   public InterfaceNodeInserter(OrcsApi orcsApi, ArtifactAccessor<InterfaceNode> accessor) {
+      super(CoreArtifactTypes.InterfaceNode, orcsApi, "Interface Node", accessor,
+         CoreArtifactTokens.InterfaceMessagesFolder);
+   }
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeViewApiImpl.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeViewApiImpl.java
new file mode 100644
index 0000000..392e3d9
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/InterfaceNodeViewApiImpl.java
@@ -0,0 +1,58 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.internal;
+
+import org.eclipse.osee.mim.ArtifactAccessor;
+import org.eclipse.osee.mim.ArtifactInserter;
+import org.eclipse.osee.mim.InterfaceNodeViewApi;
+import org.eclipse.osee.mim.types.InterfaceNode;
+import org.eclipse.osee.orcs.OrcsApi;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceNodeViewApiImpl implements InterfaceNodeViewApi {
+
+   private ArtifactAccessor<InterfaceNode> accessor;
+   private ArtifactInserter<InterfaceNode> inserter;
+
+   InterfaceNodeViewApiImpl(OrcsApi orcsApi) {
+      this.setAccessor(new InterfaceNodeAccessor(orcsApi));
+      this.setInserter(new InterfaceNodeInserter(orcsApi, this.getAccessor()));
+   }
+
+   @Override
+   public ArtifactAccessor<InterfaceNode> getAccessor() {
+      return this.accessor;
+   }
+
+   @Override
+   public ArtifactInserter<InterfaceNode> getInserter() {
+      return this.inserter;
+   }
+
+   /**
+    * @param accessor the accessor to set
+    */
+   public void setAccessor(ArtifactAccessor<InterfaceNode> accessor) {
+      this.accessor = accessor;
+   }
+
+   /**
+    * @param inserter the inserter to set
+    */
+   public void setInserter(ArtifactInserter<InterfaceNode> inserter) {
+      this.inserter = inserter;
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/MimApiImpl.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/MimApiImpl.java
index 712523a..60bb4c3 100644
--- a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/MimApiImpl.java
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/internal/MimApiImpl.java
@@ -13,9 +13,11 @@
 package org.eclipse.osee.mim.internal;
 
 import java.util.concurrent.ConcurrentHashMap;
+import org.eclipse.osee.mim.InterfaceConnectionViewApi;
 import org.eclipse.osee.mim.InterfaceElementApi;
 import org.eclipse.osee.mim.InterfaceElementArrayApi;
 import org.eclipse.osee.mim.InterfaceMessageApi;
+import org.eclipse.osee.mim.InterfaceNodeViewApi;
 import org.eclipse.osee.mim.InterfacePlatformTypeApi;
 import org.eclipse.osee.mim.InterfaceStructureApi;
 import org.eclipse.osee.mim.InterfaceSubMessageApi;
@@ -59,6 +61,10 @@
 
    private InterfacePlatformTypeApi interfacePlatformApi;
 
+   private InterfaceNodeViewApi interfaceNodeViewApi;
+
+   private InterfaceConnectionViewApi interfaceConnectionViewApi;
+
    public void bindOrcsApi(OrcsApi orcsApi) {
       this.orcsApi = orcsApi;
    }
@@ -104,6 +110,8 @@
       this.interfaceStructureApi = new InterfaceStructureApiImpl(orcsApi);
       this.interfaceElementApi = new InterfaceElementApiImpl(orcsApi);
       this.interfaceElementArrayApi = new InterfaceElementArrayApiImpl(orcsApi);
+      this.interfaceNodeViewApi = new InterfaceNodeViewApiImpl(orcsApi);
+      this.interfaceConnectionViewApi = new InterfaceConnectionViewApiImpl(orcsApi);
    }
 
    @Override
@@ -146,4 +154,14 @@
       return this.interfaceElementArrayApi;
    }
 
+   @Override
+   public InterfaceNodeViewApi getInterfaceNodeViewApi() {
+      return this.interfaceNodeViewApi;
+   }
+
+   @Override
+   public InterfaceConnectionViewApi getInterfaceConnectionViewApi() {
+      return this.interfaceConnectionViewApi;
+   }
+
 }
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/ConnectionView.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/ConnectionView.java
new file mode 100644
index 0000000..227d9c0
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/ConnectionView.java
@@ -0,0 +1,187 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.types;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.eclipse.osee.framework.core.data.ArtifactToken;
+import org.eclipse.osee.framework.core.enums.CoreAttributeTypes;
+import org.eclipse.osee.mim.annotations.OseeArtifactAttribute;
+import org.eclipse.osee.mim.annotations.OseeArtifactRequiredAttribute;
+import org.eclipse.osee.orcs.data.ArtifactReadable;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class ConnectionView extends PLGenericDBObject {
+
+   @OseeArtifactRequiredAttribute()
+   @OseeArtifactAttribute(attributeId = 1152921504606847088L)
+   @JsonIgnore
+   private String Name; //required
+
+   @OseeArtifactAttribute(attributeId = 1152921504606847090L)
+   private String Description;
+
+   private String source = "";//source node to reference
+   private String target = ""; //target node to reference
+   private String label = ""; //label to display on connection line, should be same as {@Name}
+   private ConnectionViewData data;
+
+   public ConnectionView(ArtifactToken art) {
+      this((ArtifactReadable) art);
+   }
+
+   public ConnectionView(InterfaceConnection connection) {
+      this(connection.getId(), connection.getName(), connection.getDescription(), connection.getTransportType());
+      this.setSource(connection.getPrimaryNode().toString());
+      this.setTarget(connection.getSecondaryNode().toString());
+   }
+
+   public ConnectionView(ArtifactReadable art) {
+      this();
+      this.setId(art.getId());
+      this.setName(art.getName());
+      this.setDescription(art.getSoleAttributeValue(CoreAttributeTypes.Description, ""));
+      this.setData(new ConnectionViewData(art));
+   }
+
+   public ConnectionView(Long id, String name, String description, String transportType) {
+      this(id, name);
+      this.setLabel(name);
+      this.setDescription(description);
+      this.setData(new ConnectionViewData(id, name));
+      this.setType(ConnectionViewType.valueOf(transportType));
+   }
+
+   public ConnectionView(Long id, String name) {
+      super(id, name);
+   }
+
+   public ConnectionView() {
+   }
+
+   /**
+    * @return the description
+    */
+   @JsonIgnore
+   public String getDescription() {
+      return Description;
+   }
+
+   /**
+    * @param description the description to set
+    */
+   public void setDescription(String description) {
+      this.Description = description;
+   }
+
+   @Override
+   @JsonIgnore
+   public String getName() {
+      return super.getName();
+   }
+
+   @Override
+   public void setName(String name) {
+      super.setName(name);
+      this.setLabel(name);
+   }
+
+   /**
+    * @return the source
+    */
+   public String getSource() {
+      return source;
+   }
+
+   /**
+    * @param source the source to set
+    */
+   public void setSource(String source) {
+      this.source = source;
+   }
+
+   /**
+    * @return the target
+    */
+   public String getTarget() {
+      return target;
+   }
+
+   /**
+    * @param target the target to set
+    */
+   public void setTarget(String target) {
+      this.target = target;
+   }
+
+   /**
+    * @return the label
+    */
+   public String getLabel() {
+      return label;
+   }
+
+   /**
+    * @param label the label to set
+    */
+   public void setLabel(String label) {
+      this.label = label;
+   }
+
+   /**
+    * @return the data
+    */
+   public ConnectionViewData getData() {
+      return data;
+   }
+
+   /**
+    * @param data the data to set
+    */
+   public void setData(ConnectionViewData data) {
+      this.data = data;
+   }
+
+   /**
+    * @return the type
+    */
+   @JsonIgnore
+   public ConnectionViewType getType() {
+      return data.getTransportType();
+   }
+
+   /**
+    * @param data the type to set
+    */
+   @JsonIgnore
+   public void setType(ConnectionViewType type) {
+      this.data.setTransportType(type);
+   }
+
+   /**
+    * @return whether or not the connection is a dashed line
+    */
+   @JsonIgnore
+   public boolean getIsDashed() {
+      return data.isDashed();
+   }
+
+   /**
+    * @param isDashed set whether the line is dashed or not
+    */
+   @JsonIgnore
+   public void setIsDashed(boolean isDashed) {
+      this.data.setDashed(isDashed);
+   }
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/ConnectionViewData.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/ConnectionViewData.java
new file mode 100644
index 0000000..56c4dee
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/ConnectionViewData.java
@@ -0,0 +1,68 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.types;
+
+import org.eclipse.osee.framework.core.data.ArtifactToken;
+import org.eclipse.osee.orcs.data.ArtifactReadable;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class ConnectionViewData extends PLGenericDBObject {
+   private ConnectionViewType TransportType = ConnectionViewType.ETHERNET; //will need logic for both of these or data stored in DB
+   private boolean isDashed = true;
+
+   public ConnectionViewData(ArtifactToken art) {
+      this((ArtifactReadable) art);
+   }
+
+   public ConnectionViewData(ArtifactReadable art) {
+      super(art);
+   }
+
+   public ConnectionViewData(Long id, String name) {
+      super(id, name);
+   }
+
+   public ConnectionViewData() {
+   }
+
+   /**
+    * @return the type
+    */
+   public ConnectionViewType getTransportType() {
+      return TransportType;
+   }
+
+   /**
+    * @param type the type to set
+    */
+   public void setTransportType(ConnectionViewType type) {
+      this.TransportType = type;
+   }
+
+   /**
+    * @return the isDashed
+    */
+   public boolean isDashed() {
+      return isDashed;
+   }
+
+   /**
+    * @param isDashed the isDashed to set
+    */
+   public void setDashed(boolean isDashed) {
+      this.isDashed = isDashed;
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/ConnectionViewType.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/ConnectionViewType.java
new file mode 100644
index 0000000..dd3b205
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/ConnectionViewType.java
@@ -0,0 +1,21 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.types;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public enum ConnectionViewType {
+   ETHERNET,
+   MILSTD1553_B,
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/GraphView.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/GraphView.java
new file mode 100644
index 0000000..791b6a7
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/GraphView.java
@@ -0,0 +1,91 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.types;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class GraphView {
+   Collection<ConnectionView> edges;
+   Collection<NodeView> nodes;
+
+   public GraphView() {
+   }
+
+   /**
+    * @return the edges
+    */
+   public Collection<ConnectionView> getEdges() {
+      return edges;
+   }
+
+   /**
+    * @param edges the edges to set
+    */
+   public void setEdges(Collection<ConnectionView> edges) {
+      this.edges = edges;
+   }
+
+   /**
+    * @return the nodes
+    */
+   public Collection<NodeView> getNodes() {
+      return nodes;
+   }
+
+   /**
+    * @param nodes the nodes to set
+    */
+   public void setNodes(Collection<NodeView> nodes) {
+      this.nodes = nodes;
+   }
+
+   @JsonIgnore
+   public void addNode(NodeView node) {
+      this.nodes.add(node);
+   }
+
+   @JsonIgnore
+   public void removeNode(NodeView node) {
+      if (this.nodes.contains(node)) {
+         this.nodes.remove(node);
+      }
+   }
+
+   @JsonIgnore
+   public void removeNode(Long index) {
+      nodes = this.nodes.stream().filter(x -> x.getId() != index).collect(Collectors.toList());
+   }
+
+   @JsonIgnore
+   public void addEdges(ConnectionView connection) {
+      this.edges.add(connection);
+   }
+
+   @JsonIgnore
+   public void removeEdges(ConnectionView connection) {
+      if (this.edges.contains(connection)) {
+         this.edges.remove(connection);
+      }
+   }
+
+   @JsonIgnore
+   public void removeEdges(Long index) {
+      edges = this.edges.stream().filter(x -> x.getId() != index).collect(Collectors.toList());
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/InterfaceConnection.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/InterfaceConnection.java
new file mode 100644
index 0000000..aafc494
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/InterfaceConnection.java
@@ -0,0 +1,121 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.types;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.eclipse.osee.framework.core.data.ArtifactToken;
+import org.eclipse.osee.framework.core.enums.CoreAttributeTypes;
+import org.eclipse.osee.framework.core.enums.CoreRelationTypes;
+import org.eclipse.osee.mim.annotations.OseeArtifactAttribute;
+import org.eclipse.osee.mim.annotations.OseeArtifactRequiredAttribute;
+import org.eclipse.osee.orcs.data.ArtifactReadable;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceConnection extends PLGenericDBObject {
+
+   @OseeArtifactRequiredAttribute()
+   @OseeArtifactAttribute(attributeId = 1152921504606847088L)
+   private String Name; //required
+
+   @OseeArtifactAttribute(attributeId = 1152921504606847090L)
+   private String Description;
+
+   @OseeArtifactAttribute(attributeId = 4522496963078776538L)
+   @JsonIgnore
+   private String TransportType;
+
+   private Long primaryNode;
+
+   private Long secondaryNode;
+
+   public InterfaceConnection(ArtifactToken art) {
+      this((ArtifactReadable) art);
+   }
+
+   public InterfaceConnection(ArtifactReadable art) {
+      super(art);
+      this.setPrimaryNode(art.getRelated(CoreRelationTypes.InterfaceConnectionPrimary_Node).getAtMostOneOrDefault(
+         ArtifactReadable.SENTINEL).getId());
+      this.setSecondaryNode(art.getRelated(CoreRelationTypes.InterfaceConnectionSecondary_Node).getAtMostOneOrDefault(
+         ArtifactReadable.SENTINEL).getId());
+      this.setTransportType(art.getSoleAttributeValue(CoreAttributeTypes.InterfaceTransportType, "ETHERNET"));
+   }
+
+   public InterfaceConnection(Long id, String name) {
+      super(id, name);
+   }
+
+   public InterfaceConnection() {
+   }
+
+   /**
+    * @return the description
+    */
+   public String getDescription() {
+      return Description;
+   }
+
+   /**
+    * @param description the description to set
+    */
+   public void setDescription(String description) {
+      this.Description = description;
+   }
+
+   /**
+    * @return the secondaryNode
+    */
+   public Long getSecondaryNode() {
+      return secondaryNode;
+   }
+
+   /**
+    * @param secondaryNode the secondaryNode to set
+    */
+   public void setSecondaryNode(Long secondaryNode) {
+      this.secondaryNode = secondaryNode;
+   }
+
+   /**
+    * @return the primaryNode
+    */
+   public Long getPrimaryNode() {
+      return primaryNode;
+   }
+
+   /**
+    * @param primaryNode the primaryNode to set
+    */
+   public void setPrimaryNode(Long primaryNode) {
+      this.primaryNode = primaryNode;
+   }
+
+   /**
+    * @return the transportType
+    */
+   @JsonIgnore
+   public String getTransportType() {
+      return TransportType;
+   }
+
+   /**
+    * @param transportType the transportType to set
+    */
+   @JsonIgnore
+   public void setTransportType(String transportType) {
+      TransportType = transportType;
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/InterfaceNode.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/InterfaceNode.java
new file mode 100644
index 0000000..9e6a912
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/InterfaceNode.java
@@ -0,0 +1,61 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.types;
+
+import org.eclipse.osee.framework.core.data.ArtifactToken;
+import org.eclipse.osee.mim.annotations.OseeArtifactAttribute;
+import org.eclipse.osee.mim.annotations.OseeArtifactRequiredAttribute;
+import org.eclipse.osee.orcs.data.ArtifactReadable;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class InterfaceNode extends PLGenericDBObject {
+
+   @OseeArtifactRequiredAttribute()
+   @OseeArtifactAttribute(attributeId = 1152921504606847088L)
+   private String Name; //required
+
+   @OseeArtifactAttribute(attributeId = 1152921504606847090L)
+   private String Description;
+
+   public InterfaceNode(ArtifactToken art) {
+      this((ArtifactReadable) art);
+   }
+
+   public InterfaceNode(ArtifactReadable art) {
+      super(art);
+   }
+
+   public InterfaceNode(Long id, String name) {
+      super(id, name);
+   }
+
+   public InterfaceNode() {
+   }
+
+   /**
+    * @return the description
+    */
+   public String getDescription() {
+      return Description;
+   }
+
+   /**
+    * @param description the description to set
+    */
+   public void setDescription(String description) {
+      this.Description = description;
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/NodeView.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/NodeView.java
new file mode 100644
index 0000000..82de6a7
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/NodeView.java
@@ -0,0 +1,134 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.types;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.eclipse.osee.framework.core.data.ArtifactToken;
+import org.eclipse.osee.mim.annotations.OseeArtifactAttribute;
+import org.eclipse.osee.mim.annotations.OseeArtifactRequiredAttribute;
+import org.eclipse.osee.orcs.data.ArtifactReadable;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class NodeView extends PLGenericDBObject {
+
+   @OseeArtifactRequiredAttribute()
+   @OseeArtifactAttribute(attributeId = 1152921504606847088L)
+   private String Name; //required
+
+   @OseeArtifactAttribute(attributeId = 1152921504606847090L)
+   private String Description;
+
+   private String label = ""; //label to display on connection line, should be same as {@Name}
+   private NodeViewData data;
+
+   public NodeView(ArtifactToken art) {
+      this((ArtifactReadable) art);
+   }
+
+   public NodeView(InterfaceNode node) {
+      this(node.getId(), node.getName(), node.getDescription());
+   }
+
+   public NodeView(ArtifactReadable art) {
+      super(art);
+      this.setData(new NodeViewData(art));
+   }
+
+   public NodeView(Long id, String name, String description) {
+      this(id, name);
+      this.setLabel(name);
+      this.setDescription(description);
+      this.setData(new NodeViewData(id, name));
+   }
+
+   public NodeView(Long id, String name) {
+      super(id, name);
+   }
+
+   public NodeView() {
+   }
+
+   /**
+    * @return the label
+    */
+   public String getLabel() {
+      return label;
+   }
+
+   /**
+    * @param label the label to set
+    */
+   public void setLabel(String label) {
+      this.label = label;
+   }
+
+   @Override
+   @JsonIgnore
+   public String getName() {
+      return super.getName();
+   }
+
+   @Override
+   public void setName(String name) {
+      super.setName(name);
+      this.setLabel(name);
+   }
+
+   /**
+    * @return the description
+    */
+   @JsonIgnore
+   public String getDescription() {
+      return Description;
+   }
+
+   /**
+    * @param description the description to set
+    */
+   public void setDescription(String description) {
+      this.Description = description;
+   }
+
+   /**
+    * @return the data
+    */
+   public NodeViewData getData() {
+      return data;
+   }
+
+   /**
+    * @param data the data to set
+    */
+   public void setData(NodeViewData data) {
+      this.data = data;
+   }
+
+   /**
+    * @return color of node
+    */
+   @JsonIgnore
+   public String getbgColor() {
+      return data.getbgColor();
+   }
+
+   /**
+    * @param color the color to set
+    */
+   @JsonIgnore
+   public void setbgColor(String color) {
+      this.data.setbgColor(color);
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/NodeViewData.java b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/NodeViewData.java
new file mode 100644
index 0000000..fbda2c3
--- /dev/null
+++ b/plugins/org.eclipse.osee.mim/src/org/eclipse/osee/mim/types/NodeViewData.java
@@ -0,0 +1,61 @@
+/*********************************************************************
+ * Copyright (c) 2021 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.mim.types;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import java.util.concurrent.ThreadLocalRandom;
+import org.eclipse.osee.framework.core.data.ArtifactToken;
+import org.eclipse.osee.orcs.data.ArtifactReadable;
+
+/**
+ * @author Luciano T. Vaglienti
+ */
+public class NodeViewData extends PLGenericDBObject {
+
+   private String bgColor = generateColor() ? "#81d4fa" : "#c5e1a5"; //has to be called bgColor due to @swimlane/ngx-graph having weird handling behavior of node.data.color
+
+   public NodeViewData(ArtifactToken art) {
+      this((ArtifactReadable) art);
+   }
+
+   public NodeViewData(ArtifactReadable art) {
+      super(art);
+   }
+
+   public NodeViewData(Long id, String name) {
+      super(id, name);
+   }
+
+   public NodeViewData() {
+   }
+
+   /**
+    * @return the color
+    */
+   public String getbgColor() {
+      return bgColor;
+   }
+
+   /**
+    * @param color the color to set
+    */
+   public void setbgColor(String color) {
+      this.bgColor = color;
+   }
+
+   @JsonIgnore
+   private boolean generateColor() {
+      return ThreadLocalRandom.current().nextInt(1, 3) > 1 ? true : false;
+   }
+
+}