diff --git a/procmem/Android.mk b/procmem/Android.mk
new file mode 100644
index 0000000..b7fba56
--- /dev/null
+++ b/procmem/Android.mk
@@ -0,0 +1,23 @@
+# Copyright (C) 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.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := procmem.c
+LOCAL_SHARED_LIBRARIES := libpagemap
+LOCAL_MODULE := procmem
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := debug
+include $(BUILD_EXECUTABLE)
diff --git a/procmem/MODULE_LICENSE_APACHE2 b/procmem/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/procmem/MODULE_LICENSE_APACHE2
diff --git a/procmem/NOTICE b/procmem/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/procmem/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/procmem/procmem.c b/procmem/procmem.c
new file mode 100644
index 0000000..17a7212
--- /dev/null
+++ b/procmem/procmem.c
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ */
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <pagemap/pagemap.h>
+
+/* Information about a single mapping */
+struct map_info {
+    pm_map_t *map;
+    pm_memusage_t usage;
+    /* page counts */
+    unsigned long shared_clean;
+    unsigned long shared_dirty;
+    unsigned long private_clean;
+    unsigned long private_dirty;
+};
+
+/* display the help screen */
+static void usage(const char *cmd);
+
+/* qsort compare function to compare maps by PSS */
+int comp_pss(const void *a, const void *b);
+
+int main(int argc, char *argv[]) {
+    pid_t pid;
+
+    /* libpagemap context */
+    pm_kernel_t *ker;
+    int pagesize; /* cached for speed */
+    pm_process_t *proc;
+
+    /* maps and such */
+    pm_map_t **maps; size_t num_maps;
+
+    struct map_info **mis = NULL;
+    struct map_info *mi;
+
+    /* pagemap information */
+    uint64_t *pagemap; size_t num_pages;
+    uint64_t mapentry;
+    uint64_t count, flags;
+
+    /* totals */
+    unsigned long total_shared_clean, total_shared_dirty, total_private_clean, total_private_dirty;
+    pm_memusage_t total_usage;
+
+    /* command-line options */
+    int ws;
+#define WS_OFF (0)
+#define WS_ONLY (1)
+#define WS_RESET (2)
+    int (*compfn)(const void *a, const void *b);
+    int hide_zeros;
+
+    /* temporary variables */
+    size_t i, j;
+    char *endptr;
+    int error;
+
+    if (argc < 2) {
+        usage(argv[0]);
+        exit(EXIT_FAILURE);
+    }
+
+    ws = WS_OFF;
+    compfn = NULL;
+    hide_zeros = 0;
+    for (i = 1; i < (size_t)(argc - 1); i++) {
+        if (!strcmp(argv[i], "-w")) { ws = WS_ONLY; continue; }
+        if (!strcmp(argv[i], "-W")) { ws = WS_RESET; continue; }
+        if (!strcmp(argv[i], "-m")) { compfn = NULL; continue; }
+        if (!strcmp(argv[i], "-p")) { compfn = &comp_pss; continue; }
+        if (!strcmp(argv[i], "-h")) { hide_zeros = 1; continue; }
+        fprintf(stderr, "Invalid argument \"%s\".\n", argv[i]);
+        usage(argv[0]);
+        exit(EXIT_FAILURE);
+    }
+
+    pid = (pid_t)strtol(argv[argc - 1], &endptr, 10);
+    if (*endptr != '\0') {
+        fprintf(stderr, "Invalid PID \"%s\".\n", argv[argc - 1]);
+        exit(EXIT_FAILURE);
+    }
+
+    error = pm_kernel_create(&ker);
+    if (error) {
+        fprintf(stderr, "error creating kernel interface -- "
+                        "does this kernel have pagemap?\n");
+        exit(EXIT_FAILURE);
+    }
+
+    pagesize = pm_kernel_pagesize(ker);
+
+    error = pm_process_create(ker, pid, &proc);
+    if (error) {
+        fprintf(stderr, "error creating process interface -- "
+                        "does process %d really exist?\n", pid);
+        exit(EXIT_FAILURE);
+    }
+
+    if (ws == WS_RESET) {
+        error = pm_process_workingset(proc, NULL, 1);
+        if (error) {
+            fprintf(stderr, "error resetting working set for process.\n");
+            exit(EXIT_FAILURE);
+        }
+        exit(EXIT_SUCCESS);
+    }
+
+    /* get maps, and allocate our map_info array */
+    error = pm_process_maps(proc, &maps, &num_maps);
+    if (error) {
+        fprintf(stderr, "error listing maps.\n");
+        exit(EXIT_FAILURE);
+    }
+
+    mis = (struct map_info **)calloc(num_maps, sizeof(struct map_info *));
+    if (!mis) {
+        fprintf(stderr, "error allocating map_info array: %s\n", strerror(errno));
+        exit(EXIT_FAILURE);
+    }
+
+    /* print header */
+    if (ws == WS_ONLY) {
+        printf("%7s  %7s  %7s  %7s  %7s  %7s  %7s  %s\n",
+               "WRss", "WPss", "WUss", "WShCl", "WShDi", "WPrCl", "WPrDi", "Name");
+        printf("%7s  %7s  %7s  %7s  %7s  %7s  %7s  %s\n",
+               "-------", "-------", "-------", "-------", "-------", "-------", "-------", "");
+    } else {
+        printf("%7s  %7s  %7s  %7s  %7s  %7s  %7s  %7s  %s\n",
+               "Vss", "Rss", "Pss", "Uss", "ShCl", "ShDi", "PrCl", "PrDi", "Name");
+        printf("%7s  %7s  %7s  %7s  %7s  %7s  %7s  %7s  %s\n",
+               "-------", "-------", "-------", "-------", "-------", "-------", "-------", "-------", "");
+    }
+
+    /* zero things */
+    pm_memusage_zero(&total_usage);
+    total_shared_clean = total_shared_dirty = total_private_clean = total_private_dirty = 0;
+
+    for (i = 0; i < num_maps; i++) {
+        mi = (struct map_info *)calloc(1, sizeof(struct map_info));
+        if (!mi) {
+            fprintf(stderr, "error allocating map_info: %s\n", strerror(errno));
+            exit(EXIT_FAILURE);
+        }
+
+        mi->map = maps[i];
+
+        /* get, and sum, memory usage */
+
+        if (ws == WS_ONLY)
+            error = pm_map_workingset(mi->map, &mi->usage);
+        else
+            error = pm_map_usage(mi->map, &mi->usage);
+        if (error) {
+            fflush(stdout);
+            fprintf(stderr, "error getting usage for map.\n");
+            continue;
+        }
+
+        pm_memusage_add(&total_usage, &mi->usage);
+
+        /* get, and sum, individual page counts */
+
+        error = pm_map_pagemap(mi->map, &pagemap, &num_pages);
+        if (error) {
+            fflush(stdout);
+            fprintf(stderr, "error getting pagemap for map.\n");
+            continue;
+        }
+
+        mi->shared_clean = mi->shared_dirty = mi->private_clean = mi->private_dirty = 0;
+
+        for (j = 0; j < num_pages; j++) {
+            mapentry = pagemap[j];
+
+            if (PM_PAGEMAP_PRESENT(mapentry) && !PM_PAGEMAP_SWAPPED(mapentry)) {
+
+                error = pm_kernel_count(ker, PM_PAGEMAP_PFN(mapentry), &count);
+                if (error) {
+                    fflush(stdout);
+                    fprintf(stderr, "error getting count for frame.\n");
+                }
+
+                error = pm_kernel_flags(ker, PM_PAGEMAP_PFN(mapentry), &flags);
+                if (error) {
+                    fflush(stdout);
+                    fprintf(stderr, "error getting flags for frame.\n");
+                }
+
+                if ((ws != WS_ONLY) || (flags & PM_PAGE_REFERENCED)) {
+                    if (count > 1) {
+                        if (flags & PM_PAGE_DIRTY)
+                            mi->shared_dirty++;
+                        else
+                            mi->shared_clean++;
+                    } else {
+                        if (flags & PM_PAGE_DIRTY)
+                            mi->private_dirty++;
+                        else
+                            mi->private_clean++;
+                    }
+                }
+            }
+        }
+
+        total_shared_clean += mi->shared_clean;
+        total_shared_dirty += mi->shared_dirty;
+        total_private_clean += mi->private_clean;
+        total_private_dirty += mi->private_dirty;
+
+        /* add to array */
+        mis[i] = mi;
+    }
+
+    /* sort the array, if requested (compfn == NULL for original order) */
+    if (compfn)
+        qsort(mis, num_maps, sizeof(mis[0]), compfn);
+
+    for (i = 0; i < num_maps; i++) {
+        mi = mis[i];
+
+        if ((!mi) || (hide_zeros && !mi->usage.rss))
+            continue;
+
+        if (ws == WS_ONLY) {
+            printf("%6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %s\n",
+                (long)mi->usage.rss / 1024,
+                (long)mi->usage.pss / 1024,
+                (long)mi->usage.uss / 1024,
+                mi->shared_clean * pagesize / 1024,
+                mi->shared_dirty * pagesize / 1024,
+                mi->private_clean * pagesize / 1024,
+                mi->private_dirty * pagesize / 1024,
+                pm_map_name(mi->map)
+            );
+        } else {
+            printf("%6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %s\n",
+                (long)mi->usage.vss / 1024,
+                (long)mi->usage.rss / 1024,
+                (long)mi->usage.pss / 1024,
+                (long)mi->usage.uss / 1024,
+                mi->shared_clean * pagesize / 1024,
+                mi->shared_dirty * pagesize / 1024,
+                mi->private_clean * pagesize / 1024,
+                mi->private_dirty * pagesize / 1024,
+                pm_map_name(mi->map)
+            );
+        }
+    }
+
+    /* print totals */
+    if (ws == WS_ONLY) {
+        printf("%7s  %7s  %7s  %7s  %7s  %7s  %7s  %s\n",
+               "-------", "-------", "-------", "-------", "-------", "-------", "-------", "");
+        printf("%6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %s\n",
+            (long)total_usage.rss / 1024,
+            (long)total_usage.pss / 1024,
+            (long)total_usage.uss / 1024,
+            total_shared_clean * pagesize / 1024,
+            total_shared_dirty * pagesize / 1024,
+            total_private_clean * pagesize / 1024,
+            total_private_dirty * pagesize / 1024,
+            "TOTAL"
+        );
+    } else {
+        printf("%7s  %7s  %7s  %7s  %7s  %7s  %7s  %7s  %s\n",
+               "-------", "-------", "-------", "-------", "-------", "-------", "-------", "-------", "");
+        printf("%6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %6ldK  %s\n",
+            (long)total_usage.vss / 1024,
+            (long)total_usage.rss / 1024,
+            (long)total_usage.pss / 1024,
+            (long)total_usage.uss / 1024,
+            total_shared_clean * pagesize / 1024,
+            total_shared_dirty * pagesize / 1024,
+            total_private_clean * pagesize / 1024,
+            total_private_dirty * pagesize / 1024,
+            "TOTAL"
+        );
+    }
+
+    free(mis);
+    return 0;
+}
+
+static void usage(const char *cmd) {
+    fprintf(stderr, "Usage: %s [ -w | -W ] [ -p | -m ] [ -h ] pid\n"
+                    "    -w  Displays statistics for the working set only.\n"
+                    "    -W  Resets the working set of the process.\n"
+                    "    -p  Sort by PSS.\n"
+                    "    -m  Sort by mapping order (as read from /proc).\n"
+                    "    -h  Hide maps with no RSS.\n",
+        cmd);
+}
+
+int comp_pss(const void *a, const void *b) {
+    struct map_info *ma, *mb;
+
+    ma = *((struct map_info **)a);
+    mb = *((struct map_info **)b);
+
+    if (mb->usage.pss < ma->usage.pss) return -1;
+    if (mb->usage.pss > ma->usage.pss) return 1;
+    return 0;
+}
