private Boolean CreateAlarmRepeats(KACAlarm alarmToCheck, out KACAlarm alarmToAdd)
        {
            if (alarmToCheck.RepeatAlarm){
                if (alarmToCheck.TypeOfAlarm == KACAlarm.AlarmTypeEnum.TransferModelled)
                {
                    try
                    {
                        LogFormatted("Adding repeat alarm for ({0}->{1})", alarmToCheck.XferOriginBodyName, alarmToCheck.XferTargetBodyName);
                        //find the next transfer from the modelled data
                        KACXFerModelPoint tmpModelPoint = KACResources.lstXferModelPoints.FirstOrDefault(
                                   m => FlightGlobals.Bodies[m.Origin].bodyName == alarmToCheck.XferOriginBodyName &&
                                       FlightGlobals.Bodies[m.Target].bodyName == alarmToCheck.XferTargetBodyName &&
                                       m.UT > alarmToCheck.AlarmTime.UT + alarmToCheck.AlarmMarginSecs);

                        if (tmpModelPoint != null)
                        {
                            KSPDateTime XferNextTargetEventTime = new KSPDateTime(tmpModelPoint.UT);

                            if (!alarms.Any(a => a.TypeOfAlarm == KACAlarm.AlarmTypeEnum.TransferModelled &&
                                            a.XferOriginBodyName == alarmToCheck.XferOriginBodyName &&
                                            a.XferTargetBodyName == alarmToCheck.XferTargetBodyName &&
                                            a.AlarmTime.UT == tmpModelPoint.UT))
                            {
                                alarmToAdd=alarmToCheck.Duplicate(XferNextTargetEventTime.UT - alarmToCheck.AlarmMarginSecs);
                                return true;
                            }
                            else
                            {
                                LogFormatted("Alarm already exists, not adding repeat({0}->{1}): UT={2}", alarmToCheck.XferOriginBodyName, alarmToCheck.XferTargetBodyName, XferNextTargetEventTime.UT);
                            }
                        }
                        else
                        {
                            LogFormatted("Unable to find a future model data point for this transfer({0}->{1})", alarmToCheck.XferOriginBodyName, alarmToCheck.XferTargetBodyName);
                        }

                    }
                    catch (Exception ex)
                    {
                        LogFormatted("Unable to find a future model data point for this transfer({0}->{1})\r\n{2}", alarmToCheck.XferOriginBodyName, alarmToCheck.XferTargetBodyName, ex.Message);
                    }
                }
                else if (alarmToCheck.TypeOfAlarm == KACAlarm.AlarmTypeEnum.Apoapsis || alarmToCheck.TypeOfAlarm == KACAlarm.AlarmTypeEnum.Periapsis)
                {
                    try
                    {
                        Vessel v = FindVesselForAlarm(alarmToCheck);

                        if(v == null)
                        {
                            LogFormatted("Unable to find the vessel to work out the repeat ({0})", alarmToCheck.VesselID);
                        }
                        else
                        {

                            LogFormatted("Adding repeat alarm for Ap/Pe ({0})", alarmToCheck.VesselID);

                            //get the time of the next node if the margin is greater than 0
                            Double nextApPe = Planetarium.GetUniversalTime() + v.orbit.timeToAp + (alarmToCheck.AlarmMarginSecs>0?v.orbit.period:0);
                            if (alarmToCheck.TypeOfAlarm == KACAlarm.AlarmTypeEnum.Periapsis)
                                nextApPe = Planetarium.GetUniversalTime() + v.orbit.timeToPe + +(alarmToCheck.AlarmMarginSecs > 0 ? v.orbit.period : 0);

                            if (!alarms.Any(a => a.TypeOfAlarm == alarmToCheck.TypeOfAlarm &&
                                    a.AlarmTime.UT == nextApPe))
                            {
                                alarmToAdd = alarmToCheck.Duplicate(nextApPe);
                                return true;
                            }
                            else
                            {
                                LogFormatted("Alarm already exists, not adding repeat ({0}): UT={1}", alarmToCheck.VesselID, nextApPe);
                            }

                            alarmToAdd = alarmToCheck.Duplicate(nextApPe);
                            return true;
                        }

                    }
                    catch (Exception ex)
                    {
                        LogFormatted("Unable to add a repeat alarm ({0})\r\n{1}", alarmToCheck.VesselID, ex.Message);
                    }
                }
                else if (alarmToCheck.RepeatAlarmPeriod.UT > 0)
                {
                    LogFormatted("Adding repeat alarm for {0}:{1}-{2}+{3}", alarmToCheck.TypeOfAlarm, alarmToCheck.Name, alarmToCheck.AlarmTime.UT, alarmToCheck.RepeatAlarmPeriod.UT);
                    alarmToAdd = alarmToCheck.Duplicate(alarmToCheck.AlarmTime.UT + alarmToCheck.RepeatAlarmPeriod.UT);
                    return true;
                }
            }
            alarmToAdd = null;
            return false;
        }