diff --git a/registration-system/view/signups/game1/js/camera.js b/registration-system/view/signups/game1/js/camera.js
index 21b4c62fa64b1b8defa3cb8bf5d1b3b07566c782..8f82c4ad858bffbc3206003ced1f467ca3f3e5dc 100644
--- a/registration-system/view/signups/game1/js/camera.js
+++ b/registration-system/view/signups/game1/js/camera.js
@@ -51,9 +51,11 @@ Camera.prototype.updatePosition = function() {
 	var translation = Vec.add(Vec.flipSign(this.translation), Vec.mul(Game.config.size, 0.5)); // move subject to center
 	if(translation[0] > 0) translation[0] = 0;
 	if(translation[1] > 0) translation[1] = 0;
-	// @TODO: rework for firefox
-	//if(translation[0] < (Game.config.size[0] - svg.clientWidth))  translation[0] = Game.config.size[0] - svg.clientWidth;
-	//if(translation[1] < (Game.config.size[1] - svg.clientHeight)) translation[1] = Game.config.size[1] - svg.clientHeight;
+
+	var width = $(svg).width();
+	var height = $(svg).height();
+	if(translation[0] < (Game.config.size[0] - width))  translation[0] = Game.config.size[0] - width;
+	if(translation[1] < (Game.config.size[1] - height)) translation[1] = Game.config.size[1] - height;
 	root.style.left = translation[0]+'px';
 	root.style.top = translation[1]+'px';
 };
diff --git a/registration-system/view/signups/game1/js/character.js b/registration-system/view/signups/game1/js/character.js
index 2ead572408ea081aadf5a37695c8127ca624c5d8..17ecc8f8fcf1b4830bc9e0f98c2bbccd6a61543f 100644
--- a/registration-system/view/signups/game1/js/character.js
+++ b/registration-system/view/signups/game1/js/character.js
@@ -24,8 +24,8 @@ function Char(svg, options) {
 	});
 }
 Char.prototype.findSpawn = function(spawnId) {
-	// [1320, svgFlipY(svg[0][0], 500)]
-	var spawn = this.svg.select(spawnId ? '#'+spawnId : "#player_spawn");
+	if (!spawnId) spawnId = 'player_spawn';
+	var spawn = this.svg.select('#'+spawnId);
 	if (!spawn[0][0]) console.error("Could not find spawn: #" + spawnId);
 	var bbox = spawn[0][0].getBBox();
 	return Vec.add(getTranslation(spawn[0][0], this.svg[0][0]), [bbox.x, bbox.y]);
@@ -79,9 +79,13 @@ Char.prototype.animate = function() {
 			direction = (ySpeed >= 0) ? 0 : 2;
 	}
 
+	var currentFrame = this.currentFrame;
+	if (currentFrame > 0 && Game.config.moonWalk)
+		currentFrame = this.frames.length - currentFrame;
+
 	// hide last visible frame
-	if (this.frames && this.frames[this.currentFrame]) {
-		var lastFrame = this.frames[this.currentFrame];
+	if (this.frames && this.frames[currentFrame]) {
+		var lastFrame = this.frames[currentFrame];
 		lastFrame.style.display = 'none';
 	}
 	// change animation
@@ -104,8 +108,12 @@ Char.prototype.animate = function() {
 		this.currentFrame += 1; // walk
 	this.currentFrame %= this.frames.length;
 
+	var currentFrame = this.currentFrame;
+	if (currentFrame > 0 && Game.config.moonWalk)
+		currentFrame = this.frames.length - currentFrame;
+
 	// show current frame
-	this.frames[this.currentFrame].style.display = 'block';
+	this.frames[currentFrame].style.display = 'block';
 };
 Char.prototype.physics = function() {
 	if (this.moveTarget && this.moveTarget.length == 0) return;
@@ -127,7 +135,10 @@ Char.prototype.physics = function() {
 			var nextPosition = (d < g_smallValue) ? this.moveTarget[0] : Vec.add(this.translation, v);
 		} while (!this.pathFinder.canWalkOn(nextPosition[0], nextPosition[1]));
 
-		Vec.assign(this.translation, nextPosition);
+		if (stuckFixer >= 3.0)
+			this.setMoveTarget(this.translation[0], this.translation[1]);
+		else
+			Vec.assign(this.translation, nextPosition);
 	}
 
 	Game.eventHandler.triggerEventOn('walkon', this.translation[0], this.translation[1]);
diff --git a/registration-system/view/signups/game1/js/events.js b/registration-system/view/signups/game1/js/events.js
index 9918bc9406c66f864726f544a058cb6058ef2150..9560ac3eb556da7b4a8aaa50527afa4206364c98 100644
--- a/registration-system/view/signups/game1/js/events.js
+++ b/registration-system/view/signups/game1/js/events.js
@@ -29,29 +29,36 @@ function EventHandler(svg) {
 }
 
 EventHandler.prototype.hasEventOn = function (trigger, x, y) {
-    return this.getEventOn(trigger, x, y) !== undefined;
+    return this.getEventOn(trigger, x, y, function() {});
 };
 
 EventHandler.prototype.getEventOn = function(trigger, x, y, callback) {
     if (!this.walkOnEvents) this.walkOnEvents = {}; // currently active events
 
+    var hasEvent = false;
     for (var i = 0; i < this.eventNodes[trigger].length; ++i) {
         var node = this.eventNodes[trigger][i];
         if (node.path.isInside(x, y)) {
-            if (!this.walkOnEvents[node.id]) {
+            hasEvent = true;
+            if (trigger == 'walkon' && !this.walkOnEvents[node.id]) {
                 this.walkOnEvents[node.id] = true;
                 callback(node, true);
+            } else {
+                callback(node);
             }
         } else {
-            delete this.walkOnEvents[node.id];
+            if (trigger == 'walkon' && this.walkOnEvents[node.id]) {
+                delete this.walkOnEvents[node.id];
+                callback(node, false);
+            }
         }
     }
-    return undefined;
+    return hasEvent;
 };
 
 EventHandler.prototype.triggerEventOn = function (trigger, x, y) {
     var self = this;
-    this.getEventOn(trigger, x, y, function(event, bEnter) {
+    return this.getEventOn(trigger, x, y, function(event, bEnter) {
         self.handleEvent(event, {trigger: trigger, x: x, y: y, bEnter: bEnter});
     });
 };
@@ -70,8 +77,7 @@ EventHandler.prototype.triggerEventOn = function (trigger, x, y) {
 EventHandler.prototype.handleEvent = function (event, context) {
     switch (event.type) {
         case 'achievement':
-            if (context.bEnter)
-                Game.achievements.triggerAchievement(event.id, context);
+            Game.achievements.triggerAchievement(event.id, context);
             break;
         case 'mapchange':
             Game.instance.nextMap(event.destination, event.target);
diff --git a/registration-system/view/signups/game1/js/game.js b/registration-system/view/signups/game1/js/game.js
index c1cbf18001e4fdbda828f015adc5a3aeb8fe835b..f699e23da693299f86d3fdc7b8626a1b859e93ec 100644
--- a/registration-system/view/signups/game1/js/game.js
+++ b/registration-system/view/signups/game1/js/game.js
@@ -89,8 +89,9 @@ Game.prototype.loadMap = function(map, spawn) {
 		svg.on("click", function(d) {
 			var xy = getMouseXY();
 			if (xy) {
-				Game.char.setMoveTarget(xy.x, xy.y);
-				Game.eventHandler.triggerEventOn('click', xy.x, xy.y);
+				if (!Game.eventHandler.triggerEventOn('click', xy.x, xy.y)) {
+					Game.char.setMoveTarget(xy.x, xy.y);
+				}
 			}
 		}).on('mouseenter', function () {
 			mousePointer.style('display', 'block')
@@ -101,6 +102,7 @@ Game.prototype.loadMap = function(map, spawn) {
 			mousePointer.attr('cx', xy.x);
 			mousePointer.attr('cy', xy.y);
 			var colour = Game.char.pathFinder.canWalkOn(xy.x, xy.y) ? 'green' : 'red';
+			if (Game.eventHandler.hasEventOn('click', xy.x, xy.y)) colour = 'blue';
 			mousePointer.style("fill", colour);
 		});
 
diff --git a/registration-system/view/signups/game1/maps/map_landing.svg b/registration-system/view/signups/game1/maps/map_landing.svg
index 86107aa353520c3d7c5acf265a6f8b0772815140..aad02f82218d1ac78809fefec17097feb0eea803 100644
Binary files a/registration-system/view/signups/game1/maps/map_landing.svg and b/registration-system/view/signups/game1/maps/map_landing.svg differ
diff --git a/registration-system/view/signups/game1/test.html b/registration-system/view/signups/game1/test.html
index 7451f50b3679c47d239fc1d04146e36d3f578111..291b9bf45767c34245041f2127734f0a2385bec3 100644
--- a/registration-system/view/signups/game1/test.html
+++ b/registration-system/view/signups/game1/test.html
@@ -70,6 +70,7 @@
         pathFindingGridSize: UrlComponents.isSet('verbosePF') ? 5 : 5,
         verbosePathFinder: UrlComponents.isSet('verbosePF'),
         usePathFinding: true,
+        moonWalk: false,
         size: [800, 600]
     });
     game.run();