diff --git a/src/p_acs.cpp b/src/p_acs.cpp
--- a/src/p_acs.cpp
+++ b/src/p_acs.cpp
@@ -6345,6 +6345,7 @@
 			fixed_t	oldx = caller->x;
 			fixed_t	oldy = caller->y;
 			fixed_t	oldz = caller->z;
+			const MoveThingData oldPositionData ( caller ); // [TP]
 
 			if (!(flags & WARPF_ABSOLUTEANGLE))
 			{
@@ -6457,7 +6458,7 @@
 
 				// [BB] Inform the clients.
 				if ( NETWORK_GetState() == NETSTATE_SERVER )
-					SERVERCOMMANDS_MoveThing( caller, CM_X|CM_Y|CM_Z|CM_ANGLE );
+					SERVERCOMMANDS_MoveThingIfChanged( caller, oldPositionData );
 
 				return true;
 			}
@@ -11301,4 +11302,4 @@
 			break;
 	}
 	return translationindex;
-}
\ No newline at end of file
+}
diff --git a/src/sv_commands.cpp b/src/sv_commands.cpp
--- a/src/sv_commands.cpp
+++ b/src/sv_commands.cpp
@@ -1224,6 +1224,44 @@
 	command.sendCommandToClients( ulPlayerExtra, flags );
 }
 
+/*
+ * [TP] Compares actor position data to a previous state and calls SERVERCOMMANDS_MoveThing to send appropriate updates.
+ */
+void SERVERCOMMANDS_MoveThingIfChanged( AActor *actor, const MoveThingData &oldData, ULONG ulPlayerExtra, ServerCommandFlags flags )
+{
+	ULONG bits = 0;
+
+	if ( actor->x != oldData.x )
+		bits |= CM_X;
+
+	if ( actor->y != oldData.y )
+		bits |= CM_Y;
+
+	if ( actor->z != oldData.z )
+		bits |= CM_Z;
+
+	if ( actor->velx != oldData.velx )
+		bits |= CM_VELX;
+
+	if ( actor->vely != oldData.vely )
+		bits |= CM_VELY;
+
+	if ( actor->velz != oldData.velz )
+		bits |= CM_VELZ;
+
+	if ( actor->angle != oldData.angle )
+		bits |= CM_ANGLE;
+
+	if ( actor->pitch != oldData.pitch )
+		bits |= CM_PITCH;
+
+	if ( actor->movedir != oldData.movedir )
+		bits |= CM_MOVEDIR;
+
+	if ( bits != 0 )
+		SERVERCOMMANDS_MoveThing( actor, bits, ulPlayerExtra, flags );
+}
+
 //*****************************************************************************
 //
 void SERVERCOMMANDS_MoveThing( AActor *actor, ULONG bits, ULONG ulPlayerExtra, ServerCommandFlags flags )
diff --git a/src/sv_commands.h b/src/sv_commands.h
--- a/src/sv_commands.h
+++ b/src/sv_commands.h
@@ -72,6 +72,29 @@
 	SVCF_ONLY_CONNECTIONTYPE_1	= ( 1 << 3 )
 };
 
+/*
+ * [TP] For SERVERCOMMANDS_MoveThingIfChanged
+ */
+struct MoveThingData
+{
+	MoveThingData( AActor* actor ) :
+	    x ( actor->x ),
+	    y ( actor->y ),
+	    z ( actor->z ),
+	    velx ( actor->velx ),
+	    vely ( actor->vely ),
+	    velz ( actor->velz ),
+	    pitch ( actor->pitch ),
+	    angle ( actor->angle ),
+	    movedir ( actor->movedir ) {}
+
+	fixed_t x, y, z;
+	fixed_t velx, vely, velz;
+	fixed_t pitch;
+	angle_t angle;
+	BYTE movedir;
+};
+
 typedef TFlags<ServerCommandFlag, unsigned int> ServerCommandFlags;
 DEFINE_TFLAGS_OPERATORS (ServerCommandFlags)
 
@@ -146,6 +169,7 @@
 void	SERVERCOMMANDS_LevelSpawnThing( AActor *mobj, ULONG ulPlayerExtra = MAXPLAYERS, ServerCommandFlags flags = 0 );
 void	SERVERCOMMANDS_LevelSpawnThingNoNetID( AActor *mobj, ULONG ulPlayerExtra = MAXPLAYERS, ServerCommandFlags flags = 0 );
 void	SERVERCOMMANDS_MoveThing( AActor *pActor, ULONG ulBits, ULONG ulPlayerExtra = MAXPLAYERS, ServerCommandFlags flags = 0 );
+void	SERVERCOMMANDS_MoveThingIfChanged( AActor *pActor, const MoveThingData &oldData, ULONG ulPlayerExtra = MAXPLAYERS, ServerCommandFlags flags = 0 );
 void	SERVERCOMMANDS_MoveThingExact( AActor *pActor, ULONG ulBits, ULONG ulPlayerExtra = MAXPLAYERS, ServerCommandFlags flags = 0 );
 void	SERVERCOMMANDS_KillThing( AActor *pActor, AActor *pSource, AActor *pInflictor );
 void	SERVERCOMMANDS_SetThingState( AActor *pActor, NetworkActorState state, ULONG ulPlayerExtra = MAXPLAYERS, ServerCommandFlags flags = 0 );
diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp
--- a/src/thingdef/thingdef_codeptr.cpp
+++ b/src/thingdef/thingdef_codeptr.cpp
@@ -5398,6 +5398,7 @@
 		return;
 
 	AActor *reference = COPY_AAPTR(self, destination_selector);
+	const MoveThingData oldPositionData ( self ); // [TP]
 
 	if (!reference)
 	{
@@ -5503,7 +5504,7 @@
 
 		// [BB] Inform the clients.
 		if (( NETWORK_GetState() == NETSTATE_SERVER ) && ( NETWORK_IsActorClientHandled( self ) == false ))
-			SERVERCOMMANDS_MoveThing( self, CM_X|CM_Y|CM_Z|CM_ANGLE );
+			SERVERCOMMANDS_MoveThingIfChanged( self, oldPositionData );
 
 		if (success_state)
 		{
