diff --git a/libstdc++/Android.mk b/libstdc++/Android.mk
new file mode 100644
index 0000000..df97c9f
--- /dev/null
+++ b/libstdc++/Android.mk
@@ -0,0 +1,28 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+	src/one_time_construction.cpp \
+	src/new.cpp \
+	src/pure_virtual.cpp \
+	src/typeinfo.cpp
+
+LOCAL_MODULE:= libstdc++
+
+LOCAL_SYSTEM_SHARED_LIBRARIES := libc
+
+include $(BUILD_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+	src/one_time_construction.cpp \
+	src/new.cpp \
+	src/pure_virtual.cpp \
+	src/typeinfo.cpp
+
+LOCAL_MODULE:= libstdc++
+
+LOCAL_SYSTEM_SHARED_LIBRARIES := libc
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/libstdc++/MODULE_LICENSE_BSD b/libstdc++/MODULE_LICENSE_BSD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libstdc++/MODULE_LICENSE_BSD
diff --git a/libstdc++/NOTICE b/libstdc++/NOTICE
new file mode 100644
index 0000000..3831b34
--- /dev/null
+++ b/libstdc++/NOTICE
@@ -0,0 +1,26 @@
+Copyright (C) 2007 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:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. 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.
+3. Neither the name of the project nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE PROJECT 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 PROJECT 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.
diff --git a/libstdc++/include/cstddef b/libstdc++/include/cstddef
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libstdc++/include/cstddef
diff --git a/libstdc++/include/new b/libstdc++/include/new
new file mode 100644
index 0000000..559308b
--- /dev/null
+++ b/libstdc++/include/new
@@ -0,0 +1,29 @@
+#ifndef __NEW__
+#define __NEW__
+
+#include <stddef.h>
+
+namespace std {
+    using ::size_t;
+
+    struct nothrow_t {};
+    extern const nothrow_t nothrow;
+}
+
+void* operator new(std::size_t);
+void* operator new[](std::size_t);
+void  operator delete(void*);
+void  operator delete[](void*);
+void* operator new(std::size_t, const std::nothrow_t&);
+void* operator new[](std::size_t, const std::nothrow_t&);
+void  operator delete(void*, const std::nothrow_t&);
+void  operator delete[](void*, const std::nothrow_t&);
+
+inline void* operator new(std::size_t, void* p) { return p; }
+inline void* operator new[](std::size_t, void* p) { return p; }
+
+// these next two are not really required, since exceptions are off
+inline void  operator delete(void*, void*) { }
+inline void  operator delete[](void*, void*) { }
+
+#endif // __NEW__
diff --git a/libstdc++/include/stl_pair.h b/libstdc++/include/stl_pair.h
new file mode 100644
index 0000000..37f757b
--- /dev/null
+++ b/libstdc++/include/stl_pair.h
@@ -0,0 +1,122 @@
+/*
+ * 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.
+ */
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_PAIR_H
+#define __SGI_STL_INTERNAL_PAIR_H
+
+__STL_BEGIN_NAMESPACE
+
+template <class _T1, class _T2>
+struct pair {
+  typedef _T1 first_type;
+  typedef _T2 second_type;
+
+  _T1 first;
+  _T2 second;
+  pair() : first(), second() {}
+  pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {}
+
+  template <class _U1, class _U2>
+  pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {}
+};
+
+template <class _T1, class _T2>
+inline bool operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+{
+  return __x.first == __y.first && __x.second == __y.second;
+}
+
+template <class _T1, class _T2>
+inline bool operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+{
+  return __x.first < __y.first ||
+         (!(__y.first < __x.first) && __x.second < __y.second);
+}
+
+template <class _T1, class _T2>
+inline bool operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+  return !(__x == __y);
+}
+
+template <class _T1, class _T2>
+inline bool operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+  return __y < __x;
+}
+
+template <class _T1, class _T2>
+inline bool operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+  return !(__y < __x);
+}
+
+template <class _T1, class _T2>
+inline bool operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+  return !(__x < __y);
+}
+
+template <class _T1, class _T2>
+inline pair<_T1, _T2> make_pair(_T1 __x, _T2 __y)
+{
+  return pair<_T1, _T2>(__x, __y);
+}
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_PAIR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/include/typeinfo b/libstdc++/include/typeinfo
new file mode 100644
index 0000000..8a51a54
--- /dev/null
+++ b/libstdc++/include/typeinfo
@@ -0,0 +1,28 @@
+#ifndef _TYPEINFO_HEADER_GAURD
+#define _TYPEINFO_HEADER_GAURD
+
+
+namespace std {
+    class type_info;
+    class bad_cast;
+    class bad_typeid;
+};
+
+
+class type_info {
+public:
+    type_info();
+    virtual ~type_info();
+
+    char const * name() const;
+
+    bool operator==(type_info const & right) const;
+    bool operator!=(type_info const & right) const;
+    bool before(type_info const & right) const;
+
+private:
+    type_info(type_info const & right);
+    type_info & operator=(type_info const & right);
+};
+
+#endif
diff --git a/libstdc++/include/utility b/libstdc++/include/utility
new file mode 100644
index 0000000..12044a7
--- /dev/null
+++ b/libstdc++/include/utility
@@ -0,0 +1,38 @@
+/*
+ * 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 _CPP_UTILITY
+#define _CPP_UTILITY
+
+#pragma GCC system_header
+
+#define  __STL_BEGIN_NAMESPACE  namespace std {
+#define  __STL_END_NAMESPACE    }
+
+#include <stl_pair.h>
+
+#endif /* _CPP_UTILITY */
diff --git a/libstdc++/src/new.cpp b/libstdc++/src/new.cpp
new file mode 100644
index 0000000..8189159
--- /dev/null
+++ b/libstdc++/src/new.cpp
@@ -0,0 +1,65 @@
+#include "new"
+#include <stdlib.h>
+
+const std::nothrow_t std::nothrow = {};
+
+void* operator new(std::size_t size)
+{
+    void* p = malloc(size);
+    if (p == NULL) {
+        // abort();
+    }
+    return p;
+}
+
+void* operator new[](std::size_t size)
+{
+    void* p = malloc(size);
+    if (p == NULL) {
+        // abort();
+    }
+    return p;
+}
+
+void  operator delete(void* ptr)
+{
+    if (ptr) {
+        free(ptr);
+    }
+}
+
+void  operator delete[](void* ptr)
+{
+    if (ptr) {
+        free(ptr);
+    }
+}
+
+void* operator new(std::size_t size, const std::nothrow_t&)
+{
+    return malloc(size);
+}
+
+void* operator new[](std::size_t size, const std::nothrow_t&)
+{
+    return malloc(size);
+}
+
+void  operator delete(void* ptr, const std::nothrow_t&)
+{
+    if (ptr) {
+        free(ptr);
+    }
+}
+
+void  operator delete[](void* ptr, const std::nothrow_t&)
+{
+    if (ptr) {
+        free(ptr);
+    }
+}
+
+
+
+
+
diff --git a/libstdc++/src/one_time_construction.cpp b/libstdc++/src/one_time_construction.cpp
new file mode 100644
index 0000000..304afb8
--- /dev/null
+++ b/libstdc++/src/one_time_construction.cpp
@@ -0,0 +1,50 @@
+/*
+ * one_time_construction.cpp
+ *
+ * Copyright 2006 The Android Open Source Project
+ *
+ * This file contains C++ ABI support functions for one time
+ * constructors as defined in the "Run-time ABI for the ARM Architecture"
+ * section 4.4.2
+ */
+
+#include <stddef.h>
+#include <sys/atomics.h>
+
+extern "C" int __futex_wait(volatile void *ftx, int val, const struct timespec *timeout);
+extern "C" int __futex_wake(volatile void *ftx, int count);
+
+
+extern "C" int __cxa_guard_acquire(int volatile * gv)
+{
+    // 0 -> 2, return 1
+    // 2 -> 6, wait and return 0
+    // 6 untouched, wait and return 0
+    // 1 untouched, return 0
+retry:
+    if (__atomic_cmpxchg(0, 0x2, gv) == 0)
+        return 1;
+
+    __atomic_cmpxchg(0x2, 0x6, gv); // Indicate there is a waiter
+    __futex_wait(gv, 0x6, NULL);
+    if(*gv != 1) // __cxa_guard_abort was called, let every thread try since there is no return code for this condition
+        goto retry;
+    return 0;
+}
+
+extern "C" void __cxa_guard_release(int volatile * gv)
+{
+    // 2 -> 1
+    // 6 -> 1, and wake
+    if (__atomic_cmpxchg(0x2, 0x1, gv) == 0)
+        return;
+
+    *gv = 0x1;
+    __futex_wake(gv, 0x7fffffff);
+}
+
+extern "C" void __cxa_guard_abort(int volatile * gv)
+{
+    *gv = 0;
+    __futex_wake(gv, 0x7fffffff);
+}
diff --git a/libstdc++/src/pure_virtual.cpp b/libstdc++/src/pure_virtual.cpp
new file mode 100644
index 0000000..663c1e9
--- /dev/null
+++ b/libstdc++/src/pure_virtual.cpp
@@ -0,0 +1,10 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+
+extern "C" void __cxa_pure_virtual()
+{
+    fprintf(stderr, "Pure virtual function called.  Are you calling virtual methods from a destructor?\n");
+    abort();
+}
+
diff --git a/libstdc++/src/typeinfo.cpp b/libstdc++/src/typeinfo.cpp
new file mode 100644
index 0000000..b426f1a
--- /dev/null
+++ b/libstdc++/src/typeinfo.cpp
@@ -0,0 +1,32 @@
+#include "typeinfo"
+#include <stdlib.h>
+
+type_info::type_info() {
+}
+
+type_info::~type_info() {
+}
+
+char const *
+type_info::name() const {
+    return "N/A";
+}
+
+bool 
+type_info::operator==(type_info const & right) const {
+    return false;
+}
+
+bool 
+type_info::operator!=(type_info const & right) const {
+    return false;
+}
+
+bool
+type_info::before(type_info const & right) const {
+    return false;
+}
+
+type_info::type_info(type_info const & right) {
+}
+
