Great job! I triied the same thing a few months ago and I'd never know it could be done so nicely with GameScenes.onGameSceneLoadRequested() and GamePersistence.SaveGame(). Here is my code: using System; using System.IO; using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Text.RegularExpressions; using UnityEngine; namespace Zaky_Inc { [KSPAddonFixed(KSPAddon.Startup.MainMenu, true, typeof(SaveBackup))] class SaveBackup : MonoBehaviour { private static string saveFileName = @"persistent.sfs"; private static string savePath = KSPUtil.ApplicationRootPath + @"saves/"; private static int backupNum = getBackupNum(Assembly.GetExecutingAssembly().Location); private static List<string> gameList = new List<string>(); // get the maximum number of backups, by reading the first number appeared in the name of the dll file, which defined this class // the number of backups is restricted to [5,20], with a default value = 5 private static int getBackupNum(string assemblyPath) { const int minBackupNum = 5; const int maxBackupNum = 20; string fileName = Path.GetFileName(assemblyPath); var numPattern = new Regex(@"\d+"); int backupNum = 5; Match match; if ((match = numPattern.Match(fileName)).Success) backupNum = Convert.ToInt32(match.Value); if (backupNum < minBackupNum) backupNum = minBackupNum; if (backupNum > maxBackupNum) backupNum = maxBackupNum; return backupNum; } private static string[] getOldBackups(string[] paths) { string[] oldBackups; if (paths.Length > backupNum) oldBackups = paths.OrderBy(p => File.GetCreationTime(p)).Take(paths.Length - backupNum).ToArray(); else oldBackups = new string[] {}; return oldBackups; } private static string toProperString(DateTime time) { return time.ToString("yyyy-MM-dd_HH-mm-ss-ff"); } void Awake() { MonoBehaviour.DontDestroyOnLoad(this); Debug.Log("[" + this.name + "] No." + this.GetInstanceID() + " is successfully launched.\n" + "Current maximum number of backups is " + backupNum + ".\n"); } void OnLevelWasLoaded(int scene) { if (scene == (int)GameScenes.SPACECENTER && !gameList.Contains(HighLogic.CurrentGame.Title)) { gameList.Add(String.Copy(HighLogic.CurrentGame.Title)); backUpSaveFile(); } } void backUpSaveFile() { string saveFolder = HighLogic.SaveFolder; string currentSaveDir = savePath + saveFolder + "/"; string[] existingBackups; string currentBackup = ""; Debug.Log("[" + this.name + "] No." + this.GetInstanceID() + " is copying save files..."); if (File.Exists(currentSaveDir + saveFileName)) { currentBackup = currentSaveDir + saveFileName + ".backup." + toProperString(DateTime.Now); if (!File.Exists(currentBackup)) File.Copy(currentSaveDir + saveFileName, currentBackup); existingBackups = Directory.GetFiles(currentSaveDir, "*.backup.*"); foreach (string oldBackup in getOldBackups(existingBackups)) { File.Delete(oldBackup); } } Debug.Log("[" + this.name + "] No." + this.GetInstanceID() + ": backup accomplished."); } } }