diff --git a/taskstats/Android.mk b/taskstats/Android.mk
new file mode 100644
index 0000000..1a3cbdb
--- /dev/null
+++ b/taskstats/Android.mk
@@ -0,0 +1,16 @@
+# Copyright 2013 The Android Open Source Project
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+	taskstats.c
+
+LOCAL_SHARED_LIBRARIES := \
+	libnl
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := debug
+LOCAL_MODULE:= taskstats
+
+include $(BUILD_EXECUTABLE)
diff --git a/taskstats/MODULE_LICENSE_APACHE2 b/taskstats/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/taskstats/MODULE_LICENSE_APACHE2
diff --git a/taskstats/NOTICE b/taskstats/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/taskstats/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/taskstats/taskstats.c b/taskstats/taskstats.c
new file mode 100644
index 0000000..361e99f
--- /dev/null
+++ b/taskstats/taskstats.c
@@ -0,0 +1,335 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+/*
+ * Linux task stats reporting tool. Queries and prints out the kernel's
+ * taskstats structure for a given process or thread group id. See
+ * https://www.kernel.org/doc/Documentation/accounting/ for more information
+ * about the reported fields.
+ */
+
+#include <errno.h>
+#include <getopt.h>
+#include <netlink/attr.h>
+#include <netlink/genl/genl.h>
+#include <netlink/genl/ctrl.h>
+#include <netlink/handlers.h>
+#include <netlink/msg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/cdefs.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <linux/taskstats.h>
+
+struct TaskStatistics {
+    int pid;
+    int tgid;
+    struct taskstats stats;
+};
+
+int print_receive_error(struct sockaddr_nl* address __unused,
+                        struct nlmsgerr* error, void* arg __unused) {
+    fprintf(stderr, "Netlink receive error: %s\n", strerror(-error->error));
+    return NL_STOP;
+}
+
+void parse_aggregate_task_stats(struct nlattr* attr, int attr_size,
+                                struct TaskStatistics* stats) {
+    nla_for_each_attr(attr, attr, attr_size, attr_size) {
+        switch (attr->nla_type) {
+            case TASKSTATS_TYPE_PID:
+                stats->pid = nla_get_u32(attr);
+                break;
+            case TASKSTATS_TYPE_TGID:
+                stats->tgid = nla_get_u32(attr);
+                break;
+            case TASKSTATS_TYPE_STATS:
+                nla_memcpy(&stats->stats, attr, sizeof(stats->stats));
+                break;
+            default:
+                break;
+        }
+    }
+}
+
+int parse_task_stats(struct nl_msg* msg, void* arg) {
+    struct TaskStatistics* stats = (struct TaskStatistics*)arg;
+    struct genlmsghdr* gnlh = (struct genlmsghdr*)nlmsg_data(nlmsg_hdr(msg));
+    struct nlattr* attr = genlmsg_attrdata(gnlh, 0);
+    int remaining = genlmsg_attrlen(gnlh, 0);
+
+    nla_for_each_attr(attr, attr, remaining, remaining) {
+        switch (attr->nla_type) {
+            case TASKSTATS_TYPE_AGGR_PID:
+            case TASKSTATS_TYPE_AGGR_TGID:
+                parse_aggregate_task_stats(nla_data(attr), nla_len(attr),
+                                           stats);
+                break;
+            default:
+                break;
+        }
+    }
+    return NL_STOP;
+}
+
+int query_task_stats(struct nl_sock* netlink_socket, int family_id,
+                     int command_type, int parameter,
+                     struct TaskStatistics* stats) {
+    memset(stats, 0, sizeof(*stats));
+
+    struct nl_msg* message = nlmsg_alloc();
+    genlmsg_put(message, NL_AUTO_PID, NL_AUTO_SEQ, family_id, 0, 0,
+		TASKSTATS_CMD_GET, TASKSTATS_VERSION);
+    nla_put_u32(message, command_type, parameter);
+
+    int result = nl_send_auto_complete(netlink_socket, message);
+    nlmsg_free(message);
+    if (result < 0) {
+        return result;
+    }
+
+    struct nl_cb* callbacks = nl_cb_get(nl_cb_alloc(NL_CB_CUSTOM));
+    nl_cb_set(callbacks, NL_CB_VALID, NL_CB_CUSTOM, &parse_task_stats, stats);
+    nl_cb_err(callbacks, NL_CB_CUSTOM, &print_receive_error, &family_id);
+
+    result = nl_recvmsgs(netlink_socket, callbacks);
+    nl_cb_put(callbacks);
+    if (result < 0) {
+        return result;
+    }
+    return stats->pid || stats->tgid;
+}
+
+double average_ms(unsigned long long total, unsigned long long count) {
+    if (!count) {
+        return 0;
+    }
+    return ((double)total) / count / 1e6;
+}
+
+unsigned long long average_ns(unsigned long long total,
+                              unsigned long long count) {
+    if (!count) {
+        return 0;
+    }
+    return total / count;
+}
+
+void print_task_stats(const struct TaskStatistics* stats,
+                      int human_readable) {
+    const struct taskstats* s = &stats->stats;
+    printf("Basic task statistics\n");
+    printf("---------------------\n");
+    printf("%-25s%d\n", "Stats version:", s->version);
+    printf("%-25s%d\n", "Exit code:", s->ac_exitcode);
+    printf("%-25s0x%x\n", "Flags:", s->ac_flag);
+    printf("%-25s%d\n", "Nice value:", s->ac_nice);
+    printf("%-25s%s\n", "Command name:", s->ac_comm);
+    printf("%-25s%d\n", "Scheduling discipline:", s->ac_sched);
+    printf("%-25s%d\n", "UID:", s->ac_uid);
+    printf("%-25s%d\n", "GID:", s->ac_gid);
+    printf("%-25s%d\n", "PID:", s->ac_pid);
+    printf("%-25s%d\n", "PPID:", s->ac_ppid);
+
+    if (human_readable) {
+        time_t begin_time = s->ac_btime;
+        printf("%-25s%s", "Begin time:", ctime(&begin_time));
+    } else {
+        printf("%-25s%d sec\n", "Begin time:", s->ac_btime);
+    }
+    printf("%-25s%llu usec\n", "Elapsed time:", s->ac_etime);
+    printf("%-25s%llu usec\n", "User CPU time:", s->ac_utime);
+    printf("%-25s%llu\n", "Minor page faults:", s->ac_minflt);
+    printf("%-25s%llu\n", "Major page faults:", s->ac_majflt);
+    printf("%-25s%llu usec\n", "Scaled user time:", s->ac_utimescaled);
+    printf("%-25s%llu usec\n", "Scaled system time:", s->ac_stimescaled);
+
+    printf("\nDelay accounting\n");
+    printf("----------------\n");
+    printf("       %15s%15s%15s%15s%15s%15s\n",
+           "Count",
+           human_readable ? "Delay (ms)" : "Delay (ns)",
+           "Average delay",
+           "Real delay",
+           "Scaled real",
+           "Virtual delay");
+
+    if (!human_readable) {
+        printf("CPU    %15llu%15llu%15llu%15llu%15llu%15llu\n",
+               s->cpu_count,
+               s->cpu_delay_total,
+               average_ns(s->cpu_delay_total, s->cpu_count),
+               s->cpu_run_real_total,
+               s->cpu_scaled_run_real_total,
+               s->cpu_run_virtual_total);
+        printf("IO     %15llu%15llu%15llu\n",
+               s->blkio_count,
+               s->blkio_delay_total,
+               average_ns(s->blkio_delay_total, s->blkio_count));
+        printf("Swap   %15llu%15llu%15llu\n",
+               s->swapin_count,
+               s->swapin_delay_total,
+               average_ns(s->swapin_delay_total, s->swapin_count));
+        printf("Reclaim%15llu%15llu%15llu\n",
+               s->freepages_count,
+               s->freepages_delay_total,
+               average_ns(s->freepages_delay_total, s->freepages_count));
+    } else {
+        const double ms_per_ns = 1e6;
+        printf("CPU    %15llu%15.3f%15.3f%15.3f%15.3f%15.3f\n",
+               s->cpu_count,
+               s->cpu_delay_total / ms_per_ns,
+               average_ms(s->cpu_delay_total, s->cpu_count),
+               s->cpu_run_real_total / ms_per_ns,
+               s->cpu_scaled_run_real_total / ms_per_ns,
+               s->cpu_run_virtual_total / ms_per_ns);
+        printf("IO     %15llu%15.3f%15.3f\n",
+               s->blkio_count,
+               s->blkio_delay_total / ms_per_ns,
+               average_ms(s->blkio_delay_total, s->blkio_count));
+        printf("Swap   %15llu%15.3f%15.3f\n",
+               s->swapin_count,
+               s->swapin_delay_total / ms_per_ns,
+               average_ms(s->swapin_delay_total, s->swapin_count));
+        printf("Reclaim%15llu%15.3f%15.3f\n",
+               s->freepages_count,
+               s->freepages_delay_total / ms_per_ns,
+               average_ms(s->freepages_delay_total, s->freepages_count));
+    }
+
+    printf("\nExtended accounting fields\n");
+    printf("--------------------------\n");
+    if (human_readable && s->ac_stime) {
+        printf("%-25s%.3f MB\n", "Average RSS usage:",
+               (double)s->coremem / s->ac_stime);
+        printf("%-25s%.3f MB\n", "Average VM usage:",
+               (double)s->virtmem / s->ac_stime);
+    } else {
+        printf("%-25s%llu MB\n", "Accumulated RSS usage:", s->coremem);
+        printf("%-25s%llu MB\n", "Accumulated VM usage:", s->virtmem);
+    }
+    printf("%-25s%llu KB\n", "RSS high water mark:", s->hiwater_rss);
+    printf("%-25s%llu KB\n", "VM high water mark:", s->hiwater_vm);
+    printf("%-25s%llu\n", "IO bytes read:", s->read_char);
+    printf("%-25s%llu\n", "IO bytes written:", s->write_char);
+    printf("%-25s%llu\n", "IO read syscalls:", s->read_syscalls);
+    printf("%-25s%llu\n", "IO write syscalls:", s->write_syscalls);
+
+    printf("\nPer-task/thread statistics\n");
+    printf("--------------------------\n");
+    printf("%-25s%llu\n", "Voluntary switches:", s->nvcsw);
+    printf("%-25s%llu\n", "Involuntary switches:", s->nivcsw);
+}
+
+void print_usage() {
+  printf("Linux task stats reporting tool\n"
+         "\n"
+         "Usage: taskstats [options]\n"
+         "\n"
+         "Options:\n"
+         "  --help        This text\n"
+         "  --pid PID     Print stats for the process id PID\n"
+         "  --tgid TGID   Print stats for the thread group id TGID\n"
+         "  --raw         Print raw numbers instead of human readable units\n"
+         "\n"
+         "Either PID or TGID must be specified. For more documentation about "
+         "the reported fields, see\n"
+         "https://www.kernel.org/doc/Documentation/accounting/"
+         "taskstats-struct.txt\n");
+}
+
+int main(int argc, char** argv) {
+    int command_type = 0;
+    int pid = 0;
+    int human_readable = 1;
+
+    const struct option long_options[] = {
+        {"help", no_argument, 0, 0},
+        {"pid", required_argument, 0, 0},
+        {"tgid", required_argument, 0, 0},
+        {"raw", no_argument, 0, 0},
+        {0, 0, 0, 0}
+    };
+
+    while (1) {
+        int option_index;
+        int option_char = getopt_long_only(argc, argv, "", long_options,
+                                           &option_index);
+        if (option_char == -1) {
+            break;
+        }
+        switch (option_index) {
+            case 0:
+                print_usage();
+                return EXIT_SUCCESS;
+            case 1:
+                command_type = TASKSTATS_CMD_ATTR_PID;
+                pid = atoi(optarg);
+                break;
+            case 2:
+                command_type = TASKSTATS_CMD_ATTR_TGID;
+                pid = atoi(optarg);
+                break;
+            case 3:
+                human_readable = 0;
+                break;
+            default:
+                break;
+        };
+    }
+
+    if (!pid) {
+        printf("Either PID or TGID must be specified\n");
+        return EXIT_FAILURE;
+    }
+
+    struct nl_sock* netlink_socket = nl_socket_alloc();
+    if (!netlink_socket) {
+        fprintf(stderr, "Unable to allocate netlink socket\n");
+        goto error;
+    }
+
+    int ret = genl_connect(netlink_socket);
+    if (ret < 0) {
+        nl_perror(ret, "Unable to open netlink socket (are you root?)");
+        goto error;
+    }
+
+    int family_id = genl_ctrl_resolve(netlink_socket, TASKSTATS_GENL_NAME);
+    if (family_id < 0) {
+        nl_perror(family_id, "Unable to determine taskstats family id "
+               "(does your kernel support taskstats?)");
+        goto error;
+    }
+    struct TaskStatistics stats;
+    ret = query_task_stats(netlink_socket, family_id, command_type, pid, &stats);
+    if (ret < 0) {
+        nl_perror(ret, "Failed to query taskstats");
+        goto error;
+    }
+    print_task_stats(&stats, human_readable);
+
+    nl_socket_free(netlink_socket);
+    return EXIT_SUCCESS;
+
+error:
+    if (netlink_socket) {
+        nl_socket_free(netlink_socket);
+    }
+    return EXIT_FAILURE;
+}
