diff --git a/3DGC_HeavySaves/Bondage Club Legs Closed.png b/3DGC_HeavySaves/Bondage Club Legs Closed.png
new file mode 100644
index 0000000000..e3be4e2f31
Binary files /dev/null and b/3DGC_HeavySaves/Bondage Club Legs Closed.png differ
diff --git a/BondageClub/Backgrounds/Cell.jpg b/BondageClub/Backgrounds/Cell.jpg
new file mode 100644
index 0000000000..ca5a9728d7
Binary files /dev/null and b/BondageClub/Backgrounds/Cell.jpg differ
diff --git a/BondageClub/Backgrounds/CellDark.jpg b/BondageClub/Backgrounds/CellDark.jpg
new file mode 100644
index 0000000000..681bb76bdc
Binary files /dev/null and b/BondageClub/Backgrounds/CellDark.jpg differ
diff --git a/BondageClub/Icons/Cell.png b/BondageClub/Icons/Cell.png
new file mode 100644
index 0000000000..cbfeaeaff3
Binary files /dev/null and b/BondageClub/Icons/Cell.png differ
diff --git a/BondageClub/Icons/Minus.png b/BondageClub/Icons/Minus.png
new file mode 100644
index 0000000000..6f108bb80f
Binary files /dev/null and b/BondageClub/Icons/Minus.png differ
diff --git a/BondageClub/Icons/Plus.png b/BondageClub/Icons/Plus.png
new file mode 100644
index 0000000000..233e9ab13d
Binary files /dev/null and b/BondageClub/Icons/Plus.png differ
diff --git a/BondageClub/Icons/Start.png b/BondageClub/Icons/Start.png
new file mode 100644
index 0000000000..9f71fbb1e8
Binary files /dev/null and b/BondageClub/Icons/Start.png differ
diff --git a/BondageClub/Screens/Character/Login/Login.js b/BondageClub/Screens/Character/Login/Login.js
index 543312eb91..017f91302c 100644
--- a/BondageClub/Screens/Character/Login/Login.js
+++ b/BondageClub/Screens/Character/Login/Login.js
@@ -168,21 +168,26 @@ function LoginResponse(C) {
 
 			// Fixes a few items
 			InventoryRemove(Player, "ItemMisc");
+			if (LogQuery("JoinedSorority", "Maid") && !InventoryAvailable(Player, "MaidOutfit2", "Cloth")) InventoryAdd(Player, "MaidOutfit2", "Cloth");
 			if ((InventoryGet(Player, "ItemArms") != null) && (InventoryGet(Player, "ItemArms").Asset.Name == "FourLimbsShackles")) InventoryRemove(Player, "ItemArms");
 			LoginValidCollar();
 
-			// If the player must start in her room, in her cage
-			if (LogQuery("SleepCage", "Rule") && (Player.Owner != "") && PrivateOwnerInRoom()) {
-				InventoryRemove(Player, "ItemFeet");
-				InventoryRemove(Player, "ItemLegs");
-				Player.Cage = true;
-				CharacterSetActivePose(Player, "Kneel");
-				CommonSetScreen("Room", "Private");
-			} else CommonSetScreen("Room", "MainHall");
+			// If the player must log back in the cell
+			if (LogQuery("Locked", "Cell")) {
+				CommonSetScreen("Room", "Cell");
+			} else {
+
+				// If the player must start in her room, in her cage
+				if (LogQuery("SleepCage", "Rule") && (Player.Owner != "") && PrivateOwnerInRoom()) {
+					InventoryRemove(Player, "ItemFeet");
+					InventoryRemove(Player, "ItemLegs");
+					Player.Cage = true;
+					CharacterSetActivePose(Player, "Kneel");
+					CommonSetScreen("Room", "Private");
+				} else CommonSetScreen("Room", "MainHall");
 			
-			if(LogQuery("JoinedSorority", "Maid") && !InventoryAvailable(Player, "MaidOutfit2", "Cloth")){
-				InventoryAdd(Player, "MaidOutfit2", "Cloth");
 			}
+
 		} else LoginMessage = TextGet("ErrorLoadingCharacterData");
 	} else LoginMessage = TextGet(C);
 
diff --git a/BondageClub/Screens/Character/Player/Dialog_Player.csv b/BondageClub/Screens/Character/Player/Dialog_Player.csv
index b01e0b709a..b9b27f385e 100644
--- a/BondageClub/Screens/Character/Player/Dialog_Player.csv
+++ b/BondageClub/Screens/Character/Player/Dialog_Player.csv
@@ -40,6 +40,7 @@ PumpIt,,,Pump it
 pumps,,,pumps
 deflates,,,deflates
 gag,,,gag
+'s,,,'s
 Delete,,,Delete
 ConfirmDelete,,,Confirm
 Beep,,,Beep
@@ -160,4 +161,4 @@ FacialExpressionMedium,,,Medium
 FacialExpressionHigh,,,High
 FacialExpressionFrown,,,Frown
 FacialExpressionClosed,,,Closed
-FacialExpressionWink,,,Wink
\ No newline at end of file
+FacialExpressionWink,,,Wink
diff --git a/BondageClub/Screens/Inventory/ItemMouth/PumpGag/PumpGag.js b/BondageClub/Screens/Inventory/ItemMouth/PumpGag/PumpGag.js
index 05cc601daa..68fd92e2c8 100644
--- a/BondageClub/Screens/Inventory/ItemMouth/PumpGag/PumpGag.js
+++ b/BondageClub/Screens/Inventory/ItemMouth/PumpGag/PumpGag.js
@@ -55,6 +55,6 @@ function InventoryItemMouthPumpGagSetPump(Modifier) {
 	// Reloads the character
 	CharacterLoadEffect(C);
 	if (C.ID == 0) ServerPlayerAppearanceSync();
-	ChatRoomPublishCustomAction(Player.Name + " " + DialogFind(Player, ((Modifier > 0) ? "pumps" : "deflates")) + " " + C.Name + " " + DialogFind(Player, "gag") + ".", true);
+	ChatRoomPublishCustomAction(Player.Name + " " + DialogFind(Player, ((Modifier > 0) ? "pumps" : "deflates")) + " " + C.Name + DialogFind(Player, "'s") + " " + DialogFind(Player, "gag") + ".", true);
 
 }
\ No newline at end of file
diff --git a/BondageClub/Screens/Room/Cell/Cell.js b/BondageClub/Screens/Room/Cell/Cell.js
new file mode 100644
index 0000000000..f89cef0a41
--- /dev/null
+++ b/BondageClub/Screens/Room/Cell/Cell.js
@@ -0,0 +1,44 @@
+"use strict";
+var CellBackground = "Cell";
+var CellMinutes = 5;
+var CellOpenTimer = 0;
+
+// Loads the cell screen
+function CellLoad() {
+	CellOpenTimer = LogValue("Locked", "Cell")
+	if (CellOpenTimer == null) CellOpenTimer = 0;
+	if (CellOpenTimer > CurrentTime + 3600000) {
+		LogDelete("Locked", "Cell");
+		CellOpenTimer = 0;
+	}
+}
+
+// Run the cell screen
+function CellRun() {
+	DrawCharacter(Player, 750, 0, 1);
+	if (CellOpenTimer < CurrentTime) DrawButton(1885, 25, 90, 90, "", "White", "Icons/Exit.png", TextGet("Leave"));
+	DrawButton(1885, 145, 90, 90, "", "White", "Icons/Character.png", TextGet("Profile"));
+	if (CellOpenTimer < CurrentTime) DrawButton(1885, 265, 90, 90, "", "White", "Icons/Start.png", TextGet("Lock"));
+	if (CellOpenTimer < CurrentTime) DrawButton(1885, 385, 90, 90, "", "White", "Icons/Plus.png", TextGet("AddTime"));
+	if (CellOpenTimer < CurrentTime) DrawButton(1885, 505, 90, 90, "", "White", "Icons/Minus.png", TextGet("RemoveTime"));
+	if (CellOpenTimer < CurrentTime) DrawText(TextGet("Timer") + " " + CellMinutes.toString() + " " + TextGet("Minutes"), 1620, 920, "White", "Black");
+	else DrawText(TextGet("OpensIn") + " " + TimerToString(CellOpenTimer - CurrentTime), 1620, 920, "White", "Black");
+}
+
+// When the user clicks in the cell screen
+function CellClick() {
+	if ((MouseX >= 750) && (MouseX < 1250) && (MouseY >= 0) && (MouseY < 1000)) CharacterSetCurrent(Player);
+	if ((MouseX >= 1885) && (MouseX < 1975) && (MouseY >= 145) && (MouseY < 235)) InformationSheetLoadCharacter(Player);
+	if (CellOpenTimer < CurrentTime) {
+		if ((MouseX >= 1885) && (MouseX < 1975) && (MouseY >= 25) && (MouseY < 115)) CommonSetScreen("Room", "MainHall");
+		if ((MouseX >= 1885) && (MouseX < 1975) && (MouseY >= 265) && (MouseY < 355)) CellLock(CellMinutes);
+		if ((MouseX >= 1885) && (MouseX < 1975) && (MouseY >= 385) && (MouseY < 475) && (CellMinutes < 60)) CellMinutes = CellMinutes + 5;
+		if ((MouseX >= 1885) && (MouseX < 1975) && (MouseY >= 505) && (MouseY < 595) && (CellMinutes > 5)) CellMinutes = CellMinutes - 5;
+	}
+}
+
+// When the player gets locked in the cell
+function CellLock(LockTime) {
+	LogAdd("Locked", "Cell", CurrentTime + LockTime * 60000);
+	CommonSetScreen("Room", "Cell");
+}
\ No newline at end of file
diff --git a/BondageClub/Screens/Room/Cell/Text_Cell.csv b/BondageClub/Screens/Room/Cell/Text_Cell.csv
new file mode 100644
index 0000000000..85ce2ede6c
--- /dev/null
+++ b/BondageClub/Screens/Room/Cell/Text_Cell.csv
@@ -0,0 +1,8 @@
+Timer,Lock timer: 
+Minutes,minutes
+Leave,Leave the cell
+Profile,Character profile
+AddTime,Add 5 minutes
+RemoveTime,Remove 5 minutes
+Lock,Lock yourself
+OpensIn,Opens in
diff --git a/BondageClub/Screens/Room/Empty/Empty.js b/BondageClub/Screens/Room/Empty/Empty.js
new file mode 100644
index 0000000000..858d4c00b4
--- /dev/null
+++ b/BondageClub/Screens/Room/Empty/Empty.js
@@ -0,0 +1,38 @@
+"use strict";
+var EmptyBackground = "MainHall";
+var EmptyCharacter = [];
+
+// When used in struggle mode
+function EmptyStruggleSuccess() { return (!Player.IsRestrained() && Player.CanTalk() && (CurrentTime < ManagementTimer)) }
+function EmptyStruggleFail() { return (CurrentTime >= ManagementTimer) }
+function EmptyStruggleProgress() { return ((Player.IsRestrained() || !Player.CanTalk()) && (CurrentTime < ManagementTimer)) }
+
+// Loads the empty room screen
+function EmptyLoad() {
+}
+
+// Run the empty room screen
+function EmptyRun() {
+	for (var C = 0; C < EmptyCharacter.length; C++)
+		DrawCharacter(EmptyCharacter[C], 1000 - EmptyCharacter.length * 250 + C * 500, 0, 1);
+}
+
+// When the user clicks in the empty room screen
+function EmptyClick() {
+	for (var C = 0; C < EmptyCharacter.length; C++)
+		if ((MouseX >= 1000 - EmptyCharacter.length * 250 + C * 500) && (MouseX < 1500 - EmptyCharacter.length * 250 + C * 500) && (MouseY >= 0) && (MouseY < 1000)) 
+			CharacterSetCurrent(EmptyCharacter[C]);
+}
+
+// Returns to the main hall
+function EmptyManagementMainHall() {
+	DialogLeave();
+	CommonSetScreen("Room", "MainHall");
+}
+
+// Locks the player in a cell for 5 minutes
+function EmptyManagementCell() {
+	DialogLeave();
+	CharacterFullRandomRestrain(Player, "ALL");
+	CellLock(5);
+}
\ No newline at end of file
diff --git a/BondageClub/Screens/Room/Empty/Text_Empty.csv b/BondageClub/Screens/Room/Empty/Text_Empty.csv
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/BondageClub/Screens/Room/Empty/Text_Empty.csv
@@ -0,0 +1 @@
+
diff --git a/BondageClub/Screens/Room/MainHall/MainHall.js b/BondageClub/Screens/Room/MainHall/MainHall.js
index 387ad87dae..7c90869658 100644
--- a/BondageClub/Screens/Room/MainHall/MainHall.js
+++ b/BondageClub/Screens/Room/MainHall/MainHall.js
@@ -67,6 +67,9 @@ function MainHallRun() {
 		DrawButton(1765, 385, 90, 90, "", "White", "Icons/Dojo.png", TextGet("ShibariDojo"));
 		if (SarahRoomAvailable) DrawButton(1885, 385, 90, 90, "", "White", "Icons/Explore.png", TextGet(SarahRoomLabel()));
 
+		// Cell
+		DrawButton(1885, 505, 90, 90, "", "White", "Icons/Cell.png", TextGet("Cell"));
+
 		// Draws the custom content rooms - Gambling, Prison & Photographic
 		DrawButton(265, 25, 90, 90, "", "White", "Icons/Camera.png", TextGet("Photographic"));
 		DrawButton(145, 25, 90, 90, "", "White", "Icons/Cage.png", TextGet("Prison"));
@@ -146,6 +149,9 @@ function MainHallClick() {
 		if ((MouseX >= 1765) && (MouseX < 1855) && (MouseY >= 385) && (MouseY < 475)) MainHallWalk("Shibari");
 		if ((MouseX >= 1885) && (MouseX < 1975) && (MouseY >= 385) && (MouseY < 475) && SarahRoomAvailable) MainHallWalk("Sarah");
 
+		// Cell
+		if ((MouseX >= 1885) && (MouseX < 1975) && (MouseY >= 505) && (MouseY < 595)) MainHallWalk("Cell");
+
 		// Custom content rooms - Gambling, Prison & Photographic
 		if ((MouseX >=   25) && (MouseX <  115) && (MouseY >=  25) && (MouseY < 115)) MainHallWalk("Gambling");
 		if ((MouseX >=  145) && (MouseX <  235) && (MouseY >=  25) && (MouseY < 115)) MainHallWalk("Prison");
diff --git a/BondageClub/Screens/Room/MainHall/Text_MainHall.csv b/BondageClub/Screens/Room/MainHall/Text_MainHall.csv
index 3cde90a1b5..ceba9c3854 100644
--- a/BondageClub/Screens/Room/MainHall/Text_MainHall.csv
+++ b/BondageClub/Screens/Room/MainHall/Text_MainHall.csv
@@ -13,6 +13,7 @@ ChatRooms,Online Chat Rooms
 Shop,Club Shop
 Profile,Your Profile
 Appearance,Change Appearance
+Cell,Timer Cell
 Exit,Leave the Club
 SarahBedroom,Sarah's Bedroom
 Gambling,Gambling by git4nick
@@ -22,4 +23,4 @@ Stable,Stable by git4nick
 Nursery,The Nursery by wildsj
 SlaveMarket,Slave Market by wildsj
 RandomKidnap,Seek Trouble by fleisch11
-Magic,Houdini's Theater by git4nick
\ No newline at end of file
+Magic,Houdini's Theater by git4nick
diff --git a/BondageClub/Screens/Room/Management/Dialog_NPC_Management_RandomGirl.csv b/BondageClub/Screens/Room/Management/Dialog_NPC_Management_RandomGirl.csv
index a6bdced3f7..b39f68080a 100644
--- a/BondageClub/Screens/Room/Management/Dialog_NPC_Management_RandomGirl.csv
+++ b/BondageClub/Screens/Room/Management/Dialog_NPC_Management_RandomGirl.csv
@@ -13,13 +13,13 @@ Intro5,,,"(A girl sneaks up behind you.)  Your cute ass is mine, slave girl.",,
 IntroRestrained5,,,"(A girl sneaks up behind you and checks your bondage.)  Your cute ass is mine, restrained girl.",,
 Intro6,,,(A club member jumps of joy seeing you.)  Yes!  A club slave just for me.,,
 IntroRestrained6,,,(A club member jumps of joy seeing you.)  Yes!  A restrained slave just for me.,,
-0,,I'm here to serve you Miss.,,ClubSlaveRandomActivityLaunch(),Player.CanTalk()
-0,,How can I please you?,,ClubSlaveRandomActivityLaunch(),Player.CanTalk()
-0,,Will you release me?,,ClubSlaveRandomActivityLaunch(),Player.IsRestrained()
-0,,Do as you wish.  I'm your slave.,,ClubSlaveRandomActivityLaunch(),Player.CanTalk()
-0,,Please don't be too rough.,,ClubSlaveRandomActivityLaunch(),Player.CanTalk()
-0,,(Try to struggle out.),,ClubSlaveRandomActivityLaunch(),Player.IsRestrained()
-0,,(Let her play with you.),,ClubSlaveRandomActivityLaunch(),
+ActivityIntro,,I'm here to serve you Miss.,,ClubSlaveRandomActivityLaunch(),Player.CanTalk()
+ActivityIntro,,How can I please you?,,ClubSlaveRandomActivityLaunch(),Player.CanTalk()
+ActivityIntro,,Will you release me?,,ClubSlaveRandomActivityLaunch(),Player.IsRestrained()
+ActivityIntro,,Do as you wish.  I'm your slave.,,ClubSlaveRandomActivityLaunch(),Player.CanTalk()
+ActivityIntro,,Please don't be too rough.,,ClubSlaveRandomActivityLaunch(),Player.CanTalk()
+ActivityIntro,,(Try to struggle out.),,ClubSlaveRandomActivityLaunch(),Player.IsRestrained()
+ActivityIntro,,(Let her play with you.),,ClubSlaveRandomActivityLaunch(),
 ActivityAddArmsIntro,,,(She restrains your arms and smiles.)  An unrestrained club slave?  That wasn't proper.,,
 ActivityAddArms,,This is tight.,,ClubSlaveRandomActivityLaunch(),Player.CanTalk()
 ActivityAddArms,,I agree Miss.,,ClubSlaveRandomActivityLaunch(),Player.CanTalk()
@@ -103,3 +103,71 @@ ActivityEnd,ActivityEnd2,Would you like to visit my room?,"Not now, I need to go
 ActivityEnd,,(Leave her.),,ClubSlaveRandomActivityEnd(0),
 ActivityEnd2,,(Leave her.),,ClubSlaveRandomActivityEnd(0),
 ActivityEnd3,,Follow me!  (Bring her to your room.),,ClubSlaveTransferToRoom(),
+StruggleIntro,StrugglePlan,I'm here to serve you Miss.,"Good.  I hope you like to be tied up girl, cause I have a devious plan for you.",,Player.CanTalk()
+StruggleIntro,StrugglePlan,How can I please you?,"(She ponders.)  I hope you like to be tied up girl, cause I have a devious plan for you.",,Player.CanTalk()
+StruggleIntro,StrugglePlan,Will you release me?,"(She laughs.)  Absolutely not.  I hope you like to be tied up girl, cause I have a devious plan for you.",,Player.IsRestrained()
+StruggleIntro,StrugglePlan,Do as you wish.  I'm your slave.,"Good.  I hope you like to be tied up girl, cause I have a devious plan for you.",,Player.CanTalk()
+StruggleIntro,StrugglePlan,Please don't be too rough.,"(She laughs.)  I hope you like to be tied up girl, cause I have a devious plan for you.",,Player.CanTalk()
+StruggleIntro,StrugglePlan,(Try to struggle out.),"(She smiles.)  I hope you like to be tied up girl, cause I have a devious plan for you.",,Player.IsRestrained()
+StruggleIntro,StrugglePlan,(Let her play with you.),"I hope you like to be tied up girl, cause I have a devious plan for you.",,
+StrugglePlan,StruggleConsequence,What plan Miss?,I will restrain you and give you one minute to struggle out.,,Player.CanTalk()
+StrugglePlan,StruggleConsequence,Something devious?  Nice.,"Yes, I will restrain you and give you one minute to struggle out.",,Player.CanTalk()
+StrugglePlan,StruggleConsequence,(Look worried.),(She smirks.)  I will restrain you and give you one minute to struggle out.,,
+StrugglePlan,StruggleConsequence,(Stay silent.),I will restrain you and give you one minute to struggle out.,,
+StruggleConsequence,StruggleRestrain,What if I fail?,"If you fail, I will leave you locked alone in a cell for five minutes.  So you'll get plenty of time to get better at struggling.",,Player.CanTalk()
+StruggleConsequence,StruggleRestrain,(Nod slowly.),"If you fail, I will leave you locked alone in a cell for five minutes.  So you'll get plenty of time to get better at struggling.",,
+StruggleRestrain,StruggleReady,I understand.,(She straps you up pretty tight.)  You only have one minute to get free.  Are you ready girl?,ActivityStruggleRestrain(),Player.CanTalk()
+StruggleRestrain,StruggleReady,This is kinky!,(She straps you up pretty tight and smiles.)  You only have one minute to get free.  Are you ready girl?,ActivityStruggleRestrain(),Player.CanTalk()
+StruggleRestrain,StruggleReady,(Grumble a little.),(She frowns and straps you up pretty tight.)  You only have one minute to get free.  Are you ready girl?,ActivityStruggleRestrain(),
+StruggleRestrain,StruggleReady,(Nod politely.),(She straps you up pretty tight.)  You only have one minute to get free.  Are you ready girl?,ActivityStruggleRestrain(),
+StruggleReady,StruggleProgress,(Nod happily and start struggling.),,ActivityStruggleStart(),
+StruggleReady,StruggleProgress,(Nod reluctanly and start struggling.),,ActivityStruggleStart(),
+StruggleProgress,,,Did you made it?  Are you fully free?,,StruggleSuccess()
+StruggleProgress,,,You've failed girl.  The time is up.,,StruggleFail()
+StruggleProgress,,,Don't look at me.  Struggle girl!,,StruggleProgress()
+StruggleProgress,StruggleSuccess,I've did it!,"Well done slave girl, you're free to go.",,StruggleSuccess()
+StruggleProgress,StruggleSuccess,"Miss, it was an honor to complete your challenge.","Well done slave girl, you're free to go.","DialogChangeReputation(""Dominant"", -3)",StruggleSuccess()
+StruggleProgress,StruggleSuccess,(Do a victory dance.),"Well done slave girl, you're free to go.","DialogChangeReputation(""Dominant"", 3)",StruggleSuccess()
+StruggleProgress,StruggleFail,I've failed Miss.  Sorry.,"Don't be sorry, you'll have plenty of time to practice struggling in one of the club cells.",,StruggleFail()
+StruggleProgress,StruggleFail,(Bow your head in shame.),"Don't be sorry, you'll have plenty of time to practice struggling in one of the club cells.",,StruggleFail()
+StruggleProgress,,Is there still time?,Yes!  Now stop talking and struggle.,,StruggleProgress()
+StruggleProgress,,Am I doing good?,Stop talking and struggle!,,StruggleProgress()
+StruggleProgress,,(Beg for help.),"I'm not helping you, struggle girl!",,StruggleProgress()
+StruggleProgress,,(Leave her to struggle.),,DialogLeave(),StruggleProgress()
+StruggleSuccess,,Thanks Miss!  (Leave her.),,MainHall(),
+StruggleSuccess,,(Bow your head and leave.),,MainHall(),
+StruggleFail,StruggleCell,Very well.,"Come with me girl, you'll spend five minutes all bundled up in a little cell.",,Player.CanTalk()
+StruggleFail,StruggleCell,You can't lock me up!,"Don't complain and come with me girl, you'll spend five minutes all bundled up in a little cell.","DialogChangeReputation(""Dominant"", 2)",Player.CanTalk()
+StruggleFail,StruggleCell,Please Miss!  I've tried my best.,"Don't beg and come with me girl, you'll spend five minutes all bundled up in a little cell.","DialogChangeReputation(""Dominant"", -3)",Player.CanTalk()
+StruggleFail,StruggleCell,(Shake your head no and grumble.),"Don't complain and come with me girl, you'll spend five minutes all bundled up in a little cell.","DialogChangeReputation(""Dominant"", 2)",!Player.CanTalk()
+StruggleFail,StruggleCell,(Cry and beg for mercy.),"Don't beg and come with me girl, you'll spend five minutes all bundled up in a little cell.","DialogChangeReputation(""Dominant"", -3)",!Player.CanTalk()
+StruggleFail,StruggleCell,(Bow your head.),"Come with me girl, you'll spend five minutes all bundled up in a little cell.",,!Player.CanTalk()
+StruggleCell,,(Let her put you in a cell.),,Cell(),
+QuizIntro,QuizExplain,I'm here to serve you Miss.,Good.  Are you ready for a quiz question slave girl?,,Player.CanTalk()
+QuizIntro,QuizExplain,How can I please you?,(She ponders.)  Are you ready for a quiz question slave girl?,,Player.CanTalk()
+QuizIntro,QuizExplain,Will you release me?,(She laughs.)  Absolutely not.  Are you ready for a quiz question slave girl?,,Player.IsRestrained()
+QuizIntro,QuizExplain,Do as you wish.  I'm your slave.,Good.  Are you ready for a quiz question slave girl?,,Player.CanTalk()
+QuizIntro,QuizExplain,Please don't be too rough.,(She laughs.)  Are you ready for a quiz question slave girl?,,Player.CanTalk()
+QuizIntro,QuizExplain,(Try to struggle out.),(She smiles.)  You're cute when you struggle.  Are you ready for a quiz question slave girl?,,Player.IsRestrained()
+QuizIntro,QuizExplain,(Let her play with you.),Are you ready for a quiz question slave girl?,,
+QuizExplain,,(Mumble in the gag.),(She laughs and removes your gag.)  It will be easier like that.  Ready for a quiz question?,RemoveGag(),!Player.CanTalk()
+QuizExplain,,What if I give the correct answer?,You won't be punished and you will be free to go.,DialogRemove(),Player.CanTalk()
+QuizExplain,,What if I give the wrong answer?,(She smirks.)  I will strap you up tight and lock you up in a cell for a few minutes.,DialogRemove(),Player.CanTalk()
+QuizExplain,,Why are you doing a quiz?,Club slaves must know and understand BDSM rules and safety.  I will make sure you do.,DialogRemove(),Player.CanTalk()
+QuizExplain,,I'm ready Miss!,,StartQuiz(),Player.CanTalk()
+QuizExplain,,Go ahead with the quiz.,,StartQuiz(),Player.CanTalk()
+QuizQuestion0,,,"In the ""BDSM"" acronym, what does the ""DS"" stands for?",,
+QuizAnswer0,QuizFail,Domination and Sadism.,"Close but not perfect.  The correct answer is: ""Dominance and Submission"".",,
+QuizAnswer0,QuizSuccess,Dominance and Submission.,Very good little slave.,,
+QuizAnswer0,QuizFail,Dommes and Switches.,"Absolutely not.  The correct answer is: ""Dominance and Submission"".",,
+QuizAnswer0,QuizFail,I don't know.,"This is disappointing.  The correct answer is: ""Dominance and Submission"".",,
+QuizSuccess,QuizSuccessEnd,Thanks a lot!,"(She smiles and nods.)  I must go now, enjoy the club little slave.",,
+QuizSuccess,QuizSuccessEnd,I've studied very hard Miss.,"(She pets your head.)  Good girl!  I must go now, enjoy the club little slave.","DialogChangeReputation(""Dominant"", -3)",
+QuizSuccess,QuizSuccessEnd,That was too easy.,"(She frowns.)  Maybe it was a little easy.  Oh well, I must go now, enjoy the club slave girl.","DialogChangeReputation(""Dominant"", 2)",
+QuizSuccessEnd,,(Leave her.),,MainHall(),
+QuizFail,QuizFailEnd,Damn it!  I knew it!,"Next time you will know it.  But for now, you'll spend some time strapped up in a cell.","DialogChangeReputation(""Dominant"", 2)",
+QuizFail,QuizFailEnd,That question was very hard Miss.  (Blush.),"Next time you will know it.  But for now, you'll spend some time strapped up in a cell.","DialogChangeReputation(""Dominant"", -3)",
+QuizFail,QuizFailEnd,I didn't knew that.,"Next time you will know it.  But for now, you'll spend some time strapped up in a cell.",,
+QuizFailEnd,,Do I really have to?,Don't complain girl.  You're going to a cell for five minutes for your lack of knowledge.,DialogRemove(),
+QuizFailEnd,,Very well.  (Let her put you in a cell.),,Cell(),
+QuizFailEnd,,(Stay silent and let her put you in a cell.),,Cell(),
diff --git a/BondageClub/Screens/Room/Management/Management.js b/BondageClub/Screens/Room/Management/Management.js
index 4928ec3a7a..d6d15db236 100644
--- a/BondageClub/Screens/Room/Management/Management.js
+++ b/BondageClub/Screens/Room/Management/Management.js
@@ -13,7 +13,10 @@ var ManagementRandomGirlArchetype = "";
 var ManagementRandomActivityCount = 0;
 var ManagementRandomActivity = "";
 var ManagementRandomActivityList = ["AddArms", "RemoveArms", "AddGag", "RemoveGag", "AddTorso", "RemoveTorso", "AddFeet", "RemoveFeet", "AddLegs", "RemoveLegs", "Tickle", "Spank", "Kiss", "Fondle", "Masturbate"];
+var ManagementRandomActivityCategory = "";
+var ManagementRandomActivityCategoryList = ["Activity", "Quiz", "Struggle"];
 var ManagementVisitRoom = false;
+var ManagementTimer = 0;
 
 // Returns TRUE if the dialog situation is allowed
 function ManagementNoTitle() { return (!LogQuery("JoinedSorority", "Maid") && !LogQuery("ClubMistress", "Management") && (ReputationGet("Kidnap") < 50) && !SarahUnlockQuest) }
@@ -54,7 +57,7 @@ function ManagementMistressCanBePaid() { return (LogQuery("ClubMistress", "Manag
 function ManagementMistressCannotBePaid() { return (LogQuery("ClubMistress", "Management") && LogQuery("MistressWasPaid", "Management")) }
 function ManagementCanBeClubSlave() { return (!InventoryCharacterHasOwnerOnlyItem(Player) && DialogReputationLess("Dominant", -50)) }
 function ManagementCannotBeClubSlaveDominant() { return (!InventoryCharacterHasOwnerOnlyItem(Player) && DialogReputationGreater("Dominant", -49)) }
-function ManagementCannotBeClubSlaveOwnerLock() { return InventoryCharacterHasOwnerOnlyItem(Player); }
+function ManagementCannotBeClubSlaveOwnerLock() { return InventoryCharacterHasOwnerOnlyItem(Player) }
 
 // Returns TRUE if there's no other Mistress in the player private room
 function ManagementNoMistressInPrivateRoom() {
@@ -258,10 +261,13 @@ function ManagementClubSlaveRandomIntro() {
 	CharacterDelete("NPC_Management_RandomGirl");	
 	ManagementRandomGirl = CharacterLoadNPC("NPC_Management_RandomGirl");	
 	CharacterSetCurrent(ManagementRandomGirl);
-	ManagementRandomGirl.Stage = "0";
 	ManagementRandomGirl.AllowItem = false;
 	ManagementRandomActivityCount = 0;
-	
+
+	// Picks a random category of activities from the list
+	ManagementRandomActivityCategory = CommonRandomItemFromList(ManagementRandomActivityCategory, ManagementRandomActivityCategoryList);
+	ManagementRandomGirl.Stage = ManagementRandomActivityCategory + "Intro";
+
 	// 1 out of 7 girls will be a maid
 	var Intro = (Math.floor(Math.random() * 7)).toString();
 	if (Intro == "0") {
@@ -379,4 +385,45 @@ function ManagementMistressKicked() {
 function ManagementFreeSarah() {
 	ReputationProgress("Dominant", 4);
 	SarahUnlock();
+}
+
+// Fully restrains the player for the struggle activity
+function ManagementActivityStruggleRestrain() {
+	CharacterFullRandomRestrain(Player, "ALL");
+}
+
+// Starts the struggle game
+function ManagementActivityStruggleStart() {
+	ManagementTimer = CurrentTime + 60000;
+	DialogLeave();
+	EmptyCharacter = [];
+	EmptyCharacter.push(Player);
+	EmptyCharacter.push(ManagementRandomGirl);
+	CommonSetScreen("Room", "Empty");
+}
+
+// Starts the quiz game
+function ManagementStartQuiz() {
+	var Q = (0).toString();
+	CurrentCharacter.Stage = "QuizAnswer" + Q;
+	CurrentCharacter.CurrentDialog = DialogFind(CurrentCharacter, "QuizQuestion" + Q);
+}
+
+// Locks the player in a cell for 5 minutes
+function ManagementRemoveGag() {
+	InventoryRemove(Player, "ItemMouth");
+	InventoryRemove(Player, "ItemHead");
+}
+
+// Locks the player in a cell for 5 minutes
+function ManagementCell() {
+	DialogLeave();
+	CharacterFullRandomRestrain(Player, "ALL");
+	CellLock(5);
+}
+
+// Returns to the main hall
+function ManagementMainHall() {
+	DialogLeave();
+	CommonSetScreen("Room", "MainHall");
 }
\ No newline at end of file
diff --git a/BondageClub/Screens/Room/Private/Private.js b/BondageClub/Screens/Room/Private/Private.js
index 46acba5498..f6cb1ce3fc 100644
--- a/BondageClub/Screens/Room/Private/Private.js
+++ b/BondageClub/Screens/Room/Private/Private.js
@@ -13,8 +13,8 @@ var PrivateActivityAffectLove = true;
 var PrivateActivityList = ["Gag", "Ungag", "Restrain", "RestrainOther", "FullRestrain", "FullRestrainOther", "Release", "Tickle", "Spank", "Pet", "Slap", "Kiss", "Fondle", "Naked", "Underwear", "RandomClothes", "Shibari", "Gift", "PetGirl", "Locks"];
 var PrivateActivityTarget = null;
 var PrivatePunishment = "";
-//var PrivatePunishmentList = ["Cage", "Bound", "BoundPet", "ChastityBelt", "ChastityBra", "ForceNaked", "ConfiscateKey", "ConfiscateCrop", "ConfiscateWhip", "SleepCage", "LockOut"];
-var PrivatePunishmentList = ["LockOut"];
+//var PrivatePunishmentList = ["Cage", "Bound", "BoundPet", "ChastityBelt", "ChastityBra", "ForceNaked", "ConfiscateKey", "ConfiscateCrop", "ConfiscateWhip", "SleepCage", "LockOut", "Cell"];
+var PrivatePunishmentList = ["Cell"];
 var PrivateCharacterNewClothes = null;
 
 // Returns TRUE if a specific dialog option is allowed
@@ -610,6 +610,7 @@ function PrivateSelectPunishment() {
 		if ((PrivatePunishment == "ConfiscateWhip") && (InventoryAvailable(Player, "LeatherWhip", "ItemPelvis") || InventoryAvailable(Player, "LeatherWhip", "ItemBreast"))) break;
 		if ((PrivatePunishment == "SleepCage") && LogQuery("Cage", "PrivateRoom") && !LogQuery("SleepCage", "Rule")) break;
 		if ((PrivatePunishment == "LockOut") && (NPCTraitGet(CurrentCharacter, "Serious") >= 0)) break;
+		if (PrivatePunishment == "Cell") break;
 
 	}
 
@@ -636,6 +637,7 @@ function PrivateRunPunishment(LoveFactor) {
 	if (PrivatePunishment == "ConfiscateWhip") { InventoryDelete(Player, "LeatherWhip", "ItemPelvis"); InventoryDelete(Player, "LeatherWhip", "ItemBreast"); }
 	if (PrivatePunishment == "SleepCage") LogAdd("SleepCage", "Rule", CurrentTime + 604800000);
 	if (PrivatePunishment == "LockOut") { LogAdd("LockOutOfPrivateRoom", "Rule", CurrentTime + 3600000); DialogLeave(); CommonSetScreen("Room", "MainHall"); }
+	if (PrivatePunishment == "Cell") { DialogLeave(); CharacterFullRandomRestrain(Player, "ALL"); CellLock(5); }
 }
 
 // Sets up the player collaring ceremony cutscene
diff --git a/BondageClub/Scripts/GameLog.js b/BondageClub/Scripts/GameLog.js
index ea25ae0205..7288b69ac6 100644
--- a/BondageClub/Scripts/GameLog.js
+++ b/BondageClub/Scripts/GameLog.js
@@ -57,6 +57,14 @@ function LogQuery(QueryLogName, QueryLogGroup) {
 	return false;
 }
 
+// Returns the value associated to the log
+function LogValue(QueryLogName, QueryLogGroup) {
+	for (var L = 0; L < Log.length; L++)
+		if ((Log[L].Name == QueryLogName) && (Log[L].Group == QueryLogGroup))
+			return Log[L].Value;
+	return null;
+}
+
 // Loads the account log
 function LogLoad(NewLog) {
 
diff --git a/BondageClub/index.html b/BondageClub/index.html
index 97d3e12499..dd0f3b83eb 100644
--- a/BondageClub/index.html
+++ b/BondageClub/index.html
@@ -49,6 +49,8 @@
 <script src="Screens/Room/Introduction/Introduction.js"></script>
 <script src="Screens/Room/MaidQuarters/MaidQuarters.js"></script>
 <script src="Screens/Room/Shibari/Shibari.js"></script>
+<script src="Screens/Room/Cell/Cell.js"></script>
+<script src="Screens/Room/Empty/Empty.js"></script>
 <script src="Screens/Room/KidnapLeague/KidnapLeague.js"></script>
 <script src="Screens/Room/Private/Private.js"></script>
 <script src="Screens/Room/Management/Management.js"></script>
@@ -96,6 +98,7 @@
 	
 	OK - Allow to go on a shopping trip with a friend + sub (50$)
 	OK - Owner locks on NPCs disappear on relog
+	OK - New cell for self bondage and other ways to be locked in
 
 	OK - Allow Dommes to use online sub restrains
 	OK - New back/forth buttons in changing appearance screen
@@ -107,8 +110,9 @@
 
 	New random encounters for club slaves: 
 	OK - Maids that strips you if you're not naked in main hall.
-	- Dommes that use locks with timers and run.
-	- Dommes that asks riddles, if the player fails, she gets put in chastity.
+	OK - Mew activity: QUIZ
+	OK - New activity: Struggle out in 1 minute
+	- More quiz questions!
 
 	Owner in private room:
 	OK - Owner can pet player in bitch suit