diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp
index bcdbab6f..2a32ca1a 100644
--- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp
+++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp
@@ -227,7 +227,7 @@ MxU32 Helicopter::HandleControl(LegoControlManagerEvent& p_param)
 				lookat = dir;
 				float scale = 3;
 				lookat.Mul(scale);
-				lookat.Add(loc);
+				lookat.Add(&loc);
 				Mx3DPointFloat v68, v7c, v90(0, 1, 0), va4;
 				v68 = m_world->GetCamera()->GetWorldUp();
 				va4.EqualsCross(&v68, &dir);
@@ -379,9 +379,9 @@ void Helicopter::VTable0x70(float p_float)
 			mat.SetIdentity();
 			m_unk0x1f4.Unknown6(mat, f2);
 			v2.SetVector(loc);
-			v2.Sub(v);
+			v2.Sub(&v);
 			v2.Mul(f2);
-			v2.Add(v);
+			v2.Add(&v);
 			m_world->GetCamera()->FUN_100123e0(mat, 0);
 		}
 		else {
diff --git a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp
index e920cb2f..a1e7ffac 100644
--- a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp
+++ b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp
@@ -125,7 +125,7 @@ void IslePathActor::Exit()
 			e->FUN_1002ddc0(*m_boundary, local20);
 
 			((Vector3&) local20).Mul(m_roi->GetWorldBoundingSphere().Radius());
-			((Vector3&) local20).Add(GetWorldPosition());
+			((Vector3&) local20).Add(&GetWorldPosition());
 
 			MxS32 j;
 			for (j = 0; j < m_boundary->GetNumEdges(); j++) {
diff --git a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
index 497eaf2d..8b8b30fa 100644
--- a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
+++ b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
@@ -1573,7 +1573,7 @@ MxU16 LegoAnimationManager::FUN_10062110(
 				Mx3DPointFloat position(p_roi->GetWorldPosition());
 
 				// TODO: Fix call
-				((Vector3&) position).Sub(p_position);
+				((Vector3&) position).Sub(&p_position);
 				float len = position.LenSquared();
 				float min, max;
 
@@ -2466,9 +2466,9 @@ MxBool LegoAnimationManager::FUN_10064010(LegoPathBoundary* p_boundary, LegoUnkn
 	Mx3DPointFloat vec(1.0f, 1.0f, 1.0f);
 
 	boundingBox.Min() = p1;
-	boundingBox.Min().Sub(vec);
+	boundingBox.Min().Sub(&vec);
 	boundingBox.Max() = p1;
-	boundingBox.Max().Add(vec);
+	boundingBox.Max().Add(&vec);
 	return GetViewManager()->FUN_100a6150(boundingBox) == FALSE;
 }
 
diff --git a/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp b/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp
index 0e8aeff8..f0e2e69b 100644
--- a/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp
+++ b/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp
@@ -97,7 +97,7 @@ MxU32 LegoExtraActor::VTable0x90(float p_time, Matrix4& p_transform)
 		else {
 			m_state = 0;
 			m_scheduledTime = 0.0f;
-			((Vector3&) positionRef).Sub(g_unk0x10104c18); // TODO: Fix call
+			((Vector3&) positionRef).Sub(&g_unk0x10104c18); // TODO: Fix call
 			m_roi->FUN_100a58f0(p_transform);
 			return TRUE;
 		}
@@ -218,7 +218,7 @@ MxResult LegoExtraActor::VTable0x94(LegoPathActor* p_actor, MxBool p_bool)
 
 			// TODO: Fix calls
 			((Mx3DPointFloat&) dir).Mul(2.0f);
-			((Vector3&) positionRef).Add(dir);
+			((Vector3&) positionRef).Add(&dir);
 
 			for (MxS32 i = 0; i < m_boundary->GetNumEdges(); i++) {
 				Mx4DPointFloat* normal = m_boundary->GetEdgeNormal(i);
@@ -251,7 +251,7 @@ MxResult LegoExtraActor::VTable0x94(LegoPathActor* p_actor, MxBool p_bool)
 			Mx3DPointFloat dir = p_actor->GetWorldDirection();
 			MxMatrix matrix3 = MxMatrix(roi->GetLocal2World());
 			Vector3 positionRef(matrix3[3]);
-			((Vector3&) positionRef).Add(g_unk0x10104c18);
+			((Vector3&) positionRef).Add(&g_unk0x10104c18);
 			roi->FUN_100a58f0(matrix3);
 
 #ifdef COMPAT_MODE
@@ -463,7 +463,7 @@ MxU32 LegoExtraActor::VTable0x6c(
 						Vector3 local60(local2world[3]);
 						Mx3DPointFloat local54(p_v1);
 
-						((Vector3&) local54).Sub(local60);
+						((Vector3&) local54).Sub(&local60);
 						float local1c = p_v2.Dot(&p_v2, &p_v2);
 						float local24 = p_v2.Dot(&p_v2, &local54) * 2.0f;
 						float local20 = local54.Dot(&local54, &local54);
diff --git a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp
index fd9f6c39..9f026760 100644
--- a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp
+++ b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp
@@ -68,7 +68,7 @@ MxResult LegoPathActor::VTable0x80(Vector3& p_point1, Vector3& p_point2, Vector3
 	Mx3DPointFloat p1, p2, p3;
 
 	p1 = p_point3;
-	((Vector3&) p1).Sub(p_point1);
+	((Vector3&) p1).Sub(&p_point1);
 	m_BADuration = p1.LenSquared();
 
 	if (m_BADuration > 0.0f) {
@@ -120,7 +120,7 @@ MxResult LegoPathActor::VTable0x88(
 	p_destEdge.FUN_1002ddc0(*p_boundary, p3);
 
 	p4 = p2;
-	((Vector3&) p4).Sub(p1);
+	((Vector3&) p4).Sub(&p1);
 	p4.Unitize();
 
 	MxMatrix matrix;
@@ -285,12 +285,12 @@ MxS32 LegoPathActor::VTable0x8c(float p_time, Matrix4& p_transform)
 					m_worldSpeed *= m_unk0x144;
 					nav->SetLinearVel(m_worldSpeed);
 					Mx3DPointFloat p7(p2);
-					((Vector3&) p7).Sub(p6);
+					((Vector3&) p7).Sub(&p6);
 
 					if (p7.Unitize() == 0) {
 						float f = sqrt(p1.LenSquared()) * m_unk0x140;
 						((Vector3&) p7).Mul(f);
-						((Vector3&) p1).Add(p7);
+						((Vector3&) p1).Add(&p7);
 					}
 				}
 			}
@@ -474,7 +474,7 @@ MxU32 LegoPathActor::VTable0x6c(
 MxS32 LegoPathActor::VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3)
 {
 	Mx3DPointFloat v2(p_v2);
-	((Vector3&) v2).Sub(p_v1);
+	((Vector3&) v2).Sub(&p_v1);
 
 	float len = v2.LenSquared();
 
@@ -650,7 +650,7 @@ MxResult LegoPathActor::VTable0x9c()
 	Mx3DPointFloat local84(m_unk0xec[2]);
 	Mx3DPointFloat local70(local34);
 
-	((Vector3&) local70).Sub(localc0);
+	((Vector3&) local70).Sub(&localc0);
 	float len = local70.LenSquared();
 	if (len >= 0.0f) {
 		len = sqrt(len);
diff --git a/LEGO1/lego/legoomni/src/paths/legopathboundary.cpp b/LEGO1/lego/legoomni/src/paths/legopathboundary.cpp
index 0df1b1e6..bcd1875c 100644
--- a/LEGO1/lego/legoomni/src/paths/legopathboundary.cpp
+++ b/LEGO1/lego/legoomni/src/paths/legopathboundary.cpp
@@ -201,7 +201,7 @@ MxU32 LegoPathBoundary::Intersect(
 			if (local10 == 0) {
 				local10 = 1;
 				vec = p_point2;
-				((Vector3&) vec).Sub(p_point1);
+				((Vector3&) vec).Sub(&p_point1);
 
 				len = vec.LenSquared();
 				if (len <= 0.0f) {
@@ -235,7 +235,7 @@ MxU32 LegoPathBoundary::Intersect(
 
 		p_point3 = vec;
 		p_point3.Mul(localc);
-		p_point3.Add(p_point1);
+		p_point3.Add(&p_point1);
 
 		local50 = p_point2;
 		((Vector3&) local50).Sub(local5c);
@@ -345,7 +345,7 @@ MxU32 LegoPathBoundary::FUN_10057fe0(LegoAnimPresenter* p_presenter)
 	Mx3DPointFloat unk0x30;
 
 	unk0x30 = m_unk0x30;
-	((Vector3&) unk0x30).Sub(p_presenter->m_unk0xa8);
+	((Vector3&) unk0x30).Sub(&p_presenter->m_unk0xa8);
 
 	float len = unk0x30.LenSquared();
 	float local20 = p_presenter->m_unk0xa4 + m_unk0x44;
diff --git a/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp b/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp
index dd0a5092..19fc04fd 100644
--- a/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp
+++ b/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp
@@ -94,7 +94,7 @@ MxResult LegoPathController::Create(MxU8* p_data, const Vector3& p_location, con
 
 		for (i = 0; i < m_numN; i++) {
 			// TODO: Fix call
-			((Vector3&) m_unk0x10[i]).Add(p_location);
+			((Vector3&) m_unk0x10[i]).Add(&p_location);
 		}
 
 		for (i = 0; i < m_numL; i++) {
diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
index 5ff93262..ffdb2b63 100644
--- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
+++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
@@ -650,9 +650,9 @@ void LegoAnimPresenter::PutFrame()
 
 #ifdef COMPAT_MODE
 					Mx3DPointFloat location = m_currentWorld->GetCamera()->GetWorldLocation();
-					((Vector3&) up).Sub(location);
+					((Vector3&) up).Sub(&location);
 #else
-					((Vector3&) up).Sub(m_currentWorld->GetCamera()->GetWorldLocation());
+					((Vector3&) up).Sub(&m_currentWorld->GetCamera()->GetWorldLocation());
 #endif
 					((Vector3&) dir).Div(dirsqr);
 					pos.EqualsCross(&dir, &up);
@@ -1119,7 +1119,7 @@ void LegoAnimPresenter::VTable0x8c()
 		m_unk0xa8.Add((*m_unk0x78)[3]);
 	}
 	else {
-		m_unk0xa8.Add(m_action->GetLocation());
+		m_unk0xa8.Add(&m_action->GetLocation());
 	}
 
 	if (m_currentWorld == NULL) {
@@ -1176,10 +1176,10 @@ MxU32 LegoAnimPresenter::VTable0x94(Vector3& p_v1, Vector3& p_v2, float p_f1, fl
 
 	b = p_v2;
 	((Vector3&) b).Mul(p_f1);
-	((Vector3&) b).Add(p_v1);
+	((Vector3&) b).Add(&p_v1);
 
 	a = b;
-	((Vector3&) a).Sub(m_unk0xa8);
+	((Vector3&) a).Sub(&m_unk0xa8);
 
 	float len = a.LenSquared();
 	if (len <= 0.0f) {
diff --git a/LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp
index cb76955a..eaba5d98 100644
--- a/LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp
+++ b/LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp
@@ -68,9 +68,9 @@ void LegoLoopingAnimPresenter::PutFrame()
 
 #ifdef COMPAT_MODE
 				Mx3DPointFloat location = m_currentWorld->GetCamera()->GetWorldLocation();
-				((Vector3&) up).Sub(location);
+				((Vector3&) up).Sub(&location);
 #else
-				((Vector3&) up).Sub(m_currentWorld->GetCamera()->GetWorldLocation());
+				((Vector3&) up).Sub(&m_currentWorld->GetCamera()->GetWorldLocation());
 #endif
 				((Vector3&) dir).Div(dirsqr);
 				pos.EqualsCross(&dir, &up);
diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp
index de524cb2..96a6acbc 100644
--- a/LEGO1/lego/legoomni/src/worlds/isle.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp
@@ -717,13 +717,13 @@ void Isle::Enable(MxBool p_enable)
 				Mx3DPointFloat position(CurrentActor()->GetROI()->GetWorldPosition());
 
 				Mx3DPointFloat sub(-21.375f, 0.0f, -41.75f);
-				((Vector3&) sub).Sub(position);
+				((Vector3&) sub).Sub(&position);
 				if (sub.LenSquared() < 1024.0f) {
 					AnimationManager()->FUN_10064740(NULL);
 				}
 
 				Mx3DPointFloat sub2(98.874992f, 0.0f, -46.156292f);
-				((Vector3&) sub2).Sub(position);
+				((Vector3&) sub2).Sub(&position);
 				if (sub2.LenSquared() < 1024.0f) {
 					AnimationManager()->FUN_10064670(NULL);
 				}
diff --git a/LEGO1/lego/sources/misc/legounknown.cpp b/LEGO1/lego/sources/misc/legounknown.cpp
index b3976b51..117a50af 100644
--- a/LEGO1/lego/sources/misc/legounknown.cpp
+++ b/LEGO1/lego/sources/misc/legounknown.cpp
@@ -42,9 +42,9 @@ LegoResult LegoUnknown::FUN_1009a1e0(float p_f1, Matrix4& p_mat, Vector3& p_v, L
 	}
 	else if (p_f1 >= 0.999) {
 		v1 = m_unk0x00[0];
-		((Vector3&) v1).Add(m_unk0x00[1]);
-		((Vector3&) v1).Add(m_unk0x00[2]);
-		((Vector3&) v1).Add(m_unk0x00[3]);
+		((Vector3&) v1).Add(&m_unk0x00[1]);
+		((Vector3&) v1).Add(&m_unk0x00[2]);
+		((Vector3&) v1).Add(&m_unk0x00[3]);
 
 		for (LegoS32 i = 0; i < 3; i++) {
 			v4[i] = m_unk0x00[1][i] + m_unk0x00[2][i] * 2.0f + m_unk0x00[3][i] * 3.0f;
diff --git a/LEGO1/lego/sources/roi/legoroi.cpp b/LEGO1/lego/sources/roi/legoroi.cpp
index 66a8ace1..c978b6ce 100644
--- a/LEGO1/lego/sources/roi/legoroi.cpp
+++ b/LEGO1/lego/sources/roi/legoroi.cpp
@@ -565,7 +565,7 @@ LegoU32 LegoROI::FUN_100a9410(
 	if (p_collideBox) {
 		Mx3DPointFloat v2(p_v2);
 		((Vector3&) v2).Mul(p_f1);
-		((Vector3&) v2).Add(p_v1);
+		((Vector3&) v2).Add(&p_v1);
 
 		Mx4DPointFloat localc0;
 		Mx4DPointFloat local9c;
@@ -585,7 +585,7 @@ LegoU32 LegoROI::FUN_100a9410(
 		localc0[3] = local9c[3] = local168[3] = 1.0f;
 
 		local38 = local58;
-		((Vector3&) local38).Add(locala8);
+		((Vector3&) local38).Add(&locala8);
 		((Vector3&) local38).Mul(0.5f);
 
 		local70 = localc0;
@@ -624,7 +624,7 @@ LegoU32 LegoROI::FUN_100a9410(
 				if (local50 >= 0.0f && local50 <= p_f1) {
 					Mx3DPointFloat local17c(p_v2);
 					((Vector3&) local17c).Mul(local50);
-					((Vector3&) local17c).Add(local4c);
+					((Vector3&) local17c).Add(&local4c);
 
 					LegoS32 j;
 					for (j = 0; j < 6; j++) {
@@ -644,7 +644,7 @@ LegoU32 LegoROI::FUN_100a9410(
 	}
 	else {
 		Mx3DPointFloat v1(p_v1);
-		((Vector3&) v1).Sub(GetWorldBoundingSphere().Center());
+		((Vector3&) v1).Sub(&GetWorldBoundingSphere().Center());
 
 		float local10 = GetWorldBoundingSphere().Radius();
 		float local8 = p_v2.Dot(&p_v2, &p_v2);
@@ -681,7 +681,7 @@ LegoU32 LegoROI::FUN_100a9410(
 				if (local1c >= 0.0f && p_f1 >= local1c) {
 					p_v3 = p_v2;
 					p_v3.Mul(local1c);
-					p_v3.Add(p_v1);
+					p_v3.Add(&p_v1);
 					return 1;
 				}
 			}
@@ -711,9 +711,9 @@ void TimeROI::FUN_100a9b40(Matrix4& p_matrix, LegoTime p_time)
 		// TODO: Fix constness of vector/matrix functions
 #ifdef COMPAT_MODE
 		Vector3 worldPosition(m_local2world[3]);
-		((Vector3&) targetPosition).Sub(worldPosition);
+		((Vector3&) targetPosition).Sub(&worldPosition);
 #else
-		((Vector3&) targetPosition).Sub(Vector3(m_local2world[3]));
+		((Vector3&) targetPosition).Sub(&Vector3(m_local2world[3]));
 #endif
 
 		float division = time * 0.001;
diff --git a/LEGO1/mxgeometry/mxgeometry3d.h b/LEGO1/mxgeometry/mxgeometry3d.h
index 61fdac1d..970695bb 100644
--- a/LEGO1/mxgeometry/mxgeometry3d.h
+++ b/LEGO1/mxgeometry/mxgeometry3d.h
@@ -149,10 +149,10 @@ inline void UnknownMx4DPointFloat::Unknown7()
 		Mx4DPointFloat v2;
 
 		v1 = m_unk0x00;
-		((Vector4&) v1).Add(m_unk0x18);
+		((Vector4&) v1).Add(&m_unk0x18);
 
 		v2 = m_unk0x00;
-		((Vector4&) v2).Sub(m_unk0x18);
+		((Vector4&) v2).Sub(&m_unk0x18);
 
 		if (v1.Dot(&v1, &v1) < v2.Dot(&v2, &v2)) {
 			((Vector4&) m_unk0x18).Mul(-1.0f);
diff --git a/LEGO1/realtime/vector.h b/LEGO1/realtime/vector.h
index 3fd82220..01a15d49 100644
--- a/LEGO1/realtime/vector.h
+++ b/LEGO1/realtime/vector.h
@@ -120,13 +120,13 @@ public:
 	virtual void Add(float* p_other) { AddImpl(p_other); } // vtable+0x4c
 
 	// FUNCTION: LEGO1 0x100021e0
-	virtual void Add(const Vector2& p_other) { AddImpl((float*) p_other.m_data); } // vtable+0x48
+	virtual void Add(const Vector2* p_other) { AddImpl((float*) p_other->m_data); } // vtable+0x48
 
 	// FUNCTION: LEGO1 0x100021f0
 	virtual void Sub(const float* p_other) { SubImpl((float*) p_other); } // vtable+0x58
 
 	// FUNCTION: LEGO1 0x10002200
-	virtual void Sub(const Vector2& p_other) { SubImpl((float*) p_other.m_data); } // vtable+0x54
+	virtual void Sub(const Vector2* p_other) { SubImpl((float*) p_other->m_data); } // vtable+0x54
 
 	// FUNCTION: LEGO1 0x10002210
 	virtual void Mul(float* p_other) { MulVectorImpl(p_other); } // vtable+0x64
diff --git a/LEGO1/viewmanager/viewmanager.cpp b/LEGO1/viewmanager/viewmanager.cpp
index 3531381c..fe6c00a6 100644
--- a/LEGO1/viewmanager/viewmanager.cpp
+++ b/LEGO1/viewmanager/viewmanager.cpp
@@ -428,10 +428,10 @@ void ViewManager::UpdateViewTransformations()
 		Vector3 u(unk0x150[i]);
 
 		x = c;
-		((Vector3&) x).Sub(b); // TODO: Fix call
+		((Vector3&) x).Sub(&b); // TODO: Fix call
 
 		y = a;
-		((Vector3&) y).Sub(b); // TODO: Fix call
+		((Vector3&) y).Sub(&b); // TODO: Fix call
 
 		u.EqualsCross(&x, &y);
 		u.Unitize();