diff --git a/qtv/include/server.h b/qtv/include/server.h
index 96b67426d..5e74de519 100644
--- a/qtv/include/server.h
+++ b/qtv/include/server.h
@@ -57,6 +57,16 @@ typedef struct frame_s {
 	packet_entities_t entities;
 } frame_t;
 
+typedef struct qtv_leaf_s {
+	struct qtv_leaf_s *next;
+	int         num;
+} qtv_leaf_t;
+
+typedef struct {
+	entity_state_t e;
+	qtv_leaf_t *leafs;
+} qtv_entity_t;
+
 #define MAX_SV_PLAYERS 32
 #define MAX_SV_ENTITIES 512
 #define MAX_SIGNON_BUFFERS  8
@@ -96,7 +106,7 @@ typedef struct server_s {
 	int         validsequence;
 
 	frame_t     frames[UPDATE_BACKUP];
-	entity_state_t entities[MAX_SV_ENTITIES];
+	qtv_entity_t  entities[MAX_SV_ENTITIES];
 	byte        ent_valid[MAX_SV_ENTITIES];
 	entity_state_t baselines[MAX_SV_ENTITIES];
 	player_t    players[MAX_SV_PLAYERS];
diff --git a/qtv/source/client.c b/qtv/source/client.c
index 0d39e6c95..2ee08a3df 100644
--- a/qtv/source/client.c
+++ b/qtv/source/client.c
@@ -985,7 +985,7 @@ add_to_fat_pvs (vec3_t org, mnode_t *node, server_t *sv)
 	byte       *pvs;
 	int         i;
 	float       d;
-	mplane_t   *plane;
+	plane_t    *plane;
 
 	while (1) {
 		// if this is a leaf, accumulate the pvs bits
diff --git a/qtv/source/sv_parse.c b/qtv/source/sv_parse.c
index 37162cdc8..08c97588a 100644
--- a/qtv/source/sv_parse.c
+++ b/qtv/source/sv_parse.c
@@ -61,6 +61,54 @@
 #include "qtv/include/qtv.h"
 #include "qtv/include/server.h"
 
+#define QTV_LEAFS 32
+typedef struct qtv_leaf_bucket_s {
+	struct qtv_leaf_bucket_s *next;
+	qtv_leaf_t qtv_leafs[QTV_LEAFS];
+} qtv_leaf_bucket_t;
+
+static qtv_leaf_bucket_t *qtv_leaf_buckets;
+static qtv_leaf_bucket_t **qtv_leaf_bucket_tail = &qtv_leaf_buckets;
+static qtv_leaf_t *free_qtv_leaf_list;
+
+static qtv_leaf_t *
+alloc_qtv_leaf (void)
+{
+	qtv_leaf_bucket_t *bucket;
+	qtv_leaf_t *leaf;
+	int         i;
+
+	if ((leaf = free_qtv_leaf_list)) {
+		free_qtv_leaf_list = leaf->next;
+		leaf->next = 0;
+		return leaf;
+	}
+
+	bucket = malloc (sizeof (qtv_leaf_bucket_t));
+	bucket->next = 0;
+	*qtv_leaf_bucket_tail = bucket;
+	qtv_leaf_bucket_tail = &bucket->next;
+
+	for (leaf = bucket->qtv_leafs, i = 0; i < QTV_LEAFS - 1; i++, leaf++)
+		leaf->next = leaf + 1;
+	leaf->next = 0;
+	free_qtv_leaf_list = bucket->qtv_leafs;
+
+	return alloc_qtv_leaf ();
+}
+
+static void
+free_qtv_leafs (qtv_leaf_t **leafs)
+{
+	qtv_leaf_t **l;
+
+	for (l = leafs; *l; l = &(*l)->next)
+		;
+	*l = free_qtv_leaf_list;
+	free_qtv_leaf_list = *leafs;
+	*leafs = 0;
+}
+
 static void
 sv_serverdata (server_t *sv, qmsg_t *msg)
 {
@@ -430,7 +478,7 @@ sv_packetentities (server_t *sv, qmsg_t *msg, int delta)
 				}
 				newp->entities[newindex] = oldp->entities[oldindex];
 				num = newp->entities[newindex].number;
-				sv->entities[num] = newp->entities[newindex];
+				sv->entities[num].e = newp->entities[newindex];
 				sv->ent_valid[num] = 1;
 				newindex++;
 				oldindex++;
@@ -457,7 +505,7 @@ sv_packetentities (server_t *sv, qmsg_t *msg, int delta)
 			}
 			newp->entities[newindex] = oldp->entities[oldindex];
 			num = newp->entities[newindex].number;
-			sv->entities[num] = newp->entities[newindex];
+			sv->entities[num].e = newp->entities[newindex];
 			sv->ent_valid[num] = 1;
 			newindex++;
 			oldindex++;
@@ -484,7 +532,7 @@ sv_packetentities (server_t *sv, qmsg_t *msg, int delta)
 			}
 			newp->entities[newindex] = sv->baselines[newnum];
 			sv_parse_delta (msg, word, &newp->entities[newindex]);
-			sv->entities[newnum] = newp->entities[newindex];
+			sv->entities[newnum].e = newp->entities[newindex];
 			newindex++;
 			continue;
 		}
@@ -500,7 +548,7 @@ sv_packetentities (server_t *sv, qmsg_t *msg, int delta)
 			}
 			newp->entities[newindex] = oldp->entities[oldindex];
 			sv_parse_delta (msg, word, &newp->entities[newindex]);
-			sv->entities[newnum] = newp->entities[newindex];
+			sv->entities[newnum].e = newp->entities[newindex];
 			sv->ent_valid[newnum] = 1;
 			newindex++;
 			oldindex++;