diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject.zip b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject.zip
new file mode 100644
index 0000000000000000000000000000000000000000..e2add3454d15bcca8457489ddc78a17d94aa0b74
Binary files /dev/null and b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject.zip differ
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/AnalystReports/Viskit.ico b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/AnalystReports/Viskit.ico
new file mode 100644
index 0000000000000000000000000000000000000000..c9d5908c91e327600695feac75e406ee99fbb30a
Binary files /dev/null and b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/AnalystReports/Viskit.ico differ
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/Assemblies/examples/TestAssembly.xml b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/Assemblies/examples/TestAssembly.xml
new file mode 100644
index 0000000000000000000000000000000000000000..670bf5e342254d05e495b69bf1f3157b7649b7e6
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/Assemblies/examples/TestAssembly.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<SimkitAssembly name="TestAssembly" version="1.0" package="examples" xsi:noNamespaceSchemaLocation="http://diana.nps.edu/Simkit/assembly.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <SimEntity name="arrivalProcess" type="examples.ArrivalProcess" description="">
+        <FactoryParameter factory="simkit.random.RandomVariateFactory" type="simkit.random.RandomVariate">
+            <TerminalParameter name="" value="Exponential" type="java.lang.String"/>
+            <TerminalParameter name="" value="1.6" type="double"/>
+        </FactoryParameter>
+        <Coordinate x="120.0" y="190.0"/>
+    </SimEntity>
+    <SimEntity name="twoTypeServer" type="examples.TwoTypeServer" description="">
+        <TerminalParameter name="numberServersA" value="1" type="int"/>
+        <TerminalParameter name="numberServersB" value="2" type="int"/>
+        <FactoryParameter factory="simkit.random.RandomVariateFactory" type="simkit.random.RandomVariate">
+            <TerminalParameter name="" value="Exponential" type="java.lang.String"/>
+            <TerminalParameter name="" value="0.9" type="double"/>
+        </FactoryParameter>
+        <FactoryParameter factory="simkit.random.RandomVariateFactory" type="simkit.random.RandomVariate">
+            <TerminalParameter name="" value="Exponential" type="java.lang.String"/>
+            <TerminalParameter name="" value="1.2" type="double"/>
+        </FactoryParameter>
+        <Coordinate x="360.0" y="190.0"/>
+    </SimEntity>
+    <PropertyChangeListener name="numAvailServerAStat" type="simkit.stat.SimpleStatsTimeVarying" mode="replicationStat" meanStatistics="false" countStatistics="true" description="">
+        <TerminalParameter name="p[0] : " value="numberAvailableServersA" type="java.lang.String"/>
+        <Coordinate x="360.0" y="290.0"/>
+    </PropertyChangeListener>
+    <PropertyChangeListener name="queueStat" type="simkit.stat.SimpleStatsTimeVarying" mode="replicationStat" meanStatistics="false" countStatistics="true" description="">
+        <TerminalParameter name="p[0] : " value="queue" type="java.lang.String"/>
+        <Coordinate x="510.0" y="190.0"/>
+    </PropertyChangeListener>
+    <PropertyChangeListener name="numAvailServerBStat" type="simkit.stat.SimpleStatsTimeVarying" mode="replicationStat" meanStatistics="false" countStatistics="true" description="">
+        <TerminalParameter name="p[0] : " value="numberAvailableServersB" type="java.lang.String"/>
+        <Coordinate x="360.0" y="80.0"/>
+    </PropertyChangeListener>
+    <PropertyChangeListenerConnection property="numberAvailableServersA" listener="numAvailServerAStat" source="twoTypeServer" description=""/>
+    <PropertyChangeListenerConnection property="queue" listener="queueStat" source="twoTypeServer" description=""/>
+    <PropertyChangeListenerConnection property="numberAvailableServersB" listener="numAvailServerBStat" source="twoTypeServer" description=""/>
+    <Adapter name="adptr" eventHeard="Arrival" eventSent="Arrival" from="arrivalProcess" to="twoTypeServer" description=""/>
+    <Output entity="arrivalProcess"/>
+    <Output entity="twoTypeServer"/>
+    <Schedule stopTime="100.0" verbose="false" saveReplicationData="false"/>
+</SimkitAssembly>
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/ArrivalProcess.xml b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/ArrivalProcess.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b22b9b36c0fdb2384cfb496f7a1e2a04862530f6
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/ArrivalProcess.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<SimEntity name="ArrivalProcess" package="examples" version="1.0" author="advan" extend="SimEntityBase" xsi:noNamespaceSchemaLocation="http://diana.nps.edu/Simkit/simkit.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <Parameter name="interarrivalTime" type="simkit.random.RandomVariate">
+        <Comment></Comment>
+    </Parameter>
+    <StateVariable name="numberArrivals" type="int">
+        <Comment></Comment>
+    </StateVariable>
+    <Event name="Run" description="This event is fired first to facilitate initialization of all simulation state variables">
+        <Schedule delay="interarrivalTime.generate()" event="Arrival" priority="DEFAULT">
+            <Comment></Comment>
+        </Schedule>
+        <Code></Code>
+        <Coordinate x="30.0" y="60.0"/>
+    </Event>
+    <Event name="Arrival">
+        <Comment></Comment>
+        <StateTransition state="numberArrivals">
+            <Assignment value="numberArrivals + 1"/>
+        </StateTransition>
+        <Schedule delay="interarrivalTime.generate()" event="Arrival" priority="DEFAULT">
+            <Comment></Comment>
+        </Schedule>
+        <Code></Code>
+        <Coordinate x="230.0" y="60.0"/>
+    </Event>
+</SimEntity>
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/ArrivalProcessTwo.xml b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/ArrivalProcessTwo.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b22b9b36c0fdb2384cfb496f7a1e2a04862530f6
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/ArrivalProcessTwo.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<SimEntity name="ArrivalProcess" package="examples" version="1.0" author="advan" extend="SimEntityBase" xsi:noNamespaceSchemaLocation="http://diana.nps.edu/Simkit/simkit.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <Parameter name="interarrivalTime" type="simkit.random.RandomVariate">
+        <Comment></Comment>
+    </Parameter>
+    <StateVariable name="numberArrivals" type="int">
+        <Comment></Comment>
+    </StateVariable>
+    <Event name="Run" description="This event is fired first to facilitate initialization of all simulation state variables">
+        <Schedule delay="interarrivalTime.generate()" event="Arrival" priority="DEFAULT">
+            <Comment></Comment>
+        </Schedule>
+        <Code></Code>
+        <Coordinate x="30.0" y="60.0"/>
+    </Event>
+    <Event name="Arrival">
+        <Comment></Comment>
+        <StateTransition state="numberArrivals">
+            <Assignment value="numberArrivals + 1"/>
+        </StateTransition>
+        <Schedule delay="interarrivalTime.generate()" event="Arrival" priority="DEFAULT">
+            <Comment></Comment>
+        </Schedule>
+        <Code></Code>
+        <Coordinate x="230.0" y="60.0"/>
+    </Event>
+</SimEntity>
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/TwoTypeServer.xml b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/TwoTypeServer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e17ab0cc4d8503c444a571328c8ee36549d75c80
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/TwoTypeServer.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<SimEntity name="TwoTypeServer" package="examples" version="1.0" author="advan" extend="SimEntityBase" xsi:noNamespaceSchemaLocation="http://diana.nps.edu/Simkit/simkit.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <Parameter name="numberServersA" type="int">
+        <Comment></Comment>
+    </Parameter>
+    <Parameter name="numberServersB" type="int">
+        <Comment></Comment>
+    </Parameter>
+    <Parameter name="serviceTimeA" type="simkit.random.RandomVariate">
+        <Comment></Comment>
+    </Parameter>
+    <Parameter name="serviceTimeB" type="simkit.random.RandomVariate">
+        <Comment></Comment>
+    </Parameter>
+    <StateVariable name="numberAvailableServersA" type="int">
+        <Comment></Comment>
+    </StateVariable>
+    <StateVariable name="numberAvailableServersB" type="int">
+        <Comment></Comment>
+    </StateVariable>
+    <StateVariable name="queue" type="int">
+        <Comment></Comment>
+    </StateVariable>
+    <Event name="Run" description="This event is fired first to facilitate initialization of all simulation state variables">
+        <Comment></Comment>
+        <StateTransition state="numberAvailableServersA">
+            <Assignment value="getNumberServersA()"/>
+        </StateTransition>
+        <StateTransition state="numberAvailableServersB">
+            <Assignment value="getNumberServersB()"/>
+        </StateTransition>
+        <StateTransition state="queue">
+            <Assignment value="0"/>
+        </StateTransition>
+        <Code></Code>
+        <Coordinate x="40.0" y="60.0"/>
+    </Event>
+    <Event name="Arrival">
+        <Comment></Comment>
+        <StateTransition state="queue">
+            <Assignment value="queue + 1"/>
+        </StateTransition>
+        <Schedule delay="0.0" event="StartServiceA" condition="getNumberAvailableServersA() &gt; 0" priority="DEFAULT">
+            <Comment></Comment>
+        </Schedule>
+        <Schedule delay="0.0" event="StartServiceB" condition="getNumberAvailableServersA() == 0 &amp;&amp; getNumberAvailableServersB() &gt; 0" priority="DEFAULT">
+            <Comment></Comment>
+        </Schedule>
+        <Code></Code>
+        <Coordinate x="40.0" y="180.0"/>
+    </Event>
+    <Event name="StartServiceA">
+        <Comment></Comment>
+        <StateTransition state="numberAvailableServersA">
+            <Assignment value="numberAvailableServersA - 1"/>
+        </StateTransition>
+        <StateTransition state="queue">
+            <Assignment value="queue - 1"/>
+        </StateTransition>
+        <Schedule delay="serviceTimeA.generate()" event="EndServiceA" priority="DEFAULT">
+            <Comment></Comment>
+        </Schedule>
+        <Code></Code>
+        <Coordinate x="180.0" y="100.0"/>
+    </Event>
+    <Event name="StartServiceB">
+        <Comment></Comment>
+        <StateTransition state="numberAvailableServersB">
+            <Assignment value="numberAvailableServersB - 1"/>
+        </StateTransition>
+        <StateTransition state="queue">
+            <Assignment value="queue - 1"/>
+        </StateTransition>
+        <Schedule delay="serviceTimeB.generate()" event="EndServiceB" priority="DEFAULT">
+            <Comment></Comment>
+        </Schedule>
+        <Code></Code>
+        <Coordinate x="180.0" y="260.0"/>
+    </Event>
+    <Event name="EndServiceA">
+        <Comment></Comment>
+        <StateTransition state="numberAvailableServersA">
+            <Assignment value="numberAvailableServersA + 1"/>
+        </StateTransition>
+        <Schedule delay="0.0" event="StartServiceA" condition="queue &gt; 0" priority="HIGH">
+            <Comment></Comment>
+        </Schedule>
+        <Code></Code>
+        <Coordinate x="350.0" y="100.0"/>
+    </Event>
+    <Event name="EndServiceB">
+        <Comment></Comment>
+        <StateTransition state="numberAvailableServersB">
+            <Assignment value="numberAvailableServersB + 1"/>
+        </StateTransition>
+        <Schedule delay="0.0" event="StartServiceB" condition="queue &gt; 0" priority="HIGH">
+            <Comment></Comment>
+        </Schedule>
+        <Code></Code>
+        <Coordinate x="350.0" y="260.0"/>
+    </Event>
+</SimEntity>
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/ArrivalProcess.class b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/ArrivalProcess.class
new file mode 100644
index 0000000000000000000000000000000000000000..9ae9ff1c1968f2c75a16bcf3f92168383699f3f3
Binary files /dev/null and b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/ArrivalProcess.class differ
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/EntityCreator.class b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/EntityCreator.class
new file mode 100644
index 0000000000000000000000000000000000000000..223b0d32e9af9d75e3599736e4c729b051a3bb1f
Binary files /dev/null and b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/EntityCreator.class differ
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/ServerGeneric.class b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/ServerGeneric.class
new file mode 100644
index 0000000000000000000000000000000000000000..d18e66dbc7c39b9ae85af6d3249268a450b4156b
Binary files /dev/null and b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/ServerGeneric.class differ
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/TestAssembly.class b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/TestAssembly.class
new file mode 100644
index 0000000000000000000000000000000000000000..1f69eea93b9c735d4496bb4a13bf8a50cc5ebbdd
Binary files /dev/null and b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/TestAssembly.class differ
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/TwoTypeServer.class b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/TwoTypeServer.class
new file mode 100644
index 0000000000000000000000000000000000000000..32f3485bc9e6513c0d997c15cd18decc559504cb
Binary files /dev/null and b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/TwoTypeServer.class differ
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/TwoTypeServerAssembly.class b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/TwoTypeServerAssembly.class
new file mode 100644
index 0000000000000000000000000000000000000000..891976c4198510717712fc7952b01b4c56cc07cd
Binary files /dev/null and b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/TwoTypeServerAssembly.class differ
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/ArrivalProcess.java b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/ArrivalProcess.java
new file mode 100644
index 0000000000000000000000000000000000000000..e581c58add42865e05f6c076f206ac1cebcfd8a2
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/ArrivalProcess.java
@@ -0,0 +1,72 @@
+package examples;
+
+// Standard library imports
+import java.util.*;
+
+// Application specific imports
+import simkit.*;
+import simkit.random.*;
+
+public class ArrivalProcess extends SimEntityBase {
+
+    /* Simulation Parameters */
+
+    /**  */
+    private simkit.random.RandomVariate interarrivalTime;
+
+    /* Simulation State Variables */
+
+    /**  */
+    protected int numberArrivals;
+
+    @viskit.ParameterMap (
+        names = {"interarrivalTime"},
+        types = {"simkit.random.RandomVariate"}
+    )
+
+    /** Creates a new default instance of ArrivalProcess */
+    public ArrivalProcess() {
+    }
+
+    public ArrivalProcess(simkit.random.RandomVariate interarrivalTime) {
+        setInterarrivalTime(interarrivalTime);
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+    }
+
+    /** Bootstraps the first simulation event */
+    public void doRun() {
+
+        waitDelay("Arrival", interarrivalTime.generate(), Priority.DEFAULT);
+    }
+
+    public void doArrival() {
+
+        /* StateTransition for numberArrivals */
+        int _old_NumberArrivals = getNumberArrivals();
+        numberArrivals = numberArrivals + 1;
+        firePropertyChange("numberArrivals", _old_NumberArrivals, getNumberArrivals());
+
+        waitDelay("Arrival", interarrivalTime.generate(), Priority.DEFAULT);
+    }
+
+    public final void setInterarrivalTime(simkit.random.RandomVariate interarrivalTime) {
+        this.interarrivalTime = interarrivalTime;
+    }
+
+    public simkit.random.RandomVariate getInterarrivalTime() {
+        return interarrivalTime;
+    }
+
+    public int getNumberArrivals() {
+        return numberArrivals;
+    }
+
+    @Override
+    public String toString() {
+        return getName();
+    }
+}
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/EntityCreator.java b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/EntityCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..72fac7aaf60500597af6fa0d40c54d2b7d36b05b
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/EntityCreator.java
@@ -0,0 +1,42 @@
+package examples;
+
+// Standard library imports
+import java.util.*;
+
+// Application specific imports
+import simkit.*;
+import simkit.random.*;
+
+public class EntityCreator extends SimEntityBase {
+
+    /* Simulation Parameters */
+
+    /* None */
+
+    /* Simulation State Variables */
+
+    /* None */
+
+    @viskit.ParameterMap (
+        names = {},
+        types = {}
+    )
+
+    /** Creates a new default instance of EntityCreator */
+    public EntityCreator() {
+    }
+
+    public void doArrival() {
+
+        waitDelay("EntityArrival", 0.0, Priority.DEFAULT, (Object) new simkit.Entity());
+    }
+
+    public void doEntityArrival(simkit.Entity customer) {
+
+    }
+
+    @Override
+    public String toString() {
+        return getName();
+    }
+}
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/ServerGeneric.java b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/ServerGeneric.java
new file mode 100644
index 0000000000000000000000000000000000000000..294206dc6983676231769ffe4e07ad375dd9c353
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/ServerGeneric.java
@@ -0,0 +1,160 @@
+package examples;
+
+// Standard library imports
+import java.util.*;
+
+// Application specific imports
+import simkit.*;
+import simkit.random.*;
+
+public class ServerGeneric extends SimEntityBase {
+
+    /* Simulation Parameters */
+
+    /**  */
+    private int totalNumberServers;
+
+    /**  */
+    private simkit.random.RandomVariate serviceTimeGenerator;
+
+    /* Simulation State Variables */
+
+    /**  */
+    protected int numberAvailableServers;
+
+    /**  */
+    protected java.util.LinkedList<simkit.Entity> queue = new java.util.LinkedList<>();
+
+    /**  */
+    protected double delayInQueue;
+
+    /**  */
+    protected double timeInSystem;
+
+    @viskit.ParameterMap (
+        names = {"totalNumberServers",
+            "serviceTimeGenerator"},
+        types = {"int",
+            "simkit.random.RandomVariate"}
+    )
+
+    /** Creates a new default instance of ServerGeneric */
+    public ServerGeneric() {
+    }
+
+    public ServerGeneric(int totalNumberServers,
+            simkit.random.RandomVariate serviceTimeGenerator) {
+        setTotalNumberServers(totalNumberServers);
+        setServiceTimeGenerator(serviceTimeGenerator);
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        numberAvailableServers = totalNumberServers;
+        queue = new java.util.LinkedList<simkit.Entity>();
+    }
+
+    /** Bootstraps the first simulation event */
+    public void doRun() {
+
+        firePropertyChange("numberAvailableServers", getNumberAvailableServers());
+        firePropertyChange("queue", getQueue());
+
+    }
+
+    public void doArrival(simkit.Entity customer) {
+
+        /* Code insertion for Event Arrival */
+        customer.stampTime();
+        /* End Code insertion */
+
+        /* StateTransition for queue */
+        java.util.LinkedList<simkit.Entity> _old_Queue = getQueue();
+        queue.add(customer);
+        firePropertyChange("queue", _old_Queue, getQueue());
+
+        if (numberAvailableServers > 0) {
+            waitDelay("StartService", 0.0, Priority.HIGH);
+        }
+    }
+
+    public void doStartService() {
+
+        /* Code insertion for Event StartService */
+        Entity customer = queue.getFirst();
+        /* End Code insertion */
+
+        /* StateTransition for numberAvailableServers */
+        int _old_NumberAvailableServers = getNumberAvailableServers();
+        numberAvailableServers = numberAvailableServers - 1;
+        firePropertyChange("numberAvailableServers", _old_NumberAvailableServers, getNumberAvailableServers());
+
+        /* StateTransition for queue */
+        java.util.LinkedList<simkit.Entity> _old_Queue = getQueue();
+        queue.removeFirst();
+        firePropertyChange("queue", _old_Queue, getQueue());
+
+        /* StateTransition for delayInQueue */
+        double _old_DelayInQueue = getDelayInQueue();
+        delayInQueue = customer.getElapsedTime();
+        firePropertyChange("delayInQueue", _old_DelayInQueue, getDelayInQueue());
+
+        waitDelay("EndService", serviceTimeGenerator.generate(), Priority.DEFAULT, (Object) customer);
+    }
+
+    public void doEndService(simkit.Entity customer) {
+
+        /* StateTransition for numberAvailableServers */
+        int _old_NumberAvailableServers = getNumberAvailableServers();
+        numberAvailableServers = numberAvailableServers + 1;
+        firePropertyChange("numberAvailableServers", _old_NumberAvailableServers, getNumberAvailableServers());
+
+        /* StateTransition for timeInSystem */
+        double _old_TimeInSystem = getTimeInSystem();
+        timeInSystem = customer.getElapsedTime();
+        firePropertyChange("timeInSystem", _old_TimeInSystem, getTimeInSystem());
+
+        if (queue.size() > 0) {
+            waitDelay("StartService", 0.0, Priority.HIGH);
+        }
+    }
+
+    public final void setTotalNumberServers(int totalNumberServers) {
+        this.totalNumberServers = totalNumberServers;
+    }
+
+    public int getTotalNumberServers() {
+        return totalNumberServers;
+    }
+
+    public final void setServiceTimeGenerator(simkit.random.RandomVariate serviceTimeGenerator) {
+        this.serviceTimeGenerator = serviceTimeGenerator;
+    }
+
+    public simkit.random.RandomVariate getServiceTimeGenerator() {
+        return serviceTimeGenerator;
+    }
+
+    public int getNumberAvailableServers() {
+        return numberAvailableServers;
+    }
+
+    @SuppressWarnings("unchecked")
+    public java.util.LinkedList<simkit.Entity> getQueue() {
+        return (java.util.LinkedList<simkit.Entity>) queue.clone();
+    }
+
+    public double getDelayInQueue() {
+        return delayInQueue;
+    }
+
+    public double getTimeInSystem() {
+        return timeInSystem;
+    }
+
+    @Override
+    public String toString() {
+        return getName();
+    }
+}
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/TestAssembly.java b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/TestAssembly.java
new file mode 100644
index 0000000000000000000000000000000000000000..17f6b479833267663c4879963f18cf504f27c4e8
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/TestAssembly.java
@@ -0,0 +1,106 @@
+package examples;
+
+public class TestAssembly extends viskit.assembly.ViskitAssembly {
+
+    public TestAssembly() {
+        super();
+        setStopTime(100.0);
+        setVerbose(false);
+        setNumberReplications(1);
+        setPrintReplicationReports(true);
+        setPrintSummaryReport(true);
+        setSaveReplicationData(false);
+    }
+
+    @Override
+    protected void createSimEntities() {
+
+        addSimEntity( "arrivalProcess",
+            new examples.ArrivalProcess(
+                simkit.random.RandomVariateFactory.getInstance(
+                    "Exponential",
+                    1.6
+                )
+            )
+        );
+
+        addSimEntity( "twoTypeServer",
+            new examples.TwoTypeServer(
+                1,
+                2,
+                simkit.random.RandomVariateFactory.getInstance(
+                    "Exponential",
+                    0.9
+                ),
+                simkit.random.RandomVariateFactory.getInstance(
+                    "Exponential",
+                    1.2
+                )
+            )
+        );
+
+        addAdapter("adptr", "Arrival", "Arrival", "arrivalProcess", "twoTypeServer");
+
+        super.createSimEntities();
+    }
+
+    @Override
+    public void createPropertyChangeListeners() {
+        addPropertyChangeListenerConnection("numAvailServerAStat", "numberAvailableServersA", "twoTypeServer");
+
+        addPropertyChangeListenerConnection("queueStat", "queue", "twoTypeServer");
+
+        addPropertyChangeListenerConnection("numAvailServerBStat", "numberAvailableServersB", "twoTypeServer");
+
+        super.createPropertyChangeListeners();
+    }
+
+    @Override
+    public void createReplicationStats() {
+        addReplicationStats("numAvailServerAStat",
+            new simkit.stat.SimpleStatsTimeVarying(
+                "numberAvailableServersA"
+            )
+        );
+
+        addReplicationStatsListenerConnection("numAvailServerAStat", "numberAvailableServersA", "twoTypeServer");
+
+        addReplicationStats("queueStat",
+            new simkit.stat.SimpleStatsTimeVarying(
+                "queue"
+            )
+        );
+
+        addReplicationStatsListenerConnection("queueStat", "queue", "twoTypeServer");
+
+        addReplicationStats("numAvailServerBStat",
+            new simkit.stat.SimpleStatsTimeVarying(
+                "numberAvailableServersB"
+            )
+        );
+
+        addReplicationStatsListenerConnection("numAvailServerBStat", "numberAvailableServersB", "twoTypeServer");
+
+        super.createReplicationStats();
+    }
+
+    @Override
+    public void createDesignPointStats() {
+        super.createDesignPointStats();
+    }
+
+    @Override
+    public void printInfo() {
+        System.out.println();
+        System.out.println("Entity Details");
+        System.out.println("--------------");
+        System.out.println(getSimEntityByName("arrivalProcess"));
+        System.out.println(getSimEntityByName("twoTypeServer"));
+        System.out.println("--------------");
+    }
+
+    public static void main(String[] args) {
+        TestAssembly testAssembly = new TestAssembly();
+        new Thread(testAssembly).start();
+    }
+}
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/TwoTypeServer.java b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/TwoTypeServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..b0465276cef6b56f2fe773c019d77b1304ba6263
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/TwoTypeServer.java
@@ -0,0 +1,196 @@
+package examples;
+
+// Standard library imports
+import java.util.*;
+
+// Application specific imports
+import simkit.*;
+import simkit.random.*;
+
+public class TwoTypeServer extends SimEntityBase {
+
+    /* Simulation Parameters */
+
+    /**  */
+    private int numberServersA;
+
+    /**  */
+    private int numberServersB;
+
+    /**  */
+    private simkit.random.RandomVariate serviceTimeA;
+
+    /**  */
+    private simkit.random.RandomVariate serviceTimeB;
+
+    /* Simulation State Variables */
+
+    /**  */
+    protected int numberAvailableServersA;
+
+    /**  */
+    protected int numberAvailableServersB;
+
+    /**  */
+    protected int queue;
+
+    @viskit.ParameterMap (
+        names = {"numberServersA",
+            "numberServersB",
+            "serviceTimeA",
+            "serviceTimeB"},
+        types = {"int",
+            "int",
+            "simkit.random.RandomVariate",
+            "simkit.random.RandomVariate"}
+    )
+
+    /** Creates a new default instance of TwoTypeServer */
+    public TwoTypeServer() {
+    }
+
+    public TwoTypeServer(int numberServersA,
+            int numberServersB,
+            simkit.random.RandomVariate serviceTimeA,
+            simkit.random.RandomVariate serviceTimeB) {
+        setNumberServersA(numberServersA);
+        setNumberServersB(numberServersB);
+        setServiceTimeA(serviceTimeA);
+        setServiceTimeB(serviceTimeB);
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        numberAvailableServersA = getNumberServersA();
+        numberAvailableServersB = getNumberServersB();
+        queue = 0;
+    }
+
+    /** Bootstraps the first simulation event */
+    public void doRun() {
+
+        firePropertyChange("numberAvailableServersA", getNumberAvailableServersA());
+        firePropertyChange("numberAvailableServersB", getNumberAvailableServersB());
+        firePropertyChange("queue", getQueue());
+
+    }
+
+    public void doArrival() {
+
+        /* StateTransition for queue */
+        int _old_Queue = getQueue();
+        queue = queue + 1;
+        firePropertyChange("queue", _old_Queue, getQueue());
+
+        if (getNumberAvailableServersA() > 0) {
+            waitDelay("StartServiceA", 0.0, Priority.DEFAULT);
+        }
+        if (getNumberAvailableServersA() == 0 && getNumberAvailableServersB() > 0) {
+            waitDelay("StartServiceB", 0.0, Priority.DEFAULT);
+        }
+    }
+
+    public void doStartServiceA() {
+
+        /* StateTransition for numberAvailableServersA */
+        int _old_NumberAvailableServersA = getNumberAvailableServersA();
+        numberAvailableServersA = numberAvailableServersA - 1;
+        firePropertyChange("numberAvailableServersA", _old_NumberAvailableServersA, getNumberAvailableServersA());
+
+        /* StateTransition for queue */
+        int _old_Queue = getQueue();
+        queue = queue - 1;
+        firePropertyChange("queue", _old_Queue, getQueue());
+
+        waitDelay("EndServiceA", serviceTimeA.generate(), Priority.DEFAULT);
+    }
+
+    public void doStartServiceB() {
+
+        /* StateTransition for numberAvailableServersB */
+        int _old_NumberAvailableServersB = getNumberAvailableServersB();
+        numberAvailableServersB = numberAvailableServersB - 1;
+        firePropertyChange("numberAvailableServersB", _old_NumberAvailableServersB, getNumberAvailableServersB());
+
+        /* StateTransition for queue */
+        int _old_Queue = getQueue();
+        queue = queue - 1;
+        firePropertyChange("queue", _old_Queue, getQueue());
+
+        waitDelay("EndServiceB", serviceTimeB.generate(), Priority.DEFAULT);
+    }
+
+    public void doEndServiceA() {
+
+        /* StateTransition for numberAvailableServersA */
+        int _old_NumberAvailableServersA = getNumberAvailableServersA();
+        numberAvailableServersA = numberAvailableServersA + 1;
+        firePropertyChange("numberAvailableServersA", _old_NumberAvailableServersA, getNumberAvailableServersA());
+
+        if (queue > 0) {
+            waitDelay("StartServiceA", 0.0, Priority.HIGH);
+        }
+    }
+
+    public void doEndServiceB() {
+
+        /* StateTransition for numberAvailableServersB */
+        int _old_NumberAvailableServersB = getNumberAvailableServersB();
+        numberAvailableServersB = numberAvailableServersB + 1;
+        firePropertyChange("numberAvailableServersB", _old_NumberAvailableServersB, getNumberAvailableServersB());
+
+        if (queue > 0) {
+            waitDelay("StartServiceB", 0.0, Priority.HIGH);
+        }
+    }
+
+    public final void setNumberServersA(int numberServersA) {
+        this.numberServersA = numberServersA;
+    }
+
+    public int getNumberServersA() {
+        return numberServersA;
+    }
+
+    public final void setNumberServersB(int numberServersB) {
+        this.numberServersB = numberServersB;
+    }
+
+    public int getNumberServersB() {
+        return numberServersB;
+    }
+
+    public final void setServiceTimeA(simkit.random.RandomVariate serviceTimeA) {
+        this.serviceTimeA = serviceTimeA;
+    }
+
+    public simkit.random.RandomVariate getServiceTimeA() {
+        return serviceTimeA;
+    }
+
+    public final void setServiceTimeB(simkit.random.RandomVariate serviceTimeB) {
+        this.serviceTimeB = serviceTimeB;
+    }
+
+    public simkit.random.RandomVariate getServiceTimeB() {
+        return serviceTimeB;
+    }
+
+    public int getNumberAvailableServersA() {
+        return numberAvailableServersA;
+    }
+
+    public int getNumberAvailableServersB() {
+        return numberAvailableServersB;
+    }
+
+    public int getQueue() {
+        return queue;
+    }
+
+    @Override
+    public String toString() {
+        return getName();
+    }
+}
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/TwoTypeServerAssembly.java b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/TwoTypeServerAssembly.java
new file mode 100644
index 0000000000000000000000000000000000000000..127a9cdf783ffb99e33d4589d25905432dbf444c
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/src/examples/TwoTypeServerAssembly.java
@@ -0,0 +1,108 @@
+package examples;
+
+public class TwoTypeServerAssembly extends viskit.assembly.ViskitAssembly {
+
+    public TwoTypeServerAssembly() {
+        super();
+        setStopTime(100.0);
+        setVerbose(false);
+        setNumberReplications(1);
+        setPrintReplicationReports(true);
+        setPrintSummaryReport(true);
+        setSaveReplicationData(false);
+    }
+
+    @Override
+    protected void createSimEntities() {
+
+        addSimEntity( "arrivalProcess",
+            new examples.ArrivalProcess(
+                simkit.random.RandomVariateFactory.getInstance(
+                    "Exponential",
+                    1.7
+                )
+            )
+        );
+
+        addSimEntity( "twoTypeServer",
+            new examples.TwoTypeServer(
+                1,
+                2,
+                simkit.random.RandomVariateFactory.getInstance(
+                    "Exponential",
+                    1.6
+                ),
+                simkit.random.RandomVariateFactory.getInstance(
+                    "Exponential",
+                    1.6
+                )
+            )
+        );
+
+        addAdapter("adptr_0", "Arrival", "Arrival", "arrivalProcess_0", "twoTypeServer_1");
+        addAdapter("adptr0", "Arrival", "Arrival", "arrivalProcess", "twoTypeServer");
+        addAdapter("adptr_1", "Arrival", "Arrival", "arrivalProcess", "twoTypeServer");
+
+        super.createSimEntities();
+    }
+
+    @Override
+    public void createPropertyChangeListeners() {
+        addPropertyChangeListenerConnection("numAvailServersBStat", "numberAvailableServersB", "twoTypeServer");
+
+        addPropertyChangeListenerConnection("numAvailServersAStat", "numberAvailableServersA", "twoTypeServer");
+
+        addPropertyChangeListenerConnection("numberInQueueStat", "queue", "twoTypeServer");
+
+        super.createPropertyChangeListeners();
+    }
+
+    @Override
+    public void createReplicationStats() {
+        addReplicationStats("numAvailServersAStat",
+            new simkit.stat.SimpleStatsTimeVarying(
+                "numberAvailableServersA"
+            )
+        );
+
+        addReplicationStatsListenerConnection("numAvailServersAStat", "numberAvailableServersA", "twoTypeServer");
+
+        addReplicationStats("numberInQueueStat",
+            new simkit.stat.SimpleStatsTimeVarying(
+                "queue"
+            )
+        );
+
+        addReplicationStatsListenerConnection("numberInQueueStat", "queue", "twoTypeServer");
+
+        addReplicationStats("numAvailServersBStat",
+            new simkit.stat.SimpleStatsTimeVarying(
+                "numberAvailableServersB"
+            )
+        );
+
+        addReplicationStatsListenerConnection("numAvailServersBStat", "numberAvailableServersB", "twoTypeServer");
+
+        super.createReplicationStats();
+    }
+
+    @Override
+    public void createDesignPointStats() {
+        super.createDesignPointStats();
+    }
+
+    @Override
+    public void printInfo() {
+        System.out.println();
+        System.out.println("Entity Details");
+        System.out.println("--------------");
+        System.out.println(getSimEntityByName("arrivalProcess"));
+        System.out.println(getSimEntityByName("twoTypeServer"));
+        System.out.println("--------------");
+    }
+
+    public static void main(String[] args) {
+        TwoTypeServerAssembly twoTypeServerAssembly = new TwoTypeServerAssembly();
+        new Thread(twoTypeServerAssembly).start();
+    }
+}
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/viskitProject.xml b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/viskitProject.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6c7a80c56592bbedd169a0c1b229cebeccf07539
--- /dev/null
+++ b/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/viskitProject.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ViskitProject>
+  <AnalystReports name="AnalystReports" />
+  <AssembliesDirectory name="Assemblies" />
+  <EventGraphsDirectory name="EventGraphs" />
+  <BuildDirectory name="build">
+    <ClassesDirectory name="classes" />
+    <SourceDirectory name="src" />
+  </BuildDirectory>
+  <DistDirectory name="dist" />
+  <LibDirectory name="lib" />
+  <Project name="FinalProject" />
+  <Cached>
+    <EventGraphs class="/Users/terry/Downloads/FinalProject/build/classes/examples/TwoTypeServer.class" digest="-512d144abdf3a25c1fd0468cca19fbe6" xml="/Users/terry/Downloads/FinalProject/EventGraphs/examples/TwoTypeServer.xml" />
+    <EventGraphs class="C:/Users/advan/MyViskitProjects/FinalProject/build/classes/examples/TwoTypeServer.class" digest="5dde00358e407bfd4311883c8721b5e3" xml="C:/Users/advan/MyViskitProjects/FinalProject/EventGraphs/examples/TwoTypeServer.xml" />
+    <EventGraphs class="C:/Users/advan/MyViskitProjects/FinalProject/build/classes/examples/ArrivalProcess.class" digest="690320b04ecb012c8a9ca57e07351225" xml="C:/Users/advan/MyViskitProjects/FinalProject/EventGraphs/examples/ArrivalProcessTwo.xml" />
+    <EventGraphs class="C:/Users/advan/MyViskitProjects/FinalProject/build/classes/examples/ArrivalProcess.class" digest="2c654b4016e3310aea37d46120d91c16" xml="C:/Users/advan/Netbeans/NetworkedGraphicsMV3500/viskit/MyViskitProjects/DefaultProject/EventGraphs/examples/ArrivalProcess.xml" />
+    <EventGraphs class="C:/Users/advan/MyViskitProjects/FinalProject/build/classes/examples/EntityCreator.class" digest="7020026ff300a02fa0ca78b16afd0a77" xml="C:/Users/advan/Netbeans/NetworkedGraphicsMV3500/viskit/MyViskitProjects/DefaultProject/EventGraphs/examples/EntityCreator.xml" />
+    <EventGraphs class="C:/Users/advan/MyViskitProjects/FinalProject/build/classes/examples/ServerGeneric.class" digest="256ca2b5c866392a6c42353961b30c1a" xml="C:/Users/advan/Netbeans/NetworkedGraphicsMV3500/viskit/MyViskitProjects/DefaultProject/EventGraphs/examples/ServerGeneric.xml" />
+    <EventGraphs class="C:/Users/advan/MyViskitProjects/FinalProject/build/classes/examples/ArrivalProcess.class" digest="690320b04ecb012c8a9ca57e07351225" xml="C:/Users/advan/MyViskitProjects/FinalProject/EventGraphs/examples/ArrivalProcess.xml" />
+    <EventGraphs class="C:/Users/advan/MyViskitProjects/FinalProject/build/classes/examples/TwoTypeServer.class" digest="5dde00358e407bfd4311883c8721b5e3" xml="C:/Users/advan/MyViskitProjects/FinalProject/EventGraphs/examples/TwoTypeServer.xml" />
+    <EventGraphs class="C:/Users/advan/Netbeans/NetworkedGraphicsMV3500/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/ArrivalProcess.class" digest="690320b04ecb012c8a9ca57e07351225" xml="C:/Users/advan/Netbeans/NetworkedGraphicsMV3500/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/ArrivalProcess.xml" />
+    <EventGraphs class="C:/Users/advan/Netbeans/NetworkedGraphicsMV3500/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/ArrivalProcess.class" digest="690320b04ecb012c8a9ca57e07351225" xml="C:/Users/advan/Netbeans/NetworkedGraphicsMV3500/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/ArrivalProcessTwo.xml" />
+    <EventGraphs class="C:/Users/advan/Netbeans/NetworkedGraphicsMV3500/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/build/classes/examples/TwoTypeServer.class" digest="5dde00358e407bfd4311883c8721b5e3" xml="C:/Users/advan/Netbeans/NetworkedGraphicsMV3500/assignments/src/MV3500Cohort2024JulySeptember/projects/Yu/MyViskitProjects/FinalProject/EventGraphs/examples/TwoTypeServer.xml" />
+  </Cached>
+</ViskitProject>
+