diff --git a/C000_Intro/ChapterSelect/Stage_CN.csv b/C000_Intro/ChapterSelect/Stage_CN.csv
index bbd302da24..72a294d885 100644
--- a/C000_Intro/ChapterSelect/Stage_CN.csv
+++ b/C000_Intro/ChapterSelect/Stage_CN.csv
@@ -2,7 +2,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 0,0,0,,重新开始,,0,0,0,"LoadChapter(""C001_BeforeClass"")"
 0,0,0,,继续学业,,0,0,0,LoadScreen()
 0,0,0,,选择章节,你想从哪一章开始?|如果你没有玩过这个游戏,请从第一章开始。,10,0,0,
-0,0,0,,选择语言,,20,0,0,
+0,0,0,,选择语言,,30,0,0,
 10,0,0,,第一章|课前时间,,10,0,0,"LoadChapter(""C001_BeforeClass"")"
 10,0,0,,第二章|第一课,,10,0,0,"LoadChapter(""C002_FirstClass"")"
 10,0,0,,第三章|早上,,10,0,0,"LoadChapter(""C003_MorningDetention"")"
@@ -11,7 +11,12 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 10,0,0,,第六章|独立监禁,,10,0,0,"LoadChapter(""C006_Isolation"")"
 10,0,0,,第七章|午餐时间,,10,0,0,"LoadChapter(""C007_LunchBreak"")"
 10,0,0,,Chapter 8|Drama Class,,10,0,0,"LoadChapter(""C008_DramaClass"")"
-10,0,0,,Chapter 10|Revenge,,10,0,0,"LoadChapter(""C010_Revenge"")"
+10,0,0,,More Chapters,"Select the chapter you want to play.|If you never tried the game, start on chapter 1.",20,0,0,
 10,0,0,,主菜单,欢迎来到束缚学院。|希望各位绅士玩得开心,不断找到新惊喜。,0,0,0,
-20,0,0,,英文,,0,0,0,"SetLanguage(""EN"")"
-20,0,0,,法文 (暂时只有第一章)|感谢gottspende!,,0,0,0,"SetLanguage(""FR"")"
\ No newline at end of file
+20,0,0,,Chapter 9|Library,,20,0,0,"LoadChapter(""C009_Library"")"
+20,0,0,,Chapter 10|Revenge,,20,0,0,"LoadChapter(""C010_Revenge"")"
+20,0,0,,Chapter 101|Kinbaku Club by wildsj,,20,0,0,"LoadChapter(""C101_KinbakuClub"")"
+20,0,0,,Previous Chapters,"Select the chapter you want to play.|If you never tried the game, start on chapter 1.",10,0,0,
+20,0,0,,主菜单,欢迎来到束缚学院。|希望各位绅士玩得开心,不断找到新惊喜。,0,0,0,
+30,0,0,,英文,,0,0,0,"SetLanguage(""EN"")"
+30,0,0,,法文 (暂时只有第一章)|感谢gottspende!,,0,0,0,"SetLanguage(""FR"")"
\ No newline at end of file
diff --git a/C000_Intro/ChapterSelect/Stage_EN.csv b/C000_Intro/ChapterSelect/Stage_EN.csv
index 75fed99d09..fb27183a26 100644
--- a/C000_Intro/ChapterSelect/Stage_EN.csv
+++ b/C000_Intro/ChapterSelect/Stage_EN.csv
@@ -13,6 +13,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 10,0,0,,Chapter 8|Drama Class,,10,0,0,"LoadChapter(""C008_DramaClass"")"
 10,0,0,,More Chapters,"Select the chapter you want to play.|If you never tried the game, start on chapter 1.",20,0,0,
 10,0,0,,Main Menu,"Welcome to the Bondage College.|Have fun, be curious and be kinky.",0,0,0,
+20,0,0,,Chapter 9|Library,,20,0,0,"LoadChapter(""C009_Library"")"
 20,0,0,,Chapter 10|Revenge,,20,0,0,"LoadChapter(""C010_Revenge"")"
 20,0,0,,Chapter 101|Kinbaku Club by wildsj,,20,0,0,"LoadChapter(""C101_KinbakuClub"")"
 20,0,0,,Previous Chapters,"Select the chapter you want to play.|If you never tried the game, start on chapter 1.",10,0,0,
diff --git a/C000_Intro/ChapterSelect/Stage_FR.csv b/C000_Intro/ChapterSelect/Stage_FR.csv
index a8593963e3..cf9d8ea967 100644
--- a/C000_Intro/ChapterSelect/Stage_FR.csv
+++ b/C000_Intro/ChapterSelect/Stage_FR.csv
@@ -13,6 +13,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 10,0,0,,Chapitre 8|Le cours de Théâtre,,10,0,0,"LoadChapter(""C008_DramaClass"")"
 10,0,0,,Autres chapitres,"Sélectionnez le chapitre que vous voulez.|Si c'est votre 1ère partie, commencez au chapitre 1.",20,0,0,
 10,0,0,,Menu principal,"Bienvenue à l'Université du Bondage.|Amusez-vous bien, soyez curieux(se) et coquin(e).",0,0,0,
+20,0,0,,Chapitre 9|Bibliothèque,,20,0,0,"LoadChapter(""C009_Library"")"
 20,0,0,,Chapitre 10|La vengeance,,20,0,0,"LoadChapter(""C010_Revenge"")"
 20,0,0,,Chapitre 101|Club Kinbaku par wildsj,,20,0,0,"LoadChapter(""C101_KinbakuClub"")"
 20,0,0,,Autres chapitres,"Sélectionnez le chapitre que vous voulez.|Si c'est votre 1ère partie, commencez au chapitre 1.",10,0,0,
diff --git a/C000_Intro/CreatePlayer/Text_FR.csv b/C000_Intro/CreatePlayer/Text_FR.csv
index ac2bec8175..09e7b237e5 100644
--- a/C000_Intro/CreatePlayer/Text_FR.csv
+++ b/C000_Intro/CreatePlayer/Text_FR.csv
@@ -2,7 +2,7 @@ Tag,Content
 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
+Skill0,Aucun talent
 Skill1,Arts
 Skill2,Combat
 Skill3,Maîtrise des Cordes
diff --git a/C009_Library/Intro/Background.jpg b/C009_Library/Intro/Background.jpg
index b774b20129..99156ab03a 100644
Binary files a/C009_Library/Intro/Background.jpg and b/C009_Library/Intro/Background.jpg differ
diff --git a/C009_Library/Library/001.jpg b/C009_Library/Library/001.jpg
index 870ec8175a..672111ae5c 100644
Binary files a/C009_Library/Library/001.jpg and b/C009_Library/Library/001.jpg differ
diff --git a/C009_Library/Library/002.jpg b/C009_Library/Library/002.jpg
new file mode 100644
index 0000000000..27daac97b6
Binary files /dev/null and b/C009_Library/Library/002.jpg differ
diff --git a/C009_Library/Library/003.jpg b/C009_Library/Library/003.jpg
new file mode 100644
index 0000000000..1f2e720f0b
Binary files /dev/null and b/C009_Library/Library/003.jpg differ
diff --git a/C009_Library/Library/004.jpg b/C009_Library/Library/004.jpg
new file mode 100644
index 0000000000..5342588646
Binary files /dev/null and b/C009_Library/Library/004.jpg differ
diff --git a/C009_Library/Library/005.jpg b/C009_Library/Library/005.jpg
new file mode 100644
index 0000000000..86d18ef2ef
Binary files /dev/null and b/C009_Library/Library/005.jpg differ
diff --git a/C009_Library/Library/006.jpg b/C009_Library/Library/006.jpg
new file mode 100644
index 0000000000..34f3a0ae5b
Binary files /dev/null and b/C009_Library/Library/006.jpg differ
diff --git a/C009_Library/Library/007.jpg b/C009_Library/Library/007.jpg
new file mode 100644
index 0000000000..b0634227eb
Binary files /dev/null and b/C009_Library/Library/007.jpg differ
diff --git a/C009_Library/Library/008.jpg b/C009_Library/Library/008.jpg
new file mode 100644
index 0000000000..837b728280
Binary files /dev/null and b/C009_Library/Library/008.jpg differ
diff --git a/C009_Library/Library/009.jpg b/C009_Library/Library/009.jpg
new file mode 100644
index 0000000000..870ec8175a
Binary files /dev/null and b/C009_Library/Library/009.jpg differ
diff --git a/C009_Library/Library/Script.js b/C009_Library/Library/Script.js
index 38c80d68e1..85aecff8e0 100644
--- a/C009_Library/Library/Script.js
+++ b/C009_Library/Library/Script.js
@@ -11,29 +11,73 @@ function C009_Library_Library_Load() {
 
 }
 
+// Draw the navigation arrows
+function C009_Library_Library_Navigation(ctx, Zone, Direction, X, Y) {
+	if (C009_Library_Library_CurrentZone == Zone) {
+		var Active = false;
+		if ((MouseX >= X) && (MouseX <= X + 200) && (MouseY >= Y) && (MouseY <= Y + 200)) Active = true;
+		if ((Direction == "Up") && Active) DrawImage(ctx, Icons.Navigation.ArrowUpActive, X, Y);
+		if ((Direction == "Up") && !Active) DrawImage(ctx, Icons.Navigation.ArrowUpInactive, X, Y);
+		if ((Direction == "Down") && Active) DrawImage(ctx, Icons.Navigation.ArrowDownActive, X, Y);
+		if ((Direction == "Down") && !Active) DrawImage(ctx, Icons.Navigation.ArrowDownInactive, X, Y);
+		if ((Direction == "Left") && Active) DrawImage(ctx, Icons.Navigation.ArrowLeftActive, X, Y);
+		if ((Direction == "Left") && !Active) DrawImage(ctx, Icons.Navigation.ArrowLeftInactive, X, Y);
+		if ((Direction == "Right") && Active) DrawImage(ctx, Icons.Navigation.ArrowRightActive, X, Y);
+		if ((Direction == "Right") && !Active) DrawImage(ctx, Icons.Navigation.ArrowRightInactive, X, Y);
+	}
+}
+
 // Chapter 9 - Library Run
 function C009_Library_Library_Run() {
 
 	// Draw the background image 
 	var ctx = document.getElementById("MainCanvas").getContext("2d");
 	DrawImage(ctx, CurrentChapter + "/" + CurrentScreen + "/" + C009_Library_Library_CurrentZone + ".jpg", 0, 0);
+	
+	// Draw the navigation arrows
+	C009_Library_Library_Navigation(ctx, "001", "Left", 0, 400);
+	C009_Library_Library_Navigation(ctx, "001", "Up", 500, 350);
+	C009_Library_Library_Navigation(ctx, "001", "Right", 1000, 400);
+	C009_Library_Library_Navigation(ctx, "002", "Up", 500, 200);
+	C009_Library_Library_Navigation(ctx, "002", "Down", 500, 400);
+	C009_Library_Library_Navigation(ctx, "002", "Left", 0, 400);
+	C009_Library_Library_Navigation(ctx, "002", "Right", 1000, 400);
+	C009_Library_Library_Navigation(ctx, "003", "Down", 500, 400);
 
 }
 
+// Chapter 9 - Library Enter Search Mode
+function C009_Library_Library_StartSearch(SearchStage) {
+	C009_Library_Search_CurrentStage = SearchStage;
+	SetScene(CurrentChapter, "Search");
+	return false;
+}
+
+// Chapter 9 - Library Enter New Zone
+function C009_Library_Library_EnterZone(NewZone) {
+	C009_Library_Library_CurrentZone = NewZone;
+	return false;
+}
+
 // Chapter 9 - Library Click
 function C009_Library_Library_Click() {
 
 	// Checks if the user clicks on any regular item
 	InventoryClick(GetClickedInventory(), "C009_Library", "Library");
 	
-	// In Zone 1, the player can go to 2, 3 or 4
-	if ((C009_Library_Library_CurrentZone == "001") && (MouseX >= 0) && (MouseX <= 200) && (MouseY >= 400) && (MouseY <= 600)) C009_Library_Library_CurrentZone = "002";
-	if ((C009_Library_Library_CurrentZone == "001") && (MouseX >= 1000) && (MouseX <= 1200) && (MouseY >= 400) && (MouseY <= 600)) C009_Library_Library_CurrentZone = "003";
-	if ((C009_Library_Library_CurrentZone == "001") && (MouseX >= 500) && (MouseX <= 700) && (MouseY >= 200) && (MouseY <= 400)) C009_Library_Library_CurrentZone = "004";
+	// In Zone 1, the player can go to zone 2 or 3 or search once
+	var E = true;
+	if (E && (C009_Library_Library_CurrentZone == "001") && (MouseX >= 0) && (MouseX <= 200) && (MouseY >= 400) && (MouseY <= 600)) E = C009_Library_Library_StartSearch(10);
+	if (E && (C009_Library_Library_CurrentZone == "001") && (MouseX >= 500) && (MouseX <= 700) && (MouseY >= 350) && (MouseY <= 550)) E = C009_Library_Library_EnterZone("002");
+	if (E && (C009_Library_Library_CurrentZone == "001") && (MouseX >= 1000) && (MouseX <= 1200) && (MouseY >= 400) && (MouseY <= 600)) E = C009_Library_Library_EnterZone("003");
 
-	// In Zone 2, the player can go to 1 or search the books
-	if ((C009_Library_Library_CurrentZone == "002") && (MouseX >= 500) && (MouseX <= 700) && (MouseY >= 400) && (MouseY <= 600)) C009_Library_Library_CurrentZone = "001";
-	if ((C009_Library_Library_CurrentZone == "002") && (MouseX >= 0) && (MouseX <= 300) && (MouseY >= 50) && (MouseY <= 350)) SetScene(CurrentChapter, "Search" + C009_Library_Library_CurrentZone + "A");
-	if ((C009_Library_Library_CurrentZone == "002") && (MouseX >= 900) && (MouseX <= 1200) && (MouseY >= 50) && (MouseY <= 350)) SetScene(CurrentChapter, "Search" + C009_Library_Library_CurrentZone + "B");
+	// In Zone 2, the player can go to zone 1, 4 or 5
+	if (E && (C009_Library_Library_CurrentZone == "002") && (MouseX >= 500) && (MouseX <= 700) && (MouseY >= 400) && (MouseY <= 600)) E = C009_Library_Library_EnterZone("001");
+
+	// In Zone 3, the player can to to zone 1 or search twice
+	if (E && (C009_Library_Library_CurrentZone == "003") && (MouseX >= 500) && (MouseX <= 700) && (MouseY >= 400) && (MouseY <= 600)) E = C009_Library_Library_EnterZone("001");
+	if (E && (C009_Library_Library_CurrentZone == "003") && (MouseX >= 0) && (MouseX <= 400) && (MouseY >= 100) && (MouseY <= 500)) E = C009_Library_Library_StartSearch(30);
+	if (E && (C009_Library_Library_CurrentZone == "003") && (MouseX >= 450) && (MouseX <= 750) && (MouseY >= 100) && (MouseY <= 400)) E = C009_Library_Library_StartSearch(31);
+	if (E && (C009_Library_Library_CurrentZone == "003") && (MouseX >= 800) && (MouseX <= 1200) && (MouseY >= 100) && (MouseY <= 500)) E = C009_Library_Library_StartSearch(32);
 
 }
\ No newline at end of file
diff --git a/C009_Library/Search/10.jpg b/C009_Library/Search/10.jpg
new file mode 100644
index 0000000000..ad5100dfaf
Binary files /dev/null and b/C009_Library/Search/10.jpg differ
diff --git a/C009_Library/Search/30.jpg b/C009_Library/Search/30.jpg
new file mode 100644
index 0000000000..8469e4f721
Binary files /dev/null and b/C009_Library/Search/30.jpg differ
diff --git a/C009_Library/Search/31.jpg b/C009_Library/Search/31.jpg
new file mode 100644
index 0000000000..434a1333d9
Binary files /dev/null and b/C009_Library/Search/31.jpg differ
diff --git a/C009_Library/Search/32.jpg b/C009_Library/Search/32.jpg
new file mode 100644
index 0000000000..fe7daa5f40
Binary files /dev/null and b/C009_Library/Search/32.jpg differ
diff --git a/C009_Library/Search/33.jpg b/C009_Library/Search/33.jpg
new file mode 100644
index 0000000000..fe7daa5f40
Binary files /dev/null and b/C009_Library/Search/33.jpg differ
diff --git a/C009_Library/Search/34.jpg b/C009_Library/Search/34.jpg
new file mode 100644
index 0000000000..4b44646733
Binary files /dev/null and b/C009_Library/Search/34.jpg differ
diff --git a/C009_Library/Search/35.jpg b/C009_Library/Search/35.jpg
new file mode 100644
index 0000000000..ade7317b01
Binary files /dev/null and b/C009_Library/Search/35.jpg differ
diff --git a/C009_Library/Search/36.jpg b/C009_Library/Search/36.jpg
new file mode 100644
index 0000000000..9b37db2d7b
Binary files /dev/null and b/C009_Library/Search/36.jpg differ
diff --git a/C009_Library/Search/37.jpg b/C009_Library/Search/37.jpg
new file mode 100644
index 0000000000..0c900c3c0b
Binary files /dev/null and b/C009_Library/Search/37.jpg differ
diff --git a/C009_Library/Search/Chair.jpg b/C009_Library/Search/Chair.jpg
new file mode 100644
index 0000000000..7311b25cd7
Binary files /dev/null and b/C009_Library/Search/Chair.jpg differ
diff --git a/C009_Library/Search/Intro_EN.csv b/C009_Library/Search/Intro_EN.csv
new file mode 100644
index 0000000000..dafd55d170
--- /dev/null
+++ b/C009_Library/Search/Intro_EN.csv
@@ -0,0 +1,10 @@
+Stage,LoveReq,SubReq,VarReq,IntroText,Image
+10,0,0,,You find an empty corner in the library.|There's an old chair and books on chemistry.,10.jpg
+30,0,0,,"On the left side of the corridor, there's|a shelve full of books on mathematics.",30.jpg
+31,0,0,,"On the right side of the corridor, there's|a shelve full of books on physics.",31.jpg
+32,0,0,,This corridor is a dead end but there are a|few books left and a huge wooden counter.,32.jpg
+33,0,0,,,33.jpg
+34,0,0,,,34.jpg
+35,0,0,,,35.jpg
+36,0,0,,,36.jpg
+37,0,0,,,37.jpg
diff --git a/C009_Library/Search/Script.js b/C009_Library/Search/Script.js
new file mode 100644
index 0000000000..2e51a9c5a6
--- /dev/null
+++ b/C009_Library/Search/Script.js
@@ -0,0 +1,67 @@
+var C009_Library_Search_CurrentStage = 0;
+var C009_Library_Search_SearchCounterDone = false;
+var C009_Library_Search_CanLearnRopeMastery = true;
+var C009_Library_Search_MasturbateCount = 0;
+var C009_Library_Search_IntroText = "";
+
+// Chapter 9 Library - Search Area Load
+function C009_Library_Search_Load() {
+	LeaveIcon = "Leave";
+	LeaveScreen = "Library";
+	LoadInteractions();
+	if (C009_Library_Search_IntroText != "") OverridenIntroText = C009_Library_Search_IntroText;
+	C009_Library_Search_IntroText = "";
+}
+
+// Chapter 9 Library - Search Area Run
+function C009_Library_Search_Run() {
+	BuildInteraction(C009_Library_Search_CurrentStage);
+}
+
+// Chapter 9 Library - Search Area Click
+function C009_Library_Search_Click() {	
+
+	// Regular interactions
+	ClickInteraction(C009_Library_Search_CurrentStage);
+
+	// Can open the player screen from here
+	var ClickInv = GetClickedInventory();
+	if (ClickInv != "") {
+		C009_Library_Search_IntroText = OverridenIntroText;
+		InventoryClick(ClickInv, CurrentChapter, CurrentScreen);
+	}
+
+}
+
+// Chapter 9 - Library Search behind the counter
+function C009_Library_Search_SearchCounter() {
+	if (!C009_Library_Search_SearchCounterDone) {
+		OverridenIntroText = GetText("FindItem");
+		PlayerAddRandomItem();
+		C009_Library_Search_SearchCounterDone = true;
+	}
+}
+
+// Chapter 9 - Library Masturbate, if the player has the egg, she can climax multiple times, if not, only 1 time
+function C009_Library_Search_Masturbate() {
+	if (Common_PlayerChaste) {
+		OverridenIntroText = GetText("CannotMasturbate");
+	} else {
+		C009_Library_Search_MasturbateCount++;
+		if (C009_Library_Search_MasturbateCount == 3) OverridenIntroText = GetText("Orgasm");
+		if ((C009_Library_Search_MasturbateCount >= 4) && !PlayerHasLockedInventory("VibratingEgg")) OverridenIntroText = GetText("OrgasmEnough");
+		if ((C009_Library_Search_MasturbateCount >= 4) && PlayerHasLockedInventory("VibratingEgg")) {
+			OverridenIntroText = GetText("OrgasmRepeat");
+			C009_Library_Search_MasturbateCount = 0;
+		}
+	}
+}
+
+// Chapter 9 - Library Learn Rope Mastery, the player needs 15 minutes
+function C009_Library_Search_LearnRopeMastery() {
+	if (CurrentTime <= 15 * 60 * 60 * 1000) {
+		PlayerAddSkill("RopeMastery", 1);
+		CurrentTime = CurrentTime + 0.25 * 60 * 60 * 1000;
+		C009_Library_Search_CanLearnRopeMastery = false;
+	} else OverridenIntroText = GetText("TrainRopeMasteryNoTime");
+}
\ No newline at end of file
diff --git a/C009_Library/Search/Stage_EN.csv b/C009_Library/Search/Stage_EN.csv
new file mode 100644
index 0000000000..d41132aa94
--- /dev/null
+++ b/C009_Library/Search/Stage_EN.csv
@@ -0,0 +1,19 @@
+Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
+10,0,0,!Common_PlayerRestrained,(Search.)|(1 minute),You search in the bookshelves but all|you can find are books about chemistry.,10,0,0,
+10,0,0,,(Sit down.)|(1 minute),You sit down and relax on|the chair for a little while.,10,0,0,
+30,0,0,!Common_PlayerRestrained,(Search.)|(1 minute),You search in the shelves but all you|can find are boring books on mathematics.,30,0,0,
+31,0,0,!Common_PlayerRestrained,(Search.)|(1 minute),You search the dead end part of the|corridor but don't find anything interesting.,31,0,0,SearchCounter()
+32,0,0,!Common_PlayerRestrained,(Search.)|(1 minute),You search in the shelves and find a|comic book hidden in between the books.,33,0,0,
+33,0,0,,(Fetch the comic.)|(1 minute),"It's an old comic called ""Sweet Gwendoline"".|It was written and drawned by John Willie.",34,0,0,
+33,0,0,,(Leave it there.),You leave the comic between the books.,32,0,0,
+34,0,0,,(Open the comic.)|(1 minute),"You flip a few pages.  It tells the story of|Gwendoline, a blond who gets tied up often.",35,0,0,
+34,0,0,,(Put it back.),You leave the comic between the books.,32,0,0,
+35,0,0,,(Read some more.)|(1 minute),"You read a little more, the damsel|gets roped in many inescapable positions.",36,0,0,
+35,0,0,,(Masturbate.)|(1 minute),You silently masturbate while looking at|the magazine and get a nice warm feeling.,35,0,0,Masturbate()
+35,0,0,,(Put it back.),You leave the comic between the books.,32,0,0,
+36,0,0,,(Read some more.)|(1 minute),"In the comic, there's a guide on|how to do advanced rope bondage.",37,0,0,
+36,0,0,,(Masturbate.)|(1 minute),You silently masturbate while looking at|the magazine and get a nice warm feeling.,36,0,0,Masturbate()
+36,0,0,,(Put it back.),You leave the comic between the books.,32,0,0,
+37,0,0,CanLearnRopeMastery,(Study the comic.)|(15 minutes),You study the rope bondage techniques from|the comic and might have learned a few tricks.,37,0,0,LearnRopeMastery()
+37,0,0,,(Masturbate.)|(1 minute),You silently masturbate while looking at|the magazine and get a nice warm feeling.,37,0,0,Masturbate()
+37,0,0,,(Put it back.),You leave the comic between the books.,32,0,0,
diff --git a/C009_Library/Search/Text_EN.csv b/C009_Library/Search/Text_EN.csv
new file mode 100644
index 0000000000..50a2314244
--- /dev/null
+++ b/C009_Library/Search/Text_EN.csv
@@ -0,0 +1,7 @@
+Tag,Content
+FindItem,You check the wooden counter and|find a box with an interesting item.
+TrainRopeMasteryNoTime,You don't have enough time to|study the comic before your next class.
+CannotMasturbate,You try to slide a finger inside|your belt but fail miserably.
+Orgasm,"You stimulate yourself lovingly and|tremble with ecstasy, getting a silent orgasm."
+OrgasmEnough,You play with yourself but|you're not horny anymore.
+OrgasmRepeat,You touch yourself and the vibrating egg|kicks in to give you desires for another round.
diff --git a/C010_Revenge/AmandaSarah/Text_EN.csv b/C010_Revenge/AmandaSarah/Text_EN.csv
index 0f2e723c70..2beff6a1d1 100644
--- a/C010_Revenge/AmandaSarah/Text_EN.csv
+++ b/C010_Revenge/AmandaSarah/Text_EN.csv
@@ -11,7 +11,7 @@ CaughtMasturbating,(The locker opens suddenly and Sarah yells.)|Oh my god!  So k
 LearnLesson,(The locker opens and Amanda smiles.)|So have you learned a lesson today?
 Orgasm,"(You stimulate yourself right on the spot and|tremble with ecstasy, 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.)
+OrgasmRepeat,(You 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."
diff --git a/C999_Common/VibratingEgg/Script.js b/C999_Common/VibratingEgg/Script.js
index 7e61e7b423..355a5176a2 100644
--- a/C999_Common/VibratingEgg/Script.js
+++ b/C999_Common/VibratingEgg/Script.js
@@ -42,7 +42,7 @@ function C999_Common_VibratingEgg_Insert() {
 		} else {
 			PlayerRemoveInventory("VibratingEgg", 1);
 			PlayerLockInventory("VibratingEgg");
-			C999_Common_VibratingEgg_CurrentStage = 10;			
+			C999_Common_VibratingEgg_CurrentStage = 10;
 			C999_Common_VibratingEgg_HasLooseEgg = PlayerHasInventory("VibratingEgg");
 		}		
 	} else {
@@ -50,6 +50,20 @@ function C999_Common_VibratingEgg_Insert() {
 	}
 }
 
+// Chapter Common - Egg Contract, the egg can be removed if the player isn't chaste and has "Sports" at level 1 or more
+function C999_Common_VibratingEgg_Contract() {
+	if (!Common_PlayerChaste) {
+		if (PlayerGetSkillLevel("Sports") >= 1) {
+			PlayerUnlockInventory("VibratingEgg");
+			PlayerAddInventory("VibratingEgg", 1);
+			C999_Common_VibratingEgg_CurrentStage = 0;
+			C999_Common_VibratingEgg_HasLooseEgg = true;
+			OverridenIntroText = GetText("ContractSuccess");
+		}
+	}
+	else OverridenIntroText = GetText("ContractBelt");
+}
+
 // Chapter Common - Show the item image
 function C999_Common_VibratingEgg_ShowImage() {
 	OverridenIntroImage = "Egg.jpg";
diff --git a/C999_Common/VibratingEgg/Stage_CN.csv b/C999_Common/VibratingEgg/Stage_CN.csv
index a4e25031e2..fed4e5eae9 100644
--- a/C999_Common/VibratingEgg/Stage_CN.csv
+++ b/C999_Common/VibratingEgg/Stage_CN.csv
@@ -2,7 +2,8 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 0,0,0,,(Inspect it.)|(1 minute),This vibrating egg is so random and small.|It might be hard to get it back if you insert it.,0,0,0,
 0,0,0,Common_PlayerNotRestrained,(Insert it.)|(1 minute),"You slip the egg in your vagina.  It vibrates and goes|deeper, you're not sure you'll be able to remove it.",0,0,0,Insert()
 10,0,0,HasLooseEgg,(Inspect the loose egg.)|(1 minute),This vibrating egg is so random and small.|It might be hard to get it back if inserted.,10,0,0,ShowImage()
-10,0,0,,(Remove it with a finger.)|(1 minute),You slide a finger in but cannot grab|the egg to remove it.  You're stuck with it.,10,0,0,
-10,0,0,,(Remove it by contracting.)|(1 minute),You squirm and try to contract your vagina|but the egg doesn't move.  You're stuck with it.,10,0,0,
+10,0,0,!Common_PlayerChaste,(Remove it with a finger.)|(1 minute),You slide a finger in but cannot grab|the egg to remove it.  You're stuck with it.,10,0,0,
+10,0,0,Common_PlayerChaste,(Remove it with a finger.)|(1 minute),You tug on the belt and try to slide a finger|inside but there's no way you could reach the egg.,10,0,0,
+10,0,0,,(Remove it by contracting.)|(1 minute),You squirm and try to contract your vagina|but the egg doesn't move.  You're stuck with it.,10,0,0,Contract()
 20,0,0,HasLooseEgg,(Inspect the loose egg.)|(1 minute),This vibrating egg is so random and small.|It might be hard to get it back if inserted.,20,0,0,ShowImage()
-20,0,0,,(Remove it by contracting.)|(1 minute),You squirm and try to contract your vagina|but the egg doesn't move.  You're stuck with it.,20,0,0,
+20,0,0,,(Remove it by contracting.)|(1 minute),You squirm and try to contract your vagina but|without a free hand there's no way to remove the egg.,20,0,0,
diff --git a/C999_Common/VibratingEgg/Stage_EN.csv b/C999_Common/VibratingEgg/Stage_EN.csv
index a4e25031e2..fed4e5eae9 100644
--- a/C999_Common/VibratingEgg/Stage_EN.csv
+++ b/C999_Common/VibratingEgg/Stage_EN.csv
@@ -2,7 +2,8 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 0,0,0,,(Inspect it.)|(1 minute),This vibrating egg is so random and small.|It might be hard to get it back if you insert it.,0,0,0,
 0,0,0,Common_PlayerNotRestrained,(Insert it.)|(1 minute),"You slip the egg in your vagina.  It vibrates and goes|deeper, you're not sure you'll be able to remove it.",0,0,0,Insert()
 10,0,0,HasLooseEgg,(Inspect the loose egg.)|(1 minute),This vibrating egg is so random and small.|It might be hard to get it back if inserted.,10,0,0,ShowImage()
-10,0,0,,(Remove it with a finger.)|(1 minute),You slide a finger in but cannot grab|the egg to remove it.  You're stuck with it.,10,0,0,
-10,0,0,,(Remove it by contracting.)|(1 minute),You squirm and try to contract your vagina|but the egg doesn't move.  You're stuck with it.,10,0,0,
+10,0,0,!Common_PlayerChaste,(Remove it with a finger.)|(1 minute),You slide a finger in but cannot grab|the egg to remove it.  You're stuck with it.,10,0,0,
+10,0,0,Common_PlayerChaste,(Remove it with a finger.)|(1 minute),You tug on the belt and try to slide a finger|inside but there's no way you could reach the egg.,10,0,0,
+10,0,0,,(Remove it by contracting.)|(1 minute),You squirm and try to contract your vagina|but the egg doesn't move.  You're stuck with it.,10,0,0,Contract()
 20,0,0,HasLooseEgg,(Inspect the loose egg.)|(1 minute),This vibrating egg is so random and small.|It might be hard to get it back if inserted.,20,0,0,ShowImage()
-20,0,0,,(Remove it by contracting.)|(1 minute),You squirm and try to contract your vagina|but the egg doesn't move.  You're stuck with it.,20,0,0,
+20,0,0,,(Remove it by contracting.)|(1 minute),You squirm and try to contract your vagina but|without a free hand there's no way to remove the egg.,20,0,0,
diff --git a/C999_Common/VibratingEgg/Stage_FR.csv b/C999_Common/VibratingEgg/Stage_FR.csv
index e301d47ba1..7160f5c075 100644
--- a/C999_Common/VibratingEgg/Stage_FR.csv
+++ b/C999_Common/VibratingEgg/Stage_FR.csv
@@ -2,7 +2,8 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 0,0,0,,(Tu l'examines.)|(1 minute),Cet oeuf vibrant est si fortuit et petit.|Ça risque d'être dur de le récupérer si tu l'insères.,0,0,0,
 0,0,0,Common_PlayerNotRestrained,(Tu l'insères.)|(1 minute),"Tu glisses l'oeuf dans ton vagin. Il vibre et s'enfonce|profondément, tu n'es pas sûre de pouvoir l'enlever.",0,0,0,Insert()
 10,0,0,HasLooseEgg,(Tu examines un autre|oeuf.) (1 minute),Cet oeuf vibrant est si fortuit et petit.|Ça risque d'être dur de le récupérer s'il est inséré.,10,0,0,ShowImage()
-10,0,0,,(Tu l'enlèves avec un|doigt.) (1 minute),Tu glisses un doigt à l'intérieur mais|tu n'arrives pas à l'attraper. Tu es coincée avec.,10,0,0,
+10,0,0,!Common_PlayerChaste,(Tu l'enlèves avec un|doigt.) (1 minute),Tu glisses un doigt à l'intérieur mais|tu n'arrives pas à l'attraper. Tu es coincée avec.,10,0,0,
+10,0,0,Common_PlayerChaste,(Tu l'enlèves avec un|doigt.) (1 minute),Tu essayes de glisser un doigt à l'intérieur|pour attraper l'oeuf mais la ceinture t'en empêche.,10,0,0,
 10,0,0,,(Tu l'enlèves en poussant.)|(1 minute),Tu te détends et essayes de l'expulser de ton vagin|mais l'oeuf ne bouge pas. Tu es coincée avec.,10,0,0,
 20,0,0,HasLooseEgg,(Tu examines un autre|oeuf.) (1 minute),Cet oeuf vibrant est si fortuit et petit.|Ça risque d'être dur de le récupérer s'il est inséré.,20,0,0,ShowImage()
-20,0,0,,(Tu l'enlèves en poussant.)|(1 minute),Tu te détends et essayes de l'expulser de ton vagin|mais l'oeuf ne bouge pas. Tu es coincée avec.,20,0,0,
+20,0,0,,(Tu l'enlèves en poussant.)|(1 minute),Tu te détends et essayes de l'expulser de ton vagin|mais sans une main de libre ce sera impossible de l'enlever.,20,0,0,
diff --git a/C999_Common/VibratingEgg/Text_CN.csv b/C999_Common/VibratingEgg/Text_CN.csv
index 69c3d34839..64641b4f73 100644
--- a/C999_Common/VibratingEgg/Text_CN.csv
+++ b/C999_Common/VibratingEgg/Text_CN.csv
@@ -1,3 +1,5 @@
 Tag,Content
 ConfirmInsert,Are you sure you want to insert the egg|in your vagina?  Click again to do so.
 ChastityBelt,You tug and pull on your chastity belt to|insert the egg but there's not enough room.
+ContractSuccess,You force and contract your vagina and|you're able to push the egg enough to grab it.
+ContractBelt,"Wearing that belt, there's no way for|you to contract and remove that egg."
diff --git a/C999_Common/VibratingEgg/Text_EN.csv b/C999_Common/VibratingEgg/Text_EN.csv
index 69c3d34839..64641b4f73 100644
--- a/C999_Common/VibratingEgg/Text_EN.csv
+++ b/C999_Common/VibratingEgg/Text_EN.csv
@@ -1,3 +1,5 @@
 Tag,Content
 ConfirmInsert,Are you sure you want to insert the egg|in your vagina?  Click again to do so.
 ChastityBelt,You tug and pull on your chastity belt to|insert the egg but there's not enough room.
+ContractSuccess,You force and contract your vagina and|you're able to push the egg enough to grab it.
+ContractBelt,"Wearing that belt, there's no way for|you to contract and remove that egg."
diff --git a/C999_Common/VibratingEgg/Text_FR.csv b/C999_Common/VibratingEgg/Text_FR.csv
index 751beac6be..4a86f0e09b 100644
--- a/C999_Common/VibratingEgg/Text_FR.csv
+++ b/C999_Common/VibratingEgg/Text_FR.csv
@@ -1,3 +1,5 @@
 Tag,Content
 ConfirmInsert,Es-tu certaine de vouloir insérer l'oeuf dans|ton vagin ? Clique de nouveau pour le faire.
-ChastityBelt,Tu te débats avec la ceinture de chasteté mais n'arrives|pas à trouver l'espace requis pour insérer l'oeuf.
\ No newline at end of file
+ChastityBelt,Tu te débats avec la ceinture de chasteté mais n'arrives|pas à trouver l'espace requis pour insérer l'oeuf.
+ContractSuccess,Tu forces en contractant ton vagin et tu|parviens à expluser l'oeuf suffisament pour l'enlever.
+ContractBelt,"Prisonnière dans cette ceinture, il est|impossible pour toi d'atteindre et retirer l'oeuf."
diff --git a/Drawing.js b/Drawing.js
index 2762c7fe50..ff2d4e381d 100644
--- a/Drawing.js
+++ b/Drawing.js
@@ -15,6 +15,17 @@ var Icons = new function () {
         this.ElbowBound = GetIconPath(this.Path, "ElbowBound");
         this.KneeBound = GetIconPath(this.Path, "KneeBound");
     }(this);
+    this.Navigation = new function (parent) {
+        this.Path = GetPath("Icons", "Navigation");
+        this.ArrowLeftActive = GetIconPath(this.Path, "ArrowLeftActive");
+        this.ArrowRightActive = GetIconPath(this.Path, "ArrowRightActive");
+        this.ArrowUpActive = GetIconPath(this.Path, "ArrowUpActive");
+        this.ArrowDownActive = GetIconPath(this.Path, "ArrowDownActive");
+        this.ArrowLeftInactive = GetIconPath(this.Path, "ArrowLeftInactive");
+        this.ArrowRightInactive = GetIconPath(this.Path, "ArrowRightInactive");
+        this.ArrowUpInactive = GetIconPath(this.Path, "ArrowUpInactive");
+        this.ArrowDownInactive = GetIconPath(this.Path, "ArrowDownInactive");
+    }(this);
 }();
 
 // Returns the image file or build it from the source
diff --git a/Icons/Navigation/Arrow.png b/Icons/Navigation/Arrow.png
new file mode 100644
index 0000000000..44eca301ba
Binary files /dev/null and b/Icons/Navigation/Arrow.png differ
diff --git a/Icons/Navigation/ArrowDownActive.png b/Icons/Navigation/ArrowDownActive.png
new file mode 100644
index 0000000000..24dd56c9da
Binary files /dev/null and b/Icons/Navigation/ArrowDownActive.png differ
diff --git a/Icons/Navigation/ArrowDownInactive.png b/Icons/Navigation/ArrowDownInactive.png
new file mode 100644
index 0000000000..2e1524332d
Binary files /dev/null and b/Icons/Navigation/ArrowDownInactive.png differ
diff --git a/Icons/Navigation/ArrowLeftActive.png b/Icons/Navigation/ArrowLeftActive.png
new file mode 100644
index 0000000000..95f0932795
Binary files /dev/null and b/Icons/Navigation/ArrowLeftActive.png differ
diff --git a/Icons/Navigation/ArrowLeftInactive.png b/Icons/Navigation/ArrowLeftInactive.png
new file mode 100644
index 0000000000..0043c00e3c
Binary files /dev/null and b/Icons/Navigation/ArrowLeftInactive.png differ
diff --git a/Icons/Navigation/ArrowRightActive.png b/Icons/Navigation/ArrowRightActive.png
new file mode 100644
index 0000000000..8c62b5f9dc
Binary files /dev/null and b/Icons/Navigation/ArrowRightActive.png differ
diff --git a/Icons/Navigation/ArrowRightInactive.png b/Icons/Navigation/ArrowRightInactive.png
new file mode 100644
index 0000000000..dfd50e530d
Binary files /dev/null and b/Icons/Navigation/ArrowRightInactive.png differ
diff --git a/Icons/Navigation/ArrowUpActive.png b/Icons/Navigation/ArrowUpActive.png
new file mode 100644
index 0000000000..b8643cb4ea
Binary files /dev/null and b/Icons/Navigation/ArrowUpActive.png differ
diff --git a/Icons/Navigation/ArrowUpInactive.png b/Icons/Navigation/ArrowUpInactive.png
new file mode 100644
index 0000000000..c07c444a2c
Binary files /dev/null and b/Icons/Navigation/ArrowUpInactive.png differ
diff --git a/index.html b/index.html
index d6cbcdb73d..2771545187 100644
--- a/index.html
+++ b/index.html
@@ -97,6 +97,7 @@
 <script src="C008_DramaClass/Outro/Script.js"></script>
 <script src="C009_Library/Intro/Script.js"></script>
 <script src="C009_Library/Library/Script.js"></script>
+<script src="C009_Library/Search/Script.js"></script>
 <script src="C009_Library/Outro/Script.js"></script>
 <script src="C010_Revenge/Intro/Script.js"></script>
 <script src="C010_Revenge/AmandaSarah/Script.js"></script>