Index: uspace/srv/audio/hound/audio_sink.c
===================================================================
--- uspace/srv/audio/hound/audio_sink.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/audio/hound/audio_sink.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -140,6 +140,5 @@
 
 	pcm_format_silence(dest, size, &sink->format);
-	list_foreach(sink->connections, it) {
-		connection_t * conn = connection_from_sink_list(it);
+	list_foreach(sink->connections, sink_link, connection_t, conn) {
 		const int ret = connection_add_source_data(
 		    conn, dest, size, sink->format);
Index: uspace/srv/audio/hound/audio_source.c
===================================================================
--- uspace/srv/audio/hound/audio_source.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/audio/hound/audio_source.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -106,6 +106,5 @@
 		return ENOMEM;
 
-	list_foreach(source->connections, it) {
-		connection_t *conn = connection_from_source_list(it);
+	list_foreach(source->connections, source_link, connection_t, conn) {
 		const int ret = connection_push_data(conn, adata);
 		if (ret != EOK) {
Index: uspace/srv/audio/hound/connection.h
===================================================================
--- uspace/srv/audio/hound/connection.h	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/audio/hound/connection.h	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -76,14 +76,4 @@
  * @return pointer to a connection structure, NULL on failure.
  */
-static inline connection_t * connection_from_sink_list(link_t *l)
-{
-	return l ? list_get_instance(l, connection_t, sink_link) : NULL;
-}
-
-/**
- * List instance helper.
- * @param l link
- * @return pointer to a connection structure, NULL on failure.
- */
 static inline connection_t * connection_from_hound_list(link_t *l)
 {
Index: uspace/srv/audio/hound/hound.c
===================================================================
--- uspace/srv/audio/hound/hound.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/audio/hound/hound.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -47,20 +47,4 @@
 #include "str_error.h"
 
-#define FIND_BY_NAME(type) \
-do { \
-	assert(list); \
-	assert(name); \
-	list_foreach(*list, it) { \
-		audio_ ## type ## _t *dev = \
-		    audio_ ## type ## _list_instance(it); \
-		if (str_cmp(name, dev->name) == 0) { \
-			log_debug("%s with name '%s' is in the list", \
-			    #type, name); \
-			return dev; \
-		} \
-	} \
-	return NULL; \
-} while (0)
-
 /**
  * Search devices by name.
@@ -68,7 +52,18 @@
  * @return Pointer to the found device, NULL on failure.
  */
-static audio_device_t * find_device_by_name(list_t *list, const char *name)
-{
-	FIND_BY_NAME(device);
+static audio_device_t *find_device_by_name(list_t *list, const char *name)
+{
+	assert(list);
+	assert(name);
+
+	list_foreach(*list, link, audio_device_t, dev) {
+		if (str_cmp(name, dev->name) == 0) {
+			log_debug("device with name '%s' is in the list",
+			    name);
+			return dev;
+		}
+	}
+
+	return NULL;
 }
 
@@ -78,7 +73,18 @@
  * @return Pointer to the found source, NULL on failure.
  */
-static audio_source_t * find_source_by_name(list_t *list, const char *name)
-{
-	FIND_BY_NAME(source);
+static audio_source_t *find_source_by_name(list_t *list, const char *name)
+{
+	assert(list);
+	assert(name);
+
+	list_foreach(*list, link, audio_source_t, dev) {
+		if (str_cmp(name, dev->name) == 0) {
+			log_debug("source with name '%s' is in the list",
+			    name);
+			return dev;
+		}
+	}
+
+	return NULL;
 }
 
@@ -88,7 +94,18 @@
  * @return Pointer to the found sink, NULL on failure.
  */
-static audio_sink_t * find_sink_by_name(list_t *list, const char *name)
-{
-	FIND_BY_NAME(sink);
+static audio_sink_t *find_sink_by_name(list_t *list, const char *name)
+{
+	assert(list);
+	assert(name);
+
+	list_foreach(*list, link, audio_sink_t, dev) {
+		if (str_cmp(name, dev->name) == 0) {
+			log_debug("sink with name '%s' is in the list",
+			    name);
+			return dev;
+		}
+	}
+
+	return NULL;
 }
 
@@ -111,6 +128,6 @@
 		log_warning("Removing sink '%s' while still connected.", sink->name);
 	while (!list_empty(&sink->connections)) {
-		connection_t *conn =
-		    connection_from_sink_list(list_first(&sink->connections));
+		connection_t *conn = list_get_instance(
+		    list_first(&sink->connections), connection_t, sink_link);
 		list_remove(&conn->hound_link);
 		connection_destroy(conn);
@@ -128,13 +145,10 @@
 static void hound_remove_source_internal(hound_t *hound, audio_source_t *source)
 {
-	assert(hound);
-	assert(source);
 	log_verbose("Removing source '%s'.", source->name);
 	if (!list_empty(&source->connections))
 		log_warning("Removing source '%s' while still connected.", source->name);
 	while (!list_empty(&source->connections)) {
-		connection_t *conn =
-		    connection_from_source_list(list_first(&source->connections));
-		assert(conn);
+		connection_t *conn = list_get_instance(
+		    list_first(&source->connections), connection_t, source_link);
 		list_remove(&conn->hound_link);
 		connection_destroy(conn);
@@ -223,6 +237,5 @@
 	fibril_mutex_lock(&hound->list_guard);
 	hound_ctx_t *res = NULL;
-	list_foreach(hound->contexts, it) {
-		hound_ctx_t *ctx = hound_ctx_from_link(it);
+	list_foreach(hound->contexts, link, hound_ctx_t, ctx) {
 		if (hound_ctx_get_id(ctx) == id) {
 			res = ctx;
@@ -251,6 +264,5 @@
 	}
 
-	list_foreach(hound->devices, it) {
-		audio_device_t *dev = audio_device_list_instance(it);
+	list_foreach(hound->devices, link, audio_device_t, dev) {
 		if (dev->id == id) {
 			log_debug("Device with id %zu is already present", id);
Index: uspace/srv/audio/hound/hound_ctx.c
===================================================================
--- uspace/srv/audio/hound/hound_ctx.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/audio/hound/hound_ctx.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -176,14 +176,4 @@
 
 /**
- * List instance helper.
- * @param l link
- * @return pointer to a hound context structure, NULL on failure.
- */
-static inline hound_ctx_stream_t *hound_ctx_stream_from_link(link_t *l)
-{
-	return l ? list_get_instance(l, hound_ctx_stream_t, link) : NULL;
-}
-
-/**
  * New stream append helper.
  * @param ctx hound context.
@@ -417,6 +407,5 @@
 	pcm_format_silence(buffer, size, &source->format);
 	fibril_mutex_lock(&ctx->guard);
-	list_foreach(ctx->streams, it) {
-		hound_ctx_stream_t *stream = hound_ctx_stream_from_link(it);
+	list_foreach(ctx->streams, link, hound_ctx_stream_t, stream) {
 		ssize_t copied = hound_ctx_stream_add_self(
 		    stream, buffer, size, &source->format);
@@ -426,6 +415,5 @@
 	log_verbose("CTX: %p. Pushing audio to %u connections", ctx,
 	    list_count(&source->connections));
-	list_foreach(source->connections, it) {
-		connection_t *conn = connection_from_source_list(it);
+	list_foreach(source->connections, source_link, connection_t, conn) {
 		connection_push_data(conn, adata);
 	}
@@ -444,6 +432,5 @@
 	/* count available data */
 	size_t available_frames = -1;  /* this is ugly.... */
-	list_foreach(sink->connections, it) {
-		connection_t *conn = connection_from_source_list(it);
+	list_foreach(sink->connections, source_link, connection_t, conn) {
 		available_frames = min(available_frames,
 		    audio_pipe_frames(&conn->fifo));
@@ -466,6 +453,5 @@
 	/* mix data */
 	pcm_format_silence(buffer, bsize, &sink->format);
-	list_foreach(sink->connections, it) {
-		connection_t *conn = connection_from_source_list(it);
+	list_foreach(sink->connections, source_link, connection_t, conn) {
 		/* This should not trigger data update on the source */
 		const size_t copied = connection_add_source_data(
@@ -476,6 +462,5 @@
 	}
 	/* push to all streams */
-	list_foreach(ctx->streams, it) {
-		hound_ctx_stream_t *stream = hound_ctx_stream_from_link(it);
+	list_foreach(ctx->streams, link, hound_ctx_stream_t, stream) {
 		const int ret = stream_push_data(stream, adata);
 		if (ret != EOK)
Index: uspace/srv/audio/hound/hound_ctx.h
===================================================================
--- uspace/srv/audio/hound/hound_ctx.h	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/audio/hound/hound_ctx.h	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -58,14 +58,4 @@
 } hound_ctx_t;
 
-/**
- * List instance helper.
- * @param l link
- * @return pointer to a hound context structure, NULL on failure.
- */
-static inline hound_ctx_t *hound_ctx_from_link(link_t *l)
-{
-	return l ? list_get_instance(l, hound_ctx_t, link) : NULL;
-}
-
 typedef struct hound_ctx_stream hound_ctx_stream_t;
 
Index: uspace/srv/devman/devman.c
===================================================================
--- uspace/srv/devman/devman.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/devman/devman.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -496,11 +496,10 @@
 driver_t *find_best_match_driver(driver_list_t *drivers_list, dev_node_t *node)
 {
-	driver_t *best_drv = NULL, *drv = NULL;
+	driver_t *best_drv = NULL;
 	int best_score = 0, score = 0;
 	
 	fibril_mutex_lock(&drivers_list->drivers_mutex);
 	
-	list_foreach(drivers_list->drivers, link) {
-		drv = list_get_instance(link, driver_t, drivers);
+	list_foreach(drivers_list->drivers, drivers, driver_t, drv) {
 		score = get_match_score(drv, node);
 		if (score > best_score) {
@@ -596,10 +595,8 @@
 {
 	driver_t *res = NULL;
-	driver_t *drv = NULL;
 	
 	fibril_mutex_lock(&drv_list->drivers_mutex);
 	
-	list_foreach(drv_list->drivers, link) {
-		drv = list_get_instance(link, driver_t, drivers);
+	list_foreach(drv_list->drivers, drivers, driver_t, drv) {
 		if (str_cmp(drv->name, drv_name) == 0) {
 			res = drv;
@@ -1131,8 +1128,5 @@
 
 	size_t pos = 0;
-	list_foreach(dev->functions, item) {
-		fun_node_t *fun =
-		    list_get_instance(item, fun_node_t, dev_functions);
-
+	list_foreach(dev->functions, dev_functions, fun_node_t, fun) {
 		if (pos < buf_cnt) {
 			hdl_buf[pos] = fun->handle;
@@ -1472,9 +1466,5 @@
 	assert(fibril_rwlock_is_locked(&tree->rwlock));
 
-	fun_node_t *fun;
-
-	list_foreach(dev->functions, link) {
-		fun = list_get_instance(link, fun_node_t, dev_functions);
-
+	list_foreach(dev->functions, dev_functions, fun_node_t, fun) {
 		if (str_cmp(name, fun->name) == 0) {
 			fun_add_ref(fun);
Index: uspace/srv/fs/cdfs/cdfs_ops.c
===================================================================
--- uspace/srv/fs/cdfs/cdfs_ops.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/fs/cdfs/cdfs_ops.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -365,8 +365,5 @@
 	
 	/* Check for duplicate entries */
-	list_foreach(parent->cs_list, link) {
-		cdfs_dentry_t *dentry =
-		    list_get_instance(link, cdfs_dentry_t, link);
-		
+	list_foreach(parent->cs_list, link, cdfs_dentry_t, dentry) {
 		if (str_cmp(dentry->name, name) == 0)
 			return EEXIST;
@@ -524,8 +521,5 @@
 	}
 	
-	list_foreach(parent->cs_list, link) {
-		cdfs_dentry_t *dentry =
-		    list_get_instance(link, cdfs_dentry_t, link);
-		
+	list_foreach(parent->cs_list, link, cdfs_dentry_t, dentry) {
 		if (str_cmp(dentry->name, component) == 0) {
 			*fn = get_cached_node(parent->service_id, dentry->index);
Index: uspace/srv/fs/exfat/exfat_idx.c
===================================================================
--- uspace/srv/fs/exfat/exfat_idx.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/fs/exfat/exfat_idx.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -88,11 +88,8 @@
 static unused_t *unused_find(service_id_t service_id, bool lock)
 {
-	unused_t *u;
-
 	if (lock)
 		fibril_mutex_lock(&unused_lock);
 
-	list_foreach(unused_list, l) {
-		u = list_get_instance(l, unused_t, link);
+	list_foreach(unused_list, link, unused_t, u) {
 		if (u->service_id == service_id) 
 			return u;
Index: uspace/srv/fs/exfat/exfat_ops.c
===================================================================
--- uspace/srv/fs/exfat/exfat_ops.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/fs/exfat/exfat_ops.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -155,5 +155,4 @@
 static int exfat_node_fini_by_service_id(service_id_t service_id)
 {
-	exfat_node_t *nodep;
 	int rc;
 
@@ -166,6 +165,5 @@
 restart:
 	fibril_mutex_lock(&ffn_mutex);
-	list_foreach(ffn_list, lnk) {
-		nodep = list_get_instance(lnk, exfat_node_t, ffn_link);
+	list_foreach(ffn_list, ffn_link, exfat_node_t, nodep) {
 		if (!fibril_mutex_trylock(&nodep->lock)) {
 			fibril_mutex_unlock(&ffn_mutex);
Index: uspace/srv/fs/ext4fs/ext4fs_ops.c
===================================================================
--- uspace/srv/fs/ext4fs/ext4fs_ops.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/fs/ext4fs/ext4fs_ops.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -194,8 +194,5 @@
 	}
 	
-	list_foreach(instance_list, link) {
-		ext4fs_instance_t *tmp =
-		    list_get_instance(link, ext4fs_instance_t, link);
-		
+	list_foreach(instance_list, link, ext4fs_instance_t, tmp) {
 		if (tmp->service_id == service_id) {
 			*inst = tmp;
Index: uspace/srv/fs/fat/fat_idx.c
===================================================================
--- uspace/srv/fs/fat/fat_idx.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/fs/fat/fat_idx.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -88,11 +88,8 @@
 static unused_t *unused_find(service_id_t service_id, bool lock)
 {
-	unused_t *u;
-
 	if (lock)
 		fibril_mutex_lock(&unused_lock);
 
-	list_foreach(unused_list, l) {
-		u = list_get_instance(l, unused_t, link);
+	list_foreach(unused_list, link, unused_t, u) {
 		if (u->service_id == service_id) 
 			return u;
Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/fs/fat/fat_ops.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -149,5 +149,4 @@
 static int fat_node_fini_by_service_id(service_id_t service_id)
 {
-	fat_node_t *nodep;
 	int rc;
 
@@ -160,6 +159,5 @@
 restart:
 	fibril_mutex_lock(&ffn_mutex);
-	list_foreach(ffn_list, lnk) {
-		nodep = list_get_instance(lnk, fat_node_t, ffn_link);
+	list_foreach(ffn_list, ffn_link, fat_node_t, nodep) {
 		if (!fibril_mutex_trylock(&nodep->lock)) {
 			fibril_mutex_unlock(&ffn_mutex);
Index: uspace/srv/fs/tmpfs/tmpfs_ops.c
===================================================================
--- uspace/srv/fs/tmpfs/tmpfs_ops.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/fs/tmpfs/tmpfs_ops.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -259,7 +259,5 @@
 	tmpfs_node_t *parentp = TMPFS_NODE(pfn);
 
-	list_foreach(parentp->cs_list, lnk) {
-		tmpfs_dentry_t *dentryp;
-		dentryp = list_get_instance(lnk, tmpfs_dentry_t, link);
+	list_foreach(parentp->cs_list, link, tmpfs_dentry_t, dentryp) {
 		if (!str_cmp(dentryp->name, component)) {
 			*rfn = FS_NODE(dentryp->node);
@@ -365,7 +363,6 @@
 
 	/* Check for duplicit entries. */
-	list_foreach(parentp->cs_list, lnk) {
-		dentryp = list_get_instance(lnk, tmpfs_dentry_t, link);	
-		if (!str_cmp(dentryp->name, nm))
+	list_foreach(parentp->cs_list, link, tmpfs_dentry_t, dp) {
+		if (!str_cmp(dp->name, nm))
 			return EEXIST;
 	}
@@ -400,8 +397,8 @@
 	if (!parentp)
 		return EBUSY;
-	
-	list_foreach(parentp->cs_list, lnk) {
-		dentryp = list_get_instance(lnk, tmpfs_dentry_t, link);
-		if (!str_cmp(dentryp->name, nm)) {
+
+	list_foreach(parentp->cs_list, link, tmpfs_dentry_t, dp) {
+		if (!str_cmp(dp->name, nm)) {
+			dentryp = dp;
 			childp = dentryp->node;
 			assert(FS_NODE(childp) == cfn);
Index: uspace/srv/hid/compositor/compositor.c
===================================================================
--- uspace/srv/hid/compositor/compositor.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/hid/compositor/compositor.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -335,6 +335,5 @@
 	}
 
-	list_foreach(viewport_list, link) {
-		viewport_t *vp = list_get_instance(link, viewport_t, link);
+	list_foreach(viewport_list, link, viewport_t, vp) {
 		sysarg_t w_vp, h_vp;
 		surface_get_resolution(vp->surface, &w_vp, &h_vp);
@@ -354,6 +353,5 @@
 	fibril_mutex_lock(&pointer_list_mtx);
 
-	list_foreach(pointer_list, link) {
-		pointer_t *ptr = list_get_instance(link, pointer_t, link);
+	list_foreach(pointer_list, link, pointer_t, ptr) {
 		ptr->pos.x = ptr->pos.x > viewport_bound_rect.x ? ptr->pos.x : viewport_bound_rect.x;
 		ptr->pos.y = ptr->pos.y > viewport_bound_rect.y ? ptr->pos.y : viewport_bound_rect.y;
@@ -374,8 +372,6 @@
 	fibril_mutex_lock(&pointer_list_mtx);
 
-	list_foreach(viewport_list, link) {
-
+	list_foreach(viewport_list, link, viewport_t, vp) {
 		/* Determine what part of the viewport must be updated. */
-		viewport_t *vp = list_get_instance(link, viewport_t, link);
 		sysarg_t x_dmg_vp, y_dmg_vp, w_dmg_vp, h_dmg_vp;
 		surface_get_resolution(vp->surface, &w_dmg_vp, &h_dmg_vp);
@@ -446,7 +442,5 @@
 			}
 
-			list_foreach(pointer_list, link) {
-
-				pointer_t *ptr = list_get_instance(link, pointer_t, link);
+			list_foreach(pointer_list, link, pointer_t, ptr) {
 				if (ptr->ghost.surface) {
 
@@ -522,9 +516,8 @@
 			}
 
-			list_foreach(pointer_list, link) {
+			list_foreach(pointer_list, link, pointer_t, ptr) {
 
 				/* Determine what part of the pointer intersects with the
 				 * updated area of the current viewport. */
-				pointer_t *ptr = list_get_instance(link, pointer_t, link);
 				sysarg_t x_dmg_ptr, y_dmg_ptr, w_dmg_ptr, h_dmg_ptr;
 				surface_t *sf_ptr = ptr->cursor.states[ptr->state];
@@ -569,6 +562,5 @@
 
 	/* Notify visualizers about updated regions. */
-	list_foreach(viewport_list, link) {
-		viewport_t *vp = list_get_instance(link, viewport_t, link);
+	list_foreach(viewport_list, link, viewport_t, vp) {
 		sysarg_t x_dmg_vp, y_dmg_vp, w_dmg_vp, h_dmg_vp;
 		surface_get_damaged_region(vp->surface, &x_dmg_vp, &y_dmg_vp, &w_dmg_vp, &h_dmg_vp);
@@ -631,6 +623,5 @@
 
 	fibril_mutex_lock(&pointer_list_mtx);
-	list_foreach(pointer_list, link) {
-		pointer_t *pointer = list_get_instance(link, pointer_t, link);
+	list_foreach(pointer_list, link, pointer_t, pointer) {
 		if (pointer->id == pos_id) {
 			pointer->grab_flags = pointer->pressed ? grab_flags : GF_EMPTY;
@@ -710,15 +701,15 @@
 {
 	fibril_mutex_lock(&window_list_mtx);
-	window_t *window = NULL;
-	list_foreach(window_list, link) {
-		window = list_get_instance(link, window_t, link);
+
+	list_foreach(window_list, link, window_t, window) {
 		if (window == target) {
 			prodcons_produce(&window->queue, &event->link);
-		}
-	}
-	if (!window) {
-		free(event);
-	}
+			fibril_mutex_unlock(&window_list_mtx);
+			return;
+		}
+	}
+
 	fibril_mutex_unlock(&window_list_mtx);
+	free(event);
 }
 
@@ -863,6 +854,5 @@
 	window_t *win = NULL;
 	fibril_mutex_lock(&window_list_mtx);
-	list_foreach(window_list, link) {
-		window_t *cur = list_get_instance(link, window_t, link);
+	list_foreach(window_list, link, window_t, cur) {
 		if (cur->in_dsid == service_id || cur->out_dsid == service_id) {
 			win = cur;
@@ -1007,6 +997,5 @@
 		/* Close all clients and their windows. */
 		fibril_mutex_lock(&window_list_mtx);
-		list_foreach(window_list, link) {
-			window_t *win = list_get_instance(link, window_t, link);
+		list_foreach(window_list, link, window_t, win) {
 			window_event_t *event = (window_event_t *) malloc(sizeof(window_event_t));
 			if (event) {
@@ -1034,6 +1023,5 @@
 	viewport_t *vp = NULL;
 	fibril_mutex_lock(&viewport_list_mtx);
-	list_foreach(viewport_list, link) {
-		viewport_t *cur = list_get_instance(link, viewport_t, link);
+	list_foreach(viewport_list, link, viewport_t, cur) {
 		if (cur->dsid == (service_id_t) IPC_GET_ARG1(*icall)) {
 			vp = cur;
@@ -1571,6 +1559,6 @@
 
 	/* Determine the window which the mouse click belongs to. */
-	list_foreach(window_list, link) {
-		win = list_get_instance(link, window_t, link);
+	list_foreach(window_list, link, window_t, cw) {
+		win = cw;
 		if (win->surface) {
 			surface_get_resolution(win->surface, &width, &height);
Index: uspace/srv/hid/input/input.c
===================================================================
--- uspace/srv/hid/input/input.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/hid/input/input.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -470,8 +470,5 @@
 {
 	/* For each keyboard device */
-	list_foreach(kbd_devs, kdev_link) {
-		kbd_dev_t *kdev = list_get_instance(kdev_link, kbd_dev_t,
-		    kbd_devs);
-		
+	list_foreach(kbd_devs, kbd_devs, kbd_dev_t, kdev) {
 		/* Yield port */
 		if (kdev->port_ops != NULL)
@@ -483,8 +480,5 @@
 {
 	/* For each keyboard device */
-	list_foreach(kbd_devs, kdev_link) {
-		kbd_dev_t *kdev = list_get_instance(kdev_link, kbd_dev_t,
-		    kbd_devs);
-		
+	list_foreach(kbd_devs, kbd_devs, kbd_dev_t, kdev) {
 		/* Reclaim port */
 		if (kdev->port_ops != NULL)
@@ -521,7 +515,5 @@
 		
 		/* Determine whether we already know this device. */
-		list_foreach(kbd_devs, kdev_link) {
-			kbd_dev_t *kdev = list_get_instance(kdev_link,
-			    kbd_dev_t, kbd_devs);
+		list_foreach(kbd_devs, kbd_devs, kbd_dev_t, kdev) {
 			if (kdev->svc_id == svcs[i]) {
 				already_known = true;
@@ -574,7 +566,5 @@
 		
 		/* Determine whether we already know this device. */
-		list_foreach(mouse_devs, mdev_link) {
-			mouse_dev_t *mdev = list_get_instance(mdev_link,
-			    mouse_dev_t, mouse_devs);
+		list_foreach(mouse_devs, mouse_devs, mouse_dev_t, mdev) {
 			if (mdev->svc_id == svcs[i]) {
 				already_known = true;
Index: uspace/srv/hid/output/output.c
===================================================================
--- uspace/srv/hid/output/output.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/hid/output/output.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -82,7 +82,5 @@
 	int ret = EOK;
 	
-	list_foreach(outdevs, link) {
-		outdev_t *dev = list_get_instance(link, outdev_t, link);
-		
+	list_foreach(outdevs, link, outdev_t, dev) {
 		assert(dev->ops.yield);
 		
@@ -99,7 +97,5 @@
 	int ret = EOK;
 	
-	list_foreach(outdevs, link) {
-		outdev_t *dev = list_get_instance(link, outdev_t, link);
-		
+	list_foreach(outdevs, link, outdev_t, dev) {
 		assert(dev->ops.claim);
 		
@@ -117,7 +113,5 @@
 	sysarg_t rows = MAX_ROWS;
 	
-	list_foreach(outdevs, link) {
-		outdev_t *dev = list_get_instance(link, outdev_t, link);
-		
+	list_foreach(outdevs, link, outdev_t, dev) {
 		cols = min(cols, dev->cols);
 		rows = min(rows, dev->rows);
@@ -131,7 +125,5 @@
 	console_caps_t caps = 0;
 	
-	list_foreach(outdevs, link) {
-		outdev_t *dev = list_get_instance(link, outdev_t, link);
-		
+	list_foreach(outdevs, link, outdev_t, dev) {
 		assert(dev->ops.get_caps);
 		
@@ -145,6 +137,5 @@
 {
 	frontbuf_t *frontbuf = NULL;
-	list_foreach(frontbufs, link) {
-		frontbuf_t *cur = list_get_instance(link, frontbuf_t, link);
+	list_foreach(frontbufs, link, frontbuf_t, cur) {
 		if (cur == (frontbuf_t *) handle) {
 			frontbuf = cur;
@@ -216,7 +207,5 @@
 	chargrid_get_cursor(buf, &col, &row);
 	
-	list_foreach(outdevs, link) {
-		outdev_t *dev = list_get_instance(link, outdev_t, link);
-		
+	list_foreach(outdevs, link, outdev_t, dev) {
 		assert(dev->ops.cursor_update);
 		
@@ -237,7 +226,5 @@
 static void srv_set_style(ipc_callid_t iid, ipc_call_t *icall)
 {
-	list_foreach(outdevs, link) {
-		outdev_t *dev = list_get_instance(link, outdev_t, link);
-		
+	list_foreach(outdevs, link, outdev_t, dev) {
 		dev->attrs.type = CHAR_ATTR_STYLE;
 		dev->attrs.val.style =
@@ -250,7 +237,5 @@
 static void srv_set_color(ipc_callid_t iid, ipc_call_t *icall)
 {
-	list_foreach(outdevs, link) {
-		outdev_t *dev = list_get_instance(link, outdev_t, link);
-		
+	list_foreach(outdevs, link, outdev_t, dev) {
 		dev->attrs.type = CHAR_ATTR_INDEX;
 		dev->attrs.val.index.bgcolor =
@@ -267,7 +252,5 @@
 static void srv_set_rgb_color(ipc_callid_t iid, ipc_call_t *icall)
 {
-	list_foreach(outdevs, link) {
-		outdev_t *dev = list_get_instance(link, outdev_t, link);
-		
+	list_foreach(outdevs, link, outdev_t, dev) {
 		dev->attrs.type = CHAR_ATTR_RGB;
 		dev->attrs.val.rgb.bgcolor = IPC_GET_ARG1(*icall);
@@ -325,7 +308,5 @@
 	chargrid_t *buf = (chargrid_t *) frontbuf->data;
 	
-	list_foreach(outdevs, link) {
-		outdev_t *dev = list_get_instance(link, outdev_t, link);
-		
+	list_foreach(outdevs, link, outdev_t, dev) {
 		assert(dev->ops.char_update);
 		
@@ -374,7 +355,5 @@
 	chargrid_t *buf = (chargrid_t *) frontbuf->data;
 	
-	list_foreach(outdevs, link) {
-		outdev_t *dev = list_get_instance(link, outdev_t, link);
-		
+	list_foreach(outdevs, link, outdev_t, dev) {
 		assert(dev->ops.char_update);
 		
Index: uspace/srv/hid/remcons/user.c
===================================================================
--- uspace/srv/hid/remcons/user.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/hid/remcons/user.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -128,6 +128,5 @@
 
 	fibril_mutex_lock(&users_guard);
-	list_foreach(users, link) {
-		telnet_user_t *tmp = list_get_instance(link, telnet_user_t, link);
+	list_foreach(users, link, telnet_user_t, tmp) {
 		if (tmp->service_id == id) {
 			user = tmp;
Index: uspace/srv/locsrv/category.c
===================================================================
--- uspace/srv/locsrv/category.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/locsrv/category.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -73,8 +73,5 @@
 
 	size_t pos = 0;
-	list_foreach(cdir->categories, item) {
-		category_t *cat =
-		    list_get_instance(item, category_t, cat_list);
-
+	list_foreach(cdir->categories, cat_list, category_t, cat) {
 		if (pos < buf_cnt)
 			id_buf[pos] = cat->id;
@@ -116,7 +113,5 @@
 
 	/* Verify that category does not contain this service yet. */
-	list_foreach(cat->svc_memb, item) {
-		svc_categ_t *memb = list_get_instance(item, svc_categ_t,
-		    cat_link);
+	list_foreach(cat->svc_memb, cat_link, svc_categ_t, memb) {
 		if (memb->svc == svc) {
 			return EEXIST;
@@ -154,7 +149,5 @@
 	assert(fibril_mutex_is_locked(&cdir->mutex));
 
-	list_foreach(cdir->categories, item) {
-		category_t *cat = list_get_instance(item, category_t,
-		    cat_list);
+	list_foreach(cdir->categories, cat_list, category_t, cat) {
 		if (cat->id == catid)
 			return cat;
@@ -169,7 +162,5 @@
 	assert(fibril_mutex_is_locked(&cdir->mutex));
 
-	list_foreach(cdir->categories, item) {
-		category_t *cat = list_get_instance(item, category_t,
-		    cat_list);
+	list_foreach(cdir->categories, cat_list, category_t, cat) {
 		if (str_cmp(cat->name, name) == 0)
 			return cat;
@@ -197,8 +188,5 @@
 
 	size_t pos = 0;
-	list_foreach(cat->svc_memb, item) {
-		svc_categ_t *memb =
-		    list_get_instance(item, svc_categ_t, cat_link);
-
+	list_foreach(cat->svc_memb, cat_link, svc_categ_t, memb) {
 		if (pos < buf_cnt)
 			id_buf[pos] = memb->svc->id;
Index: uspace/srv/locsrv/locsrv.c
===================================================================
--- uspace/srv/locsrv/locsrv.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/locsrv/locsrv.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -184,7 +184,5 @@
 	assert(fibril_mutex_is_locked(&services_list_mutex));
 	
-	list_foreach(namespaces_list, item) {
-		loc_namespace_t *namespace =
-		    list_get_instance(item, loc_namespace_t, namespaces);
+	list_foreach(namespaces_list, namespaces, loc_namespace_t, namespace) {
 		if (str_cmp(namespace->name, name) == 0)
 			return namespace;
@@ -203,7 +201,5 @@
 	assert(fibril_mutex_is_locked(&services_list_mutex));
 	
-	list_foreach(namespaces_list, item) {
-		loc_namespace_t *namespace =
-		    list_get_instance(item, loc_namespace_t, namespaces);
+	list_foreach(namespaces_list, namespaces, loc_namespace_t, namespace) {
 		if (namespace->id == id)
 			return namespace;
@@ -219,7 +215,5 @@
 	assert(fibril_mutex_is_locked(&services_list_mutex));
 	
-	list_foreach(services_list, item) {
-		loc_service_t *service =
-		    list_get_instance(item, loc_service_t, services);
+	list_foreach(services_list, services, loc_service_t, service) {
 		if ((str_cmp(service->namespace->name, ns_name) == 0)
 		    && (str_cmp(service->name, name) == 0))
@@ -239,7 +233,5 @@
 	assert(fibril_mutex_is_locked(&services_list_mutex));
 	
-	list_foreach(services_list, item) {
-		loc_service_t *service =
-		    list_get_instance(item, loc_service_t, services);
+	list_foreach(services_list, services, loc_service_t, service) {
 		if (service->id == id)
 			return service;
@@ -889,9 +881,5 @@
 	fibril_mutex_lock(&callback_sess_mutex);
 	
-	list_foreach(callback_sess_list, link) {
-		cb_sess_t *cb_sess;
-		
-		cb_sess = list_get_instance(link, cb_sess_t, cb_sess_list);
-		
+	list_foreach(callback_sess_list, cb_sess_list, cb_sess_t, cb_sess) {
 		async_exch_t *exch = async_exchange_begin(cb_sess->sess);
 		async_msg_0(exch, LOC_EVENT_CAT_CHANGE);
@@ -1050,8 +1038,5 @@
 	
 	size_t pos = 0;
-	list_foreach(namespaces_list, item) {
-		loc_namespace_t *namespace =
-		    list_get_instance(item, loc_namespace_t, namespaces);
-		
+	list_foreach(namespaces_list, namespaces, loc_namespace_t, namespace) {
 		desc[pos].id = namespace->id;
 		str_cpy(desc[pos].name, LOC_NAME_MAXLEN, namespace->name);
@@ -1114,8 +1099,5 @@
 	
 	size_t pos = 0;
-	list_foreach(services_list, item) {
-		loc_service_t *service =
-		    list_get_instance(item, loc_service_t, services);
-		
+	list_foreach(services_list, services, loc_service_t, service) {
 		if (service->namespace == namespace) {
 			desc[pos].id = service->id;
Index: uspace/srv/logger/logs.c
===================================================================
--- uspace/srv/logger/logs.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/logger/logs.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -44,6 +44,5 @@
 static logger_log_t *find_log_by_name_and_parent_no_list_lock(const char *name, logger_log_t *parent)
 {
-	list_foreach(log_list, it) {
-		logger_log_t *log = list_get_instance(it, logger_log_t, link);
+	list_foreach(log_list, link, logger_log_t, log) {
 		if ((parent == log->parent) && (str_cmp(log->name, name) == 0))
 			return log;
@@ -148,6 +147,5 @@
 
 	fibril_mutex_lock(&log_list_guard);
-	list_foreach(log_list, it) {
-		logger_log_t *log = list_get_instance(it, logger_log_t, link);
+	list_foreach(log_list, link, logger_log_t, log) {
 		if (str_cmp(log->full_name, name) == 0) {
 			fibril_mutex_lock(&log->guard);
@@ -166,6 +164,5 @@
 
 	fibril_mutex_lock(&log_list_guard);
-	list_foreach(log_list, it) {
-		logger_log_t *log = list_get_instance(it, logger_log_t, link);
+	list_foreach(log_list, link, logger_log_t, log) {
 		if ((sysarg_t) log == id) {
 			fibril_mutex_lock(&log->guard);
Index: uspace/srv/net/dnsrsrv/dns_msg.c
===================================================================
--- uspace/srv/net/dnsrsrv/dns_msg.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/dnsrsrv/dns_msg.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -510,6 +510,5 @@
 	size = sizeof(dns_header_t);
 
-	list_foreach(msg->question, link) {
-		dns_question_t *q = list_get_instance(link, dns_question_t, msg);
+	list_foreach(msg->question, msg, dns_question_t, q) {
 		rc = dns_question_encode(q, NULL, 0, &q_size);
 		if (rc != EOK)
@@ -526,6 +525,5 @@
 	di = sizeof(dns_header_t);
 
-	list_foreach(msg->question, link) {
-		dns_question_t *q = list_get_instance(link, dns_question_t, msg);
+	list_foreach(msg->question, msg, dns_question_t, q) {
 		rc = dns_question_encode(q, data + di, size - di, &q_size);
 		if (rc != EOK) {
Index: uspace/srv/net/dnsrsrv/query.c
===================================================================
--- uspace/srv/net/dnsrsrv/query.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/dnsrsrv/query.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -99,7 +99,5 @@
 	}
 	
-	list_foreach(amsg->answer, link) {
-		dns_rr_t *rr = list_get_instance(link, dns_rr_t, msg);
-		
+	list_foreach(amsg->answer, msg, dns_rr_t, rr) {
 		log_msg(LOG_DEFAULT, LVL_DEBUG, " - '%s' %u/%u, dsize %zu",
 		    rr->name, rr->rtype, rr->rclass, rr->rdata_size);
Index: uspace/srv/net/dnsrsrv/transport.c
===================================================================
--- uspace/srv/net/dnsrsrv/transport.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/dnsrsrv/transport.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -158,7 +158,5 @@
 	assert(fibril_mutex_is_locked(&treq_lock));
 
-	list_foreach(treq_list, link) {
-		trans_req_t *treq = list_get_instance(link, trans_req_t, lreq);
-
+	list_foreach(treq_list, lreq, trans_req_t, treq) {
 		if (treq->req->id == resp->id) {
 			/* Match */
Index: uspace/srv/net/ethip/atrans.c
===================================================================
--- uspace/srv/net/ethip/atrans.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/ethip/atrans.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -51,8 +51,5 @@
 static ethip_atrans_t *atrans_find(addr32_t ip_addr)
 {
-	list_foreach(atrans_list, link) {
-		ethip_atrans_t *atrans = list_get_instance(link,
-		    ethip_atrans_t, atrans_list);
-
+	list_foreach(atrans_list, atrans_list, ethip_atrans_t, atrans) {
 		if (atrans->ip_addr == ip_addr)
 			return atrans;
Index: uspace/srv/net/ethip/ethip_nic.c
===================================================================
--- uspace/srv/net/ethip/ethip_nic.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/ethip/ethip_nic.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -84,7 +84,5 @@
 		already_known = false;
 
-		list_foreach(ethip_nic_list, link) {
-			ethip_nic_t *nic = list_get_instance(link,
-			    ethip_nic_t, link);
+		list_foreach(ethip_nic_list, link, ethip_nic_t, nic) {
 			if (nic->svc_id == svcs[i]) {
 				already_known = true;
@@ -313,8 +311,6 @@
 	    (unsigned) iplink_sid);
 
-	list_foreach(ethip_nic_list, link) {
+	list_foreach(ethip_nic_list, link, ethip_nic_t, nic) {
 		log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_find_by_iplink_sid - element");
-		ethip_nic_t *nic = list_get_instance(link, ethip_nic_t, link);
-
 		if (nic->iplink_sid == iplink_sid) {
 			log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_find_by_iplink_sid - found %p", nic);
@@ -350,8 +346,5 @@
 	size_t count = 0;
 	
-	list_foreach(nic->addr_list, link) {
-		ethip_link_addr_t *laddr = list_get_instance(link,
-		    ethip_link_addr_t, link);
-		
+	list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) {
 		uint16_t af = inet_addr_get(&laddr->addr, NULL, NULL);
 		if (af == AF_INET6)
@@ -371,8 +364,5 @@
 	size_t i = 0;
 	
-	list_foreach(nic->addr_list, link) {
-		ethip_link_addr_t *laddr = list_get_instance(link,
-		    ethip_link_addr_t, link);
-		
+	list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) {
 		addr128_t v6;
 		uint16_t af = inet_addr_get(&laddr->addr, NULL, &v6);
@@ -444,8 +434,5 @@
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_find()");
 	
-	list_foreach(nic->addr_list, link) {
-		ethip_link_addr_t *laddr = list_get_instance(link,
-		    ethip_link_addr_t, link);
-		
+	list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) {
 		if (inet_addr_compare(addr, &laddr->addr))
 			return laddr;
Index: uspace/srv/net/inetsrv/addrobj.c
===================================================================
--- uspace/srv/net/inetsrv/addrobj.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/inetsrv/addrobj.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -115,8 +115,5 @@
 	fibril_mutex_lock(&addr_list_lock);
 	
-	list_foreach(addr_list, link) {
-		inet_addrobj_t *naddr = list_get_instance(link,
-		    inet_addrobj_t, addr_list);
-		
+	list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) {
 		switch (find) {
 		case iaf_net:
@@ -158,8 +155,5 @@
 	    name, ilink->svc_name);
 
-	list_foreach(addr_list, link) {
-		inet_addrobj_t *naddr = list_get_instance(link,
-		    inet_addrobj_t, addr_list);
-
+	list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) {
 		if (naddr->ilink == ilink && str_cmp(naddr->name, name) == 0) {
 			log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find_by_name_locked: found %p",
@@ -206,8 +200,5 @@
 	fibril_mutex_lock(&addr_list_lock);
 
-	list_foreach(addr_list, link) {
-		inet_addrobj_t *naddr = list_get_instance(link,
-		    inet_addrobj_t, addr_list);
-
+	list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) {
 		if (naddr->id == id) {
 			fibril_mutex_unlock(&addr_list_lock);
@@ -277,8 +268,5 @@
 
 	i = 0;
-	list_foreach(addr_list, link) {
-		inet_addrobj_t *addr = list_get_instance(link,
-		    inet_addrobj_t, addr_list);
-
+	list_foreach(addr_list, addr_list, inet_addrobj_t, addr) {
 		id_list[i++] = addr->id;
 	}
Index: uspace/srv/net/inetsrv/inet_link.c
===================================================================
--- uspace/srv/net/inetsrv/inet_link.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/inetsrv/inet_link.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -140,7 +140,5 @@
 		already_known = false;
 
-		list_foreach(inet_link_list, ilink_link) {
-			inet_link_t *ilink = list_get_instance(ilink_link,
-			    inet_link_t, link_list);
+		list_foreach(inet_link_list, link_list, inet_link_t, ilink) {
 			if (ilink->svc_id == svcs[i]) {
 				already_known = true;
@@ -492,8 +490,5 @@
 	fibril_mutex_lock(&inet_discovery_lock);
 
-	list_foreach(inet_link_list, elem) {
-		inet_link_t *ilink = list_get_instance(elem, inet_link_t,
-		    link_list);
-
+	list_foreach(inet_link_list, link_list, inet_link_t, ilink) {
 		if (ilink->svc_id == link_id) {
 			fibril_mutex_unlock(&inet_discovery_lock);
Index: uspace/srv/net/inetsrv/inetping.c
===================================================================
--- uspace/srv/net/inetsrv/inetping.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/inetsrv/inetping.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -82,8 +82,5 @@
 	fibril_mutex_lock(&client_list_lock);
 	
-	list_foreach(client_list, link) {
-		inetping_client_t *client = list_get_instance(link,
-		    inetping_client_t, client_list);
-		
+	list_foreach(client_list, client_list, inetping_client_t, client) {
 		if (client->ident == ident) {
 			fibril_mutex_unlock(&client_list_lock);
Index: uspace/srv/net/inetsrv/inetping6.c
===================================================================
--- uspace/srv/net/inetsrv/inetping6.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/inetsrv/inetping6.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -82,8 +82,5 @@
 	fibril_mutex_lock(&client_list_lock);
 	
-	list_foreach(client_list, link) {
-		inetping6_client_t *client = list_get_instance(link,
-		    inetping6_client_t, client_list);
-		
+	list_foreach(client_list, client_list, inetping6_client_t, client) {
 		if (client->ident == ident) {
 			fibril_mutex_unlock(&client_list_lock);
Index: uspace/srv/net/inetsrv/inetsrv.c
===================================================================
--- uspace/srv/net/inetsrv/inetsrv.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/inetsrv/inetsrv.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -446,8 +446,5 @@
 	fibril_mutex_lock(&client_list_lock);
 
-	list_foreach(client_list, link) {
-		inet_client_t *client = list_get_instance(link, inet_client_t,
-		    client_list);
-
+	list_foreach(client_list, client_list, inet_client_t, client) {
 		if (client->protocol == proto) {
 			fibril_mutex_unlock(&client_list_lock);
Index: uspace/srv/net/inetsrv/ntrans.c
===================================================================
--- uspace/srv/net/inetsrv/ntrans.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/inetsrv/ntrans.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -56,8 +56,5 @@
 static inet_ntrans_t *ntrans_find(addr128_t ip_addr)
 {
-	list_foreach(ntrans_list, link) {
-		inet_ntrans_t *ntrans = list_get_instance(link,
-		    inet_ntrans_t, ntrans_list);
-
+	list_foreach(ntrans_list, ntrans_list, inet_ntrans_t, ntrans) {
 		if (addr128_compare(ntrans->ip_addr, ip_addr))
 			return ntrans;
Index: uspace/srv/net/inetsrv/reass.c
===================================================================
--- uspace/srv/net/inetsrv/reass.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/inetsrv/reass.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -129,8 +129,5 @@
 	assert(fibril_mutex_is_locked(&reass_dgram_map_lock));
 
-	list_foreach(reass_dgram_map, link) {
-		reass_dgram_t *rdg = list_get_instance(link, reass_dgram_t,
-		    map_link);
-
+	list_foreach(reass_dgram_map, map_link, reass_dgram_t, rdg) {
 		link_t *f1_link = list_first(&rdg->frags);
 		assert(f1_link != NULL);
@@ -289,6 +286,6 @@
 	size_t fragoff_limit;
 	inet_dgram_t dgram;
+	uint8_t proto;
 	reass_frag_t *frag;
-	uint8_t proto;
 
 	/*
@@ -297,9 +294,9 @@
 	 */
 	frag = NULL;
-	list_foreach(rdg->frags, link) {
-		frag = list_get_instance(link, reass_frag_t, dgram_link);
-
-		if (!frag->packet.mf)
+	list_foreach(rdg->frags, dgram_link, reass_frag_t, cfrag) {
+		if (!cfrag->packet.mf) {
+			frag = cfrag;
 			break;
+		}
 	}
 
@@ -330,20 +327,17 @@
 	size_t doffs = 0;
 
-	frag = NULL;
-	list_foreach(rdg->frags, link) {
-		frag = list_get_instance(link, reass_frag_t, dgram_link);
-
+	list_foreach(rdg->frags, dgram_link, reass_frag_t, cfrag) {
 		size_t cb, ce;
 
-		cb = max(doffs, frag->packet.offs);
-		ce = min(dgram_size, frag->packet.offs + frag->packet.size);
+		cb = max(doffs, cfrag->packet.offs);
+		ce = min(dgram_size, cfrag->packet.offs + cfrag->packet.size);
 
 		if (ce > cb) {
 			memcpy(dgram.data + cb,
-			    frag->packet.data + cb - frag->packet.offs,
+			    cfrag->packet.data + cb - cfrag->packet.offs,
 			    ce - cb);
 		}
 
-		if (!frag->packet.mf)
+		if (!cfrag->packet.mf)
 			break;
 	}
Index: uspace/srv/net/inetsrv/sroute.c
===================================================================
--- uspace/srv/net/inetsrv/sroute.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/inetsrv/sroute.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -89,5 +89,5 @@
 }
 
-/** Find address object matching address @a addr.
+/** Find static route object matching address @a addr.
  *
  * @param addr	Address
@@ -102,8 +102,5 @@
 	fibril_mutex_lock(&sroute_list_lock);
 	
-	list_foreach(sroute_list, link) {
-		inet_sroute_t *sroute = list_get_instance(link,
-		    inet_sroute_t, sroute_list);
-		
+	list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) {
 		uint8_t dest_bits;
 		uint16_t dest_af = inet_naddr_get(&sroute->dest, NULL, NULL,
@@ -147,8 +144,5 @@
 	fibril_mutex_lock(&sroute_list_lock);
 
-	list_foreach(sroute_list, link) {
-		inet_sroute_t *sroute = list_get_instance(link,
-		    inet_sroute_t, sroute_list);
-
+	list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) {
 		if (str_cmp(sroute->name, name) == 0) {
 			fibril_mutex_unlock(&sroute_list_lock);
@@ -176,8 +170,5 @@
 	fibril_mutex_lock(&sroute_list_lock);
 
-	list_foreach(sroute_list, link) {
-		inet_sroute_t *sroute = list_get_instance(link,
-		    inet_sroute_t, sroute_list);
-
+	list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) {
 		if (sroute->id == id) {
 			fibril_mutex_unlock(&sroute_list_lock);
@@ -207,8 +198,5 @@
 
 	i = 0;
-	list_foreach(sroute_list, link) {
-		inet_sroute_t *sroute = list_get_instance(link,
-		    inet_sroute_t, sroute_list);
-
+	list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) {
 		id_list[i++] = sroute->id;
 	}
Index: uspace/srv/net/tcp/conn.c
===================================================================
--- uspace/srv/net/tcp/conn.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/tcp/conn.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -360,6 +360,5 @@
 	fibril_mutex_lock(&conn_list_lock);
 	
-	list_foreach(conn_list, link) {
-		tcp_conn_t *conn = list_get_instance(link, tcp_conn_t, link);
+	list_foreach(conn_list, link, tcp_conn_t, conn) {
 		tcp_sockpair_t *csp = &conn->ident;
 		
Index: uspace/srv/net/udp/assoc.c
===================================================================
--- uspace/srv/net/udp/assoc.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/net/udp/assoc.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -419,6 +419,5 @@
 	fibril_mutex_lock(&assoc_list_lock);
 	
-	list_foreach(assoc_list, link) {
-		udp_assoc_t *assoc = list_get_instance(link, udp_assoc_t, link);
+	list_foreach(assoc_list, link, udp_assoc_t, assoc) {
 		udp_sockpair_t *asp = &assoc->ident;
 		
Index: uspace/srv/ns/service.c
===================================================================
--- uspace/srv/ns/service.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/ns/service.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -106,7 +106,5 @@
 {
 loop:
-	list_foreach(pending_conn, cur) {
-		pending_conn_t *pr = list_get_instance(cur, pending_conn_t, link);
-		
+	list_foreach(pending_conn, link, pending_conn_t, pr) {
 		ht_link_t *link = hash_table_find(&service_hash_table, &pr->service);
 		if (!link)
@@ -117,5 +115,5 @@
 		    pr->arg3, 0, IPC_FF_NONE);
 		
-		list_remove(cur);
+		list_remove(&pr->link);
 		free(pr);
 		goto loop;
Index: uspace/srv/ns/task.c
===================================================================
--- uspace/srv/ns/task.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/ns/task.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -179,7 +179,5 @@
 	
 loop:
-	list_foreach(pending_wait, cur) {
-		pending_wait_t *pr = list_get_instance(cur, pending_wait_t, link);
-		
+	list_foreach(pending_wait, link, pending_wait_t, pr) {
 		ht_link_t *link = hash_table_find(&task_hash_table, &pr->id);
 		if (!link)
@@ -198,5 +196,5 @@
 		
 		hash_table_remove(&task_hash_table, &pr->id);
-		list_remove(cur);
+		list_remove(&pr->link);
 		free(pr);
 		goto loop;
Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/vfs/vfs_ops.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -548,8 +548,5 @@
 	int found = 0;
 
-	list_foreach(mtab_list, cur) {
-		mtab_ent_t *mtab_ent = list_get_instance(cur, mtab_ent_t,
-		    link);
-
+	list_foreach(mtab_list, link, mtab_ent_t, mtab_ent) {
 		if (str_cmp(mtab_ent->mp, mp) == 0) {
 			list_remove(&mtab_ent->link);
@@ -1371,8 +1368,5 @@
 	async_answer_1(callid, EOK, mtab_size);
 
-	list_foreach(mtab_list, cur) {
-		mtab_ent_t *mtab_ent = list_get_instance(cur, mtab_ent_t,
-		    link);
-
+	list_foreach(mtab_list, link, mtab_ent_t, mtab_ent) {
 		rc = ENOTSUP;
 
Index: uspace/srv/vfs/vfs_register.c
===================================================================
--- uspace/srv/vfs/vfs_register.c	(revision 5b08d7506fa0a7bbf6c9ccbfd674f4bca498b5b1)
+++ uspace/srv/vfs/vfs_register.c	(revision 65f77f49a836dcced483f55fa0160a30f7948d1e)
@@ -260,7 +260,5 @@
 	fibril_mutex_lock(&fs_list_lock);
 	
-	list_foreach(fs_list, cur) {
-		fs_info_t *fs = list_get_instance(cur, fs_info_t, fs_link);
-		
+	list_foreach(fs_list, fs_link, fs_info_t, fs) {
 		if (fs->fs_handle == handle) {
 			fibril_mutex_unlock(&fs_list_lock);
@@ -305,6 +303,5 @@
 		fibril_mutex_lock(&fs_list_lock);
 	
-	list_foreach(fs_list, cur) {
-		fs_info_t *fs = list_get_instance(cur, fs_info_t, fs_link);
+	list_foreach(fs_list, fs_link, fs_info_t, fs) {
 		if (str_cmp(fs->vfs_info.name, name) == 0 &&
 		    instance == fs->vfs_info.instance) {
@@ -332,6 +329,5 @@
 	
 	fibril_mutex_lock(&fs_list_lock);
-	list_foreach(fs_list, cur) {
-		fs_info_t *fs = list_get_instance(cur, fs_info_t, fs_link);
+	list_foreach(fs_list, fs_link, fs_info_t, fs) {
 		if (fs->fs_handle == handle) { 
 			info = &fs->vfs_info;
