diff --git a/.travis.yml b/.travis.yml
index b96bf0c..b05c966 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -98,19 +98,9 @@
       env: CFG=android-clang-arm-release GN_ARGS="is_debug=false target_os=\"android\" target_cpu=\"arm\""
     - os: linux
       dist: trusty
-      sudo: false
-      compiler: clang
-      env: CFG=android-clang-arm64-release GN_ARGS="is_debug=false target_os=\"android\" target_cpu=\"arm64\""
-    - os: linux
-      dist: trusty
       sudo: true
       compiler: clang
       env: CFG=android-clang-arm-asan GN_ARGS="is_debug=false target_os=\"android\" target_cpu=\"arm\" is_asan=true"
-    - os: linux
-      dist: trusty
-      sudo: true
-      compiler: clang
-      env: CFG=android-clang-arm64-asan GN_ARGS="is_debug=false target_os=\"android\" target_cpu=\"arm64\" is_asan=true"
 
 # Cache the deps that get git-pulled to avoid hitting quota limits (b/68252114).
 # Do not cache NDK/SDK and things that come from .zip files rather than git.
@@ -119,6 +109,7 @@
   timeout: 1800  # 30 mins
   directories:
     - buildtools/benchmark
+    - buildtools/emulator
     - buildtools/googletest
     - buildtools/libcxx
     - buildtools/libcxxabi
@@ -135,8 +126,7 @@
     if [[ "$CFG" != android-* ]]; then
       tools/install-build-deps --no-android
     else
-      ARCH=$(echo "$CFG" | cut -d- -f3)
-      tools/install-build-deps --emulator="$ARCH"
+      tools/install-build-deps
     fi
   - |
     if [[ -e buildtools/clang/bin/llvm-symbolizer ]]; then
@@ -148,6 +138,7 @@
   - tools/ninja -C out/dist -j8 all
   - |
     TEST_TARGETS="
+    perfetto_integrationtests
     perfetto_unittests
     perfetto_benchmarks
     "
@@ -157,7 +148,7 @@
       done
     else
       TARGET_ARCH=$(echo $CFG | cut -d- -f3)
-      tools/run_android_emulator $TARGET_ARCH --pid /tmp/emulator.pid -v &
+      tools/run_android_emulator --pid /tmp/emulator.pid -v &
       for TEST_TARGET in $TEST_TARGETS; do
         tools/run_android_test out/dist "$TEST_TARGET"
       done
diff --git a/buildtools/.gitignore b/buildtools/.gitignore
index 04e4d62..ca745de 100644
--- a/buildtools/.gitignore
+++ b/buildtools/.gitignore
@@ -1,8 +1,9 @@
 android_sdk/
+aosp-*/
 benchmark/
 clang/
 clang_format/
-emulator_images/
+emulator/
 googletest/
 libcxx/
 libcxxabi/
diff --git a/infra/perfetto-ci.appspot.com/static/index.html b/infra/perfetto-ci.appspot.com/static/index.html
index 934f9a9..f8231ca 100644
--- a/infra/perfetto-ci.appspot.com/static/index.html
+++ b/infra/perfetto-ci.appspot.com/static/index.html
@@ -64,26 +64,18 @@
           <td rowspan="4">Status</td>
           <td rowspan="4">Owner</td>
           <td rowspan="4">Updated</td>
-          <td colspan="16">Bots</td>
+          <td colspan="9">Bots</td>
         </tr>
         <tr>
-          <td colspan="5">mac</td>
           <td colspan="7">linux</td>
-          <td colspan="4">android</td>
+          <td colspan="2">android</td>
         </tr>
         <tr>
-          <td colspan="5">clang</td>
           <td>gcc7</td>
           <td colspan="6">clang</td>
           <td colspan="2">clang-arm</td>
-          <td colspan="2">clang-arm64</td>
         </tr>
         <tr id="cls_header">
-          <td id="mac-clang-x86_64-debug">dbg</td>
-          <td id="mac-clang-x86_64-release">rel</td>
-          <td id="mac-clang-x86_64-asan">asan</td>
-          <td id="mac-clang-x86_64-tsan">tsan</td>
-          <td id="mac-clang-x86_64-ubsan">ubsan</td>
           <td id="linux_trusty-gcc7-x86_64-release">rel</td>
           <td id="linux_trusty-clang-x86_64-debug">dbg</td>
           <td id="linux_trusty-clang-x86_64-asan">asan</td>
@@ -93,8 +85,6 @@
           <td id="linux_trusty-clang-x86_64-ubsan">ubsan</td>
           <td id="android-clang-arm-release">rel</td>
           <td id="android-clang-arm-asan">asan</td>
-          <td id="android-clang-arm64-release">rel</td>
-          <td id="android-clang-arm64-asan">asan</td>
         </tr>
       </thead>
       <tbody id="cls">
diff --git a/src/ftrace_reader/ftrace_procfs_integrationtest.cc b/src/ftrace_reader/ftrace_procfs_integrationtest.cc
index 655f77e..19690d8 100644
--- a/src/ftrace_reader/ftrace_procfs_integrationtest.cc
+++ b/src/ftrace_reader/ftrace_procfs_integrationtest.cc
@@ -128,7 +128,7 @@
   EXPECT_TRUE(ftrace.OpenPipeForCpu(0));
 }
 
-TEST(FtraceProcfsIntegrationTest, CanSetBufferSize) {
+TEST(FtraceProcfsIntegrationTest, DISABLED_CanSetBufferSize) {
   FtraceProcfs ftrace(kTracingPath);
   EXPECT_TRUE(ftrace.SetCpuBufferSizeInPages(4ul));
   EXPECT_EQ(ReadFile("buffer_size_kb"), "16\n");  // (4096 * 4) / 1024
diff --git a/src/ftrace_reader/test/explorer.html b/src/ftrace_reader/test/explorer.html
index f8ffc4f..4d15600 100755
--- a/src/ftrace_reader/test/explorer.html
+++ b/src/ftrace_reader/test/explorer.html
@@ -113,8 +113,8 @@
 }
 
 </style>
-<script src="https://unpkg.com/mithril"></script>
-<script src="http://unpkg.com/diff"></script>
+<script src="//unpkg.com/mithril"></script>
+<script src="//unpkg.com/diff"></script>
 
 <div id="content"></div>
 
@@ -124,13 +124,14 @@
 
 let THIS_URL = window.location.href;
 let gDirectoryToFormatFiles;
-let gNamesToRecords;
+let gNamesToRecords = new Map();
 let gFilterText = '';
 let gDisplayedRecords = null;
 let gDisplayedName = null;
 let gADevice = null;
 let gBDevice = null;
 let gDevices = []
+let gCache = new Map();
 
 function isdir(url) {
   return url[url.length - 1] == '/';
@@ -144,26 +145,48 @@
   return url.slice(0, url.lastIndexOf('/')+1);
 }
 
-let getdirectories = url => listdir(url).filter(isdir);
-let getfiles = url => listdir(url).filter(isfile);
+let getdirectories = url => listdir(url).then(xs => xs.filter(isdir));
+let getfiles = url => listdir(url).then(xs => xs.filter(isfile));
+
+function fetch(url) {
+  return new Promise(function(resolve, reject) {
+    let xhr = new XMLHttpRequest();
+    xhr.open("GET", url, true);
+    xhr.onload = e => resolve({
+      text: () => Promise.resolve(xhr.responseText),
+    });
+    xhr.onerror = e => reject(xhr.statusText);
+    xhr.send(null);
+  });
+}
 
 function geturl(url) {
-  let request = new XMLHttpRequest();
-  request.open("GET", url, false);
-  request.send(null);
-  let text = request.responseText;
-  return text;
+  console.log('Fetch:', url);
+  if (gCache.has(url)) return Promise.resolve(gCache.get(url));
+  return fetch(url).then(r => r.text()).then(text => {
+    gCache.set(url, text);
+    return text;
+  });
 }
 
 function listdir(url) {
-  let text = geturl(url);
-  let re = new RegExp('<li><a href="(.+)">(.+)</a>', 'g');
-  let match;
-  let matches = [];
-  while (match = re.exec(text)) {
-    matches.push(match[1]);
-  }
-  return matches;
+  return geturl(url).then(text => {
+    let re = new RegExp('<li><a href="(.+)">(.+)</a>', 'g');
+    if (window.location.href.indexOf('x20') != -1)
+      re = new RegExp('[^>]</td>\n<td>\n<a href="(.+)">(.+)</a>', 'g');
+    let match;
+    let matches = [];
+    while (match = re.exec(text)) {
+      matches.push(match[1]);
+    }
+    return matches;
+  });
+}
+
+function getfiletext(url) {
+  if (gCache.has(url)) return gCache.get(url);
+  geturl(url).then(() => m.redraw());
+  return "";
 }
 
 function makeFormatFileRecord(base_url, device, group_name, event_name) {
@@ -175,20 +198,29 @@
 
 function findFormatFilesByDirectory() {
   let url = getdir(THIS_URL) + 'data/';
-  let directories = getdirectories(url);
   let directoryToFormatFiles = new Map();
-  for (let device of directories) {
-    directoryToFormatFiles.set(device, []);
-    for (let group_name of getdirectories(url + device + 'events/')) {
-      let innerUrl = url + device + 'events/' + group_name;
-      let event_names = getdirectories(innerUrl);
-      let records = event_names.map(event_name => makeFormatFileRecord(url, device, group_name, event_name));
-      for (let record of records) {
-        directoryToFormatFiles.get(device).push(record);
-      }
-    }
-  }
-  return directoryToFormatFiles;
+  return getdirectories(url).then(directories => {
+    return Promise.all(directories.map(device => {
+      directoryToFormatFiles.set(device, []);
+      return getdirectories(url + device + 'events/').then(groups => {
+        return Promise.all(groups.map(group_name => {
+          let innerUrl = url + device + 'events/' + group_name;
+          return getdirectories(innerUrl).then(event_names => {
+            event_names.map(event_name => {
+              let record = makeFormatFileRecord(
+                  url,
+                  device,
+                  group_name,
+                  event_name);
+              directoryToFormatFiles.get(device).push(record);
+            });
+          });
+        }));
+      });
+    }));
+  }).then(_ => {
+    return directoryToFormatFiles
+  });
 }
 
 class FormatFileRecord {
@@ -232,8 +264,8 @@
   let r2 = records.filter(r => r.device == gBDevice)[0];
   if (!r1) r1 = records[0];
   if (!r2) r2 = records[0];
-  let f1 = geturl(r1.url);
-  let f2 = geturl(r2.url);
+  let f1 = getfiletext(r1.url);
+  let f2 = getfiletext(r2.url);
   let diff = JsDiff.diffChars(f1, f2);
 
   let es = diff.map(part => {
@@ -260,22 +292,11 @@
   ]);
 }
 
-gDirectoryToFormatFiles = findFormatFilesByDirectory();
-gNamesToRecords = new Map();
-gDevices = Array.from(gDirectoryToFormatFiles.keys());
-for (let records of gDirectoryToFormatFiles.values()) {
-  for (let record of records) {
-    if (gNamesToRecords.get(record.name) == null) {
-      gNamesToRecords.set(record.name, []);
-    }
-    gNamesToRecords.get(record.name).push(record);
-  }
-}
-[gADevice, gBDevice] = gDevices;
-
 let root = document.getElementById('content');
 let App = {
   view: function() {
+    if (!gDirectoryToFormatFiles)
+      return m('.main', 'Loading...');
     return m('.main', [
       contextView(gFilterText, gNamesToRecords),
       focusView(gDisplayedRecords),
@@ -283,6 +304,24 @@
   }
 }
 m.mount(root, App);
+
+findFormatFilesByDirectory().then(data => {
+  gDirectoryToFormatFiles = data;
+  gNamesToRecords = new Map();
+  gDevices = Array.from(gDirectoryToFormatFiles.keys());
+  for (let records of gDirectoryToFormatFiles.values()) {
+    for (let record of records) {
+      geturl(record.url);
+      if (gNamesToRecords.get(record.name) == null) {
+        gNamesToRecords.set(record.name, []);
+      }
+      gNamesToRecords.get(record.name).push(record);
+    }
+  }
+  [gADevice, gBDevice] = gDevices;
+  m.redraw();
+});
+
 </script>
 
 <!--
diff --git a/src/tracing/core/trace_writer_impl.cc b/src/tracing/core/trace_writer_impl.cc
index 07a4bd1..f38128e 100644
--- a/src/tracing/core/trace_writer_impl.cc
+++ b/src/tracing/core/trace_writer_impl.cc
@@ -111,8 +111,6 @@
     cur_chunk_.SetFlag(ChunkHeader::kLastPacketContinuesOnNextChunk);
     WriteRedundantVarInt(partial_size, cur_packet_->size_field());
 
-// TODO(primiano): temporarily disabled due to b/72685438.
-#if 0
     // Descend in the stack of non-finalized nested submessages (if any) and
     // detour their |size_field| into the |patch_list_|. At this point we have
     // to release the chunk and they cannot write anymore into that.
@@ -120,15 +118,26 @@
     for (auto* nested_msg = cur_packet_->nested_message(); nested_msg;
          nested_msg = nested_msg->nested_message()) {
       uint8_t* const cur_hdr = nested_msg->size_field();
-      PERFETTO_DCHECK(cur_hdr >= cur_chunk_.payload_begin() &&
-                      cur_hdr + kMessageLengthFieldSize <= cur_chunk_.end());
+#if PERFETTO_DCHECK_IS_ON()
+      // Ensure that the size field of the nested message either points to
+      // somewhere in the current chunk or a size field of a patch in the
+      // patch list.
+      bool size_in_current_chunk =
+          cur_hdr >= cur_chunk_.payload_begin() &&
+          cur_hdr + kMessageLengthFieldSize <= cur_chunk_.end();
+      if (!size_in_current_chunk) {
+        auto patch_it = std::find_if(
+            patch_list_.begin(), patch_list_.end(),
+            [cur_hdr](const Patch& p) { return p.size_field == cur_hdr; });
+        PERFETTO_DCHECK(patch_it != patch_list_.end());
+      }
+#endif
       auto cur_hdr_offset = static_cast<uint16_t>(cur_hdr - cur_chunk_.begin());
       patch_list_.emplace_front(cur_chunk_id_, cur_hdr_offset);
       Patch& patch = patch_list_.front();
       nested_msg->set_size_field(patch.size_field);
       PERFETTO_DLOG("Created new patchlist entry for protobuf nested message");
     }
-#endif
   }
 
   if (cur_chunk_.is_valid())
diff --git a/tools/android_emulators/arm.ini b/tools/android_emulators/arm.ini
deleted file mode 100644
index ee724ae..0000000
--- a/tools/android_emulators/arm.ini
+++ /dev/null
@@ -1,21 +0,0 @@
-avd.ini.encoding=UTF-8
-abi.type=armeabi-v7a
-disk.dataPartition.size=64M
-hw.accelerometer=no
-hw.audioInput=no
-hw.battery=no
-hw.camera.back=none
-hw.camera.front=none
-hw.cpu.arch=arm
-hw.dPad=no
-hw.gps=no
-hw.keyboard=yes
-hw.lcd.density=480
-hw.mainKeys=no
-hw.ramSize=512
-hw.sdCard=no
-hw.sensors.orientation=yes
-hw.sensors.proximity=yes
-hw.trackBall=no
-image.sysdir.1=system-images/android-24/default/armeabi-v7a/
-vm.heapSize=64
diff --git a/tools/android_emulators/arm64.ini b/tools/android_emulators/arm64.ini
deleted file mode 100644
index c1d56f8..0000000
--- a/tools/android_emulators/arm64.ini
+++ /dev/null
@@ -1,21 +0,0 @@
-avd.ini.encoding=UTF-8
-abi.type=arm64-v8a
-disk.dataPartition.size=64M
-hw.accelerometer=no
-hw.audioInput=no
-hw.battery=no
-hw.camera.back=none
-hw.camera.front=none
-hw.cpu.arch=arm64
-hw.dPad=no
-hw.gps=no
-hw.keyboard=yes
-hw.lcd.density=480
-hw.mainKeys=no
-hw.ramSize=512
-hw.sdCard=no
-hw.sensors.orientation=yes
-hw.sensors.proximity=yes
-hw.trackBall=no
-image.sysdir.1=system-images/android-24/default/arm64-v8a/
-vm.heapSize=64
diff --git a/tools/install-build-deps b/tools/install-build-deps
index 30e9b3c..f69dc12 100755
--- a/tools/install-build-deps
+++ b/tools/install-build-deps
@@ -152,15 +152,10 @@
 
 # Dependencies required to run Android tests.
 TEST_DEPS_ANDROID = [
-  # tools.zip contains the emulator binaries.
-  ('buildtools/android_sdk/tools.zip',
-   'https://dl.google.com/android/repository/tools_r25.2.5-macosx.zip',
-   'd2168d963ac5b616e3d3ddaf21511d084baf3659',
-   'darwin'
-  ),
-  ('buildtools/android_sdk/tools.zip',
-   'https://dl.google.com/android/repository/tools_r25.2.5-linux.zip',
-   '72df3aa1988c0a9003ccdfd7a13a7b8bd0f47fc1',
+  # Android emulator images.
+  ('buildtools/aosp-arm.zip',
+   'https://storage.googleapis.com/perfetto/aosp-02022018-arm.zip',
+   'a480d5e7d3ca888b0a58fe15ce76b1791537429a',
    'linux2'
   ),
 
@@ -176,16 +171,11 @@
    'linux2'
   ),
 
-  # Android emulator images.
-  ('buildtools/android_sdk/system-images/android-24/default/armeabi-v7a.zip',
-   'https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-24_r07.zip',
-   '3454546b4eed2d6c3dd06d47757d6da9f4176033',
-   'android-arm'
-  ),
-  ('buildtools/android_sdk/system-images/android-24/default/arm64-v8a.zip',
-   'https://dl.google.com/android/repository/sys-img/android/arm64-v8a-24_r07.zip',
-   'e8ab2e49e4efe4b064232b33b5eeaded61437d7f',
-   'android-arm64'
+  # Android emulator binaries.
+  ('buildtools/emulator',
+   'https://android.googlesource.com/platform/prebuilts/android-emulator.git',
+   '4b260028dc27bc92c39bee9129cb2ba839970956',
+   'all'
   ),
 ]
 
@@ -235,7 +225,9 @@
     shutil.rmtree(path)
   MkdirRecursive(path)
   logging.info('Fetching %s @ %s into %s', git_url, revision, path)
-  subprocess.check_call(['git', 'clone', git_url, path], cwd=path)
+  subprocess.check_call(['git', 'init', path], cwd=path)
+  subprocess.check_call(
+    ['git', 'fetch', '--depth', '1', git_url, revision], cwd=path)
   subprocess.check_call(['git', 'checkout', revision, '--quiet'], cwd=path)
   assert(IsGitRepoCheckoutOutAtRevision(path, revision))
 
@@ -243,15 +235,12 @@
 def Main():
   parser = argparse.ArgumentParser()
   parser.add_argument('--no-android', action='store_true')
-  parser.add_argument('--emulator', action='append', help='arm|arm64')
   args = parser.parse_args()
-  andriod_emulator_images = ['android-' + arch for arch in args.emulator or []]
   deps = BUILD_DEPS_HOST
   if not args.no_android:
     deps += BUILD_DEPS_ANDROID + TEST_DEPS_ANDROID
   for rel_path, url, expected_sha1, platform in deps:
-    if (platform != 'all' and platform != sys.platform and
-        platform not in andriod_emulator_images):
+    if (platform != 'all' and platform != sys.platform):
       continue
     local_path = os.path.join(ROOT_DIR, rel_path)
     if url.endswith('.git'):
diff --git a/tools/run_android_emulator b/tools/run_android_emulator
index 6a923c7..4f6d151 100755
--- a/tools/run_android_emulator
+++ b/tools/run_android_emulator
@@ -23,38 +23,28 @@
   parser = argparse.ArgumentParser()
   parser.add_argument('--verbose', '-v', action='store_true')
   parser.add_argument('--pid', help='(optional) save pid into given file')
-  parser.add_argument('image', help='arm|arm64 (see //tools/android_emulators)')
   args = parser.parse_args()
 
   root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-  ini = os.path.join(root_dir, 'tools', 'android_emulators', args.image + '.ini')
-  assert os.path.exists(ini), 'File not found: ' + ini
+  emulator_root = os.path.join(
+    root_dir, 'buildtools', 'emulator', 'linux-x86_64')
+  emulator_path = os.path.join(emulator_root, 'qemu', 'linux-x86_64')
+  aosp_path = os.path.join(root_dir, 'buildtools', 'aosp-arm')
 
-  avd_dir = os.path.join(root_dir, 'buildtools', 'emulator_images')
-  if not os.path.exists(avd_dir):
-    os.makedirs(avd_dir)
-
-  emu_img_dir = os.path.join(avd_dir, args.image + '.avd')
-  if not os.path.exists(emu_img_dir):
-    os.makedirs(emu_img_dir)
-  shutil.copyfile(ini, os.path.join(emu_img_dir, 'config.ini'))
-
-  with open(os.path.join(avd_dir, args.image + '.ini'), 'w') as f:
-    f.write('path=' + emu_img_dir)
-
-  sdk_dir = os.path.join(root_dir, 'buildtools', 'android_sdk')
   env = {
       # Travis CI doesn't set this and causes the emulator to fallback in
       # 32-bit mode with a "Cannot decide host bitness because $SHELL" error.
       'SHELL': '/bin/bash',
-      'ANDROID_EMULATOR_DEBUG': '1' if args.verbose else '0',
-      'ANDROID_SDK_ROOT': sdk_dir,
-      'ANDROID_AVD_HOME': avd_dir,
-      'DYLD_LIBRARY_PATH': os.path.join(sdk_dir, 'tools', 'lib64', 'qt', 'lib'),
+      'LD_LIBRARY_PATH': os.path.join(emulator_root, 'lib64', 'qt', 'lib'),
   }
-  emulator_bin = os.path.join(sdk_dir, 'tools', 'emulator')
-  emulator_args = ['-no-window', '-no-snapshot',  '-gpu', 'off', '-wipe-data',
-                   '-avd', args.image]
+  emulator_bin = os.path.join(emulator_path, 'qemu-system-armel')
+  emulator_args = ['-no-window', '-no-snapshot',  '-gpu', 'off', '-no-accel',
+                   '-sysdir', aosp_path,
+                   '-system', os.path.join(aosp_path, 'system-qemu.img'),
+                   '-kernel', os.path.join(aosp_path, 'kernel-ranchu'),
+                   '-ramdisk', os.path.join(aosp_path, 'ramdisk.img'),
+                   '-vendor', os.path.join(aosp_path, 'vendor-qemu.img'),
+                   '-data', os.path.join(aosp_path, 'userdata-qemu.img')]
   print '\n'.join('='.join(x) for x in env.items())
   print ' '.join([emulator_bin] + emulator_args)
   if args.pid:
diff --git a/tools/run_android_test b/tools/run_android_test
index b34408e..37c1a36 100755
--- a/tools/run_android_test
+++ b/tools/run_android_test
@@ -124,7 +124,7 @@
 
   print 'Waiting for device ...'
   AdbCall('wait-for-device')
-  WaitForBootCompletion()
+  # WaitForBootCompletion()
   AdbCall('root')
   AdbCall('wait-for-device')
 
