diff --git a/src/ai.c b/src/ai.c
index 251191c..23ae9b3 100644
--- a/src/ai.c
+++ b/src/ai.c
@@ -607,7 +607,7 @@ static int ai_turn(lua_State* L) {
 // Face the target.
 static int ai_face(lua_State* L) {
   MIN_ARGS(1);
-  Vec2* v; // Grab the position to face.
+  Vec2* v, sv, tv; // Grab the position to face.
   Pilot* p;
   double mod, diff;
 	int invert = 0;
@@ -619,16 +619,28 @@ static int ai_face(lua_State* L) {
 	if(n >= 0) {
 		p = pilot_get(n);
    	if(p == NULL) return 0; // Make sure pilot is valid.
-   	v = &p->solid->pos;
+		vect_cset(&tv, VX(p->solid->pos) + FACE_WVEL*VX(p->solid->vel),
+					VY(p->solid->pos) + FACE_WVEL*VY(p->solid->vel));
+   	v = NULL;
   }
   else if(lua_islightuserdata(L,1)) v = (Vec2*)lua_topointer(L,1);
 
   mod = -10;
   if(lua_gettop(L) > 1 && lua_isnumber(L,2)) invert = (int)lua_tonumber(L,2);
 	if(invert) mod *= -1;
-	diff = angle_diff(cur_pilot->solid->dir,
-				(n==-1) ? VANGLE(cur_pilot->solid->pos) :
-							vect_angle(&cur_pilot->solid->pos, v));
+	vect_cset(&sv, VX(cur_pilot->solid->pos) + FACE_WVEL*VX(cur_pilot->solid->vel),
+				VY(cur_pilot->solid->pos) + FACE_WVEL*VY(cur_pilot->solid->vel));
+	
+	if(v != NULL)
+		// Target is static.
+		diff = angle_diff(cur_pilot->solid->dir,
+					(n==-1) ? VANGLE(cur_pilot->solid->pos) :
+					vect_angle(&cur_pilot->solid->pos, v));
+	else
+		// Target is dynamic.
+		diff = angle_diff(cur_pilot->solid->dir,
+					(n==-1) ? VANGLE(sv) :
+					vect_angle(&sv, &tv));
   
   pilot_turn = mod*diff;
 
diff --git a/src/ai.h b/src/ai.h
index d7dd733..d538031 100644
--- a/src/ai.h
+++ b/src/ai.h
@@ -5,6 +5,7 @@
 #define MAX_DIR_ERR 0.1*M_PI/180.
 #define MIN_VEL_ERR 1.0
 
+#define FACE_WVEL		0.1 // Weight of velocity compared to position to face.
 
 // Max number of AI timers.
 #define MAX_AI_TIMERS 2