diff --git a/examples/BUILD.gn b/examples/BUILD.gn
index 68e9f4c..1c02c89 100644
--- a/examples/BUILD.gn
+++ b/examples/BUILD.gn
@@ -25,7 +25,6 @@
   if (is_android) {
     deps += [
       ":AppRTCMobile",
-      ":AppRTCMobile_stubbed_video_io_test_apk",
       ":AppRTCMobile_test_apk",
       ":libwebrtc_unity",
     ]
@@ -180,51 +179,6 @@
       "//third_party/junit",
     ]
   }
-
-  group("video_quality_loopback_test") {
-    testonly = true
-
-    deps = [
-      ":AppRTCMobile_stubbed_video_io_test_apk",
-      "../rtc_tools:frame_analyzer_host",
-    ]
-
-    data = [
-      "../build/android/adb_reverse_forwarder.py",
-      "../examples/androidtests/video_quality_loopback_test.py",
-      "../resources/reference_video_640x360_30fps.y4m",
-      "../rtc_tools/compare_videos.py",
-      "../rtc_tools/testing/prebuilt_apprtc.zip",
-      "../rtc_tools/testing/golang/linux/go.tar.gz",
-      "../rtc_tools/testing/build_apprtc.py",
-      "../rtc_tools/testing/utils.py",
-      "../tools_webrtc/video_quality_toolchain/linux/ffmpeg",
-      "${root_out_dir}/frame_analyzer_host",
-    ]
-  }
-
-  rtc_instrumentation_test_apk("AppRTCMobile_stubbed_video_io_test_apk") {
-    apk_name = "AppRTCMobileTestStubbedVideoIO"
-    android_manifest = "androidtests/AndroidManifest.xml"
-
-    java_files = [ "androidtests/src/org/appspot/apprtc/test/CallActivityStubbedInputOutputTest.java" ]
-
-    apk_under_test = ":AppRTCMobile"
-
-    deps = [
-      ":AppRTCMobile_javalib",
-      "../sdk/android:libjingle_peerconnection_java",
-      "//third_party/android_support_test_runner:rules_java",
-      "//third_party/android_support_test_runner:runner_java",
-      "//third_party/espresso:espresso_all_java",
-      "//third_party/hamcrest:hamcrest_java",
-      "//third_party/junit",
-    ]
-
-    data = [
-      "../resources/reference_video_640x360_30fps.y4m",
-    ]
-  }
 }
 
 if (is_ios || (is_mac && target_cpu != "x86")) {
diff --git a/examples/androidtests/src/org/appspot/apprtc/test/CallActivityStubbedInputOutputTest.java b/examples/androidtests/src/org/appspot/apprtc/test/CallActivityStubbedInputOutputTest.java
deleted file mode 100644
index 91cbc7f..0000000
--- a/examples/androidtests/src/org/appspot/apprtc/test/CallActivityStubbedInputOutputTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright 2016 The WebRTC Project Authors. All rights reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-package org.appspot.apprtc.test;
-
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.Espresso.onView;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Environment;
-import android.support.test.espresso.IdlingPolicies;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.test.InstrumentationRegistry;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-import org.appspot.apprtc.CallActivity;
-import org.appspot.apprtc.R;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Used to start a loopback call with video input from file and video output also to file.
- * The test case is a building block in other testing for video quality.
- */
-@RunWith(AndroidJUnit4.class)
-@LargeTest
-public class CallActivityStubbedInputOutputTest {
-  private static final String TAG = "CallActivityStubbedInputOutputTest";
-
-  @Rule
-  public ActivityTestRule<CallActivity> rule = new ActivityTestRule<CallActivity>(
-      CallActivity.class) {
-    @Override
-    protected Intent getActivityIntent() {
-      Context context = InstrumentationRegistry.getContext();
-      Intent intent = new Intent("android.intent.action.VIEW", Uri.parse("http://localhost:9999"));
-
-      intent.putExtra(CallActivity.EXTRA_USE_VALUES_FROM_INTENT, true);
-
-      intent.putExtra(CallActivity.EXTRA_LOOPBACK, true);
-      intent.putExtra(CallActivity.EXTRA_AUDIOCODEC, "OPUS");
-      intent.putExtra(CallActivity.EXTRA_VIDEOCODEC, "VP8");
-      intent.putExtra(CallActivity.EXTRA_CAPTURETOTEXTURE_ENABLED, false);
-      intent.putExtra(CallActivity.EXTRA_CAMERA2, false);
-      intent.putExtra(CallActivity.EXTRA_ROOMID, UUID.randomUUID().toString().substring(0, 8));
-      // TODO false for wstls to disable https, should be option later or if URL is http
-      intent.putExtra(CallActivity.EXTRA_URLPARAMETERS,
-          "debug=loopback&ts=&wshpp=localhost:8089&wstls=false");
-
-      intent.putExtra(CallActivity.EXTRA_VIDEO_FILE_AS_CAMERA,
-          Environment.getExternalStorageDirectory().getAbsolutePath()
-              + "/chromium_tests_root/resources/reference_video_640x360_30fps.y4m");
-
-      intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE,
-          Environment.getExternalStorageDirectory().getAbsolutePath() + "/output.y4m");
-      intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH, 640);
-      intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT, 360);
-
-      return intent;
-    }
-  };
-
-  @Test
-  public void testLoopback() throws InterruptedException {
-    // The time to write down the data during closing of the program can take a while.
-    IdlingPolicies.setMasterPolicyTimeout(240000, TimeUnit.MILLISECONDS);
-
-    // During the time we sleep it will record video.
-    Thread.sleep(8000);
-
-    // Click on hang-up button.
-    onView(withId(R.id.button_call_disconnect)).perform(click());
-  }
-}
diff --git a/examples/androidtests/video_quality_loopback_test.py b/examples/androidtests/video_quality_loopback_test.py
deleted file mode 100755
index fc198a8..0000000
--- a/examples/androidtests/video_quality_loopback_test.py
+++ /dev/null
@@ -1,237 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS.  All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-"""
-This script is the wrapper that starts a loopback call with stubbed video in
-and out. It then analyses the video quality of the output video against the
-reference input video.
-
-It expect to be given the webrtc output build directory as the first argument
-all other arguments are optional.
-
-It assumes you have a Android device plugged in.
-"""
-
-import argparse
-import json
-import logging
-import os
-import subprocess
-import sys
-import tempfile
-import time
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir))
-RTC_TOOLS_DIR = os.path.join(SRC_DIR, 'rtc_tools', 'testing')
-TOOLCHAIN_DIR = os.path.join(SRC_DIR, 'tools_webrtc', 'video_quality_toolchain',
-                             'linux')
-BAD_DEVICES_JSON = os.path.join(SRC_DIR,
-                                os.environ.get('CHROMIUM_OUT_DIR', 'out'),
-                                'bad_devices.json')
-
-sys.path.append(RTC_TOOLS_DIR)
-import utils
-
-
-class Error(Exception):
-  pass
-
-
-class VideoQualityTestError(Error):
-  pass
-
-
-def _RunCommand(argv, **kwargs):
-  logging.info('Running %r', argv)
-  subprocess.check_call(argv, **kwargs)
-
-
-def _RunCommandWithOutput(argv, **kwargs):
-  logging.info('Running %r', argv)
-  return subprocess.check_output(argv, **kwargs)
-
-
-def _RunBackgroundCommand(argv):
-  logging.info('Running %r', argv)
-  process = subprocess.Popen(argv)
-  time.sleep(0.5)
-  status = process.poll()
-  if status:  # is not None or 0
-    raise subprocess.CalledProcessError(status, argv)
-  return process
-
-
-def CreateEmptyDir(suggested_dir):
-  if not suggested_dir:
-    return tempfile.mkdtemp()
-  utils.RemoveDirectory(suggested_dir)
-  os.makedirs(suggested_dir)
-  return suggested_dir
-
-
-def _ParseArgs():
-  parser = argparse.ArgumentParser(description='Start loopback video analysis.')
-  parser.add_argument('build_dir_android',
-      help='The path to the build directory for Android.')
-  parser.add_argument('--temp_dir',
-      help='A temporary directory to put the output.')
-  parser.add_argument('--adb-path', help='Path to adb binary.', default='adb')
-  parser.add_argument('--num-retries', default='0',
-                      help='Number of times to retry the test on Android.')
-  parser.add_argument('--isolated-script-test-perf-output',
-      help='Where to store perf results in chartjson format.', default=None)
-  parser.add_argument('--isolated-script-test-output', default=None,
-      help='Path to output an empty JSON file which Chromium infra requires.')
-  args, unknown_args = parser.parse_known_args()
-
-  # Ignore Chromium-specific flags
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--test-launcher-summary-output',
-                      type=str, default=None)
-
-  parser.parse_args(unknown_args)
-
-  return args
-
-
-def SelectAndroidDevice(adb_path):
-  # Select an Android device in case multiple are connected.
-  try:
-    with open(BAD_DEVICES_JSON) as bad_devices_file:
-      bad_devices = json.load(bad_devices_file)
-  except IOError:
-    if os.environ.get('CHROME_HEADLESS'):
-      logging.warning('Cannot read %r', BAD_DEVICES_JSON)
-    bad_devices = {}
-
-  for line in _RunCommandWithOutput([adb_path, 'devices']).splitlines():
-    if line.endswith('\tdevice'):
-      android_device = line.split('\t')[0]
-      if android_device not in bad_devices:
-        return android_device
-  raise VideoQualityTestError('Cannot find any connected Android device.')
-
-
-def SetUpTools(android_device, temp_dir, processes):
-  # Extract AppRTC.
-  apprtc_archive = os.path.join(RTC_TOOLS_DIR, 'prebuilt_apprtc.zip')
-  golang_archive = os.path.join(RTC_TOOLS_DIR, 'golang', 'linux', 'go.tar.gz')
-
-  utils.UnpackArchiveTo(apprtc_archive, temp_dir)
-  utils.UnpackArchiveTo(golang_archive, temp_dir)
-
-  # Build AppRTC.
-  build_apprtc_script = os.path.join(RTC_TOOLS_DIR, 'build_apprtc.py')
-  apprtc_dir = os.path.join(temp_dir, 'apprtc')
-  go_dir = os.path.join(temp_dir, 'go')
-  collider_dir = os.path.join(temp_dir, 'collider')
-
-  _RunCommand([sys.executable, build_apprtc_script, apprtc_dir, go_dir,
-               collider_dir])
-
-  # Start AppRTC Server.
-  dev_appserver = os.path.join(temp_dir, 'apprtc', 'temp', 'google-cloud-sdk',
-                              'bin', 'dev_appserver.py')
-  appengine_dir = os.path.join(temp_dir, 'apprtc', 'out', 'app_engine')
-  processes.append(_RunBackgroundCommand([
-      sys.executable, dev_appserver, appengine_dir, '--port=9999',
-      '--admin_port=9998', '--skip_sdk_update_check', '--clear_datastore=yes']))
-
-  # Start Collider.
-  collider_path = os.path.join(temp_dir, 'collider', 'collidermain')
-  processes.append(_RunBackgroundCommand([
-      collider_path, '-tls=false', '-port=8089',
-      '-room-server=http://localhost:9999']))
-
-  # Start adb reverse forwarder.
-  reverseforwarder_path = os.path.join(
-      SRC_DIR, 'build', 'android', 'adb_reverse_forwarder.py')
-  processes.append(_RunBackgroundCommand([
-      reverseforwarder_path, '--device', android_device, '9999', '9999', '8089',
-      '8089']))
-
-
-def RunTest(android_device, adb_path, build_dir, temp_dir, num_retries,
-            chartjson_result_file):
-  ffmpeg_path = os.path.join(TOOLCHAIN_DIR, 'ffmpeg')
-  def ConvertVideo(input_video, output_video):
-    _RunCommand([ffmpeg_path, '-y', '-i', input_video, output_video])
-
-  # Start loopback call and record video.
-  test_script = os.path.join(
-      build_dir, 'bin', 'run_AppRTCMobile_stubbed_video_io_test_apk')
-  _RunCommand([test_script, '--device', android_device,
-               '--num-retries', num_retries])
-
-  # Pull the recorded video.
-  test_video = os.path.join(temp_dir, 'test_video.y4m')
-  _RunCommand([adb_path, '-s', android_device,
-              'pull', '/sdcard/output.y4m', test_video])
-
-  # Convert the recorded and reference videos to YUV.
-  reference_video = os.path.join(SRC_DIR,
-      'resources', 'reference_video_640x360_30fps.y4m')
-
-  test_video_yuv = os.path.join(temp_dir, 'test_video.yuv')
-  reference_video_yuv = os.path.join(
-      temp_dir, 'reference_video_640x360_30fps.yuv')
-
-  ConvertVideo(test_video, test_video_yuv)
-  ConvertVideo(reference_video, reference_video_yuv)
-
-  # Run comparison script.
-  compare_script = os.path.join(SRC_DIR, 'rtc_tools', 'compare_videos.py')
-  frame_analyzer = os.path.join(build_dir, 'frame_analyzer_host')
-
-  args = [
-      '--ref_video', reference_video_yuv,
-      '--test_video', test_video_yuv,
-      '--yuv_frame_width', '640',
-      '--yuv_frame_height', '360',
-      '--frame_analyzer', frame_analyzer,
-  ]
-  if chartjson_result_file:
-    args.extend(['--chartjson_result_file', chartjson_result_file])
-
-  _RunCommand([sys.executable, compare_script] + args)
-
-
-def main():
-  logging.basicConfig(level=logging.INFO)
-
-  args = _ParseArgs()
-
-  temp_dir = args.temp_dir
-  build_dir = args.build_dir_android
-  adb_path = args.adb_path
-
-  processes = []
-  temp_dir = CreateEmptyDir(temp_dir)
-  try:
-    android_device = SelectAndroidDevice(adb_path)
-    SetUpTools(android_device, temp_dir, processes)
-    RunTest(android_device, adb_path, build_dir, temp_dir, args.num_retries,
-            args.isolated_script_test_perf_output)
-  finally:
-    for process in processes:
-      if process:
-        process.terminate()
-        process.wait()
-
-    utils.RemoveDirectory(temp_dir)
-
-  if args.isolated_script_test_output:
-    with open(args.isolated_script_test_output, 'w') as f:
-      f.write('{"version": 3}')
-
-
-if __name__ == '__main__':
-  sys.exit(main())
