Index: boot/arch/amd64/Makefile.inc
===================================================================
--- boot/arch/amd64/Makefile.inc	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/amd64/Makefile.inc	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -35,5 +35,5 @@
 	$(USPACEDIR)/console/console \
 	$(USPACEDIR)/tetris/tetris \
-	$(USPACEDIR)/ipcc/ipcc \
+	$(USPACEDIR)/tester/tester \
 	$(USPACEDIR)/klog/klog
 
Index: boot/arch/amd64/grub/menu.lst
===================================================================
--- boot/arch/amd64/grub/menu.lst	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/amd64/grub/menu.lst	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -12,4 +12,4 @@
 module /boot/console
 module /boot/tetris
-module /boot/ipcc
+module /boot/tester
 module /boot/klog
Index: boot/arch/ia32/Makefile.inc
===================================================================
--- boot/arch/ia32/Makefile.inc	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/ia32/Makefile.inc	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -35,5 +35,5 @@
 	$(USPACEDIR)/console/console \
 	$(USPACEDIR)/tetris/tetris \
-	$(USPACEDIR)/ipcc/ipcc \
+	$(USPACEDIR)/tester/tester \
 	$(USPACEDIR)/klog/klog
 
Index: boot/arch/ia32/grub/menu.lst
===================================================================
--- boot/arch/ia32/grub/menu.lst	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/ia32/grub/menu.lst	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -12,4 +12,4 @@
 module /boot/console
 module /boot/tetris
-module /boot/ipcc
+module /boot/tester
 module /boot/klog
Index: boot/arch/ia32xen/Makefile.inc
===================================================================
--- boot/arch/ia32xen/Makefile.inc	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/ia32xen/Makefile.inc	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -35,5 +35,5 @@
 	$(USPACEDIR)/console/console \
 	$(USPACEDIR)/tetris/tetris \
-	$(USPACEDIR)/ipcc/ipcc \
+	$(USPACEDIR)/tester/tester \
 	$(USPACEDIR)/klog/klog
 
Index: boot/arch/ia32xen/grub/menu.debug.lst
===================================================================
--- boot/arch/ia32xen/grub/menu.debug.lst	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/ia32xen/grub/menu.debug.lst	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -13,4 +13,4 @@
 module /boot/console
 module /boot/tetris
-module /boot/ipcc
+module /boot/tester
 module /boot/klog
Index: boot/arch/ia32xen/grub/menu.lst
===================================================================
--- boot/arch/ia32xen/grub/menu.lst	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/ia32xen/grub/menu.lst	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -13,4 +13,4 @@
 module /boot/console
 module /boot/tetris
-module /boot/ipcc
+module /boot/tester
 module /boot/klog
Index: boot/arch/mips32/loader/Makefile
===================================================================
--- boot/arch/mips32/loader/Makefile	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/mips32/loader/Makefile	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -75,5 +75,5 @@
 	$(USPACEDIR)/console/console \
 	$(USPACEDIR)/tetris/tetris \
-	$(USPACEDIR)/ipcc/ipcc \
+	$(USPACEDIR)/tester/tester \
 	$(USPACEDIR)/klog/klog
 
Index: boot/arch/ppc32/loader/Makefile
===================================================================
--- boot/arch/ppc32/loader/Makefile	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/ppc32/loader/Makefile	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -76,5 +76,5 @@
 	$(USPACEDIR)/console/console \
 	$(USPACEDIR)/tetris/tetris \
-	$(USPACEDIR)/ipcc/ipcc \
+	$(USPACEDIR)/tester/tester \
 	$(USPACEDIR)/klog/klog
 
Index: boot/arch/ppc64/loader/Makefile
===================================================================
--- boot/arch/ppc64/loader/Makefile	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/ppc64/loader/Makefile	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -76,5 +76,5 @@
 	$(USPACEDIR)/console/console \
 	$(USPACEDIR)/tetris/tetris \
-	$(USPACEDIR)/ipcc/ipcc \
+	$(USPACEDIR)/tester/tester \
 	$(USPACEDIR)/klog/klog
 
Index: boot/arch/sparc64/loader/Makefile
===================================================================
--- boot/arch/sparc64/loader/Makefile	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ boot/arch/sparc64/loader/Makefile	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -79,5 +79,5 @@
 	$(USPACEDIR)/console/console \
 	$(USPACEDIR)/tetris/tetris \
-	$(USPACEDIR)/ipcc/ipcc \
+	$(USPACEDIR)/tester/tester \
 	$(USPACEDIR)/klog/klog
 
Index: contrib/conf/ski.conf
===================================================================
--- contrib/conf/ski.conf	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ contrib/conf/ski.conf	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -7,5 +7,5 @@
 romload HelenOS/uspace/tetris/tetris 0x1800000
 romload HelenOS/uspace/klog/klog 0x1c00000
-romload HelenOS/uspace/ipcc/ipcc 0x2000000
+romload HelenOS/uspace/tester/tester 0x2000000
 
 
Index: kernel/generic/src/lib/objc.c
===================================================================
--- kernel/generic/src/lib/objc.c	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ kernel/generic/src/lib/objc.c	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -50,5 +50,5 @@
 }
 
-- (id) free
+- (id) dispose
 {
 	return object_dispose(self);
Index: uspace/Makefile
===================================================================
--- uspace/Makefile	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ uspace/Makefile	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -42,5 +42,5 @@
 	console \
 	tetris \
-	ipcc \
+	tester \
 	klog \
 	rd \
Index: pace/ipcc/Makefile
===================================================================
--- uspace/ipcc/Makefile	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ 	(revision )
@@ -1,73 +1,0 @@
-#
-# Copyright (c) 2005 Martin Decky
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# - Redistributions of source code must retain the above copyright
-#   notice, this list of conditions and the following disclaimer.
-# - Redistributions in binary form must reproduce the above copyright
-#   notice, this list of conditions and the following disclaimer in the
-#   documentation and/or other materials provided with the distribution.
-# - The name of the author may not be used to endorse or promote products
-#   derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-
-## Setup toolchain
-#
-
-LIBC_PREFIX = ../libc
-SOFTINT_PREFIX = ../softint
-include $(LIBC_PREFIX)/Makefile.toolchain
-
-CFLAGS += -I../kbd/include
-
-LIBS = $(LIBC_PREFIX)/libc.a
-
-## Sources
-#
-
-OUTPUT = ipcc
-SOURCES = ipcc.c
-
-OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
-
-.PHONY: all clean depend disasm
-
-all: $(OUTPUT) disasm
-
--include Makefile.depend
-
-clean:
-	-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend
-
-depend:
-	$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend
-
-$(OUTPUT): $(OBJECTS) $(LIBS)
-	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
-
-disasm:
-	$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm
-
-%.o: %.S
-	$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@
-
-%.o: %.s
-	$(AS) $(AFLAGS) $< -o $@
-
-%.o: %.c
-	$(CC) $(DEFS) $(CFLAGS) -c $< -o $@
Index: pace/ipcc/ipcc.c
===================================================================
--- uspace/ipcc/ipcc.c	(revision 547fa39619a466fb8274163c93478186568cd096)
+++ 	(revision )
@@ -1,280 +1,0 @@
-/*
- * Copyright (c) 2006 Ondrej Palkovsky
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** @addtogroup ippc IPC Tester
- * @brief	IPC tester and task faulter.
- * @{
- */ 
-/**
- * @file
- */
-
-#include <stdio.h>
-#include <async.h>
-#include <ipc/ipc.h>
-#include <ipc/services.h>
-#include <errno.h>
-
-#define TEST_START       10000
-#define MAXLIST          4
-
-#define MSG_HANG_ME_UP   2000
-
-static int connections[50];
-static ipc_callid_t callids[50];
-static int phones[20];
-static int myservice = 0;
-
-static void client_connection(ipc_callid_t iid, ipc_call_t *icall)
-{
-	ipc_callid_t callid;
-	ipc_call_t call;
-	ipcarg_t phonehash = icall->in_phone_hash;
-	int retval;
-	int i;
-
-	printf("Connected phone: %P, accepting\n", icall->in_phone_hash);
-	ipc_answer_fast(iid, 0, 0, 0);
-	for (i=0;i < 1024;i++)
-		if (!connections[i]) {
-			connections[i] = phonehash;
-			break;
-		}
-	
-	while (1) {
-		callid = async_get_call(&call);
-		switch (IPC_GET_METHOD(call)) {
-		case IPC_M_PHONE_HUNGUP:
-			printf("Phone (%P) hung up.\n", phonehash);
-			retval = 0;
-			break;
-		default:
-			printf("Received message from %P: %X\n", phonehash,callid);
-			for (i = 0; i < 1024; i++)
-				if (!callids[i]) {
-					callids[i] = callid;
-					break;
-				}
-			continue;
-		}
-		ipc_answer_fast(callid, retval, 0, 0);
-	}
-}
-
-static void printhelp(void)
-{
-	printf("? - help\n");
-	printf("c - connect to other service\n");
-	printf("h - hangup connection\n");
-	printf("a - send async message to other service\n");
-	printf("s - send sync message to other service\n");
-	printf("d - answer message that we have received\n");
-	printf("j - jump to endless loop\n");
-	printf("p - page fault\n");
-	printf("u - unaligned read\n");
-}
-
-static void callback(void *private, int retval, ipc_call_t *data)
-{
-	printf("Received response to msg %d - retval: %d.\n", private,
-	       retval);
-}
-
-static void do_answer_msg(void)
-{
-	int i,cnt, errn = 0;
-	char c;
-
-	cnt = 0;
-	for (i = 0;i < 50; i++) {
-		if (callids[i]) {
-			printf("%d: %P\n", cnt, callids[i]);
-			cnt++;
-		}
-		if (cnt >= 10)
-			break;
-	}
-	if (!cnt)
-		return;
-	printf("Choose message:\n");
-	do {
-		c = getchar();
-	} while (c < '0' || (c-'0') >= cnt);
-	cnt = c - '0' + 1;
-	
-	for (i = 0; cnt; i++)
-		if (callids[i])
-			cnt--;
-	i -= 1;
-
-	printf("Normal (n) or hangup (h) or error(e) message?\n");
-	do {
-		c = getchar();
-	} while (c != 'n' && c != 'h' && c != 'e');
-	if (c == 'n')
-		errn = 0;
-	else if (c == 'h')
-		errn = EHANGUP;
-	else if (c == 'e')
-		errn = ENOENT;
-	printf("Answering %P\n", callids[i]);
-	ipc_answer_fast(callids[i], errn, 0, 0);
-	callids[i] = 0;
-}
-
-static void do_send_msg(int async)
-{
-	int phoneid;
-	int res;
-	static int msgid = 1;
-	char c;
-
-	printf("Select phoneid to send msg: 2-9\n");
-	do {
-		c = getchar();
-	} while (c < '2' || c > '9');
-	phoneid = c - '0';
-
-	if (async) {
-		ipc_call_async(phoneid, 2000, 0, (void *)msgid, callback, 1);
-		printf("Async sent - msg %d\n", msgid);
-		msgid++;
-	} else {
-		printf("Sending msg...");
-		res = ipc_call_sync_2(phoneid, 2000, 0, 0, NULL, NULL);
-		printf("done: %d\n", res);
-	}
-}
-
-static void do_hangup(void)
-{
-	char c;
-	int res;
-	int phoneid;
-
-	printf("Select phoneid to hangup: 2-9\n");
-	do {
-		c = getchar();
-	} while (c < '2' || c > '9');
-	phoneid = c - '0';
-	
-	printf("Hanging up...");
-	res = ipc_hangup(phoneid);
-	printf("done: %d\n", phoneid);
-}
-
-static void do_connect(void)
-{
-	char c;
-	int svc;
-	int phid;
-
-	printf("Choose one service: 0:10000....9:10009\n");
-	do {
-		c = getchar();
-	} while (c < '0' || c > '9');
-	svc = TEST_START + c - '0';
-	if (svc == myservice) {
-		printf("Currently cannot connect to myself, update test\n");
-		return;
-	}
-	printf("Connecting to %d..", svc);
-	phid = ipc_connect_me_to(PHONE_NS, svc, 0);
-	if (phid > 0) {
-		printf("phoneid: %d\n", phid);
-		phones[phid] = 1;
-	} else
-		printf("error: %d\n", phid);
-}
-
-int main(void)
-{
-	ipcarg_t phonead;
-	int i;
-	char c;
-	int res;
-	volatile long long var;
-	volatile int var1;
-	
-	printf("********************************\n");
-	printf("***********IPC Tester***********\n");
-	printf("********************************\n");
-	
-	async_set_client_connection(client_connection);
-
-	for (i = TEST_START; i < TEST_START + 10; i++) {
-		res = ipc_connect_to_me(PHONE_NS, i, 0, &phonead);
-		if (!res)
-			break;
-		printf("Failed registering as %d..:%d\n", i, res);
-	}
-	printf("Registered as service: %d\n", i);
-	myservice = i;
-
-	printhelp();
-	while (1) {
-		c = getchar();
-		switch (c) {
-		case '?':
-			printhelp();
-			break;
-		case 'h':
-			do_hangup();
-			break;
-		case 'c':
-			do_connect();
-			break;
-		case 'a':
-			do_send_msg(1);
-			break;
-		case 's':
-			do_send_msg(0);
-			break;
-		case 'd':
-			do_answer_msg();
-			break;
-		case 'j':
-			printf("Entering infinite loop\n");
-			while (1)
-				;
-			break;
-		case 'p':
-			printf("Doing page fault\n");
-			*((char *)0) = 1;
-			printf("done\n");
-			break;
-		case 'u':
-			var1=*( (int *) ( ( (char *)(&var) ) + 1 ) );
-			break;
-		}
-	}
-}
-
-/** @}
- */
-
Index: uspace/tester/Makefile
===================================================================
--- uspace/tester/Makefile	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
+++ uspace/tester/Makefile	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -0,0 +1,73 @@
+#
+# Copyright (c) 2005 Martin Decky
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# - Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# - Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in the
+#   documentation and/or other materials provided with the distribution.
+# - The name of the author may not be used to endorse or promote products
+#   derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+## Setup toolchain
+#
+
+LIBC_PREFIX = ../libc
+SOFTINT_PREFIX = ../softint
+include $(LIBC_PREFIX)/Makefile.toolchain
+
+CFLAGS += -I../kbd/include
+
+LIBS = $(LIBC_PREFIX)/libc.a
+
+## Sources
+#
+
+OUTPUT = tester
+SOURCES = tester.c
+
+OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
+
+.PHONY: all clean depend disasm
+
+all: $(OUTPUT) disasm
+
+-include Makefile.depend
+
+clean:
+	-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend
+
+depend:
+	$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend
+
+$(OUTPUT): $(OBJECTS) $(LIBS)
+	$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
+
+disasm:
+	$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm
+
+%.o: %.S
+	$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@
+
+%.o: %.s
+	$(AS) $(AFLAGS) $< -o $@
+
+%.o: %.c
+	$(CC) $(DEFS) $(CFLAGS) -c $< -o $@
Index: uspace/tester/ipcc.c
===================================================================
--- uspace/tester/ipcc.c	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
+++ uspace/tester/ipcc.c	(revision c0cf6405e0a0c8d34d41c069d2074339e469286f)
@@ -0,0 +1,280 @@
+/*
+ * Copyright (c) 2006 Ondrej Palkovsky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup ippc IPC Tester
+ * @brief	IPC tester and task faulter.
+ * @{
+ */ 
+/**
+ * @file
+ */
+
+#include <stdio.h>
+#include <async.h>
+#include <ipc/ipc.h>
+#include <ipc/services.h>
+#include <errno.h>
+
+#define TEST_START       10000
+#define MAXLIST          4
+
+#define MSG_HANG_ME_UP   2000
+
+static int connections[50];
+static ipc_callid_t callids[50];
+static int phones[20];
+static int myservice = 0;
+
+static void client_connection(ipc_callid_t iid, ipc_call_t *icall)
+{
+	ipc_callid_t callid;
+	ipc_call_t call;
+	ipcarg_t phonehash = icall->in_phone_hash;
+	int retval;
+	int i;
+
+	printf("Connected phone: %P, accepting\n", icall->in_phone_hash);
+	ipc_answer_fast(iid, 0, 0, 0);
+	for (i=0;i < 1024;i++)
+		if (!connections[i]) {
+			connections[i] = phonehash;
+			break;
+		}
+	
+	while (1) {
+		callid = async_get_call(&call);
+		switch (IPC_GET_METHOD(call)) {
+		case IPC_M_PHONE_HUNGUP:
+			printf("Phone (%P) hung up.\n", phonehash);
+			retval = 0;
+			break;
+		default:
+			printf("Received message from %P: %X\n", phonehash,callid);
+			for (i = 0; i < 1024; i++)
+				if (!callids[i]) {
+					callids[i] = callid;
+					break;
+				}
+			continue;
+		}
+		ipc_answer_fast(callid, retval, 0, 0);
+	}
+}
+
+static void printhelp(void)
+{
+	printf("? - help\n");
+	printf("c - connect to other service\n");
+	printf("h - hangup connection\n");
+	printf("a - send async message to other service\n");
+	printf("s - send sync message to other service\n");
+	printf("d - answer message that we have received\n");
+	printf("j - jump to endless loop\n");
+	printf("p - page fault\n");
+	printf("u - unaligned read\n");
+}
+
+static void callback(void *private, int retval, ipc_call_t *data)
+{
+	printf("Received response to msg %d - retval: %d.\n", private,
+	       retval);
+}
+
+static void do_answer_msg(void)
+{
+	int i,cnt, errn = 0;
+	char c;
+
+	cnt = 0;
+	for (i = 0;i < 50; i++) {
+		if (callids[i]) {
+			printf("%d: %P\n", cnt, callids[i]);
+			cnt++;
+		}
+		if (cnt >= 10)
+			break;
+	}
+	if (!cnt)
+		return;
+	printf("Choose message:\n");
+	do {
+		c = getchar();
+	} while (c < '0' || (c-'0') >= cnt);
+	cnt = c - '0' + 1;
+	
+	for (i = 0; cnt; i++)
+		if (callids[i])
+			cnt--;
+	i -= 1;
+
+	printf("Normal (n) or hangup (h) or error(e) message?\n");
+	do {
+		c = getchar();
+	} while (c != 'n' && c != 'h' && c != 'e');
+	if (c == 'n')
+		errn = 0;
+	else if (c == 'h')
+		errn = EHANGUP;
+	else if (c == 'e')
+		errn = ENOENT;
+	printf("Answering %P\n", callids[i]);
+	ipc_answer_fast(callids[i], errn, 0, 0);
+	callids[i] = 0;
+}
+
+static void do_send_msg(int async)
+{
+	int phoneid;
+	int res;
+	static int msgid = 1;
+	char c;
+
+	printf("Select phoneid to send msg: 2-9\n");
+	do {
+		c = getchar();
+	} while (c < '2' || c > '9');
+	phoneid = c - '0';
+
+	if (async) {
+		ipc_call_async(phoneid, 2000, 0, (void *)msgid, callback, 1);
+		printf("Async sent - msg %d\n", msgid);
+		msgid++;
+	} else {
+		printf("Sending msg...");
+		res = ipc_call_sync_2(phoneid, 2000, 0, 0, NULL, NULL);
+		printf("done: %d\n", res);
+	}
+}
+
+static void do_hangup(void)
+{
+	char c;
+	int res;
+	int phoneid;
+
+	printf("Select phoneid to hangup: 2-9\n");
+	do {
+		c = getchar();
+	} while (c < '2' || c > '9');
+	phoneid = c - '0';
+	
+	printf("Hanging up...");
+	res = ipc_hangup(phoneid);
+	printf("done: %d\n", phoneid);
+}
+
+static void do_connect(void)
+{
+	char c;
+	int svc;
+	int phid;
+
+	printf("Choose one service: 0:10000....9:10009\n");
+	do {
+		c = getchar();
+	} while (c < '0' || c > '9');
+	svc = TEST_START + c - '0';
+	if (svc == myservice) {
+		printf("Currently cannot connect to myself, update test\n");
+		return;
+	}
+	printf("Connecting to %d..", svc);
+	phid = ipc_connect_me_to(PHONE_NS, svc, 0);
+	if (phid > 0) {
+		printf("phoneid: %d\n", phid);
+		phones[phid] = 1;
+	} else
+		printf("error: %d\n", phid);
+}
+
+int main(void)
+{
+	ipcarg_t phonead;
+	int i;
+	char c;
+	int res;
+	volatile long long var;
+	volatile int var1;
+	
+	printf("********************************\n");
+	printf("***********IPC Tester***********\n");
+	printf("********************************\n");
+	
+	async_set_client_connection(client_connection);
+
+	for (i = TEST_START; i < TEST_START + 10; i++) {
+		res = ipc_connect_to_me(PHONE_NS, i, 0, &phonead);
+		if (!res)
+			break;
+		printf("Failed registering as %d..:%d\n", i, res);
+	}
+	printf("Registered as service: %d\n", i);
+	myservice = i;
+
+	printhelp();
+	while (1) {
+		c = getchar();
+		switch (c) {
+		case '?':
+			printhelp();
+			break;
+		case 'h':
+			do_hangup();
+			break;
+		case 'c':
+			do_connect();
+			break;
+		case 'a':
+			do_send_msg(1);
+			break;
+		case 's':
+			do_send_msg(0);
+			break;
+		case 'd':
+			do_answer_msg();
+			break;
+		case 'j':
+			printf("Entering infinite loop\n");
+			while (1)
+				;
+			break;
+		case 'p':
+			printf("Doing page fault\n");
+			*((char *)0) = 1;
+			printf("done\n");
+			break;
+		case 'u':
+			var1=*( (int *) ( ( (char *)(&var) ) + 1 ) );
+			break;
+		}
+	}
+}
+
+/** @}
+ */
+
