diff --git a/scripts/HTN/Trees/Red/ConvoyUnit.xml b/scripts/HTN/Trees/Red/ConvoyUnit.xml
index 09a952bcb9092bd3c5afdcbea7c3e3aa443f9413..1a11e24c5481727d8625a7761edd2e939bbd1b39 100644
--- a/scripts/HTN/Trees/Red/ConvoyUnit.xml
+++ b/scripts/HTN/Trees/Red/ConvoyUnit.xml
@@ -57,6 +57,7 @@ goalContainer.getCurrentExecutingStack().addReplanTrigger("GoalTracker_ConvoyRet
 goalContainer.getCurrentExecutingStack().addReplanTrigger("GoalTracker_ReturnCompleted")
 goalContainer.getCurrentExecutingStack().addReplanTrigger("GoalTracker_ConvoyPackUp")
 goalContainer.getCurrentExecutingStack().addReplanTrigger("GoalTracker_ConvoyPackUpComplete")
+goalContainer.getCurrentExecutingStack().addReplanTrigger("GoalTracker_ConvoyWaitAtBaseComplete")
 </Code>
       <Import />
     </HTNNode>
@@ -168,6 +169,8 @@ if state.isCommander():
           <Code IsFile="false">from HTNBehaviors import SendUnitEventDelay
 from HTNBehaviors import SendEntityEvent
 import cxxi.model.behavior.PythonUtilities as PythonUtilities
+from HTNBehaviors import SendEntityEventDelay
+from HTNBehaviors import ConvertToJavaList
 
 # used whenver the unit finishes moving (any move)
 borg.redConvoysWaiting[state.getCurrentUnit().getName()].remove(info.getMyAssignedName())
@@ -197,25 +200,48 @@ if len(borg.redConvoysWaiting[state.getCurrentUnit().getName()])==0:
 
         SendUnitEventDelay(state.getCurrentUnit().getName(), "GoalTracker_MoveToPoint", ["CONVOY", randSpd, destName], borg.delay)
         borg.delay=1.0
+        # log data 
+        SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "CONVOY_ARRIVED_AT_ASSEMBLY" "" ])], 0)
 
     elif moveReason == "CONVOY":
         # setup off road
-        cmdName=""
-        if state.isCommander():
-            cmdName = info.getMyAssignedName()
-        else:
-            cmdName = state.getCurrentCommander().getAssignedName()
+        destName = "EMPTY"
+        if len(borg.redConvoyDest[state.getCurrentUnit().getName()])&gt;0:
+            destName = borg.redConvoyDest[state.getCurrentUnit().getName()][0]
+#        printMessage("LOC:"+str(destName), True)
 
-        # calculate how long on station they should be
-        borg.redNumSetups[state.getCurrentUnitName()]=borg.params_redNumSetups
+        SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "CONVOY_ARRIVED" "" ])], 0.001)
 
-        SendEntityEvent(cmdName, "GoalTracker_ConvoySetup", [])
-        borg.delay=1.0
-        # log data 
-        if state.isCommander():
-            from HTNBehaviors import SendEntityEventDelay
-            from HTNBehaviors import ConvertToJavaList
-            SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "CONVOY_ARRIVED" "" ])], 0)
+        # note this assumes an ASSEMBLY_LOCATION has been inserted between each location
+        # also the head of the list is one location ahead hence we check the next location
+        # is an assembly location if we need to do setups here
+        if destName == "ASSEMBLY_LOCATION" or destName == "EMPTY":
+            cmdName=""
+            if state.isCommander():
+                cmdName = info.getMyAssignedName()
+            else:
+                cmdName = state.getCurrentCommander().getAssignedName()
+
+            # calculate how long on station they should be
+            borg.redNumSetups[state.getCurrentUnitName()]=borg.params_redNumSetups
+
+            SendEntityEvent(cmdName, "GoalTracker_ConvoySetup", [])
+
+        else:
+            # we're at an assembly location, just wait
+            cmdName=""
+            if state.isCommander():
+                cmdName = info.getMyAssignedName()
+            else:
+                cmdName = state.getCurrentCommander().getAssignedName()
+
+            # calculate how long we should wait
+            randVal = PythonUtilities._py_getRandomNumber("UNIFORM", [0.0, 1.0])
+            waitTime = borg.params_redWaitAtBaseForMin + (borg.params_redWaitAtBaseForVar * randVal)
+
+            SendEntityEventDelay(cmdName, "GoalTracker_ConvoyWaitAtBaseComplete", [], waitTime)
+            # log data 
+            SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "WAIT_AT_BASE" "" ])], 0.001)
 
 </Code>
           <Import />
@@ -429,6 +455,45 @@ if state.isCommander():
     from HTNBehaviors import SendEntityEventDelay
     from HTNBehaviors import ConvertToJavaList
     SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "PACKUP_COMPLETE" "" ])], 0)
+</Code>
+          <Import />
+        </HTNNode>
+      </HTNNode>
+      <HTNNode AllowMsg="true" Name="isGoalTracker_ConvoyWaitAtBaseComplete" Type="DEFAULT">
+        <Parent>isGoalTracker_ConvoyReturn</Parent>
+        <Code IsFile="false">if state.getLastTrigger() == "doGoalTracker_ConvoyWaitAtBaseComplete":
+	_htn_precon_ret=1
+</Code>
+        <Import />
+        <HTNNode AllowMsg="true" Name="waitComplete" Type="INTERRUPT">
+          <Parent>isGoalTracker_ConvoyPackUp</Parent>
+          <Code IsFile="false">import cxxi.model.behavior.PythonUtilities as PythonUtilities
+from HTNBehaviors import SendEntityEventDelay
+from HTNBehaviors import ConvertToJavaList
+
+# complete the wait process
+
+# reset the setup count
+borg.redUnitStatus[state.getCurrentUnitName()] = 0
+
+# go to next destination
+
+# get a random speed
+if borg.params_randSpdOverride &gt; 0:
+    randSpd = borg.params_randSpdOverride
+else:
+    randVal = PythonUtilities._py_getRandomNumber("UNIFORM", [0.0, 1.0])
+    randSpd = borg.params_randSpdMin + (borg.params_randSpdVar * randVal)
+
+destName = borg.redConvoyDest[state.getCurrentUnit().getName()][0]
+del borg.redConvoyDest[state.getCurrentUnit().getName()][0]
+
+SendUnitEventDelay(state.getCurrentUnit().getName(), "GoalTracker_MoveToPoint", ["CONVOY", randSpd, destName], borg.delay)
+borg.delay=1.0
+
+# log data 
+if state.isCommander():
+    SendEntityEventDelay(info.getMyAssignedName(), "GoalTracker_LogMsg", ["UnitLogger", "UNIT_NAME\tACTION\tDATA", ConvertToJavaList([ state.getCurrentUnitName(), "WAIT_AT_BASE_COMPLETE" "" ])], 0)
 </Code>
           <Import />
         </HTNNode>
diff --git a/scripts/jump_start.py b/scripts/jump_start.py
index 9e353e8d2c0bc395eff305997b73a4057ed4d5ed..cc3656cf88f3916c4be4af4614d9ef42c1d89b23 100644
--- a/scripts/jump_start.py
+++ b/scripts/jump_start.py
@@ -80,6 +80,10 @@ borg.params_useFakeConvoys = False
 # use random background traffic
 borg.params_useRandomMovers = False
 
+# how long to wait at base between training locations
+borg.params_redWaitAtBaseForMin = 120
+borg.params_redWaitAtBaseForVar = 0
+
 # this lets you set the number of destinations to use
 # if 0 it will be determined randomly how many to use
 # between 1 and 3