diff --git a/src/main.rs b/src/main.rs
index fd8b422..50cf3a2 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -15,10 +15,18 @@ struct Cli{
 
 #[derive(Subcommand)]
 enum Commands{
+	RepairPolicies(RepairPoliciesCommand),
 	Review(ReviewCommand),
 	UploadScripts(UploadScriptsCommand),
 }
 
+#[derive(Args)]
+struct RepairPoliciesCommand{
+	#[arg(long)]
+	session_id_file:PathBuf,
+	#[arg(long)]
+	api_url:String,
+}
 #[derive(Args)]
 struct ReviewCommand{
 	#[arg(long)]
@@ -38,6 +46,10 @@ struct UploadScriptsCommand{
 async fn main(){
 	let cli=Cli::parse();
 	match cli.command{
+		Commands::RepairPolicies(command)=>repair(RepairPoliciesConfig{
+			session_id:std::fs::read_to_string(command.session_id_file).unwrap(),
+			api_url:command.api_url,
+		}).await.unwrap(),
 		Commands::Review(command)=>review(ReviewConfig{
 			session_id:std::fs::read_to_string(command.session_id_file).unwrap(),
 			api_url:command.api_url,
@@ -419,3 +431,67 @@ async fn upload_scripts(config:UploadConfig)->Result<(),ScriptUploadError>{
 
 	Ok(())
 }
+
+#[allow(dead_code)]
+#[derive(Debug)]
+enum RepairPoliciesError{
+	Cookie(submissions_api::CookieError),
+	Reqwest(submissions_api::ReqwestError),
+	GetPolicies(submissions_api::Error),
+	GetScripts(submissions_api::types::SingleItemError),
+	UpdateScriptPolicy(submissions_api::Error),
+}
+
+struct RepairPoliciesConfig{
+	session_id:String,
+	api_url:String,
+}
+async fn repair(config:RepairPoliciesConfig)->Result<(),RepairPoliciesError>{
+	let cookie=submissions_api::Cookie::new(&config.session_id).map_err(RepairPoliciesError::Cookie)?;
+	let api=&submissions_api::external::Context::new(config.api_url,cookie).map_err(RepairPoliciesError::Reqwest)?;
+
+	const LIMIT:u32=100;
+	let mut page=1;
+	loop{
+		println!("Downloading page {page}...");
+		let policies=api.get_script_policies(submissions_api::types::GetScriptPoliciesRequest{
+			Page:page,
+			Limit:LIMIT,
+			FromScriptHash:None,
+			ToScriptID:None,
+			Policy:Some(submissions_api::types::Policy::Replace),
+		}).await.map_err(RepairPoliciesError::GetPolicies)?;
+
+		futures::stream::iter(policies.iter().map(Ok)).try_for_each_concurrent(REMOTE_CONCURRENCY,async|policy|{
+			let from_script=api.get_script_from_hash(submissions_api::types::HashRequest{
+				hash:policy.FromScriptHash.as_str(),
+			}).await.map_err(RepairPoliciesError::GetScripts)?;
+
+			if let Some(from_script)=from_script{
+				if policy.ToScriptID==from_script.ID{
+					// invalid policy.  Reset the policy to None
+					api.update_script_policy(submissions_api::types::UpdateScriptPolicyRequest{
+						ID:policy.ID,
+						FromScriptID:None,
+						ToScriptID:None,
+						Policy:Some(submissions_api::types::Policy::None),
+					}).await.map_err(RepairPoliciesError::UpdateScriptPolicy)?;
+					println!("Policy updated! {:?}",policy.ID);
+				}
+			}else{
+				println!("Script did not exist! hash={}",policy.FromScriptHash);
+			}
+			Ok(())
+		}).await?;
+
+		if policies.len()<LIMIT as usize{
+			// We scanned all policies
+			println!("Done!");
+			break;
+		}else{
+			page+=1;
+		}
+	}
+
+	Ok(())
+}