diff --git a/engines/lure/hotspots.cpp b/engines/lure/hotspots.cpp
index 94b68d75c37..9fa55ef33d1 100644
--- a/engines/lure/hotspots.cpp
+++ b/engines/lure/hotspots.cpp
@@ -76,7 +76,7 @@ Hotspot::Hotspot(HotspotData *res): _pathFinder(this) {
 
 	_override = resources.getHotspotOverride(res->hotspotId);
 	setAnimation(_data->animRecordId);
-	_tickHandler = HotspotTickHandlers::getHandler(_data->tickProcId);
+	_tickHandler = _tickHandlers.getHandler(_data->tickProcId);
 	_nameBuffer[0] = '\0';
 
 	_skipFlag = false;
@@ -128,7 +128,7 @@ Hotspot::Hotspot(Hotspot *character, uint16 objType): _pathFinder(this) {
 		_frameCtr = 0;
 		_voiceCtr = 40;
 
-		_tickHandler = HotspotTickHandlers::getHandler(VOICE_TICK_PROC_ID);
+		_tickHandler = _tickHandlers.getHandler(VOICE_TICK_PROC_ID);
 		setAnimationIndex(VOICE_ANIM_INDEX);
 		break;
 
@@ -148,7 +148,7 @@ Hotspot::Hotspot(Hotspot *character, uint16 objType): _pathFinder(this) {
 		_voiceCtr = CONVERSE_COUNTDOWN_SIZE;
 
 		_destHotspotId = character->hotspotId();
-		_tickHandler = HotspotTickHandlers::getHandler(PUZZLED_TICK_PROC_ID);
+		_tickHandler = _tickHandlers.getHandler(PUZZLED_TICK_PROC_ID);
 		setAnimationIndex(VOICE_ANIM_INDEX);
 		setFrameNumber(objType == PUZZLED_ANIM_IDX ? 1 : 2);
 
@@ -471,7 +471,7 @@ bool Hotspot::executeScript() {
 void Hotspot::tick() {
 	uint16 id = _hotspotId;
 	debugC(ERROR_BASIC, kLureDebugAnimations, "Hotspot %xh tick begin", id);
-	_tickHandler(*this);
+	(_tickHandlers.*_tickHandler)(*this);
 	debugC(ERROR_BASIC, kLureDebugAnimations, "Hotspot %xh tick end", id);
 }
 
@@ -479,7 +479,7 @@ void Hotspot::setTickProc(uint16 newVal) {
 	if (_data)
 		_data->tickProcId = newVal;
 
-	_tickHandler = HotspotTickHandlers::getHandler(newVal);
+	_tickHandler = _tickHandlers.getHandler(newVal);
 }
 
 void Hotspot::walkTo(int16 endPosX, int16 endPosY, uint16 destHotspot) {
@@ -2364,79 +2364,84 @@ void Hotspot::loadFromStream(Common::ReadStream *stream) {
 
 /*------------------------------------------------------------------------*/
 
+HotspotTickHandlers::HotspotTickHandlers() {
+	countdownCtr = 0;
+	ewanXOffset = false;
+}
+
 HandlerMethodPtr HotspotTickHandlers::getHandler(uint16 procIndex) {
 	switch (procIndex) {
 	case 1:
-		return defaultHandler;
+		return &HotspotTickHandlers::defaultHandler;
 	case STANDARD_CHARACTER_TICK_PROC:
-		return standardCharacterAnimHandler;
+		return &HotspotTickHandlers::standardCharacterAnimHandler;
 	case PLAYER_TICK_PROC_ID:
-		return playerAnimHandler;
+		return &HotspotTickHandlers::playerAnimHandler;
 	case VOICE_TICK_PROC_ID:
-		return voiceBubbleAnimHandler;
+		return &HotspotTickHandlers::voiceBubbleAnimHandler;
 	case PUZZLED_TICK_PROC_ID:
-		return puzzledAnimHandler;
+		return &HotspotTickHandlers::puzzledAnimHandler;
 	case 6:
-		return roomExitAnimHandler;
+		return &HotspotTickHandlers::roomExitAnimHandler;
 	case 7:
 	case FOLLOWER_TICK_PROC_2:
-		return followerAnimHandler;
+		return &HotspotTickHandlers::followerAnimHandler;
 	case JAILOR_TICK_PROC_ID:
 	case 10:
-		return jailorAnimHandler;
+		return &HotspotTickHandlers::jailorAnimHandler;
 	case STANDARD_ANIM_2_TICK_PROC:
-		return standardAnimHandler2;
+		return &HotspotTickHandlers::standardAnimHandler2;
 	case STANDARD_ANIM_TICK_PROC:
-		return standardAnimHandler;
+		return &HotspotTickHandlers::standardAnimHandler;
 	case 13:
-		return sonicRatAnimHandler;
+		return &HotspotTickHandlers::sonicRatAnimHandler;
 	case 14:
-		return droppingTorchAnimHandler;
+		return &HotspotTickHandlers::droppingTorchAnimHandler;
 	case 15:
-		return playerSewerExitAnimHandler;
+		return &HotspotTickHandlers::playerSewerExitAnimHandler;
 	case 16:
-		return fireAnimHandler;
+		return &HotspotTickHandlers::fireAnimHandler;
 	case 17:
-		return sparkleAnimHandler;
+		return &HotspotTickHandlers::sparkleAnimHandler;
 	case 18:
-		return teaAnimHandler;
+		return &HotspotTickHandlers::teaAnimHandler;
 	case 19:
-		return goewinCaptiveAnimHandler;
+		return &HotspotTickHandlers::goewinCaptiveAnimHandler;
 	case 20:
-		return prisonerAnimHandler;
+		return &HotspotTickHandlers::prisonerAnimHandler;
 	case 21:
-		return catrionaAnimHandler;
+		return &HotspotTickHandlers::catrionaAnimHandler;
 	case 22:
-		return morkusAnimHandler;
+		return &HotspotTickHandlers::morkusAnimHandler;
 	case 23:
-		return grubAnimHandler;
+		return &HotspotTickHandlers::grubAnimHandler;
 	case 24:
-		return barmanAnimHandler;
+		return &HotspotTickHandlers::barmanAnimHandler;
 	case 25:
-		return skorlAnimHandler;
+		return &HotspotTickHandlers::skorlAnimHandler;
 	case 26:
-		return gargoyleAnimHandler;
+		return &HotspotTickHandlers::gargoyleAnimHandler;
 	case GOEWIN_SHOP_TICK_PROC:
-		return goewinShopAnimHandler;
+		return &HotspotTickHandlers::goewinShopAnimHandler;
 	case 28:
 	case 29:
 	case 30:
 	case 31:
 	case 32:
 	case 33:
-		return skullAnimHandler;
+		return &HotspotTickHandlers::skullAnimHandler;
 	case 34:
-		return dragonFireAnimHandler;
+		return &HotspotTickHandlers::dragonFireAnimHandler;
 	case 35:
-		return castleSkorlAnimHandler;
+		return &HotspotTickHandlers::castleSkorlAnimHandler;
 	case 36:
-		return rackSerfAnimHandler;
+		return &HotspotTickHandlers::rackSerfAnimHandler;
 	case TALK_TICK_PROC_ID:
-		return talkAnimHandler;
+		return &HotspotTickHandlers::talkAnimHandler;
 	case 38:
-		return fighterAnimHandler;
+		return &HotspotTickHandlers::fighterAnimHandler;
 	case PLAYER_FIGHT_TICK_PROC_ID:
-		return playerFightAnimHandler;
+		return &HotspotTickHandlers::playerFightAnimHandler;
 	default:
 		error("Unknown tick proc Id %xh for hotspot", procIndex);
 	}
@@ -3101,7 +3106,6 @@ void HotspotTickHandlers::playerAnimHandler(Hotspot &h) {
 }
 
 void HotspotTickHandlers::followerAnimHandler(Hotspot &h) {
-	static int countdownCtr = 0;
 	Resources &res = Resources::getReference();
 	ValueTableData &fields = res.fieldList();
 	Hotspot *player = res.getActiveHotspot(PLAYER_ID);
@@ -3381,10 +3385,6 @@ void HotspotTickHandlers::morkusAnimHandler(Hotspot &h) {
 	}
 }
 
-// Special variables used across multiple calls to talkAnimHandler
-static TalkEntryData *_talkResponse;
-static uint16 talkDestCharacter;
-
 void HotspotTickHandlers::talkAnimHandler(Hotspot &h) {
 	// Talk handler
 	Resources &res = Resources::getReference();
@@ -3672,7 +3672,6 @@ void HotspotTickHandlers::barmanAnimHandler(Hotspot &h) {
 	Room &room = Room::getReference();
 	BarEntry &barEntry = res.barmanLists().getDetails(h.roomNumber());
 	Common::RandomSource &rnd = LureEngine::getReference().rnd();
-	static bool ewanXOffset = false;
 
 	h.handleTalkDialog();
 	if (h.delayCtr() > 0) {
diff --git a/engines/lure/hotspots.h b/engines/lure/hotspots.h
index 538f392138d..b8e27eca4bb 100644
--- a/engines/lure/hotspots.h
+++ b/engines/lure/hotspots.h
@@ -36,6 +36,7 @@ namespace Lure {
 #define MAX_NUM_IMPINGING 10
 
 class Hotspot;
+class HotspotTickHandlers;
 
 class Support {
 private:
@@ -50,49 +51,61 @@ public:
 	static bool isCharacterInList(uint16 *lst, int numEntries, uint16 charId);
 };
 
-typedef void(*HandlerMethodPtr)(Hotspot &h);
+typedef void (HotspotTickHandlers::*HandlerMethodPtr)(Hotspot &h);
 
 class HotspotTickHandlers {
 private:
+	// Special variable used across multiple calls to followerAnimHandler
+	int countdownCtr;
+
+	// Special variables used across multiple calls to talkAnimHandler
+	TalkEntryData *_talkResponse;
+	uint16 talkDestCharacter;
+
+	// Special variable used across multiple calls to barmanAnimHandler
+	bool ewanXOffset;
+
 	// Support methods
-	static void npcRoomChange(Hotspot &h);
-	static void talkEndConversation();
+	void npcRoomChange(Hotspot &h);
+	void talkEndConversation();
 
 	// Handler methods
-	static void defaultHandler(Hotspot &h);
-	static void voiceBubbleAnimHandler(Hotspot &h);
-	static void standardAnimHandler(Hotspot &h);
-	static void standardAnimHandler2(Hotspot &h);
-	static void standardCharacterAnimHandler(Hotspot &h);
-	static void puzzledAnimHandler(Hotspot &h);
-	static void roomExitAnimHandler(Hotspot &h);
-	static void playerAnimHandler(Hotspot &h);
-	static void followerAnimHandler(Hotspot &h);
-	static void jailorAnimHandler(Hotspot &h);
-	static void sonicRatAnimHandler(Hotspot &h);
-	static void droppingTorchAnimHandler(Hotspot &h);
-	static void playerSewerExitAnimHandler(Hotspot &h);
-	static void fireAnimHandler(Hotspot &h);
-	static void sparkleAnimHandler(Hotspot &h);
-	static void teaAnimHandler(Hotspot &h);
-	static void goewinCaptiveAnimHandler(Hotspot &h);
-	static void prisonerAnimHandler(Hotspot &h);
-	static void catrionaAnimHandler(Hotspot &h);
-	static void morkusAnimHandler(Hotspot &h);
-	static void talkAnimHandler(Hotspot &h);
-	static void grubAnimHandler(Hotspot &h);
-	static void barmanAnimHandler(Hotspot &h);
-	static void skorlAnimHandler(Hotspot &h);
-	static void gargoyleAnimHandler(Hotspot &h);
-	static void goewinShopAnimHandler(Hotspot &h);
-	static void skullAnimHandler(Hotspot &h);
-	static void dragonFireAnimHandler(Hotspot &h);
-	static void castleSkorlAnimHandler(Hotspot &h);
-	static void rackSerfAnimHandler(Hotspot &h);
-	static void fighterAnimHandler(Hotspot &h);
-	static void playerFightAnimHandler(Hotspot &h);
+	void defaultHandler(Hotspot &h);
+	void voiceBubbleAnimHandler(Hotspot &h);
+	void standardAnimHandler(Hotspot &h);
+	void standardAnimHandler2(Hotspot &h);
+	void standardCharacterAnimHandler(Hotspot &h);
+	void puzzledAnimHandler(Hotspot &h);
+	void roomExitAnimHandler(Hotspot &h);
+	void playerAnimHandler(Hotspot &h);
+	void followerAnimHandler(Hotspot &h);
+	void jailorAnimHandler(Hotspot &h);
+	void sonicRatAnimHandler(Hotspot &h);
+	void droppingTorchAnimHandler(Hotspot &h);
+	void playerSewerExitAnimHandler(Hotspot &h);
+	void fireAnimHandler(Hotspot &h);
+	void sparkleAnimHandler(Hotspot &h);
+	void teaAnimHandler(Hotspot &h);
+	void goewinCaptiveAnimHandler(Hotspot &h);
+	void prisonerAnimHandler(Hotspot &h);
+	void catrionaAnimHandler(Hotspot &h);
+	void morkusAnimHandler(Hotspot &h);
+	void talkAnimHandler(Hotspot &h);
+	void grubAnimHandler(Hotspot &h);
+	void barmanAnimHandler(Hotspot &h);
+	void skorlAnimHandler(Hotspot &h);
+	void gargoyleAnimHandler(Hotspot &h);
+	void goewinShopAnimHandler(Hotspot &h);
+	void skullAnimHandler(Hotspot &h);
+	void dragonFireAnimHandler(Hotspot &h);
+	void castleSkorlAnimHandler(Hotspot &h);
+	void rackSerfAnimHandler(Hotspot &h);
+	void fighterAnimHandler(Hotspot &h);
+	void playerFightAnimHandler(Hotspot &h);
 public:
-	static HandlerMethodPtr getHandler(uint16 procIndex);
+	HotspotTickHandlers();
+
+	HandlerMethodPtr getHandler(uint16 procIndex);
 };
 
 class WalkingActionEntry {
@@ -171,6 +184,7 @@ struct DestStructure {
 
 class Hotspot {
 private:
+	HotspotTickHandlers _tickHandlers;
 	HotspotData *_data;
 	uint16 _animId;
 	HotspotAnimData *_anim;