diff --git a/libc/bionic/libc_init_common.c b/libc/bionic/libc_init_common.c
index 523afcf..de4919d 100644
--- a/libc/bionic/libc_init_common.c
+++ b/libc/bionic/libc_init_common.c
@@ -39,11 +39,8 @@
 #include <bionic_tls.h>
 #include <errno.h>
 
-/* This contains the common C library initialization code.
- * To understand what happens here, you should read the
- * "Initialization and Finalization" section of the file
- * named bionic/linker/README.TXT
- */
+extern void _init(void);
+extern void _fini(void);
 
 static void call_array(void(**list)())
 {
@@ -53,6 +50,15 @@
     }
 }
 
+static void __bionic_do_global_dtors(structors_array_t const * const p)
+{
+    call_array(p->fini_array);
+    //_fini();
+}
+
+extern unsigned __get_sp(void);
+extern pid_t    gettid(void);
+
 char*  __progname;
 char **environ;
 
@@ -63,28 +69,30 @@
 
 int __system_properties_init(void);
 
-/* This function can be run under two different contexts:
- *
- * - for statically linked executables (i.e. those who do
- *   not depend on shared libraries at all), it will be
- *   called from the __libc_init() function defined in
- *   bionic/libc_init_static.c
- *
- * - for dynamic executables, it will be called from the
- *   __libc_init() function defined in bionic/libc_init_dynamic.c
- *
- */
 void __libc_init_common(uintptr_t *elfdata,
                        void (*onexit)(void),
                        int (*slingshot)(int, char**, char**),
                        structors_array_t const * const structors,
                        void (*pre_ctor_hook)())
 {
+    pthread_internal_t thread;
+    pthread_attr_t thread_attr;
+    void *tls_area[BIONIC_TLS_SLOTS];
     int argc;
     char **argv, **envp, **envend;
     struct auxentry *auxentry;
     unsigned int page_size = 0, page_shift = 0;
 
+    /* The main thread's stack has empirically shown to be 84k */
+    unsigned stacktop = (__get_sp() & ~(PAGE_SIZE - 1)) + PAGE_SIZE;
+    unsigned stacksize = 128 * 1024; //84 * 1024;
+    unsigned stackbottom = stacktop - stacksize;
+
+    pthread_attr_init(&thread_attr);
+    pthread_attr_setstack(&thread_attr, (void*)stackbottom, stacksize);
+    _init_thread(&thread, gettid(), &thread_attr, (void*)stackbottom);
+    __init_tls(tls_area, &thread);
+
     argc = (int) *elfdata++;
     argv = (char**) elfdata;
     envp = argv+(argc+1);
@@ -98,17 +106,17 @@
 
     if (pre_ctor_hook) pre_ctor_hook();
 
-    if (structors != NULL) {
-        // pre-init array.
-        call_array(structors->preinit_array);
+    // XXX: we should execute the .fini_array upon exit
 
-        // for compatibility with non-eabi binary, call the .ctors section
-        // this is only useful for static non-ARM (e.g. x86) executables.
-        call_array(structors->ctors_array);
+    // pre-init array.
+    // XXX: I'm not sure what's the different with the init array.
+    call_array(structors->preinit_array);
 
-        // call static constructors
-        call_array(structors->init_array);
-    }
+    // for compatibility with non-eabi binary, call the .ctors section
+    call_array(structors->ctors_array);
+
+    // call static constructors
+    call_array(structors->init_array);
 
     exit(slingshot(argc, argv, envp));
 }
diff --git a/libc/bionic/libc_init_dynamic.c b/libc/bionic/libc_init_dynamic.c
index e1ff13d..8cf24b4 100644
--- a/libc/bionic/libc_init_dynamic.c
+++ b/libc/bionic/libc_init_dynamic.c
@@ -25,29 +25,18 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-
 /*
  * libc_init_static.c
  *
- * This function is called for dynamic executables after the dynamic
- * linker has loaded and initialized all dependent shared libraries.
- *
- * It takes the raw data block set up by the ELF loader
- * in the kernel and parses it.
+ * This function takes the raw data block set up by the ELF loader
+ * in the kernel and parses it.  It is invoked by crt0.S which makes
+ * any necessary adjustments and passes calls this function using
+ * the standard C calling convention.
  *
  * The arguments are:
- *      elfdata   -- The ELF loader data block; usually from the stack.
- *                   Basically a pointer to argc.
- *
- *      onexit    -- Function to call on exit, can be NULL.
- *
- *      slingshot -- Address of the program's main function
- *
- *      structors -- Table of constructor functions arrays that must
- *                   be called before the slingshot.
- *
- * It is called from the assembly fragment found in
- * arch-$ARCH/bionic/crtbegin_dynamic.S
+ *  uintptr_t *elfdata	 -- The ELF loader data block; usually from the stack.
+ *                          Basically a pointer to argc.
+ *  void (*onexit)(void) -- Function to install into onexit
  */
 
 /*
@@ -73,18 +62,5 @@
                        int (*slingshot)(int, char**, char**),
                        structors_array_t const * const structors)
 {
-    /* NOTE: At this point, the dynamic linker has *already* called
-     *       all initializers properly, so we ignore 'structors' to
-     *       avoid calling them twice.
-     */
-
-    /* NOTE2: Is it worthwhile to use malloc_debug_init() in the case of
-     *        of the non-debug shared C library ?
-     *
-     *        The implementation in bionic/malloc_leak.c contains a lot
-     *        of code which will turn to be unused, and we add a dispatch
-     *        overhead to malloc() et al. that proved to be significant
-     *        in the past (e.g. making boot sequence 5% slower)
-     */
-    __libc_init_common(elfdata, onexit, slingshot, NULL, malloc_debug_init);
+    __libc_init_common(elfdata, onexit, slingshot, structors, malloc_debug_init);
 }
diff --git a/libc/bionic/libc_init_static.c b/libc/bionic/libc_init_static.c
index d7af640..ec463f7 100644
--- a/libc/bionic/libc_init_static.c
+++ b/libc/bionic/libc_init_static.c
@@ -25,30 +25,18 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-
 /*
  * libc_init_static.c
  *
- * This function is called for static executables, i.e. those that
- * dont depend on shared libraries and are directly started by the
- * Linux kernel.
- *
- * It takes the raw data block set up by the ELF loader
- * in the kernel and parses it.
+ * This function takes the raw data block set up by the ELF loader
+ * in the kernel and parses it.  It is invoked by crt0.S which makes
+ * any necessary adjustments and passes calls this function using
+ * the standard C calling convention.
  *
  * The arguments are:
- *      elfdata   -- The ELF loader data block; usually from the stack.
- *                   Basically a pointer to argc.
- *
- *      onexit    -- Function to call on exit, can be NULL.
- *
- *      slingshot -- Address of the program's main function
- *
- *      structors -- Table of constructor functions arrays that must
- *                   be called before the slingshot.
- *
- * It is called from the assembly fragment found in
- * arch-$ARCH/bionic/crtbegin_static.S
+ *  uintptr_t *elfdata	 -- The ELF loader data block; usually from the stack.
+ *                          Basically a pointer to argc.
+ *  void (*onexit)(void) -- Function to install into onexit
  */
 
 /*
@@ -63,19 +51,18 @@
 #include <stdlib.h>
 #include <stdint.h>
 #include <elf.h>
-#include "bionic_preinit.h"
+#include "pthread_internal.h"
+#include "atexit.h"
 #include "libc_init_common.h"
 
+#include <bionic_tls.h>
+#include <errno.h>
+
 __noreturn void __libc_init(uintptr_t *elfdata,
                        void (*onexit)(void),
                        int (*slingshot)(int, char**, char**),
                        structors_array_t const * const structors)
 {
-    pthread_internal_t thread;
-    void *tls_area[BIONIC_TLS_SLOTS];
-
-    __libc_preinit( &thread, tls_area );
-
 /* 
  * To enable malloc checks for statically linked programs, add
  * "WITH_MALLOC_CHECK_LIBC_A := true" in device/buildspec.mk
diff --git a/libc/bionic/pthread_internal.h b/libc/bionic/pthread_internal.h
new file mode 100644
index 0000000..eb4e80c
--- /dev/null
+++ b/libc/bionic/pthread_internal.h
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "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
+ * COPYRIGHT OWNER OR CONTRIBUTORS 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.
+ */
+#ifndef _PTHREAD_INTERNAL_H_
+#define _PTHREAD_INTERNAL_H_
+
+#include <pthread.h>
+
+__BEGIN_DECLS
+
+typedef struct pthread_internal_t
+{
+    struct pthread_internal_t*  next;
+    struct pthread_internal_t** pref;
+    pthread_attr_t              attr;
+    pid_t                       kernel_id;
+    pthread_cond_t              join_cond;
+    int                         join_count;
+    void*                       return_value;
+    int                         intern;
+    __pthread_cleanup_t*        cleanup_stack;
+    void**                      tls;         /* thread-local storage area */
+} pthread_internal_t;
+
+extern void _init_thread(pthread_internal_t * thread, pid_t kernel_id, pthread_attr_t * attr, void * stack_base);
+
+/* needed by posix-timers.c */
+
+static __inline__ void timespec_add( struct timespec*  a, const struct timespec*  b )
+{
+    a->tv_sec  += b->tv_sec;
+    a->tv_nsec += b->tv_nsec;
+    if (a->tv_nsec >= 1000000000) {
+        a->tv_nsec -= 1000000000;
+        a->tv_sec  += 1;
+    }
+}
+
+static  __inline__ void timespec_sub( struct timespec*  a, const struct timespec*  b )
+{
+    a->tv_sec  -= b->tv_sec;
+    a->tv_nsec -= b->tv_nsec;
+    if (a->tv_nsec < 0) {
+        a->tv_nsec += 1000000000;
+        a->tv_sec  -= 1;
+    }
+}
+
+static  __inline__ void timespec_zero( struct timespec*  a )
+{
+    a->tv_sec = a->tv_nsec = 0;
+}
+
+static  __inline__ int timespec_is_zero( const struct timespec*  a )
+{
+    return (a->tv_sec == 0 && a->tv_nsec == 0);
+}
+
+static  __inline__ int timespec_cmp( const struct timespec*  a, const struct timespec*  b )
+{
+    if (a->tv_sec  < b->tv_sec)  return -1;
+    if (a->tv_sec  > b->tv_sec)  return +1;
+    if (a->tv_nsec < b->tv_nsec) return -1;
+    if (a->tv_nsec > b->tv_nsec) return +1;
+    return 0;
+}
+
+static  __inline__ int timespec_cmp0( const struct timespec*  a )
+{
+    if (a->tv_sec < 0) return -1;
+    if (a->tv_sec > 0) return +1;
+    if (a->tv_nsec < 0) return -1;
+    if (a->tv_nsec > 0) return +1;
+    return 0;
+}
+
+extern int  __pthread_cond_timedwait(pthread_cond_t*, 
+                                     pthread_mutex_t*,
+                                     const struct timespec*, 
+                                     clockid_t);
+
+extern int  __pthread_cond_timedwait_relative(pthread_cond_t*,
+                                              pthread_mutex_t*,
+                                              const struct timespec*);
+
+/* needed by fork.c */
+extern void __timer_table_start_stop(int  stop);
+
+__END_DECLS
+
+#endif /* _PTHREAD_INTERNAL_H_ */
