diff --git a/C000_Intro/CreatePlayer/Script.js b/C000_Intro/CreatePlayer/Script.js
index 5a90da2d3a..c58586b1cd 100644
--- a/C000_Intro/CreatePlayer/Script.js
+++ b/C000_Intro/CreatePlayer/Script.js
@@ -1,4 +1,6 @@
 var C000_Intro_CreatePlayer_ChapterToLoad = "C001_BeforeClass";
+var C000_Intro_CreatePlayer_SkillCount = 5;
+var C000_Intro_CreatePlayer_ControlLoaded = false;
 
 // Create Player Load
 function C000_Intro_CreatePlayer_Load() {
@@ -7,31 +9,48 @@ function C000_Intro_CreatePlayer_Load() {
 	LeaveIcon = "";
 	LeaveScreen = "";
 	LoadText();
-	
-	// Creates a text box to enter the player name
-	var InputName = document.createElement('input');
-	InputName.setAttribute("ID", "InputName");
-	InputName.setAttribute("name", "InputName");
-	InputName.setAttribute("type", "text");
-	InputName.setAttribute("value", "");
-	InputName.setAttribute("maxlength", "20");
-	InputName.setAttribute("style", "font-size:24px; font-family:Arial; position:fixed; padding-left:10px; left:200px; top:300px; width:500px; height:50px;");
-	InputName.addEventListener("keypress", KeyDown);
-	document.body.appendChild(InputName);
-	InputName.focus();
-	
+
 }
 
 // Create Player Run
 function C000_Intro_CreatePlayer_Run() {
+
+	// If we load the controls
+	if ((C000_Intro_CreatePlayer_ControlLoaded == false) && (GetText("Skill" + C000_Intro_CreatePlayer_SkillCount.toString()) != "")) {
+
+		// Creates a text box to enter the player name
+		var InputName = document.createElement('input');
+		InputName.setAttribute("ID", "InputName");
+		InputName.setAttribute("name", "InputName");
+		InputName.setAttribute("type", "text");
+		InputName.setAttribute("value", "");
+		InputName.setAttribute("maxlength", "20");
+		InputName.setAttribute("style", "font-size:24px; font-family:Arial; position:absolute; padding-left:10px; left:200px; top:240px; width:500px; height:50px;");
+		InputName.addEventListener("keypress", KeyDown);
+		document.body.appendChild(InputName);
+		InputName.focus();
+
+		// Creates a select box to pick a starting skill
+		var SelectSkill = document.createElement('select');
+		SelectSkill.setAttribute("ID", "SelectSkill");
+		SelectSkill.setAttribute("name", "SelectSkill");
+		SelectSkill.setAttribute("style", "font-size:24px; font-family:Arial; position:absolute; padding-left:10px; left:300px; top:320px; width:300px; height:50px;");
+		for(var S = 0; S <= 5; S++)
+			SelectSkill.appendChild(new Option(GetText("Skill" + S.toString()), S.toString()));
+		document.body.appendChild(SelectSkill);
+		C000_Intro_CreatePlayer_ControlLoaded = true;
+	
+	}
 	
 	// Draw the player image and the text input for the name
 	var ctx = document.getElementById("MainCanvas").getContext("2d");
 	DrawImage(ctx, CurrentChapter + "/" + CurrentScreen + "/Player.jpg", 900, 0);
 	DrawRect(ctx, 0, 0, 900, 600, "white");
-	DrawRect(ctx, 300, 430, 300, 70, "#8c304e");
 	DrawText(ctx, GetText("EnterName"), 450, 100, "black");
-	DrawText(ctx, GetText("ValidChars"), 450, 200, "black");
+	DrawText(ctx, GetText("ValidChars"), 450, 180, "black");
+
+	// Creates the "validate" button
+	DrawRect(ctx, 300, 430, 300, 70, "#8c304e");
 	DrawText(ctx, GetText("Validate"), 450, 465, "white");
 	
 }
@@ -39,17 +58,25 @@ function C000_Intro_CreatePlayer_Run() {
 // Validate the name and starts the game
 function C000_Intro_CreatePlayer_Validate() {
 	var NewName = document.getElementById("InputName").value.trim();
+	var StartingSkill = document.getElementById("SelectSkill").value.trim();
 	var letters = /^[a-zA-Z ]+$/;
 	if (NewName.match(letters) && (NewName.length > 0) && (NewName.length <= 20)) {
+		if (StartingSkill == "1") PlayerAddSkill("Arts", 1);
+		if (StartingSkill == "2") PlayerAddSkill("Fighting", 1);
+		if (StartingSkill == "3") PlayerAddSkill("RopeMastery", 1);
+		if (StartingSkill == "4") PlayerAddSkill("Sports", 1);
+		if (StartingSkill == "5") PlayerAddSkill("Seduction", 1);
+		PlayerSkillShowLevelUp = 0;
 		Common_PlayerName = NewName;
 		document.getElementById("InputName").parentNode.removeChild(document.getElementById("InputName"));
+		document.getElementById("SelectSkill").parentNode.removeChild(document.getElementById("SelectSkill"));
 		SetScene(C000_Intro_CreatePlayer_ChapterToLoad, "Intro");
 	}
 }
 
 // Create Player Key Down
 function C000_Intro_CreatePlayer_KeyDown() {
-	if (KeyPress == 13) C000_Intro_CreatePlayer_Validate();
+	//if (KeyPress == 13) C000_Intro_CreatePlayer_Validate();
 }
 
 // Create Player Click
diff --git a/C000_Intro/CreatePlayer/Text_CN.csv b/C000_Intro/CreatePlayer/Text_CN.csv
index f925fb59b7..bda6ae82fd 100644
--- a/C000_Intro/CreatePlayer/Text_CN.csv
+++ b/C000_Intro/CreatePlayer/Text_CN.csv
@@ -1,4 +1,10 @@
 Tag,Content
-EnterName,Enter a name for your character.
+EnterName,Enter a name and select a skill for your character.
 ValidChars,You can only use letters & spaces.
 Validate,Start the game
+Skill0,No skill
+Skill1,Arts
+Skill2,Fighting
+Skill3,Rope Mastery
+Skill4,Sports
+Skill5,Seduction
diff --git a/C000_Intro/CreatePlayer/Text_EN.csv b/C000_Intro/CreatePlayer/Text_EN.csv
index f925fb59b7..bda6ae82fd 100644
--- a/C000_Intro/CreatePlayer/Text_EN.csv
+++ b/C000_Intro/CreatePlayer/Text_EN.csv
@@ -1,4 +1,10 @@
 Tag,Content
-EnterName,Enter a name for your character.
+EnterName,Enter a name and select a skill for your character.
 ValidChars,You can only use letters & spaces.
 Validate,Start the game
+Skill0,No skill
+Skill1,Arts
+Skill2,Fighting
+Skill3,Rope Mastery
+Skill4,Sports
+Skill5,Seduction
diff --git a/C000_Intro/CreatePlayer/Text_FR.csv b/C000_Intro/CreatePlayer/Text_FR.csv
index dac0518c33..ac2bec8175 100644
--- a/C000_Intro/CreatePlayer/Text_FR.csv
+++ b/C000_Intro/CreatePlayer/Text_FR.csv
@@ -1,4 +1,10 @@
 Tag,Content
-EnterName,Entrez un nom pour votre personnage.
+EnterName,Choisissez un nom et un talent pour votre personnage.
 ValidChars,Seulement des lettres et des espaces.
 Validate,Démarrer la partie
+Skill0,No skill
+Skill1,Arts
+Skill2,Combat
+Skill3,Maîtrise des Cordes
+Skill4,Sports
+Skill5,Séduction
diff --git a/C000_Intro/CreatePlayer/Text_PL.csv b/C000_Intro/CreatePlayer/Text_PL.csv
index fe0fd578b4..9d52bbf888 100644
--- a/C000_Intro/CreatePlayer/Text_PL.csv
+++ b/C000_Intro/CreatePlayer/Text_PL.csv
@@ -2,3 +2,9 @@ Tag,Content
 EnterName,Nadaj imi� swojej postaci.
 ValidChars,Mo�esz u�ywa� wy��cznie liter oraz spacji.
 Validate,Zacznij gr�
+Skill0,No skill
+Skill1,Arts
+Skill2,Fighting
+Skill3,Rope Mastery
+Skill4,Sports
+Skill5,Seduction
diff --git a/C001_BeforeClass/Amanda/Script.js b/C001_BeforeClass/Amanda/Script.js
index bb8c73d414..66cdbd29fd 100644
--- a/C001_BeforeClass/Amanda/Script.js
+++ b/C001_BeforeClass/Amanda/Script.js
@@ -71,11 +71,12 @@ function C001_BeforeClass_Amanda_ConfrontBondage() {
 	C001_BeforeClass_Amanda_BondageNotConfronted = false;
 }
 
-// Chapter 1 - Amanda Kiss
+// Chapter 1 - Amanda Kiss (extra love if the player has seduction)
 function C001_BeforeClass_Amanda_Kiss() {
 	if (C001_BeforeClass_Amanda_Kiss_Done == false) {
 		C001_BeforeClass_Amanda_Kiss_Done = true;
-		ActorChangeAttitude(1, 0);
+		if (PlayerGetSkillLevel("Seduction") >= 1) ActorChangeAttitude(2, 0);
+		else ActorChangeAttitude(1, 0);
 		OverridenIntroText = GetText("Kiss");
 	}
 }
diff --git a/C004_ArtClass/Jennifer/Script.js b/C004_ArtClass/Jennifer/Script.js
index bccb841428..f31bd8edbf 100644
--- a/C004_ArtClass/Jennifer/Script.js
+++ b/C004_ArtClass/Jennifer/Script.js
@@ -15,6 +15,7 @@ var C004_ArtClass_Jennifer_PityDone = false;
 var C004_ArtClass_Jennifer_EggConfirm = false;
 var C004_ArtClass_Jennifer_EggInside = false;
 var C004_ArtClass_Jennifer_StunningBeautyReady = true;
+var C004_ArtClass_Jennifer_PaintAvail = true;
 
 // Chapter 4 - Jennifer Load
 function C004_ArtClass_Jennifer_Load() {
@@ -230,4 +231,20 @@ function C004_ArtClass_Jennifer_PityComment() {
 function C004_ArtClass_Jennifer_StunningBeauty() {
 	C004_ArtClass_Jennifer_StunningBeautyReady = false;
 	ActorChangeAttitude(1, 0);
+}
+
+// Chapter 4 - Jennifer Paint, can only be done if there's 30 minutes left for the class
+function C004_ArtClass_Jennifer_Paint() {
+	if (CurrentTime <= 9.75 * 60 * 60 * 1000) {
+		C004_ArtClass_Sarah_PaintAvail = false;
+		C004_ArtClass_Jennifer_PaintAvail = false;
+		ActorChangeAttitude(0, 2);
+		CurrentTime = CurrentTime + 0.5 * 60 * 60 * 1000;
+		PlayerAddSkill("Arts", 1);
+		if (PlayerGetSkillLevel("Arts") >= 1) {
+			ActorSpecificChangeAttitude("Julia", PlayerGetSkillLevel("Arts"), 0);
+			ActorSpecificChangeAttitude("Sarah", PlayerGetSkillLevel("Arts"), 0);
+			ActorSpecificChangeAttitude("Jennifer", PlayerGetSkillLevel("Arts"), 0);
+		}
+	} else OverridenIntroText = GetText("NoTimeToPaint");
 }
\ No newline at end of file
diff --git a/C004_ArtClass/Jennifer/Stage_EN.csv b/C004_ArtClass/Jennifer/Stage_EN.csv
index d2d576124a..0d305f4f44 100644
--- a/C004_ArtClass/Jennifer/Stage_EN.csv
+++ b/C004_ArtClass/Jennifer/Stage_EN.csv
@@ -42,9 +42,12 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 130,0,0,,(Tighten the ropes.)|(1 minute),(This bondage is already|as tight as it can be.),130,0,0,Tighten()
 130,0,0,,(Tickle her.)|(1 minute),(She cowers in shame|to avoid your tickling.),130,0,0,Tickle()
 130,0,0,Common_PlayerNotRestrained,(Untie her.)|(1 minute),(You untie her and she throws the|ropes at you.)  Can I go sit now?,120,0,0,Untie()
+130,0,0,PaintAvail,(Paint Jennifer.)|(30 minutes),(You carefully paint her and show the result.)|Please destroy this painting once class is over.,130,0,0,Paint()
 140,0,0,,(Tighten the ropes.)|(1 minute),(This bondage is already|as tight as it can be.),140,0,0,Tighten()
 140,0,0,,(Tickle her.)|(1 minute),(She cowers in shame|to avoid your tickling.),140,0,0,Tickle()
 140,0,0,Common_PlayerNotRestrained,(Ungag her.)|(1 minute),(You unbuckle the gag and release it|from her mouth)  Can you untie me now?,130,0,0,Ungag()
+140,0,0,PaintAvail,(Paint Jennifer.)|(30 minutes),(You carefully paint her and show the result.)|(She looks at your work of art and whimpers.),140,0,0,Paint()
 150,0,0,,(Tighten the ropes.)|(1 minute),(This bondage is already|as tight as it can be.),150,0,0,Tighten()
 150,0,0,,(Tickle her.)|(1 minute),(She cowers in shame|to avoid your tickling.),150,0,0,Tickle()
 150,0,0,Common_PlayerNotRestrained,(Ungag her.)|(1 minute),"(You remove the tape from her mouth.)|Alright, can you untie me now?",130,0,0,Ungag()
+150,0,0,PaintAvail,(Paint Jennifer.)|(30 minutes),(You carefully paint her and show the result.)|(She looks at your work of art and whimpers.),150,0,0,Paint()
diff --git a/C004_ArtClass/Jennifer/Text_EN.csv b/C004_ArtClass/Jennifer/Text_EN.csv
index ee9367eb04..c092ad4022 100644
--- a/C004_ArtClass/Jennifer/Text_EN.csv
+++ b/C004_ArtClass/Jennifer/Text_EN.csv
@@ -19,3 +19,4 @@ EarnTrust,I'll try to trust you then.|All of this is making me nervous.
 EggComment,"But, but, but.  I, I.  Ok.|(She bows her head.)"
 PlayerUntie,"(She blushes and steps up to untie you.)|Here you go my friend, I bet that was humiliating."
 PlayerStayTied,(She's too nervous to move up to help you.)|(You need 3 love or more to get help from her.)
+NoTimeToPaint,(There's not enough time left in|class to produce a work of art.)
diff --git a/C004_ArtClass/Sarah/Script.js b/C004_ArtClass/Sarah/Script.js
index 55881dee8e..9989ee0c3e 100644
--- a/C004_ArtClass/Sarah/Script.js
+++ b/C004_ArtClass/Sarah/Script.js
@@ -18,6 +18,7 @@ var C004_ArtClass_Sarah_EggConfirm = false;
 var C004_ArtClass_Sarah_EggInside = false;
 var C004_ArtClass_Sarah_CrotchRopeReady = false;
 var C004_ArtClass_Sarah_OrgasmDone = false;
+var C004_ArtClass_Sarah_PaintAvail = true;
 
 // Chapter 4 - Sarah Load
 function C004_ArtClass_Sarah_Load() {
@@ -226,4 +227,20 @@ function C004_ArtClass_Sarah_OrgasmStart() {
 // Chapter 4 - Sarah Orgasm
 function C004_ArtClass_Sarah_Orgasm() {
 	ActorAddOrgasm();
+}
+
+// Chapter 4 - Sarah Paint, can only be done if there's 30 minutes left for the class
+function C004_ArtClass_Sarah_Paint() {
+	if (CurrentTime <= 9.75 * 60 * 60 * 1000) {
+		C004_ArtClass_Sarah_PaintAvail = false;
+		C004_ArtClass_Jennifer_PaintAvail = false;
+		ActorChangeAttitude(1, 1);
+		CurrentTime = CurrentTime + 0.5 * 60 * 60 * 1000;
+		PlayerAddSkill("Arts", 1);
+		if (PlayerGetSkillLevel("Arts") >= 1) {
+			ActorSpecificChangeAttitude("Julia", PlayerGetSkillLevel("Arts"), 0);
+			ActorSpecificChangeAttitude("Sarah", PlayerGetSkillLevel("Arts"), 0);
+			ActorSpecificChangeAttitude("Jennifer", PlayerGetSkillLevel("Arts"), 0);
+		}
+	} else OverridenIntroText = GetText("NoTimeToPaint");
 }
\ No newline at end of file
diff --git a/C004_ArtClass/Sarah/Stage_EN.csv b/C004_ArtClass/Sarah/Stage_EN.csv
index 518bbc419f..4b3aa0b14b 100644
--- a/C004_ArtClass/Sarah/Stage_EN.csv
+++ b/C004_ArtClass/Sarah/Stage_EN.csv
@@ -40,14 +40,17 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 160,0,0,,(Tighten the ropes.)|(1 minute),The ropes are as tight as they can be.,160,0,0,Tighten()
 160,0,0,Common_PlayerNotRestrained,(Untie her.)|(1 minute),"Ooooooh, why did you untie me?|(She pulls her tongue and takes her pose.)",150,0,0,Untie()
 160,0,0,Common_PlayerNotRestrained,(Tickle her.)|(1 minute),You're funny.  But is that the best you can do?|(She giggles but isn't impressed by your tickling.),160,0,0,
+160,0,0,PaintAvail,(Paint Sarah.)|(30 minutes),(You carefully paint her and show the result.)|Wow!  This is such a kinky painting.  I love it!,160,0,0,Paint()
 170,0,0,CrotchRopeReady,(Play with the crotch|rope.)  (1 minute),(You play while she trembles and falls on|her knees.  Ready to have a huge orgasm.),200,0,0,OrgasmStart()
 170,0,0,,(Tighten the ropes.)|(1 minute),The ropes are as tight as they can be.,170,0,0,Tighten()
 170,0,0,Common_PlayerNotRestrained,(Ungag her.)|(1 minute),(She stretches her jaw and smiles)|Do you have a bigger gag coming up?,160,0,0,Ungag()
 170,0,0,Common_PlayerNotRestrained,(Tickle her.)|(1 minute),(She giggles but isn't impressed by your tickling.),170,0,0,
+170,0,0,PaintAvail,(Paint Sarah.)|(30 minutes),(You carefully paint her and show the result.)|(She looks at your work of art and nods happily.),170,0,0,Paint()
 180,0,0,CrotchRopeReady,(Play with the crotch|rope.)  (1 minute),(You play while she trembles and falls on|her knees.  Ready to have a huge orgasm.),250,0,0,OrgasmStart()
 180,0,0,,(Tighten the ropes.)|(1 minute),The ropes are as tight as they can be.,180,0,0,Tighten()
 180,0,0,Common_PlayerNotRestrained,(Ungag her.)|(1 minute),(She smiles at you.)  This tape|was the best idea I've ever had.,160,0,0,Ungag()
 180,0,0,Common_PlayerNotRestrained,(Tickle her.)|(1 minute),(She giggles but isn't impressed by your tickling.),180,0,0,
+180,0,0,PaintAvail,(Paint Sarah.)|(30 minutes),(You carefully paint her and show the result.)|(She looks at your work of art and nods happily.),180,0,0,Paint()
 200,0,0,,Do you want to|climax subbie girl?,"(She nods slowly, trying to control herself.)",210,0,1,
 200,0,0,,So this slut|wants to cum?,"(She shakes her head from left to right, then|from up to down, trying to control herself.)",210,-1,0,
 200,0,0,,You seem ready|to reach heaven.,"(She nods happily, trying to control herself.)",210,1,0,
diff --git a/C004_ArtClass/Sarah/Text_EN.csv b/C004_ArtClass/Sarah/Text_EN.csv
index 85390f4cdb..43150223da 100644
--- a/C004_ArtClass/Sarah/Text_EN.csv
+++ b/C004_ArtClass/Sarah/Text_EN.csv
@@ -12,3 +12,4 @@ Tighten,"(You tighten the knots while she moans.)|Mmmmhh, can we see each other
 TightenFail,(You try to tighten Sarah's bondage|but fail as the other students giggle.)
 PlayerRelease,Yes Miss.  Someone like you shouldn't be tied up.|(She releases you from your bondage.)
 PlayerGag,Help you?  Yes!  I know what could help.|(She searches to find tape and shuts your mouth.)
+NoTimeToPaint,(There's not enough time left in|class to produce a work of art.)
diff --git a/C005_GymClass/LoseFight/Script.js b/C005_GymClass/LoseFight/Script.js
index 1ee65f2358..71840be643 100644
--- a/C005_GymClass/LoseFight/Script.js
+++ b/C005_GymClass/LoseFight/Script.js
@@ -1,7 +1,7 @@
 // Chapter 5 - Lose Fight Load
 function C005_GymClass_LoseFight_Load() {
-	if (C005_GymClass_Jennifer_EasyMode) LoadFight("Jennifer", "Easy", Icons.Fight.Rope, PlayerGetSkillLevel("Fighting"));
-	else LoadFight("Jennifer", "Normal", Icons.Fight.Rope, PlayerGetSkillLevel("Fighting"));
+	if (C005_GymClass_Jennifer_EasyMode) LoadFight("Jennifer", "Easy", Icons.Fight.Rope, PlayerGetSkillLevel("RopeMastery"));
+	else LoadFight("Jennifer", "Normal", Icons.Fight.Rope, PlayerGetSkillLevel("RopeMastery"));
 }
 
 // Chapter 5 - Lose Fight Run
diff --git a/C005_GymClass/WinFight/Script.js b/C005_GymClass/WinFight/Script.js
index 35c55a6be7..035a287820 100644
--- a/C005_GymClass/WinFight/Script.js
+++ b/C005_GymClass/WinFight/Script.js
@@ -1,7 +1,7 @@
 // Chapter 5 - Win Fight Load
 function C005_GymClass_WinFight_Load() {
-	if (C005_GymClass_Jennifer_EasyMode) LoadFight("Jennifer", "Normal", Icons.Fight.Rope, PlayerGetSkillLevel("Fighting"));
-	else LoadFight("Jennifer", "Hard", Icons.Fight.Rope, PlayerGetSkillLevel("Fighting"));
+	if (C005_GymClass_Jennifer_EasyMode) LoadFight("Jennifer", "Normal", Icons.Fight.Rope, PlayerGetSkillLevel("RopeMastery"));
+	else LoadFight("Jennifer", "Hard", Icons.Fight.Rope, PlayerGetSkillLevel("RopeMastery"));
 }
 
 // Chapter 5 - Win Fight Run
diff --git a/C006_Isolation/IsolationRoom/Script.js b/C006_Isolation/IsolationRoom/Script.js
index 545fb40ce5..abb8fde16e 100644
--- a/C006_Isolation/IsolationRoom/Script.js
+++ b/C006_Isolation/IsolationRoom/Script.js
@@ -19,8 +19,7 @@ function C006_Isolation_IsolationRoom_DropInventory() {
 // Chapter 6 - Isolation Room Load
 function C006_Isolation_IsolationRoom_Load() {
 	LeaveIcon = "Wait";
-	StruggleDone = false;
-	StruggleProgress = 0;
+	StruggleLoad();
 	C006_Isolation_IsolationRoom_OrgasmReady = (PlayerHasLockedInventory("VibratingEgg"));
 	LoadText();
 }
diff --git a/C007_LunchBreak/Amanda/Script.js b/C007_LunchBreak/Amanda/Script.js
index d034f18261..33c91b7e92 100644
--- a/C007_LunchBreak/Amanda/Script.js
+++ b/C007_LunchBreak/Amanda/Script.js
@@ -13,6 +13,7 @@ var C007_LunchBreak_Amanda_IntroText = "";
 var C007_LunchBreak_Amanda_LeaveIcon = "";
 var C007_LunchBreak_Amanda_IsBoundAndGagged = false;
 var C007_LunchBreak_Amanda_ConfirmEvil = false;
+var C007_LunchBreak_Amanda_HasSeduction = false;
 
 // Calculates the screen parameters
 function C007_LunchBreak_Amanda_CalcParams() {
@@ -53,6 +54,7 @@ function C007_LunchBreak_Amanda_Load() {
 	ActorLoad("Amanda", "ActorSelect");
 	LoadInteractions();
 	C007_LunchBreak_Amanda_CalcParams();
+	C007_LunchBreak_Amanda_HasSeduction = (PlayerGetSkillLevel("Seduction") >= 1);
 	
 	// If Amanda doesn't like the player and isn't subbie enough, she leaves and don't talk
 	if ((ActorGetValue(ActorLove) <= -3) && (ActorGetValue(ActorSubmission) <= 2) && (C007_LunchBreak_Amanda_CurrentStage == 0)) {
@@ -261,7 +263,6 @@ function C007_LunchBreak_Amanda_Ungag() {
 // Chapter 7 - Amanda Test Make Love (Amanda will only make love if +8 or more)
 function C007_LunchBreak_Amanda_TestMakeLove() {
 	if (ActorGetValue(ActorLove) >= 8) {
-		if (PlayerGetSkillLevel("Seduction") >= 1) ActorChangeAttitude(1, 0);
 		OverridenIntroText = GetText("LoveStart");
 		C007_LunchBreak_Amanda_CurrentStage = 240;
 	} else {
diff --git a/C007_LunchBreak/Amanda/Stage_EN.csv b/C007_LunchBreak/Amanda/Stage_EN.csv
index d928d59335..a6769159b8 100644
--- a/C007_LunchBreak/Amanda/Stage_EN.csv
+++ b/C007_LunchBreak/Amanda/Stage_EN.csv
@@ -77,6 +77,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 200,0,0,,We still have time|before the bell?,(She giggles.)  Time for what?,210,0,0,
 200,0,0,,Thanks for showing|me this lovely cafe.,My pleasure!  We had a good time.,210,1,-1,
 200,0,0,,I wanted you to know|that I had a great time.,I did too!  We seem to fit well together.,210,1,0,
+200,0,0,HasSeduction,"Amy, you're the sweetest|thing in this college.",(She blushes red and giggles.)|You're also sweet COMMON_PLAYERNAME.,210,2,0,
 200,0,0,,Can I kiss you?|(1 minute),(She nods and puts her lips against yours.),220,1,0,
 200,0,0,,(Stay silent and kiss her.)|(1 minute),,220,0,1,
 200,0,0,,Better not be late.|(Back to college.),,0,0,0,EndBonus()
diff --git a/C007_LunchBreak/Jennifer/Script.js b/C007_LunchBreak/Jennifer/Script.js
index be0e7aea01..bdfcd0a0d6 100644
--- a/C007_LunchBreak/Jennifer/Script.js
+++ b/C007_LunchBreak/Jennifer/Script.js
@@ -24,6 +24,7 @@ var C007_LunchBreak_Jennifer_PushUpQuality = 0;
 var C007_LunchBreak_Jennifer_PushUpCount = 0;
 var C007_LunchBreak_Jennifer_RacketQuality = 0;
 var C007_LunchBreak_Jennifer_HasRestrainsAvail = false;
+var C007_LunchBreak_Jennifer_HasSeduction = false;
 
 // Calculates the screen parameters
 function C007_LunchBreak_Jennifer_CalcParams() {
@@ -74,6 +75,7 @@ function C007_LunchBreak_Jennifer_Load() {
 	ActorLoad("Jennifer", "ActorSelect");
 	LoadInteractions();
 	C007_LunchBreak_Jennifer_CalcParams();
+	C007_LunchBreak_Jennifer_HasSeduction = (PlayerGetSkillLevel("Seduction") >= 1);
 	
 	// If Jennifer doesn't like the player, she will run away from the start
 	if ((ActorGetValue(ActorLove) <= -3) && (ActorGetValue(ActorSubmission) <= 3)) {
diff --git a/C007_LunchBreak/Jennifer/Stage_EN.csv b/C007_LunchBreak/Jennifer/Stage_EN.csv
index fff8ad37fe..b0593edb41 100644
--- a/C007_LunchBreak/Jennifer/Stage_EN.csv
+++ b/C007_LunchBreak/Jennifer/Stage_EN.csv
@@ -18,6 +18,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 20,0,0,,The loser will be the|winner slave for lunch.,Slave?  You mean the loser pays for lunch?,30,0,1,
 20,0,0,,The loser submits to|the winner for lunch.,Submits?  You mean the loser pays for lunch?,30,0,0,
 20,0,0,,On second thoughts.|I don't want to play.,"Alright then, see you later.|(She packs and leaves for tennis.)",90,0,0,EndLunch()
+30,0,0,HasSeduction,Lovely Jennifer.  You|can't resist a challenge.,(She blushes and looks at the floor.)|Indeed.  Are you ready to play now?,40,1,1,
 30,0,0,,"Yes, whoever loses|will pay and obey.",You have a strange way to phrase your|bet but I'm up for it!  Should we go now?,40,0,0,
 30,0,0,,Don't make me repeat.|Are you game or not?,(She frowns at you and gets competitive.)|Alright then!  Are you ready to play now?,40,-1,0,
 30,0,0,,On second thoughts.|I don't want to play.,"Alright then, see you later.|(She packs and leaves for tennis.)",90,0,0,EndLunch()
diff --git a/C008_DramaClass/Julia/Script.js b/C008_DramaClass/Julia/Script.js
index 4511a3e7c1..683d9171ec 100644
--- a/C008_DramaClass/Julia/Script.js
+++ b/C008_DramaClass/Julia/Script.js
@@ -44,6 +44,12 @@ function C008_DramaClass_Julia_Load() {
 	ActorLoad("Julia", "Theater");
 	LoadInteractions();
 	
+	// On a perfect play, the player gains a level in arts
+	if ((C008_DramaClass_Julia_CurrentStage == 300) && C008_DramaClass_Theater_PerfectPlay) {
+		C008_DramaClass_Theater_PerfectPlay = false;
+		PlayerAddSkill("Arts");
+	}
+	
 	// Cannot leave before Julia gave her instructions
 	if (C008_DramaClass_Julia_CurrentStage < 100) LeaveIcon = "";
 	if (C008_DramaClass_Julia_CurrentStage == 330) C008_DramaClass_Julia_CurrentStage = 400;
@@ -193,10 +199,9 @@ function C008_DramaClass_Julia_Masturbate() {
 
 // Chapter 8 - Julia can be flattered with a "quiant" comment
 function C008_DramaClass_Julia_QuaintComment() {
-	if (!C008_DramaClass_Julia_QuaintCommentDone) { 
+	if (!C008_DramaClass_Julia_QuaintCommentDone) {
 		C008_DramaClass_Julia_QuaintCommentDone = true;
-		if (PlayerGetSkillLevel("Seduction") >= 1) ActorChangeAttitude(2, 0);
-		else ActorChangeAttitude(1, 0);
+		ActorChangeAttitude(1 + PlayerGetSkillLevel("Seduction"), 0);
 	}
 	C008_DramaClass_Julia_CalcParams();
 }
diff --git a/C008_DramaClass/Villain/Script.js b/C008_DramaClass/Villain/Script.js
index abe0f22345..1e95e61f20 100644
--- a/C008_DramaClass/Villain/Script.js
+++ b/C008_DramaClass/Villain/Script.js
@@ -21,6 +21,7 @@ var C008_DramaClass_Villain_SpankDone = false;
 var C008_DramaClass_Villain_OrgasmDone = false;
 var C008_DramaClass_Villain_MastubateCount = 0;
 var C008_DramaClass_Villain_RavishDone = false;
+var C008_DramaClass_Villain_CanDoSwordDance = false;
 
 // Calculates the scene parameters
 function C008_DramaClass_Villain_CalcParams() {
@@ -32,6 +33,7 @@ function C008_DramaClass_Villain_CalcParams() {
 	C008_DramaClass_Villain_CanConvinceJuliaToStrip = (C008_DramaClass_Villain_PlayerIsDamsel && !C008_DramaClass_Villain_IsGagged && (C008_DramaClass_Julia_CurrentStage == 400) && ((ActorSpecificGetValue("Amanda", ActorLove) >= 10) || (ActorSpecificGetValue("Amanda", ActorSubmission) >= 10)));
 	C008_DramaClass_Villain_DamselCanInteract = (C008_DramaClass_Villain_PlayerIsDamsel && !Common_PlayerGagged);
 	C008_DramaClass_Villain_DamselCanBeg = (C008_DramaClass_Villain_PlayerIsDamsel && Common_PlayerGagged);
+	C008_DramaClass_Villain_CanDoSwordDance = (!C008_DramaClass_Villain_PlayerIsDamsel && PlayerGetSkillLevel("Arts"));
 	OverridenIntroImage = "";
 }
 
@@ -261,4 +263,13 @@ function C008_DramaClass_Villain_Ravish() {
 		OverridenIntroText = GetText("Ravish");
 	}
 	C008_DramaClass_Villain_CalcParams();
+}
+
+// Chapter 8 - Sword Dance, a special option to disarm the opponent using art
+function C008_DramaClass_Villain_SwordDance() {
+	if (C008_DramaClass_Villain_PlayerIsHeroine) { C008_DramaClass_Villain_CurrentStage = 240; C008_DramaClass_Theater_GlobalStage = 240; }
+	if (C008_DramaClass_Villain_PlayerIsVillain) { C008_DramaClass_Villain_CurrentStage = 270; C008_DramaClass_Theater_GlobalStage = 270; }
+	ActorSpecificChangeAttitude("Julia", PlayerGetSkillLevel("Arts"), 0);
+	ActorSpecificChangeAttitude("Amanda", 0, 1);
+	ActorSpecificChangeAttitude("Sarah", 0, 1);
 }
\ No newline at end of file
diff --git a/C008_DramaClass/Villain/Stage_EN.csv b/C008_DramaClass/Villain/Stage_EN.csv
index 51970f9291..6b4740ac61 100644
--- a/C008_DramaClass/Villain/Stage_EN.csv
+++ b/C008_DramaClass/Villain/Stage_EN.csv
@@ -31,6 +31,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 230,0,0,PlayerIsHeroine,(Do a sword fight.),You charge each other and start|a funny but intense sword fight.,235,0,0,NoLeave()
 230,0,0,PlayerIsHeroine,(Surrender without a fight.),You drop your sword and the black|knight steps forward with a grin.,270,0,0,Surrender()
 230,0,0,PlayerIsDamsel,(Watch the fight.),Both knights charge on each other and|engage in a pretty neat sword fight.,235,0,0,NoLeave()
+235,0,0,CanDoSwordDance,(Do a sword dance.)|(1 minute),You dance gracefully around your opponent and|easily disarm her while she's dazzled by you.,270,0,0,SwordDance()
 235,0,0,CanIntimidate,(Intimidate her.)|(1 minute),You give a menacing look to Amanda which|barely fights and lets you disarm her.,270,0,0,"GlobalStage(270, 0, 1)"
 235,0,0,CanDisarm,(Disarm her.)|(1 minute),Amanda puts a pretty nice fight but|you're able to win by disarming her.,270,0,0,"GlobalStage(270, 0, 0)"
 235,0,0,PlayerIsVillain,(Play defensive.)|(1 minute),You stick to defensive moves and Amanda|takes advantage of it to disarm you.,240,0,0,"GlobalStage(240, 0, 0)"
diff --git a/C999_Common/Player/Script.js b/C999_Common/Player/Script.js
index 599f4c2568..630dd50c5d 100644
--- a/C999_Common/Player/Script.js
+++ b/C999_Common/Player/Script.js
@@ -5,6 +5,7 @@ function C999_Common_Player_Load() {
 	C999_Common_Player_ActiveTab = "Profile";
 	LeaveIcon = "Leave";
 	LoadText();
+	PlayerSkillShowLevelUp = 0;
 }
 
 // Returns the title for the player based on actor interactions
diff --git a/Drawing.js b/Drawing.js
index 7dcef3b7c3..2762c7fe50 100644
--- a/Drawing.js
+++ b/Drawing.js
@@ -248,6 +248,9 @@ function DrawInventory(ctx) {
 	else
 		DrawImage(ctx, "Icons/" + GetPlayerIconImage() + "_Inactive.png", 0, 601);
 	
+	// Draw an arrow over the player head if there's a skill level up
+	if (PlayerSkillShowLevelUp > 0) DrawImage(ctx, "Icons/SkillLevelUp.png", 0, 601);
+	
 	// Scroll in the full inventory to draw the icons and quantity, draw a padlock over the item if it's locked
 	var Pos = 1;
 	for (var I = 0; I < PlayerInventory.length; I++) {
diff --git a/Icons/SkillLevelUp.png b/Icons/SkillLevelUp.png
new file mode 100644
index 0000000000..2be40445ff
Binary files /dev/null and b/Icons/SkillLevelUp.png differ
diff --git a/Skill.js b/Skill.js
index 8ebfaa4b49..d9cf8d1e7b 100644
--- a/Skill.js
+++ b/Skill.js
@@ -1,10 +1,14 @@
 var PlayerSkill = [];
 var PlayerSkillName = 0;
 var PlayerSkillLevel = 1;
+var PlayerSkillShowLevelUp = 0;
 
 // Add a new skill or raise the skill level if the skill is already known
 function PlayerAddSkill(SkillToAdd, LevelToAdd) {
 
+	// Shows the new skill warning for 15 seconds
+	PlayerSkillShowLevelUp = Math.round(15 * 1000 / RunInterval);
+
 	// If the skill is already known, we raise the level
 	for (var I = 0; I < PlayerSkill.length; I++)
 		if (SkillToAdd == PlayerSkill[I][PlayerSkillName]) {
diff --git a/Struggle.js b/Struggle.js
index 514a318268..4c324b226f 100644
--- a/Struggle.js
+++ b/Struggle.js
@@ -13,6 +13,14 @@ var StruggleDone = false;
 var StruggleImageFrame = 0;
 var StruggleImageFrameMax = 1;
 var StruggleImageFrameTime = 0;
+var StruggleSkillBonus = 0;
+
+// For each Rope Mastery level, it's 50% easier to struggle out
+function StruggleLoad() {
+	StruggleDone = false;
+	StruggleProgress = 0;
+	StruggleSkillBonus = PlayerGetSkillLevel("RopeMastery");
+}
 
 // The next tick to lower the struggle time comes faster with harder levels
 function StruggleGetNextTick() {
@@ -53,7 +61,7 @@ function StruggleClick(SType, SDifficulty, SMessage, SDoneMessage, SX, SY, SRadi
 		
 		// Raise the progress by 2 for each click, 100 is done
 		if (StruggleProgress <= 0) StruggleProgress = 8;
-		StruggleProgress = StruggleProgress + 2;
+		StruggleProgress = StruggleProgress + 2 + StruggleSkillBonus;
 		if (StruggleProgress >= 100) {
 			StruggleProgress = 100;
 			StruggleDone = true;
diff --git a/Time.js b/Time.js
index 46446c7e53..4340912168 100644
--- a/Time.js
+++ b/Time.js
@@ -32,6 +32,7 @@ function ProcessTimer() {
 	// Ticks the timer every for the screen refresh and events
 	clearInterval(CurrentTimer);
 	CurrentTimer = setInterval("MainRun()", RunInterval);
+	if (PlayerSkillShowLevelUp > 0) PlayerSkillShowLevelUp--;
 
 	// If the timer must run
 	if (RunTimer) {