diff -u batman-adv-git2/packet.h batman-adv-git/packet.h
--- batman-adv-git2/packet.h	2010-03-03 23:54:37.000000000 +0100
+++ batman-adv-git/packet.h	2010-03-03 09:09:03.000000000 +0100
@@ -92,5 +92,4 @@
 	uint8_t  vis_orig[6];	 /* originator that informs about its
 				  * neighbors */
 	uint8_t  target_orig[6]; /* who should receive this packet */
-	uint8_t  sender_orig[6]; /* who sent or rebroadcasted this packet */
 } __attribute__((packed));
diff -u batman-adv-git2/proc.c batman-adv-git/proc.c
--- batman-adv-git2/proc.c	2010-03-03 23:54:37.000000000 +0100
+++ batman-adv-git/proc.c	2010-03-03 11:18:21.000000000 +0100
@@ -368,10 +368,6 @@
 {
 	HASHIT(hashit);
 	struct vis_info *info;
-	struct vis_info_entry *entries;
-	HLIST_HEAD(vis_if_list);
-	int i;
-	char tmp_addr_str[ETH_STR_LEN];
 	unsigned long flags;
 	int vis_server = atomic_read(&vis_mode);
 
@@ -386,19 +382,7 @@
 	spin_lock_irqsave(&vis_hash_lock, flags);
 	while (hash_iterate(vis_hash, &hashit)) {
 		info = hashit.bucket->data;
-		entries = (struct vis_info_entry *)
-			((char *)info + sizeof(struct vis_info));
-		addr_to_string(tmp_addr_str, info->packet.vis_orig);
-		seq_printf(seq, "%s,", tmp_addr_str);
-
-		for (i = 0; i < info->packet.entries; i++) {
-			proc_vis_read_entry(seq, &entries[i], &vis_if_list,
-					    info->packet.vis_orig);
-		}
-
-		/* add primary/secondary records */
-		proc_vis_read_prim_sec(seq, &vis_if_list);
-		seq_printf(seq, "\n");
+		proc_vis_read_entry(seq, info);
 	}
 	spin_unlock_irqrestore(&vis_hash_lock, flags);
 
diff -u batman-adv-git2/routing.c batman-adv-git/routing.c
--- batman-adv-git2/routing.c	2010-03-03 23:54:37.000000000 +0100
+++ batman-adv-git/routing.c	2010-03-03 09:09:00.000000000 +0100
@@ -954,7 +954,7 @@
 	if (is_my_mac(vis_packet->vis_orig))
 		return NET_RX_DROP;
 
-	if (is_my_mac(vis_packet->sender_orig))
+	if (is_my_mac(ethhdr->h_source))
 		return NET_RX_DROP;
 
 	switch (vis_packet->vis_type) {
diff -u batman-adv-git2/vis.c batman-adv-git/vis.c
--- batman-adv-git2/vis.c	2010-03-03 23:55:06.000000000 +0100
+++ batman-adv-git/vis.c	2010-03-03 11:38:59.000000000 +0100
@@ -85,65 +85,65 @@
 	return hash % size;
 }
 
-/* insert interface to the list of interfaces of one originator, if it
- * does not already exist in the list */
-static void proc_vis_insert_interface(const uint8_t *interface,
-				      struct hlist_head *if_list,
-				      bool primary)
-{
-	struct if_list_entry *entry;
-	struct hlist_node *pos;
-
-	hlist_for_each_entry(entry, pos, if_list, list) {
-		if (compare_orig(entry->addr, (void *)interface))
-			return;
-	}
+void proc_vis_read_prim_sec(struct seq_file *seq, struct vis_info *info)
+{
+	int i;
+	char tmp_addr_str[ETH_STR_LEN];
 
-	/* its a new address, add it to the list */
-	entry = kmalloc(sizeof(*entry), GFP_KERNEL);
-	if (!entry)
-		return;
-	memcpy(entry->addr, interface, ETH_ALEN);
-	entry->primary = primary;
-	hlist_add_head(&entry->list, if_list);
+	struct vis_if_entry *if_entry = (struct vis_if_entry *)
+		((char *)info + sizeof(struct vis_info));	
+
+	seq_printf(seq, "PRIMARY, ");
+	for (i = 1; i < info->packet.entries; i++) {
+		addr_to_string(tmp_addr_str, if_entry->src);
+		seq_printf(seq, "SEC %s, ", tmp_addr_str);
+
+		if_entry = if_entry + sizeof(struct vis_if_entry) +
+			if_entry->num_neigh * sizeof(struct vis_neigh_entry);
+	}
 }
 
-void proc_vis_read_prim_sec(struct seq_file *seq,
-			    struct hlist_head *if_list)
+/* read neighbor entries belonging to a source interface */
+void proc_vis_read_neigh(struct seq_file *seq, struct vis_if_entry *if_entry)
 {
-	struct if_list_entry *entry;
-	struct hlist_node *pos, *n;
-	char tmp_addr_str[ETH_STR_LEN];
+	int i;
+	char dest_addr_str[ETH_STR_LEN];
+	struct vis_neigh_entry *neigh_entry = (struct vis_neigh_entry*)
+				((char*) if_entry + sizeof(struct vis_if_entry));
 
-	hlist_for_each_entry_safe(entry, pos, n, if_list, list) {
-		if (entry->primary) {
-			seq_printf(seq, "PRIMARY, ");
-		} else {
-			addr_to_string(tmp_addr_str, entry->addr);
-			seq_printf(seq, "SEC %s, ", tmp_addr_str);
-		}
+	for (i = 0; i < if_entry->num_neigh; i++) {
+		addr_to_string(dest_addr_str, neigh_entry->dest);
+		if (neigh_entry->quality == 0)
+			seq_printf(seq, "HNA %s, ", dest_addr_str);
+		else
+			seq_printf(seq, "TQ %s %d, ", dest_addr_str,
+					neigh_entry->quality);
 
-		hlist_del(&entry->list);
-		kfree(entry);
+		neigh_entry = neigh_entry + sizeof(struct vis_neigh_entry);
 	}
 }
 
-/* read an entry  */
-void proc_vis_read_entry(struct seq_file *seq,
-				struct vis_info_entry *entry,
-				struct hlist_head *if_list,
-				uint8_t *vis_orig)
-{
-	char to[40];
-
-	addr_to_string(to, entry->dest);
-	if (entry->quality == 0) {
-		proc_vis_insert_interface(vis_orig, if_list, true);
-		seq_printf(seq, "HNA %s, ", to);
-	} else {
-		proc_vis_insert_interface(entry->src, if_list,
-					  compare_orig(entry->src, vis_orig));
-		seq_printf(seq, "TQ %s %d, ", to, entry->quality);
+/* read source interface entries belonging to an originator */
+void proc_vis_read_entry(struct seq_file *seq, struct vis_info *info)
+{
+	int i;
+	char src_addr_str[ETH_STR_LEN];
+
+	struct vis_if_entry *if_entry = (struct vis_if_entry *)
+		((char *)info + sizeof(struct vis_info));
+
+	for (i = 0; i < info->packet.entries; i++) {
+		addr_to_string(src_addr_str, if_entry->src);
+		seq_printf(seq, "%s,", src_addr_str);
+		proc_vis_read_neigh(seq, if_entry);
+
+		/* add primary/secondary records, if src-if = primary */
+		if (i == 0)
+			proc_vis_read_prim_sec(seq, info);
+
+		seq_printf(seq, "\n");
+		if_entry = if_entry + sizeof(struct vis_if_entry) +
+			if_entry->num_neigh * sizeof(struct vis_neigh_entry);
 	}
 }
 
@@ -223,7 +223,7 @@
 		if (vis_packet->seqno - old_info->packet.seqno <= 0) {
 			if (old_info->packet.seqno == vis_packet->seqno) {
 				recv_list_add(&old_info->recv_list,
-					      vis_packet->sender_orig);
+					      vis_packet->vis_orig);
 				return old_info;
 			} else {
 				/* newer packet is already in hash. */
@@ -259,7 +259,7 @@
 		info->packet.entries = vis_info_len /
 			sizeof(struct vis_info_entry);
 
-	recv_list_add(&info->recv_list, info->packet.sender_orig);
+	recv_list_add(&info->recv_list, info->packet.vis_orig);
 
 	/* try to add it */
 	if (hash_add(vis_hash, info) < 0) {
@@ -542,7 +542,6 @@
 		return;
 	}
 
-	memcpy(info->packet.sender_orig, mainIfAddr, ETH_ALEN);
 	info->packet.ttl--;
 
 	packet_length = sizeof(struct vis_packet) +
@@ -622,7 +621,6 @@
 	INIT_LIST_HEAD(&send_list);
 
 	memcpy(my_vis_info->packet.vis_orig, mainIfAddr, ETH_ALEN);
-	memcpy(my_vis_info->packet.sender_orig, mainIfAddr, ETH_ALEN);
 
 	if (hash_add(vis_hash, my_vis_info) < 0) {
 		printk(KERN_ERR
diff -u batman-adv-git2/vis.h batman-adv-git/vis.h
--- batman-adv-git2/vis.h	2010-03-03 23:55:06.000000000 +0100
+++ batman-adv-git/vis.h	2010-03-03 23:58:01.000000000 +0100
@@ -35,9 +35,13 @@
 	/* vis_info may follow here*/
 } __attribute__((packed));
 
-struct vis_info_entry {
+struct vis_if_entry {
 	uint8_t  src[ETH_ALEN];
-	uint8_t  dest[ETH_ALEN];
+	uint8_t  num_neigh;
+} __attribute__((packed));
+
+struct vis_neigh_entry {
+	uint8_t  dest[ETH_ALEN]; /* neighbor's interface mac */
 	uint8_t  quality;	/* quality = 0 means HNA */
 } __attribute__((packed));
 
@@ -49,12 +53,10 @@
 extern struct hashtable_t *vis_hash;
 extern spinlock_t vis_hash_lock;
 
-void proc_vis_read_entry(struct seq_file *seq,
-				struct vis_info_entry *entry,
-				struct hlist_head *if_list,
-				uint8_t *vis_orig);
-void proc_vis_read_prim_sec(struct seq_file *seq,
-			    struct hlist_head *if_list);
+void proc_vis_read_prim_sec(struct seq_file *seq, struct vis_info *info);
+void proc_vis_read_neigh(struct seq_file *seq, struct vis_if_entry *if_entry);
+void proc_vis_read_entry(struct seq_file *seq, struct vis_info *info);
+
 void receive_server_sync_packet(struct vis_packet *vis_packet,
 				int vis_info_len);
 void receive_client_update_packet(struct vis_packet *vis_packet,
