diff --git a/models/Application_examples/ASPIRE_Competency_Assessment_Context.mp b/models/Application_examples/ASPIRE_Competency_Assessment_Context.mp
new file mode 100644
index 0000000000000000000000000000000000000000..cfbfec5199b45ea6f32f5ad71aef3bdf711b4e1b
--- /dev/null
+++ b/models/Application_examples/ASPIRE_Competency_Assessment_Context.mp
@@ -0,0 +1,334 @@
+/*┬────────────────────────────────────────────────────────┐
+│*│ ┌─[ Title and Authors ]──────────────────────────────┐ │
+│*│ │ ASPIRE Competency Assessment System                │ │
+│*│ │  Created by Madeline May and Matt Trice in July 2022.│ 
+│*│ │  Expanded by Kristin Giammarco in September 2022.  │ │
+│*│ └────────────────────────────────────────────────────┘ │
+│*│                                                        │
+│*│ ┌─[ Purpose ]────────────────────────────────────────┐ │
+│*│ │ To show the fundamental goal of the VA NAII All    │ │
+│*│ │ Services Personnel and Institutional Readiness     │ │ 
+│*│ │ Engine (ASPIRE), which is to assess the AI         │ │ 
+│*│ │ competencies of current and would-be personnel     │ │  
+│*│ │ across governmental organizations to allow for     │ │ 
+│*│ │ more efficient, effective, and secure operations.  │ │ 
+│*│ └────────────────────────────────────────────────────┘ │
+│*│                                                        │
+│*│ ┌─[ Description ]────────────────────────────────────┐ │
+│*│ │ This model demonstrates using MP to model the      │ │ 
+│*│ │ ASPIRE assessment system, which will employ a novel│ │ 
+│*│ │ common data model (CDM). The model accounts        │ │
+│*│ │ for interactions among employees, the ASPIRE system│ │ 
+│*│ │ and supervisors. In general, the goal of the model │ │ 
+│*│ │ is to ensure that the correct competency assessment│ │ 
+│*│ │ is made, the human-AI interaction is smooth, and   │ │ 
+│*│ │ the upskilling occurs completely and efficiently.  │ │ 
+│*│ └────────────────────────────────────────────────────┘ │
+│*│                                                        │
+│*│ ┌─[ Instructions ]───────────────────────────────────┐ │
+│*│ │ Run for Scopes 1, 2 and 3 to see traces involving  │ │
+│*│ │  1, 2, or 3 employees, respectively.               │ │
+│*│ ├─[ Run Statistics ]─────────────────────────────────┤ │
+│*│ │ Scope 1: 3 traces, trace gen in less than 1 sec.   │ │
+│*│ │ Scope 2: 7 traces, trace gen in less than 1 sec.   │ │
+│*│ │ Scope 3: 12 traces, trace gen in less than 1 sec.  │ │
+│*│ └────────────────────────────────────────────────────┘ │   
+└*┴───────────────────────────────────────────────────────*/
+
+
+SCHEMA Existence_of_Competency
+
+ROOT Employees: {+ Employee +};
+
+ Employee: 	enroll_in_ASPIRE
+			take_AI_Test
+    		[ 	receive_learning_pathway
+				complete_learning_pathway 	]
+;
+
+
+ROOT ASPIRE: 	{+ 	make_employee_file
+			 		add_employee_file_to_database
+			 		furnish_AI_competency_test
+			 		update_file 					+}
+ 		 		{+ check_database +}
+;
+
+	check_database: ( 	<<0.3>> employee_in_team_has_knowledge 				| 
+    	    			<<0.2>> NO_team_or_outside_employee_has_knowledge 		|
+    					<<0.5>> outside_employee_has_knowledge					)
+
+					send_personnel_report
+					[ 	create_learning_pathway
+						furnish_learning_pathway
+						update_employee_file
+						send_updated_report 		]
+	; 
+
+ROOT Supervisor:	identify_tasked_demand
+    			 	query_ASPIRE_about_competency    			
+				 	receive_report
+				 	[ ( 	directs_internal_employee_upskilling
+							receive_updated_report 					|
+                    
+					 	push_transfer 								)  ]
+
+					 meet_demand_fill_team_gap
+;
+
+COORDINATE $x: enroll_in_ASPIRE, $y: make_employee_file
+	DO ADD $x PRECEDES $y; OD;
+
+COORDINATE $x: query_ASPIRE_about_competency
+	DO COORDINATE $y: check_database
+		DO ADD $x PRECEDES $y; OD;
+	OD;
+
+COORDINATE $x: furnish_AI_competency_test, $y: take_AI_Test
+	DO ADD $x PRECEDES $y; OD;
+
+COORDINATE $x: take_AI_Test, $y: update_file
+	DO ADD $x PRECEDES $y; OD;
+
+COORDINATE $x: send_personnel_report, $y: receive_report
+	DO ADD $x PRECEDES $y; OD;
+
+COORDINATE $x: NO_team_or_outside_employee_has_knowledge, $y: create_learning_pathway
+	DO ADD $x PRECEDES $y; OD;
+
+COORDINATE $x: furnish_learning_pathway, $y: receive_learning_pathway
+	DO ADD $x PRECEDES $y; OD;
+
+COORDINATE $x: complete_learning_pathway, $y: update_employee_file
+	DO ADD $x PRECEDES $y; OD;
+
+IF #NO_team_or_outside_employee_has_knowledge == 1 THEN
+	COORDINATE $x: directs_internal_employee_upskilling, $y: create_learning_pathway
+		DO ADD $x PRECEDES $y; OD;
+FI;
+
+COORDINATE $x: send_updated_report, $y: receive_updated_report
+	DO ADD $x PRECEDES $y; OD;
+
+IF #outside_employee_has_knowledge == 1 THEN
+	COORDINATE $x: receive_report, $y: push_transfer
+		DO ADD $x PRECEDES $y; OD;
+FI;
+
+
+/*We only push a transfer in the case where an outside employee has knowledge*/
+ENSURE #push_transfer == 1 <-> #outside_employee_has_knowledge == 1;
+
+
+IF #employee_in_team_has_knowledge > 0 THEN
+	SAY ("competency is found within the team"); 
+FI;
+
+IF #outside_employee_has_knowledge > 0 THEN
+	SAY ("competency is found in employee outside team"); 
+FI;
+
+IF #NO_team_or_outside_employee_has_knowledge > 0 THEN
+	SAY ("No employee has competency and upskilling through ASPIRE required"); 
+FI;
+
+
+/* event durations (hours) */
+
+COORDINATE 	$a: enroll_in_ASPIRE 							DO SET $a.duration  AT LEAST 0.34; OD;
+COORDINATE 	$a: make_employee_file 							DO SET $a.duration  AT LEAST 0.001; OD;
+COORDINATE 	$a: add_employee_file_to_database 				DO SET $a.duration  AT LEAST 0.001; OD;
+COORDINATE 	$a: furnish_AI_competency_test 				DO SET $a.duration  AT LEAST 0.001; OD;
+COORDINATE 	$a: take_AI_Test 								DO SET $a.duration  AT LEAST 1; OD;
+COORDINATE 	$a: update_file 								DO SET $a.duration  AT LEAST 0.001; OD;
+
+COORDINATE 	$a: identify_tasked_demand 						DO SET $a.duration  AT LEAST 2; OD;
+COORDINATE 	$a: query_ASPIRE_about_competency 				DO SET $a.duration  AT LEAST 0.25; OD;
+
+COORDINATE 	$a: send_personnel_report 						DO SET $a.duration  AT LEAST 0.01; OD;
+COORDINATE 	$a: send_updated_report 						DO SET $a.duration  AT LEAST 0.01; OD;
+
+COORDINATE 	$a: receive_report 								DO SET $a.duration  AT LEAST 0.25; OD;
+COORDINATE 	$a: receive_updated_report 						DO SET $a.duration  AT LEAST 0.25; OD;
+
+COORDINATE 	$a: directs_internal_employee_upskilling 		DO SET $a.duration  AT LEAST 0.25; OD;
+COORDINATE 	$a: create_learning_pathway 					DO SET $a.duration  AT LEAST 0.01; OD;
+COORDINATE 	$a: receive_learning_pathway 					DO SET $a.duration  AT LEAST 1; OD;
+COORDINATE 	$a: furnish_learning_pathway 					DO SET $a.duration  AT LEAST 0.001; OD;
+COORDINATE 	$a: complete_learning_pathway 					DO SET $a.duration  AT LEAST 40; OD;
+COORDINATE 	$a: update_employee_file 						DO SET $a.duration  AT LEAST 0.001; OD;
+
+COORDINATE 	$a: meet_demand_fill_team_gap 					DO SET $a.duration  AT LEAST 0.25; OD;
+COORDINATE 	$a: push_transfer 								DO SET $a.duration  AT LEAST 200; OD;
+
+/* --------- Build Gantt Charts on traces --------- */
+
+TABLE Gantt_Table{ 
+	TABS 	string event_name, 
+			number start_time, 
+			number duration_time;
+};
+	CLEAR Gantt_Table;
+
+BAR CHART Gantt_Chart { TITLE("Application Process Timeline (hours)");
+	FROM Gantt_Table;
+	X_AXIS event_name;
+	ROTATE; 
+};
+
+COORDINATE $e: $$EVENT
+	DO 	
+		IF $e.duration.largest > 0 THEN
+			Gantt_Table 		<|
+			event_name: 	SAY($e),
+			start_time: 	$e.start.smallest,
+			duration_time:  $e.duration.largest;
+		FI;
+	OD;
+
+SHOW Gantt_Chart;
+
+SAY("Trace " trace_id " Total Time: " THIS.duration/8 " days");
+
+/* ---- Accumulate data from traces for global reports ---- */
+
+ATTRIBUTES {number 	accumulated_max_duration,
+                    accumulated_min_duration,
+    				accumulated_durations,
+    				shortest_trace_id,
+    				longest_trace_id,
+    				trace_unique_id,
+    				trace_duration,
+    				weighted_duration,
+    				count;
+			bool 	d_max, d_min;
+			};
+
+/*  Find the longest trace */
+IF 	GLOBAL.accumulated_max_duration < THIS.duration.largest THEN
+	GLOBAL.accumulated_max_duration := THIS.duration.largest; 
+	GLOBAL.longest_trace_id := trace_id;
+FI;
+
+/*  Find the shortest trace */
+IF 	GLOBAL.accumulated_min_duration >= THIS.duration.smallest OR
+	GLOBAL.accumulated_min_duration == 0	THEN
+	GLOBAL.accumulated_min_duration := THIS.duration.smallest;
+	GLOBAL.shortest_trace_id := trace_id;
+FI;
+
+/* 	Find the total of all trace durations for the denominator of 
+	the average duration calculation */
+GLOBAL.accumulated_durations +:= THIS.duration.smallest;
+
+/*  Store trace duration data in a graph container for later 
+	accessing by GLOBAL section */
+GRAPH trace_data { };
+WITHIN trace_data{ 
+				Node$x: NEW(THIS.duration.smallest);
+				Node$x.trace_unique_id := trace_id;
+    			Node$x.trace_duration := THIS.duration.smallest;
+				}; 
+
+/* Create and print global reports */
+GLOBAL
+
+/* Create table summarizing trace data */
+
+TABLE trace_data_summary {
+TABS string     Trace_Number,
+     string     Trace_Probability,
+     string     Trace_Duration_hours,
+     number     Trace_Duration_days,
+     number     Weighted_Duration_days,
+     string		Maximum_Duration,
+     string		Minimum_Duration; };
+
+WITHIN trace_data{
+    FOR Node$x
+        DO 
+    	weighted_duration +:= 
+    		Node$x.trace_duration/8 * #$$TP(Node$x.trace_unique_id);
+    	IF Node$x.trace_duration == accumulated_max_duration 
+    		THEN d_max:= true; 
+    		ELSE d_max:= false; FI;
+    	IF Node$x.trace_duration == accumulated_min_duration 
+    		THEN d_min:= true; 
+    		ELSE d_min:= false; FI;
+    
+    	trace_data_summary     <| 
+                 Trace_Number:     		SAY( Node$x.trace_unique_id ),
+                 Trace_Probability: 		SAY( #$$TP(Node$x.trace_unique_id) ),
+    			 Trace_Duration_hours: 		SAY( Node$x ),
+        		 Trace_Duration_days: 		Node$x.trace_duration/8,
+    			 Weighted_Duration_days:	weighted_duration,
+    			 Maximum_Duration:			SAY( d_max ),
+    			 Minimum_Duration:			SAY( d_min );                                      
+        OD;
+};
+
+/* This table shows that there are 2 maximums and 1 minimum. */
+SHOW trace_data_summary;
+
+
+/* Create summary report */
+
+REPORT Duration_Statistics_Report {
+    		TITLE ("Scope "$$scope" Duration Statistics"); };
+
+SAY("There are " #$$TRACE " traces total." )
+			=> Duration_Statistics_Report;
+
+SAY ("Expected duration based on assigned trace probabilities is: "
+    	weighted_duration" days." )
+			=> Duration_Statistics_Report;
+
+SAY("Trace "longest_trace_id " has a max duration of " 
+    	accumulated_max_duration/8" days." ) 
+			=> Duration_Statistics_Report;
+
+SAY("Trace "shortest_trace_id " has a min duration of " 
+    	accumulated_min_duration/8" days." )
+			=> Duration_Statistics_Report;
+
+SHOW Duration_Statistics_Report;
+
+/* Create probability histogram */
+
+GRAPH trace_probability_histogram_data { };
+
+WITHIN trace_probability_histogram_data{
+    FOR Num$t: [1.. #$$TRACE] STEP 1 
+        DO FOR Num$n: [0 .. 1] STEP 0.1
+        	DO
+            	Node$x: LAST("[" Num$n ".." Num$n + 0.1 ")");        
+                	IF  ( Num$n <= #$$TP(Num$t) AND 
+                          #$$TP(Num$t) < Num$n + 0.1) OR
+                        ( #$$TRACE == 1 AND Num$n == 0.9 ) THEN 
+                     Node$x.count +:= 1;
+                    FI; 
+            OD;
+        OD;  
+}; 
+
+
+TABLE probability_histogram { TABS 	string     probability_interval,
+        						 	number     trace_count; 
+							};
+
+BAR CHART probability_chart { TITLE("Trace Probabilities");
+                              FROM		probability_histogram;
+                              X_AXIS 	probability_interval; 
+							};
+
+WITHIN trace_probability_histogram_data {
+    FOR Node$n
+        DO probability_histogram     <| 
+           		probability_interval:	SAY( Node$n ),
+           		trace_count:          	Node$n.count;                                         
+        OD;
+};
+
+SHOW probability_chart SORT;
+
+SHOW ACTIVITY DIAGRAM Employees, Employee, ASPIRE, Supervisor;