diff --git a/Actors/Amanda/Clothed_NoBondage_NoGag_Surrender.png b/Actors/Amanda/Clothed_NoBondage_NoGag_Surrender.png
new file mode 100644
index 0000000000..5de7d8eac8
Binary files /dev/null and b/Actors/Amanda/Clothed_NoBondage_NoGag_Surrender.png differ
diff --git a/Actors/Sarah/Clothed_NoBondage_NoGag_Surrender.png b/Actors/Sarah/Clothed_NoBondage_NoGag_Surrender.png
new file mode 100644
index 0000000000..fab3a64bb3
Binary files /dev/null and b/Actors/Sarah/Clothed_NoBondage_NoGag_Surrender.png differ
diff --git a/Backgrounds/Lockers.jpeg b/Backgrounds/Lockers.jpeg
new file mode 100644
index 0000000000..ea579e39fd
Binary files /dev/null and b/Backgrounds/Lockers.jpeg differ
diff --git a/C010_Revenge/AmandaSarah/Intro_EN.csv b/C010_Revenge/AmandaSarah/Intro_EN.csv
index 9ca36f9c35..1563369891 100644
--- a/C010_Revenge/AmandaSarah/Intro_EN.csv
+++ b/C010_Revenge/AmandaSarah/Intro_EN.csv
@@ -39,3 +39,6 @@ Stage,LoveReq,SubReq,VarReq,IntroText,Image
 250,0,0,,,LockersOpen.jpg
 260,0,0,,,LockersOpen.jpg
 300,0,0,,,LockersOpen.jpg
+400,0,0,,Miss!  Please!  We surrender!|How can you be so strong?,Lockers.jpg
+410,0,0,,,Lockers.jpg
+420,0,0,,,Lockers.jpg
diff --git a/C010_Revenge/AmandaSarah/LockersTwoOpen.jpg b/C010_Revenge/AmandaSarah/LockersTwoOpen.jpg
new file mode 100644
index 0000000000..430e26042a
Binary files /dev/null and b/C010_Revenge/AmandaSarah/LockersTwoOpen.jpg differ
diff --git a/C010_Revenge/AmandaSarah/Script.js b/C010_Revenge/AmandaSarah/Script.js
index fe0f11f76a..b0a1b00df1 100644
--- a/C010_Revenge/AmandaSarah/Script.js
+++ b/C010_Revenge/AmandaSarah/Script.js
@@ -6,6 +6,7 @@ var C010_Revenge_AmandaSarah_ItemStolen = false;
 var C010_Revenge_AmandaSarah_WasBelted = false;
 var C010_Revenge_AmandaSarah_MasturbateCount = 0;
 var C010_Revenge_AmandaSarah_IntroText = "";
+var C010_Revenge_AmandaSarah_AllowFight = true;
 
 // Chapter 10 - Amanda and Sarah Revenge Load
 function C010_Revenge_AmandaSarah_Load() {
@@ -34,8 +35,8 @@ function C010_Revenge_AmandaSarah_Run() {
 	// Build the text interactions
 	BuildInteraction(C010_Revenge_AmandaSarah_CurrentStage);
 
-	// Before 100 we don't show the player and the girls can leave
-	if (C010_Revenge_AmandaSarah_CurrentStage < 100) {
+	// Before 100 we don't show the player and the girls can leave, same for 400 or up
+	if ((C010_Revenge_AmandaSarah_CurrentStage < 100) || (C010_Revenge_AmandaSarah_CurrentStage >= 400)) {
 		if (!C010_Revenge_AmandaSarah_AmandaGone && !C010_Revenge_AmandaSarah_SarahGone) {
 			if (CurrentActor == "Amanda") {
 				DrawActor("Sarah", 800, 50, 0.8);
@@ -61,8 +62,8 @@ function C010_Revenge_AmandaSarah_Run() {
 		DrawActor("Player", 600, 0, 1.0);
 	}
 
-	// Between 170 and 190, Amanda & Sarah are leaning on the lockers
-	if (((C010_Revenge_AmandaSarah_CurrentStage >= 170) && (C010_Revenge_AmandaSarah_CurrentStage <= 190)) || (C010_Revenge_AmandaSarah_CurrentStage >= 210)) {
+	// Between 170 and 190, 210 and 300, Amanda & Sarah are leaning on the lockers
+	if (((C010_Revenge_AmandaSarah_CurrentStage >= 170) && (C010_Revenge_AmandaSarah_CurrentStage <= 190)) || ((C010_Revenge_AmandaSarah_CurrentStage >= 210) && (C010_Revenge_AmandaSarah_CurrentStage <= 300))) {
 		ActorSpecificSetPose("Amanda", "LeaningRight");
 		ActorSpecificSetPose("Sarah", "LeaningLeft");
 		DrawActor("Amanda", 475, 25, 0.8);
@@ -71,7 +72,7 @@ function C010_Revenge_AmandaSarah_Run() {
 	
 	// Between 170 and 180, draw the player in front of the locker, at 190 or more she's inside
 	if ((C010_Revenge_AmandaSarah_CurrentStage >= 170) && (C010_Revenge_AmandaSarah_CurrentStage <= 180)) DrawActor("Player", 600, 150, 1.0);
-	if (C010_Revenge_AmandaSarah_CurrentStage >= 190) DrawActor("Player", 690, 20, 0.75);
+	if ((C010_Revenge_AmandaSarah_CurrentStage >= 190) && (C010_Revenge_AmandaSarah_CurrentStage <= 300)) DrawActor("Player", 690, 20, 0.75);
 
 }
 
@@ -92,9 +93,9 @@ function C010_Revenge_AmandaSarah_Click() {
 
 // Chapter 10 - Amanda and Sarah Revenge - Switch the focus to another actor
 function C010_Revenge_AmandaSarah_SwitchFocus(ActorToFocus) {	
-	ActorSetPose("Angry");
+	if (C010_Revenge_AmandaSarah_CurrentStage < 400) ActorSetPose("Angry");
 	ActorLoad(ActorToFocus, "");
-	ActorSetPose("Furious");
+	if (C010_Revenge_AmandaSarah_CurrentStage < 400) ActorSetPose("Furious");
 	LeaveIcon = "";
 }
 
@@ -170,10 +171,45 @@ function C010_Revenge_AmandaSarah_StealItems() {
 	
 }
 
+// Chapter 10 - Amanda and Sarah Revenge - Recover the stolen items and clothes
+function C010_Revenge_AmandaSarah_RecoverItems() {
+	C010_Revenge_AmandaSarah_ItemStolen = false;
+	PlayerRestoreAllInventory();
+	CurrentTime = CurrentTime + 50000;
+	PlayerClothes("Clothed");
+}
+
 // Chapter 10 - Amanda and Sarah Revenge - Starts the fight 2 VS 1
 function C010_Revenge_AmandaSarah_StartFight() {
-	ActorSpecificChangeAttitude("Amanda", -2, 1);
-	ActorSpecificChangeAttitude("Sarah", -2, 1);
+		
+	// Sets the fight difficulty
+	var AmandaDifficulty = "Normal";
+	var SarahDifficulty = "Easy";
+	if (ActorSpecificGetValue("Amanda", ActorSubmission) < 0) AmandaDifficulty = "Hard";
+	if (ActorSpecificGetValue("Sarah", ActorSubmission) < 0) SarahDifficulty = "Normal";
+
+	// Launch the double fight
+	DoubleFightLoad("Amanda", AmandaDifficulty, "Punch", "Sarah", SarahDifficulty, "Punch", "Lockers", "C010_Revenge_AmandaSarah_EndFight");
+	
+}
+
+// Chapter 10 - Amanda and Sarah Revenge - When the fight ends
+function C010_Revenge_AmandaSarah_EndFight(Victory) {
+	
+	// Change the girls attitude depending on the victory or defeat
+	ActorSpecificChangeAttitude("Amanda", -2, Victory ? 2 : -2);
+	ActorSpecificChangeAttitude("Sarah", -2, Victory ? 2 : -2);
+	C010_Revenge_AmandaSarah_AllowFight = false;
+	
+	// On a victory, we jump to stage 400 right away, on a defeat, we show a custom text
+	if (Victory) {
+		ActorLoad("Amanda", "");
+		LeaveIcon = "";
+		ActorSpecificSetPose("Amanda", "Surrender");
+		ActorSpecificSetPose("Sarah", "Surrender");
+		C010_Revenge_AmandaSarah_CurrentStage = 400;
+	} else OverridenIntroText = GetText("FightDefeat" + C010_Revenge_AmandaSarah_CurrentStage.toString());
+
 }
 
 // Chapter 10 - Amanda and Sarah Revenge - When the player strips
diff --git a/C010_Revenge/AmandaSarah/Stage_EN.csv b/C010_Revenge/AmandaSarah/Stage_EN.csv
index a2e3e08e0c..942d0cf631 100644
--- a/C010_Revenge/AmandaSarah/Stage_EN.csv
+++ b/C010_Revenge/AmandaSarah/Stage_EN.csv
@@ -47,7 +47,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 60,0,0,,"Ok, but don't steal.|(Drop your items.)","Very good, and now you|will strip for us, get naked.",80,1,-1,StealItems()
 60,0,0,,Yes Miss.|(Drop your items.),"Good girl, and now you|will strip for us, get naked.",80,1,-2,StealItems()
 60,0,20,,Amanda.  Shut up|and kneel for me.,Errr...   What Miss?  Kneel?|(She blushes and seems confused.),71,0,0,"CalmDown(""Amanda"")"
-70,0,0,,You want to fight?|Then let's fight!,,70,0,0,StartFight()
+70,0,0,AllowFight,You want to fight?|Then let's fight!,,70,0,0,StartFight()
 70,0,0,,You'll pay later.|(Drop your items.),"Shut up and strip, get naked.",80,0,0,StealItems()
 70,0,0,,Ok but don't steal.|(Drop your items.),"Very good, and now you|will strip for us, get naked.",80,0,-1,StealItems()
 70,0,20,,Amanda.  Shut up|and kneel for me.,Errr...   What Miss?  Kneel?|(She blushes and seems confused.),71,0,0,"CalmDown(""Amanda"")"
@@ -68,7 +68,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 80,0,0,,You perverts!|I'm not stripping.,We're not asking you.  You will|strip up or we will beat you up.,90,-1,0,
 80,0,0,,Alright Miss.|(Strip naked.),Very good.  (They smile while you|strip in the empty school hall.),100,0,-1,PlayerStrip()
 80,0,0,,I guess it's fair.|(Strip naked.),Very fair.  (They smile while you|strip in the empty school hall.),100,1,-1,PlayerStrip()
-90,0,0,,You want to fight?|Then let's fight!,,90,0,0,StartFight()
+90,0,0,AllowFight,You want to fight?|Then let's fight!,,90,0,0,StartFight()
 90,0,0,,I'll get you later.|(Strip naked.),Shut up!  (They smile while you|strip in the empty school hall.),100,0,0,PlayerStrip()
 90,0,0,,"Ok, don't hurt me.|(Strip naked.)",We won't.  (They smile while you|strip in the empty school hall.),100,0,-1,PlayerStrip()
 100,0,0,Common_PlayerChaste,What's so funny?,The belt!  You're wearing a chastity belt!,110,0,-1,
@@ -85,8 +85,8 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 130,0,0,,What the fuck?,"It's a chastity belt, and it will|stay locked on you for a long while.",140,-1,0,
 130,0,0,,Sweet!  That's|a chastity belt?,Yes!  And it will be locked|on you for a long while.,140,1,-1,
 130,0,0,,Put that belt|back in your bag.,Oh hell no!   This chastity belt|will be locked on you for a long while.,140,0,1,
-140,0,0,,Fuck you!  I will|fight you both!,,140,0,0,StartFight()
-140,0,0,,Fine!  Lock the|stupid belt.,,150,0,0,LockBelt()
+140,0,0,AllowFight,Fuck you!  I will|fight you both!,,140,0,0,StartFight()
+140,0,0,,Fine!  Lock the|stupid belt.,(She hums a happy song while locks|the belt around your hips and crotch.),150,0,0,LockBelt()
 140,0,0,,Nice!  I love|chastity belts.,I love them too!  (She locks the|belt around your hips and crotch.),150,1,-1,LockBelt()
 150,0,0,,(Tug on the belt.),The belt isn't your biggest problem.|Since we will lock you up now.,160,0,0,BeltComment()
 150,0,0,,You better have the key!,The key isn't your biggest problem.|Since we will lock you up now.,160,0,1,BeltComment()
@@ -99,7 +99,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 170,0,0,,No way!  Are|you two insane?,Shut up and step in|before we force you.,180,-1,0,
 170,0,0,,"Ok, but not for long.|(Step in the locker.)",(You squeeze yourself in the locker.)|It will be fine.  Any last words?,190,1,-1,"EnterLocker(""Player"")"
 170,0,0,,I understand Miss.|(Step in the locker.),(You squeeze yourself in the locker.)|You will be alright.  Any last words?,190,0,-2,"EnterLocker(""Player"")"
-180,0,0,,Never!  I will|fight you both!,,180,0,0,StartFight()
+180,0,0,AllowFight,Never!  I will|fight you both!,,180,0,0,StartFight()
 180,0,0,,Fine!  I'll do it.|(Step in the locker.),(You squeeze yourself in the locker.)|You will be alright.  Any last words?,190,0,0,"EnterLocker(""Player"")"
 180,0,0,,"Ok, I surrender.|(Step in the locker.)",(You squeeze yourself in the locker.)|You will be alright.  Any last words?,190,0,-1,"EnterLocker(""Player"")"
 190,0,0,,Wait!  Let's negotiate!,Negotiation time is over!|(She slams the door and locks it.),200,0,-1,"CloseLocker(""Player"")"
@@ -134,3 +134,14 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 300,0,0,WasBelted,Wait!  What|about the belt?,"Oh yes, the belt.  Well come and see us|after class.  We'll talk about it some more.",300,0,0,RemoveWasBelted()
 300,0,0,Common_PlayerNaked,(Dress up and leave.),,300,0,0,EndChapter()
 300,0,0,Common_PlayerClothed,(Pick your items|and leave.),,300,0,0,EndChapter()
+400,0,0,WasBelted,Shut up and|unlock that belt.,"Sorry, I cannot unlock it now|but I will help you after class.",410,-1,1,
+400,0,0,WasBelted,Can you unlock|the belt now?,"Sorry, I cannot unlock it now|but I will help you after class.",410,0,0,
+400,0,0,,I'm not that strong.|You two are pathetic.,Oh my god.  I guess we|need to train with Jennifer.,410,-1,0,
+400,0,0,,I've been fighting|for years girl.,Oh my.  We never had a chance.,410,0,1,
+400,0,0,,I got lucky.,Wow!  That was some crazy luck.,410,1,-1,
+410,0,0,ItemStolen,Where are|my items?,"It's right here, you can have it.|(You take back all your possessions.)",410,0,0,RecoverItems()
+410,0,0,ItemStolen,Give me back|my stuff now!,Oh yes!  We were not going to steal it.|(You take back all your possessions.),410,0,1,RecoverItems()
+410,0,0,!ItemStolen,Now you know|who's the boss.,(Amanda nods and steps back.)|Yes Miss.  We won't try that again.,420,0,1,"SwitchFocus(""Sarah"")"
+410,0,0,!ItemStolen,I hope I did|not hurt you.,(Amanda shakes her head and steps back.)|It's fine.  All that was hurt is our pride.,420,1,0,"SwitchFocus(""Sarah"")"
+410,0,0,!ItemStolen,I need to go now.|(Leave them behind.),,410,0,0,"EarlyEnding(""FightVictory"")"
+420,0,0,,I need to go now.|(Leave them behind.),,420,0,0,"EarlyEnding(""FightVictory"")"
diff --git a/C010_Revenge/AmandaSarah/Text_EN.csv b/C010_Revenge/AmandaSarah/Text_EN.csv
index d422505b6a..96cc369014 100644
--- a/C010_Revenge/AmandaSarah/Text_EN.csv
+++ b/C010_Revenge/AmandaSarah/Text_EN.csv
@@ -12,3 +12,7 @@ LearnLesson,(The locker opens and Amanda smiles.)|So have you learned a lesson t
 Orgasm,"(You stimulate yourself right on the spot and|tremble with exctasy, getting a great orgasm.)"
 OrgasmEnough,(You play with yourself but you're out of ideas.|It's too uncomfortable for a second orgasm.)
 OrgasmRepeat,(The touch yourself and the vibrating egg kicks|in to give you desires for another round.)
+FightDefeat70,"Girl, you cannot fight both of us.|Now shut up and drop your stuff!"
+FightDefeat90,"Girl, you cannot fight both of us.|Now shut up and get naked!"
+FightDefeat140,"Girl, you cannot fight both of us.|We will lock that chastity belt on you."
+FightDefeat180,"Girl, you cannot fight both of us.|You will step in that locker."
diff --git a/C010_Revenge/EarlyEnding/Text_EN.csv b/C010_Revenge/EarlyEnding/Text_EN.csv
index 68cd393a20..876342c19f 100644
--- a/C010_Revenge/EarlyEnding/Text_EN.csv
+++ b/C010_Revenge/EarlyEnding/Text_EN.csv
@@ -5,5 +5,13 @@ Alone3,But it was worth it to teach them a lesson.
 Alone4,The next class will be available later.
 Locker1,You walk the hallways with a smirk on your face.
 Locker2,Amanda and Sarah might have got you a little late.
-Locker3,But it was worth it to see her stuggle in that locker.
+Locker3,But it was worth it to see her struggle in that locker.
 Locker4,The next class will be available in another version.
+FightVictory1,You walk the hallways and strech your mustles.
+FightVictory2,Amanda and Sarah might have got you a little late.
+FightVictory3,But it was worth it to crush them both in a fight.
+FightVictory4,The next class will be available in another version.
+DoubleLocker1,You walk the hallways with a big smile on your face.
+DoubleLocker2,Amanda and Sarah might have got you a little late.
+DoubleLocker3,But it was worth it to see them struggle in their lockers.
+DoubleLocker4,The next class will be available in another version.
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Defeat.png b/C999_Common/Fights/Actors/Amanda/Clothed_Defeat.png
new file mode 100644
index 0000000000..f1690b5b12
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Defeat.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Even1.png b/C999_Common/Fights/Actors/Amanda/Clothed_Even1.png
new file mode 100644
index 0000000000..711dd7731e
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Even1.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Even2.png b/C999_Common/Fights/Actors/Amanda/Clothed_Even2.png
new file mode 100644
index 0000000000..aeedd8c2e6
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Even2.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Even3.png b/C999_Common/Fights/Actors/Amanda/Clothed_Even3.png
new file mode 100644
index 0000000000..b4f21470b3
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Even3.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Losing1.png b/C999_Common/Fights/Actors/Amanda/Clothed_Losing1.png
new file mode 100644
index 0000000000..44b38b302e
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Losing1.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Losing2.png b/C999_Common/Fights/Actors/Amanda/Clothed_Losing2.png
new file mode 100644
index 0000000000..ed932027a8
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Losing2.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Losing3.png b/C999_Common/Fights/Actors/Amanda/Clothed_Losing3.png
new file mode 100644
index 0000000000..947cc006e4
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Losing3.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Provoke.png b/C999_Common/Fights/Actors/Amanda/Clothed_Provoke.png
new file mode 100644
index 0000000000..03cd490afd
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Provoke.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Victory.png b/C999_Common/Fights/Actors/Amanda/Clothed_Victory.png
new file mode 100644
index 0000000000..f50aca0fb0
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Victory.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Winning1.png b/C999_Common/Fights/Actors/Amanda/Clothed_Winning1.png
new file mode 100644
index 0000000000..d6298afb58
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Winning1.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Winning2.png b/C999_Common/Fights/Actors/Amanda/Clothed_Winning2.png
new file mode 100644
index 0000000000..c3fbaeeca5
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Winning2.png differ
diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Winning3.png b/C999_Common/Fights/Actors/Amanda/Clothed_Winning3.png
new file mode 100644
index 0000000000..9cfe6bf904
Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Winning3.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Defeat.png b/C999_Common/Fights/Actors/Sarah/Clothed_Defeat.png
new file mode 100644
index 0000000000..4d82cb5c87
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Defeat.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Even1.png b/C999_Common/Fights/Actors/Sarah/Clothed_Even1.png
new file mode 100644
index 0000000000..a64571301b
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Even1.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Even2.png b/C999_Common/Fights/Actors/Sarah/Clothed_Even2.png
new file mode 100644
index 0000000000..0f04c17c48
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Even2.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Even3.png b/C999_Common/Fights/Actors/Sarah/Clothed_Even3.png
new file mode 100644
index 0000000000..d117c8f208
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Even3.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Losing1.png b/C999_Common/Fights/Actors/Sarah/Clothed_Losing1.png
new file mode 100644
index 0000000000..08467065e2
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Losing1.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Losing2.png b/C999_Common/Fights/Actors/Sarah/Clothed_Losing2.png
new file mode 100644
index 0000000000..6c5fd0afb8
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Losing2.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Losing3.png b/C999_Common/Fights/Actors/Sarah/Clothed_Losing3.png
new file mode 100644
index 0000000000..bb476c96db
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Losing3.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Provoke.png b/C999_Common/Fights/Actors/Sarah/Clothed_Provoke.png
new file mode 100644
index 0000000000..3a80466268
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Provoke.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Victory.png b/C999_Common/Fights/Actors/Sarah/Clothed_Victory.png
new file mode 100644
index 0000000000..dc87bef613
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Victory.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Winning1.png b/C999_Common/Fights/Actors/Sarah/Clothed_Winning1.png
new file mode 100644
index 0000000000..49ab15d466
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Winning1.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Winning2.png b/C999_Common/Fights/Actors/Sarah/Clothed_Winning2.png
new file mode 100644
index 0000000000..8bad14508b
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Winning2.png differ
diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Winning3.png b/C999_Common/Fights/Actors/Sarah/Clothed_Winning3.png
new file mode 100644
index 0000000000..20dd4f506e
Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Winning3.png differ
diff --git a/C999_Common/Fights/Backgrounds/Lockers.jpg b/C999_Common/Fights/Backgrounds/Lockers.jpg
new file mode 100644
index 0000000000..01adf470bd
Binary files /dev/null and b/C999_Common/Fights/Backgrounds/Lockers.jpg differ
diff --git a/C999_Common/Fights/DoubleFight.js b/C999_Common/Fights/DoubleFight.js
new file mode 100644
index 0000000000..375ceb0a64
--- /dev/null
+++ b/C999_Common/Fights/DoubleFight.js
@@ -0,0 +1,299 @@
+// Fight parameters
+var DoubleFightTimer = 0;
+var DoubleFightStartTime = 5000;
+var DoubleFightEnded = false;
+var DoubleFightVictory = false;
+var DoubleFightEndFunction = "";
+var DoubleFightPerfect = true;
+var DoubleFightOpponent1 = {};
+var DoubleFightOpponent2 = {};
+var DoubleFightText;
+var DoubleFightBackupChapter = "";
+var DoubleFightBackupScreen = "";
+
+// Generates a full fight sequence
+function DoubleFightGenerateMoves(StartTime, DifficultyText) {
+	
+	// Set the difficulty ratio
+	var DifficultyRatio = 1;
+	if (DifficultyText == "Easy") DifficultyRatio = 1.5;
+	if (DifficultyText == "Hard") DifficultyRatio = 0.6667;
+		
+	// Full the fight sequence
+	var CurTimer = StartTime + 3000;
+	var Seq = 0;
+	DoubleFightMoves = [];
+	while (Seq < MaxFightSequence) {
+		
+		// Create a new fight move to do at a random position
+		DoubleFightMoves[DoubleFightMoves.length] = [Math.floor(Math.random() * 4), CurTimer];
+		CurTimer = CurTimer + Math.floor((Math.random() * 800 + 400) * DifficultyRatio);
+		Seq++;
+		
+	}
+
+	// Returns the fight move set
+	return DoubleFightMoves;
+
+}
+
+// Load the fight animations and full sequence
+function DoubleFightLoad(Opp1ActorName, Opp1Difficulty, Opp1Icon, Opp2ActorName, Opp2Difficulty, Opp2Icon, BackgroundImage, EndFunction) {
+	
+	// Creates a brand new fight 
+	LeaveIcon = "";
+	DoubleFightTimer = 0;
+	DoubleFightEnded = false;	
+	DoubleFightPerfect = true;
+	DoubleFightEndFunction = EndFunction;
+	DoubleFightBackgroundImage = BackgroundImage;
+	if (DoubleFightText == null) ReadCSV("DoubleFightText", "C999_Common/Fights/Text_" + CurrentLanguageTag + ".csv");
+
+	// Setup the 2 opponents
+	DoubleFightOpponent1 = { ActorName:Opp1ActorName, DifficultyText:Opp1Difficulty, FightIcon:Opp1Icon, LastMoveType:-1, LastMoveTypeTimer:-1, FightProgress:-1, FightMoves:DoubleFightGenerateMoves(DoubleFightStartTime, Opp1Difficulty), FightMoveTypeKeyUpper:[65, 83, 68, 70], FightMoveTypeKeyLower:[97, 115, 100, 102], FightXOffset:0, ImageXOffset:220, ImageName:"", NextImageTime:-1 };
+	DoubleFightOpponent2 = { ActorName:Opp2ActorName, DifficultyText:Opp2Difficulty, FightIcon:Opp2Icon, LastMoveType:-1, LastMoveTypeTimer:-1, FightProgress:-1, FightMoves:DoubleFightGenerateMoves(DoubleFightStartTime, Opp2Difficulty), FightMoveTypeKeyUpper:[72, 74, 75, 76], FightMoveTypeKeyLower:[104, 106, 107, 108], FightXOffset:900, ImageXOffset:520, ImageName:"", NextImageTime:-1 };
+	
+	// Keep a backup of the current chapter and screen
+	DoubleFightBackupChapter = CurrentChapter;
+	DoubleFightBackupScreen = CurrentScreen;
+	CurrentChapter = "C999_Common";
+	CurrentScreen = "DoubleFight";
+	
+}
+
+// Draw the fight icons
+function DoubleFightDrawIcons(ctx, Opponent) {
+
+	// Scroll the fight icons with time
+	var Seq = 0;
+	while (Seq < Opponent.FightMoves.length) {
+	
+		// Draw the move from 3 seconds before to 1 second after
+		if ((Opponent.FightMoves[Seq][FightMoveTime] <= DoubleFightTimer + 3000) && (Opponent.FightMoves[Seq][FightMoveTime] >= DoubleFightTimer - 1000))
+			DrawImage(ctx, "C999_Common/Fights/Icons/" + Opponent.FightIcon + ".png", Opponent.FightXOffset + 3 + (Opponent.FightMoves[Seq][FightMoveType] * 75), 410 + Math.floor((DoubleFightTimer - Opponent.FightMoves[Seq][FightMoveTime]) / 6));  
+		
+		// Remove the move from the sequence if it's past due
+		if (Opponent.FightMoves[Seq][FightMoveTime] < DoubleFightTimer - 1000) {
+			Opponent.FightMoves.splice(Seq, 1);
+			DoubleFightMiss(Opponent);
+		}	
+		else Seq = Seq + 1;	
+		
+		// Beyond 3 seconds forward, we exit
+		if (Seq < Opponent.FightMoves.length)
+			if (Opponent.FightMoves[Seq][FightMoveTime] > DoubleFightTimer + 3000)
+				return;
+
+	}
+
+}
+
+// Draw the fight bars to tell when the moves will hit
+function DoubleFightDrawBar(ctx, Opponent) {
+
+	// Draw 4 bars per opponent
+	for(BarNum = 0; BarNum <= 3; BarNum++) {
+		
+		// The color changes when it's clicked or pressed
+		DrawRect(ctx, Opponent.FightXOffset + 3 + (BarNum * 75), 437, 70, 27, "White");
+		if ((Opponent.LastMoveType == BarNum) && (Opponent.LastMoveTypeTimer >= DoubleFightTimer))
+			DrawRect(ctx, Opponent.FightXOffset + 4 + (BarNum * 75), 438, 68, 25, "#66FF66");
+		else
+			DrawRect(ctx, Opponent.FightXOffset + 4 + (BarNum * 75), 438, 68, 25, "Red");
+		if (!IsMobile) DrawText(ctx, String.fromCharCode(Opponent.FightMoveTypeKeyUpper[BarNum]), Opponent.FightXOffset + 36 + (BarNum * 75), 451, "white");
+
+	}
+
+}
+
+// Draw the fight progress in the bottom of the fight scene
+function DoubleFightDrawProgress(ctx, Opponent) {
+	DrawRect(ctx, Opponent.FightXOffset, 590, 300, 1, "white");
+	DrawRect(ctx, Opponent.FightXOffset, 591, Opponent.FightProgress * 3, 9, "#66FF66");
+	DrawRect(ctx, Opponent.FightXOffset + (Opponent.FightProgress * 3), 591, (100 - Opponent.FightProgress) * 3, 9, "red");
+}
+
+// Draw the opponent actor on the screen
+function DoubleFightDrawOpponent(ctx, Opponent) {
+
+	// Before the timer, we use the previous image
+	if (Opponent.NextImageTime < DoubleFightTimer) {
+
+		// The image file is constructed based on the actor clothes and winning position
+		Opponent.NextImageTime = DoubleFightTimer + 1000 + Math.round(Math.random() * 2000);
+		Opponent.ImageName = "C999_Common/Fights/Actors/" + Opponent.ActorName + "/" + ActorSpecificGetValue(Opponent.ActorName, ActorCloth) + "_";
+		if (Opponent.FightProgress == -1) Opponent.ImageName = Opponent.ImageName + "Provoke.png";
+		if (Opponent.FightProgress == 100) Opponent.ImageName = Opponent.ImageName + "Defeat.png";
+		if (Opponent.FightProgress == 0) Opponent.ImageName = Opponent.ImageName + "Victory.png";
+		if ((Opponent.FightProgress >= 1) && (Opponent.FightProgress <= 33)) Opponent.ImageName = Opponent.ImageName + "Winning" + ((Math.round(new Date().getTime() / 3000) % 3) + 1).toString() + ".png";
+		if ((Opponent.FightProgress >= 34) && (Opponent.FightProgress <= 66)) Opponent.ImageName = Opponent.ImageName + "Even" + ((Math.round(new Date().getTime() / 3000) % 3) + 1).toString() + ".png";
+		if ((Opponent.FightProgress >= 67) && (Opponent.FightProgress <= 99)) Opponent.ImageName = Opponent.ImageName + "Losing" + ((Math.round(new Date().getTime() / 3000) % 3) + 1).toString() + ".png";
+		
+	};
+
+	// Draw the image on the screen
+	DrawImageZoom(ctx, Opponent.ImageName, 0, 0, 600, 900, Opponent.ImageXOffset, 50, 600 * 0.75, 900 * 0.75);
+
+}
+
+// Renders a specific opponent
+function DoubleFightRenderOpponent(ctx, Opponent) {
+
+	// Starts the fight at an even level and generates moves if there'S none left
+	if (Opponent.FightProgress > 100) Opponent.FightProgress = 100;
+	if ((Opponent.FightProgress == -1) && (DoubleFightTimer >= DoubleFightStartTime)) Opponent.FightProgress = 50;
+	if ((Opponent.FightMoves.length == 0) && !DoubleFightEnded && Opponent.FightProgress > 0) Opponent.FightMoves = DoubleFightGenerateMoves(DoubleFightTimer, Opponent.DifficultyText);
+
+	// Draw the fighting actors
+	DoubleFightDrawOpponent(ctx, Opponent);
+	
+	// Draw the fight icons, bars and bottom info when the fight is running
+	if (!DoubleFightEnded) {
+		if (DoubleFightTimer >= DoubleFightStartTime) {
+			if (Opponent.FightProgress < 100) {
+				DoubleFightDrawBar(ctx, Opponent);
+				DoubleFightDrawIcons(ctx, Opponent);
+				DoubleFightDrawProgress(ctx, Opponent);
+			}
+		} 
+		else {
+			DrawText(ctx, GetCSVText(DoubleFightText, "Opponent") + " " + Opponent.ActorName, Opponent.FightXOffset + 150, 250, "white");
+			DrawText(ctx, GetCSVText(DoubleFightText, "Difficulty") + " " + GetCSVText(DoubleFightText, Opponent.DifficultyText), Opponent.FightXOffset + 150, 350, "white");
+		}
+	}
+	
+}
+
+// Ends the fight and sends the result back to the screen
+function DoubleFightEnd(Victory) {
+	DoubleFightOpponent1.NextImageTime = -1;
+	DoubleFightOpponent2.NextImageTime = -1;
+	if (DoubleFightOpponent1.FightProgress < 100) DoubleFightOpponent1.FightProgress = Victory ? 100 : 0;
+	if (DoubleFightOpponent2.FightProgress < 100) DoubleFightOpponent2.FightProgress = Victory ? 100 : 0;
+	DoubleFightEnded = true;
+	DoubleFightVictory = Victory;
+}
+
+// When the player hits
+function DoubleFightHit(Opponent) {
+	Opponent.FightProgress = Opponent.FightProgress + 2;
+	if (Opponent.FightProgress >= 100) Opponent.NextImageTime = -1;
+	if ((DoubleFightOpponent1.FightProgress >= 100) && (DoubleFightOpponent2.FightProgress >= 100)) DoubleFightEnd(true);
+}
+
+// When the player misses (the penalty is greater on higher difficulties)
+function DoubleFightMiss(Opponent) {
+	DoubleFightPerfect = false;
+	if (Opponent.DifficultyText == "Easy") Opponent.FightProgress = Opponent.FightProgress - 2;
+	if (Opponent.DifficultyText == "Normal") Opponent.FightProgress = Opponent.FightProgress - 3;
+	if (Opponent.DifficultyText == "Hard") Opponent.FightProgress = Opponent.FightProgress - 4;
+	if (Opponent.FightProgress <= 0) DoubleFightEnd(false);
+}
+
+// When the player tries a specific move type
+function DoubleFightDoMove(Opponent, MoveType) {
+
+	// Make sure the hit is valid
+	if ((MoveType >= 0) && (Opponent.FightMoves.length > 0) && (Opponent.FightProgress > 0) && (Opponent.FightProgress < 100)) {
+		
+		// For each moves in the list
+		var Hit = false;
+		var Seq = 0;
+		while (Seq < Opponent.FightMoves.length) {
+			
+			// If the move connects (good timing and good type)
+			if ((Opponent.FightMoves[Seq][FightMoveTime] <= DoubleFightTimer + 300) && (Opponent.FightMoves[Seq][FightMoveTime] >= DoubleFightTimer - 300) && (MoveType == Opponent.FightMoves[Seq][FightMoveType])) {
+				Opponent.FightMoves.splice(Seq, 1);
+				Hit = true;
+			}
+			else Seq++;
+			
+			// Beyond 0.5 seconds forward, we give up
+			if (Seq < Opponent.FightMoves.length)
+				if (Opponent.FightMoves[Seq][FightMoveTime] > DoubleFightTimer + 300) 
+					Seq = Opponent.FightMoves.length;
+
+		}
+
+		// Depending on hit or miss, we change the progress of the fight
+		Opponent.LastMoveType = MoveType;
+		Opponent.LastMoveTypeTimer = DoubleFightTimer + 200;
+		if (Hit) DoubleFightHit(Opponent);
+		else DoubleFightMiss(Opponent);
+
+		// Each hit or miss add 5 seconds to the game clock
+		CurrentTime = CurrentTime + 5000;
+		
+	}
+
+}
+
+// Checks if the key is a valid fight move for an opponent
+function DoubleFightCheckKey(Opponent) {	
+	var MoveType = -1;
+	if ((KeyPress == Opponent.FightMoveTypeKeyUpper[0]) || (KeyPress == Opponent.FightMoveTypeKeyLower[0])) MoveType = 0;
+	if ((KeyPress == Opponent.FightMoveTypeKeyUpper[1]) || (KeyPress == Opponent.FightMoveTypeKeyLower[1])) MoveType = 1;
+	if ((KeyPress == Opponent.FightMoveTypeKeyUpper[2]) || (KeyPress == Opponent.FightMoveTypeKeyLower[2])) MoveType = 2;
+	if ((KeyPress == Opponent.FightMoveTypeKeyUpper[3]) || (KeyPress == Opponent.FightMoveTypeKeyLower[3])) MoveType = 3;
+	DoubleFightDoMove(Opponent, MoveType);
+}
+
+// When a click is done on a mobile device, we send it to hit or miss
+function DoubleFightCheckClick(Opponent) {
+	var MoveType = -1;
+	if ((MouseX >= Opponent.FightXOffset) && (MouseX <= Opponent.FightXOffset + 300) && (MouseY >= 400) && (MouseY <= 500)) MoveType = Math.round((MouseX - Opponent.FightXOffset) / 75);
+	DoubleFightDoMove(Opponent, MoveType);
+}
+
+// Render the double fight scene
+function C999_Common_DoubleFight_Run() {
+
+	// Paints the background
+	var ctx = document.getElementById("MainCanvas").getContext("2d");
+	DrawImage(ctx, "C999_Common/Fights/Backgrounds/" + DoubleFightBackgroundImage + ".jpg", 0, 0);
+
+	// Increments the fight timer and renders the 2 opponents
+	DoubleFightTimer = DoubleFightTimer + RunInterval;
+	DoubleFightRenderOpponent(ctx, DoubleFightOpponent1);
+	DoubleFightRenderOpponent(ctx, DoubleFightOpponent2);
+
+	// Draw the fight icons and bottom info when the fight is running
+	if (!DoubleFightEnded && (DoubleFightTimer < DoubleFightStartTime)) DrawText(ctx, GetCSVText(DoubleFightText, "StartsIn") + " " + (5 - Math.floor(DoubleFightTimer / 1000)).toString(), 600, 30, "white");
+
+	// Draw the end text
+	if (DoubleFightEnded) {
+		if ((DoubleFightOpponent1.FightProgress >= 100) && (DoubleFightOpponent2.FightProgress >= 100) && DoubleFightPerfect) DrawText(ctx, GetCSVText(DoubleFightText, "Perfect"), 600, 30, "white");
+		if ((DoubleFightOpponent1.FightProgress >= 100) && (DoubleFightOpponent2.FightProgress >= 100) && !DoubleFightPerfect) DrawText(ctx, GetCSVText(DoubleFightText, "Victory"), 600, 30, "white");
+		if ((DoubleFightOpponent1.FightProgress <= 0) || (DoubleFightOpponent2.FightProgress <= 0)) DrawText(ctx, GetCSVText(DoubleFightText, "Defeat"), 600, 30, "white");
+	}
+
+}
+
+// When a key is pressed while fighting (for both keyboard and mobile)
+function C999_Common_DoubleFight_KeyDown() {
+	
+	// If the fight has started, we check the key pressed and send it as a fight move
+	if ((DoubleFightTimer > DoubleFightStartTime) && (DoubleFightOpponent1.FightProgress != -1) && !DoubleFightEnded) {
+		DoubleFightCheckKey(DoubleFightOpponent1);
+		DoubleFightCheckKey(DoubleFightOpponent2);
+	}
+	
+}
+
+// When a click is done while fighting (only works on mobile)
+function C999_Common_DoubleFight_Click() {
+
+	// If the fight is over, clicking above the opponents will end it
+	if (DoubleFightEnded && (MouseX >= 300) && (MouseX <= 900) && (MouseY <= 600)) {
+		CurrentChapter = DoubleFightBackupChapter;
+		CurrentScreen = DoubleFightBackupScreen;
+		DynamicFunction(DoubleFightEndFunction + "(" + DoubleFightVictory.toString() + ")");
+	}
+
+	// If the fight has started, we check the click position and send it as a fight move
+	if ((DoubleFightTimer > DoubleFightStartTime) && (DoubleFightOpponent1.FightProgress != -1) && !DoubleFightEnded && IsMobile) {
+		DoubleFightCheckClick(DoubleFightOpponent1);
+		DoubleFightCheckClick(DoubleFightOpponent2);
+	}
+
+}
diff --git a/Fight.js b/C999_Common/Fights/Fight.js
similarity index 99%
rename from Fight.js
rename to C999_Common/Fights/Fight.js
index 9acbce4083..6519d37237 100644
--- a/Fight.js
+++ b/C999_Common/Fights/Fight.js
@@ -3,8 +3,6 @@ var MaxFightSequence = 500;
 var FightProgress = -1;
 var FightTimer = 0;
 var FightMove = [];
-var FightMoveType = 0;
-var FightMoveTime = 1;
 var FightAnim;
 var FightAnimFrom = 0;
 var FightAnimTo = 1;
diff --git a/C999_Common/Fights/Icons/Punch.png b/C999_Common/Fights/Icons/Punch.png
new file mode 100644
index 0000000000..f427020110
Binary files /dev/null and b/C999_Common/Fights/Icons/Punch.png differ
diff --git a/C999_Common/Fights/Text_CN.csv b/C999_Common/Fights/Text_CN.csv
new file mode 100644
index 0000000000..e6281c2197
--- /dev/null
+++ b/C999_Common/Fights/Text_CN.csv
@@ -0,0 +1,11 @@
+Tag,Content
+Easy,Easy
+Normal,Normal
+Hard,Hard
+StartsIn,Starts in
+Opponent,Opponent:
+Difficulty,Difficulty:
+Perfect,Perfect fight!
+Victory,You won!
+Defeat,You lost!
+ClickContinue,Click here to continue.
diff --git a/C999_Common/Fights/Text_EN.csv b/C999_Common/Fights/Text_EN.csv
new file mode 100644
index 0000000000..ae7a24dadf
--- /dev/null
+++ b/C999_Common/Fights/Text_EN.csv
@@ -0,0 +1,10 @@
+Tag,Content
+Easy,Easy
+Normal,Normal
+Hard,Hard
+StartsIn,Starts in
+Opponent,Opponent:
+Difficulty,Difficulty:
+Perfect,Perfect fight!  Click on any opponent to continue.
+Victory,You won!  Click on any opponent to continue.
+Defeat,You lost!  Click on any opponent to continue.
diff --git a/C999_Common/Fights/Text_FR.csv b/C999_Common/Fights/Text_FR.csv
new file mode 100644
index 0000000000..e6281c2197
--- /dev/null
+++ b/C999_Common/Fights/Text_FR.csv
@@ -0,0 +1,11 @@
+Tag,Content
+Easy,Easy
+Normal,Normal
+Hard,Hard
+StartsIn,Starts in
+Opponent,Opponent:
+Difficulty,Difficulty:
+Perfect,Perfect fight!
+Victory,You won!
+Defeat,You lost!
+ClickContinue,Click here to continue.
diff --git a/Common.js b/Common.js
index 740d5546e6..a5a245bd25 100644
--- a/Common.js
+++ b/Common.js
@@ -16,6 +16,7 @@ var KeyPress = "";
 var IsMobile = false;
 var TextPhase = 0;
 var CSVCache = {};
+var MaxFightSequence = 500;
 
 // Array variables
 var IntroStage = 0;
@@ -36,6 +37,8 @@ var StageSubMod = 8;
 var StageFunction = 9;
 var TextTag = 0;
 var TextContent = 1;
+var FightMoveType = 0;
+var FightMoveTime = 1;
 
 // Common variables
 var Common_BondageAllowed = true;
@@ -229,6 +232,25 @@ function GetText(Tag) {
 
 }
 
+// Returns the text for a specific CSV associated with the tag
+function GetCSVText(CSVText, Tag) {
+
+	// Make sure the text CSV file is loaded
+	if (CSVText != null) {
+		
+		// Cycle the text to find a matching tag and returns the text content
+		Tag = Tag.trim().toUpperCase();
+		for (var T = 0; T < CSVText.length; T++)
+			if (CSVText[T][TextTag].trim().toUpperCase() == Tag)
+				return CSVText[T][TextContent].trim();
+		
+		// Returns an error message
+		return "MISSING TEXT FOR TAG: " + Tag.trim();
+
+	} else return "";
+
+}
+
 // Triggers the leave or wait button if needed
 function LeaveButtonClick() {
 	
diff --git a/index.html b/index.html
index 93245772a4..46dfbc91a1 100644
--- a/index.html
+++ b/index.html
@@ -19,7 +19,6 @@
 <script src="Actor.js"></script>
 <script src="Inventory.js"></script>
 <script src="Time.js"></script>
-<script src="Fight.js"></script>
 <script src="Struggle.js"></script>
 <script src="C000_Intro/Intro/Script.js"></script>
 <script src="C000_Intro/ChapterSelect/Script.js"></script>
@@ -117,6 +116,8 @@
 <script src="C999_Common/SleepingPill/Script.js"></script>
 <script src="C999_Common/RustyHook/Script.js"></script>
 <script src="C999_Common/MetalSheet/Script.js"></script>
+<script src="C999_Common/Fights/Fight.js"></script>
+<script src="C999_Common/Fights/DoubleFight.js"></script>
 <script>
 
 // When the code is loaded, start on "Chapter 0" to select a chapter and loads the default language