private static void initialize(){
            
            
            /*Initialize modules*/
            office 		= new Office();
            trackModelInterface = new TrackModelInterface2();
            trainModel          = new Vector();
            trainController     = new Vector();
            trainControllerUI   = new TrainControllerUI();
            mbo 		= new MovingBlockOverlayUI();
            ad                  = new McDsAd();

            /*Office Listeners*/
            addIncreaseClockSpeedListener(office.buttonIncreaseClockSpeed);
            addDecreaseClockSpeedListener(office.buttonDecreaseClockSpeed);
            addSpawnNewTrainListener(office.buttonGo);
            
            /*MBO Listeners*/
            addStartButtonListener(mbo.StartButton);
            
            /*Track Model Listeners*/
            addMovingListener(mbo.MovingBlockRadio);
            addFixedListener(mbo.FixedBlockRadio);
            
            
            
            

           ClockListener = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
            
            /*Advance clock by 1 tick*/
              minutes = minutes + (seconds / 60);
              seconds = seconds % 60;
              Office.textClock.setText(String.format("%d:%02d", minutes, seconds));
              seconds++;
              totalSeconds++;
              
            /*Calculate new train metrics*/
              TrainModel currentTrain;
              String station;
              double distToStation;
              double ctcSpeed = 0;
              mbo.updateTrainList(trainModel);
                       
              
              for(int i=0; i<numberOfTrains; i++){
                  currentTrain = trainModel.get(i);
                  
                  trainModel.get(0).updateFields();
                  /*Calculate Trains' new Speeds, Accelerations, Positions*/
                  currentTrain.update(totalSeconds);
                  
                  /*Update Track Model*/
                  trackModelInterface.getTrackModel().updateSpeed(currentTrain.getCurrentSpeed());
                  trackModelInterface.getTrackModel().updatePosition(currentTrain.getCurrentPosition());
                  trackModelInterface.getTrackModel().updateTrainId(currentTrain.getID());
                  trackModelInterface.getTrackModel().findBlockID();

                  
                  /*Calculate Trains' block position*/
                  currentTrain.updateBlockItems(trackModelInterface.getTrackModel().getBlockTrainIsOn(i+1));
                  
                  
                  /*Update MBO*/
                  mbo.updateSpeed(currentTrain.getCurrentSpeed());
                  mbo.updatePosition(currentTrain.getCurrentPosition());
                  mbo.updateBlockAuthority(trackModelInterface.getTrackModel().getNextStationDistance(currentTrain.getID()), i);
                  mbo.updateBlockSpeed(trackModelInterface.getTrackModel().getBlockTrainIsOn(currentTrain.getID()).getSpeedLimit(),i);
                  mbo.updatePassengerCount(trainModel.get(i).getPassengerCount(),i);
                  
                  
                  /*Update Office*/
                  Train.setSpeed(office.trainsOnTracks.get(i), currentTrain.getCurrentSpeed());
                  Train.setPosition(office.trainsOnTracks.get(i), currentTrain.getCurrentPosition());

                  Train.setAuthority(office.trainsOnTracks.get(i), mbo.getbauth(i));

                  /*Update Train Controllers*/
                  if(currentTrain.getNextStation() == null){
                      distToStation = trackModelInterface.getTrackModel().getNextStationDistance(currentTrain.getID());
                  } else{
                      distToStation = trackModelInterface.getTrackModel().getNextSpecificStationDistance(currentTrain.getID(), currentTrain.getNextStation());
                  }
                  
                  if(manValuesSent.get(i)){
                    System.out.println("SPEED: " + ctcManSpeed.get(i)+"\n\n\n");
                    trainController.get(i).setCtcAuthority(ctcManAuth.get(i));
                    trainController.get(i).setCtcSpeed(ctcManSpeed.get(i));
                  }else {
                    trainController.get(i).setCtcAuthority(distToStation);
                    ctcSpeed = Train.getSetRecommendedSpeed(office.trainsOnTracks.get(i), distToStation, 10);
                    trainController.get(i).setCtcSpeed(ctcSpeed);
                  }
                  
                  trainController.get(i).setSpeedLimit(currentTrain.getSpeedLimit());
                  trainController.get(i).setMboAuthority(mbo.getbauth(i));
                  trainController.get(i).setMboSpeed(mbo.getbspeed(i));
                  /*trainController.get(i).evaluateLights(false);
                  trainController.get(i).evaluateDoors(false);
                  trainController.get(i).evaluateEbrake();*/
                  trainController.get(i).update();
                  trainController.get(i).setNextStop( trackModelInterface.getTrackModel().getNextStationName(currentTrain.getID()));
                  if(trackModelInterface.getTrackModel().getBlockTrainIsOn(currentTrain.getID()).isStation())
                  {
                      int rand = randomGen.nextInt(3);
                      if(rand == 0){
                          ad.setAdToMcDs();
                          ad.setVisible(true);
                      }
                      if(rand == 1){
                          ad.setAdToPitt();
                          ad.setVisible(true);
                      }
                      if(rand == 2){
                          ad.setAdToTaco();
                          ad.setVisible(true);
                      }
                  }
                  if(trackModelInterface.getTrackModel().getBlockTrainIsOn(currentTrain.getID()).isStation())
                  {
                      numPassengers = randomGen.nextInt(222);
                      currentTrain.passengerCount = numPassengers;
                  }
                  
              }
              
              //trackModelInterface.getTrackModel().redraw();
              trainControllerUI.updateFields();              
              


            }
            };
           
         /*Start the Timer*/
           timer = new Timer(timerDelay, ClockListener);
           
	}