Index: contrib/toolchain/toolchain.ia32.sh
===================================================================
--- contrib/toolchain/toolchain.ia32.sh	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ contrib/toolchain/toolchain.ia32.sh	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -92,5 +92,5 @@
 "${GCCDIR}/configure" "--host=${HOST}" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared
 check_error $? "Error configuring GCC."
-PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc
+PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc all-target-libobjc install-target-libobjc
 check_error $? "Error compiling/installing GCC."
 
Index: contrib/toolchain/toolchain.sparc64.sh
===================================================================
--- contrib/toolchain/toolchain.sparc64.sh	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ contrib/toolchain/toolchain.sparc64.sh	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -92,5 +92,5 @@
 "${GCCDIR}/configure" "--host=${HOST}" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared
 check_error $? "Error configuring GCC."
-PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc
+PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc all-target-libobjc install-target-libobjc
 check_error $? "Error compiling/installing GCC."
 
Index: kernel/Makefile
===================================================================
--- kernel/Makefile	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/Makefile	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -129,10 +129,12 @@
 	OBJCOPY = objcopy
 	OBJDUMP = objdump
+	LIBDIR = /usr/lib
 else
-	CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc
-	AS = $(TOOLCHAIN_DIR)/$(TARGET)-as
-	LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld
-	OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy
-	OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump
+	CC = $(TOOLCHAIN_DIR)/bin/$(TARGET)-gcc
+	AS = $(TOOLCHAIN_DIR)/bin/$(TARGET)-as
+	LD = $(TOOLCHAIN_DIR)/bin/$(TARGET)-ld
+	OBJCOPY = $(TOOLCHAIN_DIR)/bin/$(TARGET)-objcopy
+	OBJDUMP = $(TOOLCHAIN_DIR)/bin/$(TARGET)-objdump
+	LIBDIR = $(TOOLCHAIN_DIR)/lib
 endif
 
@@ -240,4 +242,13 @@
 endif
 
+## Experimental features
+#
+
+ifeq ($(CONFIG_EXPERIMENTAL),y)
+	GENERIC_SOURCES += generic/src/lib/objc.c
+	EXTRA_OBJECTS = $(LIBDIR)/libobjc.a
+	EXTRA_FLAGS += -x objective-c
+endif
+
 GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES)))
 ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES)))
@@ -280,5 +291,5 @@
 generic/src/debug/real_map.bin: depend arch/$(ARCH)/_link.ld $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS)
 	$(OBJCOPY) -I binary -O $(BFD_NAME) -B $(BFD_ARCH) --prefix-sections=symtab Makefile generic/src/debug/empty_map.o
-	$(LD) -T arch/$(ARCH)/_link.ld $(LFLAGS) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) generic/src/debug/empty_map.o -o $@ -Map kernel.map.pre
+	$(LD) -T arch/$(ARCH)/_link.ld $(LFLAGS) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) generic/src/debug/empty_map.o  -o $@ -Map kernel.map.pre
 	$(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > kernel.objdump
 	tools/genmap.py kernel.map.pre kernel.objdump generic/src/debug/real_map.bin 
@@ -286,5 +297,5 @@
 	# on architectures, that have bss after symtab
 	$(OBJCOPY) -I binary -O $(BFD_NAME) -B $(BFD_ARCH) --prefix-sections=symtab generic/src/debug/real_map.bin generic/src/debug/sizeok_map.o
-	$(LD) -T arch/$(ARCH)/_link.ld $(LFLAGS) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) generic/src/debug/sizeok_map.o -o $@ -Map kernel.map.pre
+	$(LD) -T arch/$(ARCH)/_link.ld $(LFLAGS) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) generic/src/debug/sizeok_map.o -o $@ -Map kernel.map.pre
 	$(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > kernel.objdump
 	tools/genmap.py kernel.map.pre kernel.objdump generic/src/debug/real_map.bin 
@@ -294,5 +305,5 @@
 
 kernel.raw: depend arch/$(ARCH)/_link.ld $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) generic/src/debug/real_map.o
-	$(LD) -T arch/$(ARCH)/_link.ld $(LFLAGS) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) generic/src/debug/real_map.o -o $@ -Map kernel.map
+	$(LD) -T arch/$(ARCH)/_link.ld $(LFLAGS) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) generic/src/debug/real_map.o -o $@ -Map kernel.map
 
 kernel.bin: kernel.raw
@@ -309,3 +320,3 @@
 
 %.o: %.c
-	$(CC) $(DEFS) $(CFLAGS) -c $< -o $@
+	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) -c $< -o $@
Index: kernel/arch/amd64/Makefile.inc
===================================================================
--- kernel/arch/amd64/Makefile.inc	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/arch/amd64/Makefile.inc	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -34,5 +34,5 @@
 BFD = binary
 TARGET = amd64-linux-gnu
-TOOLCHAIN_DIR = /usr/local/amd64/bin
+TOOLCHAIN_DIR = /usr/local/amd64
 
 CFLAGS += -fno-unwind-tables -m64 -mcmodel=kernel -mno-red-zone
Index: kernel/arch/ia32/Makefile.inc
===================================================================
--- kernel/arch/ia32/Makefile.inc	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/arch/ia32/Makefile.inc	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -34,5 +34,5 @@
 BFD = binary
 TARGET = i686-pc-linux-gnu
-TOOLCHAIN_DIR = /usr/local/i686/bin
+TOOLCHAIN_DIR = /usr/local/i686
 
 DEFS += -DMACHINE=$(MACHINE) -D__32_BITS__
Index: kernel/arch/ia32/src/mm/as.c
===================================================================
--- kernel/arch/ia32/src/mm/as.c	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/arch/ia32/src/mm/as.c	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -40,5 +40,7 @@
 void as_arch_init(void)
 {
+#ifndef __OBJC__
 	as_operations = &as_pt_operations;
+#endif
 }
 
Index: kernel/arch/ia32xen/Makefile.inc
===================================================================
--- kernel/arch/ia32xen/Makefile.inc	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/arch/ia32xen/Makefile.inc	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -34,5 +34,5 @@
 BFD = elf32-i386
 TARGET = i686-pc-linux-gnu
-TOOLCHAIN_DIR = /usr/local/i686/bin
+TOOLCHAIN_DIR = /usr/local/i686
 
 DEFS += -DMACHINE=$(MACHINE) -D__32_BITS__
Index: kernel/arch/ia64/Makefile.inc
===================================================================
--- kernel/arch/ia64/Makefile.inc	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/arch/ia64/Makefile.inc	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -34,5 +34,5 @@
 BFD = elf64-ia64-little
 TARGET = ia64-pc-linux-gnu
-TOOLCHAIN_DIR = /usr/local/ia64/bin
+TOOLCHAIN_DIR = /usr/local/ia64
 
 INIT0_ADDRESS = 0xe000000000400000
Index: kernel/arch/mips32/Makefile.inc
===================================================================
--- kernel/arch/mips32/Makefile.inc	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/arch/mips32/Makefile.inc	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -32,5 +32,5 @@
 BFD_ARCH = mips
 TARGET = mipsel-linux-gnu
-TOOLCHAIN_DIR = /usr/local/mipsel/bin
+TOOLCHAIN_DIR = /usr/local/mipsel
 
 KERNEL_LOAD_ADDRESS = 0x80100000
Index: kernel/arch/ppc32/Makefile.inc
===================================================================
--- kernel/arch/ppc32/Makefile.inc	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/arch/ppc32/Makefile.inc	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -34,5 +34,5 @@
 BFD = binary
 TARGET = ppc-linux-gnu
-TOOLCHAIN_DIR = /usr/local/ppc/bin
+TOOLCHAIN_DIR = /usr/local/ppc
 
 CFLAGS += -mcpu=powerpc -msoft-float -m32
Index: kernel/arch/ppc64/Makefile.inc
===================================================================
--- kernel/arch/ppc64/Makefile.inc	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/arch/ppc64/Makefile.inc	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -34,5 +34,5 @@
 BFD = binary
 TARGET = ppc64-linux-gnu
-TOOLCHAIN_DIR = /usr/local/ppc64/bin
+TOOLCHAIN_DIR = /usr/local/ppc64
 
 CFLAGS += -mcpu=powerpc64 -msoft-float -m64
Index: kernel/arch/sparc64/Makefile.inc
===================================================================
--- kernel/arch/sparc64/Makefile.inc	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/arch/sparc64/Makefile.inc	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -34,5 +34,5 @@
 BFD = binary
 TARGET = sparc64-linux-gnu
-TOOLCHAIN_DIR = /usr/local/sparc64/bin
+TOOLCHAIN_DIR = /usr/local/sparc64
 
 CFLAGS += -mcpu=ultrasparc -m64
Index: kernel/genarch/include/mm/page_pt.h
===================================================================
--- kernel/genarch/include/mm/page_pt.h	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/genarch/include/mm/page_pt.h	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -108,5 +108,7 @@
 #define PTE_EXECUTABLE(p)	PTE_EXECUTABLE_ARCH((p))
 
+#ifndef __OBJC__
 extern as_operations_t as_pt_operations;
+#endif
 extern page_mapping_operations_t pt_mapping_operations;
 
Index: kernel/genarch/src/mm/as_pt.c
===================================================================
--- kernel/genarch/src/mm/as_pt.c	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/genarch/src/mm/as_pt.c	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -53,4 +53,29 @@
 static void pt_unlock(as_t *as, bool unlock);
 
+#ifdef __OBJC__
+@implementation as_t
+
++ (pte_t *) page_table_create: (int) flags
+{
+	return ptl0_create(flags);
+}
+
++ (void) page_table_destroy: (pte_t *) page_table
+{
+	ptl0_destroy(page_table);
+}
+
+- (void) page_table_lock: (bool) _lock
+{
+	pt_lock(self, _lock);
+}
+
+- (void) page_table_unlock: (bool) unlock
+{
+	pt_unlock(self, unlock);
+}
+
+@end
+#else
 as_operations_t as_pt_operations = {
 	.page_table_create = ptl0_create,
@@ -59,4 +84,5 @@
 	.page_table_unlock = pt_unlock
 };
+#endif
 
 /** Create PTL0.
Index: kernel/generic/include/lib/objc.h
===================================================================
--- kernel/generic/include/lib/objc.h	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
+++ kernel/generic/include/lib/objc.h	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2006 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.
+ */
+
+/** @addtogroup generic	
+ * @{
+ */
+/** @file
+ */
+
+#ifndef KERN_OBJC_H_
+#define KERN_OBJC_H_
+
+#include <arch/types.h>
+#include <arch/arg.h>
+
+extern void *stderr;
+
+extern void __assert_fail(const char *assertion, const char *file, unsigned int line, const char *function);
+extern void abort(void);
+
+extern void *fopen(const char *path, const char *mode);
+extern size_t fread(void *ptr, size_t size, size_t nmemb, void *stream);
+extern size_t fwrite(const void *ptr, size_t size, size_t nmemb, void *stream);
+extern int fflush(void *stream);
+extern int feof(void *stream);
+extern int fclose(void *stream);
+
+extern int vfprintf(void *stream, const char *format, va_list ap);
+extern int sscanf(const char *str, const char *format, ...);
+extern const unsigned short **__ctype_b_loc(void);
+extern long int __strtol_internal(const char *__nptr, char **__endptr, int __base, int __group);
+
+extern void *memset(void *s, int c, size_t n);
+extern void *calloc(size_t nmemb, size_t size);
+
+#endif
+
+/** @}
+ */
Index: kernel/generic/include/memstr.h
===================================================================
--- kernel/generic/include/memstr.h	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/generic/include/memstr.h	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -45,4 +45,5 @@
 extern void _memsetb(uintptr_t dst, size_t cnt, uint8_t x);
 extern void _memsetw(uintptr_t dst, size_t cnt, uint16_t x);
+extern char *strcpy(char *dest, const char *src);
 
 #endif
Index: kernel/generic/include/mm/as.h
===================================================================
--- kernel/generic/include/mm/as.h	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/generic/include/mm/as.h	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -80,4 +80,41 @@
 /** The page fault was caused by memcpy_from_uspace() or memcpy_to_uspace(). */
 #define AS_PF_DEFER		2
+
+#ifdef __OBJC__
+@interface as_t {
+	@public
+		/** Protected by asidlock. */
+		link_t inactive_as_with_asid_link;
+		
+		mutex_t lock;
+		
+		/** Number of references (i.e tasks that reference this as). */
+		count_t refcount;
+		
+		/** Number of processors on wich is this address space active. */
+		count_t cpu_refcount;
+		
+		/** B+tree of address space areas. */
+		btree_t as_area_btree;
+		
+		/**
+		 *  Address space identifier.
+		 *  Constant on architectures that do not support ASIDs.
+		 */
+		asid_t asid;
+		
+		/** Non-generic content. */
+		as_genarch_t genarch;
+		
+		/** Architecture specific content. */
+		as_arch_t arch;
+}
++ (pte_t *) page_table_create: (int) flags;
++ (void) page_table_destroy: (pte_t *) page_table;
+- (void) page_table_lock: (bool) _lock;
+- (void) page_table_unlock: (bool) unlock;
+@end
+
+#else
 
 /** Address space structure.
@@ -122,4 +159,5 @@
 	void (* page_table_unlock)(as_t *as, bool unlock);
 } as_operations_t;
+#endif
 
 /**
@@ -202,5 +240,8 @@
 
 extern as_t *AS_KERNEL;
+
+#ifndef __OBJC__
 extern as_operations_t *as_operations;
+#endif
 
 SPINLOCK_EXTERN(inactive_as_with_asid_lock);
Index: kernel/generic/include/print.h
===================================================================
--- kernel/generic/include/print.h	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/generic/include/print.h	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -45,4 +45,5 @@
 #define EOF (-1)
 
+extern int puts(const char *s);
 extern int printf(const char *fmt, ...);
 extern int sprintf(char *str, const char *fmt, ...);
Index: kernel/generic/src/lib/memstr.c
===================================================================
--- kernel/generic/src/lib/memstr.c	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/generic/src/lib/memstr.c	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -75,5 +75,5 @@
 	}
 		
-	return (char *)src;
+	return (char *) src;
 }
 
@@ -93,5 +93,5 @@
 	uint8_t *p = (uint8_t *) dst;
 	
-	for(i=0; i<cnt; i++)
+	for (i = 0; i < cnt; i++)
 		p[i] = x;
 }
@@ -112,6 +112,25 @@
 	uint16_t *p = (uint16_t *) dst;
 	
-	for(i=0; i<cnt; i++)
+	for (i = 0; i < cnt; i++)
 		p[i] = x;	
+}
+
+/** Copy string
+ *
+ * Copy string from src address to dst address.
+ * The copying is done char-by-char until the null
+ * character. The source and destination memory areas
+ * cannot overlap.
+ *
+ * @param src Origin string to copy from.
+ * @param dst Origin string to copy to.
+ *
+ */
+char *strcpy(char *dest, const char *src)
+{
+	char *orig = dest;
+	
+	while ((*(dest++) = *(src++)));
+	return orig;
 }
 
Index: kernel/generic/src/lib/objc.c
===================================================================
--- kernel/generic/src/lib/objc.c	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
+++ kernel/generic/src/lib/objc.c	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2007 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.
+ */
+
+/** @addtogroup generic	
+ * @{
+ */
+
+/**
+ * @file
+ * @brief	Objective C bindings.
+ *
+ * This file provides architecture independent binding
+ * functions which are needed to link with libobjc run-time
+ * library. Many of the functions are just dummy.
+ */
+
+#include <lib/objc.h>
+#include <panic.h>
+#include <arch/memstr.h>
+#include <mm/slab.h>
+
+void *stderr;
+
+static unsigned short __ctype_b[384] = {
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    2,     2,     2,     2,     2,     2,     2,     2, 
+	    2,  8195,  8194,  8194,  8194,  8194,     2,     2, 
+	    2,     2,     2,     2,     2,     2,     2,     2, 
+	    2,     2,     2,     2,     2,     2,     2,     2, 
+	24577, 49156, 49156, 49156, 49156, 49156, 49156, 49156, 
+	49156, 49156, 49156, 49156, 49156, 49156, 49156, 49156, 
+	55304, 55304, 55304, 55304, 55304, 55304, 55304, 55304, 
+	55304, 55304, 49156, 49156, 49156, 49156, 49156, 49156, 
+	49156, 54536, 54536, 54536, 54536, 54536, 54536, 50440, 
+	50440, 50440, 50440, 50440, 50440, 50440, 50440, 50440, 
+	50440, 50440, 50440, 50440, 50440, 50440, 50440, 50440, 
+	50440, 50440, 50440, 49156, 49156, 49156, 49156, 49156, 
+	49156, 54792, 54792, 54792, 54792, 54792, 54792, 50696, 
+	50696, 50696, 50696, 50696, 50696, 50696, 50696, 50696, 
+	50696, 50696, 50696, 50696, 50696, 50696, 50696, 50696, 
+	50696, 50696, 50696, 49156, 49156, 49156, 49156,     2, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0, 
+	    0,     0,     0,     0,     0,     0,     0,     0
+};
+
+static const unsigned short *__ctype_b_ptr = __ctype_b + 128;
+
+void __assert_fail(const char *assertion, const char *file, unsigned int line, const char *function)
+{
+	panic("Run-time assertion (%s:%d:%s) failed (%s)", file, line, function ? function : "", assertion);
+}
+
+void abort(void)
+{
+	panic("Run-time scheduled abort");
+}
+
+void *fopen(const char *path, const char *mode)
+{
+	return NULL;
+}
+
+size_t fread(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+	return 0;
+}
+
+size_t fwrite(const void *ptr, size_t size, size_t nmemb, void *stream)
+{
+	return 0;
+}
+
+int fflush(void *stream)
+{
+	return 0;
+}
+
+int feof(void *stream)
+{
+	return 1;
+}
+
+int fclose(void *stream)
+{
+	return 0;
+}
+
+int vfprintf(void *stream, const char *format, va_list ap)
+{
+	return 0;
+}
+
+int sscanf(const char *str, const char *format, ...)
+{
+	return 0;
+}
+
+const unsigned short **__ctype_b_loc(void)
+{
+	return &__ctype_b_ptr;
+}
+
+long int __strtol_internal(const char *__nptr, char **__endptr, int __base, int __group)
+{
+	return 0;
+}
+
+void *memset(void *s, int c, size_t n)
+{
+	memsetb((uintptr_t) s, n, c);
+	return s;
+}
+
+void *calloc(size_t nmemb, size_t size)
+{
+	return malloc(nmemb * size, 0);
+}
+
+/** @}
+ */
Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/generic/src/mm/as.c	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -82,4 +82,5 @@
 #endif /* CONFIG_VIRT_IDX_DCACHE */
 
+#ifndef __OBJC__
 /**
  * Each architecture decides what functions will be used to carry out
@@ -87,4 +88,5 @@
  */
 as_operations_t *as_operations = NULL;
+#endif
 
 /**
@@ -993,8 +995,12 @@
 pte_t *page_table_create(int flags)
 {
-        ASSERT(as_operations);
-        ASSERT(as_operations->page_table_create);
-
-        return as_operations->page_table_create(flags);
+#ifdef __OBJC__
+	return [as_t page_table_create: flags];
+#else
+	ASSERT(as_operations);
+	ASSERT(as_operations->page_table_create);
+	
+	return as_operations->page_table_create(flags);
+#endif
 }
 
@@ -1007,8 +1013,12 @@
 void page_table_destroy(pte_t *page_table)
 {
-        ASSERT(as_operations);
-        ASSERT(as_operations->page_table_destroy);
-
-        as_operations->page_table_destroy(page_table);
+#ifdef __OBJC__
+	return [as_t page_table_destroy: page_table];
+#else
+	ASSERT(as_operations);
+	ASSERT(as_operations->page_table_destroy);
+	
+	as_operations->page_table_destroy(page_table);
+#endif
 }
 
@@ -1027,8 +1037,12 @@
 void page_table_lock(as_t *as, bool lock)
 {
+#ifdef __OBJC__
+	[as page_table_lock: lock];
+#else
 	ASSERT(as_operations);
 	ASSERT(as_operations->page_table_lock);
-
+	
 	as_operations->page_table_lock(as, lock);
+#endif
 }
 
@@ -1040,8 +1054,12 @@
 void page_table_unlock(as_t *as, bool unlock)
 {
+#ifdef __OBJC__
+	[as page_table_unlock: unlock];
+#else
 	ASSERT(as_operations);
 	ASSERT(as_operations->page_table_unlock);
-
+	
 	as_operations->page_table_unlock(as, unlock);
+#endif
 }
 
Index: kernel/generic/src/printf/vprintf.c
===================================================================
--- kernel/generic/src/printf/vprintf.c	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/generic/src/printf/vprintf.c	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -37,11 +37,17 @@
 #include <putchar.h>
 
-int vprintf_write(const char *str, size_t count, void *unused);
+static int vprintf_write(const char *str, size_t count, void *unused)
+{
+	size_t i;
+	for (i = 0; i < count; i++)
+		putchar(str[i]);
+	return i;
+}
 
-int vprintf_write(const char *str, size_t count, void *unused)
+int puts(const char *s)
 {
-	size_t i = 0;
-	for (; i < count; i++)
-		putchar(str[i]);
+	size_t i;
+	for (i = 0; s[i] != 0; i++)
+		putchar(s[i]);
 	return i;
 }
@@ -49,5 +55,5 @@
 int vprintf(const char *fmt, va_list ap)
 {
-	struct printf_spec ps = {(int(*)(void *, size_t, void *))vprintf_write, NULL};
+	struct printf_spec ps = {(int(*)(void *, size_t, void *)) vprintf_write, NULL};
 	return printf_core(fmt, &ps, ap);
 
Index: kernel/kernel.config
===================================================================
--- kernel/kernel.config	(revision ce8aed1db35819d4448de2ba811ebb69412a68b8)
+++ kernel/kernel.config	(revision bd1deed7b64271415d7ecf3951bd917d8093536f)
@@ -41,5 +41,4 @@
 @ "i460GX" i460GX chipset machine
 ! [ARCH=ia64] MACHINE (choice)
-
 
 # Framebuffer support
@@ -127,2 +126,8 @@
 # Compile kernel tests
 ! CONFIG_TEST (y/n)
+
+
+## Experimental features
+
+# Enable experimental features
+! CONFIG_EXPERIMENTAL (n/y)
