diff --git a/showmap/Android.mk b/showmap/Android.mk
new file mode 100644
index 0000000..44ca818
--- /dev/null
+++ b/showmap/Android.mk
@@ -0,0 +1,12 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= showmap.cpp
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := debug
+LOCAL_MODULE:= showmap
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/showmap/MODULE_LICENSE_APACHE2 b/showmap/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/showmap/MODULE_LICENSE_APACHE2
diff --git a/showmap/NOTICE b/showmap/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/showmap/NOTICE
@@ -0,0 +1,190 @@
+
+   Copyright (c) 2005-2008, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
diff --git a/showmap/showmap.cpp b/showmap/showmap.cpp
new file mode 100644
index 0000000..d7d41b6
--- /dev/null
+++ b/showmap/showmap.cpp
@@ -0,0 +1,358 @@
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <math.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+struct mapinfo {
+    mapinfo *next;
+    unsigned start;
+    unsigned end;
+    unsigned size;
+    unsigned rss;
+    unsigned pss;
+    unsigned shared_clean;
+    unsigned shared_dirty;
+    unsigned private_clean;
+    unsigned private_dirty;
+    unsigned swap;
+    int is_bss;
+    int count;
+    char name[1];
+};
+
+static int is_library(const char *name) {
+    int len = strlen(name);
+    return len >= 4 && name[0] == '/'
+            && name[len - 3] == '.' && name[len - 2] == 's' && name[len - 1] == 'o';
+}
+
+// 6f000000-6f01e000 rwxp 00000000 00:0c 16389419   /android/lib/libcomposer.so
+// 012345678901234567890123456789012345678901234567890123456789
+// 0         1         2         3         4         5
+
+static int parse_header(const char* line, const mapinfo* prev, mapinfo** mi) {
+    unsigned long start;
+    unsigned long end;
+    char name[128];
+    int name_pos;
+    int is_bss = 0;
+
+    if (sscanf(line, "%lx-%lx %*s %*x %*x:%*x %*d%n", &start, &end, &name_pos) != 2) {
+        *mi = NULL;
+        return -1;
+    }
+
+    while (isspace(line[name_pos])) {
+        name_pos += 1;
+    }
+
+    if (line[name_pos]) {
+        strlcpy(name, line + name_pos, sizeof(name));
+    } else {
+        if (prev && start == prev->end && is_library(prev->name)) {
+            // anonymous mappings immediately adjacent to shared libraries
+            // usually correspond to the library BSS segment, so we use the
+            // library's own name
+            strlcpy(name, prev->name, sizeof(name));
+            is_bss = 1;
+        } else {
+            strlcpy(name, "[anon]", sizeof(name));
+        }
+    }
+
+    const int name_size = strlen(name) + 1;
+    struct mapinfo* info = reinterpret_cast<mapinfo*>(calloc(1, sizeof(mapinfo) + name_size));
+    if (info == NULL) {
+        fprintf(stderr, "out of memory\n");
+        exit(1);
+    }
+
+    info->start = start;
+    info->end = end;
+    info->is_bss = is_bss;
+    info->count = 1;
+    strlcpy(info->name, name, name_size);
+
+    *mi = info;
+    return 0;
+}
+
+static int parse_field(mapinfo* mi, const char* line) {
+    char field[64];
+    int len;
+
+    if (sscanf(line, "%63s %n", field, &len) == 1
+            && *field && field[strlen(field) - 1] == ':') {
+        int size;
+        if (sscanf(line + len, "%d kB", &size) == 1) {
+            if (!strcmp(field, "Size:")) {
+                mi->size = size;
+            } else if (!strcmp(field, "Rss:")) {
+                mi->rss = size;
+            } else if (!strcmp(field, "Pss:")) {
+                mi->pss = size;
+            } else if (!strcmp(field, "Shared_Clean:")) {
+                mi->shared_clean = size;
+            } else if (!strcmp(field, "Shared_Dirty:")) {
+                mi->shared_dirty = size;
+            } else if (!strcmp(field, "Private_Clean:")) {
+                mi->private_clean = size;
+            } else if (!strcmp(field, "Private_Dirty:")) {
+                mi->private_dirty = size;
+            } else if (!strcmp(field, "Swap:")) {
+                mi->swap = size;
+            }
+        }
+        return 0;
+    }
+    return -1;
+}
+
+static int order_before(const mapinfo *a, const mapinfo *b, int sort_by_address) {
+    if (sort_by_address) {
+        return a->start < b->start
+                || (a->start == b->start && a->end < b->end);
+    } else {
+        return strcmp(a->name, b->name) < 0;
+    }
+}
+
+static void enqueue_map(mapinfo **head, mapinfo *map, int sort_by_address, int coalesce_by_name) {
+    mapinfo *prev = NULL;
+    mapinfo *current = *head;
+
+    if (!map) {
+        return;
+    }
+
+    for (;;) {
+        if (current && coalesce_by_name && !strcmp(map->name, current->name)) {
+            current->size += map->size;
+            current->rss += map->rss;
+            current->pss += map->pss;
+            current->shared_clean += map->shared_clean;
+            current->shared_dirty += map->shared_dirty;
+            current->private_clean += map->private_clean;
+            current->private_dirty += map->private_dirty;
+            current->swap += map->swap;
+            current->is_bss &= map->is_bss;
+            current->count++;
+            free(map);
+            break;
+        }
+
+        if (!current || order_before(map, current, sort_by_address)) {
+            if (prev) {
+                prev->next = map;
+            } else {
+                *head = map;
+            }
+            map->next = current;
+            break;
+        }
+
+        prev = current;
+        current = current->next;
+    }
+}
+
+static mapinfo *load_maps(int pid, int sort_by_address, int coalesce_by_name)
+{
+    char fn[128];
+    FILE *fp;
+    char line[1024];
+    mapinfo *head = NULL;
+    mapinfo *current = NULL;
+    int len;
+
+    snprintf(fn, sizeof(fn), "/proc/%d/smaps", pid);
+    fp = fopen(fn, "r");
+    if (fp == 0) {
+        fprintf(stderr, "cannot open /proc/%d/smaps: %s\n", pid, strerror(errno));
+        return NULL;
+    }
+
+    while (fgets(line, sizeof(line), fp) != 0) {
+        len = strlen(line);
+        if (line[len - 1] == '\n') {
+            line[--len] = 0;
+        }
+
+        if (current != NULL && !parse_field(current, line)) {
+            continue;
+        }
+
+        mapinfo *next;
+        if (!parse_header(line, current, &next)) {
+            enqueue_map(&head, current, sort_by_address, coalesce_by_name);
+            current = next;
+            continue;
+        }
+
+        fprintf(stderr, "warning: could not parse map info line: %s\n", line);
+    }
+
+    enqueue_map(&head, current, sort_by_address, coalesce_by_name);
+
+    fclose(fp);
+
+    if (!head) {
+        fprintf(stderr, "could not read /proc/%d/smaps\n", pid);
+        return NULL;
+    }
+
+    return head;
+}
+
+static bool verbose = false;
+static bool terse = false;
+static bool addresses = false;
+
+static void print_header()
+{
+    const char *addr1 = addresses ? "   start      end " : "";
+    const char *addr2 = addresses ? "    addr     addr " : "";
+
+    printf("%s virtual                     shared   shared  private  private\n", addr1);
+    printf("%s    size      RSS      PSS    clean    dirty    clean    dirty     swap ", addr2);
+    if (!verbose && !addresses) {
+        printf("   # ");
+    }
+    printf("object\n");
+}
+
+static void print_divider()
+{
+    if (addresses) {
+        printf("-------- -------- ");
+    }
+    printf("-------- -------- -------- -------- -------- -------- -------- -------- ");
+    if (!verbose && !addresses) {
+        printf("---- ");
+    }
+    printf("------------------------------\n");
+}
+
+static void print_mi(mapinfo *mi, bool total)
+{
+    if (addresses) {
+        if (total) {
+            printf("                  ");
+        } else {
+            printf("%08x %08x ", mi->start, mi->end);
+        }
+    }
+    printf("%8d %8d %8d %8d %8d %8d %8d %8d ", mi->size,
+           mi->rss,
+           mi->pss,
+           mi->shared_clean, mi->shared_dirty,
+           mi->private_clean, mi->private_dirty, mi->swap);
+    if (!verbose && !addresses) {
+        printf("%4d ", mi->count);
+    }
+}
+
+static int show_map(int pid)
+{
+    mapinfo total;
+    memset(&total, 0, sizeof(total));
+
+    mapinfo *milist = load_maps(pid, addresses, !verbose && !addresses);
+    if (milist == NULL) {
+        return 1;
+    }
+
+    print_header();
+    print_divider();
+
+    for (mapinfo *mi = milist; mi;) {
+        mapinfo* last = mi;
+
+        total.shared_clean += mi->shared_clean;
+        total.shared_dirty += mi->shared_dirty;
+        total.private_clean += mi->private_clean;
+        total.private_dirty += mi->private_dirty;
+        total.swap += mi->swap;
+        total.rss += mi->rss;
+        total.pss += mi->pss;
+        total.size += mi->size;
+        total.count += mi->count;
+        
+        if (terse && !mi->private_dirty) {
+            goto out;
+        }
+
+        print_mi(mi, false);
+        printf("%s%s\n", mi->name, mi->is_bss ? " [bss]" : "");
+
+out:
+        mi = mi->next;
+        free(last);
+    }
+
+    print_divider();
+    print_header();
+    print_divider();
+
+    print_mi(&total, true);
+    printf("TOTAL\n");
+
+    return 0;
+}
+
+int main(int argc, char *argv[])
+{
+    int usage = 1;
+    int result = 0;
+    int pid;
+    char *arg;
+    char *argend;
+
+    signal(SIGPIPE, SIG_IGN);
+    for (argc--, argv++; argc > 0; argc--, argv++) {
+        arg = argv[0];
+        if (!strcmp(arg,"-v")) {
+            verbose = true;
+            continue;
+        }
+        if (!strcmp(arg,"-t")) {
+            terse = true;
+            continue;
+        }
+        if (!strcmp(arg,"-a")) {
+            addresses = true;
+            continue;
+        }
+        if (argc != 1) {
+            fprintf(stderr, "too many arguments\n");
+            break;
+        }
+        pid = strtol(arg, &argend, 10);
+        if (*arg && !*argend) {
+            usage = 0;
+            if (show_map(pid)) {
+                result = 1;
+            }
+            break;
+        }
+        fprintf(stderr, "unrecognized argument: %s\n", arg);
+        break;
+    }
+
+    if (usage) {
+        fprintf(stderr,
+                "showmap [-t] [-v] [-c] <pid>\n"
+                "        -t = terse (show only items with private pages)\n"
+                "        -v = verbose (don't coalesce maps with the same name)\n"
+                "        -a = addresses (show virtual memory map)\n"
+                );
+        result = 1;
+    }
+
+    return result;
+}
