remove code for vti dashboard

Bug: 210322427
Test: compile
Change-Id: I3e0941ac4e5938af21981340c40547f58c7709b4
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 6c42e34..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,53 +0,0 @@
-# Google App Engine generated folder
-appengine-generated/
-
-# Secutiry Key file folder
-src/main/resources/keys/
-src/main/resources/bug_tracking_system/**/*.tpl
-
-# Gradle
-.gradle/
-build/
-
-# Java
-*.class
-
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# Package Files #
-*.jar
-*.war
-*.ear
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
-
-# maven
-target/
-pom.xml.tag
-pom.xml.releaseBackup
-pom.xml.versionsBackup
-pom.xml.next
-release.properties
-dependency-reduced-pom.xml
-buildNumber.properties
-
-service-account.json
-
-# intellij
-.idea/
-*.iml
-
-# Eclipse files
-.project
-.classpath
-.settings
-
-# vim
-[._]*.s[a-w][a-z]
-[._]s[a-w][a-z]
-Session.vim
-.netrwhist
-*~
-tags
diff --git a/OWNERS b/OWNERS
deleted file mode 100644
index 2132cd7..0000000
--- a/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-yim@google.com
-dchon@google.com
-hyunwooko@google.com
-jongmok@google.com
-younggyu@google.com
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
deleted file mode 100644
index 38d924d..0000000
--- a/PREUPLOAD.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-[Builtin Hooks]
-commit_msg_bug_field = true
-commit_msg_test_field = true
-# Turn on google java format checking.
-google_java_format = true
-
diff --git a/README.md b/README.md
deleted file mode 100644
index 5a86a0e..0000000
--- a/README.md
+++ /dev/null
@@ -1,259 +0,0 @@
-# VTS Dashboard
-
-## Introduction
-
-The VTS Dashboard displays the summarized results of the Multi Device Tests along with graphs.
-
-## Installation
-
-### Steps to run locally:
-
-1. Google App Engine uses Java 8. Install Java 8 before running running locally:
-   'sudo apt install openjdk-8-jdk'
-
-   To use java 8:
-   Copy the following lines in ~/.bashrc :
-
-```
-    function setup_jdk() {
-      # Remove the current JDK from PATH
-      if [ -n "$JAVA_HOME" ] ; then
-        PATH=${PATH/$JAVA_HOME\/bin:/}
-      fi
-      export JAVA_HOME=$1
-      export PATH=$JAVA_HOME/bin:$PATH
-    }
-
-    function use_java8() {
-    #  setup_jdk /usr/java/jre1.8.0_73
-      setup_jdk /usr/lib/jvm/java-8-openjdk-amd64
-    }
-
-    Then from cmd:
-    $ use_java8
-```
-
-2. Maven is used for build. Install Maven 3.3.9:
-   Download maven from:
-   https://maven.apache.org/download.cgi
-
-   Steps to Install Maven:
-   1) Unzip the Binary tar:
-      tar -zxf apache-maven-3.3.3-bin.tar.gz
-
-   2) Move the application directory to /usr/local
-      sudo cp -R apache-maven-3.3.3 /usr/local
-
-   3) Make a soft link in /usr/bin for universal access of mvn
-      sudo ln -s /usr/local/apache-maven-3.3.3/bin/mvn /usr/bin/mvn
-
-   4) Verify maven installation:
-      $ mvn -v
-
-      The output should resemble this:
-
-      Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T08:41:47-08:00)
-      Maven home: /opt/apache-maven-3.3.9
-      Java version: 1.8.0_45-internal, vendor: Oracle Corporation
-      Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
-      Default locale: en_US, platform encoding: UTF-8
-      OS name: "linux", version: "3.13.0-88-generic", arch: "amd64", family: "unix"
-
-3. Install Google Cloud SDK. Follow the instructions listed on official source:
-   https://cloud.google.com/sdk/docs/quickstart-linux
-
-   The default location where the application searches for a google-cloud-sdk is:
-   /usr/local/share/google/google-cloud-sdk
-
-   Therefore move the extracted folder to this location: /usr/local/share/google/
-
-   Otherwise, to have a custom location, specify the location of
-   google-cloud-sdk in test/vti/dashboard/pom.xml by putting the configuration:
-
-```
-   <configuration>
-     <gcloud_directory>PATH/TO/GCLOUD_DIRECTORY</gcloud_directory>
-   </configuration>
-```
-   within the 'com.google.appengine' plugin tag :
-
-## To run GAE on local machine:
-
-$ cd test/vti/dashboard
-$ mvn appengine:devserver
-
-## To deploy to Google App Engine
-
-$ cd test/vti/dashboard
-$ mvn appengine:update
-
-visit https://<YOUR-PROJECT-NAME>.appspot.com
-
-## Update config file through gcloud command
-
-You can deploy or update GAE's a config file without deploying the whole project.
-The next commands show how to do it.
-
-```
-gcloud app deploy --project=<YOUR-PROJECT-NAME> cron.xml
-gcloud app deploy --project=<YOUR-PROJECT-NAME> queue.xml
-gcloud app deploy --project=<YOUR-PROJECT-NAME> datastore-indexes.xml
-```
-
-## Test Data
-
-### Purpose
-
-When you start your local GAE server, you will see empty page as the local datastore do not have any data.
-So we need to put some sample data into local datastore so that developers are able to continue to
-develop new features or fix bugs. Thus, we developed the next two test APIs, which are only available
-in your local dev environment.
-
-```
-http://127.0.0.1:8080/api/test_data/report
-http://127.0.0.1:8080/api/test_data/plan
-```
-
-### How to set test data on json files for generating mock data on local dev server
-
-If you want to generate some mock data for your local development, you need to set some fake data
-on json files under the testdata folder. However, you need to abide by some rules in doing this,
-otherwise you will end up with errors from the mock data dev API.
-
-First, in test-plan-report-data.json, you need to set the same number of data under "testCaseNames"
-and "results". For example, if you put 5 elements of data in "testCaseNames", you should put the same
-number of data under "results".
-
-```json
-........
-"testCaseRunList": [
-  {
-    "testCaseNames": [
-      "stdatomic.atomic_exchange_64bit",
-      "stdatomic.atomic_compare_exchange_64bit",
-      "stdatomic.atomic_exchange_64bit",
-      "stdatomic.atomic_compare_exchange_64bit",
-      "stdatomic.atomic_exchange_64bit",
-      "stdatomic.atomic_compare_exchange_64bit"
-    ],
-    "results": [
-      2,
-      2,
-      2,
-      2,
-      2,
-      2
-    ]
-  }
-],
-........
-```
-
-Second, in test-report-data.json file, you need to make sure that "testModules" should have
-the "testName"'s value under "testRunList" and the "testTimes" should have the "startTimestamp"'s value
-in the test-report-data.json file.
-
-test-report-data.json
-```json
-......
-  "testRunList": [
-    {
-      "testName": "BionicUnitTests", <- "testModules" should be copied from here
-      "type": 1,
-      "startTimestamp":1515562811, <- "testTimes" should be copied from here
-......
-    {
-      "testName": "CpuProfilingTest", <- "testModules" should be copied from here
-      "type": 2,
-      "startTimestamp":1515562811, <- "testTimes" should be copied from here
-......
-```
-
-test-plan-report-data.json
-```json
-......
-  {
-    "testPlanName": "vts-serving-staging-fuzz",
-    "testModules": ["BionicUnitTests", "CpuProfilingTest"],
-    "testTimes": [1515562811, 1515562811]
-  },
-  {
-    "testPlanName": "vts-serving-staging-hal-conventional",
-    "testModules": ["BionicUnitTests", "CpuProfilingTest"],
-    "testTimes": [1515562811, 1515562811]
-  }
-......
-```
-"testModules" and "testTimes"'s elements order is also matter.
-
-### Command to generate mock data through API
-
-The next two commands will generate mock data in your local dev datastore.
-The execution order of the commands is very important, otherwise you can't find some of the data in your local datastore.
-Thus, please execute the below command as I wrote in order.
-
-```
-curl -d @testdata/test-report-data.json -m 30 -X POST http://127.0.0.1:8080/api/test_data/report -H "Content-Type: application/json" --verbose
-curl -d @testdata/test-plan-report-data.json -m 30 -X POST http://127.0.0.1:8080/api/test_data/plan -H "Content-Type: application/json" --verbose
-```
-
-## Monitoring
-
-The following steps list how to create a monitoring service for the VTS Dashboard.
-
-### Create a Stackdriver account
-
-1. Go to Google Cloud Platform Console:
-   http://console.developers.google.com
-
-2. In the Google Cloud Platform Console, select Stackdriver > Monitoring.
-   If your project is not in a Stackdriver account you'll see a message to
-   create a new project.
-
-3. Click Create new Stackdriver account and then Continue.
-
-4. With your project shown, click Create account.
-
-5. In the page, "Add Google Cloud Platform projects to monitor", click Continue to skip ahead.
-
-6. In the page, "Monitor AWS accounts", click Done to skip ahead.
-
-7. In a few seconds you see the following message:
-   "Finished Initial collection"
-   Click Launch Monitoring.
-
-8. In the page, "Get reports by email", click No reports and Continue.
-
-9. You will see your Stackdriver account dashboard.
-   Close the "Welcome to Stackdriver" banner if you don't need it.
-
-### Steps to create an uptime check and an alerting policy
-
-1. Go to Stack Monitoring console:
-   https://app.google.stackdriver.com/
-
-2. Go to Alerting > Uptime Checks in the top menu and then click Add Uptime Check.
-   You see the New Uptime Check panel.
-
-3. Fill in the following fields for the uptime check:
-
-    Check type: HTTP
-    Resource Type: Instance
-    Applies To: Single, lamp-1-vm
-    Leave the other fields with their default values.
-
-4. Click Test to verify your uptime check is working.
-
-5. Click Save. After you click on save you'll see a panel to
-   'Create Alerting Policy'
-
-6. Fill out the configuration for notifications and click save policy.
-
-### Test the check and alert
-
-This procedure can take up to fifteen minutes.
-
-To test the check and alert, go to the VM Instances page, select your instance, and click Stop from the top menu.
-You'll have to wait up to five minutes for the next uptime check to fail. The alert and notification don't happen until the next failure occurs.
-
-To correct the "problem," return to the VM Instances page, select your instance, and click Start from the top menu.
diff --git a/__init__.py b/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/__init__.py
+++ /dev/null
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 4663d2b..0000000
--- a/build.gradle
+++ /dev/null
@@ -1,280 +0,0 @@
-import org.apache.tools.ant.filters.ReplaceTokens
-import com.google.cloud.tools.gradle.appengine.core.DeployTask
-
-buildscript {
-    ext {
-        springBootVersion = '1.5.13.RELEASE'
-        objectifyVersion = '6.0'
-        jacksonVersion = '2.9.7'
-        googleCloudVersion = '0.47.0-alpha'
-        googleJavaFormatVersion = '0.7.1'
-        googleHttpClientVersion = '1.25.0'
-        lombokVersion = '1.18.4'
-        appGradlePluginVersion = '2.0.0-rc3'
-        protobufGradlePlugin = '0.8.7'
-        googleSheetsAPI = 'v4-rev548-1.25.0'
-    }
-    repositories {
-        jcenter()
-        mavenCentral()
-        maven {
-            url "https://plugins.gradle.org/m2/"
-        }
-        maven {
-            url 'https://oss.sonatype.org/content/repositories/snapshots/'
-        }
-    }
-    dependencies {
-        classpath "com.google.cloud.tools:appengine-gradle-plugin:${appGradlePluginVersion}"    // latest App Engine Gradle tasks
-        classpath "com.google.protobuf:protobuf-gradle-plugin:${protobufGradlePlugin}"
-        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
-    }
-}
-
-plugins {
-    id 'war'        // standard Web Archive plugin
-    id "com.github.sherter.google-java-format" version "0.7.1"
-}
-
-apply plugin: 'com.google.protobuf'
-apply plugin: 'com.google.cloud.tools.appengine-standard'  // App Engine tasks
-
-apply from: rootProject.file('gradle/profiles.gradle')
-
-group = 'com.android.vts'
-version = '4'
-description = "Google Android VTS dashboard"
-
-sourceCompatibility = 1.8
-targetCompatibility = 1.8
-
-
-repositories {
-    maven {
-        url 'https://oss.sonatype.org/content/repositories/snapshots' // SNAPSHOT repository (if needed)
-    }
-    mavenCentral()
-    jcenter()
-}
-
-dependencies {
-    compile 'com.google.appengine:appengine-api-1.0-sdk:+'  // Latest App Engine Api's
-    providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
-
-    compile 'jstl:jstl:1.2'
-
-    compile group: 'org.apache.commons', name: 'commons-lang3', version:'3.7'
-    compile group: 'org.apache.commons', name: 'commons-math3', version:'3.6.1'
-    compile group: 'commons-codec', name: 'commons-codec', version:'1.9'
-    compile group: 'com.google.cloud', name: 'google-cloud', version: "${googleCloudVersion}"
-    compile group: 'com.google.code.gson', name: 'gson', version:'2.7'
-    compile group: 'com.googlecode.objectify', name: 'objectify', version: "${objectifyVersion}"
-    compile group: 'org.json', name: 'json', version:'20180130'
-    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: "${jacksonVersion}"
-    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jacksonVersion}"
-    compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: "${jacksonVersion}"
-
-    compile group: 'com.google.apis', name: 'google-api-services-oauth2', version:'v1-rev136-1.23.0'
-    compile group: 'com.google.http-client', name: 'google-http-client', version: "${googleHttpClientVersion}"
-    compile group: 'com.google.http-client', name: 'google-http-client-protobuf', version: "${googleHttpClientVersion}"
-    compile group: 'com.google.visualization', name: 'visualization-datasource', version:'1.1.1'
-
-    compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.11.1'
-
-    compile(group: 'com.google.api-client', name: 'google-api-client', version: "${googleHttpClientVersion}") {
-        exclude(module: 'guava-jdk5')
-    }
-    compile group: 'com.google.oauth-client', name: 'google-oauth-client-jetty', version: "${googleHttpClientVersion}"
-    compile group: 'com.google.apis', name: 'google-api-services-sheets', version: "${googleSheetsAPI}"
-
-    testCompile group: 'junit', name: 'junit', version: '4.12'
-    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.21.0'
-    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version:'5.0.3'
-
-    testCompile 'com.google.appengine:appengine-testing:+'
-    testCompile 'com.google.appengine:appengine-api-stubs:+'
-    testCompile 'com.google.appengine:appengine-tools-sdk:+'
-
-    compile group: 'org.projectlombok', name: 'lombok', version: "${lombokVersion}"
-    annotationProcessor group: 'org.projectlombok', name: 'lombok', version: "${lombokVersion}"
-}
-
-// Always run unit tests
-appengineDeploy.dependsOn test
-appengineStage.dependsOn test
-
-googleJavaFormat {
-    toolVersion = '1.6'
-    options style: 'AOSP'
-    source = sourceSets*.allJava
-    include '**/*.java'
-    exclude '**/*Template.java'
-    exclude 'src/test/template_*'
-}
-
-sourceSets {
-    main {
-        proto {
-            srcDir '../test_serving/proto'
-            include 'TestScheduleConfigMessage.proto'
-        }
-        java {
-            srcDir 'src/main/java'
-        }
-    }
-}
-
-protobuf {
-    generateProtoTasks {
-        ofSourceSet('main').each { task ->
-            task.builtins {
-                python {
-                    outputSubDir = 'python'
-                }
-                java {
-                    outputSubDir = 'java'
-                }
-            }
-        }
-    }
-}
-
-appengine {  // App Engine tasks configuration
-    tools {
-        // configure the Cloud Sdk tooling
-    }
-
-    run {
-        environment = [
-                GOOGLE_CLOUD_PROJECT: "android-vts-staging",
-                // DATASTORE_USE_PROJECT_ID_AS_APP_ID: "true",
-        ]
-        port = 8080
-        jvmFlags = [
-                "-Xdebug",
-                "-Dappengine.fullscan.seconds=5"
-        ]
-    }
-    stage {
-        // configure staging for deployment
-    }
-    deploy {   // deploy configuration
-        version = project.property("appEngineVersion")
-        projectId = project.property("projectIdList")
-
-    }
-}
-
-test {
-    useJUnit()
-    testLogging.showStandardStreams = true
-    beforeTest { descriptor ->
-        logger.lifecycle("test: " + descriptor + "  Running")
-    }
-
-    onOutput { descriptor, event ->
-        logger.lifecycle("test: " + descriptor + ": " + event.message )
-    }
-    afterTest { descriptor, result ->
-        logger.lifecycle("test: " + descriptor + ": " + result )
-    }
-}
-
-tasks.whenTaskAdded { task ->
-    if (task.name =~ /generate.*Proto/) {
-        task.finalizedBy(copyGeneratedProtoFiles)
-    }
-}
-
-task copyGeneratedProtoFiles(type: Copy) {
-    into(projectDir)
-
-    from("build/generated/source/proto/main/java") {
-        into "src/main/java"
-    }
-    from("build/generated/source/proto/main/python") {
-        into "python"
-    }
-}
-
-
-tasks.addRule("Pattern: vtsGaeDeploy<ID>") { String taskName ->
-    if (taskName.startsWith("vtsGaeDeploy-")) {
-
-        def projectId = taskName.replace("vtsGaeDeploy-", "")
-        def version = project.property("appEngineVersion")
-
-        def appengineWebCopy = tasks.create(name: "appengineWebCopy-${projectId}", type: Copy) {
-            from "${webAppDirName}/WEB-INF/appengine-web.xml"
-            into "${appengine.stage.sourceDirectory}/WEB-INF"
-            filter(ReplaceTokens, tokens: [PROJECT_ID: projectId])
-        }
-        appengineWebCopy.dependsOn appengineStage
-        appengineWebCopy.mustRunAfter appengineStage
-
-        def gcsConfigCopy = task("gcsConfigCopy-${projectId}") {
-            doFirst {
-                println "============ resource folder processing ============"
-
-                if (project.loadConfigFromGcs.toBoolean()) {
-                    exec {
-                        println "The resources folder will be copied from GCS!"
-                        commandLine "gsutil",
-                                    "cp",
-                                    "-R",
-                                    "${project.gcsConfigPath}${project.mode}/dashboard/${projectId}/resources/*",
-                                    "$appengine.stage.stagingDirectory/WEB-INF/classes"
-                    }
-                } else {
-                    println "The local resource folder will be used!"
-                }
-            }
-
-            doLast {
-
-            }
-        }
-        gcsConfigCopy.dependsOn appengineWebCopy
-        gcsConfigCopy.mustRunAfter appengineWebCopy
-
-        def deployTaskList = [appengineDeploy]
-
-        def vtsGaeDeployTask = task(taskName) {
-
-            doFirst {
-                println "--------------> setup deploying tasks <-------------"
-            }
-
-            doLast {
-                def commandKeyList = [
-                        'enableAppengineDeployCron': appengineDeployCron,
-                        'enableAppengineDeployDispatch': appengineDeployDispatch,
-                        'enableAppengineDeployDos': appengineDeployDos,
-                        'enableAppengineDeployIndex': appengineDeployIndex,
-                        'enableAppengineDeployQueue': appengineDeployQueue
-                ]
-
-                commandKeyList.each { key, value ->
-                    if (project.hasProperty(key) && project.getProperty(key).toBoolean()) {
-                        deployTaskList.push(value)
-                    }
-                }
-            }
-        }
-
-        vtsGaeDeployTask.dependsOn gcsConfigCopy
-        vtsGaeDeployTask.mustRunAfter gcsConfigCopy
-        vtsGaeDeployTask.finalizedBy deployTaskList
-    }
-}
-
-task vtsGaeMultiDeploy {
-    dependsOn {
-        def taskList = []
-        def projectIdList = project.property("projectIdList")
-        projectIdList.split(",").each { projectId ->
-            taskList.push(tasks.findByName("vtsGaeDeploy-${projectId.trim()}".toString()))
-        }
-        return taskList
-    }
-}
diff --git a/gradle.properties b/gradle.properties
deleted file mode 100644
index 47dc117..0000000
--- a/gradle.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-
-loadConfigFromGcs=true
-
-mode=
-gcsConfigPath=
-
-projectIdList=
-
-appEngineVersion=
-
-enableAppengineDeployCron = true
-enableAppengineDeployDispatch = false
-enableAppengineDeployDos = false
-enableAppengineDeployIndex = true
-enableAppengineDeployQueue = true
diff --git a/gradle/profile_default.gradle b/gradle/profile_default.gradle
deleted file mode 100644
index e77dd58..0000000
--- a/gradle/profile_default.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-import org.apache.tools.ant.filters.ReplaceTokens
-
-processResources {
-    filter ReplaceTokens, tokens: [
-            "application.version": project.property("version")
-    ]
-}
diff --git a/gradle/profile_prod.gradle b/gradle/profile_prod.gradle
deleted file mode 100644
index b111dcc..0000000
--- a/gradle/profile_prod.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-import org.apache.tools.ant.filters.ReplaceTokens
-
-processResources {
-    filter ReplaceTokens, tokens: [
-            "application.version": project.property("application.version")
-    ]
-}
diff --git a/gradle/profile_staging.gradle b/gradle/profile_staging.gradle
deleted file mode 100644
index b111dcc..0000000
--- a/gradle/profile_staging.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-import org.apache.tools.ant.filters.ReplaceTokens
-
-processResources {
-    filter ReplaceTokens, tokens: [
-            "application.version": project.property("application.version")
-    ]
-}
diff --git a/gradle/profiles.gradle b/gradle/profiles.gradle
deleted file mode 100644
index 74855b6..0000000
--- a/gradle/profiles.gradle
+++ /dev/null
@@ -1,29 +0,0 @@
-// ----
-// How to use Profiles with -P arguments
-// ----
-//
-// Run gradle tasks with the -P argument to utilize a profile.
-//
-
-def prodProfiles = 'prod'
-def stagingProfiles = 'staging'
-def defaultProfiles = 'default'
-def propertyDrivenProfiles
-
-if (project.hasProperty('prod')) {
-    // Used for production environment
-    propertyDrivenProfiles = prodProfiles
-    apply from: rootProject.file('gradle/profile_prod.gradle');
-
-} else if (project.hasProperty('staging')) {
-    // Used for local development
-    propertyDrivenProfiles = stagingProfiles
-    apply from: rootProject.file('gradle/profile_staging.gradle');
-
-} else {
-    // Default when no profile property is specified, used for testing
-    propertyDrivenProfiles = defaultProfiles
-    apply from: rootProject.file('gradle/profile_default.gradle');
-}
-println 'Using profile: "' + propertyDrivenProfiles + '" for ' + project.getName()
-
diff --git a/proto/TestSuiteResultMessage_pb2.py b/proto/TestSuiteResultMessage_pb2.py
deleted file mode 100644
index 67195d2..0000000
--- a/proto/TestSuiteResultMessage_pb2.py
+++ /dev/null
@@ -1,242 +0,0 @@
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: vti/dashboard/proto/TestSuiteResultMessage.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-from vti.test_serving.proto import TestScheduleConfigMessage_pb2 as vti_dot_test__serving_dot_proto_dot_TestScheduleConfigMessage__pb2
-
-
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='vti/dashboard/proto/TestSuiteResultMessage.proto',
-  package='android.vts',
-  syntax='proto2',
-  serialized_pb=_b('\n0vti/dashboard/proto/TestSuiteResultMessage.proto\x12\x0b\x61ndroid.vts\x1a\x36vti/test_serving/proto/TestScheduleConfigMessage.proto\"\x92\x05\n\x16TestSuiteResultMessage\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x13\n\x0bresult_path\x18\x02 \x01(\t\x12\x1a\n\x0c\x62oot_success\x18\x03 \x01(\x08:\x04true\x12\x0e\n\x06\x62ranch\x18\x0b \x02(\t\x12\x0e\n\x06target\x18\x0c \x02(\t\x12\x10\n\x08\x62uild_id\x18\r \x02(\t\x12\x12\n\nsuite_plan\x18\x15 \x01(\t\x12\x15\n\rsuite_version\x18\x16 \x01(\t\x12\x1a\n\x12suite_build_number\x18\x17 \x01(\t\x12\x12\n\nstart_time\x18\x18 \x01(\x03\x12\x10\n\x08\x65nd_time\x18\x19 \x01(\x03\x12\x11\n\thost_name\x18\x1a \x01(\t\x12\x12\n\nsuite_name\x18\x1b \x01(\t\x12 \n\x18\x62uild_system_fingerprint\x18\x1f \x01(\t\x12 \n\x18\x62uild_vendor_fingerprint\x18  \x01(\t\x12\x14\n\ttest_type\x18! \x01(\x05:\x01\x30\x12\x1e\n\x16passed_test_case_count\x18) \x01(\x05\x12\x1e\n\x16\x66\x61iled_test_case_count\x18* \x01(\x05\x12\x14\n\x0cmodules_done\x18+ \x01(\x05\x12\x15\n\rmodules_total\x18, \x01(\x05\x12\x16\n\x0einfra_log_path\x18\x33 \x01(\t\x12\x1b\n\x13repacked_image_path\x18\x34 \x03(\t\x12\x17\n\x0fvendor_build_id\x18= \x01(\t\x12\x14\n\x0cgsi_build_id\x18> \x01(\t\x12@\n\x0fschedule_config\x18? \x01(\x0b\x32\'.android.test.lab.ScheduleConfigMessageB6\n\x15\x63om.android.vts.protoB\x1bTestSuiteResultMessageProtoP\x00')
-  ,
-  dependencies=[vti_dot_test__serving_dot_proto_dot_TestScheduleConfigMessage__pb2.DESCRIPTOR,])
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-
-
-
-_TESTSUITERESULTMESSAGE = _descriptor.Descriptor(
-  name='TestSuiteResultMessage',
-  full_name='android.vts.TestSuiteResultMessage',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='access_token', full_name='android.vts.TestSuiteResultMessage.access_token', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='result_path', full_name='android.vts.TestSuiteResultMessage.result_path', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='boot_success', full_name='android.vts.TestSuiteResultMessage.boot_success', index=2,
-      number=3, type=8, cpp_type=7, label=1,
-      has_default_value=True, default_value=True,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='branch', full_name='android.vts.TestSuiteResultMessage.branch', index=3,
-      number=11, type=9, cpp_type=9, label=2,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='target', full_name='android.vts.TestSuiteResultMessage.target', index=4,
-      number=12, type=9, cpp_type=9, label=2,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='build_id', full_name='android.vts.TestSuiteResultMessage.build_id', index=5,
-      number=13, type=9, cpp_type=9, label=2,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='suite_plan', full_name='android.vts.TestSuiteResultMessage.suite_plan', index=6,
-      number=21, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='suite_version', full_name='android.vts.TestSuiteResultMessage.suite_version', index=7,
-      number=22, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='suite_build_number', full_name='android.vts.TestSuiteResultMessage.suite_build_number', index=8,
-      number=23, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='start_time', full_name='android.vts.TestSuiteResultMessage.start_time', index=9,
-      number=24, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='end_time', full_name='android.vts.TestSuiteResultMessage.end_time', index=10,
-      number=25, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='host_name', full_name='android.vts.TestSuiteResultMessage.host_name', index=11,
-      number=26, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='suite_name', full_name='android.vts.TestSuiteResultMessage.suite_name', index=12,
-      number=27, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='build_system_fingerprint', full_name='android.vts.TestSuiteResultMessage.build_system_fingerprint', index=13,
-      number=31, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='build_vendor_fingerprint', full_name='android.vts.TestSuiteResultMessage.build_vendor_fingerprint', index=14,
-      number=32, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='test_type', full_name='android.vts.TestSuiteResultMessage.test_type', index=15,
-      number=33, type=5, cpp_type=1, label=1,
-      has_default_value=True, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='passed_test_case_count', full_name='android.vts.TestSuiteResultMessage.passed_test_case_count', index=16,
-      number=41, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='failed_test_case_count', full_name='android.vts.TestSuiteResultMessage.failed_test_case_count', index=17,
-      number=42, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='modules_done', full_name='android.vts.TestSuiteResultMessage.modules_done', index=18,
-      number=43, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='modules_total', full_name='android.vts.TestSuiteResultMessage.modules_total', index=19,
-      number=44, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='infra_log_path', full_name='android.vts.TestSuiteResultMessage.infra_log_path', index=20,
-      number=51, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='repacked_image_path', full_name='android.vts.TestSuiteResultMessage.repacked_image_path', index=21,
-      number=52, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='vendor_build_id', full_name='android.vts.TestSuiteResultMessage.vendor_build_id', index=22,
-      number=61, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='gsi_build_id', full_name='android.vts.TestSuiteResultMessage.gsi_build_id', index=23,
-      number=62, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='schedule_config', full_name='android.vts.TestSuiteResultMessage.schedule_config', index=24,
-      number=63, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=122,
-  serialized_end=780,
-)
-
-_TESTSUITERESULTMESSAGE.fields_by_name['schedule_config'].message_type = vti_dot_test__serving_dot_proto_dot_TestScheduleConfigMessage__pb2._SCHEDULECONFIGMESSAGE
-DESCRIPTOR.message_types_by_name['TestSuiteResultMessage'] = _TESTSUITERESULTMESSAGE
-
-TestSuiteResultMessage = _reflection.GeneratedProtocolMessageType('TestSuiteResultMessage', (_message.Message,), dict(
-  DESCRIPTOR = _TESTSUITERESULTMESSAGE,
-  __module__ = 'vti.dashboard.proto.TestSuiteResultMessage_pb2'
-  # @@protoc_insertion_point(class_scope:android.vts.TestSuiteResultMessage)
-  ))
-_sym_db.RegisterMessage(TestSuiteResultMessage)
-
-
-DESCRIPTOR.has_options = True
-DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\025com.android.vts.protoB\033TestSuiteResultMessageProtoP\000'))
-# @@protoc_insertion_point(module_scope)
diff --git a/proto/__init__.py b/proto/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/proto/__init__.py
+++ /dev/null
diff --git a/script/build-python.sh b/script/build-python.sh
deleted file mode 100755
index cffdb94..0000000
--- a/script/build-python.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2018 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.
-
-pushd ${ANDROID_BUILD_TOP}/test
-protoc --proto_path=. --python_out=. vti/dashboard/proto/TestSuiteResultMessage.proto vti/test_serving/proto/TestScheduleConfigMessage.proto
-popd
diff --git a/settings.gradle b/settings.gradle
deleted file mode 100644
index 90a0c19..0000000
--- a/settings.gradle
+++ /dev/null
@@ -1,6 +0,0 @@
-rootProject.name = 'vts-dashboard'
-
-ext {
-    deployTarget = "test"
-    loggingProperty = "WEB-INF/logging.properties"
-}
\ No newline at end of file
diff --git a/src/main/java/com/android/vts/api/BaseApiServlet.java b/src/main/java/com/android/vts/api/BaseApiServlet.java
deleted file mode 100644
index b7384a7..0000000
--- a/src/main/java/com/android/vts/api/BaseApiServlet.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.api;
-
-import com.google.apphosting.api.ApiProxy;
-import java.util.Properties;
-import java.util.logging.Logger;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletResponse;
-
-/** An abstract class to be subclassed to create API Servlet */
-public class BaseApiServlet extends HttpServlet {
-
-    private static final Logger logger = Logger.getLogger(BaseApiServlet.class.getName());
-
-    /** System Configuration Property class */
-    protected Properties systemConfigProp = new Properties();
-
-    /** Appengine server host name */
-    protected String hostName;
-
-    /**
-     * This variable is for maximum number of entities per transaction You can find the detail here
-     * (https://cloud.google.com/datastore/docs/concepts/limits)
-     */
-    protected int MAX_ENTITY_SIZE_PER_TRANSACTION = 300;
-
-    @Override
-    public void init(ServletConfig cfg) throws ServletException {
-        super.init(cfg);
-
-        systemConfigProp =
-                Properties.class.cast(cfg.getServletContext().getAttribute("systemConfigProp"));
-
-        this.MAX_ENTITY_SIZE_PER_TRANSACTION =
-                Integer.parseInt(systemConfigProp.getProperty("datastore.maxEntitySize"));
-
-        ApiProxy.Environment env = ApiProxy.getCurrentEnvironment();
-        hostName =
-                env.getAttributes()
-                        .get("com.google.appengine.runtime.default_version_hostname")
-                        .toString();
-    }
-
-    protected void setAccessControlHeaders(HttpServletResponse resp) {
-        resp.setHeader("Access-Control-Allow-Origin", hostName);
-        resp.setHeader("Access-Control-Allow-Methods", "GET, PUT, POST, OPTIONS, DELETE");
-        resp.addHeader("Access-Control-Allow-Headers", "Content-Type");
-        resp.addHeader("Access-Control-Max-Age", "86400");
-    }
-}
diff --git a/src/main/java/com/android/vts/api/BigtableLegacyJsonServlet.java b/src/main/java/com/android/vts/api/BigtableLegacyJsonServlet.java
deleted file mode 100644
index d331d4b..0000000
--- a/src/main/java/com/android/vts/api/BigtableLegacyJsonServlet.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.proto.VtsReportMessage.TestReportMessage;
-import com.android.vts.servlet.BaseServlet;
-import com.android.vts.util.DatastoreHelper;
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.jackson.JacksonFactory;
-import com.google.api.services.oauth2.Oauth2;
-import com.google.api.services.oauth2.model.Tokeninfo;
-import com.google.protobuf.InvalidProtocolBufferException;
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.codec.binary.Base64;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/** REST endpoint for posting data JSON to the Dashboard. */
-@Deprecated
-public class BigtableLegacyJsonServlet extends HttpServlet {
-    private static String SERVICE_CLIENT_ID;
-    private static final String SERVICE_NAME = "VTS Dashboard";
-    private static final Logger logger =
-            Logger.getLogger(BigtableLegacyJsonServlet.class.getName());
-
-    /** System Configuration Property class */
-    protected Properties systemConfigProp = new Properties();
-
-    @Override
-    public void init(ServletConfig cfg) throws ServletException {
-        super.init(cfg);
-
-        try {
-            InputStream defaultInputStream =
-                    BigtableLegacyJsonServlet.class
-                            .getClassLoader()
-                            .getResourceAsStream("config.properties");
-            systemConfigProp.load(defaultInputStream);
-
-            SERVICE_CLIENT_ID = systemConfigProp.getProperty("appengine.serviceClientID");
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        // Retrieve the params
-        String payload = new String();
-        JSONObject payloadJson;
-        try {
-            String line = null;
-            BufferedReader reader = request.getReader();
-            while ((line = reader.readLine()) != null) {
-                payload += line;
-            }
-            payloadJson = new JSONObject(payload);
-        } catch (IOException | JSONException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            logger.log(Level.WARNING, "Invalid JSON: " + payload);
-            return;
-        }
-
-        // Verify service account access token.
-        boolean authorized = false;
-        if (payloadJson.has("accessToken")) {
-            String accessToken = payloadJson.getString("accessToken").trim();
-            GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
-            Oauth2 oauth2 =
-                    new Oauth2.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
-                            .setApplicationName(SERVICE_NAME)
-                            .build();
-            Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(accessToken).execute();
-            if (tokenInfo.getIssuedTo().equals(SERVICE_CLIENT_ID)) {
-                authorized = true;
-            }
-        }
-
-        if (!authorized) {
-            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-            return;
-        }
-
-        // Parse the desired action and execute the command
-        try {
-            if (payloadJson.has("verb")) {
-                switch (payloadJson.getString("verb")) {
-                    case "createTable":
-                        logger.log(Level.INFO, "Deprecated verb: createTable.");
-                        break;
-                    case "insertRow":
-                        insertData(payloadJson);
-                        break;
-                    default:
-                        logger.log(
-                                Level.WARNING,
-                                "Invalid Datastore REST verb: " + payloadJson.getString("verb"));
-                        throw new IOException("Unsupported POST verb.");
-                }
-            }
-        } catch (IOException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-        response.setStatus(HttpServletResponse.SC_OK);
-    }
-
-    /**
-     * Inserts a data into the Cloud Datastore
-     *
-     * @param payloadJson The JSON object representing the row to be inserted. Of the form: {
-     *     (deprecated) 'tableName' : 'table', (deprecated) 'rowKey' : 'row', (deprecated) 'family'
-     *     : 'family', (deprecated) 'qualifier' : 'qualifier', 'value' : 'value' }
-     * @throws IOException
-     */
-    private void insertData(JSONObject payloadJson) throws IOException {
-        if (!payloadJson.has("value")) {
-            logger.log(Level.WARNING, "Missing attributes for datastore api insertRow().");
-            return;
-        }
-        try {
-            byte[] value = Base64.decodeBase64(payloadJson.getString("value"));
-            TestReportMessage testReportMessage = TestReportMessage.parseFrom(value);
-        } catch (InvalidProtocolBufferException e) {
-            logger.log(Level.WARNING, "Invalid report posted to dashboard.");
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/api/CoverageRestServlet.java b/src/main/java/com/android/vts/api/CoverageRestServlet.java
deleted file mode 100644
index aebd3e5..0000000
--- a/src/main/java/com/android/vts/api/CoverageRestServlet.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.ApiCoverageEntity;
-import com.android.vts.entity.CoverageEntity;
-import com.android.vts.entity.TestCoverageStatusEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.google.gson.Gson;
-import com.googlecode.objectify.Key;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** REST endpoint for posting test suite data to the Dashboard. */
-public class CoverageRestServlet extends BaseApiServlet {
-
-    private static final Logger logger = Logger.getLogger(CoverageRestServlet.class.getName());
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        String pathInfo = request.getPathInfo();
-        String json = "";
-        if (Objects.nonNull(pathInfo)) {
-            if (pathInfo.equalsIgnoreCase("/api/data")) {
-                String key = request.getParameter("key");
-                json = apiCoverageData(key);
-            } else {
-                json = "{error: 'true', message: 'unexpected path!!!'}";
-                logger.log(Level.INFO, "Path Info => " + pathInfo);
-                logger.log(Level.WARNING, "Unknown path access!");
-            }
-        } else {
-            json = "{error: 'true', message: 'the path info is not existed!!!'}";
-        }
-
-        response.setStatus(HttpServletResponse.SC_OK);
-        response.setContentType("application/json");
-        response.setCharacterEncoding("UTF-8");
-        response.getWriter().write(json);
-    }
-
-    private String apiCoverageData(String key) {
-        ApiCoverageEntity apiCoverageEntity = ApiCoverageEntity.getByUrlSafeKey(key);
-        String apiCoverageEntityJson = new Gson().toJson(apiCoverageEntity);
-        return apiCoverageEntityJson;
-    }
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-
-        String pathInfo = request.getPathInfo();
-        String json = "";
-        if (Objects.nonNull(pathInfo)) {
-            if (pathInfo.equalsIgnoreCase("/api/data")) {
-                String cmd = request.getParameter("cmd");
-                String coverageId = request.getParameter("coverageId");
-                String testName = request.getParameter("testName");
-                String testRunId = request.getParameter("testRunId");
-                json = postCoverageData(cmd, coverageId, testName, testRunId);
-            } else if (pathInfo.equalsIgnoreCase("/api/sum")) {
-                String urlSafeKey = request.getParameter("urlSafeKey");
-                json = postCoverageDataSum(urlSafeKey);
-            } else {
-                json = "{error: 'true', message: 'unexpected path!!!'}";
-            }
-        } else {
-            json = "{error: 'true', message: 'the path info is not existed!!!'}";
-        }
-
-        response.setStatus(HttpServletResponse.SC_OK);
-        response.setContentType("application/json");
-        response.setCharacterEncoding("UTF-8");
-        response.getWriter().write(json);
-    }
-
-    private String postCoverageDataSum(String urlSafeKey) {
-        List<List<String>> allHalApiList = new ArrayList();
-        List<List<String>> allCoveredHalApiList = new ArrayList();
-
-        Key<TestPlanRunEntity> key = Key.create(urlSafeKey);
-        TestPlanRunEntity testPlanRunEntity = ofy().load().key(key).safe();
-
-        for (Key<TestRunEntity> testRunKey : testPlanRunEntity.getTestRuns()) {
-            List<ApiCoverageEntity> apiCoverageEntityList =
-                    ofy().load().type(ApiCoverageEntity.class).ancestor(testRunKey).list();
-            for (ApiCoverageEntity apiCoverageEntity : apiCoverageEntityList) {
-                allHalApiList.add(apiCoverageEntity.getHalApi());
-                allCoveredHalApiList.add(apiCoverageEntity.getCoveredHalApi());
-            }
-        }
-        long totalHalApiNum = allHalApiList.stream().flatMap(Collection::stream).distinct().count();
-        long totalCoveredHalApiNum =
-                allCoveredHalApiList.stream().flatMap(Collection::stream).distinct().count();
-        if (totalHalApiNum > 0) {
-            testPlanRunEntity.setTotalApiCount(totalHalApiNum);
-            if (totalCoveredHalApiNum > 0) {
-                testPlanRunEntity.setCoveredApiCount(totalCoveredHalApiNum);
-            }
-            testPlanRunEntity.save();
-        }
-
-        Map<String, Long> halApiNumMap =
-                new HashMap<String, Long>() {
-                    {
-                        put("totalHalApiNum", totalHalApiNum);
-                        put("totalCoveredHalApiNum", totalCoveredHalApiNum);
-                    }
-                };
-        String json = new Gson().toJson(halApiNumMap);
-        return json;
-    }
-
-    /**
-     * The API to ignore the irrelevant code for calculating ratio
-     *
-     * @param cmd disable or enable command to ignore the code.
-     * @param coverageId the datastore ID for code coverage.
-     * @param testName the test name.
-     * @param testRunId the test run ID from datastore.
-     * @return success json.
-     */
-    private String postCoverageData(
-            String cmd, String coverageId, String testName, String testRunId) {
-
-        Boolean isIgnored = false;
-        if (cmd.equals("disable")) {
-            isIgnored = true;
-        }
-        CoverageEntity coverageEntity = CoverageEntity.findById(testName, testRunId, coverageId);
-        coverageEntity.setIsIgnored(isIgnored);
-        coverageEntity.save();
-
-        TestCoverageStatusEntity testCoverageStatusEntity =
-                TestCoverageStatusEntity.findById(testName);
-        Long newCoveredLineCount =
-                cmd.equals("disable")
-                        ? testCoverageStatusEntity.getUpdatedCoveredLineCount()
-                                - coverageEntity.getCoveredCount()
-                        : testCoverageStatusEntity.getUpdatedCoveredLineCount()
-                                + coverageEntity.getCoveredCount();
-        Long newTotalLineCount =
-                cmd.equals("disable")
-                        ? testCoverageStatusEntity.getUpdatedTotalLineCount()
-                                - coverageEntity.getTotalCount()
-                        : testCoverageStatusEntity.getUpdatedTotalLineCount()
-                                + coverageEntity.getTotalCount();
-        testCoverageStatusEntity.setUpdatedCoveredLineCount(newCoveredLineCount);
-        testCoverageStatusEntity.setUpdatedTotalLineCount(newTotalLineCount);
-        testCoverageStatusEntity.save();
-
-        String json = new Gson().toJson("Success!");
-        return json;
-    }
-}
diff --git a/src/main/java/com/android/vts/api/DataRestServlet.java b/src/main/java/com/android/vts/api/DataRestServlet.java
deleted file mode 100644
index 409818e..0000000
--- a/src/main/java/com/android/vts/api/DataRestServlet.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.BranchEntity;
-import com.android.vts.entity.TestCoverageStatusEntity;
-import com.google.gson.Gson;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.List;
-import java.util.Objects;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.android.vts.entity.BuildTargetEntity;
-
-/** REST endpoint for getting all branch and buildFlavors information. */
-public class DataRestServlet extends BaseApiServlet {
-
-    private static final Logger logger = Logger.getLogger(DataRestServlet.class.getName());
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        String pathInfo = request.getPathInfo();
-        String json = "";
-        if (Objects.nonNull(pathInfo)) {
-            String schKey =
-                    Objects.isNull(request.getParameter("schKey"))
-                            ? ""
-                            : request.getParameter("schKey");
-            if (pathInfo.equalsIgnoreCase("/branch")) {
-                json = new Gson().toJson(BranchEntity.getByBranch(schKey));
-            } else if (pathInfo.equalsIgnoreCase("/device")) {
-                json = new Gson().toJson(BuildTargetEntity.getByBuildTarget(schKey));
-            } else if (pathInfo.startsWith("/code/coverage/status/")) {
-                List<TestCoverageStatusEntity> testCoverageStatusEntityList =
-                        TestCoverageStatusEntity.getAllTestCoverage();
-                if (pathInfo.endsWith("branch")) {
-                    json =
-                            new Gson()
-                                    .toJson(
-                                            TestCoverageStatusEntity.getBranchSet(
-                                                    testCoverageStatusEntityList));
-                } else {
-                    json =
-                            new Gson()
-                                    .toJson(
-                                            TestCoverageStatusEntity.getDeviceSet(
-                                                    testCoverageStatusEntityList));
-                }
-            } else {
-                json = "{error: 'true', message: 'unexpected path!!!'}";
-                logger.log(Level.INFO, "Path Info => " + pathInfo);
-                logger.log(Level.WARNING, "Unknown path access!");
-            }
-        } else {
-            json = "{error: 'true', message: 'the path info is not existed!!!'}";
-        }
-
-        response.setStatus(HttpServletResponse.SC_OK);
-        response.setContentType("application/json");
-        response.setCharacterEncoding("UTF-8");
-        response.getWriter().write(json);
-    }
-}
diff --git a/src/main/java/com/android/vts/api/DatastoreRestServlet.java b/src/main/java/com/android/vts/api/DatastoreRestServlet.java
deleted file mode 100644
index fa0ae65..0000000
--- a/src/main/java/com/android/vts/api/DatastoreRestServlet.java
+++ /dev/null
@@ -1,556 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.ApiCoverageEntity;
-import com.android.vts.entity.BranchEntity;
-import com.android.vts.entity.BuildTargetEntity;
-import com.android.vts.entity.CodeCoverageEntity;
-import com.android.vts.entity.CoverageEntity;
-import com.android.vts.entity.DashboardEntity;
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.HalApiEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage;
-import com.android.vts.proto.VtsReportMessage.DashboardPostMessage;
-import com.android.vts.proto.VtsReportMessage.TestPlanReportMessage;
-import com.android.vts.proto.VtsReportMessage.TestReportMessage;
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.jackson.JacksonFactory;
-import com.google.api.services.oauth2.Oauth2;
-import com.google.api.services.oauth2.model.Tokeninfo;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import com.google.appengine.api.datastore.Key;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.codec.binary.Base64;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@Slf4j
-/** REST endpoint for posting data to the Dashboard. */
-public class DatastoreRestServlet extends BaseApiServlet {
-    private static String SERVICE_CLIENT_ID;
-    private static final String SERVICE_NAME = "VTS Dashboard";
-
-    @Override
-    public void init(ServletConfig cfg) throws ServletException {
-        super.init(cfg);
-
-        SERVICE_CLIENT_ID = this.systemConfigProp.getProperty("appengine.serviceClientID");
-    }
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        // Retrieve the params
-        DashboardPostMessage postMessage;
-        try {
-            String payload = request.getReader().lines().collect(Collectors.joining());
-            byte[] value = Base64.decodeBase64(payload);
-            postMessage = DashboardPostMessage.parseFrom(value);
-        } catch (IOException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            log.error("Invalid proto: " + e.getLocalizedMessage());
-            return;
-        }
-
-        String resultMsg = "";
-        // Verify service account access token.
-        if (postMessage.hasAccessToken()) {
-            String accessToken = postMessage.getAccessToken();
-            log.debug("accessToken => " + accessToken);
-
-            GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
-            Oauth2 oauth2 =
-                    new Oauth2.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
-                            .setApplicationName(SERVICE_NAME)
-                            .build();
-            Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(accessToken).execute();
-            if (tokenInfo.getIssuedTo().equals(SERVICE_CLIENT_ID)) {
-                for (TestReportMessage testReportMessage : postMessage.getTestReportList()) {
-                    this.insertTestReport(testReportMessage);
-                }
-
-                for (TestPlanReportMessage planReportMessage :
-                        postMessage.getTestPlanReportList()) {
-                    this.insertTestPlanReport(planReportMessage);
-                }
-
-                response.setStatus(HttpServletResponse.SC_OK);
-                resultMsg = "Success!!";
-            } else {
-                log.warn("service_client_id didn't match!");
-                log.debug("SERVICE_CLIENT_ID => " + tokenInfo.getIssuedTo());
-                resultMsg = "Your SERVICE_CLIENT_ID is incorrect!";
-                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-            }
-        } else {
-            log.error("postMessage do not contain any accessToken!");
-            resultMsg = "Your message do not have access token!";
-            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-        }
-        response.setContentType("application/json");
-        response.setCharacterEncoding("UTF-8");
-        response.getWriter().write("{'result_msg': " + resultMsg + "}");
-    }
-
-    /**
-     * Upload data from a test report message
-     *
-     * @param report The test report containing data to upload.
-     */
-    private void insertTestReport(TestReportMessage report) {
-
-        if (!report.hasStartTimestamp()
-                || !report.hasEndTimestamp()
-                || !report.hasTest()
-                || !report.hasHostInfo()
-                || !report.hasBuildInfo()) {
-            // missing information
-            log.error("Missing information in report !");
-            return;
-        }
-
-        List<TestEntity> testEntityList = new ArrayList<>();
-        List<TestRunEntity> testRunEntityList = new ArrayList<>();
-        List<BranchEntity> branchEntityList = new ArrayList<>();
-        List<BuildTargetEntity> buildTargetEntityList = new ArrayList<>();
-        List<CoverageEntity> coverageEntityList = new ArrayList<>();
-        List<CodeCoverageEntity> codeCoverageEntityList = new ArrayList<>();
-        List<DeviceInfoEntity> deviceInfoEntityList = new ArrayList<>();
-        List<ProfilingPointRunEntity> profilingPointRunEntityList = new ArrayList<>();
-        List<TestCaseRunEntity> testCaseRunEntityList = new ArrayList<>();
-        List<ApiCoverageEntity> apiCoverageEntityList = new ArrayList<>();
-
-        List<?> allEntityList =
-                Arrays.asList(
-                        testEntityList,
-                        branchEntityList,
-                        buildTargetEntityList,
-                        coverageEntityList,
-                        codeCoverageEntityList,
-                        deviceInfoEntityList,
-                        profilingPointRunEntityList,
-                        testCaseRunEntityList,
-                        apiCoverageEntityList,
-                        testRunEntityList);
-
-        long passCount = 0;
-        long failCount = 0;
-        long coveredLineCount = 0;
-        long totalLineCount = 0;
-
-        Set<Key> buildTargetKeys = new HashSet<>();
-        Set<Key> branchKeys = new HashSet<>();
-        List<Key> profilingPointKeyList = new ArrayList<>();
-        List<String> linkList = new ArrayList<>();
-
-        long startTimestamp = report.getStartTimestamp();
-        long endTimestamp = report.getEndTimestamp();
-        String testName = report.getTest().toStringUtf8();
-        String testBuildId = report.getBuildInfo().getId().toStringUtf8();
-        String hostName = report.getHostInfo().getHostname().toStringUtf8();
-
-        TestEntity testEntity = new TestEntity(testName);
-
-        com.googlecode.objectify.Key testRunKey =
-                testEntity.getTestRunKey(report.getStartTimestamp());
-
-        testEntityList.add(testEntity);
-
-        int testCaseRunEntityIndex = 0;
-        testCaseRunEntityList.add(new TestCaseRunEntity());
-        // Process test cases
-        for (VtsReportMessage.TestCaseReportMessage testCase : report.getTestCaseList()) {
-            String testCaseName = testCase.getName().toStringUtf8();
-            VtsReportMessage.TestCaseResult result = testCase.getTestResult();
-            // Track global pass/fail counts
-            if (result == VtsReportMessage.TestCaseResult.TEST_CASE_RESULT_PASS) {
-                ++passCount;
-            } else if (result != VtsReportMessage.TestCaseResult.TEST_CASE_RESULT_SKIP) {
-                ++failCount;
-            }
-            if (testCase.getSystraceCount() > 0
-                    && testCase.getSystraceList().get(0).getUrlCount() > 0) {
-                String systraceLink = testCase.getSystraceList().get(0).getUrl(0).toStringUtf8();
-                linkList.add(systraceLink);
-            }
-
-            // Process coverage data for test case
-            for (VtsReportMessage.CoverageReportMessage coverage : testCase.getCoverageList()) {
-                CoverageEntity coverageEntity =
-                        CoverageEntity.fromCoverageReport(testRunKey, testCaseName, coverage);
-                if (coverageEntity == null) {
-                    log.warn("Invalid coverage report in test run " + testRunKey);
-                } else {
-                    coveredLineCount += coverageEntity.getCoveredCount();
-                    totalLineCount += coverageEntity.getTotalCount();
-                    coverageEntityList.add(coverageEntity);
-                }
-            }
-
-            // Process profiling data for test case
-            for (VtsReportMessage.ProfilingReportMessage profiling : testCase.getProfilingList()) {
-                ProfilingPointRunEntity profilingPointRunEntity =
-                        ProfilingPointRunEntity.fromProfilingReport(testRunKey, profiling);
-                if (profilingPointRunEntity == null) {
-                    log.warn("Invalid profiling report in test run " + testRunKey);
-                } else {
-                    profilingPointRunEntityList.add(profilingPointRunEntity);
-                    profilingPointKeyList.add(profilingPointRunEntity.getKey());
-                    testEntity.setHasProfilingData(true);
-                }
-            }
-
-            TestCaseRunEntity testCaseRunEntity = testCaseRunEntityList.get(testCaseRunEntityIndex);
-            if (!testCaseRunEntity.addTestCase(testCaseName, result.getNumber())) {
-                testCaseRunEntity = new TestCaseRunEntity();
-                testCaseRunEntity.addTestCase(testCaseName, result.getNumber());
-                testCaseRunEntityList.add(testCaseRunEntity);
-                testCaseRunEntityIndex++;
-            }
-        }
-
-        // Process device information
-        long testRunType = 0;
-        for (VtsReportMessage.AndroidDeviceInfoMessage device : report.getDeviceInfoList()) {
-            DeviceInfoEntity deviceInfoEntity =
-                    DeviceInfoEntity.fromDeviceInfoMessage(testRunKey, device);
-            if (deviceInfoEntity == null) {
-                log.warn("Invalid device info in test run " + testRunKey);
-            } else {
-                // Run type on devices must be the same, else set to OTHER
-                TestRunEntity.TestRunType runType =
-                        TestRunEntity.TestRunType.fromBuildId(deviceInfoEntity.getBuildId());
-                if (runType == null) {
-                    testRunType = TestRunEntity.TestRunType.OTHER.getNumber();
-                } else {
-                    testRunType = runType.getNumber();
-                }
-                deviceInfoEntityList.add(deviceInfoEntity);
-                BuildTargetEntity target = new BuildTargetEntity(deviceInfoEntity.getBuildFlavor());
-                if (buildTargetKeys.add(target.getKey())) {
-                    buildTargetEntityList.add(target);
-                }
-                BranchEntity branch = new BranchEntity(deviceInfoEntity.getBranch());
-                if (branchKeys.add(branch.getKey())) {
-                    branchEntityList.add(branch);
-                }
-            }
-        }
-
-        // Overall run type should be determined by the device builds unless test build is OTHER
-        if (testRunType == TestRunEntity.TestRunType.OTHER.getNumber()) {
-            testRunType = TestRunEntity.TestRunType.fromBuildId(testBuildId).getNumber();
-        } else if (TestRunEntity.TestRunType.fromBuildId(testBuildId)
-                == TestRunEntity.TestRunType.OTHER) {
-            testRunType = TestRunEntity.TestRunType.OTHER.getNumber();
-        }
-
-        // Process global coverage data
-        for (VtsReportMessage.CoverageReportMessage coverage : report.getCoverageList()) {
-            CoverageEntity coverageEntity =
-                    CoverageEntity.fromCoverageReport(testRunKey, new String(), coverage);
-            if (coverageEntity == null) {
-                log.warn("Invalid coverage report in test run " + testRunKey);
-            } else {
-                coveredLineCount += coverageEntity.getCoveredCount();
-                totalLineCount += coverageEntity.getTotalCount();
-                coverageEntityList.add(coverageEntity);
-            }
-        }
-
-        // Process global API coverage data
-        for (VtsReportMessage.ApiCoverageReportMessage apiCoverage : report.getApiCoverageList()) {
-            VtsReportMessage.HalInterfaceMessage halInterfaceMessage =
-                    apiCoverage.getHalInterface();
-            List<String> halApiList =
-                    apiCoverage
-                            .getHalApiList()
-                            .stream()
-                            .map(h -> h.toStringUtf8())
-                            .collect(Collectors.toList());
-            List<String> coveredHalApiList =
-                    apiCoverage
-                            .getCoveredHalApiList()
-                            .stream()
-                            .map(h -> h.toStringUtf8())
-                            .collect(Collectors.toList());
-            ApiCoverageEntity apiCoverageEntity =
-                    new ApiCoverageEntity(
-                            testRunKey,
-                            halInterfaceMessage.getHalPackageName().toStringUtf8(),
-                            halInterfaceMessage.getHalVersionMajor(),
-                            halInterfaceMessage.getHalVersionMinor(),
-                            halInterfaceMessage.getHalInterfaceName().toStringUtf8(),
-                            halApiList,
-                            coveredHalApiList);
-            apiCoverageEntityList.add(apiCoverageEntity);
-        }
-
-        // Process global profiling data
-        for (VtsReportMessage.ProfilingReportMessage profiling : report.getProfilingList()) {
-            ProfilingPointRunEntity profilingPointRunEntity =
-                    ProfilingPointRunEntity.fromProfilingReport(testRunKey, profiling);
-            if (profilingPointRunEntity == null) {
-                log.warn("Invalid profiling report in test run " + testRunKey);
-            } else {
-                profilingPointRunEntityList.add(profilingPointRunEntity);
-                profilingPointKeyList.add(profilingPointRunEntity.getKey());
-                testEntity.setHasProfilingData(true);
-            }
-        }
-
-        // Process log data
-        for (VtsReportMessage.LogMessage log : report.getLogList()) {
-            if (log.hasUrl()) {
-                linkList.add(log.getUrl().toStringUtf8());
-            }
-        }
-        // Process url resource
-        for (VtsReportMessage.UrlResourceMessage resource : report.getLinkResourceList()) {
-            if (resource.hasUrl()) {
-                linkList.add(resource.getUrl().toStringUtf8());
-            }
-        }
-
-        boolean hasCodeCoverage = totalLineCount > 0 && coveredLineCount >= 0;
-        TestRunEntity testRunEntity =
-                new TestRunEntity(
-                        testEntity.getOldKey(),
-                        testRunType,
-                        startTimestamp,
-                        endTimestamp,
-                        testBuildId,
-                        hostName,
-                        passCount,
-                        failCount,
-                        hasCodeCoverage,
-                        new ArrayList<>(),
-                        linkList);
-        testRunEntityList.add(testRunEntity);
-
-        CodeCoverageEntity codeCoverageEntity =
-                new CodeCoverageEntity(
-                        testRunEntity.getId(),
-                        testRunEntity.getKey(),
-                        coveredLineCount,
-                        totalLineCount);
-        codeCoverageEntityList.add(codeCoverageEntity);
-
-        ofy().transact(
-                        () -> {
-                            List<Long> testCaseIds = new ArrayList<>();
-                            for (Object entity : allEntityList) {
-                                if (entity instanceof List) {
-                                    List listEntity = (List) entity;
-                                    if (listEntity.size() > 0
-                                            && listEntity.get(0) instanceof TestCaseRunEntity) {
-                                        Map<
-                                                        com.googlecode.objectify.Key<
-                                                                TestCaseRunEntity>,
-                                                        TestCaseRunEntity>
-                                                testCaseRunEntityMap =
-                                                        DashboardEntity.saveAll(
-                                                                testCaseRunEntityList,
-                                                                this
-                                                                        .MAX_ENTITY_SIZE_PER_TRANSACTION);
-
-                                        testCaseIds =
-                                                testCaseRunEntityMap
-                                                        .values()
-                                                        .stream()
-                                                        .map(
-                                                                testCaseRunEntity ->
-                                                                        testCaseRunEntity.getId())
-                                                        .collect(Collectors.toList());
-                                    } else if (listEntity.size() > 0
-                                            && listEntity.get(0) instanceof TestRunEntity) {
-                                        testRunEntityList.get(0).setTestCaseIds(testCaseIds);
-                                        DashboardEntity.saveAll(
-                                                testRunEntityList,
-                                                this.MAX_ENTITY_SIZE_PER_TRANSACTION);
-                                    } else {
-                                        List<DashboardEntity> dashboardEntityList =
-                                                (List<DashboardEntity>) entity;
-                                        DashboardEntity.saveAll(
-                                                dashboardEntityList,
-                                                this.MAX_ENTITY_SIZE_PER_TRANSACTION);
-                                    }
-                                }
-                            }
-                        });
-    }
-
-    /**
-     * Upload data from a test plan report message
-     *
-     * @param report The test plan report containing data to upload.
-     */
-    private void insertTestPlanReport(TestPlanReportMessage report) {
-        List<DeviceInfoEntity> deviceInfoEntityList = new ArrayList<>();
-        List<HalApiEntity> halApiEntityList = new ArrayList<>();
-
-        List allEntityList = Arrays.asList(deviceInfoEntityList, halApiEntityList);
-
-        List<String> testModules = report.getTestModuleNameList();
-        List<Long> testTimes = report.getTestModuleStartTimestampList();
-        if (testModules.size() != testTimes.size() || !report.hasTestPlanName()) {
-            log.error("TestPlanReportMessage is missing information.");
-            return;
-        }
-
-        String testPlanName = report.getTestPlanName();
-        TestPlanEntity testPlanEntity = new TestPlanEntity(testPlanName);
-        List<com.googlecode.objectify.Key<TestRunEntity>> testRunKeyList = new ArrayList<>();
-        for (int index = 0; index < testModules.size(); index++) {
-            String test = testModules.get(index);
-            long time = testTimes.get(index);
-            com.googlecode.objectify.Key testKey =
-                    com.googlecode.objectify.Key.create(TestEntity.class, test);
-            com.googlecode.objectify.Key testRunKey =
-                    com.googlecode.objectify.Key.create(testKey, TestRunEntity.class, time);
-            testRunKeyList.add(testRunKey);
-        }
-
-        Map<com.googlecode.objectify.Key<TestRunEntity>, TestRunEntity> testRunEntityMap =
-                ofy().load().keys(() -> testRunKeyList.iterator());
-
-        long passCount = 0;
-        long failCount = 0;
-        long startTimestamp = -1;
-        long endTimestamp = -1;
-        String testBuildId = null;
-        long testType = -1;
-        Set<DeviceInfoEntity> deviceInfoEntitySet = new HashSet<>();
-        for (TestRunEntity testRunEntity : testRunEntityMap.values()) {
-            passCount += testRunEntity.getPassCount();
-            failCount += testRunEntity.getFailCount();
-            if (startTimestamp < 0 || testRunEntity.getStartTimestamp() < startTimestamp) {
-                startTimestamp = testRunEntity.getStartTimestamp();
-            }
-            if (endTimestamp < 0 || testRunEntity.getEndTimestamp() > endTimestamp) {
-                endTimestamp = testRunEntity.getEndTimestamp();
-            }
-            testType = testRunEntity.getType();
-            testBuildId = testRunEntity.getTestBuildId();
-
-            List<DeviceInfoEntity> deviceInfoEntityListWithTestRunKey =
-                    ofy().load()
-                            .type(DeviceInfoEntity.class)
-                            .ancestor(testRunEntity.getOfyKey())
-                            .list();
-
-            for (DeviceInfoEntity deviceInfoEntity : deviceInfoEntityListWithTestRunKey) {
-                deviceInfoEntitySet.add(deviceInfoEntity);
-            }
-        }
-
-        if (startTimestamp < 0 || testBuildId == null || testType == -1) {
-            log.debug("startTimestamp => " + startTimestamp);
-            log.debug("testBuildId => " + testBuildId);
-            log.debug("type => " + testType);
-            log.error("Couldn't infer test run information from runs.");
-            return;
-        }
-
-        TestPlanRunEntity testPlanRunEntity =
-                new TestPlanRunEntity(
-                        testPlanEntity.getKey(),
-                        testPlanName,
-                        testType,
-                        startTimestamp,
-                        endTimestamp,
-                        testBuildId,
-                        passCount,
-                        failCount,
-                        0L,
-                        0L,
-                        testRunKeyList);
-
-        // Create the device infos.
-        for (DeviceInfoEntity device : deviceInfoEntitySet) {
-            deviceInfoEntityList.add(device.copyWithParent(testPlanRunEntity.getOfyKey()));
-        }
-
-        // Process global HAL API coverage data
-        for (VtsReportMessage.ApiCoverageReportMessage apiCoverage : report.getHalApiReportList()) {
-            VtsReportMessage.HalInterfaceMessage halInterfaceMessage =
-                    apiCoverage.getHalInterface();
-            List<String> halApiList =
-                    apiCoverage
-                            .getHalApiList()
-                            .stream()
-                            .map(h -> h.toStringUtf8())
-                            .collect(Collectors.toList());
-            List<String> coveredHalApiList =
-                    apiCoverage
-                            .getCoveredHalApiList()
-                            .stream()
-                            .map(h -> h.toStringUtf8())
-                            .collect(Collectors.toList());
-            HalApiEntity halApiEntity =
-                    new HalApiEntity(
-                            testPlanRunEntity.getOfyKey(),
-                            halInterfaceMessage.getHalReleaseLevel().toStringUtf8(),
-                            halInterfaceMessage.getHalPackageName().toStringUtf8(),
-                            halInterfaceMessage.getHalVersionMajor(),
-                            halInterfaceMessage.getHalVersionMinor(),
-                            halInterfaceMessage.getHalInterfaceName().toStringUtf8(),
-                            halApiList,
-                            coveredHalApiList);
-            halApiEntityList.add(halApiEntity);
-        }
-
-        ofy().transact(
-                        () -> {
-                            testPlanEntity.save();
-                            testPlanRunEntity.save();
-                            for (Object entity : allEntityList) {
-                                List<DashboardEntity> dashboardEntityList =
-                                        (List<DashboardEntity>) entity;
-                                Map<com.googlecode.objectify.Key<DashboardEntity>, DashboardEntity>
-                                        mapInfo =
-                                                DashboardEntity.saveAll(
-                                                        dashboardEntityList,
-                                                        this.MAX_ENTITY_SIZE_PER_TRANSACTION);
-                            }
-                        });
-
-        // Add the task to calculate total number API list.
-        testPlanRunEntity.addCoverageApiTask();
-    }
-}
diff --git a/src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java b/src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java
deleted file mode 100644
index 309c3e2..0000000
--- a/src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.TestAcknowledgmentEntity;
-import com.android.vts.util.DatastoreHelper;
-import com.google.appengine.api.datastore.DatastoreFailureException;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.DatastoreTimeoutException;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Transaction;
-import com.google.appengine.api.users.User;
-import com.google.appengine.api.users.UserService;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.ConcurrentModificationException;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for handling requests to fetch test acknowledgments. */
-public class TestAcknowledgmentRestServlet extends HttpServlet {
-    protected static final Logger logger =
-            Logger.getLogger(TestAcknowledgmentRestServlet.class.getName());
-
-    /** Read all test acknowledgments. */
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        Query ackQuery = new Query(TestAcknowledgmentEntity.KIND);
-        List<JsonObject> testAcks = new ArrayList<>();
-        for (Entity ackEntity :
-                datastore.prepare(ackQuery).asIterable(DatastoreHelper.getLargeBatchOptions())) {
-            TestAcknowledgmentEntity ack = TestAcknowledgmentEntity.fromEntity(ackEntity);
-            if (ack == null) continue;
-            testAcks.add(ack.toJson());
-        }
-        response.setContentType("application/json");
-        PrintWriter writer = response.getWriter();
-        writer.print(new Gson().toJson(testAcks));
-        writer.flush();
-    }
-
-    /** Create a test acknowledgment. */
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        UserService userService = UserServiceFactory.getUserService();
-        if (!userService.isUserAdmin()) {
-            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-            return;
-        }
-        User currentUser = userService.getCurrentUser();
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        StringBuilder sb = new StringBuilder();
-        BufferedReader br = new BufferedReader(request.getReader());
-        String str;
-        while ((str = br.readLine()) != null) {
-            sb.append(str);
-        }
-        JsonObject json;
-        try {
-            json = new JsonParser().parse(sb.toString()).getAsJsonObject();
-        } catch (IllegalStateException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-        TestAcknowledgmentEntity ack = TestAcknowledgmentEntity.fromJson(currentUser, json);
-        Transaction txn = datastore.beginTransaction();
-        try {
-            Key key = datastore.put(ack.toEntity());
-            txn.commit();
-
-            response.setContentType("application/json");
-            PrintWriter writer = response.getWriter();
-            writer.print(new Gson().toJson(KeyFactory.keyToString(key)));
-            writer.flush();
-        } catch (ConcurrentModificationException
-                | DatastoreFailureException
-                | DatastoreTimeoutException e) {
-            txn.rollback();
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        } finally {
-            if (txn.isActive()) {
-                logger.log(Level.WARNING, "Transaction rollback forced acknowledgment post.");
-                txn.rollback();
-                response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-                return;
-            }
-        }
-        response.setStatus(HttpServletResponse.SC_OK);
-    }
-
-    /** Remove a test acknowledgment. */
-    @Override
-    public void doDelete(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        UserService userService = UserServiceFactory.getUserService();
-        if (!userService.isUserAdmin()) {
-            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-            return;
-        }
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        String stringKey = request.getPathInfo();
-        if (stringKey == null) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-        if (stringKey.startsWith("/")) {
-            stringKey = stringKey.substring(1);
-        }
-        Key key = KeyFactory.stringToKey(stringKey);
-        if (!key.getKind().equals(TestAcknowledgmentEntity.KIND)) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-        datastore.delete(key);
-        response.setStatus(HttpServletResponse.SC_OK);
-    }
-}
diff --git a/src/main/java/com/android/vts/api/TestDataForDevServlet.java b/src/main/java/com/android/vts/api/TestDataForDevServlet.java
deleted file mode 100644
index 2ed387b..0000000
--- a/src/main/java/com/android/vts/api/TestDataForDevServlet.java
+++ /dev/null
@@ -1,676 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.BranchEntity;
-import com.android.vts.entity.BuildTargetEntity;
-import com.android.vts.entity.CodeCoverageEntity;
-import com.android.vts.entity.CoverageEntity;
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.entity.TestStatusEntity;
-import com.android.vts.entity.TestStatusEntity.TestCaseReference;
-import com.android.vts.entity.TestSuiteFileEntity;
-import com.android.vts.entity.TestSuiteResultEntity;
-import com.google.appengine.api.datastore.DatastoreFailureException;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.DatastoreTimeoutException;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Transaction;
-import com.google.appengine.api.users.User;
-import com.google.appengine.api.users.UserService;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.appengine.api.utils.SystemProperty;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.file.FileSystems;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.time.Instant;
-import java.time.temporal.ChronoUnit;
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.ConcurrentModificationException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Random;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.IntStream;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for handling requests to add mock data in datastore. */
-public class TestDataForDevServlet extends HttpServlet {
-    protected static final Logger logger = Logger.getLogger(TestDataForDevServlet.class.getName());
-
-    /** Google Cloud Storage project's default directory name for suite test result files */
-    private static String GCS_SUITE_TEST_FOLDER_NAME;
-
-    /** datastore instance to save the test data into datastore through datastore library. */
-    private DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-    /**
-     * Gson is a Java library that can be used to convert Java Objects into their JSON
-     * representation. It can also be used to convert a JSON string to an equivalent Java object.
-     */
-    private Gson gson = new GsonBuilder().create();
-
-    /** System Configuration Property class */
-    protected Properties systemConfigProp = new Properties();
-
-    @Override
-    public void init(ServletConfig cfg) throws ServletException {
-        super.init(cfg);
-
-        try {
-            InputStream defaultInputStream =
-                    TestDataForDevServlet.class
-                            .getClassLoader()
-                            .getResourceAsStream("config.properties");
-            systemConfigProp.load(defaultInputStream);
-
-            GCS_SUITE_TEST_FOLDER_NAME = systemConfigProp.getProperty("gcs.suiteTestFolderName");
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * TestReportData class for mapping test-report-data.json. This internal class's each fields
-     * will be automatically mapped to test-report-data.json file through Gson
-     */
-    private class TestReportDataObject {
-        private List<Test> testList;
-
-        private class Test {
-            private List<TestRun> testRunList;
-
-            private class TestRun {
-                private String testName;
-                private int type;
-                private long startTimestamp;
-                private long endTimestamp;
-                private String testBuildId;
-                private String hostName;
-                private long passCount;
-                private long failCount;
-                private boolean hasCoverage;
-                private long coveredLineCount;
-                private long totalLineCount;
-                private List<Long> testCaseIds;
-                private List<Long> failingTestcaseIds;
-                private List<Integer> failingTestcaseOffsets;
-                private List<String> links;
-
-                private List<Coverage> coverageList;
-                private List<Profiling> profilingList;
-                private List<TestCaseRun> testCaseRunList;
-                private List<DeviceInfo> deviceInfoList;
-                private List<BuildTarget> buildTargetList;
-                private List<Branch> branchList;
-
-                private class Coverage {
-                    private String group;
-                    private long coveredLineCount;
-                    private long totalLineCount;
-                    private String filePath;
-                    private String projectName;
-                    private String projectVersion;
-                    private List<Long> lineCoverage;
-                }
-
-                private class Profiling {
-                    private String name;
-                    private int type;
-                    private int regressionMode;
-                    private List<String> labels;
-                    private List<Long> values;
-                    private String xLabel;
-                    private String yLabel;
-                    private List<String> options;
-                }
-
-                private class TestCaseRun {
-                    private List<String> testCaseNames;
-                    private List<Integer> results;
-                }
-
-                private class DeviceInfo {
-                    private String branch;
-                    private String product;
-                    private String buildFlavor;
-                    private String buildId;
-                    private String abiBitness;
-                    private String abiName;
-                }
-
-                private class BuildTarget {
-                    private String targetName;
-                }
-
-                private class Branch {
-                    private String branchName;
-                }
-            }
-        }
-
-        @Override
-        public String toString() {
-            return "(" + testList + ")";
-        }
-    }
-
-    private class TestPlanReportDataObject {
-        private List<TestPlan> testPlanList;
-
-        private class TestPlan {
-
-            private String testPlanName;
-            private List<String> testModules;
-            private List<Long> testTimes;
-        }
-
-        @Override
-        public String toString() {
-            return "(" + testPlanList + ")";
-        }
-    }
-
-    private Map<String, Object> generateSuiteTestData(
-            HttpServletRequest request, HttpServletResponse response) {
-        Map<String, Object> resultMap = new HashMap<>();
-        String fileSeparator = FileSystems.getDefault().getSeparator();
-        Random rand = new Random();
-        List<String> branchList = Arrays.asList("master", "oc_mr", "oc");
-        List<String> targetList =
-                Arrays.asList(
-                        "sailfish-userdebug",
-                        "marlin-userdebug",
-                        "taimen-userdebug",
-                        "walleye-userdebug",
-                        "aosp_arm_a-userdebug");
-        branchList.forEach(
-                branch ->
-                        targetList.forEach(
-                                target ->
-                                        IntStream.range(0, 10)
-                                                .forEach(
-                                                        idx -> {
-                                                            String year =
-                                                                    String.format(
-                                                                            "%04d", 2010 + idx);
-                                                            String month =
-                                                                    String.format(
-                                                                            "%02d",
-                                                                            rand.nextInt(12));
-                                                            String day =
-                                                                    String.format(
-                                                                            "%02d",
-                                                                            rand.nextInt(30));
-                                                            String fileName =
-                                                                    String.format(
-                                                                            "%02d%02d%02d.bin",
-                                                                            rand.nextInt(23) + 1,
-                                                                            rand.nextInt(59) + 1,
-                                                                            rand.nextInt(59) + 1);
-
-                                                            List<String> pathList =
-                                                                    Arrays.asList(
-                                                                            GCS_SUITE_TEST_FOLDER_NAME
-                                                                                            == ""
-                                                                                    ? "suite_result"
-                                                                                    : GCS_SUITE_TEST_FOLDER_NAME,
-                                                                            year,
-                                                                            month,
-                                                                            day,
-                                                                            fileName);
-
-                                                            Path pathInfo =
-                                                                    Paths.get(
-                                                                            String.join(
-                                                                                    fileSeparator,
-                                                                                    pathList));
-
-                                                            TestSuiteFileEntity
-                                                                    newTestSuiteFileEntity =
-                                                                            new TestSuiteFileEntity(
-                                                                                    pathInfo
-                                                                                            .toString());
-
-                                                            com.googlecode.objectify.Key<
-                                                                    TestSuiteFileEntity>
-                                                                    testSuiteFileParent =
-                                                                            com.googlecode.objectify
-                                                                                    .Key.create(
-                                                                                    TestSuiteFileEntity
-                                                                                            .class,
-                                                                                    newTestSuiteFileEntity
-                                                                                            .getFilePath());
-
-
-                                                            TestSuiteResultEntity
-                                                                    testSuiteResultEntity =
-                                                                            new TestSuiteResultEntity(
-                                                                                    testSuiteFileParent,
-                                                                                    Instant.now()
-                                                                                            .minus(
-                                                                                                    rand
-                                                                                                            .nextInt(
-                                                                                                                    100),
-                                                                                                    ChronoUnit
-                                                                                                            .DAYS)
-                                                                                            .getEpochSecond(),
-                                                                                    Instant.now()
-                                                                                            .minus(
-                                                                                                    rand
-                                                                                                            .nextInt(
-                                                                                                                    100),
-                                                                                                    ChronoUnit
-                                                                                                            .DAYS)
-                                                                                            .getEpochSecond(),
-                                                                                    1,
-                                                                                    idx / 2 == 0
-                                                                                            ? false
-                                                                                            : true,
-                                                                                    pathInfo
-                                                                                            .toString(),
-                                                                                    idx / 2 == 0
-                                                                                            ? "/error/infra/log"
-                                                                                            : "",
-                                                                                    "Test Place Name -"
-                                                                                            + idx,
-                                                                                    "Suite Test Plan",
-                                                                                    "Suite Version "
-                                                                                            + idx,
-                                                                                    "Suite Test Name",
-                                                                                    "Suite Build Number "
-                                                                                            + idx,
-                                                                                    rand.nextInt(),
-                                                                                    rand.nextInt(),
-                                                                                    branch,
-                                                                                    target,
-                                                                                    Long.toString(
-                                                                                            Math
-                                                                                                    .abs(
-                                                                                                            rand
-                                                                                                                    .nextLong())),
-                                                                                    "Build System Fingerprint "
-                                                                                            + idx,
-                                                                                    "Build Vendor Fingerprint "
-                                                                                            + idx,
-                                                                                    rand.nextInt(),
-                                                                                    rand.nextInt());
-
-                                                            testSuiteResultEntity.save(newTestSuiteFileEntity);
-                                                        })));
-        resultMap.put("result", "successfully generated!");
-        return resultMap;
-    }
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        String requestUri = request.getRequestURI();
-        String requestArgs = request.getQueryString();
-
-        Map<String, Object> resultMap = new HashMap<>();
-        String pathInfo = requestUri.replace("/api/test_data/", "");
-        switch (pathInfo) {
-            case "suite":
-                resultMap = this.generateSuiteTestData(request, response);
-                break;
-            default:
-                throw new IllegalArgumentException("Invalid path info of URL");
-        }
-
-        String json = new Gson().toJson(resultMap);
-        response.setStatus(HttpServletResponse.SC_OK);
-        response.setContentType("application/json");
-        response.setCharacterEncoding("UTF-8");
-        response.getWriter().write(json);
-    }
-
-    /** Add mock data to local dev datastore. */
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
-            response.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE);
-            return;
-        }
-
-        UserService userService = UserServiceFactory.getUserService();
-        User currentUser = userService.getCurrentUser();
-
-        String pathInfo = request.getPathInfo();
-        String[] pathParts = pathInfo.split("/");
-        if (pathParts.length > 1) {
-            // Read the json output
-            Reader postJsonReader = new InputStreamReader(request.getInputStream());
-            Gson gson = new GsonBuilder().create();
-
-            String testType = pathParts[1];
-            if (testType.equalsIgnoreCase("report")) {
-                TestReportDataObject trdObj =
-                        gson.fromJson(postJsonReader, TestReportDataObject.class);
-                logger.log(Level.INFO, "trdObj => " + trdObj);
-                trdObj.testList.forEach(
-                        test -> {
-                            test.testRunList.forEach(
-                                    testRun -> {
-                                        TestEntity testEntity = new TestEntity(testRun.testName);
-
-                                        Key testRunKey =
-                                                KeyFactory.createKey(
-                                                        testEntity.getOldKey(),
-                                                        TestRunEntity.KIND,
-                                                        testRun.startTimestamp);
-
-                                        List<TestCaseReference> failingTestCases =
-                                                new ArrayList<>();
-                                        for (int idx = 0;
-                                                idx < testRun.failingTestcaseIds.size();
-                                                idx++) {
-                                            failingTestCases.add(
-                                                    new TestCaseReference(
-                                                            testRun.failingTestcaseIds.get(idx),
-                                                            testRun.failingTestcaseOffsets.get(
-                                                                    idx)));
-                                        }
-
-                                        TestStatusEntity testStatusEntity =
-                                                new TestStatusEntity(
-                                                        testRun.testName,
-                                                        testRun.startTimestamp,
-                                                        (int) testRun.passCount,
-                                                        failingTestCases.size(),
-                                                        failingTestCases);
-                                        datastore.put(testStatusEntity.toEntity());
-
-                                        testRun.coverageList.forEach(
-                                                testRunCoverage -> {
-                                                    CoverageEntity coverageEntity =
-                                                            new CoverageEntity(
-                                                                    testRunKey,
-                                                                    testRunCoverage.group,
-                                                                    testRunCoverage
-                                                                            .coveredLineCount,
-                                                                    testRunCoverage.totalLineCount,
-                                                                    testRunCoverage.filePath,
-                                                                    testRunCoverage.projectName,
-                                                                    testRunCoverage.projectVersion,
-                                                                    testRunCoverage.lineCoverage);
-                                                    datastore.put(coverageEntity.toEntity());
-                                                });
-
-                                        testRun.profilingList.forEach(
-                                                testRunProfile -> {
-                                                    ProfilingPointRunEntity profilingEntity =
-                                                            new ProfilingPointRunEntity(
-                                                                    testRunKey,
-                                                                    testRunProfile.name,
-                                                                    testRunProfile.type,
-                                                                    testRunProfile.regressionMode,
-                                                                    testRunProfile.labels,
-                                                                    testRunProfile.values,
-                                                                    testRunProfile.xLabel,
-                                                                    testRunProfile.yLabel,
-                                                                    testRunProfile.options);
-                                                    datastore.put(profilingEntity.toEntity());
-                                                });
-
-                                        TestCaseRunEntity testCaseEntity = new TestCaseRunEntity();
-                                        testRun.testCaseRunList.forEach(
-                                                testCaseRun -> {
-                                                    for (int idx = 0;
-                                                            idx < testCaseRun.testCaseNames.size();
-                                                            idx++) {
-                                                        testCaseEntity.addTestCase(
-                                                                testCaseRun.testCaseNames.get(idx),
-                                                                testCaseRun.results.get(idx));
-                                                    }
-                                                });
-                                        datastore.put(testCaseEntity.toEntity());
-
-                                        testRun.deviceInfoList.forEach(
-                                                deviceInfo -> {
-                                                    DeviceInfoEntity deviceInfoEntity =
-                                                            new DeviceInfoEntity(
-                                                                    testRunKey,
-                                                                    deviceInfo.branch,
-                                                                    deviceInfo.product,
-                                                                    deviceInfo.buildFlavor,
-                                                                    deviceInfo.buildId,
-                                                                    deviceInfo.abiBitness,
-                                                                    deviceInfo.abiName);
-                                                    ;
-                                                    datastore.put(deviceInfoEntity.toEntity());
-                                                });
-
-                                        testRun.buildTargetList.forEach(
-                                                buildTarget -> {
-                                                    BuildTargetEntity buildTargetEntity =
-                                                            new BuildTargetEntity(
-                                                                    buildTarget.targetName);
-                                                    buildTargetEntity.save();
-                                                });
-
-                                        testRun.branchList.forEach(
-                                                branch -> {
-                                                    BranchEntity branchEntity =
-                                                            new BranchEntity(branch.branchName);
-                                                    branchEntity.save();
-                                                });
-
-                                        boolean hasCodeCoverage =
-                                                testRun.totalLineCount > 0
-                                                        && testRun.coveredLineCount >= 0;
-                                        TestRunEntity testRunEntity =
-                                                new TestRunEntity(
-                                                        testEntity.getOldKey(),
-                                                        testRun.type,
-                                                        testRun.startTimestamp,
-                                                        testRun.endTimestamp,
-                                                        testRun.testBuildId,
-                                                        testRun.hostName,
-                                                        testRun.passCount,
-                                                        testRun.failCount,
-                                                        hasCodeCoverage,
-                                                        testRun.testCaseIds,
-                                                        testRun.links);
-                                        datastore.put(testRunEntity.toEntity());
-
-                                        CodeCoverageEntity codeCoverageEntity =
-                                                new CodeCoverageEntity(
-                                                        testRunEntity.getKey(),
-                                                        testRun.coveredLineCount,
-                                                        testRun.totalLineCount);
-                                        datastore.put(codeCoverageEntity.toEntity());
-
-                                        Entity newTestEntity = testEntity.toEntity();
-
-                                        Transaction txn = datastore.beginTransaction();
-                                        try {
-                                            // Check if test already exists in the datastore
-                                            try {
-                                                Entity oldTest =
-                                                        datastore.get(testEntity.getOldKey());
-                                                TestEntity oldTestEntity =
-                                                        TestEntity.fromEntity(oldTest);
-                                                if (oldTestEntity == null
-                                                        || !oldTestEntity.equals(testEntity)) {
-                                                    datastore.put(newTestEntity);
-                                                }
-                                            } catch (EntityNotFoundException e) {
-                                                datastore.put(newTestEntity);
-                                            }
-                                            txn.commit();
-
-                                        } catch (ConcurrentModificationException
-                                                | DatastoreFailureException
-                                                | DatastoreTimeoutException e) {
-                                            logger.log(
-                                                    Level.WARNING,
-                                                    "Retrying test run insert: "
-                                                            + newTestEntity.getKey());
-                                        } finally {
-                                            if (txn.isActive()) {
-                                                logger.log(
-                                                        Level.WARNING,
-                                                        "Transaction rollback forced for run: "
-                                                                + testRunEntity.getKey());
-                                                txn.rollback();
-                                            }
-                                        }
-                                    });
-                        });
-            } else {
-                TestPlanReportDataObject tprdObj =
-                        gson.fromJson(postJsonReader, TestPlanReportDataObject.class);
-                tprdObj.testPlanList.forEach(
-                        testPlan -> {
-                            Entity testPlanEntity =
-                                    new TestPlanEntity(testPlan.testPlanName).toEntity();
-                            List<Key> testRunKeys = new ArrayList<>();
-                            for (int idx = 0; idx < testPlan.testModules.size(); idx++) {
-                                String test = testPlan.testModules.get(idx);
-                                long time = testPlan.testTimes.get(idx);
-                                Key parentKey = KeyFactory.createKey(TestEntity.KIND, test);
-                                Key testRunKey =
-                                        KeyFactory.createKey(parentKey, TestRunEntity.KIND, time);
-                                testRunKeys.add(testRunKey);
-                            }
-                            Map<Key, Entity> testRuns = datastore.get(testRunKeys);
-                            long passCount = 0;
-                            long failCount = 0;
-                            long startTimestamp = -1;
-                            long endTimestamp = -1;
-                            String testBuildId = null;
-                            long type = 0;
-                            Set<DeviceInfoEntity> devices = new HashSet<>();
-                            for (Key testRunKey : testRuns.keySet()) {
-                                TestRunEntity testRun =
-                                        TestRunEntity.fromEntity(testRuns.get(testRunKey));
-                                if (testRun == null) {
-                                    continue; // not a valid test run
-                                }
-                                passCount += testRun.getPassCount();
-                                failCount += testRun.getFailCount();
-                                if (startTimestamp < 0 || testRunKey.getId() < startTimestamp) {
-                                    startTimestamp = testRunKey.getId();
-                                }
-                                if (endTimestamp < 0 || testRun.getEndTimestamp() > endTimestamp) {
-                                    endTimestamp = testRun.getEndTimestamp();
-                                }
-                                type = testRun.getType();
-                                testBuildId = testRun.getTestBuildId();
-                                Query deviceInfoQuery =
-                                        new Query(DeviceInfoEntity.KIND).setAncestor(testRunKey);
-                                for (Entity deviceInfoEntity :
-                                        datastore.prepare(deviceInfoQuery).asIterable()) {
-                                    DeviceInfoEntity device =
-                                            DeviceInfoEntity.fromEntity(deviceInfoEntity);
-                                    if (device == null) {
-                                        continue; // invalid entity
-                                    }
-                                    devices.add(device);
-                                }
-                            }
-                            if (startTimestamp < 0 || testBuildId == null || type == 0) {
-                                logger.log(
-                                        Level.WARNING,
-                                        "Couldn't infer test run information from runs.");
-                                return;
-                            }
-                            TestPlanRunEntity testPlanRun =
-                                    new TestPlanRunEntity(
-                                            testPlanEntity.getKey(),
-                                            testPlan.testPlanName,
-                                            type,
-                                            startTimestamp,
-                                            endTimestamp,
-                                            testBuildId,
-                                            passCount,
-                                            failCount,
-                                            0L,
-                                            0L,
-                                            testRunKeys);
-
-                            // Create the device infos.
-                            for (DeviceInfoEntity device : devices) {
-                                datastore.put(
-                                        device.copyWithParent(testPlanRun.getOfyKey()).toEntity());
-                            }
-                            datastore.put(testPlanRun.toEntity());
-
-                            Transaction txn = datastore.beginTransaction();
-                            try {
-                                // Check if test already exists in the database
-                                try {
-                                    datastore.get(testPlanEntity.getKey());
-                                } catch (EntityNotFoundException e) {
-                                    datastore.put(testPlanEntity);
-                                }
-                                txn.commit();
-                            } catch (ConcurrentModificationException
-                                    | DatastoreFailureException
-                                    | DatastoreTimeoutException e) {
-                                logger.log(
-                                        Level.WARNING,
-                                        "Retrying test plan insert: " + testPlanEntity.getKey());
-                            } finally {
-                                if (txn.isActive()) {
-                                    logger.log(
-                                            Level.WARNING,
-                                            "Transaction rollback forced for plan run: "
-                                                    + testPlanRun.key);
-                                    txn.rollback();
-                                }
-                            }
-                        });
-            }
-        } else {
-            logger.log(Level.WARNING, "URL path parameter is omitted!");
-        }
-
-        response.setStatus(HttpServletResponse.SC_OK);
-    }
-}
diff --git a/src/main/java/com/android/vts/api/TestRunRestServlet.java b/src/main/java/com/android/vts/api/TestRunRestServlet.java
deleted file mode 100644
index 90fd3f9..0000000
--- a/src/main/java/com/android/vts/api/TestRunRestServlet.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.util.TestRunDetails;
-import com.google.gson.Gson;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.logging.Logger;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Servlet for handling requests to fetch test case results. */
-public class TestRunRestServlet extends BaseApiServlet {
-    private static final String LATEST = "latest";
-    protected static final Logger logger = Logger.getLogger(TestRunRestServlet.class.getName());
-
-    /**
-     * Get the test case results for the specified run of the specified test.
-     *
-     * @param test The test whose test cases to get.
-     * @param timeString The string representation of the test run timestamp (in microseconds).
-     * @return A TestRunDetails object with the test case details for the specified run.
-     */
-    private TestRunDetails getTestRunDetails(String test, String timeString) {
-        long timestamp;
-        try {
-            timestamp = Long.parseLong(timeString);
-            if (timestamp <= 0) throw new NumberFormatException();
-            timestamp = timestamp > 0 ? timestamp : null;
-        } catch (NumberFormatException e) {
-            return null;
-        }
-
-        TestRunEntity testRunEntity = TestRunEntity.getByTestNameId(test, timestamp);
-
-        return getTestRunDetails(testRunEntity);
-    }
-
-    /**
-     * Get the test case results for the latest run of the specified test.
-     *
-     * @param testName The test whose test cases to get.
-     * @return A TestRunDetails object with the test case details for the latest run.
-     */
-    private TestRunDetails getLatestTestRunDetails(String testName) {
-        com.googlecode.objectify.Key testKey =
-                com.googlecode.objectify.Key.create(
-                        TestEntity.class, testName);
-
-        TestRunEntity testRun = ofy().load().type(TestRunEntity.class).ancestor(testKey)
-                .filter("type", 2).orderKey(true).first().now();
-
-        if (testRun == null) return null;
-
-        return getTestRunDetails(testRun);
-    }
-
-    /**
-     * Get TestRunDetails instance from codeCoverageEntity instance.
-     *
-     * @param testRunEntity The TestRunEntity to access testCaseId.
-     * @return A TestRunDetails object with the test case details for the latest run.
-     */
-    private TestRunDetails getTestRunDetails(TestRunEntity testRunEntity) {
-        TestRunDetails details = new TestRunDetails();
-        List<com.googlecode.objectify.Key<TestCaseRunEntity>> testCaseKeyList = new ArrayList<>();
-        if ( Objects.isNull(testRunEntity.getTestCaseIds()) ) {
-            return details;
-        } else {
-            for (long testCaseId : testRunEntity.getTestCaseIds()) {
-                testCaseKeyList.add(
-                        com.googlecode.objectify.Key.create(TestCaseRunEntity.class, testCaseId));
-            }
-            Map<com.googlecode.objectify.Key<TestCaseRunEntity>, TestCaseRunEntity>
-                    testCaseRunEntityKeyMap = ofy().load().keys(() -> testCaseKeyList.iterator());
-            testCaseRunEntityKeyMap.forEach((key, value) -> details.addTestCase(value));
-        }
-        return details;
-    }
-
-    /**
-     * Get the test case details for a test run.
-     *
-     * Expected format: (1) /api/test_run?test=[test name]&timestamp=[timestamp] to the details
-     * for a specific run, or (2) /api/test_run?test=[test name]&timestamp=latest -- the details for
-     * the latest test run.
-     */
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        String test = request.getParameter("test");
-        String timeString = request.getParameter("timestamp");
-        TestRunDetails details = null;
-
-        if (timeString != null && timeString.equals(LATEST)) {
-            details = getLatestTestRunDetails(test);
-        } else if (timeString != null) {
-            details = getTestRunDetails(test, timeString);
-        }
-
-        if (details == null) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-        } else {
-            response.setStatus(HttpServletResponse.SC_OK);
-            response.setContentType("application/json");
-            PrintWriter writer = response.getWriter();
-            writer.print(new Gson().toJson(details.toJson()));
-            writer.flush();
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/api/TestSuiteResultRestServlet.java b/src/main/java/com/android/vts/api/TestSuiteResultRestServlet.java
deleted file mode 100644
index 38be2c0..0000000
--- a/src/main/java/com/android/vts/api/TestSuiteResultRestServlet.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.TestSuiteFileEntity;
-import com.android.vts.entity.TestSuiteResultEntity;
-import com.android.vts.proto.TestSuiteResultMessageProto;
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.jackson.JacksonFactory;
-import com.google.api.services.oauth2.Oauth2;
-import com.google.api.services.oauth2.model.Tokeninfo;
-import com.google.gson.Gson;
-import com.googlecode.objectify.Key;
-import org.apache.commons.codec.binary.Base64;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-
-/** REST endpoint for posting test suite data to the Dashboard. */
-public class TestSuiteResultRestServlet extends BaseApiServlet {
-    private static String SERVICE_CLIENT_ID;
-    private static final String SERVICE_NAME = "VTS Dashboard";
-    private static final Logger logger =
-            Logger.getLogger(TestSuiteResultRestServlet.class.getName());
-
-    @Override
-    public void init(ServletConfig cfg) throws ServletException {
-        super.init(cfg);
-
-        SERVICE_CLIENT_ID = systemConfigProp.getProperty("appengine.serviceClientID");
-    }
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        // Retrieve the params
-        TestSuiteResultMessageProto.TestSuiteResultMessage testSuiteResultMessage;
-        try {
-            String payload = request.getReader().lines().collect(Collectors.joining());
-            byte[] value = Base64.decodeBase64(payload);
-            testSuiteResultMessage =
-                    TestSuiteResultMessageProto.TestSuiteResultMessage.parseFrom(value);
-        } catch (IOException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            logger.log(Level.WARNING, "Invalid proto: " + e.getLocalizedMessage());
-            return;
-        }
-
-        Map<String, Object> resultMap = new HashMap<>();
-        // Verify service account access token.
-        if (testSuiteResultMessage.hasAccessToken()) {
-            String accessToken = testSuiteResultMessage.getAccessToken();
-            logger.log(Level.INFO, "accessToken => " + accessToken);
-            GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
-            Oauth2 oauth2 =
-                    new Oauth2.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
-                            .setApplicationName(SERVICE_NAME)
-                            .build();
-            Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(accessToken).execute();
-
-            if (tokenInfo.getIssuedTo().equals(SERVICE_CLIENT_ID)) {
-                String filePath = "suite_result/2019/04/06/132343.bin";
-                Key<TestSuiteFileEntity> testSuiteFileParent =
-                        Key.create(TestSuiteFileEntity.class, filePath);
-                TestSuiteFileEntity newTestSuiteFileEntity = new TestSuiteFileEntity(filePath);
-                TestSuiteResultEntity testSuiteResultEntity =
-                        new TestSuiteResultEntity(
-                                testSuiteFileParent,
-                                testSuiteResultMessage.getStartTime(),
-                                testSuiteResultMessage.getEndTime(),
-                                testSuiteResultMessage.getTestType(),
-                                testSuiteResultMessage.getBootSuccess(),
-                                testSuiteResultMessage.getResultPath(),
-                                testSuiteResultMessage.getInfraLogPath(),
-                                testSuiteResultMessage.getHostName(),
-                                testSuiteResultMessage.getSuitePlan(),
-                                testSuiteResultMessage.getSuiteVersion(),
-                                testSuiteResultMessage.getSuiteName(),
-                                testSuiteResultMessage.getSuiteBuildNumber(),
-                                testSuiteResultMessage.getModulesDone(),
-                                testSuiteResultMessage.getModulesTotal(),
-                                testSuiteResultMessage.getBranch(),
-                                testSuiteResultMessage.getTarget(),
-                                testSuiteResultMessage.getBuildId(),
-                                testSuiteResultMessage.getBuildSystemFingerprint(),
-                                testSuiteResultMessage.getBuildVendorFingerprint(),
-                                testSuiteResultMessage.getPassedTestCaseCount(),
-                                testSuiteResultMessage.getFailedTestCaseCount());
-
-                testSuiteResultEntity.save(newTestSuiteFileEntity);
-                resultMap.put("result", "successfully saved!");
-            } else {
-                logger.log(Level.WARNING, "service_client_id didn't match!");
-                logger.log(Level.INFO, "SERVICE_CLIENT_ID => " + tokenInfo.getIssuedTo());
-                resultMap.put("result", "Wrong Service Client ID!");
-            }
-        } else {
-            logger.log(Level.WARNING, "postMessage do not contain any accessToken!");
-            resultMap.put("result", "Access Token Missing!");
-        }
-        String json = new Gson().toJson(resultMap);
-        response.setStatus(HttpServletResponse.SC_OK);
-        response.setContentType("application/json");
-        response.setCharacterEncoding("UTF-8");
-        response.getWriter().write(json);
-    }
-}
diff --git a/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java b/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java
deleted file mode 100644
index 30fd649..0000000
--- a/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.UserFavoriteEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.CompositeFilterOperator;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import com.google.appengine.api.datastore.Transaction;
-import com.google.appengine.api.users.User;
-import com.google.appengine.api.users.UserService;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for handling requests to add or remove subscriptions. */
-public class UserFavoriteRestServlet extends BaseApiServlet {
-    protected static final Logger logger =
-            Logger.getLogger(UserFavoriteRestServlet.class.getName());
-
-    /**
-     * Add a new favorite entity.
-     *
-     * @param user The user for which to add a favorite.
-     * @param test The name of the test.
-     * @param muteNotifications True if the subscriber has muted notifications, false otherwise.
-     * @param response The servlet response object.
-     * @return a json object with the generated key to the new favorite entity.
-     * @throws IOException
-     */
-    private static JsonObject addFavorite(
-            User user, String test, boolean muteNotifications, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Key addedTestKey = KeyFactory.createKey(TestEntity.KIND, test);
-        // Filter the tests that exist from the set of tests to add
-        try {
-            datastore.get(addedTestKey);
-        } catch (EntityNotFoundException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return null;
-        }
-
-        Filter userFilter =
-                new FilterPredicate(UserFavoriteEntity.USER, FilterOperator.EQUAL, user);
-        Filter testFilter =
-                new FilterPredicate(
-                        UserFavoriteEntity.TEST_KEY, FilterOperator.EQUAL, addedTestKey);
-        Query q =
-                new Query(UserFavoriteEntity.KIND)
-                        .setFilter(CompositeFilterOperator.and(userFilter, testFilter))
-                        .setKeysOnly();
-
-        Key favoriteKey = null;
-
-        Transaction txn = datastore.beginTransaction();
-        try {
-            for (Entity e : datastore.prepare(q).asIterable()) {
-                favoriteKey = e.getKey();
-                break;
-            }
-            if (favoriteKey == null) {
-                UserFavoriteEntity favorite =
-                        new UserFavoriteEntity(user, addedTestKey, muteNotifications);
-                Entity entity = favorite.toEntity();
-                datastore.put(entity);
-                favoriteKey = entity.getKey();
-            }
-            txn.commit();
-        } finally {
-            if (txn.isActive()) {
-                logger.log(
-                        Level.WARNING,
-                        "Transaction rollback forced for favorite creation: " + test);
-                txn.rollback();
-            }
-        }
-        JsonObject json = new JsonObject();
-        json.add("key", new JsonPrimitive(KeyFactory.keyToString(favoriteKey)));
-        return json;
-    }
-
-    /**
-     * @param user The user for which to add a favorite.
-     * @param favoriteKey The database key to the favorite entity to update.
-     * @param muteNotifications True if the subscriber has muted notifications, false otherwise.
-     * @param response The servlet response object.
-     * @return a json object with the generated key to the new favorite entity.
-     * @throws IOException
-     */
-    private static JsonObject updateFavorite(
-            User user, Key favoriteKey, boolean muteNotifications, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Entity favoriteEntity;
-        try {
-            favoriteEntity = datastore.get(favoriteKey);
-        } catch (EntityNotFoundException e) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return null;
-        }
-        UserFavoriteEntity favorite = UserFavoriteEntity.fromEntity(favoriteEntity);
-        if (favorite.user.getUserId() == user.getUserId()) {
-            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-            return null;
-        }
-        if (favorite.muteNotifications != muteNotifications) {
-            Transaction txn = datastore.beginTransaction();
-            try {
-                favorite.muteNotifications = muteNotifications;
-                datastore.put(favorite.toEntity());
-                txn.commit();
-            } finally {
-                if (txn.isActive()) {
-                    logger.log(
-                            Level.WARNING,
-                            "Transaction rollback forced for favorite update: " + favoriteKey);
-                    txn.rollback();
-                }
-            }
-        }
-        JsonObject json = new JsonObject();
-        json.add("key", new JsonPrimitive(KeyFactory.keyToString(favoriteKey)));
-        return json;
-    }
-
-    /** Add a test to the user's favorites. */
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        UserService userService = UserServiceFactory.getUserService();
-        User currentUser = userService.getCurrentUser();
-
-        boolean muteNotifications = false;
-        if (request.getParameter(UserFavoriteEntity.MUTE_NOTIFICATIONS) != null) {
-            muteNotifications =
-                    Boolean.parseBoolean(
-                            request.getParameter(UserFavoriteEntity.MUTE_NOTIFICATIONS));
-        }
-
-        String userFavoritesKeyString = request.getParameter("userFavoritesKey");
-        String testName = request.getParameter("testName");
-
-        JsonObject returnData = null;
-        if (userFavoritesKeyString != null) {
-            Key userFavoritesKey = KeyFactory.stringToKey(userFavoritesKeyString);
-            returnData = updateFavorite(currentUser, userFavoritesKey, muteNotifications, response);
-        } else if (testName != null) {
-            returnData = addFavorite(currentUser, testName, muteNotifications, response);
-        }
-
-        if (returnData != null) {
-            response.setContentType("application/json");
-            PrintWriter writer = response.getWriter();
-            writer.print(new Gson().toJson(returnData));
-            writer.flush();
-        }
-    }
-
-    /** Remove a test from the user's favorites. */
-    @Override
-    public void doDelete(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        String stringKey = request.getPathInfo();
-        if (stringKey == null) {
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-            return;
-        }
-        if (stringKey.startsWith("/")) {
-            stringKey = stringKey.substring(1);
-        }
-        datastore.delete(KeyFactory.stringToKey(stringKey));
-        response.setStatus(HttpServletResponse.SC_OK);
-    }
-}
diff --git a/src/main/java/com/android/vts/config/ObjectifyListener.java b/src/main/java/com/android/vts/config/ObjectifyListener.java
deleted file mode 100644
index 02e0215..0000000
--- a/src/main/java/com/android/vts/config/ObjectifyListener.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.config;
-
-import com.android.vts.entity.ApiCoverageEntity;
-import com.android.vts.entity.BranchEntity;
-import com.android.vts.entity.BuildTargetEntity;
-import com.android.vts.entity.ApiCoverageExcludedEntity;
-import com.android.vts.entity.CodeCoverageEntity;
-import com.android.vts.entity.CoverageEntity;
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.HalApiEntity;
-import com.android.vts.entity.ProfilingPointEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.ProfilingPointSummaryEntity;
-import com.android.vts.entity.RoleEntity;
-import com.android.vts.entity.TestAcknowledgmentEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestCoverageStatusEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.entity.TestStatusEntity;
-import com.android.vts.entity.TestSuiteFileEntity;
-import com.android.vts.entity.TestSuiteResultEntity;
-import com.android.vts.entity.UserEntity;
-import com.google.api.client.extensions.appengine.datastore.AppEngineDataStoreFactory;
-import com.google.api.services.sheets.v4.SheetsScopes;
-import com.googlecode.objectify.ObjectifyService;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.function.Supplier;
-import java.util.stream.Stream;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.annotation.WebListener;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** The @WebListener annotation for registering a class as a listener of a web application. */
-@WebListener
-/**
- * Initializing Objectify Service at the container start up before any web components like servlet
- * get initialized.
- */
-public class ObjectifyListener implements ServletContextListener {
-
-    private static final Logger logger = Logger.getLogger(ObjectifyListener.class.getName());
-
-
-    /** Global instance of the DataStoreFactory. */
-    private static final AppEngineDataStoreFactory DATA_STORE_FACTORY =
-            AppEngineDataStoreFactory.getDefaultInstance();
-
-    /** Global instance of the scopes. */
-    private static final List<String> GOOGLE_API_SCOPES =
-            Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY);
-
-    /**
-     * Receives notification that the web application initialization process is starting. This
-     * function will register Entity classes for objectify.
-     */
-    @Override
-    public void contextInitialized(ServletContextEvent servletContextEvent) {
-        ObjectifyService.init();
-        ObjectifyService.register(BranchEntity.class);
-        ObjectifyService.register(BuildTargetEntity.class);
-
-        ObjectifyService.register(HalApiEntity.class);
-        ObjectifyService.register(ApiCoverageEntity.class);
-        ObjectifyService.register(ApiCoverageExcludedEntity.class);
-        ObjectifyService.register(CodeCoverageEntity.class);
-        ObjectifyService.register(CoverageEntity.class);
-        ObjectifyService.register(DeviceInfoEntity.class);
-        ObjectifyService.register(TestCoverageStatusEntity.class);
-
-        ObjectifyService.register(ProfilingPointEntity.class);
-        ObjectifyService.register(ProfilingPointRunEntity.class);
-        ObjectifyService.register(ProfilingPointSummaryEntity.class);
-
-        ObjectifyService.register(TestEntity.class);
-        ObjectifyService.register(TestPlanEntity.class);
-        ObjectifyService.register(TestPlanRunEntity.class);
-        ObjectifyService.register(TestRunEntity.class);
-        ObjectifyService.register(TestCaseRunEntity.class);
-        ObjectifyService.register(TestStatusEntity.class);
-        ObjectifyService.register(TestSuiteFileEntity.class);
-        ObjectifyService.register(TestSuiteResultEntity.class);
-        ObjectifyService.register(TestAcknowledgmentEntity.class);
-        ObjectifyService.register(RoleEntity.class);
-        ObjectifyService.register(UserEntity.class);
-        ObjectifyService.begin();
-        logger.log(Level.INFO, "Value Initialized from context.");
-
-        Properties systemConfigProp = new Properties();
-
-        try {
-            InputStream defaultInputStream =
-                    ObjectifyListener.class
-                            .getClassLoader()
-                            .getResourceAsStream("config.properties");
-
-            systemConfigProp.load(defaultInputStream);
-
-            servletContextEvent
-                    .getServletContext()
-                    .setAttribute("systemConfigProp", systemConfigProp);
-            servletContextEvent
-                    .getServletContext()
-                    .setAttribute("dataStoreFactory", DATA_STORE_FACTORY);
-            servletContextEvent
-                    .getServletContext()
-                    .setAttribute("googleApiScopes", GOOGLE_API_SCOPES);
-
-            String roleList = systemConfigProp.getProperty("user.roleList");
-            Supplier<Stream<String>> streamSupplier = () -> Arrays.stream(roleList.split(","));
-            this.createRoles(streamSupplier.get());
-
-            String adminEmail = systemConfigProp.getProperty("user.adminEmail");
-            if (adminEmail.isEmpty()) {
-                logger.log(Level.WARNING, "Admin email is not properly set. Check config file");
-            } else {
-                String adminName = systemConfigProp.getProperty("user.adminName");
-                String adminCompany = systemConfigProp.getProperty("user.adminCompany");
-                Optional<String> roleName =
-                        streamSupplier.get().filter(r -> r.equals("admin")).findFirst();
-                this.createAdminUser(adminEmail, adminName, adminCompany, roleName.orElse("admin"));
-            }
-        } catch (FileNotFoundException e) {
-            logger.log(Level.SEVERE, e.getMessage());
-        } catch (IOException e) {
-            logger.log(Level.SEVERE, e.getMessage());
-        }
-    }
-
-    /** Receives notification that the ServletContext is about to be shut down. */
-    @Override
-    public void contextDestroyed(ServletContextEvent servletContextEvent) {
-        ServletContext servletContext = servletContextEvent.getServletContext();
-        logger.log(Level.INFO, "Value deleted from context.");
-    }
-
-    private void createRoles(Stream<String> roleStream) {
-        roleStream
-                .map(role -> role.trim())
-                .forEach(
-                        roleName -> {
-                            RoleEntity roleEntity = new RoleEntity(roleName);
-                            roleEntity.save();
-                        });
-    }
-
-    private void createAdminUser(String email, String name, String company, String role) {
-        Optional<UserEntity> adminUserEntityOptional =
-                Optional.ofNullable(UserEntity.getAdminUser(email));
-        if (adminUserEntityOptional.isPresent()) {
-            logger.log(Level.INFO, "The user is already registered.");
-        } else {
-            UserEntity userEntity = new UserEntity(email, name, company, role);
-            userEntity.setIsAdmin(true);
-            userEntity.save();
-            logger.log(Level.INFO, "The user is saved successfully.");
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/config/ObjectifyWebFilter.java b/src/main/java/com/android/vts/config/ObjectifyWebFilter.java
deleted file mode 100644
index 3813d0b..0000000
--- a/src/main/java/com/android/vts/config/ObjectifyWebFilter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.config;
-
-import com.googlecode.objectify.ObjectifyFilter;
-
-import javax.servlet.annotation.WebFilter;
-
-/** Annotation used to declare a servlet filter. */
-@WebFilter(urlPatterns = {"/*"})
-/**
- * Servlet filter for objectify library. Objectify requires a filter to clean up any thread-local
- * transaction contexts and pending asynchronous operations that remain at the end of a request.
- */
-public class ObjectifyWebFilter extends ObjectifyFilter {}
diff --git a/src/main/java/com/android/vts/entity/ApiCoverageEntity.java b/src/main/java/com/android/vts/entity/ApiCoverageEntity.java
deleted file mode 100644
index 9c74032..0000000
--- a/src/main/java/com/android/vts/entity/ApiCoverageEntity.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.googlecode.objectify.Key;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.Parent;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-/** Entity Class for ApiCoverageEntity */
-@Cache
-@Entity(name = "ApiCoverage")
-@EqualsAndHashCode(of = "id")
-@NoArgsConstructor
-@JsonAutoDetect(fieldVisibility = Visibility.ANY)
-@JsonIgnoreProperties({"id", "parent"})
-public class ApiCoverageEntity implements DashboardEntity {
-
-    /** ApiCoverageEntity id field */
-    @Id @Getter @Setter String id;
-
-    @Parent @Getter Key<?> parent;
-
-    /** HAL package name. e.g. android.hardware.foo. */
-    @Index @Getter @Setter String halPackageName;
-
-    /** HAL (major) version. e.g. 1. */
-    @Index @Getter @Setter int halMajorVersion;
-
-    /** HAL (minor) version. e.g. 0. */
-    @Index @Getter @Setter int halMinorVersion;
-
-    /** HAL interface name. e.g. IFoo. */
-    @Index @Getter @Setter String halInterfaceName;
-
-    /** List of HAL API */
-    @Getter @Setter List<String> halApi;
-
-    /** List of HAL covered API */
-    @Getter @Setter List<String> coveredHalApi;
-
-    /** When this record was created or updated */
-    @Index Date updated;
-
-    /** Constructor function for ApiCoverageEntity Class */
-    public ApiCoverageEntity(
-            com.google.appengine.api.datastore.Key testRunKey,
-            String halPackageName,
-            int halVersionMajor,
-            int halVersionMinor,
-            String halInterfaceName,
-            List<String> halApi,
-            List<String> coveredHalApi) {
-        this.id = UUID.randomUUID().toString();
-        this.parent = getParentKey(testRunKey);
-
-        this.halPackageName = halPackageName;
-        this.halMajorVersion = halVersionMajor;
-        this.halMinorVersion = halVersionMinor;
-        this.halInterfaceName = halInterfaceName;
-        this.halApi = halApi;
-        this.coveredHalApi = coveredHalApi;
-        this.updated = new Date();
-    }
-
-    /** Constructor function for ApiCoverageEntity Class with objectify Key. */
-    public ApiCoverageEntity(
-            Key testRunKey,
-            String halPackageName,
-            int halVersionMajor,
-            int halVersionMinor,
-            String halInterfaceName,
-            List<String> halApi,
-            List<String> coveredHalApi) {
-        this.id = UUID.randomUUID().toString();
-        this.parent = testRunKey;
-
-        this.halPackageName = halPackageName;
-        this.halMajorVersion = halVersionMajor;
-        this.halMinorVersion = halVersionMinor;
-        this.halInterfaceName = halInterfaceName;
-        this.halApi = halApi;
-        this.coveredHalApi = coveredHalApi;
-        this.updated = new Date();
-    }
-
-    /** Get objectify Key from datastore Key type */
-    private Key getParentKey(com.google.appengine.api.datastore.Key testRunKey) {
-        Key testParentKey = Key.create(TestEntity.class, testRunKey.getParent().getName());
-        return Key.create(testParentKey, TestRunEntity.class, testRunKey.getId());
-    }
-
-    /** Get UrlSafeKey from ApiCoverageEntity Information */
-    public String getUrlSafeKey() {
-        Key uuidKey = Key.create(this.parent, ApiCoverageEntity.class, this.id);
-        return uuidKey.toUrlSafe();
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public Key<ApiCoverageEntity> save() {
-        this.id = UUID.randomUUID().toString();
-        this.updated = new Date();
-        return ofy().save().entity(this).now();
-    }
-
-    /** Get List of ApiCoverageEntity by HAL interface name */
-    public static ApiCoverageEntity getByUrlSafeKey(String urlSafeKey) {
-        return ofy().load()
-                .type(ApiCoverageEntity.class)
-                .filterKey(com.google.cloud.datastore.Key.fromUrlSafe(urlSafeKey))
-                .first()
-                .now();
-    }
-
-    /** Get List of ApiCoverageEntity by HAL interface name */
-    public static List<ApiCoverageEntity> getByInterfaceNameList(String halInterfaceName) {
-        return ofy().load()
-                .type(ApiCoverageEntity.class)
-                .filter("halInterfaceName", halInterfaceName)
-                .list();
-    }
-
-    /** Get List of ApiCoverageEntity by HAL package name */
-    public static List<ApiCoverageEntity> getByPackageNameList(String packageName) {
-        return ofy().load()
-                .type(ApiCoverageEntity.class)
-                .filter("halPackageName", packageName)
-                .list();
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/ApiCoverageExcludedEntity.java b/src/main/java/com/android/vts/entity/ApiCoverageExcludedEntity.java
deleted file mode 100644
index 61bd6a7..0000000
--- a/src/main/java/com/android/vts/entity/ApiCoverageExcludedEntity.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.googlecode.objectify.Key;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Index;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.util.Date;
-import java.util.List;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/**
- * This entity class contain the excluded API information. And this information will be used to
- * calculate more precise the ratio of API coverage.
- */
-@Cache
-@Entity(name = "ApiCoverageExcluded")
-@EqualsAndHashCode(of = "id")
-@NoArgsConstructor
-@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
-@JsonIgnoreProperties({"id", "parent"})
-public class ApiCoverageExcludedEntity implements DashboardEntity {
-
-    /** ApiCoverageEntity id field */
-    @Id @Getter @Setter private String id;
-
-    /** Package name. e.g. android.hardware.foo. */
-    @Index @Getter @Setter private String packageName;
-
-    /** Major Version. e.g. 1, 2. */
-    @Getter @Setter private int majorVersion;
-
-    /** Minor Version. e.g. 0. */
-    @Getter @Setter private int minorVersion;
-
-    /** Interface name. e.g. IFoo. */
-    @Index @Getter @Setter private String interfaceName;
-
-    /** API Name */
-    @Index @Getter @Setter private String apiName;
-
-    /** The reason comment for the excluded API */
-    @Getter @Setter private String comment;
-
-    /** When this record was created or updated */
-    @Index @Getter @Setter private Date updated;
-
-    /** Constructor function for ApiCoverageExcludedEntity Class */
-    public ApiCoverageExcludedEntity(
-            String packageName,
-            String version,
-            String interfaceName,
-            String apiName,
-            String comment) {
-        this.id = this.getObjectifyId();
-        this.packageName = packageName;
-        this.interfaceName = interfaceName;
-        this.apiName = apiName;
-        this.comment = comment;
-        this.updated = new Date();
-
-        this.setVersions(version);
-    }
-
-    /** Setting major and minor version from version string */
-    private void setVersions(String version) {
-        String[] versionArray = version.split("[.]");
-        if (versionArray.length == 0) {
-            this.majorVersion = 0;
-            this.minorVersion = 0;
-        } else if (versionArray.length == 1) {
-            this.majorVersion = Integer.parseInt(versionArray[0]);
-            this.minorVersion = 0;
-        } else {
-            this.majorVersion = Integer.parseInt(versionArray[0]);
-            this.minorVersion = Integer.parseInt(versionArray[1]);
-        }
-    }
-
-    /** Getting objectify ID from the entity information */
-    private String getObjectifyId() {
-        return this.packageName
-                + "."
-                + this.majorVersion
-                + "."
-                + this.minorVersion
-                + "."
-                + this.interfaceName
-                + "."
-                + this.apiName;
-    }
-
-    /** Getting key from the entity */
-    public Key<ApiCoverageExcludedEntity> getKey() {
-        return Key.create(ApiCoverageExcludedEntity.class, this.getObjectifyId());
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public Key<ApiCoverageExcludedEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    /** Get All Key List of ApiCoverageExcludedEntity */
-    public static List<Key<ApiCoverageExcludedEntity>> getAllKeyList() {
-        return ofy().load().type(ApiCoverageExcludedEntity.class).keys().list();
-    }
-
-}
diff --git a/src/main/java/com/android/vts/entity/BranchEntity.java b/src/main/java/com/android/vts/entity/BranchEntity.java
deleted file mode 100644
index 1c9ea52..0000000
--- a/src/main/java/com/android/vts/entity/BranchEntity.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@com.googlecode.objectify.annotation.Entity(name = "Branch")
-@Cache
-@Data
-@NoArgsConstructor
-/** Entity describing a branch. */
-public class BranchEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(BranchEntity.class.getName());
-
-    public static final String KIND = "Branch"; // The entity kind.
-
-    @Id private String name;
-
-    /**
-     * Create a BranchEntity object.
-     *
-     * @param branchName The name of the branch.
-     */
-    public BranchEntity(String branchName) {
-        this.name = branchName;
-    }
-
-    public Key getKey() {
-        return KeyFactory.createKey(KIND, this.name);
-    }
-
-    /** find by branch name */
-    public static List<String> getByBranch(String branchName) {
-        if (branchName.equals("*")) {
-            return ofy().load()
-                    .type(BranchEntity.class)
-                    .limit(100)
-                    .list()
-                    .stream()
-                    .map(b -> b.name)
-                    .collect(Collectors.toList());
-        } else {
-            com.googlecode.objectify.Key startKey =
-                    com.googlecode.objectify.Key.create(BranchEntity.class, branchName);
-
-            int lastPosition = branchName.length() - 1;
-            int lastCharValue = branchName.charAt(lastPosition);
-            String nextChar = String.valueOf((char) (lastCharValue + 1));
-
-            String nextBranchName = branchName.substring(0, lastPosition) + nextChar;
-            com.googlecode.objectify.Key endKey =
-                    com.googlecode.objectify.Key.create(BranchEntity.class, nextBranchName);
-            return ofy().load()
-                    .type(BranchEntity.class)
-                    .filterKey(">=", startKey)
-                    .filterKey("<", endKey)
-                    .list()
-                    .stream()
-                    .map(b -> b.name)
-                    .collect(Collectors.toList());
-        }
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<BranchEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    /**
-     * Convert an Entity object to a BranchEntity.
-     *
-     * @param e The entity to process.
-     * @return BranchEntity object with the properties from e, or null if incompatible.
-     */
-    public static BranchEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || e.getKey().getName() == null) {
-            logger.log(Level.WARNING, "Missing branch attributes in entity: " + e.toString());
-            return null;
-        }
-        String branchName = e.getKey().getName();
-        return new BranchEntity(branchName);
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/BuildTargetEntity.java b/src/main/java/com/android/vts/entity/BuildTargetEntity.java
deleted file mode 100644
index 4180213..0000000
--- a/src/main/java/com/android/vts/entity/BuildTargetEntity.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@com.googlecode.objectify.annotation.Entity(name = "BuildTarget")
-@Cache
-@Data
-@NoArgsConstructor
-/** Entity describing a build target. */
-public class BuildTargetEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(BuildTargetEntity.class.getName());
-
-    public static final String KIND = "BuildTarget"; // The entity kind.
-
-    @Id private String name;
-
-    /**
-     * Create a BuildTargetEntity object.
-     *
-     * @param targetName The name of the build target.
-     */
-    public BuildTargetEntity(String targetName) {
-        this.name = targetName;
-    }
-
-    public Key getKey() {
-        return KeyFactory.createKey(KIND, this.name);
-    }
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<BuildTargetEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    /** find by Build Target Name */
-    public static List<String> getByBuildTarget(String buildTargetName) {
-        if (buildTargetName.equals("*")) {
-            return ofy().load()
-                    .type(BuildTargetEntity.class)
-                    .limit(100)
-                    .list()
-                    .stream()
-                    .map(b -> b.name)
-                    .collect(Collectors.toList());
-        } else {
-            com.googlecode.objectify.Key startKey =
-                    com.googlecode.objectify.Key.create(BuildTargetEntity.class, buildTargetName);
-
-            int lastPosition = buildTargetName.length() - 1;
-            int lastCharValue = buildTargetName.charAt(lastPosition);
-            String nextChar = String.valueOf((char) (lastCharValue + 1));
-
-            String nextBuildTargetName = buildTargetName.substring(0, lastPosition) + nextChar;
-            com.googlecode.objectify.Key endKey =
-                    com.googlecode.objectify.Key.create(
-                            BuildTargetEntity.class, nextBuildTargetName);
-            return ofy().load()
-                    .type(BuildTargetEntity.class)
-                    .filterKey(">=", startKey)
-                    .filterKey("<", endKey)
-                    .list()
-                    .stream()
-                    .map(b -> b.name)
-                    .collect(Collectors.toList());
-        }
-    }
-
-    /**
-     * Convert an Entity object to a BuildTargetEntity.
-     *
-     * @param e The entity to process.
-     * @return BuildTargetEntity object with the properties from e, or null if incompatible.
-     */
-    public static BuildTargetEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || e.getKey().getName() == null) {
-            logger.log(Level.WARNING, "Missing build target attributes in entity: " + e.toString());
-            return null;
-        }
-        String targetName = e.getKey().getName();
-        return new BuildTargetEntity(targetName);
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/CodeCoverageEntity.java b/src/main/java/com/android/vts/entity/CodeCoverageEntity.java
deleted file mode 100644
index 2a46b1f..0000000
--- a/src/main/java/com/android/vts/entity/CodeCoverageEntity.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.googlecode.objectify.Key;
-
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.Parent;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.util.Date;
-import java.util.logging.Logger;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Entity Class for CodeCoverageEntity */
-@Cache
-@Entity(name = "CodeCoverage")
-@EqualsAndHashCode(of = "id")
-@NoArgsConstructor
-@JsonAutoDetect(fieldVisibility = Visibility.ANY)
-@JsonIgnoreProperties({"id", "parent"})
-public class CodeCoverageEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(CodeCoverageEntity.class.getName());
-
-    public static final String KIND = "CodeCoverage";
-
-    public static final String COVERED_LINE_COUNT = "coveredLineCount";
-    public static final String TOTAL_LINE_COUNT = "totalLineCount";
-
-    /** CodeCoverageEntity id field */
-    @Id @Getter @Setter Long id;
-
-    @Parent @Getter Key<?> parent;
-
-    @Index @Getter @Setter private long coveredLineCount;
-
-    @Index @Getter @Setter private long totalLineCount;
-
-    /** When this record was created or updated */
-    @Index Date updated;
-
-    /** Constructor function for ApiCoverageEntity Class */
-    public CodeCoverageEntity(
-            com.google.appengine.api.datastore.Key testRunKey,
-            long coveredLineCount,
-            long totalLineCount) {
-
-        this.parent = getParentKey(testRunKey);
-
-        this.coveredLineCount = coveredLineCount;
-        this.totalLineCount = totalLineCount;
-    }
-
-    /** Constructor function for ApiCoverageEntity Class */
-    public CodeCoverageEntity(
-            long id,
-            com.google.appengine.api.datastore.Key testRunKey,
-            long coveredLineCount,
-            long totalLineCount) {
-        this.id = id;
-
-        this.parent = getParentKey(testRunKey);
-
-        this.coveredLineCount = coveredLineCount;
-        this.totalLineCount = totalLineCount;
-    }
-
-    /** Constructor function for ApiCoverageEntity Class with objectify key*/
-    public CodeCoverageEntity(Key testRunKey, long coveredLineCount, long totalLineCount) {
-        this.parent = testRunKey;
-        this.coveredLineCount = coveredLineCount;
-        this.totalLineCount = totalLineCount;
-    }
-
-    /** Get objectify Key from datastore Key type */
-    private Key getParentKey(com.google.appengine.api.datastore.Key testRunKey) {
-        Key testParentKey = Key.create(TestEntity.class, testRunKey.getParent().getName());
-        return Key.create(testParentKey, TestRunEntity.class, testRunKey.getId());
-    }
-
-    /** Get UrlSafeKey from ApiCoverageEntity Information */
-    public String getUrlSafeKey() {
-        Key uuidKey = Key.create(this.parent, CodeCoverageEntity.class, this.id);
-        return uuidKey.toUrlSafe();
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public Key<CodeCoverageEntity> save() {
-        this.id = this.getParent().getId();
-        this.updated = new Date();
-        return ofy().save().entity(this).now();
-    }
-
-    public com.google.appengine.api.datastore.Entity toEntity() {
-        com.google.appengine.api.datastore.Key testKey =
-                KeyFactory.createKey(TestEntity.KIND, this.getParent().getParent().getName());
-        com.google.appengine.api.datastore.Key testRunKey =
-                KeyFactory.createKey(testKey, TestRunEntity.KIND, this.getParent().getId());
-        com.google.appengine.api.datastore.Key codeCoverageKey =
-                KeyFactory.createKey(testRunKey, KIND, this.getParent().getId());
-
-        com.google.appengine.api.datastore.Entity codeCoverageEntity =
-                new com.google.appengine.api.datastore.Entity(codeCoverageKey);
-        codeCoverageEntity.setProperty(COVERED_LINE_COUNT, this.coveredLineCount);
-        codeCoverageEntity.setProperty(TOTAL_LINE_COUNT, this.totalLineCount);
-        codeCoverageEntity.setIndexedProperty("updated", new Date());
-        return codeCoverageEntity;
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/CodeCoverageFileEntity.java b/src/main/java/com/android/vts/entity/CodeCoverageFileEntity.java
deleted file mode 100644
index fe4e8a0..0000000
--- a/src/main/java/com/android/vts/entity/CodeCoverageFileEntity.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import com.googlecode.objectify.Key;
-
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.Parent;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.util.List;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Entity Class for CodeCoverageFile */
-@Cache
-@Entity(name = "CodeCoverageFile")
-@EqualsAndHashCode(of = "id")
-@NoArgsConstructor
-public class CodeCoverageFileEntity implements DashboardEntity {
-
-    /** CodeCoverageFileEntity testName field */
-    @Id @Getter @Setter Long id;
-
-    @Parent
-    @Getter @Setter private Key<?> coverageParent;
-
-    /** CodeCoverageFileEntity filePath field */
-    @Getter @Setter String filePath;
-
-    /** CodeCoverageFileEntity group field */
-    @Getter @Setter String group;
-
-    /** CodeCoverageFileEntity lineCoverage field */
-    @Getter @Setter List<Long> lineCoverage;
-
-    /** CodeCoverageFileEntity coveredCount field */
-    @Getter @Setter long coveredCount;
-
-    /** CodeCoverageFileEntity totalCount field */
-    @Getter @Setter long totalCount;
-
-    /** CodeCoverageFileEntity projectName field */
-    @Getter @Setter String projectName;
-
-    /** CodeCoverageFileEntity projectVersion field */
-    @Getter @Setter String projectVersion;
-
-    /** CodeCoverageFileEntity isIgnored field */
-    @Index
-    @Getter @Setter Boolean isIgnored;
-
-    /** Constructor function for CodeCoverageFileEntity Class */
-    public CodeCoverageFileEntity(
-            long id,
-            Key<?> coverageParent,
-            String filePath,
-            String group,
-            List<Long> lineCoverage,
-            long coveredCount,
-            long totalCount,
-            String projectName,
-            String projectVersion) {
-        this.id = id;
-        this.coverageParent = coverageParent;
-        this.filePath = filePath;
-        this.group = group;
-        this.lineCoverage = lineCoverage;
-        this.coveredCount = coveredCount;
-        this.totalCount = totalCount;
-        this.projectName = projectName;
-        this.projectVersion = projectVersion;
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public Key<CodeCoverageFileEntity> save() {
-        this.isIgnored = false;
-        return ofy().save().entity(this).now();
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/CoverageEntity.java b/src/main/java/com/android/vts/entity/CoverageEntity.java
deleted file mode 100644
index 50d2f4e..0000000
--- a/src/main/java/com/android/vts/entity/CoverageEntity.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.android.vts.proto.VtsReportMessage.CoverageReportMessage;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.Parent;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
-import java.util.Properties;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import lombok.Data;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-@com.googlecode.objectify.annotation.Entity(name = "Coverage")
-@Cache
-@Data
-@NoArgsConstructor
-/** Object describing coverage data gathered for a file. */
-public class CoverageEntity implements DashboardEntity {
-
-    protected static final Logger logger = Logger.getLogger(CoverageEntity.class.getName());
-
-    public static final String KIND = "Coverage";
-
-    public static String GERRIT_URI;
-
-    // Property keys
-    public static final String GROUP = "group";
-    public static final String COVERED_LINE_COUNT = "coveredCount";
-    public static final String TOTAL_LINE_COUNT = "totalCount";
-    public static final String FILE_PATH = "filePath";
-    public static final String PROJECT_NAME = "projectName";
-    public static final String PROJECT_VERSION = "projectVersion";
-    public static final String LINE_COVERAGE = "lineCoverage";
-
-    @Ignore @Getter @Setter private Key parentKey;
-
-    @Id @Getter @Setter private Long id;
-
-    @Parent @Getter @Setter private com.googlecode.objectify.Key<?> testParent;
-
-    @Index @Getter @Setter private String group;
-
-    @Getter @Setter private long coveredCount;
-
-    @Getter @Setter private long totalCount;
-
-    @Index @Getter @Setter private String filePath;
-
-    @Getter @Setter private String projectName;
-
-    @Getter @Setter private String projectVersion;
-
-    @Getter @Setter private List<Long> lineCoverage;
-
-    /** CoverageEntity isIgnored field */
-    @Index @Getter @Setter Boolean isIgnored;
-
-    /**
-     * Create a CoverageEntity object for a file.
-     *
-     * @param parentKey The key to the parent TestRunEntity object in the database.
-     * @param group The group within the test run describing the coverage.
-     * @param coveredLineCount The total number of covered lines in the file.
-     * @param totalLineCount The total number of uncovered executable lines in the file.
-     * @param filePath The path to the file.
-     * @param projectName The name of the git project.
-     * @param projectVersion The commit hash of the project at the time the test was executed.
-     * @param lineCoverage List of coverage counts per executable line in the file.
-     */
-    public CoverageEntity(
-            Key parentKey,
-            String group,
-            long coveredLineCount,
-            long totalLineCount,
-            String filePath,
-            String projectName,
-            String projectVersion,
-            List<Long> lineCoverage) {
-        this.parentKey = parentKey;
-        this.group = group;
-        this.coveredCount = coveredLineCount;
-        this.totalCount = totalLineCount;
-        this.filePath = filePath;
-        this.projectName = projectName;
-        this.projectVersion = projectVersion;
-        this.lineCoverage = lineCoverage;
-    }
-
-    /**
-     * Create a CoverageEntity object for a file.
-     *
-     * @param testParent The objectify key to the parent TestRunEntity object in the database.
-     * @param group The group within the test run describing the coverage.
-     * @param coveredLineCount The total number of covered lines in the file.
-     * @param totalLineCount The total number of uncovered executable lines in the file.
-     * @param filePath The path to the file.
-     * @param projectName The name of the git project.
-     * @param projectVersion The commit hash of the project at the time the test was executed.
-     * @param lineCoverage List of coverage counts per executable line in the file.
-     */
-    public CoverageEntity(
-            com.googlecode.objectify.Key testParent,
-            String group,
-            long coveredLineCount,
-            long totalLineCount,
-            String filePath,
-            String projectName,
-            String projectVersion,
-            List<Long> lineCoverage) {
-        this.testParent = testParent;
-        this.group = group;
-        this.coveredCount = coveredLineCount;
-        this.totalCount = totalLineCount;
-        this.filePath = filePath;
-        this.projectName = projectName;
-        this.projectVersion = projectVersion;
-        this.lineCoverage = lineCoverage;
-    }
-
-    /** find coverage entity by ID */
-    public static CoverageEntity findById(String testName, String testRunId, String id) {
-        com.googlecode.objectify.Key testKey =
-                com.googlecode.objectify.Key.create(TestEntity.class, testName);
-        com.googlecode.objectify.Key testRunKey =
-                com.googlecode.objectify.Key.create(
-                        testKey, TestRunEntity.class, Long.parseLong(testRunId));
-        return ofy().load()
-                .type(CoverageEntity.class)
-                .parent(testRunKey)
-                .id(Long.parseLong(id))
-                .now();
-    }
-
-    public static void setPropertyValues(Properties newSystemConfigProp) {
-        GERRIT_URI = newSystemConfigProp.getProperty("gerrit.uri");
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<CoverageEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    /** Get percentage from calculating coveredCount and totalCount values */
-    public Double getPercentage() {
-        return Math.round(coveredCount * 10000d / totalCount) / 100d;
-    }
-
-    /** Get Gerrit Url function from the attributes of this class */
-    public String getGerritUrl() throws UnsupportedEncodingException {
-        String gerritPath =
-                GERRIT_URI
-                        + "/projects/"
-                        + URLEncoder.encode(projectName, "UTF-8")
-                        + "/commits/"
-                        + URLEncoder.encode(projectVersion, "UTF-8")
-                        + "/files/"
-                        + URLEncoder.encode(filePath, "UTF-8")
-                        + "/content";
-        return gerritPath;
-    }
-
-    /* Comparator for sorting the list by isIgnored field */
-    public static Comparator<CoverageEntity> isIgnoredComparator =
-            new Comparator<CoverageEntity>() {
-
-                public int compare(CoverageEntity coverageEntity1, CoverageEntity coverageEntity2) {
-                    Boolean isIgnored1 =
-                            Objects.isNull(coverageEntity1.getIsIgnored())
-                                    ? false
-                                    : coverageEntity1.getIsIgnored();
-                    Boolean isIgnored2 =
-                            Objects.isNull(coverageEntity2.getIsIgnored())
-                                    ? false
-                                    : coverageEntity2.getIsIgnored();
-
-                    // ascending order
-                    return isIgnored1.compareTo(isIgnored2);
-                }
-            };
-
-    public Entity toEntity() {
-        Entity coverageEntity = new Entity(KIND, parentKey);
-        coverageEntity.setProperty(GROUP, group);
-        coverageEntity.setUnindexedProperty(COVERED_LINE_COUNT, coveredCount);
-        coverageEntity.setUnindexedProperty(TOTAL_LINE_COUNT, totalCount);
-        coverageEntity.setProperty(FILE_PATH, filePath);
-        coverageEntity.setUnindexedProperty(PROJECT_NAME, projectName);
-        coverageEntity.setUnindexedProperty(PROJECT_VERSION, projectVersion);
-        if (lineCoverage != null && lineCoverage.size() > 0) {
-            coverageEntity.setUnindexedProperty(LINE_COVERAGE, lineCoverage);
-        }
-        return coverageEntity;
-    }
-
-    /**
-     * Convert an Entity object to a CoverageEntity.
-     *
-     * @param e The entity to process.
-     * @return CoverageEntity object with the properties from e, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static CoverageEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND)
-                || !e.hasProperty(GROUP)
-                || !e.hasProperty(COVERED_LINE_COUNT)
-                || !e.hasProperty(TOTAL_LINE_COUNT)
-                || !e.hasProperty(FILE_PATH)
-                || !e.hasProperty(PROJECT_NAME)
-                || !e.hasProperty(PROJECT_VERSION)) {
-            logger.log(Level.WARNING, "Missing coverage attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            String group = (String) e.getProperty(GROUP);
-            long coveredLineCount = (long) e.getProperty(COVERED_LINE_COUNT);
-            long totalLineCount = (long) e.getProperty(TOTAL_LINE_COUNT);
-            String filePath = (String) e.getProperty(FILE_PATH);
-            String projectName = (String) e.getProperty(PROJECT_NAME);
-            String projectVersion = (String) e.getProperty(PROJECT_VERSION);
-            List<Long> lineCoverage;
-            if (e.hasProperty(LINE_COVERAGE)) {
-                lineCoverage = (List<Long>) e.getProperty(LINE_COVERAGE);
-            } else {
-                lineCoverage = new ArrayList<>();
-            }
-            return new CoverageEntity(
-                    e.getKey().getParent(),
-                    group,
-                    coveredLineCount,
-                    totalLineCount,
-                    filePath,
-                    projectName,
-                    projectVersion,
-                    lineCoverage);
-        } catch (ClassCastException exception) {
-            // Invalid contents or null values
-            logger.log(Level.WARNING, "Error parsing coverage entity.", exception);
-        }
-        return null;
-    }
-
-    /**
-     * Convert a coverage report to a CoverageEntity.
-     *
-     * @param parentKey The ancestor key for the coverage entity.
-     * @param group The group to display the coverage report with.
-     * @param coverage The coverage report containing coverage data.
-     * @return The CoverageEntity for the coverage report message, or null if not compatible.
-     */
-    public static CoverageEntity fromCoverageReport(
-            com.googlecode.objectify.Key parentKey, String group, CoverageReportMessage coverage) {
-        if (!coverage.hasFilePath()
-                || !coverage.hasProjectName()
-                || !coverage.hasRevision()
-                || !coverage.hasTotalLineCount()
-                || !coverage.hasCoveredLineCount()) {
-            return null; // invalid coverage report;
-        }
-        long coveredLineCount = coverage.getCoveredLineCount();
-        long totalLineCount = coverage.getTotalLineCount();
-        String filePath = coverage.getFilePath().toStringUtf8();
-        String projectName = coverage.getProjectName().toStringUtf8();
-        String projectVersion = coverage.getRevision().toStringUtf8();
-        List<Long> lineCoverage = null;
-        if (coverage.getLineCoverageVectorCount() > 0) {
-            lineCoverage = new ArrayList<>();
-            for (long count : coverage.getLineCoverageVectorList()) {
-                lineCoverage.add(count);
-            }
-        }
-        return new CoverageEntity(
-                parentKey,
-                group,
-                coveredLineCount,
-                totalLineCount,
-                filePath,
-                projectName,
-                projectVersion,
-                lineCoverage);
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/DashboardEntity.java b/src/main/java/com/android/vts/entity/DashboardEntity.java
deleted file mode 100644
index a42c1eb..0000000
--- a/src/main/java/com/android/vts/entity/DashboardEntity.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import com.google.common.collect.Lists;
-import com.googlecode.objectify.Key;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Interface for interacting with VTS Dashboard entities in Cloud Datastore. */
-public interface DashboardEntity extends Serializable {
-    /**
-     * Save the Entity to the datastore.
-     *
-     * @return The saved entity's key value.
-     */
-    <T> Key<T> save();
-
-    /** Save List of entity through objectify entities method. */
-    static <T> Map<Key<T>, T> saveAll(List<T> entityList, int maxEntitySize) {
-        return ofy().transact(
-                        () -> {
-                            List<List<T>> partitionedList =
-                                    Lists.partition(entityList, maxEntitySize);
-                            return partitionedList
-                                    .stream()
-                                    .map(
-                                            subEntityList ->
-                                                    ofy().save().entities(subEntityList).now())
-                                    .flatMap(m -> m.entrySet().stream())
-                                    .collect(
-                                            Collectors.toMap(
-                                                    entry -> entry.getKey(),
-                                                    entry -> entry.getValue()));
-                        });
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/DeviceInfoEntity.java b/src/main/java/com/android/vts/entity/DeviceInfoEntity.java
deleted file mode 100644
index 2b98355..0000000
--- a/src/main/java/com/android/vts/entity/DeviceInfoEntity.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.memcache.MemcacheService;
-import com.google.appengine.api.memcache.MemcacheServiceFactory;
-import com.google.apphosting.api.ApiProxy;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.Parent;
-import java.util.List;
-import java.util.Objects;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@com.googlecode.objectify.annotation.Entity(name = "DeviceInfo")
-@Cache
-@Data
-@NoArgsConstructor
-/** Class describing a device used for a test run. */
-public class DeviceInfoEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(DeviceInfoEntity.class.getName());
-
-    /** This is the instance of App Engine memcache service java library */
-    private static MemcacheService syncCache = MemcacheServiceFactory.getMemcacheService();
-
-    public static final String KIND = "DeviceInfo";
-
-    // Property keys
-    public static final String BRANCH = "branch";
-    public static final String PRODUCT = "product";
-    public static final String BUILD_FLAVOR = "buildFlavor";
-    public static final String BUILD_ID = "buildId";
-    public static final String ABI_BITNESS = "abiBitness";
-    public static final String ABI_NAME = "abiName";
-
-    @Ignore
-    private Key parentKey;
-
-    /** ID field using start timestamp */
-    @Id private Long id;
-
-    /** parent field based on Test and TestRun key */
-    @Parent
-    private com.googlecode.objectify.Key<?> parent;
-
-    @Index
-    private String branch;
-
-    @Index
-    private String product;
-
-    @Index
-    private String buildFlavor;
-
-    @Index
-    private String buildId;
-
-    private String abiBitness;
-
-    private String abiName;
-
-    /**
-     * Create a DeviceInfoEntity object.
-     *
-     * @param parentKey The key for the parent entity in the database.
-     * @param branch The build branch.
-     * @param product The device product.
-     * @param buildFlavor The device build flavor.
-     * @param buildID The device build ID.
-     * @param abiBitness The abi bitness of the device.
-     * @param abiName The name of the abi.
-     */
-    public DeviceInfoEntity(
-            Key parentKey,
-            String branch,
-            String product,
-            String buildFlavor,
-            String buildID,
-            String abiBitness,
-            String abiName) {
-        this.parentKey = parentKey;
-        this.branch = branch;
-        this.product = product;
-        this.buildFlavor = buildFlavor;
-        this.buildId = buildID;
-        this.abiBitness = abiBitness;
-        this.abiName = abiName;
-    }
-
-    /**
-     * Create a DeviceInfoEntity object with objectify Key
-     *
-     * @param parent The objectify key for the parent entity in the database.
-     * @param branch The build branch.
-     * @param product The device product.
-     * @param buildFlavor The device build flavor.
-     * @param buildID The device build ID.
-     * @param abiBitness The abi bitness of the device.
-     * @param abiName The name of the abi.
-     */
-    public DeviceInfoEntity(
-            com.googlecode.objectify.Key parent,
-            String branch,
-            String product,
-            String buildFlavor,
-            String buildID,
-            String abiBitness,
-            String abiName) {
-        this.parent = parent;
-        this.branch = branch;
-        this.product = product;
-        this.buildFlavor = buildFlavor;
-        this.buildId = buildID;
-        this.abiBitness = abiBitness;
-        this.abiName = abiName;
-    }
-
-    /**
-     * Get All Branch List from DeviceInfoEntity
-     */
-    public static List<String> getAllBranches() {
-        try {
-            List<String> branchList = (List<String>) syncCache.get("branchList");
-            if (Objects.isNull(branchList)) {
-                branchList =
-                        ofy().load()
-                                .type(DeviceInfoEntity.class)
-                                .project("branch")
-                                .distinct(true)
-                                .list()
-                                .stream()
-                                .map(device -> device.branch)
-                                .collect(Collectors.toList());
-                syncCache.put("branchList", branchList);
-            }
-            return branchList;
-        } catch (ApiProxy.CallNotFoundException e) {
-            return ofy().load()
-                    .type(DeviceInfoEntity.class)
-                    .project("branch")
-                    .distinct(true)
-                    .list()
-                    .stream()
-                    .map(device -> device.branch)
-                    .collect(Collectors.toList());
-        }
-    }
-
-    /**
-     * Get All BuildFlavors List from DeviceInfoEntity
-     */
-    public static List<String> getAllBuildFlavors() {
-        try {
-            List<String> buildFlavorList = (List<String>) syncCache.get("buildFlavorList");
-            if (Objects.isNull(buildFlavorList)) {
-                buildFlavorList =
-                        ofy().load()
-                                .type(DeviceInfoEntity.class)
-                                .project("buildFlavor")
-                                .distinct(true)
-                                .list()
-                                .stream()
-                                .map(device -> device.buildFlavor)
-                                .collect(Collectors.toList());
-                syncCache.put("buildFlavorList", buildFlavorList);
-            }
-            return buildFlavorList;
-        } catch (ApiProxy.CallNotFoundException e) {
-            return ofy().load()
-                    .type(DeviceInfoEntity.class)
-                    .project("buildFlavor")
-                    .distinct(true)
-                    .list()
-                    .stream()
-                    .map(device -> device.buildFlavor)
-                    .collect(Collectors.toList());
-        }
-    }
-
-    /** Saving function for the instance of this class */
-    public com.googlecode.objectify.Key<DeviceInfoEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    public Entity toEntity() {
-        Entity deviceEntity = new Entity(KIND, this.parentKey);
-        deviceEntity.setProperty(BRANCH, this.branch.toLowerCase());
-        deviceEntity.setProperty(PRODUCT, this.product.toLowerCase());
-        deviceEntity.setProperty(BUILD_FLAVOR, this.buildFlavor.toLowerCase());
-        deviceEntity.setProperty(BUILD_ID, this.buildId.toLowerCase());
-        if (this.abiBitness != null && this.abiName != null) {
-            deviceEntity.setUnindexedProperty(ABI_BITNESS, this.abiBitness.toLowerCase());
-            deviceEntity.setUnindexedProperty(ABI_NAME, this.abiName.toLowerCase());
-        }
-
-        return deviceEntity;
-    }
-
-    /**
-     * Convert an Entity object to a DeviceInfoEntity.
-     *
-     * @param e The entity to process.
-     * @return DeviceInfoEntity object with the properties from e, or null if incompatible.
-     */
-    public static DeviceInfoEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || !e.hasProperty(BRANCH) || !e.hasProperty(PRODUCT)
-                || !e.hasProperty(BUILD_FLAVOR) || !e.hasProperty(BUILD_ID)
-                || !e.hasProperty(ABI_BITNESS) || !e.hasProperty(ABI_NAME)) {
-            logger.log(Level.WARNING, "Missing device info attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            Key parentKey = e.getKey().getParent();
-            String branch = (String) e.getProperty(BRANCH);
-            String product = (String) e.getProperty(PRODUCT);
-            String buildFlavor = (String) e.getProperty(BUILD_FLAVOR);
-            String buildId = (String) e.getProperty(BUILD_ID);
-            String abiBitness = null;
-            String abiName = null;
-            if (e.hasProperty(ABI_BITNESS) && e.hasProperty(ABI_NAME)) {
-                abiBitness = (String) e.getProperty(ABI_BITNESS);
-                abiName = (String) e.getProperty(ABI_NAME);
-            }
-            return new DeviceInfoEntity(
-                    parentKey, branch, product, buildFlavor, buildId, abiBitness, abiName);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing device info entity.", exception);
-        }
-        return null;
-    }
-
-    /**
-     * Convert a device info message to a DeviceInfoEntity.
-     *
-     * @param parent The ancestor key for the device entity.
-     * @param device The device info report describing the target Android device.
-     * @return The DeviceInfoEntity for the target device, or null if incompatible
-     */
-    public static DeviceInfoEntity fromDeviceInfoMessage(
-            com.googlecode.objectify.Key parent, AndroidDeviceInfoMessage device) {
-        if (!device.hasBuildAlias() || !device.hasBuildFlavor() || !device.hasProductVariant()
-                || !device.hasBuildId()) {
-            return null;
-        }
-        String branch = device.getBuildAlias().toStringUtf8();
-        String buildFlavor = device.getBuildFlavor().toStringUtf8();
-        String product = device.getProductVariant().toStringUtf8();
-        String buildId = device.getBuildId().toStringUtf8();
-        String abiBitness = device.getAbiBitness().toStringUtf8();
-        String abiName = device.getAbiName().toStringUtf8();
-        return new DeviceInfoEntity(
-                parent, branch, product, buildFlavor, buildId, abiBitness, abiName);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof DeviceInfoEntity)) {
-            return false;
-        }
-        DeviceInfoEntity device2 = (DeviceInfoEntity) obj;
-        if (!this.branch.equals(device2.branch) || !this.product.equals(device2.product)
-                || !this.buildFlavor.equals(device2.buildFlavor)
-                || !this.buildId.equals(device2.buildId)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        String deviceId = this.branch + this.product + this.buildFlavor + this.buildId;
-        return deviceId.hashCode();
-    }
-
-    /**
-     * Create a copy of the device info under a near parent.
-     *
-     * @param parentKey The new parent key.
-     * @return A copy of the DeviceInfoEntity with the specified parent.
-     */
-    public DeviceInfoEntity copyWithParent(com.googlecode.objectify.Key parentKey) {
-        return new DeviceInfoEntity(parentKey, this.branch, this.product, this.buildFlavor,
-                this.buildId, this.abiBitness, this.abiName);
-    }
-
-    /**
-     * Create a string representation of the device build information.
-     * @return A String fingerprint of the format: branch/buildFlavor (build ID)
-     */
-    public String getFingerprint() {
-        return this.branch + "/" + this.buildFlavor + " (" + this.buildId + ")";
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/HalApiEntity.java b/src/main/java/com/android/vts/entity/HalApiEntity.java
deleted file mode 100644
index 16b5d10..0000000
--- a/src/main/java/com/android/vts/entity/HalApiEntity.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.googlecode.objectify.Key;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.Parent;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-/** Entity Class for HalApiEntity */
-@Cache
-@Entity(name = "HalApiEntity")
-@EqualsAndHashCode(of = "id")
-@NoArgsConstructor
-@JsonAutoDetect(fieldVisibility = Visibility.ANY)
-@JsonIgnoreProperties({"id", "parent"})
-public class HalApiEntity implements DashboardEntity {
-
-    /** HalApiEntity id field */
-    @Id @Getter @Setter String id;
-
-    @Parent @Getter Key<?> parent;
-
-    /** HAL Api Release Level. e.g. */
-    @Index @Getter @Setter String halApiReleaseLevel;
-
-    /** HAL package name. e.g. android.hardware.foo. */
-    @Index @Getter @Setter String halPackageName;
-
-    /** HAL (major) version. e.g. 1. */
-    @Index @Getter @Setter int halMajorVersion;
-
-    /** HAL (minor) version. e.g. 0. */
-    @Index @Getter @Setter int halMinorVersion;
-
-    /** HAL interface name. e.g. IFoo. */
-    @Index @Getter @Setter String halInterfaceName;
-
-    /** List of HAL API */
-    @Getter @Setter List<String> halApi;
-
-    /** List of HAL covered API */
-    @Getter @Setter List<String> coveredHalApi;
-
-    /** When this record was created or updated */
-    @Index Date updated;
-
-    /** Constructor function for HalApiEntity Class */
-    public HalApiEntity(
-            com.googlecode.objectify.Key testRunKey,
-            String halApiReleaseLevel,
-            String halPackageName,
-            int halMajorVersion,
-            int halMinorVersion,
-            String halInterfaceName,
-            List<String> halApi,
-            List<String> coveredHalApi) {
-
-        this.id = UUID.randomUUID().toString();
-        this.parent = testRunKey;
-
-        this.halApiReleaseLevel = halApiReleaseLevel;
-        this.halPackageName = halPackageName;
-        this.halMajorVersion = halMajorVersion;
-        this.halMinorVersion = halMinorVersion;
-        this.halInterfaceName = halInterfaceName;
-        this.halApi = halApi;
-        this.coveredHalApi = coveredHalApi;
-        this.updated = new Date();
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public Key<HalApiEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/ProfilingPointEntity.java b/src/main/java/com/android/vts/entity/ProfilingPointEntity.java
deleted file mode 100644
index 9e2cae6..0000000
--- a/src/main/java/com/android/vts/entity/ProfilingPointEntity.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingType;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import java.util.Date;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@com.googlecode.objectify.annotation.Entity(name = "ProfilingPoint")
-@Cache
-@Data
-@NoArgsConstructor
-/** Entity describing a profiling point. */
-public class ProfilingPointEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(ProfilingPointEntity.class.getName());
-    protected static final String DELIMITER = "#";
-
-    public static final String KIND = "ProfilingPoint";
-
-    // Property keys
-    public static final String TEST_NAME = "testName";
-    public static final String PROFILING_POINT_NAME = "profilingPointName";
-    public static final String TYPE = "type";
-    public static final String REGRESSION_MODE = "regressionMode";
-    public static final String X_LABEL = "xLabel";
-    public static final String Y_LABEL = "yLabel";
-
-    @Ignore
-    private Key key;
-
-    /** ProfilingPointEntity testName field */
-    @Id
-    private String name;
-
-    /** ProfilingPointEntity profilingPointName field */
-    @Index
-    private String profilingPointName;
-
-    /** ProfilingPointEntity testName field */
-    @Index
-    private String testName;
-
-    /** ProfilingPointEntity type field */
-    private int type;
-
-    /** ProfilingPointEntity regressionMode field */
-    private int regressionMode;
-
-    /** ProfilingPointEntity xLabel field */
-    private String xLabel;
-
-    /** ProfilingPointEntity xLabel field */
-    private String yLabel;
-
-    /**
-     * When this record was created or updated
-     */
-    @Index
-    Date updated;
-
-    /**
-     * Create a ProfilingPointEntity object.
-     *
-     * @param testName The name of test containing the profiling point.
-     * @param profilingPointName The name of the profiling point.
-     * @param type The (number) type of the profiling point data.
-     * @param regressionMode The (number) mode to use for detecting regression.
-     * @param xLabel The x axis label.
-     * @param yLabel The y axis label.
-     */
-    public ProfilingPointEntity(
-            String testName,
-            String profilingPointName,
-            int type,
-            int regressionMode,
-            String xLabel,
-            String yLabel) {
-        this.key = createKey(testName, profilingPointName);
-        this.testName = testName;
-        this.profilingPointName = profilingPointName;
-        this.type = type;
-        this.regressionMode = regressionMode;
-        this.xLabel = xLabel;
-        this.yLabel = yLabel;
-        this.updated = new Date();
-    }
-
-    /**
-     * Get VtsProfilingType from int value.
-     *
-     * @return VtsProfilingType class.
-     */
-    public VtsProfilingType getVtsProfilingType(int type) {
-        return VtsProfilingType.forNumber(type);
-    }
-
-    /**
-     * Get VtsProfilingRegressionMode from int value.
-     *
-     * @return VtsProfilingType class.
-     */
-    public VtsProfilingRegressionMode getVtsProfilingRegressionMode(int regressionMode) {
-        return VtsProfilingRegressionMode.forNumber(regressionMode);
-    }
-
-    /**
-     * Create a key for a ProfilingPointEntity.
-     *
-     * @param testName The name of test containing the profiling point.
-     * @param profilingPointName The name of the profiling point.
-     * @return a Key object for the ProfilingEntity in the database.
-     */
-    public static Key createKey(String testName, String profilingPointName) {
-        return KeyFactory.createKey(KIND, testName + DELIMITER + profilingPointName);
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<ProfilingPointEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    public Entity toEntity() {
-        Entity profilingPoint = new Entity(key);
-        profilingPoint.setIndexedProperty(TEST_NAME, this.testName);
-        profilingPoint.setIndexedProperty(PROFILING_POINT_NAME, this.profilingPointName);
-        profilingPoint.setUnindexedProperty(TYPE, this.type);
-        profilingPoint.setUnindexedProperty(REGRESSION_MODE, this.regressionMode);
-        profilingPoint.setUnindexedProperty(X_LABEL, this.xLabel);
-        profilingPoint.setUnindexedProperty(Y_LABEL, this.yLabel);
-
-        return profilingPoint;
-    }
-
-    /**
-     * Convert an Entity object to a ProfilingPointEntity.
-     *
-     * @param e The entity to process.
-     * @return ProfilingPointEntity object with the properties from e, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static ProfilingPointEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND)
-                || e.getKey().getName() == null
-                || !e.hasProperty(TEST_NAME)
-                || !e.hasProperty(PROFILING_POINT_NAME)
-                || !e.hasProperty(TYPE)
-                || !e.hasProperty(REGRESSION_MODE)
-                || !e.hasProperty(X_LABEL)
-                || !e.hasProperty(Y_LABEL)) {
-            logger.log(
-                    Level.WARNING, "Missing profiling point attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            String testName = (String) e.getProperty(TEST_NAME);
-            String profilingPointName = (String) e.getProperty(PROFILING_POINT_NAME);
-            int type = (int) (long) e.getProperty(TYPE);
-            int regressionMode = (int) (long) e.getProperty(REGRESSION_MODE);
-            String xLabel = (String) e.getProperty(X_LABEL);
-            String yLabel = (String) e.getProperty(Y_LABEL);
-
-            return new ProfilingPointEntity(
-                    testName, profilingPointName, type, regressionMode, xLabel, yLabel);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing profiling point entity.", exception);
-        }
-        return null;
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/ProfilingPointRunEntity.java b/src/main/java/com/android/vts/entity/ProfilingPointRunEntity.java
deleted file mode 100644
index 124b61d..0000000
--- a/src/main/java/com/android/vts/entity/ProfilingPointRunEntity.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.proto.VtsReportMessage.ProfilingReportMessage;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingType;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.common.collect.Lists;
-import com.google.protobuf.ByteString;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.Parent;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.extern.log4j.Log4j2;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@com.googlecode.objectify.annotation.Entity(name = "ProfilingPointRun")
-@Cache
-@Data
-@NoArgsConstructor
-@Log4j2
-/** Entity describing a profiling point execution. */
-public class ProfilingPointRunEntity implements DashboardEntity {
-
-    public static final String KIND = "ProfilingPointRun";
-
-    // Property keys
-    public static final String TYPE = "type";
-    public static final String REGRESSION_MODE = "regressionMode";
-    public static final String LABELS = "labels";
-    public static final String VALUES = "values";
-    public static final String X_LABEL = "xLabel";
-    public static final String Y_LABEL = "yLabel";
-    public static final String OPTIONS = "options";
-
-    /** This value will set the limit size of values array field */
-    public static final int VALUE_SIZE_LIMIT = 50000;
-
-    @Ignore
-    private Key key;
-
-    /** ID field using profilingPointName */
-    @Id
-    private String name;
-
-    /** parent field based on Test and TestRun key */
-    @Parent
-    private com.googlecode.objectify.Key<?> parent;
-
-    /** VtsProfilingType in ProfilingPointRunEntity class  */
-    private int type;
-
-    /** VtsProfilingType in ProfilingPointRunEntity class  */
-    private int regressionMode;
-
-    /** list of label name  */
-    private List<String> labels;
-
-    /** list of values  */
-    private List<Long> values;
-
-    /** X axis label name */
-    private String xLabel;
-
-    /** Y axis label name */
-    private String yLabel;
-
-    /** Test Suite file name field */
-    private List<String> options;
-
-    /** When this record was created or updated */
-    @Index Date updated;
-
-    /**
-     * Create a ProfilingPointRunEntity object.
-     *
-     * @param parentKey The Key object for the parent TestRunEntity in datastore.
-     * @param name The name of the profiling point.
-     * @param type The (number) type of the profiling point data.
-     * @param regressionMode The (number) mode to use for detecting regression.
-     * @param labels List of data labels, or null if the data is unlabeled.
-     * @param values List of data values.
-     * @param xLabel The x axis label.
-     * @param yLabel The y axis label.
-     * @param options The list of key=value options for the profiling point run.
-     */
-    public ProfilingPointRunEntity(
-            Key parentKey,
-            String name,
-            int type,
-            int regressionMode,
-            List<String> labels,
-            List<Long> values,
-            String xLabel,
-            String yLabel,
-            List<String> options) {
-        this.key = KeyFactory.createKey(parentKey, KIND, name);
-        this.name = name;
-        this.type = type;
-        this.regressionMode = regressionMode;
-        this.labels = labels == null ? null : new ArrayList<>(labels);
-        this.values = new ArrayList<>(values);
-        this.xLabel = xLabel;
-        this.yLabel = yLabel;
-        this.options = options;
-        this.updated = new Date();
-    }
-
-
-    /**
-     * Create a ProfilingPointRunEntity object.
-     *
-     * @param parent The objectify Key for the parent TestRunEntity in datastore.
-     * @param name The name of the profiling point.
-     * @param type The (number) type of the profiling point data.
-     * @param regressionMode The (number) mode to use for detecting regression.
-     * @param labels List of data labels, or null if the data is unlabeled.
-     * @param values List of data values.
-     * @param xLabel The x axis label.
-     * @param yLabel The y axis label.
-     * @param options The list of key=value options for the profiling point run.
-     */
-    public ProfilingPointRunEntity(
-            com.googlecode.objectify.Key parent,
-            String name,
-            int type,
-            int regressionMode,
-            List<String> labels,
-            List<Long> values,
-            String xLabel,
-            String yLabel,
-            List<String> options) {
-        this.parent = parent;
-        this.name = name;
-        this.type = type;
-        this.regressionMode = regressionMode;
-        this.labels = labels == null ? null : new ArrayList<>(labels);
-        this.values = new ArrayList<>(values);
-        this.xLabel = xLabel;
-        this.yLabel = yLabel;
-        this.options = options;
-        this.updated = new Date();
-    }
-
-    /**
-     * Get VtsProfilingType from int value.
-     *
-     * @return VtsProfilingType class.
-     */
-    public VtsProfilingType getVtsProfilingType(int type) {
-        return VtsProfilingType.forNumber(type);
-    }
-
-    /**
-     * Get VtsProfilingRegressionMode from int value.
-     *
-     * @return VtsProfilingType class.
-     */
-    public VtsProfilingRegressionMode getVtsProfilingRegressionMode(int regressionMode) {
-        return VtsProfilingRegressionMode.forNumber(regressionMode);
-    }
-
-    /**
-     * Save multi rows function when the record exceed the limit which is 1MB.
-     *
-     * @return ProfilingPointRunEntity's key value.
-     */
-    public com.googlecode.objectify.Key<ProfilingPointRunEntity> saveMultiRow() {
-        if (this.getValues().size() > VALUE_SIZE_LIMIT) {
-
-            List<List<Long>> partitionedValueList =
-                    Lists.partition(this.getValues(), VALUE_SIZE_LIMIT);
-            int partitionedValueListSize = partitionedValueList.size();
-
-            List<List<String>> partitionedLabelList = new ArrayList<>();
-            if (Objects.nonNull(this.getLabels()) && this.getLabels().size() > VALUE_SIZE_LIMIT) {
-                partitionedLabelList = Lists.partition(this.getLabels(), VALUE_SIZE_LIMIT);
-            }
-
-            com.googlecode.objectify.Key<ProfilingPointRunEntity> profilingPointRunEntityKey = null;
-            if (partitionedValueListSize < VALUE_SIZE_LIMIT) {
-                for (int index = 0; index < partitionedValueListSize; index++) {
-                    if (index > 0) {
-                        this.values.addAll(partitionedValueList.get(index));
-                        if (index < partitionedLabelList.size()) {
-                            this.labels.addAll(partitionedLabelList.get(index));
-                        }
-                    } else {
-                        this.values = partitionedValueList.get(index);
-                        if (index < partitionedLabelList.size()) {
-                            this.labels = partitionedLabelList.get(index);
-                        }
-                    }
-                    profilingPointRunEntityKey = ofy().save().entity(this).now();
-                }
-            }
-            return profilingPointRunEntityKey;
-        } else {
-            return ofy().save().entity(this).now();
-        }
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<ProfilingPointRunEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    public Entity toEntity() {
-        Entity profilingRun = new Entity(this.key);
-        profilingRun.setUnindexedProperty(TYPE, this.type);
-        profilingRun.setUnindexedProperty(REGRESSION_MODE, this.regressionMode);
-        if (this.labels != null) {
-            profilingRun.setUnindexedProperty(LABELS, this.labels);
-        }
-        profilingRun.setUnindexedProperty(VALUES, this.values);
-        profilingRun.setUnindexedProperty(X_LABEL, this.xLabel);
-        profilingRun.setUnindexedProperty(Y_LABEL, this.yLabel);
-        if (this.options != null) {
-            profilingRun.setUnindexedProperty(OPTIONS, this.options);
-        }
-
-        return profilingRun;
-    }
-
-    /**
-     * Convert an Entity object to a ProflilingPointRunEntity.
-     *
-     * @param e The entity to process.
-     * @return ProfilingPointRunEntity object with the properties from e, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static ProfilingPointRunEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND)
-                || e.getKey().getName() == null
-                || !e.hasProperty(TYPE)
-                || !e.hasProperty(REGRESSION_MODE)
-                || !e.hasProperty(VALUES)
-                || !e.hasProperty(X_LABEL)
-                || !e.hasProperty(Y_LABEL)) {
-            log.error("Missing profiling point attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            Key parentKey = e.getParent();
-            String name = e.getKey().getName();
-            int type = (int) (long) e.getProperty(TYPE);
-            int regressionMode = (int) (long) e.getProperty(REGRESSION_MODE);
-            List<Long> values = (List<Long>) e.getProperty(VALUES);
-            String xLabel = (String) e.getProperty(X_LABEL);
-            String yLabel = (String) e.getProperty(Y_LABEL);
-            List<String> labels = null;
-            if (e.hasProperty(LABELS)) {
-                labels = (List<String>) e.getProperty(LABELS);
-            }
-            List<String> options = null;
-            if (e.hasProperty(OPTIONS)) {
-                options = (List<String>) e.getProperty(OPTIONS);
-            }
-            return new ProfilingPointRunEntity(
-                    parentKey, name, type, regressionMode, labels, values, xLabel, yLabel, options);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            log.warn("Error parsing profiling point run entity.", exception);
-        }
-        return null;
-    }
-
-    /**
-     * Convert a coverage report to a CoverageEntity.
-     *
-     * @param parent The ancestor objectify key for the coverage entity.
-     * @param profilingReport The profiling report containing profiling data.
-     * @return The ProfilingPointRunEntity for the profiling report message, or null if incompatible
-     */
-    public static ProfilingPointRunEntity fromProfilingReport(
-            com.googlecode.objectify.Key parent, ProfilingReportMessage profilingReport) {
-        if (!profilingReport.hasName()
-                || !profilingReport.hasType()
-                || profilingReport.getType() == VtsProfilingType.UNKNOWN_VTS_PROFILING_TYPE
-                || !profilingReport.hasRegressionMode()
-                || !profilingReport.hasXAxisLabel()
-                || !profilingReport.hasYAxisLabel()) {
-            return null; // invalid profiling report;
-        }
-        String name = profilingReport.getName().toStringUtf8();
-        VtsProfilingType type = profilingReport.getType();
-        VtsProfilingRegressionMode regressionMode = profilingReport.getRegressionMode();
-        String xLabel = profilingReport.getXAxisLabel().toStringUtf8();
-        String yLabel = profilingReport.getYAxisLabel().toStringUtf8();
-        List<Long> values;
-        List<String> labels = null;
-        switch (type) {
-            case VTS_PROFILING_TYPE_TIMESTAMP:
-                if (!profilingReport.hasStartTimestamp()
-                        || !profilingReport.hasEndTimestamp()
-                        || profilingReport.getEndTimestamp()
-                                < profilingReport.getStartTimestamp()) {
-                    return null; // missing timestamp
-                }
-                long value =
-                        profilingReport.getEndTimestamp() - profilingReport.getStartTimestamp();
-                values = new ArrayList<>();
-                values.add(value);
-                break;
-            case VTS_PROFILING_TYPE_LABELED_VECTOR:
-                if (profilingReport.getValueCount() != profilingReport.getLabelCount()) {
-                    return null; // jagged data
-                }
-                labels = new ArrayList<>();
-                for (ByteString label : profilingReport.getLabelList()) {
-                    labels.add(label.toStringUtf8());
-                }
-                values = profilingReport.getValueList();
-                break;
-            case VTS_PROFILING_TYPE_UNLABELED_VECTOR:
-                values = profilingReport.getValueList();
-                break;
-            default: // should never happen
-                return null;
-        }
-        if (values.size() > VALUE_SIZE_LIMIT) {
-            values = values.subList(0, VALUE_SIZE_LIMIT);
-        }
-        List<String> options = null;
-        if (profilingReport.getOptionsCount() > 0) {
-            options = new ArrayList<>();
-            for (ByteString optionBytes : profilingReport.getOptionsList()) {
-                options.add(optionBytes.toStringUtf8());
-            }
-        }
-        return new ProfilingPointRunEntity(
-                parent,
-                name,
-                type.getNumber(),
-                regressionMode.getNumber(),
-                labels,
-                values,
-                xLabel,
-                yLabel,
-                options);
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/ProfilingPointSummaryEntity.java b/src/main/java/com/android/vts/entity/ProfilingPointSummaryEntity.java
deleted file mode 100644
index e4a1911..0000000
--- a/src/main/java/com/android/vts/entity/ProfilingPointSummaryEntity.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.android.vts.util.StatSummary;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@com.googlecode.objectify.annotation.Entity(name = "ProfilingPointSummary")
-@Cache
-@Data
-@NoArgsConstructor
-/** Entity describing a profiling point summary. */
-public class ProfilingPointSummaryEntity implements DashboardEntity {
-    protected static final Logger logger =
-            Logger.getLogger(ProfilingPointSummaryEntity.class.getName());
-    protected static final String DELIMITER = "#";
-
-    public static final String KIND = "ProfilingPointSummary";
-    public static final String ALL = "ALL";
-
-    // Property keys
-    public static final String START_TIME = "startTime";
-    public static final String MEAN = "mean";
-    public static final String SUMSQ = "sumSq";
-    public static final String MIN = "min";
-    public static final String MAX = "max";
-    public static final String LABELS = "labels";
-    public static final String LABEL_MEANS = "labelMeans";
-    public static final String LABEL_SUMSQS = "labelSumSqs";
-    public static final String LABEL_MINS = "labelMins";
-    public static final String LABEL_MAXES = "labelMaxes";
-    public static final String LABEL_COUNTS = "labelCounts";
-    public static final String COUNT = "count";
-    public static final String BRANCH = "branch";
-    public static final String BUILD_FLAVOR = "buildFlavor";
-    public static final String SERIES = "series";
-
-    @Ignore
-    private Key key;
-
-    /** ID field */
-    @Id private String name;
-
-    /** branch field */
-    @Index private String branch;
-
-    /** build field */
-    @Index private String buildFlavor;
-
-    /** total count */
-    @Index private int count;
-
-    /** For each label count field */
-    @Index private List<String> labelCounts;
-
-    /** Maximum value for each label */
-    private List<Integer> labelMaxes;
-
-    /** Mean value for each label */
-    private List<Integer> labelMeans;
-
-    /** Minimum value for each label */
-    private List<Integer> labelMins;
-
-    /** Label name for each label point */
-    private List<String> labels;
-
-    /** Summation for sequence for each label */
-    private List<Integer> labelSumSqs;
-
-    /** Maximum value for total */
-    private Long max;
-
-    /** Mean value for total */
-    private Long mean;
-
-    /** Minimum value for total */
-    private Long min;
-
-    /** The list of series */
-    private String series;
-
-    /** The start time field of the test */
-    private Long startTime;
-
-    /** The summation of sequences */
-    private Long sumSq;
-
-    @Ignore private StatSummary globalStats;
-
-    @Ignore private Map<String, StatSummary> labelStats;
-
-    /*
-    public final StatSummary globalStats;
-    public final List<String> labels;
-    public final Map<String, StatSummary> labelStats;
-    public final String branch;
-    public final String buildFlavor;
-    public final String series;
-    public final long startTime;
-    */
-
-    /**
-     * Create a ProfilingPointSummaryEntity object.
-     *
-     * @param parentKey The Key object for the parent TestRunEntity in the database.
-     * @param globalStats The StatSummary object recording global statistics about the profiling
-     *     point.
-     * @param labels The list of data labels.
-     * @param labelStats The map from data label to StatSummary object for the label.
-     * @param branch The branch.
-     * @param buildFlavor The device build flavor.
-     * @param series The string describing the profiling point series (e.g. binder or passthrough).
-     * @param startTime The timestamp indicating the beginning of the summary.
-     */
-    public ProfilingPointSummaryEntity(
-            Key parentKey,
-            StatSummary globalStats,
-            List<String> labels,
-            Map<String, StatSummary> labelStats,
-            String branch,
-            String buildFlavor,
-            String series,
-            long startTime) {
-        this.globalStats = globalStats;
-        this.labels = labels;
-        this.labelStats = labelStats;
-        this.buildFlavor = buildFlavor == null ? ALL : buildFlavor;
-        this.branch = branch == null ? ALL : branch;
-        this.series = series == null ? "" : series;
-        this.startTime = startTime;
-        this.key = createKey(parentKey, this.branch, this.buildFlavor, this.series, this.startTime);
-    }
-
-    /**
-     * Create a new ProfilingPointSummaryEntity object.
-     *
-     * @param parentKey The Key object for the parent TestRunEntity in the database.
-     * @param branch The branch.
-     * @param buildFlavor The buildFlavor name.
-     * @param series The string describing the profiling point series (e.g. binder or passthrough).
-     * @param startTime The timestamp indicating the beginning of the summary.
-     */
-    public ProfilingPointSummaryEntity(
-            Key parentKey, String branch, String buildFlavor, String series, long startTime) {
-        this(
-                parentKey,
-                new StatSummary(null, VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE),
-                new ArrayList<>(),
-                new HashMap<>(),
-                branch,
-                buildFlavor,
-                series,
-                startTime);
-    }
-
-    /**
-     * Create a key for a ProfilingPointSummaryEntity.
-     *
-     * @param parentKey The Key object for the parent TestRunEntity in the database.
-     * @param branch The branch.
-     * @param buildFlavor The device build flavor.
-     * @param series The string describing the profiling point series (e.g. binder or passthrough).
-     * @param startTime The timestamp indicating the beginning of the summary.
-     * @return a Key object for the ProfilingPointSummaryEntity in the database.
-     */
-    public static Key createKey(
-            Key parentKey, String branch, String buildFlavor, String series, long startTime) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(branch);
-        sb.append(DELIMITER);
-        sb.append(buildFlavor);
-        sb.append(DELIMITER);
-        sb.append(series);
-        sb.append(DELIMITER);
-        sb.append(startTime);
-        return KeyFactory.createKey(parentKey, KIND, sb.toString());
-    }
-
-    /**
-     * Updates the profiling summary with the data from a new profiling report.
-     *
-     * @param profilingRun The profiling point run entity object containing profiling data.
-     */
-    public void update(ProfilingPointRunEntity profilingRun) {
-        if (profilingRun.getLabels() != null
-                && profilingRun.getLabels().size() == profilingRun.getValues().size()) {
-            for (int i = 0; i < profilingRun.getLabels().size(); i++) {
-                String label = profilingRun.getLabels().get(i);
-                if (!this.labelStats.containsKey(label)) {
-                    VtsProfilingRegressionMode vtsProfilingRegressionMode =
-                            profilingRun.getVtsProfilingRegressionMode(
-                                    profilingRun.getRegressionMode());
-                    StatSummary summary = new StatSummary(label, vtsProfilingRegressionMode);
-                    this.labelStats.put(label, summary);
-                }
-                StatSummary summary = this.labelStats.get(label);
-                summary.updateStats(profilingRun.getValues().get(i));
-            }
-            this.labels.clear();
-            this.labels.addAll(profilingRun.getLabels());
-        }
-        for (long value : profilingRun.getValues()) {
-            this.globalStats.updateStats(value);
-        }
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<ProfilingPointSummaryEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    public Entity toEntity() {
-        Entity profilingSummary;
-        profilingSummary = new Entity(this.key);
-        profilingSummary.setUnindexedProperty(MEAN, this.globalStats.getMean());
-        profilingSummary.setUnindexedProperty(SUMSQ, this.globalStats.getSumSq());
-        profilingSummary.setUnindexedProperty(MIN, this.globalStats.getMin());
-        profilingSummary.setUnindexedProperty(MAX, this.globalStats.getMax());
-        profilingSummary.setUnindexedProperty(COUNT, this.globalStats.getCount());
-        profilingSummary.setIndexedProperty(START_TIME, this.startTime);
-        profilingSummary.setIndexedProperty(BRANCH, this.branch);
-        profilingSummary.setIndexedProperty(BUILD_FLAVOR, this.buildFlavor);
-        profilingSummary.setIndexedProperty(SERIES, this.series);
-        if (this.labels.size() != 0) {
-            List<Double> labelMeans = new ArrayList<>();
-            List<Double> labelSumsqs = new ArrayList<>();
-            List<Double> labelMins = new ArrayList<>();
-            List<Double> labelMaxes = new ArrayList<>();
-            List<Long> labelCounts = new ArrayList<>();
-            for (String label : this.labels) {
-                if (!this.labelStats.containsKey(label)) continue;
-                StatSummary labelStat = this.labelStats.get(label);
-                labelMeans.add(labelStat.getMean());
-                labelSumsqs.add(labelStat.getSumSq());
-                labelMins.add(labelStat.getMin());
-                labelMaxes.add(labelStat.getMax());
-                labelCounts.add(new Long(labelStat.getCount()));
-            }
-            profilingSummary.setUnindexedProperty(LABELS, this.labels);
-            profilingSummary.setUnindexedProperty(LABEL_MEANS, labelMeans);
-            profilingSummary.setUnindexedProperty(LABEL_SUMSQS, labelSumsqs);
-            profilingSummary.setUnindexedProperty(LABEL_MINS, labelMins);
-            profilingSummary.setUnindexedProperty(LABEL_MAXES, labelMaxes);
-            profilingSummary.setUnindexedProperty(LABEL_COUNTS, labelCounts);
-        }
-
-        return profilingSummary;
-    }
-
-    /**
-     * Convert an Entity object to a ProfilingPointSummaryEntity.
-     *
-     * @param e The entity to process.
-     * @return ProfilingPointSummaryEntity object with the properties from e, or null if
-     *     incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static ProfilingPointSummaryEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND)
-                || !e.hasProperty(MEAN)
-                || !e.hasProperty(SUMSQ)
-                || !e.hasProperty(MIN)
-                || !e.hasProperty(MAX)
-                || !e.hasProperty(COUNT)
-                || !e.hasProperty(START_TIME)
-                || !e.hasProperty(BRANCH)
-                || !e.hasProperty(BUILD_FLAVOR)
-                || !e.hasProperty(SERIES)) {
-            logger.log(
-                    Level.WARNING, "Missing profiling point attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            Key parentKey = e.getParent();
-            double mean = (double) e.getProperty(MEAN);
-            double sumsq = (double) e.getProperty(SUMSQ);
-            double min = (double) e.getProperty(MIN);
-            double max = (double) e.getProperty(MAX);
-            int count = (int) (long) e.getProperty(COUNT);
-            StatSummary globalStats =
-                    new StatSummary(
-                            null,
-                            min,
-                            max,
-                            mean,
-                            sumsq,
-                            count,
-                            VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE);
-            Map<String, StatSummary> labelStats = new HashMap<>();
-            List<String> labels = new ArrayList<>();
-            if (e.hasProperty(LABELS)) {
-                labels = (List<String>) e.getProperty(LABELS);
-                List<Double> labelMeans = (List<Double>) e.getProperty(LABEL_MEANS);
-                List<Double> labelSumsqs = (List<Double>) e.getProperty(LABEL_SUMSQS);
-                List<Double> labelMins = (List<Double>) e.getProperty(LABEL_MINS);
-                List<Double> labelMaxes = (List<Double>) e.getProperty(LABEL_MAXES);
-                List<Long> labelCounts = (List<Long>) e.getProperty(LABEL_COUNTS);
-                if (labels.size() != labelMeans.size()
-                        || labels.size() != labelSumsqs.size()
-                        || labels.size() != labelMins.size()
-                        || labels.size() != labelMaxes.size()
-                        || labels.size() != labelCounts.size()) {
-                    logger.log(Level.WARNING, "Jagged label information for entity: " + e.getKey());
-                    return null;
-                }
-                for (int i = 0; i < labels.size(); ++i) {
-                    StatSummary labelStat =
-                            new StatSummary(
-                                    labels.get(i),
-                                    labelMins.get(i),
-                                    labelMaxes.get(i),
-                                    labelMeans.get(i),
-                                    labelSumsqs.get(i),
-                                    labelCounts.get(i).intValue(),
-                                    VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE);
-                    labelStats.put(labels.get(i), labelStat);
-                }
-            }
-            String branch = (String) e.getProperty(BRANCH);
-            String buildFlavor = (String) e.getProperty(BUILD_FLAVOR);
-            String series = (String) e.getProperty(SERIES);
-            long startTime = (long) e.getProperty(START_TIME);
-            return new ProfilingPointSummaryEntity(
-                    parentKey,
-                    globalStats,
-                    labels,
-                    labelStats,
-                    branch,
-                    buildFlavor,
-                    series,
-                    startTime);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing profiling point summary entity.", exception);
-        }
-        return null;
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/RoleEntity.java b/src/main/java/com/android/vts/entity/RoleEntity.java
deleted file mode 100644
index 508a9ca..0000000
--- a/src/main/java/com/android/vts/entity/RoleEntity.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.android.vts.entity;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.googlecode.objectify.Key;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import java.util.Date;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-
-@Cache
-@Entity
-@EqualsAndHashCode(of = "role")
-@NoArgsConstructor
-public class RoleEntity implements DashboardEntity {
-
-    private static final long serialVersionUID = 1L;
-
-    @Id private String role;
-
-    /** When this record was created or updated */
-    @Getter Date updated;
-
-    /** Construction function for UserEntity Class */
-    public RoleEntity(String roleName) {
-        this.role = roleName;
-    }
-
-    /** Get role by email */
-    public static RoleEntity getRole(String role) {
-        return ofy().load().type(RoleEntity.class).id(role).now();
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public Key<RoleEntity> save() {
-        this.updated = new Date();
-        return ofy().save().entity(this).now();
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/TestAcknowledgmentEntity.java b/src/main/java/com/android/vts/entity/TestAcknowledgmentEntity.java
deleted file mode 100644
index a594f85..0000000
--- a/src/main/java/com/android/vts/entity/TestAcknowledgmentEntity.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.entity;
-
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Text;
-import com.google.appengine.api.users.User;
-import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import com.google.gson.reflect.TypeToken;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import lombok.Data;
-
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@com.googlecode.objectify.annotation.Entity(name = "TestAcknowledgment")
-@Cache
-@Data
-/** Entity describing a test failure acknowledgment. */
-public class TestAcknowledgmentEntity implements DashboardEntity {
-    protected static final Logger logger =
-            Logger.getLogger(TestAcknowledgmentEntity.class.getName());
-
-    public static final String KIND = "TestAcknowledgment";
-    public static final String KEY = "key";
-    public static final String TEST_KEY = "testKey";
-    public static final String TEST_NAME = "testName";
-    public static final String USER_OBJ = "userObj";
-    public static final String CREATED = "created";
-    public static final String BRANCHES = "branches";
-    public static final String DEVICES = "devices";
-    public static final String TEST_CASE_NAMES = "testCaseNames";
-    public static final String NOTE = "note";
-
-    @Ignore private final Key key;
-    @Ignore public final Key test;
-    @Ignore public final User userObj;
-
-    @Id private Long id;
-
-    private com.googlecode.objectify.Key testKey;
-    private Set<String> branches;
-    private Set<String> devices;
-    private Set<String> testCaseNames;
-    private String note;
-    private String user;
-
-    @Index private final long created;
-
-    /**
-     * Create a AcknowledgmentEntity object.
-     *
-     * @param key The key of the AcknowledgmentEntity in the database.
-     * @param created The timestamp when the entity was created (in microseconds).
-     * @param test The key of the test.
-     * @param userObj The user who created or last modified the entity.
-     * @param branches The list of branch names for which the acknowledgment applies (or null if
-     *     all).
-     * @param devices The list of device build flavors for which the acknowledgment applies (or null
-     *     if all).
-     * @param testCaseNames The list of test case names known to fail (or null if all).
-     * @param note A text blob with details about the failure (or null if all).
-     */
-    private TestAcknowledgmentEntity(
-            Key key,
-            long created,
-            Key test,
-            User userObj,
-            List<String> branches,
-            List<String> devices,
-            List<String> testCaseNames,
-            Text note) {
-        this.test = test;
-        this.userObj = userObj;
-        if (branches != null) this.branches = new HashSet(branches);
-        else this.branches = new HashSet<>();
-
-        if (devices != null) this.devices = new HashSet(devices);
-        else this.devices = new HashSet<>();
-
-        if (testCaseNames != null) this.testCaseNames = new HashSet(testCaseNames);
-        else this.testCaseNames = new HashSet<>();
-
-        if (note != null) this.note = note.getValue();
-        else this.note = null;
-
-        this.key = key;
-        this.created = created;
-    }
-
-    /**
-     * Create a AcknowledgmentEntity object.
-     *
-     * @param test The key of the test.
-     * @param userObj The user who created or last modified the entity.
-     * @param branches The list of branch names for which the acknowledgment applies (or null if
-     *     all).
-     * @param devices The list of device build flavors for which the acknowledgment applies (or null
-     *     if all).
-     * @param testCaseNames The list of test case names known to fail (or null if all).
-     * @param note A text blob with details about the failure (or null if all).
-     */
-    public TestAcknowledgmentEntity(
-            Key test,
-            User userObj,
-            List<String> branches,
-            List<String> devices,
-            List<String> testCaseNames,
-            Text note) {
-        this(null, -1, test, userObj, branches, devices, testCaseNames, note);
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<TestAcknowledgmentEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    public Entity toEntity() {
-        Entity ackEntity;
-        if (this.key == null) ackEntity = new Entity(KIND);
-        else ackEntity = new Entity(key);
-
-        ackEntity.setProperty(TEST_KEY, this.test);
-        ackEntity.setProperty(USER_OBJ, this.userObj);
-
-        long created = this.created;
-        if (created < 0) created = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        ackEntity.setProperty(CREATED, created);
-
-        if (this.branches != null && this.branches.size() > 0)
-            ackEntity.setUnindexedProperty(BRANCHES, new ArrayList<>(this.branches));
-
-        if (this.devices != null && this.devices.size() > 0)
-            ackEntity.setUnindexedProperty(DEVICES, new ArrayList<>(this.devices));
-
-        if (this.testCaseNames != null && this.testCaseNames.size() > 0)
-            ackEntity.setUnindexedProperty(TEST_CASE_NAMES, new ArrayList<>(this.testCaseNames));
-
-        if (this.note != null) ackEntity.setUnindexedProperty(NOTE, new Text(this.note));
-        return ackEntity;
-    }
-
-    /**
-     * Convert an Entity object to a TestAcknowledgmentEntity.
-     *
-     * @param e The entity to process.
-     * @return TestEntity object with the properties from e processed, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestAcknowledgmentEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND)
-                || !e.hasProperty(TEST_KEY)
-                || !e.hasProperty(USER_OBJ)
-                || !e.hasProperty(CREATED)) {
-            logger.log(
-                    Level.WARNING, "Missing attributes in acknowledgment entity: " + e.toString());
-            return null;
-        }
-        try {
-            Key test = (Key) e.getProperty(TEST_KEY);
-            User user = (User) e.getProperty(USER_OBJ);
-            long created = (long) e.getProperty(CREATED);
-
-            List<String> branches;
-            if (e.hasProperty(BRANCHES)) branches = (List<String>) e.getProperty(BRANCHES);
-            else branches = null;
-
-            List<String> devices;
-            if (e.hasProperty(DEVICES)) devices = (List<String>) e.getProperty(DEVICES);
-            else devices = null;
-
-            List<String> testCaseNames;
-            if (e.hasProperty(TEST_CASE_NAMES))
-                testCaseNames = (List<String>) e.getProperty(TEST_CASE_NAMES);
-            else testCaseNames = null;
-
-            Text note = null;
-            if (e.hasProperty(NOTE)) note = (Text) e.getProperty(NOTE);
-            return new TestAcknowledgmentEntity(
-                    e.getKey(), created, test, user, branches, devices, testCaseNames, note);
-        } catch (ClassCastException exception) {
-            logger.log(Level.WARNING, "Corrupted data in entity: " + e.getKey());
-            return null;
-        }
-    }
-
-    /**
-     * Convert a JSON object to a TestAcknowledgmentEntity.
-     *
-     * @param user The user requesting the conversion.
-     * @param json The json object to convert.
-     * @return TestAcknowledgmentEntity with the data from the json object.
-     */
-    public static TestAcknowledgmentEntity fromJson(User user, JsonObject json) {
-        try {
-            if (!json.has(TEST_NAME)) return null;
-            String testName = json.get(TEST_NAME).getAsString();
-            Key testKey = KeyFactory.createKey(TestEntity.KIND, testName);
-            List<String> branches = null;
-
-            Type listType = new TypeToken<List<String>>() {}.getType();
-            if (json.has(BRANCHES)) {
-                branches = new Gson().fromJson(json.get(BRANCHES), listType);
-            }
-
-            List<String> devices = null;
-            if (json.has(DEVICES)) {
-                devices = new Gson().fromJson(json.get(DEVICES), listType);
-            }
-
-            List<String> testCaseNames = null;
-            if (json.has(TEST_CASE_NAMES)) {
-                testCaseNames = new Gson().fromJson(json.get(TEST_CASE_NAMES), listType);
-            }
-
-            Text note = null;
-            if (json.has(NOTE)) {
-                note = new Text(json.get(NOTE).getAsString());
-            }
-
-            Key key = null;
-            if (json.has(KEY)) {
-                key = KeyFactory.stringToKey(json.get(KEY).getAsString());
-            }
-            return new TestAcknowledgmentEntity(
-                    key, -1l, testKey, user, branches, devices, testCaseNames, note);
-        } catch (ClassCastException | IllegalStateException e) {
-            return null;
-        }
-    }
-
-    /**
-     * Convert the entity to a json object.
-     *
-     * @return The entity serialized in JSON format.
-     */
-    public JsonObject toJson() {
-        JsonObject json = new JsonObject();
-        json.add(KEY, new JsonPrimitive(KeyFactory.keyToString(this.key)));
-        json.add(TEST_NAME, new JsonPrimitive(this.test.getName()));
-        json.add(USER_OBJ, new JsonPrimitive(this.userObj.getEmail()));
-        json.add(CREATED, new JsonPrimitive(this.created));
-
-        List<JsonElement> branches = new ArrayList<>();
-        if (this.branches != null) {
-            for (String branch : this.branches) {
-                branches.add(new JsonPrimitive(branch));
-            }
-        }
-        json.add(BRANCHES, new Gson().toJsonTree(branches));
-
-        List<JsonElement> devices = new ArrayList<>();
-        if (this.devices != null) {
-            for (String device : this.devices) {
-                devices.add(new JsonPrimitive(device));
-            }
-        }
-        json.add(DEVICES, new Gson().toJsonTree(devices));
-
-        List<JsonElement> testCaseNames = new ArrayList<>();
-        if (this.testCaseNames != null) {
-            for (String testCaseName : this.testCaseNames) {
-                testCaseNames.add(new JsonPrimitive(testCaseName));
-            }
-        }
-        json.add(TEST_CASE_NAMES, new Gson().toJsonTree(testCaseNames));
-
-        String note = "";
-        if (this.note != null) note = this.note;
-        json.add(NOTE, new JsonPrimitive(note));
-        return json;
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/TestCaseRunEntity.java b/src/main/java/com/android/vts/entity/TestCaseRunEntity.java
deleted file mode 100644
index 85a6c43..0000000
--- a/src/main/java/com/android/vts/entity/TestCaseRunEntity.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.OnLoad;
-import java.util.ArrayList;
-import java.util.List;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@com.googlecode.objectify.annotation.Entity(name = "TestCaseRun")
-@Cache
-@Data
-@Slf4j
-/** Entity describing the execution of a test case. */
-public class TestCaseRunEntity implements DashboardEntity {
-
-    public static final String KIND = "TestCaseRun";
-
-    // Property keys
-    public static final String TEST_CASE_NAME = "testCaseName";
-    public static final String RESULT = "result";
-    public static final String TEST_CASE_NAMES = "testCaseNames";
-    public static final String RESULTS = "results";
-    public static final String SYSTRACE_URL = "systraceUrl";
-
-    // Maximum number of test cases in the entity.
-    private static final int SIZE_LIMIT = 500;
-
-    @Id
-    private Long id;
-
-    private List<Integer> results;
-
-    private List<String> testCaseNames;
-
-    @Ignore
-    public final List<TestCase> testCases;
-
-    @Ignore
-    private String systraceUrl;
-
-    /**
-     * Class describing an individual test case run.
-     */
-    public static class TestCase {
-        public final long parentId;
-        public final int offset;
-        public final String name;
-        public final int result;
-
-        /**
-         * Create a test case run.
-         * @param parentId The ID of the TestCaseRunEntity containing the test case.
-         * @param offset The offset of the TestCase into the TestCaseRunEntity.
-         * @param name The name of the test case.
-         * @param result The result of the test case.
-         */
-        public TestCase(long parentId, int offset, String name, int result) {
-            this.parentId = parentId;
-            this.offset = offset;
-            this.name = name;
-            this.result = result;
-        }
-    }
-
-    /**
-     * Create a TestCaseRunEntity.
-     */
-    public TestCaseRunEntity() {
-        this.results = new ArrayList<>();
-        this.testCaseNames = new ArrayList<>();
-        this.testCases = new ArrayList<>();
-        this.systraceUrl = null;
-    }
-
-    /**
-     * Create a TestCaseRunEntity with the specified id.
-     * @param id The entity id.
-     */
-    public TestCaseRunEntity(long id) {
-        this.id = id;
-        this.results = new ArrayList<>();
-        this.testCaseNames = new ArrayList<>();
-        this.testCases = new ArrayList<>();
-        this.systraceUrl = null;
-    }
-
-    /**
-     * Determine if the TestCaseRunEntity is full.
-     * @return True if the entity is full, false otherwise.
-     */
-    public boolean isFull() {
-        return this.testCases.size() >= SIZE_LIMIT;
-    }
-
-    /**
-     * Set the systrace url.
-     * @param url The systrace url, or null.
-     */
-    private void setSystraceUrl(String url) {
-        this.systraceUrl = url;
-    }
-
-    /**
-     * Get the systrace url.
-     * returns The systrace url, or null.
-     */
-    public String getSystraceUrl() {
-        return this.systraceUrl;
-    }
-
-    /**
-     * Called after the POJO is populated with data through objecitfy library
-     */
-    @OnLoad
-    private void onLoad() {
-        if (testCaseNames.size() == results.size()) {
-            for (int index = 0; index < testCaseNames.size(); index++) {
-                String name = testCaseNames.get(index);
-                int result = results.get(index).intValue();
-                this.testCases.add(new TestCase(this.id, this.testCases.size(), name, result));
-            }
-        }
-    }
-
-    /**
-     * Add a test case to the test case run entity.
-     * @param name The name of the test case.
-     * @param result The result of the test case.
-     * @return true if added, false otherwise.
-     */
-    public boolean addTestCase(String name, int result) {
-        if (this.isFull()) {
-            return false;
-        } else {
-            this.testCaseNames.add(name);
-            this.results.add(result);
-            return true;
-        }
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<TestCaseRunEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    public Entity toEntity() {
-        Entity testCaseRunEntity;
-        if (this.id >= 0) {
-            testCaseRunEntity = new Entity(KeyFactory.createKey(KIND, id));
-        } else {
-            testCaseRunEntity = new Entity(KIND);
-        }
-
-        if (this.testCases.size() > 0) {
-            List<String> testCaseNames = new ArrayList<>();
-            List<Integer> results = new ArrayList<>();
-            for (TestCase testCase : this.testCases) {
-                testCaseNames.add(testCase.name);
-                results.add(testCase.result);
-            }
-            testCaseRunEntity.setUnindexedProperty(TEST_CASE_NAMES, testCaseNames);
-            testCaseRunEntity.setUnindexedProperty(RESULTS, results);
-        }
-        if (systraceUrl != null) {
-            testCaseRunEntity.setUnindexedProperty(SYSTRACE_URL, this.systraceUrl);
-        }
-
-        return testCaseRunEntity;
-    }
-
-    /**
-     * Convert an Entity object to a TestCaseRunEntity.
-     *
-     * @param e The entity to process.
-     * @return TestCaseRunEntity object with the properties from e, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestCaseRunEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND)) {
-            log.warn("Wrong kind: " + e.getKey());
-            return null;
-        }
-        try {
-            TestCaseRunEntity testCaseRun = new TestCaseRunEntity(e.getKey().getId());
-            if (e.hasProperty(TEST_CASE_NAMES) && e.hasProperty(RESULTS)) {
-                List<String> testCaseNames = (List<String>) e.getProperty(TEST_CASE_NAMES);
-                List<Long> results = (List<Long>) e.getProperty(RESULTS);
-                if (testCaseNames.size() == results.size()) {
-                    for (int i = 0; i < testCaseNames.size(); i++) {
-                        testCaseRun.addTestCase(testCaseNames.get(i), results.get(i).intValue());
-                    }
-                }
-            }
-            if (e.hasProperty(TEST_CASE_NAME) && e.hasProperty(RESULT)) {
-                testCaseRun.addTestCase(
-                        (String) e.getProperty(TEST_CASE_NAME), (int) (long) e.getProperty(RESULT));
-            }
-            if (e.hasProperty(SYSTRACE_URL)) {
-                String systraceUrl = (String) e.getProperty(SYSTRACE_URL);
-                testCaseRun.setSystraceUrl(systraceUrl);
-            }
-            return testCaseRun;
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            log.warn("Error parsing test case run entity.", exception);
-        }
-        return null;
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/TestCoverageStatusEntity.java b/src/main/java/com/android/vts/entity/TestCoverageStatusEntity.java
deleted file mode 100644
index 1156cc7..0000000
--- a/src/main/java/com/android/vts/entity/TestCoverageStatusEntity.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.google.appengine.api.datastore.Entity;
-import com.googlecode.objectify.Key;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Index;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-@com.googlecode.objectify.annotation.Entity(name = "TestCoverageStatus")
-@EqualsAndHashCode(of = "testName")
-@Cache
-@NoArgsConstructor
-/** Entity describing test coverage status. */
-public class TestCoverageStatusEntity implements DashboardEntity {
-
-    protected static final Logger logger =
-            Logger.getLogger(TestCoverageStatusEntity.class.getName());
-
-    public static final String KIND = "TestCoverageStatus";
-
-    // Property keys
-    public static final String TOTAL_LINE_COUNT = "totalLineCount";
-    public static final String COVERED_LINE_COUNT = "coveredLineCount";
-    public static final String UPDATED_TIMESTAMP = "updatedTimestamp";
-    public static final String DEVICE_INFO_ID = "deviceInfoId";
-
-    /** TestCoverageStatusEntity name field */
-    @Id @Getter @Setter String testName;
-
-    /** TestCoverageStatusEntity coveredLineCount field */
-    @Index @Getter @Setter long coveredLineCount;
-
-    /** TestCoverageStatusEntity totalLineCount field */
-    @Index @Getter @Setter long totalLineCount;
-
-    /** TestCoverageStatusEntity updatedTimestamp field */
-    @Index @Getter @Setter long updatedTimestamp;
-
-    /** TestCoverageStatusEntity DeviceInfo Entity ID reference field */
-    @Index @Getter @Setter long deviceInfoId;
-
-    /** TestCoverageStatusEntity updatedCoveredLineCount field */
-    @Index @Getter @Setter long updatedCoveredLineCount;
-
-    /** TestCoverageStatusEntity updatedTotalLineCount field */
-    @Index @Getter @Setter long updatedTotalLineCount;
-
-    /** TestCoverageStatusEntity updatedDate field */
-    @Index @Getter @Setter Date updatedDate;
-
-    /**
-     * Create a TestCoverageStatusEntity object with status metadata.
-     *
-     * @param testName The name of the test.
-     * @param timestamp The timestamp indicating the most recent test run event in the test state.
-     * @param coveredLineCount The number of lines covered.
-     * @param totalLineCount The total number of lines.
-     */
-    public TestCoverageStatusEntity(
-            String testName,
-            long timestamp,
-            long coveredLineCount,
-            long totalLineCount,
-            long deviceInfoId) {
-        this.testName = testName;
-        this.updatedTimestamp = timestamp;
-        this.coveredLineCount = coveredLineCount;
-        this.totalLineCount = totalLineCount;
-        this.deviceInfoId = deviceInfoId;
-    }
-
-    /** find TestCoverageStatus entity by ID */
-    public static TestCoverageStatusEntity findById(String testName) {
-        return ofy().load().type(TestCoverageStatusEntity.class).id(testName).now();
-    }
-
-    /** Get all TestCoverageStatusEntity List */
-    public static Map<String, TestCoverageStatusEntity> getTestCoverageStatusMap() {
-        List<TestCoverageStatusEntity> testCoverageStatusEntityList = getAllTestCoverage();
-
-        Map<String, TestCoverageStatusEntity> testCoverageStatusMap =
-                testCoverageStatusEntityList.stream()
-                        .collect(Collectors.toMap(t -> t.getTestName(), t -> t));
-        return testCoverageStatusMap;
-    }
-
-    /** Get all DeviceInfoEntity List by TestCoverageStatusEntities' key list */
-    public static List<Key<DeviceInfoEntity>> getDeviceInfoEntityKeyList(
-            List<TestCoverageStatusEntity> testCoverageStatusEntityList) {
-        return testCoverageStatusEntityList
-                .stream()
-                .map(
-                        testCoverageStatusEntity -> {
-                            com.googlecode.objectify.Key testKey =
-                                    com.googlecode.objectify.Key.create(
-                                            TestEntity.class,
-                                            testCoverageStatusEntity.getTestName());
-                            com.googlecode.objectify.Key testRunKey =
-                                    com.googlecode.objectify.Key.create(
-                                            testKey,
-                                            TestRunEntity.class,
-                                            testCoverageStatusEntity.getUpdatedTimestamp());
-                            return com.googlecode.objectify.Key.create(
-                                    testRunKey,
-                                    DeviceInfoEntity.class,
-                                    testCoverageStatusEntity.getDeviceInfoId());
-                        })
-                .collect(Collectors.toList());
-    }
-
-    /** Get all TestCoverageStatusEntity List */
-    public static List<TestCoverageStatusEntity> getAllTestCoverage() {
-        return ofy().load().type(TestCoverageStatusEntity.class).list();
-    }
-
-    /** Get all TestCoverageStatusEntities' Branch List */
-    public static Set<String> getBranchSet(
-            List<TestCoverageStatusEntity> testCoverageStatusEntityList) {
-        List<com.googlecode.objectify.Key<DeviceInfoEntity>> deviceInfoEntityKeyList =
-                getDeviceInfoEntityKeyList(testCoverageStatusEntityList);
-
-        Collection<DeviceInfoEntity> deviceInfoEntityList =
-                ofy().load().keys(() -> deviceInfoEntityKeyList.iterator()).values();
-
-        Set<String> branchSet =
-                deviceInfoEntityList
-                        .stream()
-                        .map(deviceInfoEntity -> deviceInfoEntity.getBranch())
-                        .collect(Collectors.toSet());
-        return branchSet;
-    }
-
-    /** Get all TestCoverageStatusEntities' Device List */
-    public static Set<String> getDeviceSet(
-            List<TestCoverageStatusEntity> testCoverageStatusEntityList) {
-        List<com.googlecode.objectify.Key<DeviceInfoEntity>> deviceInfoEntityKeyList =
-                getDeviceInfoEntityKeyList(testCoverageStatusEntityList);
-
-        Collection<DeviceInfoEntity> deviceInfoEntityList =
-                ofy().load().keys(() -> deviceInfoEntityKeyList.iterator()).values();
-
-        Set<String> deviceSet =
-                deviceInfoEntityList
-                        .stream()
-                        .map(deviceInfoEntity -> deviceInfoEntity.getBuildFlavor())
-                        .collect(Collectors.toSet());
-        return deviceSet;
-    }
-
-    /** TestRunEntity function to get the related TestRunEntity from id value */
-    public TestRunEntity getTestRunEntity() {
-        com.googlecode.objectify.Key testKey =
-                com.googlecode.objectify.Key.create(TestEntity.class, this.testName);
-        return ofy().load()
-                .type(TestRunEntity.class)
-                .parent(testKey)
-                .id(this.updatedTimestamp)
-                .now();
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public Key<TestCoverageStatusEntity> save() {
-        this.updatedDate = new Date();
-        return ofy().save().entity(this).now();
-    }
-
-    public Entity toEntity() {
-        Entity testEntity = new Entity(KIND, this.testName);
-        testEntity.setProperty(UPDATED_TIMESTAMP, this.updatedTimestamp);
-        testEntity.setProperty(COVERED_LINE_COUNT, this.coveredLineCount);
-        testEntity.setProperty(TOTAL_LINE_COUNT, this.totalLineCount);
-        return testEntity;
-    }
-
-    /**
-     * Convert an Entity object to a TestCoverageStatusEntity.
-     *
-     * @param e The entity to process.
-     * @return TestCoverageStatusEntity object with the properties from e processed, or null if
-     *     incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestCoverageStatusEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND)
-                || e.getKey().getName() == null
-                || !e.hasProperty(UPDATED_TIMESTAMP)
-                || !e.hasProperty(COVERED_LINE_COUNT)
-                || !e.hasProperty(TOTAL_LINE_COUNT)
-                || !e.hasProperty(DEVICE_INFO_ID)) {
-            logger.log(Level.WARNING, "Missing test attributes in entity: " + e.toString());
-            return null;
-        }
-        String testName = e.getKey().getName();
-        long timestamp = 0;
-        long coveredLineCount = -1;
-        long totalLineCount = -1;
-        long deviceInfoId = 0;
-        try {
-            timestamp = (long) e.getProperty(UPDATED_TIMESTAMP);
-            coveredLineCount = (Long) e.getProperty(COVERED_LINE_COUNT);
-            totalLineCount = (Long) e.getProperty(TOTAL_LINE_COUNT);
-            deviceInfoId = (Long) e.getProperty(DEVICE_INFO_ID);
-        } catch (ClassCastException exception) {
-            // Invalid contents or null values
-            logger.log(Level.WARNING, "Error parsing test entity.", exception);
-            return null;
-        }
-        return new TestCoverageStatusEntity(
-                testName, timestamp, coveredLineCount, totalLineCount, deviceInfoId);
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/TestEntity.java b/src/main/java/com/android/vts/entity/TestEntity.java
deleted file mode 100644
index 4df7fb0..0000000
--- a/src/main/java/com/android/vts/entity/TestEntity.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Index;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-import lombok.Data;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-@Entity(name = "Test")
-@Cache
-@Data
-@NoArgsConstructor
-/** Entity describing test metadata. */
-public class TestEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(TestEntity.class.getName());
-
-    public static final String KIND = "Test";
-    public static final String HAS_PROFILING_DATA = "hasProfilingData";
-
-    @Id
-    @Getter
-    @Setter
-    private String testName;
-
-    @Index
-    @Getter
-    @Setter
-    private boolean hasProfilingData;
-
-    /**
-     * Create a TestEntity object.
-     *
-     * @param testName The name of the test.
-     * @param hasProfilingData True if the test includes profiling data.
-     */
-    public TestEntity(String testName, boolean hasProfilingData) {
-        this.testName = testName;
-        this.hasProfilingData = hasProfilingData;
-    }
-
-    /**
-     * Create a TestEntity object.
-     *
-     * @param testName The name of the test.
-     */
-    public TestEntity(String testName) {
-        this(testName, false);
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<TestEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    public com.google.appengine.api.datastore.Entity toEntity() {
-        com.google.appengine.api.datastore.Entity testEntity = new com.google.appengine.api.datastore.Entity(this.getOldKey());
-        testEntity.setProperty(HAS_PROFILING_DATA, this.hasProfilingData);
-        return testEntity;
-    }
-
-    /**
-     * Get objectify TestRun Entity's key.
-     *
-     * @param startTimestamp test start timestamp
-     */
-    public com.googlecode.objectify.Key getTestRunKey(long startTimestamp) {
-        com.googlecode.objectify.Key testKey =
-                com.googlecode.objectify.Key.create(TestEntity.class, this.getTestName());
-        com.googlecode.objectify.Key testRunKey =
-                com.googlecode.objectify.Key.create(testKey, TestRunEntity.class, startTimestamp);
-        return testRunKey;
-    }
-
-    /**
-     * Get key info from appengine based library.
-     */
-    public Key getOldKey() {
-        return KeyFactory.createKey(KIND, testName);
-    }
-
-    public static List<String> getAllTestNames() {
-        List<TestEntity> testEntityList = getAllTest();
-
-        List<String> allTestNames = testEntityList.stream()
-            .map(te -> te.getTestName()).collect(Collectors.toList());
-        return allTestNames;
-    }
-
-    public static List<TestEntity> getAllTest() {
-        return ofy().load().type(TestEntity.class).list();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null || !TestEntity.class.isAssignableFrom(obj.getClass())) {
-            return false;
-        }
-        TestEntity test2 = (TestEntity) obj;
-        return (
-            this.testName.equals(test2.testName) &&
-                this.hasProfilingData == test2.hasProfilingData);
-    }
-
-    /**
-     * Convert an Entity object to a TestEntity.
-     *
-     * @param e The entity to process.
-     * @return TestEntity object with the properties from e processed, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestEntity fromEntity(com.google.appengine.api.datastore.Entity e) {
-        if (!e.getKind().equals(KIND) || e.getKey().getName() == null) {
-            logger.log(Level.WARNING, "Missing test attributes in entity: " + e.toString());
-            return null;
-        }
-        String testName = e.getKey().getName();
-        boolean hasProfilingData = false;
-        if (e.hasProperty(HAS_PROFILING_DATA)) {
-            hasProfilingData = (boolean) e.getProperty(HAS_PROFILING_DATA);
-        }
-        return new TestEntity(testName, hasProfilingData);
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/TestPlanEntity.java b/src/main/java/com/android/vts/entity/TestPlanEntity.java
deleted file mode 100644
index 590db46..0000000
--- a/src/main/java/com/android/vts/entity/TestPlanEntity.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.google.appengine.api.datastore.Entity;
-import com.googlecode.objectify.Key;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@com.googlecode.objectify.annotation.Entity(name = "TestPlan")
-@Cache
-@Data
-@NoArgsConstructor
-/** Entity describing test plan metadata. */
-public class TestPlanEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(TestPlanEntity.class.getName());
-
-    public static final String KIND = "TestPlan";
-
-    // Property keys
-    public static final String TEST_PLAN_NAME = "testPlanName";
-
-    @Id
-    public String testPlanName;
-
-    /**
-     * Create a TestPlanEntity object.
-     *
-     * @param testPlanName The name of the test plan.
-     */
-    public TestPlanEntity(String testPlanName) {
-        this.testPlanName = testPlanName;
-    }
-
-    public Entity toEntity() {
-        Entity planEntity = new Entity(KIND, this.testPlanName);
-        return planEntity;
-    }
-
-    public Key getKey() {
-        Key key = Key.create(TestPlanEntity.class, this.testPlanName);
-        return key;
-    }
-
-    /**
-     * Convert an Entity object to a TestEntity.
-     *
-     * @param e The entity to process.
-     * @return TestEntity object with the properties from e processed, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestPlanEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || e.getKey().getName() == null
-                || !e.hasProperty(TEST_PLAN_NAME)) {
-            logger.log(Level.WARNING, "Missing test plan attributes in entity: " + e.toString());
-            return null;
-        }
-        String testPlanName = e.getKey().getName();
-        return new TestPlanEntity(testPlanName);
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<TestPlanEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/TestPlanRunEntity.java b/src/main/java/com/android/vts/entity/TestPlanRunEntity.java
deleted file mode 100644
index de2e505..0000000
--- a/src/main/java/com/android/vts/entity/TestPlanRunEntity.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.taskqueue.Queue;
-import com.google.appengine.api.taskqueue.QueueFactory;
-import com.google.appengine.api.taskqueue.TaskOptions;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.Parent;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@com.googlecode.objectify.annotation.Entity(name = "TestPlanRun")
-@Cache
-@Data
-@NoArgsConstructor
-/** Entity describing test plan run information. */
-public class TestPlanRunEntity implements DashboardEntity {
-
-    protected static final Logger logger = Logger.getLogger(TestPlanRunEntity.class.getName());
-
-    private final String QUEUE_NAME = "coverageApiQueue";
-
-    public static final String KIND = "TestPlanRun";
-
-    private static final String COVERAGE_API_URL = "/api/coverage/api/sum";
-
-    // Property keys
-    public static final String TEST_PLAN_NAME = "testPlanName";
-    public static final String TYPE = "type";
-    public static final String START_TIMESTAMP = "startTimestamp";
-    public static final String END_TIMESTAMP = "endTimestamp";
-    public static final String TEST_BUILD_ID = "testBuildId";
-    public static final String PASS_COUNT = "passCount";
-    public static final String FAIL_COUNT = "failCount";
-    public static final String TOTAL_API_COUNT = "totalApiCount";
-    public static final String TOTAL_COVERED_API_COUNT = "coveredApiCount";
-    public static final String TEST_RUNS = "testRuns";
-
-    @Ignore public Key key;
-
-    @Id private Long id;
-
-    @Parent private com.googlecode.objectify.Key<TestPlanEntity> parent;
-
-    @Index private String testPlanName;
-
-    @Index private long type;
-
-    @Index private long startTimestamp;
-
-    @Index private long endTimestamp;
-
-    @Index private String testBuildId;
-
-    @Index private long passCount;
-
-    @Index private long failCount;
-
-    @Index private long totalApiCount;
-
-    @Index private long coveredApiCount;
-
-    @Ignore private List<Key> oldTestRuns;
-
-    private List<com.googlecode.objectify.Key<TestRunEntity>> testRuns;
-
-    /** When this record was created or updated */
-    @Index Date updated;
-
-    /**
-     * Create a TestPlanRunEntity object describing a test plan run.
-     *
-     * @param testPlanKey The key for the parent entity in the database.
-     * @param type The test run type (e.g. presubmit, postsubmit, other)
-     * @param startTimestamp The time in microseconds when the test plan run started.
-     * @param endTimestamp The time in microseconds when the test plan run ended.
-     * @param testBuildId The build ID of the VTS test build.
-     * @param passCount The number of passing test cases in the run.
-     * @param failCount The number of failing test cases in the run.
-     * @param testRuns A list of keys to the TestRunEntity objects for the plan run run.
-     */
-    public TestPlanRunEntity(
-            Key testPlanKey,
-            String testPlanName,
-            long type,
-            long startTimestamp,
-            long endTimestamp,
-            String testBuildId,
-            long passCount,
-            long failCount,
-            long totalApiCount,
-            long coveredApiCount,
-            List<Key> testRuns) {
-        this.id = startTimestamp;
-        this.key = KeyFactory.createKey(testPlanKey, KIND, startTimestamp);
-        this.testPlanName = testPlanName;
-        this.type = type;
-        this.startTimestamp = startTimestamp;
-        this.endTimestamp = endTimestamp;
-        this.testBuildId = testBuildId;
-        this.passCount = passCount;
-        this.failCount = failCount;
-        this.totalApiCount = totalApiCount;
-        this.coveredApiCount = coveredApiCount;
-        this.oldTestRuns = testRuns;
-        this.testRuns =
-                testRuns.stream()
-                        .map(
-                                testRun -> {
-                                    com.googlecode.objectify.Key testParentKey =
-                                            com.googlecode.objectify.Key.create(
-                                                    TestEntity.class,
-                                                    testRun.getParent().getName());
-                                    return com.googlecode.objectify.Key.create(
-                                            testParentKey, TestRunEntity.class, testRun.getId());
-                                })
-                        .collect(Collectors.toList());
-    }
-
-    /**
-     * Create a TestPlanRunEntity object describing a test plan run.
-     *
-     * @param testPlanKey The key for the parent entity in the database.
-     * @param type The test run type (e.g. presubmit, postsubmit, other)
-     * @param startTimestamp The time in microseconds when the test plan run started.
-     * @param endTimestamp The time in microseconds when the test plan run ended.
-     * @param testBuildId The build ID of the VTS test build.
-     * @param passCount The number of passing test cases in the run.
-     * @param failCount The number of failing test cases in the run.
-     * @param testRuns A list of keys to the TestRunEntity objects for the plan run run.
-     */
-    public TestPlanRunEntity(
-            com.googlecode.objectify.Key<TestPlanEntity> testPlanKey,
-            String testPlanName,
-            long type,
-            long startTimestamp,
-            long endTimestamp,
-            String testBuildId,
-            long passCount,
-            long failCount,
-            long totalApiCount,
-            long coveredApiCount,
-            List<com.googlecode.objectify.Key<TestRunEntity>> testRuns) {
-        this.id = startTimestamp;
-        this.parent = testPlanKey;
-        this.testPlanName = testPlanName;
-        this.type = type;
-        this.startTimestamp = startTimestamp;
-        this.endTimestamp = endTimestamp;
-        this.testBuildId = testBuildId;
-        this.passCount = passCount;
-        this.failCount = failCount;
-        this.totalApiCount = totalApiCount;
-        this.coveredApiCount = coveredApiCount;
-        this.testRuns = testRuns;
-    }
-
-    public Entity toEntity() {
-        Entity planRun = new Entity(this.key);
-        planRun.setProperty(TEST_PLAN_NAME, this.testPlanName);
-        planRun.setProperty(TYPE, this.type);
-        planRun.setProperty(START_TIMESTAMP, this.startTimestamp);
-        planRun.setProperty(END_TIMESTAMP, this.endTimestamp);
-        planRun.setProperty(TEST_BUILD_ID, this.testBuildId.toLowerCase());
-        planRun.setProperty(PASS_COUNT, this.passCount);
-        planRun.setProperty(FAIL_COUNT, this.failCount);
-        if (this.oldTestRuns != null && this.oldTestRuns.size() > 0) {
-            planRun.setUnindexedProperty(TEST_RUNS, this.oldTestRuns);
-        }
-        return planRun;
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<TestPlanRunEntity> save() {
-        this.updated = new Date();
-        return ofy().save().entity(this).now();
-    }
-
-    /** Get UrlSafeKey from this class */
-    public String getUrlSafeKey() {
-        return this.getOfyKey().toUrlSafe();
-    }
-
-    /** Add a task to calculate the total number of coverage API */
-    public void addCoverageApiTask() {
-        if (Objects.isNull(this.testRuns)) {
-            logger.log(Level.WARNING, "testRuns is null so adding task to the queue is skipped!");
-        } else {
-            Queue queue = QueueFactory.getQueue(QUEUE_NAME);
-            queue.add(
-                    TaskOptions.Builder.withUrl(COVERAGE_API_URL)
-                            .param("urlSafeKey", this.getUrlSafeKey())
-                            .method(TaskOptions.Method.POST));
-        }
-    }
-
-    /**
-     * Get key info from appengine based library.
-     *
-     * @param parentKey parent key.
-     */
-    public Key getOldKey(Key parentKey) {
-        return KeyFactory.createKey(parentKey, KIND, startTimestamp);
-    }
-
-    /** Get key info from objecitfy library. */
-    public com.googlecode.objectify.Key getOfyKey() {
-        return com.googlecode.objectify.Key.create(
-                this.parent, TestPlanRunEntity.class, this.startTimestamp);
-    }
-
-    /**
-     * Convert an Entity object to a TestPlanRunEntity.
-     *
-     * @param e The entity to process.
-     * @return TestPlanRunEntity object with the properties from e processed, or null if
-     *     incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestPlanRunEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND)
-                || !e.hasProperty(TEST_PLAN_NAME)
-                || !e.hasProperty(TYPE)
-                || !e.hasProperty(START_TIMESTAMP)
-                || !e.hasProperty(END_TIMESTAMP)
-                || !e.hasProperty(TEST_BUILD_ID)
-                || !e.hasProperty(PASS_COUNT)
-                || !e.hasProperty(FAIL_COUNT)
-                || !e.hasProperty(TEST_RUNS)) {
-            logger.log(Level.WARNING, "Missing test run attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            String testPlanName = (String) e.getProperty(TEST_PLAN_NAME);
-            long type = (long) e.getProperty(TYPE);
-            long startTimestamp = (long) e.getProperty(START_TIMESTAMP);
-            long endTimestamp = (long) e.getProperty(END_TIMESTAMP);
-            String testBuildId = (String) e.getProperty(TEST_BUILD_ID);
-            long passCount = (long) e.getProperty(PASS_COUNT);
-            long failCount = (long) e.getProperty(FAIL_COUNT);
-
-            long totalApiCount =
-                    e.hasProperty(TOTAL_API_COUNT) ? (long) e.getProperty(TOTAL_API_COUNT) : 0L;
-            long coveredApiCount =
-                    e.hasProperty(TOTAL_COVERED_API_COUNT)
-                            ? (long) e.getProperty(TOTAL_COVERED_API_COUNT)
-                            : 0L;
-            List<Key> oldTestRuns = (List<Key>) e.getProperty(TEST_RUNS);
-            return new TestPlanRunEntity(
-                    e.getKey().getParent(),
-                    testPlanName,
-                    type,
-                    startTimestamp,
-                    endTimestamp,
-                    testBuildId,
-                    passCount,
-                    failCount,
-                    totalApiCount,
-                    coveredApiCount,
-                    oldTestRuns);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing test plan run entity.", exception);
-        }
-        return null;
-    }
-
-    public JsonObject toJson() {
-        JsonObject json = new JsonObject();
-        json.add(TEST_PLAN_NAME, new JsonPrimitive(this.testPlanName));
-        json.add(TEST_BUILD_ID, new JsonPrimitive(this.testBuildId));
-        json.add(PASS_COUNT, new JsonPrimitive(this.passCount));
-        json.add(FAIL_COUNT, new JsonPrimitive(this.failCount));
-        json.add(START_TIMESTAMP, new JsonPrimitive(this.startTimestamp));
-        json.add(END_TIMESTAMP, new JsonPrimitive(this.endTimestamp));
-        return json;
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/TestRunEntity.java b/src/main/java/com/android/vts/entity/TestRunEntity.java
deleted file mode 100644
index 0d5f1ec..0000000
--- a/src/main/java/com/android/vts/entity/TestRunEntity.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.android.vts.util.TimeUtil;
-import com.android.vts.util.UrlUtil;
-import com.android.vts.util.UrlUtil.LinkDisplay;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.OnLoad;
-import com.googlecode.objectify.annotation.Parent;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.function.Supplier;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Stream;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import org.apache.commons.lang3.math.NumberUtils;
-
-@com.googlecode.objectify.annotation.Entity(name = "TestRun")
-@Cache
-@NoArgsConstructor
-/** Entity describing test run information. */
-public class TestRunEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(TestRunEntity.class.getName());
-
-    /** Enum for classifying test run types. */
-    public enum TestRunType {
-        OTHER(0),
-        PRESUBMIT(1),
-        POSTSUBMIT(2);
-
-        private final int value;
-
-        private TestRunType(int value) {
-            this.value = value;
-        }
-
-        /**
-         * Get the ordinal representation of the type.
-         *
-         * @return The value associated with the test run type.
-         */
-        public int getNumber() {
-            return value;
-        }
-
-        /**
-         * Convert an ordinal value to a TestRunType.
-         *
-         * @param value The orginal value to parse.
-         * @return a TestRunType value.
-         */
-        public static TestRunType fromNumber(int value) {
-            if (value == 1) {
-                return TestRunType.PRESUBMIT;
-            } else if (value == 2) {
-                return TestRunType.POSTSUBMIT;
-            } else {
-                return TestRunType.OTHER;
-            }
-        }
-
-        /**
-         * Determine the test run type based on the build ID.
-         *
-         * <p>Postsubmit runs are expected to have integer build IDs, while presubmit runs are
-         * integers prefixed by the character P. All other runs (e.g. local builds) are classified
-         * as OTHER.
-         *
-         * @param buildId The build ID.
-         * @return the TestRunType.
-         */
-        public static TestRunType fromBuildId(String buildId) {
-            if (buildId.toLowerCase().startsWith("p")) {
-                if (NumberUtils.isParsable(buildId.substring(1))) {
-                    return TestRunType.PRESUBMIT;
-                } else {
-                    return TestRunType.OTHER;
-                }
-            } else if (NumberUtils.isParsable(buildId)) {
-                return TestRunType.POSTSUBMIT;
-            } else {
-                return TestRunType.OTHER;
-            }
-        }
-    }
-
-    public static final String KIND = "TestRun";
-
-    // Property keys
-    public static final String TEST_NAME = "testName";
-    public static final String TYPE = "type";
-    public static final String START_TIMESTAMP = "startTimestamp";
-    public static final String END_TIMESTAMP = "endTimestamp";
-    public static final String TEST_BUILD_ID = "testBuildId";
-    public static final String HOST_NAME = "hostName";
-    public static final String PASS_COUNT = "passCount";
-    public static final String FAIL_COUNT = "failCount";
-    public static final String HAS_CODE_COVERAGE = "hasCodeCoverage";
-    public static final String HAS_COVERAGE = "hasCoverage";
-    public static final String TEST_CASE_IDS = "testCaseIds";
-    public static final String LOG_LINKS = "logLinks";
-    public static final String API_COVERAGE_KEY_LIST = "apiCoverageKeyList";
-    public static final String TOTAL_API_COUNT = "totalApiCount";
-    public static final String COVERED_API_COUNT = "coveredApiCount";
-
-    @Ignore private Key key;
-
-    @Id @Getter @Setter private Long id;
-
-    @Parent @Getter @Setter private com.googlecode.objectify.Key<?> testRunParent;
-
-    @Index @Getter @Setter private long type;
-
-    @Index @Getter @Setter private long startTimestamp;
-
-    @Index @Getter @Setter private long endTimestamp;
-
-    @Index @Getter @Setter private String testBuildId;
-
-    @Index @Getter @Setter private String testName;
-
-    @Index @Getter @Setter private String hostName;
-
-    @Index @Getter @Setter private long passCount;
-
-    @Index @Getter @Setter private long failCount;
-
-    @Index private boolean hasCoverage;
-
-    @Index @Getter @Setter private boolean hasCodeCoverage;
-
-    @Ignore private com.googlecode.objectify.Key<CodeCoverageEntity> codeCoverageEntityKey;
-
-    @Index @Getter @Setter private long coveredLineCount;
-
-    @Index @Getter @Setter private long totalLineCount;
-
-    @Getter @Setter private List<Long> testCaseIds;
-
-    @Getter @Setter private List<String> logLinks;
-
-    /**
-     * Create a TestRunEntity object describing a test run.
-     *
-     * @param parentKey The key to the parent TestEntity.
-     * @param type The test run type (e.g. presubmit, postsubmit, other)
-     * @param startTimestamp The time in microseconds when the test run started.
-     * @param endTimestamp The time in microseconds when the test run ended.
-     * @param testBuildId The build ID of the VTS test build.
-     * @param hostName The name of host machine.
-     * @param passCount The number of passing test cases in the run.
-     * @param failCount The number of failing test cases in the run.
-     */
-    public TestRunEntity(
-            Key parentKey,
-            long type,
-            long startTimestamp,
-            long endTimestamp,
-            String testBuildId,
-            String hostName,
-            long passCount,
-            long failCount,
-            boolean hasCodeCoverage,
-            List<Long> testCaseIds,
-            List<String> logLinks) {
-        this.id = startTimestamp;
-        this.key = KeyFactory.createKey(parentKey, KIND, startTimestamp);
-        this.type = type;
-        this.startTimestamp = startTimestamp;
-        this.endTimestamp = endTimestamp;
-        this.testBuildId = testBuildId;
-        this.hostName = hostName;
-        this.passCount = passCount;
-        this.failCount = failCount;
-        this.hasCodeCoverage = hasCodeCoverage;
-        this.testName = parentKey.getName();
-        this.testCaseIds = testCaseIds;
-        this.logLinks = logLinks;
-
-        this.testRunParent = com.googlecode.objectify.Key.create(TestEntity.class, testName);
-        this.codeCoverageEntityKey = getCodeCoverageEntityKey();
-    }
-
-    /**
-     * Called after the POJO is populated with data through objecitfy library
-     */
-    @OnLoad
-    private void onLoad() {
-        if (Objects.isNull(this.hasCodeCoverage)) {
-            this.hasCodeCoverage = this.hasCoverage;
-            this.save();
-        }
-    }
-
-    public Entity toEntity() {
-        Entity testRunEntity = new Entity(this.key);
-        testRunEntity.setProperty(TEST_NAME, this.testName);
-        testRunEntity.setProperty(TYPE, this.type);
-        testRunEntity.setProperty(START_TIMESTAMP, this.startTimestamp);
-        testRunEntity.setUnindexedProperty(END_TIMESTAMP, this.endTimestamp);
-        testRunEntity.setProperty(TEST_BUILD_ID, this.testBuildId.toLowerCase());
-        testRunEntity.setProperty(HOST_NAME, this.hostName.toLowerCase());
-        testRunEntity.setProperty(PASS_COUNT, this.passCount);
-        testRunEntity.setProperty(FAIL_COUNT, this.failCount);
-        testRunEntity.setProperty(HAS_CODE_COVERAGE, this.hasCodeCoverage);
-        testRunEntity.setUnindexedProperty(TEST_CASE_IDS, this.testCaseIds);
-        if (this.logLinks != null && this.logLinks.size() > 0) {
-            testRunEntity.setUnindexedProperty(LOG_LINKS, this.logLinks);
-        }
-        return testRunEntity;
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<TestRunEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    /**
-     * Get key info from appengine based library.
-     */
-    public Key getKey() {
-        Key parentKey = KeyFactory.createKey(TestEntity.KIND, testName);
-        return KeyFactory.createKey(parentKey, KIND, startTimestamp);
-    }
-
-    /** Getter hasCodeCoverage value */
-    public boolean getHasCodeCoverage() {
-        return this.hasCodeCoverage;
-    }
-
-    /** Getter DateTime string from startTimestamp */
-    public String getStartDateTime() {
-        return TimeUtil.getDateTimeString(this.startTimestamp);
-    }
-
-    /** Getter DateTime string from startTimestamp */
-    public String getEndDateTime() {
-        return TimeUtil.getDateTimeString(this.endTimestamp);
-    }
-
-    /** find TestRun entity by ID and test name */
-    public static TestRunEntity getByTestNameId(String testName, long id) {
-        com.googlecode.objectify.Key testKey =
-                com.googlecode.objectify.Key.create(TestEntity.class, testName);
-        return ofy().load().type(TestRunEntity.class).parent(testKey).id(id).now();
-    }
-
-    /** Get CodeCoverageEntity Key to generate Key by combining key info */
-    private com.googlecode.objectify.Key getCodeCoverageEntityKey() {
-        com.googlecode.objectify.Key testRunKey = this.getOfyKey();
-        return com.googlecode.objectify.Key.create(
-                        testRunKey, CodeCoverageEntity.class, this.startTimestamp);
-    }
-
-    /** Get ApiCoverageEntity Key from the parent key */
-    public com.googlecode.objectify.Key getOfyKey() {
-        com.googlecode.objectify.Key testKey =
-                com.googlecode.objectify.Key.create(
-                        TestEntity.class, this.testName);
-        com.googlecode.objectify.Key testRunKey =
-                com.googlecode.objectify.Key.create(
-                        testKey, TestRunEntity.class, this.startTimestamp);
-        return testRunKey;
-    }
-
-    /** Get ApiCoverageEntity from key info */
-    public Optional<List<ApiCoverageEntity>> getApiCoverageEntityList() {
-        com.googlecode.objectify.Key testRunKey = this.getOfyKey();
-        List<ApiCoverageEntity> apiCoverageEntityList =
-                ofy().load().type(ApiCoverageEntity.class).ancestor(testRunKey).list();
-        return Optional.ofNullable(apiCoverageEntityList);
-    }
-
-    /**
-     * Get CodeCoverageEntity instance from codeCoverageEntityKey value.
-     */
-    public CodeCoverageEntity getCodeCoverageEntity() {
-        if (this.hasCodeCoverage) {
-            CodeCoverageEntity codeCoverageEntity =
-                    ofy().load()
-                            .type(CodeCoverageEntity.class)
-                            .filterKey(this.codeCoverageEntityKey)
-                            .first()
-                            .now();
-            if (Objects.isNull(codeCoverageEntity)) {
-                codeCoverageEntity =
-                        new CodeCoverageEntity(
-                                this.getKey(), coveredLineCount, totalLineCount);
-                codeCoverageEntity.save();
-                return codeCoverageEntity;
-            } else {
-                return codeCoverageEntity;
-            }
-        } else {
-            logger.log(
-                    Level.WARNING,
-                    "The hasCodeCoverage value is false. Please check the code coverage entity key");
-            return null;
-        }
-    }
-
-    /**
-     * Convert an Entity object to a TestRunEntity.
-     *
-     * @param e The entity to process.
-     * @return TestRunEntity object with the properties from e processed, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestRunEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND)
-                || !e.hasProperty(TYPE)
-                || !e.hasProperty(START_TIMESTAMP)
-                || !e.hasProperty(END_TIMESTAMP)
-                || !e.hasProperty(TEST_BUILD_ID)
-                || !e.hasProperty(HOST_NAME)
-                || !e.hasProperty(PASS_COUNT)
-                || !e.hasProperty(FAIL_COUNT)) {
-            logger.log(Level.WARNING, "Missing test run attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            long type = (long) e.getProperty(TYPE);
-            long startTimestamp = (long) e.getProperty(START_TIMESTAMP);
-            long endTimestamp = (long) e.getProperty(END_TIMESTAMP);
-            String testBuildId = (String) e.getProperty(TEST_BUILD_ID);
-            String hostName = (String) e.getProperty(HOST_NAME);
-            long passCount = (long) e.getProperty(PASS_COUNT);
-            long failCount = (long) e.getProperty(FAIL_COUNT);
-            boolean hasCodeCoverage = false;
-            if (e.hasProperty(HAS_CODE_COVERAGE)) {
-                hasCodeCoverage = (boolean) e.getProperty(HAS_CODE_COVERAGE);
-            } else {
-                hasCodeCoverage = (boolean) e.getProperty(HAS_COVERAGE);
-            }
-            List<Long> testCaseIds = (List<Long>) e.getProperty(TEST_CASE_IDS);
-            if (Objects.isNull(testCaseIds)) {
-                testCaseIds = new ArrayList<>();
-            }
-            List<String> links = new ArrayList<>();
-            if (e.hasProperty(LOG_LINKS)) {
-                links = (List<String>) e.getProperty(LOG_LINKS);
-            }
-            return new TestRunEntity(
-                    e.getKey().getParent(),
-                    type,
-                    startTimestamp,
-                    endTimestamp,
-                    testBuildId,
-                    hostName,
-                    passCount,
-                    failCount,
-                    hasCodeCoverage,
-                    testCaseIds,
-                    links);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing test run entity.", exception);
-        }
-        return null;
-    }
-
-    /** Get JsonFormat logLinks */
-    public JsonElement getJsonLogLinks() {
-        List<String> logLinks = this.getLogLinks();
-        List<JsonElement> links = new ArrayList<>();
-        if (logLinks != null && logLinks.size() > 0) {
-            for (String rawUrl : logLinks) {
-                UrlUtil.LinkDisplay validatedLink = UrlUtil.processUrl(rawUrl);
-                if (validatedLink == null) {
-                    logger.log(Level.WARNING, "Invalid logging URL : " + rawUrl);
-                    continue;
-                }
-                String[] logInfo = new String[] {validatedLink.name, validatedLink.url};
-                links.add(new Gson().toJsonTree(logInfo));
-            }
-        }
-        return new Gson().toJsonTree(links);
-    }
-
-    public JsonObject toJson() {
-        Map<String, TestCoverageStatusEntity> testCoverageStatusMap = TestCoverageStatusEntity
-                .getTestCoverageStatusMap();
-
-        JsonObject json = new JsonObject();
-        json.add(TEST_NAME, new JsonPrimitive(this.testName));
-        json.add(TEST_BUILD_ID, new JsonPrimitive(this.testBuildId));
-        json.add(HOST_NAME, new JsonPrimitive(this.hostName));
-        json.add(PASS_COUNT, new JsonPrimitive(this.passCount));
-        json.add(FAIL_COUNT, new JsonPrimitive(this.failCount));
-        json.add(START_TIMESTAMP, new JsonPrimitive(this.startTimestamp));
-        json.add(END_TIMESTAMP, new JsonPrimitive(this.endTimestamp));
-
-        // Overwrite the coverage value with newly update value from user decision
-        if (this.hasCodeCoverage) {
-            CodeCoverageEntity codeCoverageEntity = this.getCodeCoverageEntity();
-            if (testCoverageStatusMap.containsKey(this.testName)) {
-                TestCoverageStatusEntity testCoverageStatusEntity =
-                        testCoverageStatusMap.get(this.testName);
-
-                if (testCoverageStatusEntity.getUpdatedCoveredLineCount() > 0) {
-                    codeCoverageEntity.setCoveredLineCount(
-                            testCoverageStatusEntity.getUpdatedCoveredLineCount());
-                }
-                if (testCoverageStatusEntity.getUpdatedTotalLineCount() > 0) {
-                    codeCoverageEntity.setTotalLineCount(
-                            testCoverageStatusEntity.getUpdatedTotalLineCount());
-                }
-            }
-
-            long totalLineCount = codeCoverageEntity.getTotalLineCount();
-            long coveredLineCount = codeCoverageEntity.getCoveredLineCount();
-            if (totalLineCount > 0 && coveredLineCount >= 0) {
-                json.add(CodeCoverageEntity.COVERED_LINE_COUNT, new JsonPrimitive(coveredLineCount));
-                json.add(CodeCoverageEntity.TOTAL_LINE_COUNT, new JsonPrimitive(totalLineCount));
-            }
-        }
-
-        Optional<List<ApiCoverageEntity>> apiCoverageEntityOptionList =
-                this.getApiCoverageEntityList();
-        if (apiCoverageEntityOptionList.isPresent()) {
-            List<ApiCoverageEntity> apiCoverageEntityList = apiCoverageEntityOptionList.get();
-            Supplier<Stream<ApiCoverageEntity>> apiCoverageStreamSupplier =
-                    () -> apiCoverageEntityList.stream();
-            int totalHalApi =
-                    apiCoverageStreamSupplier.get().mapToInt(data -> data.getHalApi().size()).sum();
-            if (totalHalApi > 0) {
-                int coveredHalApi =
-                        apiCoverageStreamSupplier
-                                .get()
-                                .mapToInt(data -> data.getCoveredHalApi().size())
-                                .sum();
-                JsonArray apiCoverageKeyArray =
-                        apiCoverageStreamSupplier
-                                .get()
-                                .map(data -> new JsonPrimitive(data.getUrlSafeKey()))
-                                .collect(JsonArray::new, JsonArray::add, JsonArray::addAll);
-
-                json.add(API_COVERAGE_KEY_LIST, apiCoverageKeyArray);
-                json.add(COVERED_API_COUNT, new JsonPrimitive(coveredHalApi));
-                json.add(TOTAL_API_COUNT, new JsonPrimitive(totalHalApi));
-            }
-        }
-
-        List<String> logLinks = this.getLogLinks();
-        if (logLinks != null && logLinks.size() > 0) {
-            List<JsonElement> links = new ArrayList<>();
-            for (String rawUrl : logLinks) {
-                LinkDisplay validatedLink = UrlUtil.processUrl(rawUrl);
-                if (validatedLink == null) {
-                    logger.log(Level.WARNING, "Invalid logging URL : " + rawUrl);
-                    continue;
-                }
-                String[] logInfo = new String[] {validatedLink.name, validatedLink.url};
-                links.add(new Gson().toJsonTree(logInfo));
-            }
-            if (links.size() > 0) {
-                json.add(this.LOG_LINKS, new Gson().toJsonTree(links));
-            }
-        }
-        return json;
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/TestStatusEntity.java b/src/main/java/com/android/vts/entity/TestStatusEntity.java
deleted file mode 100644
index b703c64..0000000
--- a/src/main/java/com/android/vts/entity/TestStatusEntity.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.entity.TestCaseRunEntity.TestCase;
-import com.google.appengine.api.datastore.Entity;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@com.googlecode.objectify.annotation.Entity(name = "TestStatus")
-@Cache
-@Data
-@NoArgsConstructor
-/** Entity describing test status. */
-public class TestStatusEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(TestStatusEntity.class.getName());
-
-    public static final String KIND = "TestStatus";
-
-    // Property keys
-    public static final String PASS_COUNT = "passCount";
-    public static final String FAIL_COUNT = "failCount";
-    public static final String UPDATED_TIMESTAMP = "updatedTimestamp";
-
-    protected static final String FAILING_IDS = "failingTestcaseIds";
-    protected static final String FAILING_OFFSETS = "failingTestcaseOffsets";
-
-    /** ID field */
-    @Id private String testName;
-
-    /** Failing Testcase ID List field */
-    private List<Long> failingTestcaseIds;
-
-    /** Failing Testcase Offsets List field */
-    private List<Integer> failingTestcaseOffsets;
-
-    /** pass count field */
-    @Index private int passCount;
-
-    /** fail count field */
-    @Index private int failCount;
-
-    /** updated timestamp field */
-    @Index private long updatedTimestamp;
-
-    @Ignore private List<TestCaseReference> failingTestCases;
-
-    /** Object representing a reference to a test case. */
-    public static class TestCaseReference {
-        public final long parentId;
-        public final int offset;
-
-        /**
-         * Create a test case reference.
-         *
-         * @param parentId The ID of the TestCaseRunEntity containing the test case.
-         * @param offset The offset of the test case into the TestCaseRunEntity.
-         */
-        public TestCaseReference(long parentId, int offset) {
-            this.parentId = parentId;
-            this.offset = offset;
-        }
-
-        /**
-         * Create a test case reference.
-         *
-         * @param testCase The TestCase to reference.
-         */
-        public TestCaseReference(TestCase testCase) {
-            this(testCase.parentId, testCase.offset);
-        }
-    }
-
-    /**
-     * Create a TestEntity object with status metadata.
-     *
-     * @param testName The name of the test.
-     * @param timestamp The timestamp indicating the most recent test run event in the test state.
-     * @param passCount The number of tests passing up to the timestamp specified.
-     * @param failCount The number of tests failing up to the timestamp specified.
-     * @param failingTestCases The TestCaseReferences of the last observed failing test cases.
-     */
-    public TestStatusEntity(
-        String testName,
-        long timestamp,
-        int passCount,
-        int failCount,
-        List<TestCaseReference> failingTestCases) {
-        this.testName = testName;
-        this.updatedTimestamp = timestamp;
-        this.passCount = passCount;
-        this.failCount = failCount;
-        this.failingTestCases = failingTestCases;
-    }
-
-    /**
-     * Create a TestEntity object without metadata.
-     *
-     * @param testName The name of the test.
-     */
-    public TestStatusEntity(String testName) {
-        this(testName, 0, -1, -1, new ArrayList<TestCaseReference>());
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<TestStatusEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    public Entity toEntity() {
-        Entity testEntity = new Entity(KIND, this.testName);
-        if (this.updatedTimestamp >= 0 && this.passCount >= 0 && this.failCount >= 0) {
-            testEntity.setProperty(UPDATED_TIMESTAMP, this.updatedTimestamp);
-            testEntity.setProperty(PASS_COUNT, this.passCount);
-            testEntity.setProperty(FAIL_COUNT, this.failCount);
-            if (this.failingTestCases.size() > 0) {
-                List<Long> failingTestcaseIds = new ArrayList<>();
-                List<Integer> failingTestcaseOffsets = new ArrayList<>();
-                for (TestCaseReference testCase : this.failingTestCases) {
-                    failingTestcaseIds.add(testCase.parentId);
-                    failingTestcaseOffsets.add(testCase.offset);
-                }
-                testEntity.setUnindexedProperty(FAILING_IDS, failingTestcaseIds);
-                testEntity.setUnindexedProperty(FAILING_OFFSETS, failingTestcaseOffsets);
-            }
-        }
-        return testEntity;
-    }
-
-    /**
-     * Convert an Entity object to a TestEntity.
-     *
-     * @param e The entity to process.
-     * @return TestEntity object with the properties from e processed, or null if incompatible.
-     */
-    @SuppressWarnings("unchecked")
-    public static TestStatusEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || e.getKey().getName() == null) {
-            logger.log(Level.WARNING, "Missing test attributes in entity: " + e.toString());
-            return null;
-        }
-        String testName = e.getKey().getName();
-        long timestamp = 0;
-        int passCount = -1;
-        int failCount = -1;
-        List<TestCaseReference> failingTestCases = new ArrayList<>();
-        try {
-            if (e.hasProperty(UPDATED_TIMESTAMP)) {
-                timestamp = (long) e.getProperty(UPDATED_TIMESTAMP);
-            }
-            if (e.hasProperty(PASS_COUNT)) {
-                passCount = ((Long) e.getProperty(PASS_COUNT)).intValue();
-            }
-            if (e.hasProperty(FAIL_COUNT)) {
-                failCount = ((Long) e.getProperty(FAIL_COUNT)).intValue();
-            }
-            if (e.hasProperty(FAILING_IDS) && e.hasProperty(FAILING_OFFSETS)) {
-                List<Long> ids = (List<Long>) e.getProperty(FAILING_IDS);
-                List<Long> offsets = (List<Long>) e.getProperty(FAILING_OFFSETS);
-                if (ids.size() == offsets.size()) {
-                    for (int i = 0; i < ids.size(); i++) {
-                        failingTestCases.add(
-                            new TestCaseReference(ids.get(i), offsets.get(i).intValue()));
-                    }
-                }
-            }
-        } catch (ClassCastException exception) {
-            // Invalid contents or null values
-            logger.log(Level.WARNING, "Error parsing test entity.", exception);
-        }
-        return new TestStatusEntity(testName, timestamp, passCount, failCount, failingTestCases);
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/TestSuiteFileEntity.java b/src/main/java/com/android/vts/entity/TestSuiteFileEntity.java
deleted file mode 100644
index c68f2ec..0000000
--- a/src/main/java/com/android/vts/entity/TestSuiteFileEntity.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import com.googlecode.objectify.Key;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Index;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Date;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Entity Class for Suite Test File Info */
-@Cache
-@Entity
-@EqualsAndHashCode(of = "id")
-@NoArgsConstructor
-public class TestSuiteFileEntity implements DashboardEntity {
-
-    /** Test Suite full file path field */
-    @Id @Getter @Setter String filePath;
-
-    /** Test Suite year field in the filePath  */
-    @Index @Getter @Setter int year;
-
-    /** Test Suite month field in the filePath  */
-    @Index @Getter @Setter int month;
-
-    /** Test Suite day field in the filePath */
-    @Index @Getter @Setter int day;
-
-    /** Test Suite file name field */
-    @Index @Getter @Setter String fileName;
-
-    /** When this record was created or updated */
-    @Index @Getter Date updated;
-
-    /** Construction function for TestSuiteResultEntity Class */
-    public TestSuiteFileEntity(String filePath) {
-        this.filePath = filePath;
-        Path pathInfo = Paths.get(filePath);
-        if (pathInfo.getNameCount() > 3) {
-            this.year = Integer.valueOf(pathInfo.getName(1).toString());
-            this.month = Integer.valueOf(pathInfo.getName(2).toString());
-            this.day = Integer.valueOf(pathInfo.getName(3).toString());
-            this.fileName = pathInfo.getFileName().toString();
-        }
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public Key<TestSuiteFileEntity> save() {
-        this.updated = new Date();
-        return ofy().save().entity(this).now();
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java b/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java
deleted file mode 100644
index 95ba5c8..0000000
--- a/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java
+++ /dev/null
@@ -1,555 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import com.google.common.base.Strings;
-import com.googlecode.objectify.Key;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Ignore;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.Parent;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.text.StrSubstitutor;
-import org.apache.http.NameValuePair;
-import org.apache.http.ParseException;
-import org.apache.http.client.utils.URIUtils;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.apache.http.message.BasicNameValuePair;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Embeded TestType Class for determining testType and search function */
-@Index
-@NoArgsConstructor
-class TestTypeIndex {
-
-    /** Embeded TOT field, search field name "testTypeIndex.TOT" */
-    private Boolean TOT;
-
-    /** Embeded OTA field, search field name "testTypeIndex.OTA" */
-    private Boolean OTA;
-
-    /** Embeded SIGNED field, search field name "testTypeIndex.SIGNED" */
-    private Boolean SIGNED;
-
-    /** Maximum bit size */
-    @Ignore private int bitSize = 6;
-
-    @Ignore
-    private List<Integer> totTypeList = this.getTypeList(TestSuiteResultEntity.TestType.TOT.value);
-
-    @Ignore
-    private List<Integer> otaTypeList = this.getTypeList(TestSuiteResultEntity.TestType.OTA.value);
-
-    @Ignore
-    private List<Integer> signedTypeList =
-            this.getTypeList(TestSuiteResultEntity.TestType.SIGNED.value);
-
-    /** Retrieving the list of integers for each category type */
-    private List<Integer> getTypeList(int typeNum) {
-        return IntStream.range(0, (1 << (bitSize - 1)))
-                .filter(i -> (i & typeNum) > 0)
-                .boxed()
-                .collect(Collectors.toList());
-    }
-
-    public TestTypeIndex(int testType) {
-        if (totTypeList.contains(testType)) {
-            this.TOT = true;
-        } else {
-            this.TOT = false;
-        }
-
-        if (otaTypeList.contains(testType)) {
-            this.OTA = true;
-        } else {
-            this.OTA = false;
-        }
-
-        if (signedTypeList.contains(testType)) {
-            this.SIGNED = true;
-        } else {
-            this.SIGNED = false;
-        }
-    }
-}
-
-/** Entity Class for saving Test Log Summary */
-@Cache
-@Entity
-@EqualsAndHashCode(of = "id")
-@NoArgsConstructor
-public class TestSuiteResultEntity implements DashboardEntity {
-
-    private static final Logger logger = Logger.getLogger(TestSuiteResultEntity.class.getName());
-
-    /** Bug Tracking System Property class */
-    private static Properties bugTrackingSystemProp = new Properties();
-
-    /** System Configuration Property class */
-    private static Properties systemConfigProp = new Properties();
-
-    public enum TestType {
-        UNKNOWN(0),
-        TOT(1),
-        OTA(1 << 1),
-        SIGNED(1 << 2),
-        PRESUBMIT(1 << 3),
-        MANUAL(1 << 5);
-
-        public int value;
-
-        TestType(int value) {
-            this.value = value;
-        }
-
-        public int value() {
-            return value;
-        }
-    }
-
-    @Parent @Getter Key<TestSuiteFileEntity> testSuiteFileEntityKey;
-
-    /** Test Suite start time field */
-    @Id @Getter @Setter Long startTime;
-
-    /** Test Suite end time field */
-    @Getter @Setter Long endTime;
-
-    /** Test Suite test type field */
-    @Getter @Setter int testType;
-
-    /** Embeded test type field */
-    @Index @Getter @Setter TestTypeIndex testTypeIndex;
-
-    /** Test Suite bootup error field */
-    @Getter @Setter Boolean bootSuccess;
-
-    /** Test Suite result path field */
-    @Getter @Setter String resultPath;
-
-    /** Test Suite infra log path field */
-    @Getter @Setter String infraLogPath;
-
-    /** Test Suite device name field */
-    @Index @Getter @Setter String deviceName;
-
-    /** Test Suite host name field */
-    @Index @Getter @Setter String hostName;
-
-    /** Test Suite plan field */
-    @Index @Getter @Setter String suitePlan;
-
-    /** Test Suite version field */
-    @Getter @Setter String suiteVersion;
-
-    /** Test Suite name field */
-    @Getter @Setter String suiteName;
-
-    /** Test Suite build number field */
-    @Getter @Setter String suiteBuildNumber;
-
-    /** Test Suite test finished module count field */
-    @Getter @Setter int modulesDone;
-
-    /** Test Suite total number of module field */
-    @Getter @Setter int modulesTotal;
-
-    /** Test Suite branch field */
-    @Index @Getter @Setter String branch;
-
-    /** Test Suite build target field */
-    @Index @Getter @Setter String target;
-
-    /** Test Suite build ID field */
-    @Index @Getter @Setter String buildId;
-
-    /** Test Suite system fingerprint field */
-    @Getter @Setter String buildSystemFingerprint;
-
-    /** Test Suite vendor fingerprint field */
-    @Getter @Setter String buildVendorFingerprint;
-
-    /** Test Suite test count for success field */
-    @Index @Getter @Setter int passedTestCaseCount;
-
-    /** Test Suite test count for failure field */
-    @Index @Getter @Setter int failedTestCaseCount;
-
-    /** Test Suite ratio of success to find candidate build */
-    @Index @Getter @Setter float passedTestCaseRatio;
-
-    /** When this record was created or updated */
-    @Index @Getter Date updated;
-
-    /** Construction function for TestSuiteResultEntity Class */
-    public TestSuiteResultEntity(
-            Key<TestSuiteFileEntity> testSuiteFileEntityKey,
-            Long startTime,
-            Long endTime,
-            int testType,
-            Boolean bootSuccess,
-            String resultPath,
-            String infraLogPath,
-            String hostName,
-            String suitePlan,
-            String suiteVersion,
-            String suiteName,
-            String suiteBuildNumber,
-            int modulesDone,
-            int modulesTotal,
-            String branch,
-            String target,
-            String buildId,
-            String buildSystemFingerprint,
-            String buildVendorFingerprint,
-            int passedTestCaseCount,
-            int failedTestCaseCount) {
-        this.testSuiteFileEntityKey = testSuiteFileEntityKey;
-        this.startTime = startTime;
-        this.endTime = endTime;
-        this.bootSuccess = bootSuccess;
-        this.resultPath = resultPath;
-        this.infraLogPath = infraLogPath;
-        this.hostName = hostName;
-        this.suitePlan = suitePlan;
-        this.suiteVersion = suiteVersion;
-        this.suiteName = suiteName;
-        this.suiteBuildNumber = suiteBuildNumber;
-        this.modulesDone = modulesDone;
-        this.modulesTotal = modulesTotal;
-        this.branch = branch;
-        this.target = target;
-        this.buildId = buildId;
-        this.buildSystemFingerprint = buildSystemFingerprint;
-        this.buildVendorFingerprint = buildVendorFingerprint;
-        this.passedTestCaseCount = passedTestCaseCount;
-        this.failedTestCaseCount = failedTestCaseCount;
-
-        BigDecimal totalTestCaseCount = new BigDecimal(passedTestCaseCount + failedTestCaseCount);
-        if (totalTestCaseCount.intValue() <= 0) {
-            this.passedTestCaseRatio = 0;
-        } else {
-            BigDecimal passedTestCaseCountDecimal = new BigDecimal(passedTestCaseCount);
-            BigDecimal result =
-                    passedTestCaseCountDecimal.divide(
-                            totalTestCaseCount, 10, BigDecimal.ROUND_FLOOR);
-            this.passedTestCaseRatio = result.floatValue() * 100;
-        }
-
-        if (!this.buildVendorFingerprint.isEmpty()) {
-            this.deviceName = this.getDeviceNameFromVendorFpt();
-        }
-
-        this.testType = this.getSuiteResultTestType(testType);
-        this.testTypeIndex = new TestTypeIndex(this.testType);
-    }
-
-    /** Saving function for the instance of this class */
-    public void save(TestSuiteFileEntity newTestSuiteFileEntity) {
-        List<String> checkList =
-                Arrays.asList(
-                        this.hostName,
-                        this.suitePlan,
-                        this.suiteName,
-                        this.suiteBuildNumber,
-                        this.branch,
-                        this.target,
-                        this.buildId);
-        boolean isAllTrue = checkList.stream().allMatch(val -> Strings.isNullOrEmpty(val));
-
-        if (isAllTrue) {
-            logger.log(Level.WARNING, "There is null or empty string among required fields!");
-        } else {
-            this.updated = new Date();
-            ofy().transact(() -> {
-                newTestSuiteFileEntity.save();
-                ofy().save().entity(this).now();
-            });
-        }
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public Key<TestSuiteResultEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    public static void setPropertyValues(Properties newSystemConfigProp) {
-        systemConfigProp = newSystemConfigProp;
-        bugTrackingSystemProp = getBugTrackingSystemProp(newSystemConfigProp);
-    }
-
-    private static Properties getBugTrackingSystemProp(Properties newSystemConfigProp) {
-        Properties newBugTrackingSystemProp = new Properties();
-        try {
-            String bugTrackingSystem = newSystemConfigProp.getProperty("bug.tracking.system");
-
-            if (!bugTrackingSystem.isEmpty()) {
-                InputStream btsInputStream =
-                        TestSuiteResultEntity.class
-                                .getClassLoader()
-                                .getResourceAsStream(
-                                        "bug_tracking_system/"
-                                                + bugTrackingSystem
-                                                + "/config.properties");
-                newBugTrackingSystemProp.load(btsInputStream);
-            }
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            return newBugTrackingSystemProp;
-        }
-    }
-
-    public static List<TestSuiteResultEntity> getTestSuitePlans() {
-        return ofy().load()
-                .type(TestSuiteResultEntity.class)
-                .project("suitePlan")
-                .distinct(true)
-                .list();
-    }
-
-    public static List<TestSuiteResultEntity> getBranchDistinctList() {
-        return ofy().load()
-                .type(TestSuiteResultEntity.class)
-                .project("branch")
-                .distinct(true)
-                .list();
-    }
-
-    public static List<TestSuiteResultEntity> getBuildIdDistinctList() {
-        return ofy().load()
-                .type(TestSuiteResultEntity.class)
-                .project("buildId")
-                .distinct(true)
-                .list();
-    }
-
-    public static List<TestSuiteResultEntity> getTargetDistinctList() {
-        return ofy().load()
-                .type(TestSuiteResultEntity.class)
-                .project("target")
-                .distinct(true)
-                .list();
-    }
-
-    public static List<TestSuiteResultEntity> getHostNameDistinctList() {
-        return ofy().load()
-                .type(TestSuiteResultEntity.class)
-                .project("hostName")
-                .distinct(true)
-                .list();
-    }
-
-    public String getDeviceNameFromVendorFpt() {
-        String deviceName =
-                Stream.of(this.buildVendorFingerprint.split("/")).skip(1).findFirst().orElse("");
-        return deviceName;
-    }
-
-    public String getScreenResultLogPath() {
-        String gcsBucketName = systemConfigProp.getProperty("gcs.bucketName");
-        return resultPath.replace("gs://" + gcsBucketName + "/", "");
-    }
-
-    public String getScreenInfraLogPath() {
-        String gcsInfraLogBucketName = systemConfigProp.getProperty("gcs.infraLogBucketName");
-        return infraLogPath.replace("gs://" + gcsInfraLogBucketName + "/", "");
-    }
-
-    private String getNormalizedVersion(String fingerprint) {
-        Map<String, Pattern> partternMap =
-                new HashMap<String, Pattern>() {
-                    {
-                        put(
-                                "9",
-                                Pattern.compile(
-                                        "(:9(\\.\\d\\.\\d|\\.\\d|)|:P\\w*/)",
-                                        Pattern.CASE_INSENSITIVE));
-                        put(
-                                "8.1",
-                                Pattern.compile(
-                                        "(:8\\.1\\.\\d\\/|:O\\w+-MR1/)", Pattern.CASE_INSENSITIVE));
-                        put(
-                                "8",
-                                Pattern.compile(
-                                        "(:8\\.0\\.\\d\\/|:O\\w*/)", Pattern.CASE_INSENSITIVE));
-                    }
-                };
-
-        for (Map.Entry<String, Pattern> entry : partternMap.entrySet()) {
-            Matcher systemMatcher = entry.getValue().matcher(fingerprint);
-            if (systemMatcher.find()) {
-                return entry.getKey();
-            }
-        }
-        return "unknown-version";
-    }
-
-    public int getSuiteResultTestType(int testType) {
-        if (testType == TestType.UNKNOWN.value()) {
-            if (this.getNormalizedVersion(this.buildSystemFingerprint)
-                    != this.getNormalizedVersion(this.buildVendorFingerprint)) {
-                return TestType.OTA.value();
-            } else if (this.buildVendorFingerprint.endsWith("release-keys")) {
-                return TestType.SIGNED.value();
-            } else {
-                return TestType.TOT.value();
-            }
-        } else {
-            return testType;
-        }
-    }
-
-    private String getLabInfraIssueDescription() throws IOException {
-
-        String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system");
-
-        String templateName =
-                bugTrackingSystemProp.getProperty(
-                        bugTrackingSystem + ".labInfraIssue.template.name");
-
-        InputStream inputStream =
-                this.getClass()
-                        .getClassLoader()
-                        .getResourceAsStream(
-                                "bug_tracking_system/" + bugTrackingSystem + "/" + templateName);
-
-        String templateDescription = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name());
-
-        Map<String, String> valuesMap = new HashMap<>();
-        valuesMap.put("suiteBuildNumber", suiteBuildNumber);
-        valuesMap.put("buildId", buildId);
-        valuesMap.put("modulesDone", Integer.toString(modulesDone));
-        valuesMap.put("modulesTotal", Integer.toString(modulesTotal));
-        valuesMap.put("hostName", hostName);
-        valuesMap.put("resultPath", resultPath);
-        valuesMap.put("buildVendorFingerprint", buildVendorFingerprint);
-        valuesMap.put("buildSystemFingerprint", buildSystemFingerprint);
-
-        StrSubstitutor sub = new StrSubstitutor(valuesMap);
-        String resolvedDescription = sub.replace(templateDescription);
-
-        return resolvedDescription;
-    }
-
-    private String getCrashSecurityDescription() throws IOException {
-
-        String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system");
-
-        String templateName =
-                bugTrackingSystemProp.getProperty(
-                        bugTrackingSystem + ".crashSecurity.template.name");
-
-        InputStream inputStream =
-                this.getClass()
-                        .getClassLoader()
-                        .getResourceAsStream(
-                                "bug_tracking_system/" + bugTrackingSystem + "/" + templateName);
-
-        String templateDescription = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name());
-
-        Map<String, String> valuesMap = new HashMap<>();
-        valuesMap.put("suiteBuildNumber", suiteBuildNumber);
-        valuesMap.put("branch", branch);
-        valuesMap.put("target", target);
-        valuesMap.put("deviceName", deviceName);
-        valuesMap.put("buildId", buildId);
-        valuesMap.put("suiteName", suiteName);
-        valuesMap.put("suitePlan", suitePlan);
-        valuesMap.put("hostName", hostName);
-        valuesMap.put("resultPath", resultPath);
-
-        StrSubstitutor sub = new StrSubstitutor(valuesMap);
-        String resolvedDescription = sub.replace(templateDescription);
-
-        return resolvedDescription;
-    }
-
-    public String getBuganizerLink() throws IOException, ParseException, URISyntaxException {
-
-        String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system");
-
-        List<NameValuePair> qparams = new ArrayList<NameValuePair>();
-        if (!this.bootSuccess || (this.passedTestCaseCount == 0 && this.failedTestCaseCount == 0)) {
-            qparams.add(
-                    new BasicNameValuePair(
-                            "component",
-                            this.bugTrackingSystemProp.getProperty(
-                                    bugTrackingSystem + ".labInfraIssue.component.id")));
-            qparams.add(
-                    new BasicNameValuePair(
-                            "template",
-                            this.bugTrackingSystemProp.getProperty(
-                                    bugTrackingSystem + ".labInfraIssue.template.id")));
-            qparams.add(new BasicNameValuePair("description", this.getLabInfraIssueDescription()));
-        } else {
-            qparams.add(
-                    new BasicNameValuePair(
-                            "component",
-                            this.bugTrackingSystemProp.getProperty(
-                                    bugTrackingSystem + ".crashSecurity.component.id")));
-            qparams.add(
-                    new BasicNameValuePair(
-                            "template",
-                            this.bugTrackingSystemProp.getProperty(
-                                    bugTrackingSystem + ".crashSecurity.template.id")));
-            qparams.add(new BasicNameValuePair("description", this.getCrashSecurityDescription()));
-        }
-
-        URI uri =
-                URIUtils.createURI(
-                        this.bugTrackingSystemProp.getProperty(bugTrackingSystem + ".uri.scheme"),
-                        this.bugTrackingSystemProp.getProperty(bugTrackingSystem + ".uri.host"),
-                        -1,
-                        this.bugTrackingSystemProp.getProperty(bugTrackingSystem + ".uri.path"),
-                        URLEncodedUtils.format(qparams, StandardCharsets.UTF_8.name()),
-                        null);
-        return uri.toString();
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/UserEntity.java b/src/main/java/com/android/vts/entity/UserEntity.java
deleted file mode 100644
index 43b5edd..0000000
--- a/src/main/java/com/android/vts/entity/UserEntity.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import com.googlecode.objectify.Key;
-import com.googlecode.objectify.Ref;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Entity;
-import com.googlecode.objectify.annotation.Id;
-import com.googlecode.objectify.annotation.Index;
-import com.googlecode.objectify.annotation.Load;
-import java.util.ArrayList;
-import java.util.List;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import java.util.Date;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Entity Class for User */
-@Cache
-@Entity
-@EqualsAndHashCode(of = "email")
-@NoArgsConstructor
-public class UserEntity implements DashboardEntity {
-
-    /** User email field */
-    @Id @Getter @Setter String email;
-
-    /** User name field */
-    @Getter @Setter String name;
-
-    /** User name field */
-    @Getter @Setter String company;
-
-    /** User enable or disable field */
-    @Index @Getter @Setter Boolean enable;
-
-    /** User admin flag field */
-    @Index @Getter @Setter Boolean isAdmin;
-
-    /** When this record was created or updated */
-    @Index @Getter Date updated;
-
-    @Load
-    @Getter
-    List<Ref<RoleEntity>> roles = new ArrayList<>();
-
-    /** Constructor function for UserEntity Class */
-    public UserEntity(
-            String email,
-            String name,
-            String company,
-            String roleName) {
-
-        this.email = email;
-        this.name = name;
-        this.enable = true;
-        this.isAdmin = false;
-        this.company = company;
-        RoleEntity roleEntity = RoleEntity.getRole(roleName);
-        this.roles.add(Ref.create(roleEntity));
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public Key<UserEntity> save() {
-        this.updated = new Date();
-        return ofy().save().entity(this).now();
-    }
-
-    /** Get admin user list by admin email */
-    public static UserEntity getAdminUser(String adminEmail) {
-        Key key = Key.create(UserEntity.class, adminEmail);
-        return ofy().load()
-            .type(UserEntity.class)
-            .filterKey(key)
-            .filter("enable", true)
-            .filter("isAdmin", true)
-            .first()
-            .now();
-    }
-
-    /** Get all admin user list */
-    public static List<UserEntity> getAdminUserList() {
-        return ofy().load()
-            .type(UserEntity.class)
-            .filter("enable", true)
-            .filter("isAdmin", true)
-            .list();
-    }
-
-    /** Get normal user list */
-    public static List<UserEntity> getUserList() {
-        return ofy().load()
-            .type(UserEntity.class)
-            .filter("enable", true)
-            .filter("isAdmin", false)
-            .list();
-    }
-
-    /** Get user by email */
-    public static UserEntity getUser(String email) {
-        Key key = Key.create(UserEntity.class, email);
-        return ofy().load()
-            .type(UserEntity.class)
-            .filterKey(key)
-            .filter("enable", true)
-            .first()
-            .now();
-    }
-}
diff --git a/src/main/java/com/android/vts/entity/UserFavoriteEntity.java b/src/main/java/com/android/vts/entity/UserFavoriteEntity.java
deleted file mode 100644
index 2548042..0000000
--- a/src/main/java/com/android/vts/entity/UserFavoriteEntity.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.entity;
-
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.users.User;
-import com.googlecode.objectify.annotation.Cache;
-import com.googlecode.objectify.annotation.Ignore;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-@Cache
-@com.googlecode.objectify.annotation.Entity(name = "UserFavorite")
-@EqualsAndHashCode(of = "email")
-@NoArgsConstructor
-/** Entity describing subscriptions between a user and a test. */
-public class UserFavoriteEntity implements DashboardEntity {
-    protected static final Logger logger = Logger.getLogger(UserFavoriteEntity.class.getName());
-
-    public static final String KIND = "UserFavorite";
-
-    // Property keys
-    public static final String USER = "user";
-    public static final String TEST_KEY = "testKey";
-    public static final String MUTE_NOTIFICATIONS = "muteNotifications";
-
-    @Ignore private Key key = null;
-
-    @Ignore public User user = null;
-
-    @Ignore public Key testKey = null;
-
-    @Getter @Setter private com.googlecode.objectify.Key<TestEntity> test;
-
-    @Getter @Setter private String userEmail;
-
-    @Getter @Setter public boolean muteNotifications;
-
-    /**
-     * Create a user favorite relationship.
-     *
-     * @param key The key of the entity in the database.
-     * @param user The User object for the subscribing user.
-     * @param testKey The key of the TestEntity object describing the test.
-     * @param muteNotifications True if the subscriber has muted notifications, false otherwise.
-     */
-    private UserFavoriteEntity(Key key, User user, Key testKey, boolean muteNotifications) {
-        this.key = key;
-        this.user = user;
-        this.testKey = testKey;
-        this.muteNotifications = muteNotifications;
-    }
-
-    /**
-     * Create a user favorite relationship.
-     *
-     * @param user The User object for the subscribing user.
-     * @param testKey The key of the TestEntity object describing the test.
-     * @param muteNotifications True if the subscriber has muted notifications, false otherwise.
-     */
-    public UserFavoriteEntity(User user, Key testKey, boolean muteNotifications) {
-        this(null, user, testKey, muteNotifications);
-    }
-
-    /** Saving function for the instance of this class */
-    @Override
-    public com.googlecode.objectify.Key<UserFavoriteEntity> save() {
-        return ofy().save().entity(this).now();
-    }
-
-    public Entity toEntity() {
-        Entity favoriteEntity;
-        if (this.key != null) {
-            favoriteEntity = new Entity(key);
-        } else {
-            favoriteEntity = new Entity(KIND);
-        }
-        favoriteEntity.setProperty(USER, this.user);
-        favoriteEntity.setProperty(TEST_KEY, this.testKey);
-        favoriteEntity.setProperty(MUTE_NOTIFICATIONS, this.muteNotifications);
-        return favoriteEntity;
-    }
-
-    /**
-     * Convert an Entity object to a UserFavoriteEntity.
-     *
-     * @param e The entity to process.
-     * @return UserFavoriteEntity object with the properties from e, or null if incompatible.
-     */
-    public static UserFavoriteEntity fromEntity(Entity e) {
-        if (!e.getKind().equals(KIND) || !e.hasProperty(USER) || !e.hasProperty(TEST_KEY)) {
-            logger.log(
-                    Level.WARNING, "Missing user favorite attributes in entity: " + e.toString());
-            return null;
-        }
-        try {
-            User user = (User) e.getProperty(USER);
-            Key testKey = (Key) e.getProperty(TEST_KEY);
-            boolean muteNotifications = false;
-            if (e.hasProperty(MUTE_NOTIFICATIONS)) {
-                muteNotifications = (boolean) e.getProperty(MUTE_NOTIFICATIONS);
-            }
-            return new UserFavoriteEntity(e.getKey(), user, testKey, muteNotifications);
-        } catch (ClassCastException exception) {
-            // Invalid cast
-            logger.log(Level.WARNING, "Error parsing user favorite entity.", exception);
-        }
-        return null;
-    }
-}
diff --git a/src/main/java/com/android/vts/job/BaseJobServlet.java b/src/main/java/com/android/vts/job/BaseJobServlet.java
deleted file mode 100644
index 18a1d24..0000000
--- a/src/main/java/com/android/vts/job/BaseJobServlet.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.job;
-
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import java.util.Properties;
-
-/**
- * An abstract class to be subclassed to create Job Servlet
- */
-public abstract class BaseJobServlet extends HttpServlet {
-
-    /**
-     * System Configuration Property class
-     */
-    protected static Properties systemConfigProp = new Properties();
-
-    /**
-     * This variable is for maximum number of entities per transaction You can find the detail here
-     * (https://cloud.google.com/datastore/docs/concepts/limits)
-     */
-    protected int MAX_ENTITY_SIZE_PER_TRANSACTION = 300;
-
-    @Override
-    public void init(ServletConfig cfg) throws ServletException {
-        super.init(cfg);
-
-        systemConfigProp =
-                Properties.class.cast(cfg.getServletContext().getAttribute("systemConfigProp"));
-
-        this.MAX_ENTITY_SIZE_PER_TRANSACTION =
-                Integer.parseInt(systemConfigProp.getProperty("datastore.maxEntitySize"));
-    }
-}
diff --git a/src/main/java/com/android/vts/job/VtsAlertJobServlet.java b/src/main/java/com/android/vts/job/VtsAlertJobServlet.java
deleted file mode 100644
index be23982..0000000
--- a/src/main/java/com/android/vts/job/VtsAlertJobServlet.java
+++ /dev/null
@@ -1,582 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.job;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestAcknowledgmentEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestCaseRunEntity.TestCase;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.entity.TestStatusEntity;
-import com.android.vts.entity.TestStatusEntity.TestCaseReference;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.EmailHelper;
-import com.android.vts.util.FilterUtil;
-import com.android.vts.util.TimeUtil;
-import com.google.appengine.api.datastore.DatastoreFailureException;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.DatastoreTimeoutException;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.FetchOptions;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-import com.google.appengine.api.datastore.Transaction;
-import com.google.appengine.api.taskqueue.Queue;
-import com.google.appengine.api.taskqueue.QueueFactory;
-import com.google.appengine.api.taskqueue.TaskOptions;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.ConcurrentModificationException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
-
-/** Represents the notifications service which is automatically called on a fixed schedule. */
-public class VtsAlertJobServlet extends BaseJobServlet {
-    private static final String ALERT_JOB_URL = "/task/vts_alert_job";
-    protected static final Logger logger = Logger.getLogger(VtsAlertJobServlet.class.getName());
-    protected static final int MAX_RUN_COUNT = 1000; // maximum number of runs to query for
-
-    /**
-     * Process the current test case failures for a test.
-     *
-     * @param status The TestStatusEntity object for the test.
-     * @returns a map from test case name to the test case run ID for which the test case failed.
-     */
-    private static Map<String, TestCase> getCurrentFailures(TestStatusEntity status) {
-        if (status.getFailingTestCases() == null || status.getFailingTestCases().size() == 0) {
-            return new HashMap<>();
-        }
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Map<String, TestCase> failingTestcases = new HashMap<>();
-        Set<Key> gets = new HashSet<>();
-        for (TestCaseReference testCaseRef : status.getFailingTestCases()) {
-            gets.add(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseRef.parentId));
-        }
-        if (gets.size() == 0) {
-            return failingTestcases;
-        }
-        Map<Key, Entity> testCaseMap = datastore.get(gets);
-
-        for (TestCaseReference testCaseRef : status.getFailingTestCases()) {
-            Key key = KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseRef.parentId);
-            if (!testCaseMap.containsKey(key)) {
-                continue;
-            }
-            Entity testCaseRun = testCaseMap.get(key);
-            TestCaseRunEntity testCaseRunEntity = TestCaseRunEntity.fromEntity(testCaseRun);
-            if (testCaseRunEntity.testCases.size() <= testCaseRef.offset) {
-                continue;
-            }
-            TestCase testCase = testCaseRunEntity.testCases.get(testCaseRef.offset);
-            failingTestcases.put(testCase.name, testCase);
-        }
-        return failingTestcases;
-    }
-
-    /**
-     * Get the test acknowledgments for a test key.
-     *
-     * @param testKey The key to the test whose acknowledgments to fetch.
-     * @return A list of test acknowledgments.
-     */
-    private static List<TestAcknowledgmentEntity> getTestCaseAcknowledgments(Key testKey) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        List<TestAcknowledgmentEntity> acks = new ArrayList<>();
-        Filter testFilter =
-                new Query.FilterPredicate(
-                        TestAcknowledgmentEntity.TEST_KEY, Query.FilterOperator.EQUAL, testKey);
-        Query q = new Query(TestAcknowledgmentEntity.KIND).setFilter(testFilter);
-
-        for (Entity ackEntity : datastore.prepare(q).asIterable()) {
-            TestAcknowledgmentEntity ack = TestAcknowledgmentEntity.fromEntity(ackEntity);
-            if (ack == null) continue;
-            acks.add(ack);
-        }
-        return acks;
-    }
-
-    /**
-     * Get the test runs for the test in the specified time window.
-     *
-     * <p>If the start and end time delta is greater than one day, the query will be truncated.
-     *
-     * @param testKey The key to the test whose runs to query.
-     * @param startTime The start time for the query.
-     * @param endTime The end time for the query.
-     * @return A list of test runs in the specified time window.
-     */
-    private static List<TestRunEntity> getTestRuns(Key testKey, long startTime, long endTime) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Filter testTypeFilter = FilterUtil.getTestTypeFilter(false, true, false);
-        long delta = endTime - startTime;
-        delta = Math.min(delta, TimeUnit.DAYS.toMicros(1));
-        Filter runFilter =
-                FilterUtil.getTimeFilter(
-                        testKey, TestRunEntity.KIND, endTime - delta + 1, endTime, testTypeFilter);
-
-        Query q =
-                new Query(TestRunEntity.KIND)
-                        .setAncestor(testKey)
-                        .setFilter(runFilter)
-                        .addSort(Entity.KEY_RESERVED_PROPERTY, SortDirection.DESCENDING);
-
-        List<TestRunEntity> testRuns = new ArrayList<>();
-        for (Entity testRunEntity :
-                datastore.prepare(q).asIterable(FetchOptions.Builder.withLimit(MAX_RUN_COUNT))) {
-            TestRunEntity testRun = TestRunEntity.fromEntity(testRunEntity);
-            if (testRun == null) continue;
-            testRuns.add(testRun);
-        }
-        return testRuns;
-    }
-
-    /**
-     * Separate the test cases which are acknowledged by the provided acknowledgments.
-     *
-     * @param testCases The list of test case names.
-     * @param devices The list of devices for a test run.
-     * @param acks The list of acknowledgments for the test.
-     * @return A list of acknowledged test case names that have been removed from the input test
-     *     cases.
-     */
-    public static Set<String> separateAcknowledged(
-            Set<String> testCases,
-            List<DeviceInfoEntity> devices,
-            List<TestAcknowledgmentEntity> acks) {
-        Set<String> acknowledged = new HashSet<>();
-        for (TestAcknowledgmentEntity ack : acks) {
-            boolean allDevices = ack.getDevices() == null || ack.getDevices().size() == 0;
-            boolean allBranches = ack.getBranches() == null || ack.getBranches().size() == 0;
-            boolean isRelevant = allDevices && allBranches;
-
-            // Determine if the acknowledgment is relevant to the devices.
-            if (!isRelevant) {
-                for (DeviceInfoEntity device : devices) {
-                    boolean deviceAcknowledged =
-                            allDevices || ack.getDevices().contains(device.getBuildFlavor());
-                    boolean branchAcknowledged =
-                            allBranches || ack.getBranches().contains(device.getBranch());
-                    if (deviceAcknowledged && branchAcknowledged) isRelevant = true;
-                }
-            }
-
-            if (isRelevant) {
-                // Separate the test cases
-                boolean allTestCases =
-                        ack.getTestCaseNames() == null || ack.getTestCaseNames().size() == 0;
-                if (allTestCases) {
-                    acknowledged.addAll(testCases);
-                    testCases.removeAll(acknowledged);
-                } else {
-                    for (String testCase : ack.getTestCaseNames()) {
-                        if (testCases.contains(testCase)) {
-                            acknowledged.add(testCase);
-                            testCases.remove(testCase);
-                        }
-                    }
-                }
-            }
-        }
-        return acknowledged;
-    }
-
-    /**
-     * Checks whether any new failures have occurred beginning since (and including) startTime.
-     *
-     * @param testRuns The list of test runs for which to update the status.
-     * @param link The string URL linking to the test's status table.
-     * @param failedTestCaseMap The map of test case names to TestCase for those failing in the last
-     *     status update.
-     * @param emailAddresses The list of email addresses to send notifications to.
-     * @param messages The email Message queue.
-     * @returns latest TestStatusMessage or null if no update is available.
-     * @throws IOException
-     */
-    public TestStatusEntity getTestStatus(
-            List<TestRunEntity> testRuns,
-            String link,
-            Map<String, TestCase> failedTestCaseMap,
-            List<TestAcknowledgmentEntity> testAcks,
-            List<String> emailAddresses,
-            List<Message> messages)
-            throws IOException {
-        if (testRuns.size() == 0) return null;
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        TestRunEntity mostRecentRun = null;
-        Map<String, TestCaseResult> mostRecentTestCaseResults = new HashMap<>();
-        Map<String, TestCase> testCaseBreakageMap = new HashMap<>();
-        int passingTestcaseCount = 0;
-        List<TestCaseReference> failingTestCases = new ArrayList<>();
-        Set<String> fixedTestcases = new HashSet<>();
-        Set<String> newTestcaseFailures = new HashSet<>();
-        Set<String> continuedTestcaseFailures = new HashSet<>();
-        Set<String> skippedTestcaseFailures = new HashSet<>();
-        Set<String> transientTestcaseFailures = new HashSet<>();
-
-        for (TestRunEntity testRun : testRuns) {
-            if (mostRecentRun == null) {
-                mostRecentRun = testRun;
-            }
-            List<Key> testCaseKeys = new ArrayList<>();
-            for (long testCaseId : testRun.getTestCaseIds()) {
-                testCaseKeys.add(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseId));
-            }
-            Map<Key, Entity> entityMap = datastore.get(testCaseKeys);
-            for (Key testCaseKey : testCaseKeys) {
-                if (!entityMap.containsKey(testCaseKey)) {
-                    logger.log(Level.WARNING, "Test case entity missing: " + testCaseKey);
-                    continue;
-                }
-                Entity testCaseRun = entityMap.get(testCaseKey);
-                TestCaseRunEntity testCaseRunEntity = TestCaseRunEntity.fromEntity(testCaseRun);
-                if (testCaseRunEntity == null) {
-                    logger.log(Level.WARNING, "Invalid test case run: " + testCaseRun.getKey());
-                    continue;
-                }
-                for (TestCase testCase : testCaseRunEntity.testCases) {
-                    String testCaseName = testCase.name;
-                    TestCaseResult result = TestCaseResult.valueOf(testCase.result);
-
-                    if (mostRecentRun == testRun) {
-                        mostRecentTestCaseResults.put(testCaseName, result);
-                    } else {
-                        if (!mostRecentTestCaseResults.containsKey(testCaseName)) {
-                            // Deprecate notifications for tests that are not present on newer runs
-                            continue;
-                        }
-                        TestCaseResult mostRecentRes = mostRecentTestCaseResults.get(testCaseName);
-                        if (mostRecentRes == TestCaseResult.TEST_CASE_RESULT_SKIP) {
-                            mostRecentTestCaseResults.put(testCaseName, result);
-                        } else if (mostRecentRes == TestCaseResult.TEST_CASE_RESULT_PASS) {
-                            // Test is passing now, witnessed a transient failure
-                            if (result != TestCaseResult.TEST_CASE_RESULT_PASS
-                                    && result != TestCaseResult.TEST_CASE_RESULT_SKIP) {
-                                transientTestcaseFailures.add(testCaseName);
-                            }
-                        }
-                    }
-
-                    // Record test case breakages
-                    if (result != TestCaseResult.TEST_CASE_RESULT_PASS
-                            && result != TestCaseResult.TEST_CASE_RESULT_SKIP) {
-                        testCaseBreakageMap.put(testCaseName, testCase);
-                    }
-                }
-            }
-        }
-
-        Set<String> buildIdList = new HashSet<>();
-        List<DeviceInfoEntity> devices = new ArrayList<>();
-        Query deviceQuery = new Query(DeviceInfoEntity.KIND).setAncestor(mostRecentRun.getKey());
-        for (Entity device : datastore.prepare(deviceQuery).asIterable()) {
-            DeviceInfoEntity deviceEntity = DeviceInfoEntity.fromEntity(device);
-            if (deviceEntity == null) {
-                continue;
-            }
-            buildIdList.add(deviceEntity.getBuildId());
-            devices.add(deviceEntity);
-        }
-        String footer = EmailHelper.getEmailFooter(mostRecentRun, devices, link);
-        String buildId = StringUtils.join(buildIdList, ",");
-
-        for (String testCaseName : mostRecentTestCaseResults.keySet()) {
-            TestCaseResult mostRecentResult = mostRecentTestCaseResults.get(testCaseName);
-            boolean previouslyFailed = failedTestCaseMap.containsKey(testCaseName);
-            if (mostRecentResult == TestCaseResult.TEST_CASE_RESULT_SKIP) {
-                // persist previous status
-                if (previouslyFailed) {
-                    skippedTestcaseFailures.add(testCaseName);
-                    failingTestCases.add(
-                            new TestCaseReference(failedTestCaseMap.get(testCaseName)));
-                } else {
-                    ++passingTestcaseCount;
-                }
-            } else if (mostRecentResult == TestCaseResult.TEST_CASE_RESULT_PASS) {
-                ++passingTestcaseCount;
-                if (previouslyFailed && !transientTestcaseFailures.contains(testCaseName)) {
-                    fixedTestcases.add(testCaseName);
-                }
-            } else {
-                if (!previouslyFailed) {
-                    newTestcaseFailures.add(testCaseName);
-                    failingTestCases.add(
-                            new TestCaseReference(testCaseBreakageMap.get(testCaseName)));
-                } else {
-                    continuedTestcaseFailures.add(testCaseName);
-                    failingTestCases.add(
-                            new TestCaseReference(failedTestCaseMap.get(testCaseName)));
-                }
-            }
-        }
-
-        Set<String> acknowledgedFailures =
-                separateAcknowledged(newTestcaseFailures, devices, testAcks);
-        acknowledgedFailures.addAll(
-                separateAcknowledged(transientTestcaseFailures, devices, testAcks));
-        acknowledgedFailures.addAll(
-                separateAcknowledged(continuedTestcaseFailures, devices, testAcks));
-
-        String summary = new String();
-        if (newTestcaseFailures.size() + continuedTestcaseFailures.size() > 0) {
-            summary += "The following test cases failed in the latest test run:<br>";
-
-            // Add new test case failures to top of summary in bold font.
-            List<String> sortedNewTestcaseFailures = new ArrayList<>(newTestcaseFailures);
-            sortedNewTestcaseFailures.sort(Comparator.naturalOrder());
-            for (String testcaseName : sortedNewTestcaseFailures) {
-                summary += "- " + "<b>" + testcaseName + "</b><br>";
-            }
-
-            // Add continued test case failures to summary.
-            List<String> sortedContinuedTestcaseFailures =
-                    new ArrayList<>(continuedTestcaseFailures);
-            sortedContinuedTestcaseFailures.sort(Comparator.naturalOrder());
-            for (String testcaseName : sortedContinuedTestcaseFailures) {
-                summary += "- " + testcaseName + "<br>";
-            }
-        }
-        if (fixedTestcases.size() > 0) {
-            // Add fixed test cases to summary.
-            summary += "<br><br>The following test cases were fixed in the latest test run:<br>";
-            List<String> sortedFixedTestcases = new ArrayList<>(fixedTestcases);
-            sortedFixedTestcases.sort(Comparator.naturalOrder());
-            for (String testcaseName : sortedFixedTestcases) {
-                summary += "- <i>" + testcaseName + "</i><br>";
-            }
-        }
-        if (transientTestcaseFailures.size() > 0) {
-            // Add transient test case failures to summary.
-            summary += "<br><br>The following transient test case failures occured:<br>";
-            List<String> sortedTransientTestcaseFailures =
-                    new ArrayList<>(transientTestcaseFailures);
-            sortedTransientTestcaseFailures.sort(Comparator.naturalOrder());
-            for (String testcaseName : sortedTransientTestcaseFailures) {
-                summary += "- " + testcaseName + "<br>";
-            }
-        }
-        if (skippedTestcaseFailures.size() > 0) {
-            // Add skipped test case failures to summary.
-            summary += "<br><br>The following test cases have not been run since failing:<br>";
-            List<String> sortedSkippedTestcaseFailures = new ArrayList<>(skippedTestcaseFailures);
-            sortedSkippedTestcaseFailures.sort(Comparator.naturalOrder());
-            for (String testcaseName : sortedSkippedTestcaseFailures) {
-                summary += "- " + testcaseName + "<br>";
-            }
-        }
-        if (acknowledgedFailures.size() > 0) {
-            // Add acknowledged test case failures to summary.
-            List<String> sortedAcknowledgedFailures = new ArrayList<>(acknowledgedFailures);
-            sortedAcknowledgedFailures.sort(Comparator.naturalOrder());
-            if (acknowledgedFailures.size() > 0) {
-                summary +=
-                        "<br><br>The following acknowledged test case failures continued to fail:<br>";
-                for (String testcaseName : sortedAcknowledgedFailures) {
-                    summary += "- " + testcaseName + "<br>";
-                }
-            }
-        }
-
-        String testName = mostRecentRun.getKey().getParent().getName();
-        String uploadDateString = TimeUtil.getDateString(mostRecentRun.getStartTimestamp());
-        String subject = "VTS Test Alert: " + testName + " @ " + uploadDateString;
-        if (newTestcaseFailures.size() > 0) {
-            String body =
-                    "Hello,<br><br>New test case failure(s) in "
-                            + testName
-                            + " for device build ID(s): "
-                            + buildId
-                            + ".<br><br>"
-                            + summary
-                            + footer;
-            try {
-                messages.add(EmailHelper.composeEmail(emailAddresses, subject, body));
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                logger.log(Level.WARNING, "Error composing email : ", e);
-            }
-        } else if (continuedTestcaseFailures.size() > 0) {
-            String body =
-                    "Hello,<br><br>Continuous test case failure(s) in "
-                            + testName
-                            + " for device build ID(s): "
-                            + buildId
-                            + ".<br><br>"
-                            + summary
-                            + footer;
-            try {
-                messages.add(EmailHelper.composeEmail(emailAddresses, subject, body));
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                logger.log(Level.WARNING, "Error composing email : ", e);
-            }
-        } else if (transientTestcaseFailures.size() > 0) {
-            String body =
-                    "Hello,<br><br>Transient test case failure(s) in "
-                            + testName
-                            + " but tests all "
-                            + "are passing in the latest device build(s): "
-                            + buildId
-                            + ".<br><br>"
-                            + summary
-                            + footer;
-            try {
-                messages.add(EmailHelper.composeEmail(emailAddresses, subject, body));
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                logger.log(Level.WARNING, "Error composing email : ", e);
-            }
-        } else if (fixedTestcases.size() > 0) {
-            String body =
-                    "Hello,<br><br>All test cases passed in "
-                            + testName
-                            + " for device build ID(s): "
-                            + buildId
-                            + "!<br><br>"
-                            + summary
-                            + footer;
-            try {
-                messages.add(EmailHelper.composeEmail(emailAddresses, subject, body));
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                logger.log(Level.WARNING, "Error composing email : ", e);
-            }
-        }
-        return new TestStatusEntity(
-                testName,
-                mostRecentRun.getStartTimestamp(),
-                passingTestcaseCount,
-                failingTestCases.size(),
-                failingTestCases);
-    }
-
-    /**
-     * Add a task to process test run data
-     *
-     * @param testRunKey The key of the test run whose data process.
-     */
-    public static void addTask(Key testRunKey) {
-        Queue queue = QueueFactory.getDefaultQueue();
-        String keyString = KeyFactory.keyToString(testRunKey);
-        queue.add(
-                TaskOptions.Builder.withUrl(ALERT_JOB_URL)
-                        .param("runKey", keyString)
-                        .method(TaskOptions.Method.POST));
-    }
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        String runKeyString = request.getParameter("runKey");
-
-        Key testRunKey;
-        try {
-            testRunKey = KeyFactory.stringToKey(runKeyString);
-        } catch (IllegalArgumentException e) {
-            logger.log(Level.WARNING, "Invalid key specified: " + runKeyString);
-            return;
-        }
-        String testName = testRunKey.getParent().getName();
-
-        TestStatusEntity status = null;
-        Key statusKey = KeyFactory.createKey(TestStatusEntity.KIND, testName);
-        try {
-            status = TestStatusEntity.fromEntity(datastore.get(statusKey));
-        } catch (EntityNotFoundException e) {
-            // no existing status
-        }
-        if (status == null) {
-            status = new TestStatusEntity(testName);
-        }
-        if (status.getUpdatedTimestamp() >= testRunKey.getId()) {
-            // Another job has already updated the status first
-            return;
-        }
-        List<String> emails = EmailHelper.getSubscriberEmails(testRunKey.getParent());
-
-        StringBuffer fullUrl = request.getRequestURL();
-        String baseUrl = fullUrl.substring(0, fullUrl.indexOf(request.getRequestURI()));
-        String link =
-                baseUrl + "/show_tree?testName=" + testName + "&endTime=" + testRunKey.getId();
-
-        List<Message> messageQueue = new ArrayList<>();
-        Map<String, TestCase> failedTestcaseMap = getCurrentFailures(status);
-        List<TestAcknowledgmentEntity> testAcks =
-                getTestCaseAcknowledgments(testRunKey.getParent());
-        List<TestRunEntity> testRuns =
-                getTestRuns(
-                        testRunKey.getParent(), status.getUpdatedTimestamp(), testRunKey.getId());
-        if (testRuns.size() == 0) return;
-
-        TestStatusEntity newStatus =
-                getTestStatus(testRuns, link, failedTestcaseMap, testAcks, emails, messageQueue);
-        if (newStatus == null) {
-            // No changes to status
-            return;
-        }
-
-        int retries = 0;
-        while (true) {
-            Transaction txn = datastore.beginTransaction();
-            try {
-                try {
-                    status = TestStatusEntity.fromEntity(datastore.get(statusKey));
-                } catch (EntityNotFoundException e) {
-                    // no status left
-                }
-                if (status == null
-                        || status.getUpdatedTimestamp() >= newStatus.getUpdatedTimestamp()) {
-                    txn.rollback();
-                } else { // This update is most recent.
-                    datastore.put(newStatus.toEntity());
-                    txn.commit();
-                    EmailHelper.sendAll(messageQueue);
-                }
-                break;
-            } catch (ConcurrentModificationException
-                    | DatastoreFailureException
-                    | DatastoreTimeoutException e) {
-                logger.log(Level.WARNING, "Retrying alert job insert: " + statusKey);
-                if (retries++ >= DatastoreHelper.MAX_WRITE_RETRIES) {
-                    logger.log(Level.SEVERE, "Exceeded alert job retries: " + statusKey);
-                    throw e;
-                }
-            } finally {
-                if (txn.isActive()) {
-                    txn.rollback();
-                }
-            }
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/job/VtsCoverageAlertJobServlet.java b/src/main/java/com/android/vts/job/VtsCoverageAlertJobServlet.java
deleted file mode 100644
index b5453b7..0000000
--- a/src/main/java/com/android/vts/job/VtsCoverageAlertJobServlet.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.job;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.android.vts.entity.CodeCoverageEntity;
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestCoverageStatusEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.util.EmailHelper;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.taskqueue.Queue;
-import com.google.appengine.api.taskqueue.QueueFactory;
-import com.google.appengine.api.taskqueue.TaskOptions;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.math.RoundingMode;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Coverage notification job.
- */
-public class VtsCoverageAlertJobServlet extends BaseJobServlet {
-
-  private static final String COVERAGE_ALERT_URL = "/task/vts_coverage_job";
-  protected static final Logger logger =
-      Logger.getLogger(VtsCoverageAlertJobServlet.class.getName());
-  protected static final double CHANGE_ALERT_THRESHOLD = 0.05;
-  protected static final double GOOD_THRESHOLD = 0.7;
-  protected static final double BAD_THRESHOLD = 0.3;
-
-  protected static final DecimalFormat FORMATTER;
-
-  /** Initialize the decimal formatter. */
-  static {
-    FORMATTER = new DecimalFormat("#.#");
-    FORMATTER.setRoundingMode(RoundingMode.HALF_UP);
-  }
-
-  /**
-   * Gets a new coverage status and adds notification emails to the messages list.
-   *
-   * Send an email to notify subscribers in the event that a test goes up or down by more than 5%,
-   * becomes higher or lower than 70%, or becomes higher or lower than 30%.
-   *
-   * @param status The TestCoverageStatusEntity object for the test.
-   * @param testRunKey The key for TestRunEntity whose data to process and reflect in the state.
-   * @param link The string URL linking to the test's status table.
-   * @param emailAddresses The list of email addresses to send notifications to.
-   * @param messages The email Message queue.
-   * @returns TestCoverageStatusEntity or null if no update is available.
-   */
-  public static TestCoverageStatusEntity getTestCoverageStatus(
-      TestCoverageStatusEntity status,
-      Key testRunKey,
-      String link,
-      List<String> emailAddresses,
-      List<Message> messages)
-      throws IOException {
-    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-    String testName = status.getTestName();
-
-    double previousPct;
-    double coveragePct;
-    if (status == null || status.getTotalLineCount() <= 0 || status.getCoveredLineCount() < 0) {
-      previousPct = 0;
-    } else {
-      previousPct = ((double) status.getCoveredLineCount()) / status.getTotalLineCount();
-    }
-
-    Entity testRun;
-    try {
-      testRun = datastore.get(testRunKey);
-    } catch (EntityNotFoundException e) {
-      logger.log(Level.WARNING, "Test run not found: " + testRunKey);
-      return null;
-    }
-
-    TestRunEntity testRunEntity = TestRunEntity.fromEntity(testRun);
-        if (testRunEntity == null || !testRunEntity.getHasCodeCoverage()) {
-      return null;
-    }
-    CodeCoverageEntity codeCoverageEntity = testRunEntity.getCodeCoverageEntity();
-
-    if (codeCoverageEntity.getTotalLineCount() <= 0
-            || codeCoverageEntity.getCoveredLineCount() < 0) {
-        coveragePct = 0;
-    } else {
-        coveragePct =
-                ((double) codeCoverageEntity.getCoveredLineCount())
-                        / codeCoverageEntity.getTotalLineCount();
-    }
-
-    Set<String> buildIdList = new HashSet<>();
-    Query deviceQuery = new Query(DeviceInfoEntity.KIND).setAncestor(testRun.getKey());
-    List<DeviceInfoEntity> devices = new ArrayList<>();
-    for (Entity device : datastore.prepare(deviceQuery).asIterable()) {
-      DeviceInfoEntity deviceEntity = DeviceInfoEntity.fromEntity(device);
-      if (deviceEntity == null) {
-        continue;
-      }
-      devices.add(deviceEntity);
-      buildIdList.add(deviceEntity.getBuildId());
-    }
-    String deviceBuild = StringUtils.join(buildIdList, ", ");
-    String footer = EmailHelper.getEmailFooter(testRunEntity, devices, link);
-
-    String subject = null;
-    String body = null;
-    String subjectSuffix = " @ " + deviceBuild;
-    if (coveragePct >= GOOD_THRESHOLD && previousPct < GOOD_THRESHOLD) {
-      // Coverage entered the good zone
-      subject =
-          "Congratulations! "
-              + testName
-              + " has exceeded "
-              + FORMATTER.format(GOOD_THRESHOLD * 100)
-              + "% coverage"
-              + subjectSuffix;
-      body =
-          "Hello,<br><br>The "
-              + testName
-              + " has achieved "
-              + FORMATTER.format(coveragePct * 100)
-              + "% code coverage on device build ID(s): "
-              + deviceBuild
-              + "."
-              + footer;
-    } else if (coveragePct < GOOD_THRESHOLD && previousPct >= GOOD_THRESHOLD) {
-      // Coverage dropped out of the good zone
-      subject =
-          "Warning! "
-              + testName
-              + " has dropped below "
-              + FORMATTER.format(GOOD_THRESHOLD * 100)
-              + "% coverage"
-              + subjectSuffix;
-      ;
-      body =
-          "Hello,<br><br>The test "
-              + testName
-              + " has dropped to "
-              + FORMATTER.format(coveragePct * 100)
-              + "% code coverage on device build ID(s): "
-              + deviceBuild
-              + "."
-              + footer;
-    } else if (coveragePct <= BAD_THRESHOLD && previousPct > BAD_THRESHOLD) {
-      // Coverage entered into the bad zone
-      subject =
-          "Warning! "
-              + testName
-              + " has dropped below "
-              + FORMATTER.format(BAD_THRESHOLD * 100)
-              + "% coverage"
-              + subjectSuffix;
-      body =
-          "Hello,<br><br>The test "
-              + testName
-              + " has dropped to "
-              + FORMATTER.format(coveragePct * 100)
-              + "% code coverage on device build ID(s): "
-              + deviceBuild
-              + "."
-              + footer;
-    } else if (coveragePct > BAD_THRESHOLD && previousPct <= BAD_THRESHOLD) {
-      // Coverage emerged from the bad zone
-      subject =
-          "Congratulations! "
-              + testName
-              + " has exceeded "
-              + FORMATTER.format(BAD_THRESHOLD * 100)
-              + "% coverage"
-              + subjectSuffix;
-      body =
-          "Hello,<br><br>The test "
-              + testName
-              + " has achived "
-              + FORMATTER.format(coveragePct * 100)
-              + "% code coverage on device build ID(s): "
-              + deviceBuild
-              + "."
-              + footer;
-    } else if (coveragePct - previousPct < -CHANGE_ALERT_THRESHOLD) {
-      // Send a coverage drop alert
-      subject =
-          "Warning! "
-              + testName
-              + "'s code coverage has decreased by more than "
-              + FORMATTER.format(CHANGE_ALERT_THRESHOLD * 100)
-              + "%"
-              + subjectSuffix;
-      body =
-          "Hello,<br><br>The test "
-              + testName
-              + " has dropped from "
-              + FORMATTER.format(previousPct * 100)
-              + "% code coverage to "
-              + FORMATTER.format(coveragePct * 100)
-              + "% code coverage on device build ID(s): "
-              + deviceBuild
-              + "."
-              + footer;
-    } else if (coveragePct - previousPct > CHANGE_ALERT_THRESHOLD) {
-      // Send a coverage improvement alert
-      subject =
-          testName
-              + "'s code coverage has increased by more than "
-              + FORMATTER.format(CHANGE_ALERT_THRESHOLD * 100)
-              + "%"
-              + subjectSuffix;
-      body =
-          "Hello,<br><br>The test "
-              + testName
-              + " has increased from "
-              + FORMATTER.format(previousPct * 100)
-              + "% code coverage to "
-              + FORMATTER.format(coveragePct * 100)
-              + "% code coverage on device build ID(s): "
-              + deviceBuild
-              + "."
-              + footer;
-    }
-    if (subject != null && body != null) {
-      try {
-        messages.add(EmailHelper.composeEmail(emailAddresses, subject, body));
-      } catch (MessagingException | UnsupportedEncodingException e) {
-        logger.log(Level.WARNING, "Error composing email : ", e);
-      }
-    }
-        return new TestCoverageStatusEntity(
-                testName,
-                testRunEntity.getStartTimestamp(),
-                codeCoverageEntity.getCoveredLineCount(),
-                codeCoverageEntity.getTotalLineCount(),
-                devices.size() > 0 ? devices.get(0).getId() : 0);
-  }
-
-  /**
-   * Add a task to process coverage data
-   *
-   * @param testRunKey The key of the test run whose data process.
-   */
-  public static void addTask(Key testRunKey) {
-    Queue queue = QueueFactory.getDefaultQueue();
-    String keyString = KeyFactory.keyToString(testRunKey);
-    queue.add(
-        TaskOptions.Builder.withUrl(COVERAGE_ALERT_URL)
-            .param("runKey", keyString)
-            .method(TaskOptions.Method.POST));
-  }
-
-  @Override
-  public void doPost(HttpServletRequest request, HttpServletResponse response)
-      throws IOException {
-    String runKeyString = request.getParameter("runKey");
-
-    Key testRunKey;
-    try {
-      testRunKey = KeyFactory.stringToKey(runKeyString);
-    } catch (IllegalArgumentException e) {
-      logger.log(Level.WARNING, "Invalid key specified: " + runKeyString);
-      return;
-    }
-    String testName = testRunKey.getParent().getName();
-
-    TestCoverageStatusEntity status = ofy().load().type(TestCoverageStatusEntity.class).id(testName)
-        .now();
-    if (status == null) {
-            status = new TestCoverageStatusEntity(testName, 0, -1, -1, 0);
-    }
-
-    StringBuffer fullUrl = request.getRequestURL();
-    String baseUrl = fullUrl.substring(0, fullUrl.indexOf(request.getRequestURI()));
-    String link = baseUrl + "/show_tree?testName=" + testName;
-    TestCoverageStatusEntity newStatus;
-    List<Message> messageQueue = new ArrayList<>();
-    try {
-      List<String> emails = EmailHelper.getSubscriberEmails(testRunKey.getParent());
-      newStatus = getTestCoverageStatus(status, testRunKey, link, emails, messageQueue);
-    } catch (IOException e) {
-      logger.log(Level.SEVERE, e.toString());
-      return;
-    }
-
-    if (newStatus == null) {
-      return;
-    } else {
-      if (status == null || status.getUpdatedTimestamp() < newStatus.getUpdatedTimestamp()) {
-        newStatus.save();
-        EmailHelper.sendAll(messageQueue);
-      }
-    }
-  }
-}
diff --git a/src/main/java/com/android/vts/job/VtsInactivityJobServlet.java b/src/main/java/com/android/vts/job/VtsInactivityJobServlet.java
deleted file mode 100644
index 031cdbb..0000000
--- a/src/main/java/com/android/vts/job/VtsInactivityJobServlet.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.job;
-
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.entity.TestStatusEntity;
-import com.android.vts.util.EmailHelper;
-import com.android.vts.util.FilterUtil;
-import com.android.vts.util.TaskQueueHelper;
-import com.android.vts.util.TimeUtil;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.FetchOptions;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-import com.google.appengine.api.taskqueue.Queue;
-import com.google.appengine.api.taskqueue.QueueFactory;
-import com.google.appengine.api.taskqueue.TaskOptions;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Test inactivity notification job. */
-public class VtsInactivityJobServlet extends BaseJobServlet {
-    private static final String INACTIVITY_ALERT_URL = "/cron/vts_inactivity_job";
-    protected static final Logger logger =
-            Logger.getLogger(VtsInactivityJobServlet.class.getName());
-
-    /**
-     * Compose an email if the test is inactive.
-     *
-     * @param test The TestStatusEntity document storing the test status.
-     * @param lastRunTime The timestamp in microseconds of the last test run for this test.
-     * @param link Fully specified link to the test's status page.
-     * @param emails The list of email addresses to send the email.
-     * @param messages The message list in which to insert the inactivity notification email.
-     * @return True if the test is inactive, false otherwise.
-     */
-    private static boolean notifyIfInactive(
-            TestStatusEntity test,
-            long lastRunTime,
-            String link,
-            List<String> emails,
-            List<Message> messages) {
-        long now = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        long diff = now - lastRunTime;
-        // Send an email daily to notify that the test hasn't been running.
-        // After 7 full days have passed, notifications will no longer be sent (i.e. the
-        // test is assumed to be deprecated).
-        if (diff >= TimeUnit.DAYS.toMicros(1) && diff < TimeUnit.DAYS.toMicros(8)) {
-            String uploadTimeString = TimeUtil.getDateTimeZoneString(lastRunTime);
-            String subject = "Warning! Inactive test: " + test.getTestName();
-            String body =
-                    "Hello,<br><br>Test \""
-                            + test.getTestName()
-                            + "\" is inactive. "
-                            + "No new data has been uploaded since "
-                            + uploadTimeString
-                            + "."
-                            + EmailHelper.getEmailFooter(null, null, link);
-            try {
-                messages.add(EmailHelper.composeEmail(emails, subject, body));
-                return true;
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                logger.log(Level.WARNING, "Error composing email : ", e);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Get the timestamp for the last test run for the specified test.
-     *
-     * @param testKey The parent key of the test runs to query for.
-     * @return The timestamp in microseconds of the last test run for the test, or -1 if none.
-     */
-    private static long getLastRunTime(Key testKey) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Filter testTypeFilter = FilterUtil.getTestTypeFilter(false, true, false);
-        Query q =
-                new Query(TestRunEntity.KIND)
-                        .setAncestor(testKey)
-                        .setFilter(testTypeFilter)
-                        .addSort(Entity.KEY_RESERVED_PROPERTY, SortDirection.DESCENDING)
-                        .setKeysOnly();
-
-        long lastTestRun = -1;
-        for (Entity testRun : datastore.prepare(q).asIterable(FetchOptions.Builder.withLimit(1))) {
-            lastTestRun = testRun.getKey().getId();
-        }
-        return lastTestRun;
-    }
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Queue queue = QueueFactory.getDefaultQueue();
-        Query q = new Query(TestStatusEntity.KIND).setKeysOnly();
-        List<TaskOptions> tasks = new ArrayList<>();
-        for (Entity status : datastore.prepare(q).asIterable()) {
-            TaskOptions task =
-                    TaskOptions.Builder.withUrl(INACTIVITY_ALERT_URL)
-                            .param("statusKey", KeyFactory.keyToString(status.getKey()))
-                            .method(TaskOptions.Method.POST);
-            tasks.add(task);
-        }
-        TaskQueueHelper.addToQueue(queue, tasks);
-    }
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        String statusKeyString = request.getParameter("statusKey");
-
-        Key statusKey;
-        try {
-            statusKey = KeyFactory.stringToKey(statusKeyString);
-        } catch (IllegalArgumentException e) {
-            logger.log(Level.WARNING, "Invalid key specified: " + statusKeyString);
-            return;
-        }
-
-        TestStatusEntity status = null;
-        try {
-            status = TestStatusEntity.fromEntity(datastore.get(statusKey));
-        } catch (EntityNotFoundException e) {
-            // no existing status
-        }
-        if (status == null) {
-            return;
-        }
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, status.getTestName());
-        long lastRunTime = getLastRunTime(testKey);
-
-        StringBuffer fullUrl = request.getRequestURL();
-        String baseUrl = fullUrl.substring(0, fullUrl.indexOf(request.getRequestURI()));
-        String link = baseUrl + "/show_tree?testName=" + status.getTestName();
-
-        List<Message> messageQueue = new ArrayList<>();
-        List<String> emails;
-        try {
-            emails = EmailHelper.getSubscriberEmails(testKey);
-        } catch (IOException e) {
-            logger.log(Level.SEVERE, e.toString());
-            return;
-        }
-        notifyIfInactive(status, lastRunTime, link, emails, messageQueue);
-        if (messageQueue.size() > 0) {
-            EmailHelper.sendAll(messageQueue);
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/job/VtsPerformanceJobServlet.java b/src/main/java/com/android/vts/job/VtsPerformanceJobServlet.java
deleted file mode 100644
index ebd5294..0000000
--- a/src/main/java/com/android/vts/job/VtsPerformanceJobServlet.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.job;
-
-import com.android.vts.entity.TestEntity;
-import com.android.vts.util.EmailHelper;
-import com.android.vts.util.PerformanceSummary;
-import com.android.vts.util.PerformanceUtil;
-import com.android.vts.util.ProfilingPointSummary;
-import com.android.vts.util.StatSummary;
-import com.android.vts.util.TaskQueueHelper;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.taskqueue.Queue;
-import com.google.appengine.api.taskqueue.QueueFactory;
-import com.google.appengine.api.taskqueue.TaskOptions;
-import java.io.IOException;
-import java.math.RoundingMode;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Represents the notifications service which is automatically called on a fixed schedule. */
-public class VtsPerformanceJobServlet extends BaseJobServlet {
-    protected static final Logger logger =
-            Logger.getLogger(VtsPerformanceJobServlet.class.getName());
-
-    private static final String PERFORMANCE_JOB_URL = "/cron/vts_performance_job";
-    private static final String MEAN = "Mean";
-    private static final String MAX = "Max";
-    private static final String MIN = "Min";
-    private static final String MIN_DELTA = "&Delta;Min (%)";
-    private static final String MAX_DELTA = "&Delta;Max (%)";
-    private static final String HIGHER_IS_BETTER =
-            "Note: Higher values are better. Maximum is the best-case performance.";
-    private static final String LOWER_IS_BETTER =
-            "Note: Lower values are better. Minimum is the best-case performance.";
-    private static final String STD = "Std";
-    private static final String SUBJECT_PREFIX = "Daily Performance Digest: ";
-    private static final String LAST_WEEK = "Last Week";
-    private static final String LABEL_STYLE = "font-family: arial";
-    private static final String SUBTEXT_STYLE = "font-family: arial; font-size: 12px";
-    private static final String TABLE_STYLE =
-            "width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;";
-    private static final String SECTION_LABEL_STYLE =
-            "border: 1px solid black; border-bottom: none; background-color: lightgray;";
-    private static final String COL_LABEL_STYLE =
-            "border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;";
-    private static final String HEADER_COL_STYLE =
-            "border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;";
-    private static final String INNER_CELL_STYLE =
-            "border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;";
-    private static final String OUTER_CELL_STYLE =
-            "border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;";
-
-    private static final DecimalFormat FORMATTER;
-
-    /** Initialize the decimal formatter. */
-    static {
-        FORMATTER = new DecimalFormat("#.##");
-        FORMATTER.setRoundingMode(RoundingMode.HALF_UP);
-    }
-
-    /**
-     * Generates an HTML summary of the performance changes for the profiling results in the
-     * specified table.
-     *
-     * <p>Retrieves the past 24 hours of profiling data and compares it to the 24 hours that
-     * preceded it. Creates a table representation of the mean and standard deviation for each
-     * profiling point. When performance degrades, the cell is shaded red.
-     *
-     * @param testName The name of the test whose profiling data to summarize.
-     * @param perfSummaries List of PerformanceSummary objects for each profiling run (in reverse
-     *     chronological order).
-     * @param labels List of string labels for use as the column headers.
-     * @returns An HTML string containing labeled table summaries.
-     */
-    public static String getPerformanceSummary(
-            String testName, List<PerformanceSummary> perfSummaries, List<String> labels) {
-        if (perfSummaries.size() == 0) return "";
-        PerformanceSummary now = perfSummaries.get(0);
-        String tableHTML = "<p style='" + LABEL_STYLE + "'><b>";
-        tableHTML += testName + "</b></p>";
-        for (String profilingPoint : now.getProfilingPointNames()) {
-            ProfilingPointSummary summary = now.getProfilingPointSummary(profilingPoint);
-            tableHTML += "<table cellpadding='2' style='" + TABLE_STYLE + "'>";
-
-            // Format header rows
-            String[] headerRows = new String[] {profilingPoint, summary.yLabel};
-            int colspan = labels.size() * 4;
-            for (String content : headerRows) {
-                tableHTML += "<tr><td colspan='" + colspan + "'>" + content + "</td></tr>";
-            }
-
-            // Format section labels
-            tableHTML += "<tr>";
-            for (int i = 0; i < labels.size(); i++) {
-                String content = labels.get(i);
-                tableHTML += "<th style='" + SECTION_LABEL_STYLE + "' ";
-                if (i == 0) tableHTML += "colspan='1'";
-                else if (i == 1) tableHTML += "colspan='3'";
-                else tableHTML += "colspan='4'";
-                tableHTML += ">" + content + "</th>";
-            }
-            tableHTML += "</tr>";
-
-            String deltaString;
-            String bestCaseString;
-            String subtext;
-            switch (now.getProfilingPointSummary(profilingPoint).getRegressionMode()) {
-                case VTS_REGRESSION_MODE_DECREASING:
-                    deltaString = MAX_DELTA;
-                    bestCaseString = MAX;
-                    subtext = HIGHER_IS_BETTER;
-                    break;
-                default:
-                    deltaString = MIN_DELTA;
-                    bestCaseString = MIN;
-                    subtext = LOWER_IS_BETTER;
-                    break;
-            }
-
-            // Format column labels
-            tableHTML += "<tr>";
-            for (int i = 0; i < labels.size(); i++) {
-                if (i > 1) {
-                    tableHTML += "<th style='" + COL_LABEL_STYLE + "'>" + deltaString + "</th>";
-                }
-                if (i == 0) {
-                    tableHTML += "<th style='" + COL_LABEL_STYLE + "'>";
-                    tableHTML += summary.xLabel + "</th>";
-                } else if (i > 0) {
-                    tableHTML += "<th style='" + COL_LABEL_STYLE + "'>" + bestCaseString + "</th>";
-                    tableHTML += "<th style='" + COL_LABEL_STYLE + "'>" + MEAN + "</th>";
-                    tableHTML += "<th style='" + COL_LABEL_STYLE + "'>" + STD + "</th>";
-                }
-            }
-            tableHTML += "</tr>";
-
-            // Populate data cells
-            for (StatSummary stats : summary) {
-                String label = stats.getLabel();
-                tableHTML += "<tr><td style='" + HEADER_COL_STYLE + "'>" + label;
-                tableHTML += "</td><td style='" + INNER_CELL_STYLE + "'>";
-                tableHTML += FORMATTER.format(stats.getBestCase()) + "</td>";
-                tableHTML += "<td style='" + INNER_CELL_STYLE + "'>";
-                tableHTML += FORMATTER.format(stats.getMean()) + "</td>";
-                tableHTML += "<td style='" + OUTER_CELL_STYLE + "'>";
-                if (stats.getCount() < 2) {
-                    tableHTML += " - </td>";
-                } else {
-                    tableHTML += FORMATTER.format(stats.getStd()) + "</td>";
-                }
-                for (int i = 1; i < perfSummaries.size(); i++) {
-                    PerformanceSummary oldPerfSummary = perfSummaries.get(i);
-                    if (oldPerfSummary.hasProfilingPoint(profilingPoint)) {
-                        StatSummary baseline =
-                                oldPerfSummary
-                                        .getProfilingPointSummary(profilingPoint)
-                                        .getStatSummary(label);
-                        tableHTML +=
-                                PerformanceUtil.getBestCasePerformanceComparisonHTML(
-                                        baseline,
-                                        stats,
-                                        "",
-                                        "",
-                                        INNER_CELL_STYLE,
-                                        OUTER_CELL_STYLE);
-                    } else tableHTML += "<td></td><td></td><td></td><td></td>";
-                }
-                tableHTML += "</tr>";
-            }
-            tableHTML += "</table>";
-            tableHTML += "<i style='" + SUBTEXT_STYLE + "'>" + subtext + "</i><br><br>";
-        }
-        return tableHTML;
-    }
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Queue queue = QueueFactory.getDefaultQueue();
-        Query q = new Query(TestEntity.KIND).setKeysOnly();
-        List<TaskOptions> tasks = new ArrayList<>();
-        for (Entity test : datastore.prepare(q).asIterable()) {
-            if (test.getKey().getName() == null) {
-                continue;
-            }
-            TaskOptions task =
-                    TaskOptions.Builder.withUrl(PERFORMANCE_JOB_URL)
-                            .param("testKey", KeyFactory.keyToString(test.getKey()))
-                            .method(TaskOptions.Method.POST);
-            tasks.add(task);
-        }
-        TaskQueueHelper.addToQueue(queue, tasks);
-    }
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        String testKeyString = request.getParameter("testKey");
-        Key testKey;
-        try {
-            testKey = KeyFactory.stringToKey(testKeyString);
-        } catch (IllegalArgumentException e) {
-            logger.log(Level.WARNING, "Invalid key specified: " + testKeyString);
-            return;
-        }
-
-        long nowMicro = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-
-        // Add today to the list of time intervals to analyze
-        List<PerformanceSummary> summaries = new ArrayList<>();
-        PerformanceSummary today =
-                new PerformanceSummary(nowMicro - TimeUnit.DAYS.toMicros(1), nowMicro);
-        summaries.add(today);
-
-        // Add yesterday as a baseline time interval for analysis
-        long oneDayAgo = nowMicro - TimeUnit.DAYS.toMicros(1);
-        PerformanceSummary yesterday =
-                new PerformanceSummary(oneDayAgo - TimeUnit.DAYS.toMicros(1), oneDayAgo);
-        summaries.add(yesterday);
-
-        // Add last week as a baseline time interval for analysis
-        long oneWeek = TimeUnit.DAYS.toMicros(7);
-        long oneWeekAgo = nowMicro - oneWeek;
-
-        String spanString = "<span class='date-label'>";
-        String label =
-                spanString + TimeUnit.MICROSECONDS.toMillis(oneWeekAgo - oneWeek) + "</span>";
-        label += " - " + spanString + TimeUnit.MICROSECONDS.toMillis(oneWeekAgo) + "</span>";
-        PerformanceSummary lastWeek =
-                new PerformanceSummary(oneWeekAgo - oneWeek, oneWeekAgo, label);
-        summaries.add(lastWeek);
-        PerformanceUtil.updatePerformanceSummary(
-                testKey.getName(), oneWeekAgo - oneWeek, nowMicro, null, summaries);
-
-        List<PerformanceSummary> nonEmptySummaries = new ArrayList<>();
-        List<String> labels = new ArrayList<>();
-        labels.add("");
-        for (PerformanceSummary perfSummary : summaries) {
-            if (perfSummary.size() == 0) continue;
-            nonEmptySummaries.add(perfSummary);
-            labels.add(perfSummary.label);
-        }
-        String body = getPerformanceSummary(testKey.getName(), nonEmptySummaries, labels);
-        if (body == null || body.equals("")) {
-            return;
-        }
-        List<String> emails = EmailHelper.getSubscriberEmails(testKey);
-        if (emails.size() == 0) {
-            return;
-        }
-        String subject = SUBJECT_PREFIX + testKey.getName();
-        EmailHelper.send(emails, subject, body);
-    }
-}
diff --git a/src/main/java/com/android/vts/job/VtsProfilingStatsJobServlet.java b/src/main/java/com/android/vts/job/VtsProfilingStatsJobServlet.java
deleted file mode 100644
index 50f72e1..0000000
--- a/src/main/java/com/android/vts/job/VtsProfilingStatsJobServlet.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.job;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.ProfilingPointSummaryEntity;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.PerformanceUtil;
-import com.android.vts.util.TaskQueueHelper;
-import com.android.vts.util.TimeUtil;
-import com.google.appengine.api.datastore.DatastoreFailureException;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.DatastoreTimeoutException;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Transaction;
-import com.google.appengine.api.taskqueue.Queue;
-import com.google.appengine.api.taskqueue.QueueFactory;
-import com.google.appengine.api.taskqueue.TaskOptions;
-import java.io.IOException;
-import java.time.Instant;
-import java.time.ZonedDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.ConcurrentModificationException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Represents the notifications service which is automatically called on a fixed schedule. */
-public class VtsProfilingStatsJobServlet extends BaseJobServlet {
-    protected static final Logger logger =
-            Logger.getLogger(VtsProfilingStatsJobServlet.class.getName());
-    private static final String HIDL_HAL_OPTION = "hidl_hal_mode";
-    private static final String[] splitKeysArray = new String[] {HIDL_HAL_OPTION};
-    private static final Set<String> splitKeySet = new HashSet<>(Arrays.asList(splitKeysArray));
-
-    public static final String PROFILING_STATS_JOB_URL = "/task/vts_profiling_stats_job";
-    public static final String PROFILING_POINT_KEY = "profilingPointKey";
-    public static final String QUEUE = "profilingStatsQueue";
-
-    /**
-     * Round the date down to the start of the day (PST).
-     *
-     * @param time The time in microseconds.
-     * @return
-     */
-    public static long getCanonicalTime(long time) {
-        long timeMillis = TimeUnit.MICROSECONDS.toMillis(time);
-        ZonedDateTime zdt =
-                ZonedDateTime.ofInstant(Instant.ofEpochMilli(timeMillis), TimeUtil.PT_ZONE);
-        return TimeUnit.SECONDS.toMicros(
-                zdt.withHour(0).withMinute(0).withSecond(0).toEpochSecond());
-    }
-
-    /**
-     * Add tasks to process profiling run data
-     *
-     * @param profilingPointKeys The list of keys of the profiling point runs whose data process.
-     */
-    public static void addTasks(List<Key> profilingPointKeys) {
-        Queue queue = QueueFactory.getQueue(QUEUE);
-        List<TaskOptions> tasks = new ArrayList<>();
-        for (Key key : profilingPointKeys) {
-            String keyString = KeyFactory.keyToString(key);
-            tasks.add(
-                    TaskOptions.Builder.withUrl(PROFILING_STATS_JOB_URL)
-                            .param(PROFILING_POINT_KEY, keyString)
-                            .method(TaskOptions.Method.POST));
-        }
-        TaskQueueHelper.addToQueue(queue, tasks);
-    }
-
-    /**
-     * Update the profiling summaries with the information from a profiling point run.
-     *
-     * @param testKey The key to the TestEntity whose profiling data to analyze.
-     * @param profilingPointRun The profiling data to analyze.
-     * @param devices The list of devices used in the profiling run.
-     * @param time The canonical timestamp of the summary to update.
-     * @return true if the update succeeds, false otherwise.
-     */
-    public static boolean updateSummaries(
-            Key testKey,
-            ProfilingPointRunEntity profilingPointRun,
-            List<DeviceInfoEntity> devices,
-            long time) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Transaction tx = datastore.beginTransaction();
-        try {
-            List<Entity> puts = new ArrayList<>();
-
-            ProfilingPointEntity profilingPoint =
-                    new ProfilingPointEntity(
-                            testKey.getName(),
-                            profilingPointRun.getName(),
-                            profilingPointRun.getType(),
-                            profilingPointRun.getRegressionMode(),
-                            profilingPointRun.getXLabel(),
-                            profilingPointRun.getYLabel());
-            puts.add(profilingPoint.toEntity());
-
-            String option = PerformanceUtil.getOptionAlias(profilingPointRun, splitKeySet);
-
-            Set<String> branches = new HashSet<>();
-            Set<String> deviceNames = new HashSet<>();
-
-            branches.add(ProfilingPointSummaryEntity.ALL);
-            deviceNames.add(ProfilingPointSummaryEntity.ALL);
-
-            for (DeviceInfoEntity d : devices) {
-                branches.add(d.getBranch());
-                deviceNames.add(d.getBuildFlavor());
-            }
-
-            List<Key> summaryGets = new ArrayList<>();
-            for (String branch : branches) {
-                for (String device : deviceNames) {
-                    summaryGets.add(
-                            ProfilingPointSummaryEntity.createKey(
-                                    profilingPoint.getKey(), branch, device, option, time));
-                }
-            }
-
-            Map<Key, Entity> summaries = datastore.get(tx, summaryGets);
-            Map<String, Map<String, ProfilingPointSummaryEntity>> summaryMap = new HashMap<>();
-            for (Key key : summaries.keySet()) {
-                Entity e = summaries.get(key);
-                ProfilingPointSummaryEntity profilingPointSummary =
-                        ProfilingPointSummaryEntity.fromEntity(e);
-                if (profilingPointSummary == null) {
-                    logger.log(Level.WARNING, "Invalid profiling point summary: " + e.getKey());
-                    continue;
-                }
-                if (!summaryMap.containsKey(profilingPointSummary.getBranch())) {
-                    summaryMap.put(profilingPointSummary.getBranch(), new HashMap<>());
-                }
-                Map<String, ProfilingPointSummaryEntity> deviceMap =
-                        summaryMap.get(profilingPointSummary.getBranch());
-                deviceMap.put(profilingPointSummary.getBuildFlavor(), profilingPointSummary);
-            }
-
-            Set<ProfilingPointSummaryEntity> modifiedEntities = new HashSet<>();
-
-            for (String branch : branches) {
-                if (!summaryMap.containsKey(branch)) {
-                    summaryMap.put(branch, new HashMap<>());
-                }
-                Map<String, ProfilingPointSummaryEntity> deviceMap = summaryMap.get(branch);
-
-                for (String device : deviceNames) {
-                    ProfilingPointSummaryEntity summary;
-                    if (deviceMap.containsKey(device)) {
-                        summary = deviceMap.get(device);
-                    } else {
-                        summary =
-                                new ProfilingPointSummaryEntity(
-                                        profilingPoint.getKey(), branch, device, option, time);
-                        deviceMap.put(device, summary);
-                    }
-                    summary.update(profilingPointRun);
-                    modifiedEntities.add(summary);
-                }
-            }
-
-            for (ProfilingPointSummaryEntity profilingPointSummary : modifiedEntities) {
-                puts.add(profilingPointSummary.toEntity());
-            }
-            datastore.put(tx, puts);
-            tx.commit();
-        } catch (ConcurrentModificationException
-                | DatastoreFailureException
-                | DatastoreTimeoutException e) {
-            return false;
-        } finally {
-            if (tx.isActive()) {
-                tx.rollback();
-                logger.log(
-                        Level.WARNING,
-                        "Profiling stats job transaction still active: "
-                                + profilingPointRun.getKey());
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        String profilingPointKeyString = request.getParameter(PROFILING_POINT_KEY);
-
-        Key profilingPointRunKey;
-        try {
-            profilingPointRunKey = KeyFactory.stringToKey(profilingPointKeyString);
-        } catch (IllegalArgumentException e) {
-            logger.log(Level.WARNING, "Invalid key specified: " + profilingPointKeyString);
-            return;
-        }
-        Key testKey = profilingPointRunKey.getParent().getParent();
-
-        ProfilingPointRunEntity profilingPointRun = null;
-        try {
-            Entity profilingPointRunEntity = datastore.get(profilingPointRunKey);
-            profilingPointRun = ProfilingPointRunEntity.fromEntity(profilingPointRunEntity);
-        } catch (EntityNotFoundException e) {
-            // no run found
-        }
-        if (profilingPointRun == null) {
-            return;
-        }
-
-        Query deviceQuery =
-                new Query(DeviceInfoEntity.KIND).setAncestor(profilingPointRunKey.getParent());
-
-        List<DeviceInfoEntity> devices = new ArrayList<>();
-        for (Entity e : datastore.prepare(deviceQuery).asIterable()) {
-            DeviceInfoEntity deviceInfoEntity = DeviceInfoEntity.fromEntity(e);
-            if (e == null) continue;
-            devices.add(deviceInfoEntity);
-        }
-
-        long canonicalTime = getCanonicalTime(profilingPointRunKey.getParent().getId());
-        int retryCount = 0;
-        while (retryCount++ <= DatastoreHelper.MAX_WRITE_RETRIES) {
-            boolean result = updateSummaries(testKey, profilingPointRun, devices, canonicalTime);
-            if (!result) {
-                logger.log(
-                        Level.WARNING, "Retrying profiling stats update: " + profilingPointRunKey);
-                continue;
-            }
-            break;
-        }
-        if (retryCount > DatastoreHelper.MAX_WRITE_RETRIES) {
-            logger.log(Level.SEVERE, "Could not update profiling stats: " + profilingPointRunKey);
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/job/VtsSpreadSheetSyncServlet.java b/src/main/java/com/android/vts/job/VtsSpreadSheetSyncServlet.java
deleted file mode 100644
index 45726d9..0000000
--- a/src/main/java/com/android/vts/job/VtsSpreadSheetSyncServlet.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.job;
-
-import com.android.vts.entity.ApiCoverageExcludedEntity;
-import com.android.vts.entity.DashboardEntity;
-import com.google.api.client.auth.oauth2.Credential;
-import com.google.api.client.extensions.appengine.datastore.AppEngineDataStoreFactory;
-import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
-import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
-import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
-import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
-import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.JsonFactory;
-import com.google.api.client.json.jackson2.JacksonFactory;
-import com.google.api.services.sheets.v4.Sheets;
-import com.google.api.services.sheets.v4.model.ValueRange;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.security.GeneralSecurityException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** Job to sync excluded API data in google spreadsheet with datastore's entity. */
-public class VtsSpreadSheetSyncServlet extends BaseJobServlet {
-
-    protected static final Logger logger =
-            Logger.getLogger(VtsSpreadSheetSyncServlet.class.getName());
-
-    private static final String APPLICATION_NAME = "VTS Dashboard";
-    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
-
-    private String CREDENTIALS_KEY_FILE = "";
-
-    /** GoogleClientSecrets for GoogleAuthorizationCodeFlow Builder */
-    private GoogleClientSecrets clientSecrets;
-
-    /** This is the ID of google spreadsheet. */
-    private String SPREAD_SHEET_ID = "";
-
-    /** This is the range to read of google spreadsheet. */
-    private String SPREAD_SHEET_RANGE = "";
-
-    @Override
-    public void init(ServletConfig servletConfig) throws ServletException {
-        super.init(servletConfig);
-
-        try {
-            CREDENTIALS_KEY_FILE = systemConfigProp.getProperty("api.coverage.keyFile");
-            SPREAD_SHEET_ID = systemConfigProp.getProperty("api.coverage.spreadSheetId");
-            SPREAD_SHEET_RANGE = systemConfigProp.getProperty("api.coverage.spreadSheetRange");
-
-            InputStream keyFileInputStream =
-                    this.getClass()
-                            .getClassLoader()
-                            .getResourceAsStream("keys/" + CREDENTIALS_KEY_FILE);
-            InputStreamReader keyFileStreamReader = new InputStreamReader(keyFileInputStream);
-
-            this.clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, keyFileStreamReader);
-        } catch (IOException ioe) {
-            logger.log(Level.SEVERE, ioe.getMessage());
-        } catch (Exception exception) {
-            logger.log(Level.SEVERE, exception.getMessage());
-        }
-    }
-
-    /**
-     * Creates an authorized Credential object.
-     *
-     * @param HTTP_TRANSPORT The network HTTP Transport.
-     * @param appEngineDataStoreFactory The credential will be persisted using the Google App Engine
-     *     Data Store API.
-     * @param SCOPES Scopes are strings that enable access to particular resources, such as user
-     *     data.
-     * @return An authorized Credential object.
-     * @throws IOException If the credentials.json file cannot be found.
-     */
-    private Credential getCredentials(
-            final NetHttpTransport HTTP_TRANSPORT,
-            final AppEngineDataStoreFactory appEngineDataStoreFactory,
-            final List<String> SCOPES)
-            throws IOException {
-
-        // Build flow and trigger user authorization request.
-        GoogleAuthorizationCodeFlow flow =
-                new GoogleAuthorizationCodeFlow.Builder(
-                                HTTP_TRANSPORT, JSON_FACTORY, this.clientSecrets, SCOPES)
-                        .setDataStoreFactory(appEngineDataStoreFactory)
-                        .setAccessType("offline")
-                        .build();
-        LocalServerReceiver localServerReceiver = new LocalServerReceiver();
-        return new AuthorizationCodeInstalledApp(flow, localServerReceiver).authorize("user");
-    }
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-
-        try {
-            // Build a new authorized API client service.
-            final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
-            final AppEngineDataStoreFactory appEngineDataStoreFactory =
-                    (AppEngineDataStoreFactory)
-                            request.getServletContext().getAttribute("dataStoreFactory");
-            final List<String> googleApiScopes =
-                    (List<String>) request.getServletContext().getAttribute("googleApiScopes");
-
-            Sheets service =
-                    new Sheets.Builder(
-                                    HTTP_TRANSPORT,
-                                    JSON_FACTORY,
-                                    getCredentials(
-                                            HTTP_TRANSPORT,
-                                            appEngineDataStoreFactory,
-                                            googleApiScopes))
-                            .setApplicationName(APPLICATION_NAME)
-                            .build();
-
-            ValueRange valueRange =
-                    service.spreadsheets()
-                            .values()
-                            .get(SPREAD_SHEET_ID, SPREAD_SHEET_RANGE)
-                            .execute();
-
-            List<ApiCoverageExcludedEntity> apiCoverageExcludedEntities = new ArrayList<>();
-            List<List<Object>> values = valueRange.getValues();
-            if (values == null || values.isEmpty()) {
-                logger.log(Level.WARNING, "No data found in google spreadsheet.");
-            } else {
-                for (List row : values) {
-                    ApiCoverageExcludedEntity apiCoverageExcludedEntity =
-                            new ApiCoverageExcludedEntity(
-                                    row.get(0).toString(),
-                                    row.get(1).toString(),
-                                    row.get(2).toString(),
-                                    row.get(3).toString(),
-                                    row.get(4).toString());
-                    apiCoverageExcludedEntities.add(apiCoverageExcludedEntity);
-                }
-            }
-
-            DashboardEntity.saveAll(apiCoverageExcludedEntities, MAX_ENTITY_SIZE_PER_TRANSACTION);
-
-        } catch (GeneralSecurityException gse) {
-            logger.log(Level.SEVERE, gse.getMessage());
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java b/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java
deleted file mode 100644
index 2aa34e4..0000000
--- a/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.job;
-
-import com.android.vts.entity.TestSuiteFileEntity;
-import com.android.vts.entity.TestSuiteResultEntity;
-import com.android.vts.proto.TestSuiteResultMessageProto;
-import com.android.vts.util.GcsHelper;
-import com.android.vts.util.TaskQueueHelper;
-import com.android.vts.util.TimeUtil;
-import com.google.appengine.api.memcache.ErrorHandlers;
-import com.google.appengine.api.memcache.MemcacheService;
-import com.google.appengine.api.memcache.MemcacheServiceFactory;
-import com.google.appengine.api.taskqueue.Queue;
-import com.google.appengine.api.taskqueue.QueueFactory;
-import com.google.appengine.api.taskqueue.TaskOptions;
-import com.google.cloud.storage.Blob;
-import com.google.cloud.storage.Bucket;
-import com.google.cloud.storage.Storage;
-import com.googlecode.objectify.Key;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.FileSystems;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Suite Test result file processing job. */
-public class VtsSuiteTestJobServlet extends BaseJobServlet {
-
-    private static final String SUITE_TEST_URL = "/cron/test_suite_report_gcs_monitor";
-
-    private static final String SERVICE_NAME = "VTS Dashboard";
-
-    private final Logger logger = Logger.getLogger(this.getClass().getName());
-
-    /** Google Cloud Storage project's key file to access the storage */
-    private static String GCS_KEY_FILE;
-    /** Google Cloud Storage project's default bucket name for vtslab log files */
-    private static String GCS_BUCKET_NAME;
-    /** Google Cloud Storage project's default directory name for suite test result files */
-    private static String GCS_SUITE_TEST_FOLDER_NAME;
-
-    public static final String QUEUE = "suiteTestQueue";
-
-    /**
-     * This is the key file to access vtslab-gcs project. It will allow the dashboard to have a full
-     * control of the bucket.
-     */
-    private InputStream keyFileInputStream;
-
-    /** This is the instance of java google storage library */
-    private Storage storage;
-
-    /** This is the instance of App Engine memcache service java library */
-    private MemcacheService syncCache = MemcacheServiceFactory.getMemcacheService();
-
-    @Override
-    public void init(ServletConfig servletConfig) throws ServletException {
-        super.init(servletConfig);
-
-        GCS_KEY_FILE = systemConfigProp.getProperty("gcs.keyFile");
-        GCS_BUCKET_NAME = systemConfigProp.getProperty("gcs.bucketName");
-        GCS_SUITE_TEST_FOLDER_NAME = systemConfigProp.getProperty("gcs.suiteTestFolderName");
-
-        this.keyFileInputStream =
-                this.getClass().getClassLoader().getResourceAsStream("keys/" + GCS_KEY_FILE);
-
-        Optional<Storage> optionalStorage = GcsHelper.getStorage(this.keyFileInputStream);
-        if (optionalStorage.isPresent()) {
-            this.storage = optionalStorage.get();
-        } else {
-            logger.log(Level.SEVERE, "Error on getting storage instance!");
-            throw new ServletException("Creating storage instance exception!");
-        }
-        syncCache.setErrorHandler(ErrorHandlers.getConsistentLogAndContinue(Level.INFO));
-    }
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-
-        List<String> dateStringList = new ArrayList<>();
-
-        long currentMicroSecond = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-
-        ZonedDateTime checkZonedDateTime = TimeUtil.getZonedDateTime(currentMicroSecond);
-        String checkDateString =
-                DateTimeFormatter.ofPattern(TimeUtil.DATE_FORMAT)
-                        .format(checkZonedDateTime.minusMinutes(5));
-        String todayDateString = TimeUtil.getDateString(currentMicroSecond);
-        if (!checkDateString.equals(todayDateString)) {
-            dateStringList.add(checkDateString);
-            logger.log(Level.INFO, "Yesterday is added to the process queue and processed!");
-        }
-        dateStringList.add(todayDateString);
-
-        for (String dateString : dateStringList) {
-            String[] dateArray = dateString.split("-");
-            if (dateArray.length == 3) {
-
-                Queue queue = QueueFactory.getQueue(QUEUE);
-
-                List<TaskOptions> tasks = new ArrayList<>();
-
-                String fileSeparator = FileSystems.getDefault().getSeparator();
-
-                String year = dateArray[0];
-                String month = dateArray[1];
-                String day = dateArray[2];
-
-                List<String> pathList = Arrays.asList(GCS_SUITE_TEST_FOLDER_NAME, year, month, day);
-                Path pathInfo = Paths.get(String.join(fileSeparator, pathList));
-
-                List<TestSuiteFileEntity> testSuiteFileEntityList =
-                        ofy().load()
-                                .type(TestSuiteFileEntity.class)
-                                .filter("year", Integer.parseInt(year))
-                                .filter("month", Integer.parseInt(month))
-                                .filter("day", Integer.parseInt(day))
-                                .list();
-
-                List<String> filePathList =
-                        testSuiteFileEntityList
-                                .stream()
-                                .map(testSuiteFile -> testSuiteFile.getFilePath())
-                                .collect(Collectors.toList());
-
-                Bucket vtsReportBucket = this.storage.get(GCS_BUCKET_NAME);
-
-                Storage.BlobListOption[] listOptions =
-                        new Storage.BlobListOption[] {
-                            Storage.BlobListOption.prefix(pathInfo.toString() + fileSeparator)
-                        };
-
-                Iterable<Blob> blobIterable = vtsReportBucket.list(listOptions).iterateAll();
-                Iterator<Blob> blobIterator = blobIterable.iterator();
-                while (blobIterator.hasNext()) {
-                    Blob blob = blobIterator.next();
-                    if (blob.isDirectory()) {
-                        logger.log(Level.INFO, blob.getName() + " directory will be skipped!");
-                    } else {
-                        if (filePathList.contains(blob.getName())) {
-                            logger.log(Level.INFO, "filePathList contain => " + blob.getName());
-                        } else if (blob.getName().endsWith(fileSeparator)) {
-                            logger.log(Level.INFO, blob.getName() + " endswith slash!");
-                        } else {
-                            TaskOptions task =
-                                    TaskOptions.Builder.withUrl(SUITE_TEST_URL)
-                                            .param("filePath", blob.getName())
-                                            .method(TaskOptions.Method.POST);
-                            tasks.add(task);
-                        }
-                    }
-                }
-                TaskQueueHelper.addToQueue(queue, tasks);
-            } else {
-                throw new IllegalArgumentException(
-                        todayDateString + " date string not in correct format");
-            }
-        }
-    }
-
-    @Override
-    public void doPost(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-
-        String filePath = request.getParameter("filePath");
-        if (Objects.isNull(filePath)) {
-            logger.log(Level.WARNING, "filePath parameter is null!");
-        } else {
-            logger.log(Level.INFO, "filePath parameter => " + filePath);
-
-            Key<TestSuiteFileEntity> testSuiteFileEntityKey =
-                    Key.create(TestSuiteFileEntity.class, filePath);
-            TestSuiteFileEntity testSuiteFileEntity =
-                    ofy().load()
-                            .type(TestSuiteFileEntity.class)
-                            .filterKey(testSuiteFileEntityKey)
-                            .first()
-                            .now();
-
-            if (Objects.isNull(testSuiteFileEntity)) {
-                Blob blobFile = (Blob) this.syncCache.get(filePath);
-                if (Objects.isNull(blobFile)) {
-                    Bucket vtsReportBucket = this.storage.get(GCS_BUCKET_NAME);
-                    blobFile = vtsReportBucket.get(filePath);
-                    this.syncCache.put(filePath, blobFile);
-                }
-
-                if (blobFile.exists()) {
-                    TestSuiteFileEntity newTestSuiteFileEntity = new TestSuiteFileEntity(filePath);
-                    try {
-                        TestSuiteResultMessageProto.TestSuiteResultMessage testSuiteResultMessage =
-                                TestSuiteResultMessageProto.TestSuiteResultMessage.parseFrom(
-                                        blobFile.getContent());
-
-                        TestSuiteResultEntity testSuiteResultEntity =
-                                new TestSuiteResultEntity(
-                                        testSuiteFileEntityKey,
-                                        testSuiteResultMessage.getStartTime(),
-                                        testSuiteResultMessage.getEndTime(),
-                                        testSuiteResultMessage.getTestType(),
-                                        testSuiteResultMessage.getBootSuccess(),
-                                        testSuiteResultMessage.getResultPath(),
-                                        testSuiteResultMessage.getInfraLogPath(),
-                                        testSuiteResultMessage.getHostName(),
-                                        testSuiteResultMessage.getSuitePlan(),
-                                        testSuiteResultMessage.getSuiteVersion(),
-                                        testSuiteResultMessage.getSuiteName(),
-                                        testSuiteResultMessage.getSuiteBuildNumber(),
-                                        testSuiteResultMessage.getModulesDone(),
-                                        testSuiteResultMessage.getModulesTotal(),
-                                        testSuiteResultMessage.getBranch(),
-                                        testSuiteResultMessage.getTarget(),
-                                        testSuiteResultMessage.getBuildId(),
-                                        testSuiteResultMessage.getBuildSystemFingerprint(),
-                                        testSuiteResultMessage.getBuildVendorFingerprint(),
-                                        testSuiteResultMessage.getPassedTestCaseCount(),
-                                        testSuiteResultMessage.getFailedTestCaseCount());
-
-                        testSuiteResultEntity.save(newTestSuiteFileEntity);
-                    } catch (IOException e) {
-                        ofy().delete().type(TestSuiteFileEntity.class).id(filePath).now();
-                        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-                        logger.log(Level.WARNING, "Invalid proto: " + e.getLocalizedMessage());
-                    }
-                }
-            } else {
-                logger.log(Level.INFO, "suite test found in datastore!");
-            }
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/proto/TestSuiteResultMessageProto.java b/src/main/java/com/android/vts/proto/TestSuiteResultMessageProto.java
deleted file mode 100644
index f152227..0000000
--- a/src/main/java/com/android/vts/proto/TestSuiteResultMessageProto.java
+++ /dev/null
@@ -1,4512 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: TestSuiteResultMessage.proto
-
-package com.android.vts.proto;
-
-public final class TestSuiteResultMessageProto {
-  private TestSuiteResultMessageProto() {}
-  public static void registerAllExtensions(
-      com.google.protobuf.ExtensionRegistryLite registry) {
-  }
-
-  public static void registerAllExtensions(
-      com.google.protobuf.ExtensionRegistry registry) {
-    registerAllExtensions(
-        (com.google.protobuf.ExtensionRegistryLite) registry);
-  }
-  public interface TestSuiteResultMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.TestSuiteResultMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    boolean hasAccessToken();
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    java.lang.String getAccessToken();
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    com.google.protobuf.ByteString
-        getAccessTokenBytes();
-
-    /**
-     * <pre>
-     * GCS path to the corresponding result directory
-     * </pre>
-     *
-     * <code>optional string result_path = 2;</code>
-     */
-    boolean hasResultPath();
-    /**
-     * <pre>
-     * GCS path to the corresponding result directory
-     * </pre>
-     *
-     * <code>optional string result_path = 2;</code>
-     */
-    java.lang.String getResultPath();
-    /**
-     * <pre>
-     * GCS path to the corresponding result directory
-     * </pre>
-     *
-     * <code>optional string result_path = 2;</code>
-     */
-    com.google.protobuf.ByteString
-        getResultPathBytes();
-
-    /**
-     * <pre>
-     * whether the device(s) booted-up successfully
-     * </pre>
-     *
-     * <code>optional bool boot_success = 3 [default = true];</code>
-     */
-    boolean hasBootSuccess();
-    /**
-     * <pre>
-     * whether the device(s) booted-up successfully
-     * </pre>
-     *
-     * <code>optional bool boot_success = 3 [default = true];</code>
-     */
-    boolean getBootSuccess();
-
-    /**
-     * <pre>
-     * test suite build info
-     * </pre>
-     *
-     * <code>required string branch = 11;</code>
-     */
-    boolean hasBranch();
-    /**
-     * <pre>
-     * test suite build info
-     * </pre>
-     *
-     * <code>required string branch = 11;</code>
-     */
-    java.lang.String getBranch();
-    /**
-     * <pre>
-     * test suite build info
-     * </pre>
-     *
-     * <code>required string branch = 11;</code>
-     */
-    com.google.protobuf.ByteString
-        getBranchBytes();
-
-    /**
-     * <code>required string target = 12;</code>
-     */
-    boolean hasTarget();
-    /**
-     * <code>required string target = 12;</code>
-     */
-    java.lang.String getTarget();
-    /**
-     * <code>required string target = 12;</code>
-     */
-    com.google.protobuf.ByteString
-        getTargetBytes();
-
-    /**
-     * <code>required string build_id = 13;</code>
-     */
-    boolean hasBuildId();
-    /**
-     * <code>required string build_id = 13;</code>
-     */
-    java.lang.String getBuildId();
-    /**
-     * <code>required string build_id = 13;</code>
-     */
-    com.google.protobuf.ByteString
-        getBuildIdBytes();
-
-    /**
-     * <pre>
-     * attributes of Result tag
-     * </pre>
-     *
-     * <code>optional string suite_plan = 21;</code>
-     */
-    boolean hasSuitePlan();
-    /**
-     * <pre>
-     * attributes of Result tag
-     * </pre>
-     *
-     * <code>optional string suite_plan = 21;</code>
-     */
-    java.lang.String getSuitePlan();
-    /**
-     * <pre>
-     * attributes of Result tag
-     * </pre>
-     *
-     * <code>optional string suite_plan = 21;</code>
-     */
-    com.google.protobuf.ByteString
-        getSuitePlanBytes();
-
-    /**
-     * <code>optional string suite_version = 22;</code>
-     */
-    boolean hasSuiteVersion();
-    /**
-     * <code>optional string suite_version = 22;</code>
-     */
-    java.lang.String getSuiteVersion();
-    /**
-     * <code>optional string suite_version = 22;</code>
-     */
-    com.google.protobuf.ByteString
-        getSuiteVersionBytes();
-
-    /**
-     * <code>optional string suite_build_number = 23;</code>
-     */
-    boolean hasSuiteBuildNumber();
-    /**
-     * <code>optional string suite_build_number = 23;</code>
-     */
-    java.lang.String getSuiteBuildNumber();
-    /**
-     * <code>optional string suite_build_number = 23;</code>
-     */
-    com.google.protobuf.ByteString
-        getSuiteBuildNumberBytes();
-
-    /**
-     * <code>optional int64 start_time = 24;</code>
-     */
-    boolean hasStartTime();
-    /**
-     * <code>optional int64 start_time = 24;</code>
-     */
-    long getStartTime();
-
-    /**
-     * <code>optional int64 end_time = 25;</code>
-     */
-    boolean hasEndTime();
-    /**
-     * <code>optional int64 end_time = 25;</code>
-     */
-    long getEndTime();
-
-    /**
-     * <code>optional string host_name = 26;</code>
-     */
-    boolean hasHostName();
-    /**
-     * <code>optional string host_name = 26;</code>
-     */
-    java.lang.String getHostName();
-    /**
-     * <code>optional string host_name = 26;</code>
-     */
-    com.google.protobuf.ByteString
-        getHostNameBytes();
-
-    /**
-     * <code>optional string suite_name = 27;</code>
-     */
-    boolean hasSuiteName();
-    /**
-     * <code>optional string suite_name = 27;</code>
-     */
-    java.lang.String getSuiteName();
-    /**
-     * <code>optional string suite_name = 27;</code>
-     */
-    com.google.protobuf.ByteString
-        getSuiteNameBytes();
-
-    /**
-     * <pre>
-     * attributes of Build tag
-     * </pre>
-     *
-     * <code>optional string build_system_fingerprint = 31;</code>
-     */
-    boolean hasBuildSystemFingerprint();
-    /**
-     * <pre>
-     * attributes of Build tag
-     * </pre>
-     *
-     * <code>optional string build_system_fingerprint = 31;</code>
-     */
-    java.lang.String getBuildSystemFingerprint();
-    /**
-     * <pre>
-     * attributes of Build tag
-     * </pre>
-     *
-     * <code>optional string build_system_fingerprint = 31;</code>
-     */
-    com.google.protobuf.ByteString
-        getBuildSystemFingerprintBytes();
-
-    /**
-     * <code>optional string build_vendor_fingerprint = 32;</code>
-     */
-    boolean hasBuildVendorFingerprint();
-    /**
-     * <code>optional string build_vendor_fingerprint = 32;</code>
-     */
-    java.lang.String getBuildVendorFingerprint();
-    /**
-     * <code>optional string build_vendor_fingerprint = 32;</code>
-     */
-    com.google.protobuf.ByteString
-        getBuildVendorFingerprintBytes();
-
-    /**
-     * <code>optional int32 test_type = 33 [default = 0];</code>
-     */
-    boolean hasTestType();
-    /**
-     * <code>optional int32 test_type = 33 [default = 0];</code>
-     */
-    int getTestType();
-
-    /**
-     * <pre>
-     * attributes of Summary tag
-     * </pre>
-     *
-     * <code>optional int32 passed_test_case_count = 41;</code>
-     */
-    boolean hasPassedTestCaseCount();
-    /**
-     * <pre>
-     * attributes of Summary tag
-     * </pre>
-     *
-     * <code>optional int32 passed_test_case_count = 41;</code>
-     */
-    int getPassedTestCaseCount();
-
-    /**
-     * <code>optional int32 failed_test_case_count = 42;</code>
-     */
-    boolean hasFailedTestCaseCount();
-    /**
-     * <code>optional int32 failed_test_case_count = 42;</code>
-     */
-    int getFailedTestCaseCount();
-
-    /**
-     * <code>optional int32 modules_done = 43;</code>
-     */
-    boolean hasModulesDone();
-    /**
-     * <code>optional int32 modules_done = 43;</code>
-     */
-    int getModulesDone();
-
-    /**
-     * <code>optional int32 modules_total = 44;</code>
-     */
-    boolean hasModulesTotal();
-    /**
-     * <code>optional int32 modules_total = 44;</code>
-     */
-    int getModulesTotal();
-
-    /**
-     * <pre>
-     * GCS path to the corresponding infra log file.
-     * </pre>
-     *
-     * <code>optional string infra_log_path = 51;</code>
-     */
-    boolean hasInfraLogPath();
-    /**
-     * <pre>
-     * GCS path to the corresponding infra log file.
-     * </pre>
-     *
-     * <code>optional string infra_log_path = 51;</code>
-     */
-    java.lang.String getInfraLogPath();
-    /**
-     * <pre>
-     * GCS path to the corresponding infra log file.
-     * </pre>
-     *
-     * <code>optional string infra_log_path = 51;</code>
-     */
-    com.google.protobuf.ByteString
-        getInfraLogPathBytes();
-
-    /**
-     * <pre>
-     * GCS path to the repacked device[+GSI] image set.
-     * </pre>
-     *
-     * <code>repeated string repacked_image_path = 52;</code>
-     */
-    java.util.List<java.lang.String>
-        getRepackedImagePathList();
-    /**
-     * <pre>
-     * GCS path to the repacked device[+GSI] image set.
-     * </pre>
-     *
-     * <code>repeated string repacked_image_path = 52;</code>
-     */
-    int getRepackedImagePathCount();
-    /**
-     * <pre>
-     * GCS path to the repacked device[+GSI] image set.
-     * </pre>
-     *
-     * <code>repeated string repacked_image_path = 52;</code>
-     */
-    java.lang.String getRepackedImagePath(int index);
-    /**
-     * <pre>
-     * GCS path to the repacked device[+GSI] image set.
-     * </pre>
-     *
-     * <code>repeated string repacked_image_path = 52;</code>
-     */
-    com.google.protobuf.ByteString
-        getRepackedImagePathBytes(int index);
-
-    /**
-     * <pre>
-     * Fetch info used to fetch and flash certain builds for retry_prompt command.
-     * </pre>
-     *
-     * <code>optional string vendor_build_id = 61;</code>
-     */
-    boolean hasVendorBuildId();
-    /**
-     * <pre>
-     * Fetch info used to fetch and flash certain builds for retry_prompt command.
-     * </pre>
-     *
-     * <code>optional string vendor_build_id = 61;</code>
-     */
-    java.lang.String getVendorBuildId();
-    /**
-     * <pre>
-     * Fetch info used to fetch and flash certain builds for retry_prompt command.
-     * </pre>
-     *
-     * <code>optional string vendor_build_id = 61;</code>
-     */
-    com.google.protobuf.ByteString
-        getVendorBuildIdBytes();
-
-    /**
-     * <code>optional string gsi_build_id = 62;</code>
-     */
-    boolean hasGsiBuildId();
-    /**
-     * <code>optional string gsi_build_id = 62;</code>
-     */
-    java.lang.String getGsiBuildId();
-    /**
-     * <code>optional string gsi_build_id = 62;</code>
-     */
-    com.google.protobuf.ByteString
-        getGsiBuildIdBytes();
-
-    /**
-     * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated boolean hasScheduleConfig();
-    /**
-     * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage getScheduleConfig();
-    /**
-     * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessageOrBuilder getScheduleConfigOrBuilder();
-  }
-  /**
-   * <pre>
-   * To specify the test results which are uploaded to vts dashboard.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.TestSuiteResultMessage}
-   */
-  public  static final class TestSuiteResultMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.TestSuiteResultMessage)
-      TestSuiteResultMessageOrBuilder {
-    // Use TestSuiteResultMessage.newBuilder() to construct.
-    private TestSuiteResultMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private TestSuiteResultMessage() {
-      accessToken_ = "";
-      resultPath_ = "";
-      bootSuccess_ = true;
-      branch_ = "";
-      target_ = "";
-      buildId_ = "";
-      suitePlan_ = "";
-      suiteVersion_ = "";
-      suiteBuildNumber_ = "";
-      startTime_ = 0L;
-      endTime_ = 0L;
-      hostName_ = "";
-      suiteName_ = "";
-      buildSystemFingerprint_ = "";
-      buildVendorFingerprint_ = "";
-      testType_ = 0;
-      passedTestCaseCount_ = 0;
-      failedTestCaseCount_ = 0;
-      modulesDone_ = 0;
-      modulesTotal_ = 0;
-      infraLogPath_ = "";
-      repackedImagePath_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-      vendorBuildId_ = "";
-      gsiBuildId_ = "";
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private TestSuiteResultMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000001;
-              accessToken_ = bs;
-              break;
-            }
-            case 18: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000002;
-              resultPath_ = bs;
-              break;
-            }
-            case 24: {
-              bitField0_ |= 0x00000004;
-              bootSuccess_ = input.readBool();
-              break;
-            }
-            case 90: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000008;
-              branch_ = bs;
-              break;
-            }
-            case 98: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000010;
-              target_ = bs;
-              break;
-            }
-            case 106: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000020;
-              buildId_ = bs;
-              break;
-            }
-            case 170: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000040;
-              suitePlan_ = bs;
-              break;
-            }
-            case 178: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000080;
-              suiteVersion_ = bs;
-              break;
-            }
-            case 186: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000100;
-              suiteBuildNumber_ = bs;
-              break;
-            }
-            case 192: {
-              bitField0_ |= 0x00000200;
-              startTime_ = input.readInt64();
-              break;
-            }
-            case 200: {
-              bitField0_ |= 0x00000400;
-              endTime_ = input.readInt64();
-              break;
-            }
-            case 210: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000800;
-              hostName_ = bs;
-              break;
-            }
-            case 218: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00001000;
-              suiteName_ = bs;
-              break;
-            }
-            case 250: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00002000;
-              buildSystemFingerprint_ = bs;
-              break;
-            }
-            case 258: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00004000;
-              buildVendorFingerprint_ = bs;
-              break;
-            }
-            case 264: {
-              bitField0_ |= 0x00008000;
-              testType_ = input.readInt32();
-              break;
-            }
-            case 328: {
-              bitField0_ |= 0x00010000;
-              passedTestCaseCount_ = input.readInt32();
-              break;
-            }
-            case 336: {
-              bitField0_ |= 0x00020000;
-              failedTestCaseCount_ = input.readInt32();
-              break;
-            }
-            case 344: {
-              bitField0_ |= 0x00040000;
-              modulesDone_ = input.readInt32();
-              break;
-            }
-            case 352: {
-              bitField0_ |= 0x00080000;
-              modulesTotal_ = input.readInt32();
-              break;
-            }
-            case 410: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00100000;
-              infraLogPath_ = bs;
-              break;
-            }
-            case 418: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              if (!((mutable_bitField0_ & 0x00200000) == 0x00200000)) {
-                repackedImagePath_ = new com.google.protobuf.LazyStringArrayList();
-                mutable_bitField0_ |= 0x00200000;
-              }
-              repackedImagePath_.add(bs);
-              break;
-            }
-            case 490: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00200000;
-              vendorBuildId_ = bs;
-              break;
-            }
-            case 498: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00400000;
-              gsiBuildId_ = bs;
-              break;
-            }
-            case 506: {
-              com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.Builder subBuilder = null;
-              if (((bitField0_ & 0x00800000) == 0x00800000)) {
-                subBuilder = scheduleConfig_.toBuilder();
-              }
-              scheduleConfig_ = input.readMessage(com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.PARSER, extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(scheduleConfig_);
-                scheduleConfig_ = subBuilder.buildPartial();
-              }
-              bitField0_ |= 0x00800000;
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00200000) == 0x00200000)) {
-          repackedImagePath_ = repackedImagePath_.getUnmodifiableView();
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.TestSuiteResultMessageProto.internal_static_android_vts_TestSuiteResultMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.TestSuiteResultMessageProto.internal_static_android_vts_TestSuiteResultMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage.class, com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int ACCESS_TOKEN_FIELD_NUMBER = 1;
-    private volatile java.lang.Object accessToken_;
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    public boolean hasAccessToken() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    public java.lang.String getAccessToken() {
-      java.lang.Object ref = accessToken_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          accessToken_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    public com.google.protobuf.ByteString
-        getAccessTokenBytes() {
-      java.lang.Object ref = accessToken_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        accessToken_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int RESULT_PATH_FIELD_NUMBER = 2;
-    private volatile java.lang.Object resultPath_;
-    /**
-     * <pre>
-     * GCS path to the corresponding result directory
-     * </pre>
-     *
-     * <code>optional string result_path = 2;</code>
-     */
-    public boolean hasResultPath() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <pre>
-     * GCS path to the corresponding result directory
-     * </pre>
-     *
-     * <code>optional string result_path = 2;</code>
-     */
-    public java.lang.String getResultPath() {
-      java.lang.Object ref = resultPath_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          resultPath_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <pre>
-     * GCS path to the corresponding result directory
-     * </pre>
-     *
-     * <code>optional string result_path = 2;</code>
-     */
-    public com.google.protobuf.ByteString
-        getResultPathBytes() {
-      java.lang.Object ref = resultPath_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        resultPath_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int BOOT_SUCCESS_FIELD_NUMBER = 3;
-    private boolean bootSuccess_;
-    /**
-     * <pre>
-     * whether the device(s) booted-up successfully
-     * </pre>
-     *
-     * <code>optional bool boot_success = 3 [default = true];</code>
-     */
-    public boolean hasBootSuccess() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <pre>
-     * whether the device(s) booted-up successfully
-     * </pre>
-     *
-     * <code>optional bool boot_success = 3 [default = true];</code>
-     */
-    public boolean getBootSuccess() {
-      return bootSuccess_;
-    }
-
-    public static final int BRANCH_FIELD_NUMBER = 11;
-    private volatile java.lang.Object branch_;
-    /**
-     * <pre>
-     * test suite build info
-     * </pre>
-     *
-     * <code>required string branch = 11;</code>
-     */
-    public boolean hasBranch() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <pre>
-     * test suite build info
-     * </pre>
-     *
-     * <code>required string branch = 11;</code>
-     */
-    public java.lang.String getBranch() {
-      java.lang.Object ref = branch_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          branch_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <pre>
-     * test suite build info
-     * </pre>
-     *
-     * <code>required string branch = 11;</code>
-     */
-    public com.google.protobuf.ByteString
-        getBranchBytes() {
-      java.lang.Object ref = branch_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        branch_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int TARGET_FIELD_NUMBER = 12;
-    private volatile java.lang.Object target_;
-    /**
-     * <code>required string target = 12;</code>
-     */
-    public boolean hasTarget() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <code>required string target = 12;</code>
-     */
-    public java.lang.String getTarget() {
-      java.lang.Object ref = target_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          target_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <code>required string target = 12;</code>
-     */
-    public com.google.protobuf.ByteString
-        getTargetBytes() {
-      java.lang.Object ref = target_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        target_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int BUILD_ID_FIELD_NUMBER = 13;
-    private volatile java.lang.Object buildId_;
-    /**
-     * <code>required string build_id = 13;</code>
-     */
-    public boolean hasBuildId() {
-      return ((bitField0_ & 0x00000020) == 0x00000020);
-    }
-    /**
-     * <code>required string build_id = 13;</code>
-     */
-    public java.lang.String getBuildId() {
-      java.lang.Object ref = buildId_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          buildId_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <code>required string build_id = 13;</code>
-     */
-    public com.google.protobuf.ByteString
-        getBuildIdBytes() {
-      java.lang.Object ref = buildId_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        buildId_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int SUITE_PLAN_FIELD_NUMBER = 21;
-    private volatile java.lang.Object suitePlan_;
-    /**
-     * <pre>
-     * attributes of Result tag
-     * </pre>
-     *
-     * <code>optional string suite_plan = 21;</code>
-     */
-    public boolean hasSuitePlan() {
-      return ((bitField0_ & 0x00000040) == 0x00000040);
-    }
-    /**
-     * <pre>
-     * attributes of Result tag
-     * </pre>
-     *
-     * <code>optional string suite_plan = 21;</code>
-     */
-    public java.lang.String getSuitePlan() {
-      java.lang.Object ref = suitePlan_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          suitePlan_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <pre>
-     * attributes of Result tag
-     * </pre>
-     *
-     * <code>optional string suite_plan = 21;</code>
-     */
-    public com.google.protobuf.ByteString
-        getSuitePlanBytes() {
-      java.lang.Object ref = suitePlan_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        suitePlan_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int SUITE_VERSION_FIELD_NUMBER = 22;
-    private volatile java.lang.Object suiteVersion_;
-    /**
-     * <code>optional string suite_version = 22;</code>
-     */
-    public boolean hasSuiteVersion() {
-      return ((bitField0_ & 0x00000080) == 0x00000080);
-    }
-    /**
-     * <code>optional string suite_version = 22;</code>
-     */
-    public java.lang.String getSuiteVersion() {
-      java.lang.Object ref = suiteVersion_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          suiteVersion_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <code>optional string suite_version = 22;</code>
-     */
-    public com.google.protobuf.ByteString
-        getSuiteVersionBytes() {
-      java.lang.Object ref = suiteVersion_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        suiteVersion_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int SUITE_BUILD_NUMBER_FIELD_NUMBER = 23;
-    private volatile java.lang.Object suiteBuildNumber_;
-    /**
-     * <code>optional string suite_build_number = 23;</code>
-     */
-    public boolean hasSuiteBuildNumber() {
-      return ((bitField0_ & 0x00000100) == 0x00000100);
-    }
-    /**
-     * <code>optional string suite_build_number = 23;</code>
-     */
-    public java.lang.String getSuiteBuildNumber() {
-      java.lang.Object ref = suiteBuildNumber_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          suiteBuildNumber_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <code>optional string suite_build_number = 23;</code>
-     */
-    public com.google.protobuf.ByteString
-        getSuiteBuildNumberBytes() {
-      java.lang.Object ref = suiteBuildNumber_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        suiteBuildNumber_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int START_TIME_FIELD_NUMBER = 24;
-    private long startTime_;
-    /**
-     * <code>optional int64 start_time = 24;</code>
-     */
-    public boolean hasStartTime() {
-      return ((bitField0_ & 0x00000200) == 0x00000200);
-    }
-    /**
-     * <code>optional int64 start_time = 24;</code>
-     */
-    public long getStartTime() {
-      return startTime_;
-    }
-
-    public static final int END_TIME_FIELD_NUMBER = 25;
-    private long endTime_;
-    /**
-     * <code>optional int64 end_time = 25;</code>
-     */
-    public boolean hasEndTime() {
-      return ((bitField0_ & 0x00000400) == 0x00000400);
-    }
-    /**
-     * <code>optional int64 end_time = 25;</code>
-     */
-    public long getEndTime() {
-      return endTime_;
-    }
-
-    public static final int HOST_NAME_FIELD_NUMBER = 26;
-    private volatile java.lang.Object hostName_;
-    /**
-     * <code>optional string host_name = 26;</code>
-     */
-    public boolean hasHostName() {
-      return ((bitField0_ & 0x00000800) == 0x00000800);
-    }
-    /**
-     * <code>optional string host_name = 26;</code>
-     */
-    public java.lang.String getHostName() {
-      java.lang.Object ref = hostName_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          hostName_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <code>optional string host_name = 26;</code>
-     */
-    public com.google.protobuf.ByteString
-        getHostNameBytes() {
-      java.lang.Object ref = hostName_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        hostName_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int SUITE_NAME_FIELD_NUMBER = 27;
-    private volatile java.lang.Object suiteName_;
-    /**
-     * <code>optional string suite_name = 27;</code>
-     */
-    public boolean hasSuiteName() {
-      return ((bitField0_ & 0x00001000) == 0x00001000);
-    }
-    /**
-     * <code>optional string suite_name = 27;</code>
-     */
-    public java.lang.String getSuiteName() {
-      java.lang.Object ref = suiteName_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          suiteName_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <code>optional string suite_name = 27;</code>
-     */
-    public com.google.protobuf.ByteString
-        getSuiteNameBytes() {
-      java.lang.Object ref = suiteName_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        suiteName_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int BUILD_SYSTEM_FINGERPRINT_FIELD_NUMBER = 31;
-    private volatile java.lang.Object buildSystemFingerprint_;
-    /**
-     * <pre>
-     * attributes of Build tag
-     * </pre>
-     *
-     * <code>optional string build_system_fingerprint = 31;</code>
-     */
-    public boolean hasBuildSystemFingerprint() {
-      return ((bitField0_ & 0x00002000) == 0x00002000);
-    }
-    /**
-     * <pre>
-     * attributes of Build tag
-     * </pre>
-     *
-     * <code>optional string build_system_fingerprint = 31;</code>
-     */
-    public java.lang.String getBuildSystemFingerprint() {
-      java.lang.Object ref = buildSystemFingerprint_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          buildSystemFingerprint_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <pre>
-     * attributes of Build tag
-     * </pre>
-     *
-     * <code>optional string build_system_fingerprint = 31;</code>
-     */
-    public com.google.protobuf.ByteString
-        getBuildSystemFingerprintBytes() {
-      java.lang.Object ref = buildSystemFingerprint_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        buildSystemFingerprint_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int BUILD_VENDOR_FINGERPRINT_FIELD_NUMBER = 32;
-    private volatile java.lang.Object buildVendorFingerprint_;
-    /**
-     * <code>optional string build_vendor_fingerprint = 32;</code>
-     */
-    public boolean hasBuildVendorFingerprint() {
-      return ((bitField0_ & 0x00004000) == 0x00004000);
-    }
-    /**
-     * <code>optional string build_vendor_fingerprint = 32;</code>
-     */
-    public java.lang.String getBuildVendorFingerprint() {
-      java.lang.Object ref = buildVendorFingerprint_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          buildVendorFingerprint_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <code>optional string build_vendor_fingerprint = 32;</code>
-     */
-    public com.google.protobuf.ByteString
-        getBuildVendorFingerprintBytes() {
-      java.lang.Object ref = buildVendorFingerprint_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        buildVendorFingerprint_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int TEST_TYPE_FIELD_NUMBER = 33;
-    private int testType_;
-    /**
-     * <code>optional int32 test_type = 33 [default = 0];</code>
-     */
-    public boolean hasTestType() {
-      return ((bitField0_ & 0x00008000) == 0x00008000);
-    }
-    /**
-     * <code>optional int32 test_type = 33 [default = 0];</code>
-     */
-    public int getTestType() {
-      return testType_;
-    }
-
-    public static final int PASSED_TEST_CASE_COUNT_FIELD_NUMBER = 41;
-    private int passedTestCaseCount_;
-    /**
-     * <pre>
-     * attributes of Summary tag
-     * </pre>
-     *
-     * <code>optional int32 passed_test_case_count = 41;</code>
-     */
-    public boolean hasPassedTestCaseCount() {
-      return ((bitField0_ & 0x00010000) == 0x00010000);
-    }
-    /**
-     * <pre>
-     * attributes of Summary tag
-     * </pre>
-     *
-     * <code>optional int32 passed_test_case_count = 41;</code>
-     */
-    public int getPassedTestCaseCount() {
-      return passedTestCaseCount_;
-    }
-
-    public static final int FAILED_TEST_CASE_COUNT_FIELD_NUMBER = 42;
-    private int failedTestCaseCount_;
-    /**
-     * <code>optional int32 failed_test_case_count = 42;</code>
-     */
-    public boolean hasFailedTestCaseCount() {
-      return ((bitField0_ & 0x00020000) == 0x00020000);
-    }
-    /**
-     * <code>optional int32 failed_test_case_count = 42;</code>
-     */
-    public int getFailedTestCaseCount() {
-      return failedTestCaseCount_;
-    }
-
-    public static final int MODULES_DONE_FIELD_NUMBER = 43;
-    private int modulesDone_;
-    /**
-     * <code>optional int32 modules_done = 43;</code>
-     */
-    public boolean hasModulesDone() {
-      return ((bitField0_ & 0x00040000) == 0x00040000);
-    }
-    /**
-     * <code>optional int32 modules_done = 43;</code>
-     */
-    public int getModulesDone() {
-      return modulesDone_;
-    }
-
-    public static final int MODULES_TOTAL_FIELD_NUMBER = 44;
-    private int modulesTotal_;
-    /**
-     * <code>optional int32 modules_total = 44;</code>
-     */
-    public boolean hasModulesTotal() {
-      return ((bitField0_ & 0x00080000) == 0x00080000);
-    }
-    /**
-     * <code>optional int32 modules_total = 44;</code>
-     */
-    public int getModulesTotal() {
-      return modulesTotal_;
-    }
-
-    public static final int INFRA_LOG_PATH_FIELD_NUMBER = 51;
-    private volatile java.lang.Object infraLogPath_;
-    /**
-     * <pre>
-     * GCS path to the corresponding infra log file.
-     * </pre>
-     *
-     * <code>optional string infra_log_path = 51;</code>
-     */
-    public boolean hasInfraLogPath() {
-      return ((bitField0_ & 0x00100000) == 0x00100000);
-    }
-    /**
-     * <pre>
-     * GCS path to the corresponding infra log file.
-     * </pre>
-     *
-     * <code>optional string infra_log_path = 51;</code>
-     */
-    public java.lang.String getInfraLogPath() {
-      java.lang.Object ref = infraLogPath_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          infraLogPath_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <pre>
-     * GCS path to the corresponding infra log file.
-     * </pre>
-     *
-     * <code>optional string infra_log_path = 51;</code>
-     */
-    public com.google.protobuf.ByteString
-        getInfraLogPathBytes() {
-      java.lang.Object ref = infraLogPath_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        infraLogPath_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int REPACKED_IMAGE_PATH_FIELD_NUMBER = 52;
-    private com.google.protobuf.LazyStringList repackedImagePath_;
-    /**
-     * <pre>
-     * GCS path to the repacked device[+GSI] image set.
-     * </pre>
-     *
-     * <code>repeated string repacked_image_path = 52;</code>
-     */
-    public com.google.protobuf.ProtocolStringList
-        getRepackedImagePathList() {
-      return repackedImagePath_;
-    }
-    /**
-     * <pre>
-     * GCS path to the repacked device[+GSI] image set.
-     * </pre>
-     *
-     * <code>repeated string repacked_image_path = 52;</code>
-     */
-    public int getRepackedImagePathCount() {
-      return repackedImagePath_.size();
-    }
-    /**
-     * <pre>
-     * GCS path to the repacked device[+GSI] image set.
-     * </pre>
-     *
-     * <code>repeated string repacked_image_path = 52;</code>
-     */
-    public java.lang.String getRepackedImagePath(int index) {
-      return repackedImagePath_.get(index);
-    }
-    /**
-     * <pre>
-     * GCS path to the repacked device[+GSI] image set.
-     * </pre>
-     *
-     * <code>repeated string repacked_image_path = 52;</code>
-     */
-    public com.google.protobuf.ByteString
-        getRepackedImagePathBytes(int index) {
-      return repackedImagePath_.getByteString(index);
-    }
-
-    public static final int VENDOR_BUILD_ID_FIELD_NUMBER = 61;
-    private volatile java.lang.Object vendorBuildId_;
-    /**
-     * <pre>
-     * Fetch info used to fetch and flash certain builds for retry_prompt command.
-     * </pre>
-     *
-     * <code>optional string vendor_build_id = 61;</code>
-     */
-    public boolean hasVendorBuildId() {
-      return ((bitField0_ & 0x00200000) == 0x00200000);
-    }
-    /**
-     * <pre>
-     * Fetch info used to fetch and flash certain builds for retry_prompt command.
-     * </pre>
-     *
-     * <code>optional string vendor_build_id = 61;</code>
-     */
-    public java.lang.String getVendorBuildId() {
-      java.lang.Object ref = vendorBuildId_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          vendorBuildId_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <pre>
-     * Fetch info used to fetch and flash certain builds for retry_prompt command.
-     * </pre>
-     *
-     * <code>optional string vendor_build_id = 61;</code>
-     */
-    public com.google.protobuf.ByteString
-        getVendorBuildIdBytes() {
-      java.lang.Object ref = vendorBuildId_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        vendorBuildId_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int GSI_BUILD_ID_FIELD_NUMBER = 62;
-    private volatile java.lang.Object gsiBuildId_;
-    /**
-     * <code>optional string gsi_build_id = 62;</code>
-     */
-    public boolean hasGsiBuildId() {
-      return ((bitField0_ & 0x00400000) == 0x00400000);
-    }
-    /**
-     * <code>optional string gsi_build_id = 62;</code>
-     */
-    public java.lang.String getGsiBuildId() {
-      java.lang.Object ref = gsiBuildId_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          gsiBuildId_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <code>optional string gsi_build_id = 62;</code>
-     */
-    public com.google.protobuf.ByteString
-        getGsiBuildIdBytes() {
-      java.lang.Object ref = gsiBuildId_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        gsiBuildId_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int SCHEDULE_CONFIG_FIELD_NUMBER = 63;
-    private com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage scheduleConfig_;
-    /**
-     * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public boolean hasScheduleConfig() {
-      return ((bitField0_ & 0x00800000) == 0x00800000);
-    }
-    /**
-     * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage getScheduleConfig() {
-      return scheduleConfig_ == null ? com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.getDefaultInstance() : scheduleConfig_;
-    }
-    /**
-     * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessageOrBuilder getScheduleConfigOrBuilder() {
-      return scheduleConfig_ == null ? com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.getDefaultInstance() : scheduleConfig_;
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      if (!hasBranch()) {
-        memoizedIsInitialized = 0;
-        return false;
-      }
-      if (!hasTarget()) {
-        memoizedIsInitialized = 0;
-        return false;
-      }
-      if (!hasBuildId()) {
-        memoizedIsInitialized = 0;
-        return false;
-      }
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, accessToken_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, resultPath_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBool(3, bootSuccess_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 11, branch_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 12, target_);
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 13, buildId_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 21, suitePlan_);
-      }
-      if (((bitField0_ & 0x00000080) == 0x00000080)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 22, suiteVersion_);
-      }
-      if (((bitField0_ & 0x00000100) == 0x00000100)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 23, suiteBuildNumber_);
-      }
-      if (((bitField0_ & 0x00000200) == 0x00000200)) {
-        output.writeInt64(24, startTime_);
-      }
-      if (((bitField0_ & 0x00000400) == 0x00000400)) {
-        output.writeInt64(25, endTime_);
-      }
-      if (((bitField0_ & 0x00000800) == 0x00000800)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 26, hostName_);
-      }
-      if (((bitField0_ & 0x00001000) == 0x00001000)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 27, suiteName_);
-      }
-      if (((bitField0_ & 0x00002000) == 0x00002000)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 31, buildSystemFingerprint_);
-      }
-      if (((bitField0_ & 0x00004000) == 0x00004000)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 32, buildVendorFingerprint_);
-      }
-      if (((bitField0_ & 0x00008000) == 0x00008000)) {
-        output.writeInt32(33, testType_);
-      }
-      if (((bitField0_ & 0x00010000) == 0x00010000)) {
-        output.writeInt32(41, passedTestCaseCount_);
-      }
-      if (((bitField0_ & 0x00020000) == 0x00020000)) {
-        output.writeInt32(42, failedTestCaseCount_);
-      }
-      if (((bitField0_ & 0x00040000) == 0x00040000)) {
-        output.writeInt32(43, modulesDone_);
-      }
-      if (((bitField0_ & 0x00080000) == 0x00080000)) {
-        output.writeInt32(44, modulesTotal_);
-      }
-      if (((bitField0_ & 0x00100000) == 0x00100000)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 51, infraLogPath_);
-      }
-      for (int i = 0; i < repackedImagePath_.size(); i++) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 52, repackedImagePath_.getRaw(i));
-      }
-      if (((bitField0_ & 0x00200000) == 0x00200000)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 61, vendorBuildId_);
-      }
-      if (((bitField0_ & 0x00400000) == 0x00400000)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 62, gsiBuildId_);
-      }
-      if (((bitField0_ & 0x00800000) == 0x00800000)) {
-        output.writeMessage(63, getScheduleConfig());
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, accessToken_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, resultPath_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBoolSize(3, bootSuccess_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(11, branch_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(12, target_);
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, buildId_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(21, suitePlan_);
-      }
-      if (((bitField0_ & 0x00000080) == 0x00000080)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(22, suiteVersion_);
-      }
-      if (((bitField0_ & 0x00000100) == 0x00000100)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(23, suiteBuildNumber_);
-      }
-      if (((bitField0_ & 0x00000200) == 0x00000200)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(24, startTime_);
-      }
-      if (((bitField0_ & 0x00000400) == 0x00000400)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(25, endTime_);
-      }
-      if (((bitField0_ & 0x00000800) == 0x00000800)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(26, hostName_);
-      }
-      if (((bitField0_ & 0x00001000) == 0x00001000)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(27, suiteName_);
-      }
-      if (((bitField0_ & 0x00002000) == 0x00002000)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(31, buildSystemFingerprint_);
-      }
-      if (((bitField0_ & 0x00004000) == 0x00004000)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(32, buildVendorFingerprint_);
-      }
-      if (((bitField0_ & 0x00008000) == 0x00008000)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(33, testType_);
-      }
-      if (((bitField0_ & 0x00010000) == 0x00010000)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(41, passedTestCaseCount_);
-      }
-      if (((bitField0_ & 0x00020000) == 0x00020000)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(42, failedTestCaseCount_);
-      }
-      if (((bitField0_ & 0x00040000) == 0x00040000)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(43, modulesDone_);
-      }
-      if (((bitField0_ & 0x00080000) == 0x00080000)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(44, modulesTotal_);
-      }
-      if (((bitField0_ & 0x00100000) == 0x00100000)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(51, infraLogPath_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < repackedImagePath_.size(); i++) {
-          dataSize += computeStringSizeNoTag(repackedImagePath_.getRaw(i));
-        }
-        size += dataSize;
-        size += 2 * getRepackedImagePathList().size();
-      }
-      if (((bitField0_ & 0x00200000) == 0x00200000)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(61, vendorBuildId_);
-      }
-      if (((bitField0_ & 0x00400000) == 0x00400000)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(62, gsiBuildId_);
-      }
-      if (((bitField0_ & 0x00800000) == 0x00800000)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(63, getScheduleConfig());
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage other = (com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage) obj;
-
-      boolean result = true;
-      result = result && (hasAccessToken() == other.hasAccessToken());
-      if (hasAccessToken()) {
-        result = result && getAccessToken()
-            .equals(other.getAccessToken());
-      }
-      result = result && (hasResultPath() == other.hasResultPath());
-      if (hasResultPath()) {
-        result = result && getResultPath()
-            .equals(other.getResultPath());
-      }
-      result = result && (hasBootSuccess() == other.hasBootSuccess());
-      if (hasBootSuccess()) {
-        result = result && (getBootSuccess()
-            == other.getBootSuccess());
-      }
-      result = result && (hasBranch() == other.hasBranch());
-      if (hasBranch()) {
-        result = result && getBranch()
-            .equals(other.getBranch());
-      }
-      result = result && (hasTarget() == other.hasTarget());
-      if (hasTarget()) {
-        result = result && getTarget()
-            .equals(other.getTarget());
-      }
-      result = result && (hasBuildId() == other.hasBuildId());
-      if (hasBuildId()) {
-        result = result && getBuildId()
-            .equals(other.getBuildId());
-      }
-      result = result && (hasSuitePlan() == other.hasSuitePlan());
-      if (hasSuitePlan()) {
-        result = result && getSuitePlan()
-            .equals(other.getSuitePlan());
-      }
-      result = result && (hasSuiteVersion() == other.hasSuiteVersion());
-      if (hasSuiteVersion()) {
-        result = result && getSuiteVersion()
-            .equals(other.getSuiteVersion());
-      }
-      result = result && (hasSuiteBuildNumber() == other.hasSuiteBuildNumber());
-      if (hasSuiteBuildNumber()) {
-        result = result && getSuiteBuildNumber()
-            .equals(other.getSuiteBuildNumber());
-      }
-      result = result && (hasStartTime() == other.hasStartTime());
-      if (hasStartTime()) {
-        result = result && (getStartTime()
-            == other.getStartTime());
-      }
-      result = result && (hasEndTime() == other.hasEndTime());
-      if (hasEndTime()) {
-        result = result && (getEndTime()
-            == other.getEndTime());
-      }
-      result = result && (hasHostName() == other.hasHostName());
-      if (hasHostName()) {
-        result = result && getHostName()
-            .equals(other.getHostName());
-      }
-      result = result && (hasSuiteName() == other.hasSuiteName());
-      if (hasSuiteName()) {
-        result = result && getSuiteName()
-            .equals(other.getSuiteName());
-      }
-      result = result && (hasBuildSystemFingerprint() == other.hasBuildSystemFingerprint());
-      if (hasBuildSystemFingerprint()) {
-        result = result && getBuildSystemFingerprint()
-            .equals(other.getBuildSystemFingerprint());
-      }
-      result = result && (hasBuildVendorFingerprint() == other.hasBuildVendorFingerprint());
-      if (hasBuildVendorFingerprint()) {
-        result = result && getBuildVendorFingerprint()
-            .equals(other.getBuildVendorFingerprint());
-      }
-      result = result && (hasTestType() == other.hasTestType());
-      if (hasTestType()) {
-        result = result && (getTestType()
-            == other.getTestType());
-      }
-      result = result && (hasPassedTestCaseCount() == other.hasPassedTestCaseCount());
-      if (hasPassedTestCaseCount()) {
-        result = result && (getPassedTestCaseCount()
-            == other.getPassedTestCaseCount());
-      }
-      result = result && (hasFailedTestCaseCount() == other.hasFailedTestCaseCount());
-      if (hasFailedTestCaseCount()) {
-        result = result && (getFailedTestCaseCount()
-            == other.getFailedTestCaseCount());
-      }
-      result = result && (hasModulesDone() == other.hasModulesDone());
-      if (hasModulesDone()) {
-        result = result && (getModulesDone()
-            == other.getModulesDone());
-      }
-      result = result && (hasModulesTotal() == other.hasModulesTotal());
-      if (hasModulesTotal()) {
-        result = result && (getModulesTotal()
-            == other.getModulesTotal());
-      }
-      result = result && (hasInfraLogPath() == other.hasInfraLogPath());
-      if (hasInfraLogPath()) {
-        result = result && getInfraLogPath()
-            .equals(other.getInfraLogPath());
-      }
-      result = result && getRepackedImagePathList()
-          .equals(other.getRepackedImagePathList());
-      result = result && (hasVendorBuildId() == other.hasVendorBuildId());
-      if (hasVendorBuildId()) {
-        result = result && getVendorBuildId()
-            .equals(other.getVendorBuildId());
-      }
-      result = result && (hasGsiBuildId() == other.hasGsiBuildId());
-      if (hasGsiBuildId()) {
-        result = result && getGsiBuildId()
-            .equals(other.getGsiBuildId());
-      }
-      result = result && (hasScheduleConfig() == other.hasScheduleConfig());
-      if (hasScheduleConfig()) {
-        result = result && getScheduleConfig()
-            .equals(other.getScheduleConfig());
-      }
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasAccessToken()) {
-        hash = (37 * hash) + ACCESS_TOKEN_FIELD_NUMBER;
-        hash = (53 * hash) + getAccessToken().hashCode();
-      }
-      if (hasResultPath()) {
-        hash = (37 * hash) + RESULT_PATH_FIELD_NUMBER;
-        hash = (53 * hash) + getResultPath().hashCode();
-      }
-      if (hasBootSuccess()) {
-        hash = (37 * hash) + BOOT_SUCCESS_FIELD_NUMBER;
-        hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
-            getBootSuccess());
-      }
-      if (hasBranch()) {
-        hash = (37 * hash) + BRANCH_FIELD_NUMBER;
-        hash = (53 * hash) + getBranch().hashCode();
-      }
-      if (hasTarget()) {
-        hash = (37 * hash) + TARGET_FIELD_NUMBER;
-        hash = (53 * hash) + getTarget().hashCode();
-      }
-      if (hasBuildId()) {
-        hash = (37 * hash) + BUILD_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getBuildId().hashCode();
-      }
-      if (hasSuitePlan()) {
-        hash = (37 * hash) + SUITE_PLAN_FIELD_NUMBER;
-        hash = (53 * hash) + getSuitePlan().hashCode();
-      }
-      if (hasSuiteVersion()) {
-        hash = (37 * hash) + SUITE_VERSION_FIELD_NUMBER;
-        hash = (53 * hash) + getSuiteVersion().hashCode();
-      }
-      if (hasSuiteBuildNumber()) {
-        hash = (37 * hash) + SUITE_BUILD_NUMBER_FIELD_NUMBER;
-        hash = (53 * hash) + getSuiteBuildNumber().hashCode();
-      }
-      if (hasStartTime()) {
-        hash = (37 * hash) + START_TIME_FIELD_NUMBER;
-        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
-            getStartTime());
-      }
-      if (hasEndTime()) {
-        hash = (37 * hash) + END_TIME_FIELD_NUMBER;
-        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
-            getEndTime());
-      }
-      if (hasHostName()) {
-        hash = (37 * hash) + HOST_NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getHostName().hashCode();
-      }
-      if (hasSuiteName()) {
-        hash = (37 * hash) + SUITE_NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getSuiteName().hashCode();
-      }
-      if (hasBuildSystemFingerprint()) {
-        hash = (37 * hash) + BUILD_SYSTEM_FINGERPRINT_FIELD_NUMBER;
-        hash = (53 * hash) + getBuildSystemFingerprint().hashCode();
-      }
-      if (hasBuildVendorFingerprint()) {
-        hash = (37 * hash) + BUILD_VENDOR_FINGERPRINT_FIELD_NUMBER;
-        hash = (53 * hash) + getBuildVendorFingerprint().hashCode();
-      }
-      if (hasTestType()) {
-        hash = (37 * hash) + TEST_TYPE_FIELD_NUMBER;
-        hash = (53 * hash) + getTestType();
-      }
-      if (hasPassedTestCaseCount()) {
-        hash = (37 * hash) + PASSED_TEST_CASE_COUNT_FIELD_NUMBER;
-        hash = (53 * hash) + getPassedTestCaseCount();
-      }
-      if (hasFailedTestCaseCount()) {
-        hash = (37 * hash) + FAILED_TEST_CASE_COUNT_FIELD_NUMBER;
-        hash = (53 * hash) + getFailedTestCaseCount();
-      }
-      if (hasModulesDone()) {
-        hash = (37 * hash) + MODULES_DONE_FIELD_NUMBER;
-        hash = (53 * hash) + getModulesDone();
-      }
-      if (hasModulesTotal()) {
-        hash = (37 * hash) + MODULES_TOTAL_FIELD_NUMBER;
-        hash = (53 * hash) + getModulesTotal();
-      }
-      if (hasInfraLogPath()) {
-        hash = (37 * hash) + INFRA_LOG_PATH_FIELD_NUMBER;
-        hash = (53 * hash) + getInfraLogPath().hashCode();
-      }
-      if (getRepackedImagePathCount() > 0) {
-        hash = (37 * hash) + REPACKED_IMAGE_PATH_FIELD_NUMBER;
-        hash = (53 * hash) + getRepackedImagePathList().hashCode();
-      }
-      if (hasVendorBuildId()) {
-        hash = (37 * hash) + VENDOR_BUILD_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getVendorBuildId().hashCode();
-      }
-      if (hasGsiBuildId()) {
-        hash = (37 * hash) + GSI_BUILD_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getGsiBuildId().hashCode();
-      }
-      if (hasScheduleConfig()) {
-        hash = (37 * hash) + SCHEDULE_CONFIG_FIELD_NUMBER;
-        hash = (53 * hash) + getScheduleConfig().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify the test results which are uploaded to vts dashboard.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.TestSuiteResultMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.TestSuiteResultMessage)
-        com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.TestSuiteResultMessageProto.internal_static_android_vts_TestSuiteResultMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.TestSuiteResultMessageProto.internal_static_android_vts_TestSuiteResultMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage.class, com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-          getScheduleConfigFieldBuilder();
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        accessToken_ = "";
-        bitField0_ = (bitField0_ & ~0x00000001);
-        resultPath_ = "";
-        bitField0_ = (bitField0_ & ~0x00000002);
-        bootSuccess_ = true;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        branch_ = "";
-        bitField0_ = (bitField0_ & ~0x00000008);
-        target_ = "";
-        bitField0_ = (bitField0_ & ~0x00000010);
-        buildId_ = "";
-        bitField0_ = (bitField0_ & ~0x00000020);
-        suitePlan_ = "";
-        bitField0_ = (bitField0_ & ~0x00000040);
-        suiteVersion_ = "";
-        bitField0_ = (bitField0_ & ~0x00000080);
-        suiteBuildNumber_ = "";
-        bitField0_ = (bitField0_ & ~0x00000100);
-        startTime_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000200);
-        endTime_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000400);
-        hostName_ = "";
-        bitField0_ = (bitField0_ & ~0x00000800);
-        suiteName_ = "";
-        bitField0_ = (bitField0_ & ~0x00001000);
-        buildSystemFingerprint_ = "";
-        bitField0_ = (bitField0_ & ~0x00002000);
-        buildVendorFingerprint_ = "";
-        bitField0_ = (bitField0_ & ~0x00004000);
-        testType_ = 0;
-        bitField0_ = (bitField0_ & ~0x00008000);
-        passedTestCaseCount_ = 0;
-        bitField0_ = (bitField0_ & ~0x00010000);
-        failedTestCaseCount_ = 0;
-        bitField0_ = (bitField0_ & ~0x00020000);
-        modulesDone_ = 0;
-        bitField0_ = (bitField0_ & ~0x00040000);
-        modulesTotal_ = 0;
-        bitField0_ = (bitField0_ & ~0x00080000);
-        infraLogPath_ = "";
-        bitField0_ = (bitField0_ & ~0x00100000);
-        repackedImagePath_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00200000);
-        vendorBuildId_ = "";
-        bitField0_ = (bitField0_ & ~0x00400000);
-        gsiBuildId_ = "";
-        bitField0_ = (bitField0_ & ~0x00800000);
-        if (scheduleConfigBuilder_ == null) {
-          scheduleConfig_ = null;
-        } else {
-          scheduleConfigBuilder_.clear();
-        }
-        bitField0_ = (bitField0_ & ~0x01000000);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.TestSuiteResultMessageProto.internal_static_android_vts_TestSuiteResultMessage_descriptor;
-      }
-
-      public com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage build() {
-        com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage buildPartial() {
-        com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage result = new com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.accessToken_ = accessToken_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.resultPath_ = resultPath_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.bootSuccess_ = bootSuccess_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.branch_ = branch_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        result.target_ = target_;
-        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
-          to_bitField0_ |= 0x00000020;
-        }
-        result.buildId_ = buildId_;
-        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
-          to_bitField0_ |= 0x00000040;
-        }
-        result.suitePlan_ = suitePlan_;
-        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
-          to_bitField0_ |= 0x00000080;
-        }
-        result.suiteVersion_ = suiteVersion_;
-        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
-          to_bitField0_ |= 0x00000100;
-        }
-        result.suiteBuildNumber_ = suiteBuildNumber_;
-        if (((from_bitField0_ & 0x00000200) == 0x00000200)) {
-          to_bitField0_ |= 0x00000200;
-        }
-        result.startTime_ = startTime_;
-        if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
-          to_bitField0_ |= 0x00000400;
-        }
-        result.endTime_ = endTime_;
-        if (((from_bitField0_ & 0x00000800) == 0x00000800)) {
-          to_bitField0_ |= 0x00000800;
-        }
-        result.hostName_ = hostName_;
-        if (((from_bitField0_ & 0x00001000) == 0x00001000)) {
-          to_bitField0_ |= 0x00001000;
-        }
-        result.suiteName_ = suiteName_;
-        if (((from_bitField0_ & 0x00002000) == 0x00002000)) {
-          to_bitField0_ |= 0x00002000;
-        }
-        result.buildSystemFingerprint_ = buildSystemFingerprint_;
-        if (((from_bitField0_ & 0x00004000) == 0x00004000)) {
-          to_bitField0_ |= 0x00004000;
-        }
-        result.buildVendorFingerprint_ = buildVendorFingerprint_;
-        if (((from_bitField0_ & 0x00008000) == 0x00008000)) {
-          to_bitField0_ |= 0x00008000;
-        }
-        result.testType_ = testType_;
-        if (((from_bitField0_ & 0x00010000) == 0x00010000)) {
-          to_bitField0_ |= 0x00010000;
-        }
-        result.passedTestCaseCount_ = passedTestCaseCount_;
-        if (((from_bitField0_ & 0x00020000) == 0x00020000)) {
-          to_bitField0_ |= 0x00020000;
-        }
-        result.failedTestCaseCount_ = failedTestCaseCount_;
-        if (((from_bitField0_ & 0x00040000) == 0x00040000)) {
-          to_bitField0_ |= 0x00040000;
-        }
-        result.modulesDone_ = modulesDone_;
-        if (((from_bitField0_ & 0x00080000) == 0x00080000)) {
-          to_bitField0_ |= 0x00080000;
-        }
-        result.modulesTotal_ = modulesTotal_;
-        if (((from_bitField0_ & 0x00100000) == 0x00100000)) {
-          to_bitField0_ |= 0x00100000;
-        }
-        result.infraLogPath_ = infraLogPath_;
-        if (((bitField0_ & 0x00200000) == 0x00200000)) {
-          repackedImagePath_ = repackedImagePath_.getUnmodifiableView();
-          bitField0_ = (bitField0_ & ~0x00200000);
-        }
-        result.repackedImagePath_ = repackedImagePath_;
-        if (((from_bitField0_ & 0x00400000) == 0x00400000)) {
-          to_bitField0_ |= 0x00200000;
-        }
-        result.vendorBuildId_ = vendorBuildId_;
-        if (((from_bitField0_ & 0x00800000) == 0x00800000)) {
-          to_bitField0_ |= 0x00400000;
-        }
-        result.gsiBuildId_ = gsiBuildId_;
-        if (((from_bitField0_ & 0x01000000) == 0x01000000)) {
-          to_bitField0_ |= 0x00800000;
-        }
-        if (scheduleConfigBuilder_ == null) {
-          result.scheduleConfig_ = scheduleConfig_;
-        } else {
-          result.scheduleConfig_ = scheduleConfigBuilder_.build();
-        }
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage) {
-          return mergeFrom((com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage other) {
-        if (other == com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage.getDefaultInstance()) return this;
-        if (other.hasAccessToken()) {
-          bitField0_ |= 0x00000001;
-          accessToken_ = other.accessToken_;
-          onChanged();
-        }
-        if (other.hasResultPath()) {
-          bitField0_ |= 0x00000002;
-          resultPath_ = other.resultPath_;
-          onChanged();
-        }
-        if (other.hasBootSuccess()) {
-          setBootSuccess(other.getBootSuccess());
-        }
-        if (other.hasBranch()) {
-          bitField0_ |= 0x00000008;
-          branch_ = other.branch_;
-          onChanged();
-        }
-        if (other.hasTarget()) {
-          bitField0_ |= 0x00000010;
-          target_ = other.target_;
-          onChanged();
-        }
-        if (other.hasBuildId()) {
-          bitField0_ |= 0x00000020;
-          buildId_ = other.buildId_;
-          onChanged();
-        }
-        if (other.hasSuitePlan()) {
-          bitField0_ |= 0x00000040;
-          suitePlan_ = other.suitePlan_;
-          onChanged();
-        }
-        if (other.hasSuiteVersion()) {
-          bitField0_ |= 0x00000080;
-          suiteVersion_ = other.suiteVersion_;
-          onChanged();
-        }
-        if (other.hasSuiteBuildNumber()) {
-          bitField0_ |= 0x00000100;
-          suiteBuildNumber_ = other.suiteBuildNumber_;
-          onChanged();
-        }
-        if (other.hasStartTime()) {
-          setStartTime(other.getStartTime());
-        }
-        if (other.hasEndTime()) {
-          setEndTime(other.getEndTime());
-        }
-        if (other.hasHostName()) {
-          bitField0_ |= 0x00000800;
-          hostName_ = other.hostName_;
-          onChanged();
-        }
-        if (other.hasSuiteName()) {
-          bitField0_ |= 0x00001000;
-          suiteName_ = other.suiteName_;
-          onChanged();
-        }
-        if (other.hasBuildSystemFingerprint()) {
-          bitField0_ |= 0x00002000;
-          buildSystemFingerprint_ = other.buildSystemFingerprint_;
-          onChanged();
-        }
-        if (other.hasBuildVendorFingerprint()) {
-          bitField0_ |= 0x00004000;
-          buildVendorFingerprint_ = other.buildVendorFingerprint_;
-          onChanged();
-        }
-        if (other.hasTestType()) {
-          setTestType(other.getTestType());
-        }
-        if (other.hasPassedTestCaseCount()) {
-          setPassedTestCaseCount(other.getPassedTestCaseCount());
-        }
-        if (other.hasFailedTestCaseCount()) {
-          setFailedTestCaseCount(other.getFailedTestCaseCount());
-        }
-        if (other.hasModulesDone()) {
-          setModulesDone(other.getModulesDone());
-        }
-        if (other.hasModulesTotal()) {
-          setModulesTotal(other.getModulesTotal());
-        }
-        if (other.hasInfraLogPath()) {
-          bitField0_ |= 0x00100000;
-          infraLogPath_ = other.infraLogPath_;
-          onChanged();
-        }
-        if (!other.repackedImagePath_.isEmpty()) {
-          if (repackedImagePath_.isEmpty()) {
-            repackedImagePath_ = other.repackedImagePath_;
-            bitField0_ = (bitField0_ & ~0x00200000);
-          } else {
-            ensureRepackedImagePathIsMutable();
-            repackedImagePath_.addAll(other.repackedImagePath_);
-          }
-          onChanged();
-        }
-        if (other.hasVendorBuildId()) {
-          bitField0_ |= 0x00400000;
-          vendorBuildId_ = other.vendorBuildId_;
-          onChanged();
-        }
-        if (other.hasGsiBuildId()) {
-          bitField0_ |= 0x00800000;
-          gsiBuildId_ = other.gsiBuildId_;
-          onChanged();
-        }
-        if (other.hasScheduleConfig()) {
-          mergeScheduleConfig(other.getScheduleConfig());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        if (!hasBranch()) {
-          return false;
-        }
-        if (!hasTarget()) {
-          return false;
-        }
-        if (!hasBuildId()) {
-          return false;
-        }
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private java.lang.Object accessToken_ = "";
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public boolean hasAccessToken() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public java.lang.String getAccessToken() {
-        java.lang.Object ref = accessToken_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            accessToken_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public com.google.protobuf.ByteString
-          getAccessTokenBytes() {
-        java.lang.Object ref = accessToken_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          accessToken_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public Builder setAccessToken(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        accessToken_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public Builder clearAccessToken() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        accessToken_ = getDefaultInstance().getAccessToken();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public Builder setAccessTokenBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        accessToken_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object resultPath_ = "";
-      /**
-       * <pre>
-       * GCS path to the corresponding result directory
-       * </pre>
-       *
-       * <code>optional string result_path = 2;</code>
-       */
-      public boolean hasResultPath() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <pre>
-       * GCS path to the corresponding result directory
-       * </pre>
-       *
-       * <code>optional string result_path = 2;</code>
-       */
-      public java.lang.String getResultPath() {
-        java.lang.Object ref = resultPath_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            resultPath_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <pre>
-       * GCS path to the corresponding result directory
-       * </pre>
-       *
-       * <code>optional string result_path = 2;</code>
-       */
-      public com.google.protobuf.ByteString
-          getResultPathBytes() {
-        java.lang.Object ref = resultPath_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          resultPath_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <pre>
-       * GCS path to the corresponding result directory
-       * </pre>
-       *
-       * <code>optional string result_path = 2;</code>
-       */
-      public Builder setResultPath(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        resultPath_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * GCS path to the corresponding result directory
-       * </pre>
-       *
-       * <code>optional string result_path = 2;</code>
-       */
-      public Builder clearResultPath() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        resultPath_ = getDefaultInstance().getResultPath();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * GCS path to the corresponding result directory
-       * </pre>
-       *
-       * <code>optional string result_path = 2;</code>
-       */
-      public Builder setResultPathBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        resultPath_ = value;
-        onChanged();
-        return this;
-      }
-
-      private boolean bootSuccess_ = true;
-      /**
-       * <pre>
-       * whether the device(s) booted-up successfully
-       * </pre>
-       *
-       * <code>optional bool boot_success = 3 [default = true];</code>
-       */
-      public boolean hasBootSuccess() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <pre>
-       * whether the device(s) booted-up successfully
-       * </pre>
-       *
-       * <code>optional bool boot_success = 3 [default = true];</code>
-       */
-      public boolean getBootSuccess() {
-        return bootSuccess_;
-      }
-      /**
-       * <pre>
-       * whether the device(s) booted-up successfully
-       * </pre>
-       *
-       * <code>optional bool boot_success = 3 [default = true];</code>
-       */
-      public Builder setBootSuccess(boolean value) {
-        bitField0_ |= 0x00000004;
-        bootSuccess_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * whether the device(s) booted-up successfully
-       * </pre>
-       *
-       * <code>optional bool boot_success = 3 [default = true];</code>
-       */
-      public Builder clearBootSuccess() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        bootSuccess_ = true;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object branch_ = "";
-      /**
-       * <pre>
-       * test suite build info
-       * </pre>
-       *
-       * <code>required string branch = 11;</code>
-       */
-      public boolean hasBranch() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <pre>
-       * test suite build info
-       * </pre>
-       *
-       * <code>required string branch = 11;</code>
-       */
-      public java.lang.String getBranch() {
-        java.lang.Object ref = branch_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            branch_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <pre>
-       * test suite build info
-       * </pre>
-       *
-       * <code>required string branch = 11;</code>
-       */
-      public com.google.protobuf.ByteString
-          getBranchBytes() {
-        java.lang.Object ref = branch_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          branch_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <pre>
-       * test suite build info
-       * </pre>
-       *
-       * <code>required string branch = 11;</code>
-       */
-      public Builder setBranch(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000008;
-        branch_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * test suite build info
-       * </pre>
-       *
-       * <code>required string branch = 11;</code>
-       */
-      public Builder clearBranch() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        branch_ = getDefaultInstance().getBranch();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * test suite build info
-       * </pre>
-       *
-       * <code>required string branch = 11;</code>
-       */
-      public Builder setBranchBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000008;
-        branch_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object target_ = "";
-      /**
-       * <code>required string target = 12;</code>
-       */
-      public boolean hasTarget() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <code>required string target = 12;</code>
-       */
-      public java.lang.String getTarget() {
-        java.lang.Object ref = target_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            target_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>required string target = 12;</code>
-       */
-      public com.google.protobuf.ByteString
-          getTargetBytes() {
-        java.lang.Object ref = target_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          target_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>required string target = 12;</code>
-       */
-      public Builder setTarget(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000010;
-        target_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>required string target = 12;</code>
-       */
-      public Builder clearTarget() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        target_ = getDefaultInstance().getTarget();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>required string target = 12;</code>
-       */
-      public Builder setTargetBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000010;
-        target_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object buildId_ = "";
-      /**
-       * <code>required string build_id = 13;</code>
-       */
-      public boolean hasBuildId() {
-        return ((bitField0_ & 0x00000020) == 0x00000020);
-      }
-      /**
-       * <code>required string build_id = 13;</code>
-       */
-      public java.lang.String getBuildId() {
-        java.lang.Object ref = buildId_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            buildId_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>required string build_id = 13;</code>
-       */
-      public com.google.protobuf.ByteString
-          getBuildIdBytes() {
-        java.lang.Object ref = buildId_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          buildId_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>required string build_id = 13;</code>
-       */
-      public Builder setBuildId(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000020;
-        buildId_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>required string build_id = 13;</code>
-       */
-      public Builder clearBuildId() {
-        bitField0_ = (bitField0_ & ~0x00000020);
-        buildId_ = getDefaultInstance().getBuildId();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>required string build_id = 13;</code>
-       */
-      public Builder setBuildIdBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000020;
-        buildId_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object suitePlan_ = "";
-      /**
-       * <pre>
-       * attributes of Result tag
-       * </pre>
-       *
-       * <code>optional string suite_plan = 21;</code>
-       */
-      public boolean hasSuitePlan() {
-        return ((bitField0_ & 0x00000040) == 0x00000040);
-      }
-      /**
-       * <pre>
-       * attributes of Result tag
-       * </pre>
-       *
-       * <code>optional string suite_plan = 21;</code>
-       */
-      public java.lang.String getSuitePlan() {
-        java.lang.Object ref = suitePlan_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            suitePlan_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <pre>
-       * attributes of Result tag
-       * </pre>
-       *
-       * <code>optional string suite_plan = 21;</code>
-       */
-      public com.google.protobuf.ByteString
-          getSuitePlanBytes() {
-        java.lang.Object ref = suitePlan_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          suitePlan_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <pre>
-       * attributes of Result tag
-       * </pre>
-       *
-       * <code>optional string suite_plan = 21;</code>
-       */
-      public Builder setSuitePlan(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000040;
-        suitePlan_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * attributes of Result tag
-       * </pre>
-       *
-       * <code>optional string suite_plan = 21;</code>
-       */
-      public Builder clearSuitePlan() {
-        bitField0_ = (bitField0_ & ~0x00000040);
-        suitePlan_ = getDefaultInstance().getSuitePlan();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * attributes of Result tag
-       * </pre>
-       *
-       * <code>optional string suite_plan = 21;</code>
-       */
-      public Builder setSuitePlanBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000040;
-        suitePlan_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object suiteVersion_ = "";
-      /**
-       * <code>optional string suite_version = 22;</code>
-       */
-      public boolean hasSuiteVersion() {
-        return ((bitField0_ & 0x00000080) == 0x00000080);
-      }
-      /**
-       * <code>optional string suite_version = 22;</code>
-       */
-      public java.lang.String getSuiteVersion() {
-        java.lang.Object ref = suiteVersion_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            suiteVersion_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>optional string suite_version = 22;</code>
-       */
-      public com.google.protobuf.ByteString
-          getSuiteVersionBytes() {
-        java.lang.Object ref = suiteVersion_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          suiteVersion_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>optional string suite_version = 22;</code>
-       */
-      public Builder setSuiteVersion(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000080;
-        suiteVersion_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string suite_version = 22;</code>
-       */
-      public Builder clearSuiteVersion() {
-        bitField0_ = (bitField0_ & ~0x00000080);
-        suiteVersion_ = getDefaultInstance().getSuiteVersion();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string suite_version = 22;</code>
-       */
-      public Builder setSuiteVersionBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000080;
-        suiteVersion_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object suiteBuildNumber_ = "";
-      /**
-       * <code>optional string suite_build_number = 23;</code>
-       */
-      public boolean hasSuiteBuildNumber() {
-        return ((bitField0_ & 0x00000100) == 0x00000100);
-      }
-      /**
-       * <code>optional string suite_build_number = 23;</code>
-       */
-      public java.lang.String getSuiteBuildNumber() {
-        java.lang.Object ref = suiteBuildNumber_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            suiteBuildNumber_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>optional string suite_build_number = 23;</code>
-       */
-      public com.google.protobuf.ByteString
-          getSuiteBuildNumberBytes() {
-        java.lang.Object ref = suiteBuildNumber_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          suiteBuildNumber_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>optional string suite_build_number = 23;</code>
-       */
-      public Builder setSuiteBuildNumber(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000100;
-        suiteBuildNumber_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string suite_build_number = 23;</code>
-       */
-      public Builder clearSuiteBuildNumber() {
-        bitField0_ = (bitField0_ & ~0x00000100);
-        suiteBuildNumber_ = getDefaultInstance().getSuiteBuildNumber();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string suite_build_number = 23;</code>
-       */
-      public Builder setSuiteBuildNumberBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000100;
-        suiteBuildNumber_ = value;
-        onChanged();
-        return this;
-      }
-
-      private long startTime_ ;
-      /**
-       * <code>optional int64 start_time = 24;</code>
-       */
-      public boolean hasStartTime() {
-        return ((bitField0_ & 0x00000200) == 0x00000200);
-      }
-      /**
-       * <code>optional int64 start_time = 24;</code>
-       */
-      public long getStartTime() {
-        return startTime_;
-      }
-      /**
-       * <code>optional int64 start_time = 24;</code>
-       */
-      public Builder setStartTime(long value) {
-        bitField0_ |= 0x00000200;
-        startTime_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int64 start_time = 24;</code>
-       */
-      public Builder clearStartTime() {
-        bitField0_ = (bitField0_ & ~0x00000200);
-        startTime_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      private long endTime_ ;
-      /**
-       * <code>optional int64 end_time = 25;</code>
-       */
-      public boolean hasEndTime() {
-        return ((bitField0_ & 0x00000400) == 0x00000400);
-      }
-      /**
-       * <code>optional int64 end_time = 25;</code>
-       */
-      public long getEndTime() {
-        return endTime_;
-      }
-      /**
-       * <code>optional int64 end_time = 25;</code>
-       */
-      public Builder setEndTime(long value) {
-        bitField0_ |= 0x00000400;
-        endTime_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int64 end_time = 25;</code>
-       */
-      public Builder clearEndTime() {
-        bitField0_ = (bitField0_ & ~0x00000400);
-        endTime_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object hostName_ = "";
-      /**
-       * <code>optional string host_name = 26;</code>
-       */
-      public boolean hasHostName() {
-        return ((bitField0_ & 0x00000800) == 0x00000800);
-      }
-      /**
-       * <code>optional string host_name = 26;</code>
-       */
-      public java.lang.String getHostName() {
-        java.lang.Object ref = hostName_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            hostName_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>optional string host_name = 26;</code>
-       */
-      public com.google.protobuf.ByteString
-          getHostNameBytes() {
-        java.lang.Object ref = hostName_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          hostName_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>optional string host_name = 26;</code>
-       */
-      public Builder setHostName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000800;
-        hostName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string host_name = 26;</code>
-       */
-      public Builder clearHostName() {
-        bitField0_ = (bitField0_ & ~0x00000800);
-        hostName_ = getDefaultInstance().getHostName();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string host_name = 26;</code>
-       */
-      public Builder setHostNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000800;
-        hostName_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object suiteName_ = "";
-      /**
-       * <code>optional string suite_name = 27;</code>
-       */
-      public boolean hasSuiteName() {
-        return ((bitField0_ & 0x00001000) == 0x00001000);
-      }
-      /**
-       * <code>optional string suite_name = 27;</code>
-       */
-      public java.lang.String getSuiteName() {
-        java.lang.Object ref = suiteName_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            suiteName_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>optional string suite_name = 27;</code>
-       */
-      public com.google.protobuf.ByteString
-          getSuiteNameBytes() {
-        java.lang.Object ref = suiteName_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          suiteName_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>optional string suite_name = 27;</code>
-       */
-      public Builder setSuiteName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00001000;
-        suiteName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string suite_name = 27;</code>
-       */
-      public Builder clearSuiteName() {
-        bitField0_ = (bitField0_ & ~0x00001000);
-        suiteName_ = getDefaultInstance().getSuiteName();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string suite_name = 27;</code>
-       */
-      public Builder setSuiteNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00001000;
-        suiteName_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object buildSystemFingerprint_ = "";
-      /**
-       * <pre>
-       * attributes of Build tag
-       * </pre>
-       *
-       * <code>optional string build_system_fingerprint = 31;</code>
-       */
-      public boolean hasBuildSystemFingerprint() {
-        return ((bitField0_ & 0x00002000) == 0x00002000);
-      }
-      /**
-       * <pre>
-       * attributes of Build tag
-       * </pre>
-       *
-       * <code>optional string build_system_fingerprint = 31;</code>
-       */
-      public java.lang.String getBuildSystemFingerprint() {
-        java.lang.Object ref = buildSystemFingerprint_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            buildSystemFingerprint_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <pre>
-       * attributes of Build tag
-       * </pre>
-       *
-       * <code>optional string build_system_fingerprint = 31;</code>
-       */
-      public com.google.protobuf.ByteString
-          getBuildSystemFingerprintBytes() {
-        java.lang.Object ref = buildSystemFingerprint_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          buildSystemFingerprint_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <pre>
-       * attributes of Build tag
-       * </pre>
-       *
-       * <code>optional string build_system_fingerprint = 31;</code>
-       */
-      public Builder setBuildSystemFingerprint(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00002000;
-        buildSystemFingerprint_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * attributes of Build tag
-       * </pre>
-       *
-       * <code>optional string build_system_fingerprint = 31;</code>
-       */
-      public Builder clearBuildSystemFingerprint() {
-        bitField0_ = (bitField0_ & ~0x00002000);
-        buildSystemFingerprint_ = getDefaultInstance().getBuildSystemFingerprint();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * attributes of Build tag
-       * </pre>
-       *
-       * <code>optional string build_system_fingerprint = 31;</code>
-       */
-      public Builder setBuildSystemFingerprintBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00002000;
-        buildSystemFingerprint_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object buildVendorFingerprint_ = "";
-      /**
-       * <code>optional string build_vendor_fingerprint = 32;</code>
-       */
-      public boolean hasBuildVendorFingerprint() {
-        return ((bitField0_ & 0x00004000) == 0x00004000);
-      }
-      /**
-       * <code>optional string build_vendor_fingerprint = 32;</code>
-       */
-      public java.lang.String getBuildVendorFingerprint() {
-        java.lang.Object ref = buildVendorFingerprint_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            buildVendorFingerprint_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>optional string build_vendor_fingerprint = 32;</code>
-       */
-      public com.google.protobuf.ByteString
-          getBuildVendorFingerprintBytes() {
-        java.lang.Object ref = buildVendorFingerprint_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          buildVendorFingerprint_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>optional string build_vendor_fingerprint = 32;</code>
-       */
-      public Builder setBuildVendorFingerprint(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00004000;
-        buildVendorFingerprint_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string build_vendor_fingerprint = 32;</code>
-       */
-      public Builder clearBuildVendorFingerprint() {
-        bitField0_ = (bitField0_ & ~0x00004000);
-        buildVendorFingerprint_ = getDefaultInstance().getBuildVendorFingerprint();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string build_vendor_fingerprint = 32;</code>
-       */
-      public Builder setBuildVendorFingerprintBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00004000;
-        buildVendorFingerprint_ = value;
-        onChanged();
-        return this;
-      }
-
-      private int testType_ ;
-      /**
-       * <code>optional int32 test_type = 33 [default = 0];</code>
-       */
-      public boolean hasTestType() {
-        return ((bitField0_ & 0x00008000) == 0x00008000);
-      }
-      /**
-       * <code>optional int32 test_type = 33 [default = 0];</code>
-       */
-      public int getTestType() {
-        return testType_;
-      }
-      /**
-       * <code>optional int32 test_type = 33 [default = 0];</code>
-       */
-      public Builder setTestType(int value) {
-        bitField0_ |= 0x00008000;
-        testType_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int32 test_type = 33 [default = 0];</code>
-       */
-      public Builder clearTestType() {
-        bitField0_ = (bitField0_ & ~0x00008000);
-        testType_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private int passedTestCaseCount_ ;
-      /**
-       * <pre>
-       * attributes of Summary tag
-       * </pre>
-       *
-       * <code>optional int32 passed_test_case_count = 41;</code>
-       */
-      public boolean hasPassedTestCaseCount() {
-        return ((bitField0_ & 0x00010000) == 0x00010000);
-      }
-      /**
-       * <pre>
-       * attributes of Summary tag
-       * </pre>
-       *
-       * <code>optional int32 passed_test_case_count = 41;</code>
-       */
-      public int getPassedTestCaseCount() {
-        return passedTestCaseCount_;
-      }
-      /**
-       * <pre>
-       * attributes of Summary tag
-       * </pre>
-       *
-       * <code>optional int32 passed_test_case_count = 41;</code>
-       */
-      public Builder setPassedTestCaseCount(int value) {
-        bitField0_ |= 0x00010000;
-        passedTestCaseCount_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * attributes of Summary tag
-       * </pre>
-       *
-       * <code>optional int32 passed_test_case_count = 41;</code>
-       */
-      public Builder clearPassedTestCaseCount() {
-        bitField0_ = (bitField0_ & ~0x00010000);
-        passedTestCaseCount_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private int failedTestCaseCount_ ;
-      /**
-       * <code>optional int32 failed_test_case_count = 42;</code>
-       */
-      public boolean hasFailedTestCaseCount() {
-        return ((bitField0_ & 0x00020000) == 0x00020000);
-      }
-      /**
-       * <code>optional int32 failed_test_case_count = 42;</code>
-       */
-      public int getFailedTestCaseCount() {
-        return failedTestCaseCount_;
-      }
-      /**
-       * <code>optional int32 failed_test_case_count = 42;</code>
-       */
-      public Builder setFailedTestCaseCount(int value) {
-        bitField0_ |= 0x00020000;
-        failedTestCaseCount_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int32 failed_test_case_count = 42;</code>
-       */
-      public Builder clearFailedTestCaseCount() {
-        bitField0_ = (bitField0_ & ~0x00020000);
-        failedTestCaseCount_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private int modulesDone_ ;
-      /**
-       * <code>optional int32 modules_done = 43;</code>
-       */
-      public boolean hasModulesDone() {
-        return ((bitField0_ & 0x00040000) == 0x00040000);
-      }
-      /**
-       * <code>optional int32 modules_done = 43;</code>
-       */
-      public int getModulesDone() {
-        return modulesDone_;
-      }
-      /**
-       * <code>optional int32 modules_done = 43;</code>
-       */
-      public Builder setModulesDone(int value) {
-        bitField0_ |= 0x00040000;
-        modulesDone_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int32 modules_done = 43;</code>
-       */
-      public Builder clearModulesDone() {
-        bitField0_ = (bitField0_ & ~0x00040000);
-        modulesDone_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private int modulesTotal_ ;
-      /**
-       * <code>optional int32 modules_total = 44;</code>
-       */
-      public boolean hasModulesTotal() {
-        return ((bitField0_ & 0x00080000) == 0x00080000);
-      }
-      /**
-       * <code>optional int32 modules_total = 44;</code>
-       */
-      public int getModulesTotal() {
-        return modulesTotal_;
-      }
-      /**
-       * <code>optional int32 modules_total = 44;</code>
-       */
-      public Builder setModulesTotal(int value) {
-        bitField0_ |= 0x00080000;
-        modulesTotal_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int32 modules_total = 44;</code>
-       */
-      public Builder clearModulesTotal() {
-        bitField0_ = (bitField0_ & ~0x00080000);
-        modulesTotal_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object infraLogPath_ = "";
-      /**
-       * <pre>
-       * GCS path to the corresponding infra log file.
-       * </pre>
-       *
-       * <code>optional string infra_log_path = 51;</code>
-       */
-      public boolean hasInfraLogPath() {
-        return ((bitField0_ & 0x00100000) == 0x00100000);
-      }
-      /**
-       * <pre>
-       * GCS path to the corresponding infra log file.
-       * </pre>
-       *
-       * <code>optional string infra_log_path = 51;</code>
-       */
-      public java.lang.String getInfraLogPath() {
-        java.lang.Object ref = infraLogPath_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            infraLogPath_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <pre>
-       * GCS path to the corresponding infra log file.
-       * </pre>
-       *
-       * <code>optional string infra_log_path = 51;</code>
-       */
-      public com.google.protobuf.ByteString
-          getInfraLogPathBytes() {
-        java.lang.Object ref = infraLogPath_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          infraLogPath_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <pre>
-       * GCS path to the corresponding infra log file.
-       * </pre>
-       *
-       * <code>optional string infra_log_path = 51;</code>
-       */
-      public Builder setInfraLogPath(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00100000;
-        infraLogPath_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * GCS path to the corresponding infra log file.
-       * </pre>
-       *
-       * <code>optional string infra_log_path = 51;</code>
-       */
-      public Builder clearInfraLogPath() {
-        bitField0_ = (bitField0_ & ~0x00100000);
-        infraLogPath_ = getDefaultInstance().getInfraLogPath();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * GCS path to the corresponding infra log file.
-       * </pre>
-       *
-       * <code>optional string infra_log_path = 51;</code>
-       */
-      public Builder setInfraLogPathBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00100000;
-        infraLogPath_ = value;
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.LazyStringList repackedImagePath_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-      private void ensureRepackedImagePathIsMutable() {
-        if (!((bitField0_ & 0x00200000) == 0x00200000)) {
-          repackedImagePath_ = new com.google.protobuf.LazyStringArrayList(repackedImagePath_);
-          bitField0_ |= 0x00200000;
-         }
-      }
-      /**
-       * <pre>
-       * GCS path to the repacked device[+GSI] image set.
-       * </pre>
-       *
-       * <code>repeated string repacked_image_path = 52;</code>
-       */
-      public com.google.protobuf.ProtocolStringList
-          getRepackedImagePathList() {
-        return repackedImagePath_.getUnmodifiableView();
-      }
-      /**
-       * <pre>
-       * GCS path to the repacked device[+GSI] image set.
-       * </pre>
-       *
-       * <code>repeated string repacked_image_path = 52;</code>
-       */
-      public int getRepackedImagePathCount() {
-        return repackedImagePath_.size();
-      }
-      /**
-       * <pre>
-       * GCS path to the repacked device[+GSI] image set.
-       * </pre>
-       *
-       * <code>repeated string repacked_image_path = 52;</code>
-       */
-      public java.lang.String getRepackedImagePath(int index) {
-        return repackedImagePath_.get(index);
-      }
-      /**
-       * <pre>
-       * GCS path to the repacked device[+GSI] image set.
-       * </pre>
-       *
-       * <code>repeated string repacked_image_path = 52;</code>
-       */
-      public com.google.protobuf.ByteString
-          getRepackedImagePathBytes(int index) {
-        return repackedImagePath_.getByteString(index);
-      }
-      /**
-       * <pre>
-       * GCS path to the repacked device[+GSI] image set.
-       * </pre>
-       *
-       * <code>repeated string repacked_image_path = 52;</code>
-       */
-      public Builder setRepackedImagePath(
-          int index, java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureRepackedImagePathIsMutable();
-        repackedImagePath_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * GCS path to the repacked device[+GSI] image set.
-       * </pre>
-       *
-       * <code>repeated string repacked_image_path = 52;</code>
-       */
-      public Builder addRepackedImagePath(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureRepackedImagePathIsMutable();
-        repackedImagePath_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * GCS path to the repacked device[+GSI] image set.
-       * </pre>
-       *
-       * <code>repeated string repacked_image_path = 52;</code>
-       */
-      public Builder addAllRepackedImagePath(
-          java.lang.Iterable<java.lang.String> values) {
-        ensureRepackedImagePathIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, repackedImagePath_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * GCS path to the repacked device[+GSI] image set.
-       * </pre>
-       *
-       * <code>repeated string repacked_image_path = 52;</code>
-       */
-      public Builder clearRepackedImagePath() {
-        repackedImagePath_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00200000);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * GCS path to the repacked device[+GSI] image set.
-       * </pre>
-       *
-       * <code>repeated string repacked_image_path = 52;</code>
-       */
-      public Builder addRepackedImagePathBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureRepackedImagePathIsMutable();
-        repackedImagePath_.add(value);
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object vendorBuildId_ = "";
-      /**
-       * <pre>
-       * Fetch info used to fetch and flash certain builds for retry_prompt command.
-       * </pre>
-       *
-       * <code>optional string vendor_build_id = 61;</code>
-       */
-      public boolean hasVendorBuildId() {
-        return ((bitField0_ & 0x00400000) == 0x00400000);
-      }
-      /**
-       * <pre>
-       * Fetch info used to fetch and flash certain builds for retry_prompt command.
-       * </pre>
-       *
-       * <code>optional string vendor_build_id = 61;</code>
-       */
-      public java.lang.String getVendorBuildId() {
-        java.lang.Object ref = vendorBuildId_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            vendorBuildId_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <pre>
-       * Fetch info used to fetch and flash certain builds for retry_prompt command.
-       * </pre>
-       *
-       * <code>optional string vendor_build_id = 61;</code>
-       */
-      public com.google.protobuf.ByteString
-          getVendorBuildIdBytes() {
-        java.lang.Object ref = vendorBuildId_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          vendorBuildId_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <pre>
-       * Fetch info used to fetch and flash certain builds for retry_prompt command.
-       * </pre>
-       *
-       * <code>optional string vendor_build_id = 61;</code>
-       */
-      public Builder setVendorBuildId(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00400000;
-        vendorBuildId_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Fetch info used to fetch and flash certain builds for retry_prompt command.
-       * </pre>
-       *
-       * <code>optional string vendor_build_id = 61;</code>
-       */
-      public Builder clearVendorBuildId() {
-        bitField0_ = (bitField0_ & ~0x00400000);
-        vendorBuildId_ = getDefaultInstance().getVendorBuildId();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Fetch info used to fetch and flash certain builds for retry_prompt command.
-       * </pre>
-       *
-       * <code>optional string vendor_build_id = 61;</code>
-       */
-      public Builder setVendorBuildIdBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00400000;
-        vendorBuildId_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object gsiBuildId_ = "";
-      /**
-       * <code>optional string gsi_build_id = 62;</code>
-       */
-      public boolean hasGsiBuildId() {
-        return ((bitField0_ & 0x00800000) == 0x00800000);
-      }
-      /**
-       * <code>optional string gsi_build_id = 62;</code>
-       */
-      public java.lang.String getGsiBuildId() {
-        java.lang.Object ref = gsiBuildId_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            gsiBuildId_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>optional string gsi_build_id = 62;</code>
-       */
-      public com.google.protobuf.ByteString
-          getGsiBuildIdBytes() {
-        java.lang.Object ref = gsiBuildId_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          gsiBuildId_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>optional string gsi_build_id = 62;</code>
-       */
-      public Builder setGsiBuildId(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00800000;
-        gsiBuildId_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string gsi_build_id = 62;</code>
-       */
-      public Builder clearGsiBuildId() {
-        bitField0_ = (bitField0_ & ~0x00800000);
-        gsiBuildId_ = getDefaultInstance().getGsiBuildId();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional string gsi_build_id = 62;</code>
-       */
-      public Builder setGsiBuildIdBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00800000;
-        gsiBuildId_ = value;
-        onChanged();
-        return this;
-      }
-
-      private com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage scheduleConfig_ = null;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage, com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.Builder, com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessageOrBuilder> scheduleConfigBuilder_;
-      /**
-       * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public boolean hasScheduleConfig() {
-        return ((bitField0_ & 0x01000000) == 0x01000000);
-      }
-      /**
-       * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage getScheduleConfig() {
-        if (scheduleConfigBuilder_ == null) {
-          return scheduleConfig_ == null ? com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.getDefaultInstance() : scheduleConfig_;
-        } else {
-          return scheduleConfigBuilder_.getMessage();
-        }
-      }
-      /**
-       * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder setScheduleConfig(com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage value) {
-        if (scheduleConfigBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          scheduleConfig_ = value;
-          onChanged();
-        } else {
-          scheduleConfigBuilder_.setMessage(value);
-        }
-        bitField0_ |= 0x01000000;
-        return this;
-      }
-      /**
-       * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder setScheduleConfig(
-          com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.Builder builderForValue) {
-        if (scheduleConfigBuilder_ == null) {
-          scheduleConfig_ = builderForValue.build();
-          onChanged();
-        } else {
-          scheduleConfigBuilder_.setMessage(builderForValue.build());
-        }
-        bitField0_ |= 0x01000000;
-        return this;
-      }
-      /**
-       * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder mergeScheduleConfig(com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage value) {
-        if (scheduleConfigBuilder_ == null) {
-          if (((bitField0_ & 0x01000000) == 0x01000000) &&
-              scheduleConfig_ != null &&
-              scheduleConfig_ != com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.getDefaultInstance()) {
-            scheduleConfig_ =
-              com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.newBuilder(scheduleConfig_).mergeFrom(value).buildPartial();
-          } else {
-            scheduleConfig_ = value;
-          }
-          onChanged();
-        } else {
-          scheduleConfigBuilder_.mergeFrom(value);
-        }
-        bitField0_ |= 0x01000000;
-        return this;
-      }
-      /**
-       * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder clearScheduleConfig() {
-        if (scheduleConfigBuilder_ == null) {
-          scheduleConfig_ = null;
-          onChanged();
-        } else {
-          scheduleConfigBuilder_.clear();
-        }
-        bitField0_ = (bitField0_ & ~0x01000000);
-        return this;
-      }
-      /**
-       * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.Builder getScheduleConfigBuilder() {
-        bitField0_ |= 0x01000000;
-        onChanged();
-        return getScheduleConfigFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessageOrBuilder getScheduleConfigOrBuilder() {
-        if (scheduleConfigBuilder_ != null) {
-          return scheduleConfigBuilder_.getMessageOrBuilder();
-        } else {
-          return scheduleConfig_ == null ?
-              com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.getDefaultInstance() : scheduleConfig_;
-        }
-      }
-      /**
-       * <code>optional .android.test.lab.ScheduleConfigMessage schedule_config = 63 [deprecated = true];</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage, com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.Builder, com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessageOrBuilder> 
-          getScheduleConfigFieldBuilder() {
-        if (scheduleConfigBuilder_ == null) {
-          scheduleConfigBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage, com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessage.Builder, com.android.vts.proto.TestScheduleConfigMessageOuterClass.ScheduleConfigMessageOrBuilder>(
-                  getScheduleConfig(),
-                  getParentForChildren(),
-                  isClean());
-          scheduleConfig_ = null;
-        }
-        return scheduleConfigBuilder_;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.TestSuiteResultMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.TestSuiteResultMessage)
-    private static final com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage();
-    }
-
-    public static com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<TestSuiteResultMessage>
-        PARSER = new com.google.protobuf.AbstractParser<TestSuiteResultMessage>() {
-      public TestSuiteResultMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new TestSuiteResultMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<TestSuiteResultMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<TestSuiteResultMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.TestSuiteResultMessageProto.TestSuiteResultMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_TestSuiteResultMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_TestSuiteResultMessage_fieldAccessorTable;
-
-  public static com.google.protobuf.Descriptors.FileDescriptor
-      getDescriptor() {
-    return descriptor;
-  }
-  private static  com.google.protobuf.Descriptors.FileDescriptor
-      descriptor;
-  static {
-    java.lang.String[] descriptorData = {
-      "\n\034TestSuiteResultMessage.proto\022\013android." +
-      "vts\032\037TestScheduleConfigMessage.proto\"\226\005\n" +
-      "\026TestSuiteResultMessage\022\024\n\014access_token\030" +
-      "\001 \001(\t\022\023\n\013result_path\030\002 \001(\t\022\032\n\014boot_succe" +
-      "ss\030\003 \001(\010:\004true\022\016\n\006branch\030\013 \002(\t\022\016\n\006target" +
-      "\030\014 \002(\t\022\020\n\010build_id\030\r \002(\t\022\022\n\nsuite_plan\030\025" +
-      " \001(\t\022\025\n\rsuite_version\030\026 \001(\t\022\032\n\022suite_bui" +
-      "ld_number\030\027 \001(\t\022\022\n\nstart_time\030\030 \001(\003\022\020\n\010e" +
-      "nd_time\030\031 \001(\003\022\021\n\thost_name\030\032 \001(\t\022\022\n\nsuit" +
-      "e_name\030\033 \001(\t\022 \n\030build_system_fingerprint",
-      "\030\037 \001(\t\022 \n\030build_vendor_fingerprint\030  \001(\t" +
-      "\022\024\n\ttest_type\030! \001(\005:\0010\022\036\n\026passed_test_ca" +
-      "se_count\030) \001(\005\022\036\n\026failed_test_case_count" +
-      "\030* \001(\005\022\024\n\014modules_done\030+ \001(\005\022\025\n\rmodules_" +
-      "total\030, \001(\005\022\026\n\016infra_log_path\0303 \001(\t\022\033\n\023r" +
-      "epacked_image_path\0304 \003(\t\022\027\n\017vendor_build" +
-      "_id\030= \001(\t\022\024\n\014gsi_build_id\030> \001(\t\022D\n\017sched" +
-      "ule_config\030? \001(\0132\'.android.test.lab.Sche" +
-      "duleConfigMessageB\002\030\001B6\n\025com.android.vts" +
-      ".protoB\033TestSuiteResultMessageProtoP\000"
-    };
-    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
-        new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {
-          public com.google.protobuf.ExtensionRegistry assignDescriptors(
-              com.google.protobuf.Descriptors.FileDescriptor root) {
-            descriptor = root;
-            return null;
-          }
-        };
-    com.google.protobuf.Descriptors.FileDescriptor
-      .internalBuildGeneratedFileFrom(descriptorData,
-        new com.google.protobuf.Descriptors.FileDescriptor[] {
-          com.android.vts.proto.TestScheduleConfigMessageOuterClass.getDescriptor(),
-        }, assigner);
-    internal_static_android_vts_TestSuiteResultMessage_descriptor =
-      getDescriptor().getMessageTypes().get(0);
-    internal_static_android_vts_TestSuiteResultMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_TestSuiteResultMessage_descriptor,
-        new java.lang.String[] { "AccessToken", "ResultPath", "BootSuccess", "Branch", "Target", "BuildId", "SuitePlan", "SuiteVersion", "SuiteBuildNumber", "StartTime", "EndTime", "HostName", "SuiteName", "BuildSystemFingerprint", "BuildVendorFingerprint", "TestType", "PassedTestCaseCount", "FailedTestCaseCount", "ModulesDone", "ModulesTotal", "InfraLogPath", "RepackedImagePath", "VendorBuildId", "GsiBuildId", "ScheduleConfig", });
-    com.android.vts.proto.TestScheduleConfigMessageOuterClass.getDescriptor();
-  }
-
-  // @@protoc_insertion_point(outer_class_scope)
-}
diff --git a/src/main/java/com/android/vts/proto/VtsReportMessage.java b/src/main/java/com/android/vts/proto/VtsReportMessage.java
deleted file mode 100644
index 84ed9b6..0000000
--- a/src/main/java/com/android/vts/proto/VtsReportMessage.java
+++ /dev/null
@@ -1,23382 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: proto/VtsReportMessage.proto
-
-package com.android.vts.proto;
-
-public final class VtsReportMessage {
-  private VtsReportMessage() {}
-  public static void registerAllExtensions(
-      com.google.protobuf.ExtensionRegistryLite registry) {
-  }
-
-  public static void registerAllExtensions(
-      com.google.protobuf.ExtensionRegistry registry) {
-    registerAllExtensions(
-        (com.google.protobuf.ExtensionRegistryLite) registry);
-  }
-  /**
-   * <pre>
-   * To specify test case execution result.
-   * </pre>
-   *
-   * Protobuf enum {@code android.vts.TestCaseResult}
-   */
-  public enum TestCaseResult
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>UNKNOWN_RESULT = 0;</code>
-     */
-    UNKNOWN_RESULT(0),
-    /**
-     * <code>TEST_CASE_RESULT_PASS = 1;</code>
-     */
-    TEST_CASE_RESULT_PASS(1),
-    /**
-     * <code>TEST_CASE_RESULT_FAIL = 2;</code>
-     */
-    TEST_CASE_RESULT_FAIL(2),
-    /**
-     * <code>TEST_CASE_RESULT_SKIP = 3;</code>
-     */
-    TEST_CASE_RESULT_SKIP(3),
-    /**
-     * <code>TEST_CASE_RESULT_EXCEPTION = 4;</code>
-     */
-    TEST_CASE_RESULT_EXCEPTION(4),
-    /**
-     * <code>TEST_CASE_RESULT_TIMEOUT = 5;</code>
-     */
-    TEST_CASE_RESULT_TIMEOUT(5),
-    ;
-
-    /**
-     * <code>UNKNOWN_RESULT = 0;</code>
-     */
-    public static final int UNKNOWN_RESULT_VALUE = 0;
-    /**
-     * <code>TEST_CASE_RESULT_PASS = 1;</code>
-     */
-    public static final int TEST_CASE_RESULT_PASS_VALUE = 1;
-    /**
-     * <code>TEST_CASE_RESULT_FAIL = 2;</code>
-     */
-    public static final int TEST_CASE_RESULT_FAIL_VALUE = 2;
-    /**
-     * <code>TEST_CASE_RESULT_SKIP = 3;</code>
-     */
-    public static final int TEST_CASE_RESULT_SKIP_VALUE = 3;
-    /**
-     * <code>TEST_CASE_RESULT_EXCEPTION = 4;</code>
-     */
-    public static final int TEST_CASE_RESULT_EXCEPTION_VALUE = 4;
-    /**
-     * <code>TEST_CASE_RESULT_TIMEOUT = 5;</code>
-     */
-    public static final int TEST_CASE_RESULT_TIMEOUT_VALUE = 5;
-
-
-    public final int getNumber() {
-      return value;
-    }
-
-    /**
-     * @deprecated Use {@link #forNumber(int)} instead.
-     */
-    @java.lang.Deprecated
-    public static TestCaseResult valueOf(int value) {
-      return forNumber(value);
-    }
-
-    public static TestCaseResult forNumber(int value) {
-      switch (value) {
-        case 0: return UNKNOWN_RESULT;
-        case 1: return TEST_CASE_RESULT_PASS;
-        case 2: return TEST_CASE_RESULT_FAIL;
-        case 3: return TEST_CASE_RESULT_SKIP;
-        case 4: return TEST_CASE_RESULT_EXCEPTION;
-        case 5: return TEST_CASE_RESULT_TIMEOUT;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<TestCaseResult>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static final com.google.protobuf.Internal.EnumLiteMap<
-        TestCaseResult> internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<TestCaseResult>() {
-            public TestCaseResult findValueByNumber(int number) {
-              return TestCaseResult.forNumber(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      return getDescriptor().getValues().get(ordinal());
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.getDescriptor().getEnumTypes().get(0);
-    }
-
-    private static final TestCaseResult[] VALUES = values();
-
-    public static TestCaseResult valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int value;
-
-    private TestCaseResult(int value) {
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:android.vts.TestCaseResult)
-  }
-
-  /**
-   * <pre>
-   * To specify the VTS test type.
-   * </pre>
-   *
-   * Protobuf enum {@code android.vts.VtsTestType}
-   */
-  public enum VtsTestType
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>UNKNOWN_VTS_TESTTYPE = 0;</code>
-     */
-    UNKNOWN_VTS_TESTTYPE(0),
-    /**
-     * <code>VTS_HOST_DRIVEN_STRUCTURAL = 1;</code>
-     */
-    VTS_HOST_DRIVEN_STRUCTURAL(1),
-    /**
-     * <code>VTS_HOST_DRIVEN_FUZZING = 2;</code>
-     */
-    VTS_HOST_DRIVEN_FUZZING(2),
-    /**
-     * <code>VTS_TARGET_SIDE_GTEST = 3;</code>
-     */
-    VTS_TARGET_SIDE_GTEST(3),
-    /**
-     * <code>VTS_TARGET_SIDE_FUZZING = 4;</code>
-     */
-    VTS_TARGET_SIDE_FUZZING(4),
-    ;
-
-    /**
-     * <code>UNKNOWN_VTS_TESTTYPE = 0;</code>
-     */
-    public static final int UNKNOWN_VTS_TESTTYPE_VALUE = 0;
-    /**
-     * <code>VTS_HOST_DRIVEN_STRUCTURAL = 1;</code>
-     */
-    public static final int VTS_HOST_DRIVEN_STRUCTURAL_VALUE = 1;
-    /**
-     * <code>VTS_HOST_DRIVEN_FUZZING = 2;</code>
-     */
-    public static final int VTS_HOST_DRIVEN_FUZZING_VALUE = 2;
-    /**
-     * <code>VTS_TARGET_SIDE_GTEST = 3;</code>
-     */
-    public static final int VTS_TARGET_SIDE_GTEST_VALUE = 3;
-    /**
-     * <code>VTS_TARGET_SIDE_FUZZING = 4;</code>
-     */
-    public static final int VTS_TARGET_SIDE_FUZZING_VALUE = 4;
-
-
-    public final int getNumber() {
-      return value;
-    }
-
-    /**
-     * @deprecated Use {@link #forNumber(int)} instead.
-     */
-    @java.lang.Deprecated
-    public static VtsTestType valueOf(int value) {
-      return forNumber(value);
-    }
-
-    public static VtsTestType forNumber(int value) {
-      switch (value) {
-        case 0: return UNKNOWN_VTS_TESTTYPE;
-        case 1: return VTS_HOST_DRIVEN_STRUCTURAL;
-        case 2: return VTS_HOST_DRIVEN_FUZZING;
-        case 3: return VTS_TARGET_SIDE_GTEST;
-        case 4: return VTS_TARGET_SIDE_FUZZING;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<VtsTestType>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static final com.google.protobuf.Internal.EnumLiteMap<
-        VtsTestType> internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<VtsTestType>() {
-            public VtsTestType findValueByNumber(int number) {
-              return VtsTestType.forNumber(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      return getDescriptor().getValues().get(ordinal());
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.getDescriptor().getEnumTypes().get(1);
-    }
-
-    private static final VtsTestType[] VALUES = values();
-
-    public static VtsTestType valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int value;
-
-    private VtsTestType(int value) {
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:android.vts.VtsTestType)
-  }
-
-  /**
-   * Protobuf enum {@code android.vts.VtsProfilingRegressionMode}
-   */
-  public enum VtsProfilingRegressionMode
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>UNKNOWN_REGRESSION_MODE = 0;</code>
-     */
-    UNKNOWN_REGRESSION_MODE(0),
-    /**
-     * <pre>
-     * disable analysis
-     * </pre>
-     *
-     * <code>VTS_REGRESSION_MODE_DISABLED = 1;</code>
-     */
-    VTS_REGRESSION_MODE_DISABLED(1),
-    /**
-     * <pre>
-     * interpret increases in values as regression
-     * </pre>
-     *
-     * <code>VTS_REGRESSION_MODE_INCREASING = 2;</code>
-     */
-    VTS_REGRESSION_MODE_INCREASING(2),
-    /**
-     * <pre>
-     * interpret decreases in values as regression
-     * </pre>
-     *
-     * <code>VTS_REGRESSION_MODE_DECREASING = 3;</code>
-     */
-    VTS_REGRESSION_MODE_DECREASING(3),
-    ;
-
-    /**
-     * <code>UNKNOWN_REGRESSION_MODE = 0;</code>
-     */
-    public static final int UNKNOWN_REGRESSION_MODE_VALUE = 0;
-    /**
-     * <pre>
-     * disable analysis
-     * </pre>
-     *
-     * <code>VTS_REGRESSION_MODE_DISABLED = 1;</code>
-     */
-    public static final int VTS_REGRESSION_MODE_DISABLED_VALUE = 1;
-    /**
-     * <pre>
-     * interpret increases in values as regression
-     * </pre>
-     *
-     * <code>VTS_REGRESSION_MODE_INCREASING = 2;</code>
-     */
-    public static final int VTS_REGRESSION_MODE_INCREASING_VALUE = 2;
-    /**
-     * <pre>
-     * interpret decreases in values as regression
-     * </pre>
-     *
-     * <code>VTS_REGRESSION_MODE_DECREASING = 3;</code>
-     */
-    public static final int VTS_REGRESSION_MODE_DECREASING_VALUE = 3;
-
-
-    public final int getNumber() {
-      return value;
-    }
-
-    /**
-     * @deprecated Use {@link #forNumber(int)} instead.
-     */
-    @java.lang.Deprecated
-    public static VtsProfilingRegressionMode valueOf(int value) {
-      return forNumber(value);
-    }
-
-    public static VtsProfilingRegressionMode forNumber(int value) {
-      switch (value) {
-        case 0: return UNKNOWN_REGRESSION_MODE;
-        case 1: return VTS_REGRESSION_MODE_DISABLED;
-        case 2: return VTS_REGRESSION_MODE_INCREASING;
-        case 3: return VTS_REGRESSION_MODE_DECREASING;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<VtsProfilingRegressionMode>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static final com.google.protobuf.Internal.EnumLiteMap<
-        VtsProfilingRegressionMode> internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<VtsProfilingRegressionMode>() {
-            public VtsProfilingRegressionMode findValueByNumber(int number) {
-              return VtsProfilingRegressionMode.forNumber(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      return getDescriptor().getValues().get(ordinal());
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.getDescriptor().getEnumTypes().get(2);
-    }
-
-    private static final VtsProfilingRegressionMode[] VALUES = values();
-
-    public static VtsProfilingRegressionMode valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int value;
-
-    private VtsProfilingRegressionMode(int value) {
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:android.vts.VtsProfilingRegressionMode)
-  }
-
-  /**
-   * Protobuf enum {@code android.vts.VtsProfilingType}
-   */
-  public enum VtsProfilingType
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>UNKNOWN_VTS_PROFILING_TYPE = 0;</code>
-     */
-    UNKNOWN_VTS_PROFILING_TYPE(0),
-    /**
-     * <pre>
-     * for one sample which measures the time between two profiling points.
-     * </pre>
-     *
-     * <code>VTS_PROFILING_TYPE_TIMESTAMP = 1;</code>
-     */
-    VTS_PROFILING_TYPE_TIMESTAMP(1),
-    /**
-     * <pre>
-     * for multiple single-type samples with labels.
-     * </pre>
-     *
-     * <code>VTS_PROFILING_TYPE_LABELED_VECTOR = 2;</code>
-     */
-    VTS_PROFILING_TYPE_LABELED_VECTOR(2),
-    /**
-     * <pre>
-     * for multiple single-type samples without labels.
-     * </pre>
-     *
-     * <code>VTS_PROFILING_TYPE_UNLABELED_VECTOR = 3;</code>
-     */
-    VTS_PROFILING_TYPE_UNLABELED_VECTOR(3),
-    ;
-
-    /**
-     * <code>UNKNOWN_VTS_PROFILING_TYPE = 0;</code>
-     */
-    public static final int UNKNOWN_VTS_PROFILING_TYPE_VALUE = 0;
-    /**
-     * <pre>
-     * for one sample which measures the time between two profiling points.
-     * </pre>
-     *
-     * <code>VTS_PROFILING_TYPE_TIMESTAMP = 1;</code>
-     */
-    public static final int VTS_PROFILING_TYPE_TIMESTAMP_VALUE = 1;
-    /**
-     * <pre>
-     * for multiple single-type samples with labels.
-     * </pre>
-     *
-     * <code>VTS_PROFILING_TYPE_LABELED_VECTOR = 2;</code>
-     */
-    public static final int VTS_PROFILING_TYPE_LABELED_VECTOR_VALUE = 2;
-    /**
-     * <pre>
-     * for multiple single-type samples without labels.
-     * </pre>
-     *
-     * <code>VTS_PROFILING_TYPE_UNLABELED_VECTOR = 3;</code>
-     */
-    public static final int VTS_PROFILING_TYPE_UNLABELED_VECTOR_VALUE = 3;
-
-
-    public final int getNumber() {
-      return value;
-    }
-
-    /**
-     * @deprecated Use {@link #forNumber(int)} instead.
-     */
-    @java.lang.Deprecated
-    public static VtsProfilingType valueOf(int value) {
-      return forNumber(value);
-    }
-
-    public static VtsProfilingType forNumber(int value) {
-      switch (value) {
-        case 0: return UNKNOWN_VTS_PROFILING_TYPE;
-        case 1: return VTS_PROFILING_TYPE_TIMESTAMP;
-        case 2: return VTS_PROFILING_TYPE_LABELED_VECTOR;
-        case 3: return VTS_PROFILING_TYPE_UNLABELED_VECTOR;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<VtsProfilingType>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static final com.google.protobuf.Internal.EnumLiteMap<
-        VtsProfilingType> internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<VtsProfilingType>() {
-            public VtsProfilingType findValueByNumber(int number) {
-              return VtsProfilingType.forNumber(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      return getDescriptor().getValues().get(ordinal());
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.getDescriptor().getEnumTypes().get(3);
-    }
-
-    private static final VtsProfilingType[] VALUES = values();
-
-    public static VtsProfilingType valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int value;
-
-    private VtsProfilingType(int value) {
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:android.vts.VtsProfilingType)
-  }
-
-  public interface AndroidDeviceInfoMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.AndroidDeviceInfoMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * product type (e.g., bullhead).
-     * </pre>
-     *
-     * <code>optional bytes product_type = 1;</code>
-     */
-    boolean hasProductType();
-    /**
-     * <pre>
-     * product type (e.g., bullhead).
-     * </pre>
-     *
-     * <code>optional bytes product_type = 1;</code>
-     */
-    com.google.protobuf.ByteString getProductType();
-
-    /**
-     * <pre>
-     * product type variant (e.g., still bullhead or another name).
-     * </pre>
-     *
-     * <code>optional bytes product_variant = 2;</code>
-     */
-    boolean hasProductVariant();
-    /**
-     * <pre>
-     * product type variant (e.g., still bullhead or another name).
-     * </pre>
-     *
-     * <code>optional bytes product_variant = 2;</code>
-     */
-    com.google.protobuf.ByteString getProductVariant();
-
-    /**
-     * <pre>
-     * build type (e.g., userdebug).
-     * </pre>
-     *
-     * <code>optional bytes build_flavor = 11;</code>
-     */
-    boolean hasBuildFlavor();
-    /**
-     * <pre>
-     * build type (e.g., userdebug).
-     * </pre>
-     *
-     * <code>optional bytes build_flavor = 11;</code>
-     */
-    com.google.protobuf.ByteString getBuildFlavor();
-
-    /**
-     * <pre>
-     * Android Build ID.
-     * </pre>
-     *
-     * <code>optional bytes build_id = 12;</code>
-     */
-    boolean hasBuildId();
-    /**
-     * <pre>
-     * Android Build ID.
-     * </pre>
-     *
-     * <code>optional bytes build_id = 12;</code>
-     */
-    com.google.protobuf.ByteString getBuildId();
-
-    /**
-     * <pre>
-     * branch name (e.g., master or nyc-dev).
-     * </pre>
-     *
-     * <code>optional bytes branch = 21;</code>
-     */
-    boolean hasBranch();
-    /**
-     * <pre>
-     * branch name (e.g., master or nyc-dev).
-     * </pre>
-     *
-     * <code>optional bytes branch = 21;</code>
-     */
-    com.google.protobuf.ByteString getBranch();
-
-    /**
-     * <pre>
-     * build alias implies the branch name.
-     * </pre>
-     *
-     * <code>optional bytes build_alias = 22;</code>
-     */
-    boolean hasBuildAlias();
-    /**
-     * <pre>
-     * build alias implies the branch name.
-     * </pre>
-     *
-     * <code>optional bytes build_alias = 22;</code>
-     */
-    com.google.protobuf.ByteString getBuildAlias();
-
-    /**
-     * <pre>
-     * API level
-     * </pre>
-     *
-     * <code>optional bytes api_level = 31;</code>
-     */
-    boolean hasApiLevel();
-    /**
-     * <pre>
-     * API level
-     * </pre>
-     *
-     * <code>optional bytes api_level = 31;</code>
-     */
-    com.google.protobuf.ByteString getApiLevel();
-
-    /**
-     * <pre>
-     * ABI name that is current in use for the test
-     * </pre>
-     *
-     * <code>optional bytes abi_name = 51;</code>
-     */
-    boolean hasAbiName();
-    /**
-     * <pre>
-     * ABI name that is current in use for the test
-     * </pre>
-     *
-     * <code>optional bytes abi_name = 51;</code>
-     */
-    com.google.protobuf.ByteString getAbiName();
-
-    /**
-     * <pre>
-     * ABI bitness that is current in use for the test. Example: '32', '64',
-     * </pre>
-     *
-     * <code>optional bytes abi_bitness = 52;</code>
-     */
-    boolean hasAbiBitness();
-    /**
-     * <pre>
-     * ABI bitness that is current in use for the test. Example: '32', '64',
-     * </pre>
-     *
-     * <code>optional bytes abi_bitness = 52;</code>
-     */
-    com.google.protobuf.ByteString getAbiBitness();
-
-    /**
-     * <pre>
-     * Device USB serial number
-     * </pre>
-     *
-     * <code>optional bytes serial = 101;</code>
-     */
-    boolean hasSerial();
-    /**
-     * <pre>
-     * Device USB serial number
-     * </pre>
-     *
-     * <code>optional bytes serial = 101;</code>
-     */
-    com.google.protobuf.ByteString getSerial();
-  }
-  /**
-   * <pre>
-   * To specify a call flow event.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.AndroidDeviceInfoMessage}
-   */
-  public  static final class AndroidDeviceInfoMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.AndroidDeviceInfoMessage)
-      AndroidDeviceInfoMessageOrBuilder {
-    // Use AndroidDeviceInfoMessage.newBuilder() to construct.
-    private AndroidDeviceInfoMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private AndroidDeviceInfoMessage() {
-      productType_ = com.google.protobuf.ByteString.EMPTY;
-      productVariant_ = com.google.protobuf.ByteString.EMPTY;
-      buildFlavor_ = com.google.protobuf.ByteString.EMPTY;
-      buildId_ = com.google.protobuf.ByteString.EMPTY;
-      branch_ = com.google.protobuf.ByteString.EMPTY;
-      buildAlias_ = com.google.protobuf.ByteString.EMPTY;
-      apiLevel_ = com.google.protobuf.ByteString.EMPTY;
-      abiName_ = com.google.protobuf.ByteString.EMPTY;
-      abiBitness_ = com.google.protobuf.ByteString.EMPTY;
-      serial_ = com.google.protobuf.ByteString.EMPTY;
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private AndroidDeviceInfoMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              productType_ = input.readBytes();
-              break;
-            }
-            case 18: {
-              bitField0_ |= 0x00000002;
-              productVariant_ = input.readBytes();
-              break;
-            }
-            case 90: {
-              bitField0_ |= 0x00000004;
-              buildFlavor_ = input.readBytes();
-              break;
-            }
-            case 98: {
-              bitField0_ |= 0x00000008;
-              buildId_ = input.readBytes();
-              break;
-            }
-            case 170: {
-              bitField0_ |= 0x00000010;
-              branch_ = input.readBytes();
-              break;
-            }
-            case 178: {
-              bitField0_ |= 0x00000020;
-              buildAlias_ = input.readBytes();
-              break;
-            }
-            case 250: {
-              bitField0_ |= 0x00000040;
-              apiLevel_ = input.readBytes();
-              break;
-            }
-            case 410: {
-              bitField0_ |= 0x00000080;
-              abiName_ = input.readBytes();
-              break;
-            }
-            case 418: {
-              bitField0_ |= 0x00000100;
-              abiBitness_ = input.readBytes();
-              break;
-            }
-            case 810: {
-              bitField0_ |= 0x00000200;
-              serial_ = input.readBytes();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidDeviceInfoMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidDeviceInfoMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.class, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int PRODUCT_TYPE_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString productType_;
-    /**
-     * <pre>
-     * product type (e.g., bullhead).
-     * </pre>
-     *
-     * <code>optional bytes product_type = 1;</code>
-     */
-    public boolean hasProductType() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * product type (e.g., bullhead).
-     * </pre>
-     *
-     * <code>optional bytes product_type = 1;</code>
-     */
-    public com.google.protobuf.ByteString getProductType() {
-      return productType_;
-    }
-
-    public static final int PRODUCT_VARIANT_FIELD_NUMBER = 2;
-    private com.google.protobuf.ByteString productVariant_;
-    /**
-     * <pre>
-     * product type variant (e.g., still bullhead or another name).
-     * </pre>
-     *
-     * <code>optional bytes product_variant = 2;</code>
-     */
-    public boolean hasProductVariant() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <pre>
-     * product type variant (e.g., still bullhead or another name).
-     * </pre>
-     *
-     * <code>optional bytes product_variant = 2;</code>
-     */
-    public com.google.protobuf.ByteString getProductVariant() {
-      return productVariant_;
-    }
-
-    public static final int BUILD_FLAVOR_FIELD_NUMBER = 11;
-    private com.google.protobuf.ByteString buildFlavor_;
-    /**
-     * <pre>
-     * build type (e.g., userdebug).
-     * </pre>
-     *
-     * <code>optional bytes build_flavor = 11;</code>
-     */
-    public boolean hasBuildFlavor() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <pre>
-     * build type (e.g., userdebug).
-     * </pre>
-     *
-     * <code>optional bytes build_flavor = 11;</code>
-     */
-    public com.google.protobuf.ByteString getBuildFlavor() {
-      return buildFlavor_;
-    }
-
-    public static final int BUILD_ID_FIELD_NUMBER = 12;
-    private com.google.protobuf.ByteString buildId_;
-    /**
-     * <pre>
-     * Android Build ID.
-     * </pre>
-     *
-     * <code>optional bytes build_id = 12;</code>
-     */
-    public boolean hasBuildId() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <pre>
-     * Android Build ID.
-     * </pre>
-     *
-     * <code>optional bytes build_id = 12;</code>
-     */
-    public com.google.protobuf.ByteString getBuildId() {
-      return buildId_;
-    }
-
-    public static final int BRANCH_FIELD_NUMBER = 21;
-    private com.google.protobuf.ByteString branch_;
-    /**
-     * <pre>
-     * branch name (e.g., master or nyc-dev).
-     * </pre>
-     *
-     * <code>optional bytes branch = 21;</code>
-     */
-    public boolean hasBranch() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <pre>
-     * branch name (e.g., master or nyc-dev).
-     * </pre>
-     *
-     * <code>optional bytes branch = 21;</code>
-     */
-    public com.google.protobuf.ByteString getBranch() {
-      return branch_;
-    }
-
-    public static final int BUILD_ALIAS_FIELD_NUMBER = 22;
-    private com.google.protobuf.ByteString buildAlias_;
-    /**
-     * <pre>
-     * build alias implies the branch name.
-     * </pre>
-     *
-     * <code>optional bytes build_alias = 22;</code>
-     */
-    public boolean hasBuildAlias() {
-      return ((bitField0_ & 0x00000020) == 0x00000020);
-    }
-    /**
-     * <pre>
-     * build alias implies the branch name.
-     * </pre>
-     *
-     * <code>optional bytes build_alias = 22;</code>
-     */
-    public com.google.protobuf.ByteString getBuildAlias() {
-      return buildAlias_;
-    }
-
-    public static final int API_LEVEL_FIELD_NUMBER = 31;
-    private com.google.protobuf.ByteString apiLevel_;
-    /**
-     * <pre>
-     * API level
-     * </pre>
-     *
-     * <code>optional bytes api_level = 31;</code>
-     */
-    public boolean hasApiLevel() {
-      return ((bitField0_ & 0x00000040) == 0x00000040);
-    }
-    /**
-     * <pre>
-     * API level
-     * </pre>
-     *
-     * <code>optional bytes api_level = 31;</code>
-     */
-    public com.google.protobuf.ByteString getApiLevel() {
-      return apiLevel_;
-    }
-
-    public static final int ABI_NAME_FIELD_NUMBER = 51;
-    private com.google.protobuf.ByteString abiName_;
-    /**
-     * <pre>
-     * ABI name that is current in use for the test
-     * </pre>
-     *
-     * <code>optional bytes abi_name = 51;</code>
-     */
-    public boolean hasAbiName() {
-      return ((bitField0_ & 0x00000080) == 0x00000080);
-    }
-    /**
-     * <pre>
-     * ABI name that is current in use for the test
-     * </pre>
-     *
-     * <code>optional bytes abi_name = 51;</code>
-     */
-    public com.google.protobuf.ByteString getAbiName() {
-      return abiName_;
-    }
-
-    public static final int ABI_BITNESS_FIELD_NUMBER = 52;
-    private com.google.protobuf.ByteString abiBitness_;
-    /**
-     * <pre>
-     * ABI bitness that is current in use for the test. Example: '32', '64',
-     * </pre>
-     *
-     * <code>optional bytes abi_bitness = 52;</code>
-     */
-    public boolean hasAbiBitness() {
-      return ((bitField0_ & 0x00000100) == 0x00000100);
-    }
-    /**
-     * <pre>
-     * ABI bitness that is current in use for the test. Example: '32', '64',
-     * </pre>
-     *
-     * <code>optional bytes abi_bitness = 52;</code>
-     */
-    public com.google.protobuf.ByteString getAbiBitness() {
-      return abiBitness_;
-    }
-
-    public static final int SERIAL_FIELD_NUMBER = 101;
-    private com.google.protobuf.ByteString serial_;
-    /**
-     * <pre>
-     * Device USB serial number
-     * </pre>
-     *
-     * <code>optional bytes serial = 101;</code>
-     */
-    public boolean hasSerial() {
-      return ((bitField0_ & 0x00000200) == 0x00000200);
-    }
-    /**
-     * <pre>
-     * Device USB serial number
-     * </pre>
-     *
-     * <code>optional bytes serial = 101;</code>
-     */
-    public com.google.protobuf.ByteString getSerial() {
-      return serial_;
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, productType_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(2, productVariant_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(11, buildFlavor_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeBytes(12, buildId_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeBytes(21, branch_);
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        output.writeBytes(22, buildAlias_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        output.writeBytes(31, apiLevel_);
-      }
-      if (((bitField0_ & 0x00000080) == 0x00000080)) {
-        output.writeBytes(51, abiName_);
-      }
-      if (((bitField0_ & 0x00000100) == 0x00000100)) {
-        output.writeBytes(52, abiBitness_);
-      }
-      if (((bitField0_ & 0x00000200) == 0x00000200)) {
-        output.writeBytes(101, serial_);
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, productType_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, productVariant_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(11, buildFlavor_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(12, buildId_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(21, branch_);
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(22, buildAlias_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(31, apiLevel_);
-      }
-      if (((bitField0_ & 0x00000080) == 0x00000080)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(51, abiName_);
-      }
-      if (((bitField0_ & 0x00000100) == 0x00000100)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(52, abiBitness_);
-      }
-      if (((bitField0_ & 0x00000200) == 0x00000200)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(101, serial_);
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage other = (com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage) obj;
-
-      boolean result = true;
-      result = result && (hasProductType() == other.hasProductType());
-      if (hasProductType()) {
-        result = result && getProductType()
-            .equals(other.getProductType());
-      }
-      result = result && (hasProductVariant() == other.hasProductVariant());
-      if (hasProductVariant()) {
-        result = result && getProductVariant()
-            .equals(other.getProductVariant());
-      }
-      result = result && (hasBuildFlavor() == other.hasBuildFlavor());
-      if (hasBuildFlavor()) {
-        result = result && getBuildFlavor()
-            .equals(other.getBuildFlavor());
-      }
-      result = result && (hasBuildId() == other.hasBuildId());
-      if (hasBuildId()) {
-        result = result && getBuildId()
-            .equals(other.getBuildId());
-      }
-      result = result && (hasBranch() == other.hasBranch());
-      if (hasBranch()) {
-        result = result && getBranch()
-            .equals(other.getBranch());
-      }
-      result = result && (hasBuildAlias() == other.hasBuildAlias());
-      if (hasBuildAlias()) {
-        result = result && getBuildAlias()
-            .equals(other.getBuildAlias());
-      }
-      result = result && (hasApiLevel() == other.hasApiLevel());
-      if (hasApiLevel()) {
-        result = result && getApiLevel()
-            .equals(other.getApiLevel());
-      }
-      result = result && (hasAbiName() == other.hasAbiName());
-      if (hasAbiName()) {
-        result = result && getAbiName()
-            .equals(other.getAbiName());
-      }
-      result = result && (hasAbiBitness() == other.hasAbiBitness());
-      if (hasAbiBitness()) {
-        result = result && getAbiBitness()
-            .equals(other.getAbiBitness());
-      }
-      result = result && (hasSerial() == other.hasSerial());
-      if (hasSerial()) {
-        result = result && getSerial()
-            .equals(other.getSerial());
-      }
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasProductType()) {
-        hash = (37 * hash) + PRODUCT_TYPE_FIELD_NUMBER;
-        hash = (53 * hash) + getProductType().hashCode();
-      }
-      if (hasProductVariant()) {
-        hash = (37 * hash) + PRODUCT_VARIANT_FIELD_NUMBER;
-        hash = (53 * hash) + getProductVariant().hashCode();
-      }
-      if (hasBuildFlavor()) {
-        hash = (37 * hash) + BUILD_FLAVOR_FIELD_NUMBER;
-        hash = (53 * hash) + getBuildFlavor().hashCode();
-      }
-      if (hasBuildId()) {
-        hash = (37 * hash) + BUILD_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getBuildId().hashCode();
-      }
-      if (hasBranch()) {
-        hash = (37 * hash) + BRANCH_FIELD_NUMBER;
-        hash = (53 * hash) + getBranch().hashCode();
-      }
-      if (hasBuildAlias()) {
-        hash = (37 * hash) + BUILD_ALIAS_FIELD_NUMBER;
-        hash = (53 * hash) + getBuildAlias().hashCode();
-      }
-      if (hasApiLevel()) {
-        hash = (37 * hash) + API_LEVEL_FIELD_NUMBER;
-        hash = (53 * hash) + getApiLevel().hashCode();
-      }
-      if (hasAbiName()) {
-        hash = (37 * hash) + ABI_NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getAbiName().hashCode();
-      }
-      if (hasAbiBitness()) {
-        hash = (37 * hash) + ABI_BITNESS_FIELD_NUMBER;
-        hash = (53 * hash) + getAbiBitness().hashCode();
-      }
-      if (hasSerial()) {
-        hash = (37 * hash) + SERIAL_FIELD_NUMBER;
-        hash = (53 * hash) + getSerial().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify a call flow event.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.AndroidDeviceInfoMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.AndroidDeviceInfoMessage)
-        com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidDeviceInfoMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidDeviceInfoMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.class, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        productType_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        productVariant_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        buildFlavor_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        buildId_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000008);
-        branch_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000010);
-        buildAlias_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000020);
-        apiLevel_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000040);
-        abiName_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000080);
-        abiBitness_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000100);
-        serial_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000200);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidDeviceInfoMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage build() {
-        com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage result = new com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.productType_ = productType_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.productVariant_ = productVariant_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.buildFlavor_ = buildFlavor_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.buildId_ = buildId_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        result.branch_ = branch_;
-        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
-          to_bitField0_ |= 0x00000020;
-        }
-        result.buildAlias_ = buildAlias_;
-        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
-          to_bitField0_ |= 0x00000040;
-        }
-        result.apiLevel_ = apiLevel_;
-        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
-          to_bitField0_ |= 0x00000080;
-        }
-        result.abiName_ = abiName_;
-        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
-          to_bitField0_ |= 0x00000100;
-        }
-        result.abiBitness_ = abiBitness_;
-        if (((from_bitField0_ & 0x00000200) == 0x00000200)) {
-          to_bitField0_ |= 0x00000200;
-        }
-        result.serial_ = serial_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.getDefaultInstance()) return this;
-        if (other.hasProductType()) {
-          setProductType(other.getProductType());
-        }
-        if (other.hasProductVariant()) {
-          setProductVariant(other.getProductVariant());
-        }
-        if (other.hasBuildFlavor()) {
-          setBuildFlavor(other.getBuildFlavor());
-        }
-        if (other.hasBuildId()) {
-          setBuildId(other.getBuildId());
-        }
-        if (other.hasBranch()) {
-          setBranch(other.getBranch());
-        }
-        if (other.hasBuildAlias()) {
-          setBuildAlias(other.getBuildAlias());
-        }
-        if (other.hasApiLevel()) {
-          setApiLevel(other.getApiLevel());
-        }
-        if (other.hasAbiName()) {
-          setAbiName(other.getAbiName());
-        }
-        if (other.hasAbiBitness()) {
-          setAbiBitness(other.getAbiBitness());
-        }
-        if (other.hasSerial()) {
-          setSerial(other.getSerial());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString productType_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * product type (e.g., bullhead).
-       * </pre>
-       *
-       * <code>optional bytes product_type = 1;</code>
-       */
-      public boolean hasProductType() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * product type (e.g., bullhead).
-       * </pre>
-       *
-       * <code>optional bytes product_type = 1;</code>
-       */
-      public com.google.protobuf.ByteString getProductType() {
-        return productType_;
-      }
-      /**
-       * <pre>
-       * product type (e.g., bullhead).
-       * </pre>
-       *
-       * <code>optional bytes product_type = 1;</code>
-       */
-      public Builder setProductType(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        productType_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * product type (e.g., bullhead).
-       * </pre>
-       *
-       * <code>optional bytes product_type = 1;</code>
-       */
-      public Builder clearProductType() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        productType_ = getDefaultInstance().getProductType();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString productVariant_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * product type variant (e.g., still bullhead or another name).
-       * </pre>
-       *
-       * <code>optional bytes product_variant = 2;</code>
-       */
-      public boolean hasProductVariant() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <pre>
-       * product type variant (e.g., still bullhead or another name).
-       * </pre>
-       *
-       * <code>optional bytes product_variant = 2;</code>
-       */
-      public com.google.protobuf.ByteString getProductVariant() {
-        return productVariant_;
-      }
-      /**
-       * <pre>
-       * product type variant (e.g., still bullhead or another name).
-       * </pre>
-       *
-       * <code>optional bytes product_variant = 2;</code>
-       */
-      public Builder setProductVariant(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        productVariant_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * product type variant (e.g., still bullhead or another name).
-       * </pre>
-       *
-       * <code>optional bytes product_variant = 2;</code>
-       */
-      public Builder clearProductVariant() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        productVariant_ = getDefaultInstance().getProductVariant();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString buildFlavor_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * build type (e.g., userdebug).
-       * </pre>
-       *
-       * <code>optional bytes build_flavor = 11;</code>
-       */
-      public boolean hasBuildFlavor() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <pre>
-       * build type (e.g., userdebug).
-       * </pre>
-       *
-       * <code>optional bytes build_flavor = 11;</code>
-       */
-      public com.google.protobuf.ByteString getBuildFlavor() {
-        return buildFlavor_;
-      }
-      /**
-       * <pre>
-       * build type (e.g., userdebug).
-       * </pre>
-       *
-       * <code>optional bytes build_flavor = 11;</code>
-       */
-      public Builder setBuildFlavor(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        buildFlavor_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * build type (e.g., userdebug).
-       * </pre>
-       *
-       * <code>optional bytes build_flavor = 11;</code>
-       */
-      public Builder clearBuildFlavor() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        buildFlavor_ = getDefaultInstance().getBuildFlavor();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString buildId_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * Android Build ID.
-       * </pre>
-       *
-       * <code>optional bytes build_id = 12;</code>
-       */
-      public boolean hasBuildId() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <pre>
-       * Android Build ID.
-       * </pre>
-       *
-       * <code>optional bytes build_id = 12;</code>
-       */
-      public com.google.protobuf.ByteString getBuildId() {
-        return buildId_;
-      }
-      /**
-       * <pre>
-       * Android Build ID.
-       * </pre>
-       *
-       * <code>optional bytes build_id = 12;</code>
-       */
-      public Builder setBuildId(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000008;
-        buildId_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Android Build ID.
-       * </pre>
-       *
-       * <code>optional bytes build_id = 12;</code>
-       */
-      public Builder clearBuildId() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        buildId_ = getDefaultInstance().getBuildId();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString branch_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * branch name (e.g., master or nyc-dev).
-       * </pre>
-       *
-       * <code>optional bytes branch = 21;</code>
-       */
-      public boolean hasBranch() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <pre>
-       * branch name (e.g., master or nyc-dev).
-       * </pre>
-       *
-       * <code>optional bytes branch = 21;</code>
-       */
-      public com.google.protobuf.ByteString getBranch() {
-        return branch_;
-      }
-      /**
-       * <pre>
-       * branch name (e.g., master or nyc-dev).
-       * </pre>
-       *
-       * <code>optional bytes branch = 21;</code>
-       */
-      public Builder setBranch(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000010;
-        branch_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * branch name (e.g., master or nyc-dev).
-       * </pre>
-       *
-       * <code>optional bytes branch = 21;</code>
-       */
-      public Builder clearBranch() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        branch_ = getDefaultInstance().getBranch();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString buildAlias_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * build alias implies the branch name.
-       * </pre>
-       *
-       * <code>optional bytes build_alias = 22;</code>
-       */
-      public boolean hasBuildAlias() {
-        return ((bitField0_ & 0x00000020) == 0x00000020);
-      }
-      /**
-       * <pre>
-       * build alias implies the branch name.
-       * </pre>
-       *
-       * <code>optional bytes build_alias = 22;</code>
-       */
-      public com.google.protobuf.ByteString getBuildAlias() {
-        return buildAlias_;
-      }
-      /**
-       * <pre>
-       * build alias implies the branch name.
-       * </pre>
-       *
-       * <code>optional bytes build_alias = 22;</code>
-       */
-      public Builder setBuildAlias(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000020;
-        buildAlias_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * build alias implies the branch name.
-       * </pre>
-       *
-       * <code>optional bytes build_alias = 22;</code>
-       */
-      public Builder clearBuildAlias() {
-        bitField0_ = (bitField0_ & ~0x00000020);
-        buildAlias_ = getDefaultInstance().getBuildAlias();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString apiLevel_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * API level
-       * </pre>
-       *
-       * <code>optional bytes api_level = 31;</code>
-       */
-      public boolean hasApiLevel() {
-        return ((bitField0_ & 0x00000040) == 0x00000040);
-      }
-      /**
-       * <pre>
-       * API level
-       * </pre>
-       *
-       * <code>optional bytes api_level = 31;</code>
-       */
-      public com.google.protobuf.ByteString getApiLevel() {
-        return apiLevel_;
-      }
-      /**
-       * <pre>
-       * API level
-       * </pre>
-       *
-       * <code>optional bytes api_level = 31;</code>
-       */
-      public Builder setApiLevel(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000040;
-        apiLevel_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * API level
-       * </pre>
-       *
-       * <code>optional bytes api_level = 31;</code>
-       */
-      public Builder clearApiLevel() {
-        bitField0_ = (bitField0_ & ~0x00000040);
-        apiLevel_ = getDefaultInstance().getApiLevel();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString abiName_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * ABI name that is current in use for the test
-       * </pre>
-       *
-       * <code>optional bytes abi_name = 51;</code>
-       */
-      public boolean hasAbiName() {
-        return ((bitField0_ & 0x00000080) == 0x00000080);
-      }
-      /**
-       * <pre>
-       * ABI name that is current in use for the test
-       * </pre>
-       *
-       * <code>optional bytes abi_name = 51;</code>
-       */
-      public com.google.protobuf.ByteString getAbiName() {
-        return abiName_;
-      }
-      /**
-       * <pre>
-       * ABI name that is current in use for the test
-       * </pre>
-       *
-       * <code>optional bytes abi_name = 51;</code>
-       */
-      public Builder setAbiName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000080;
-        abiName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * ABI name that is current in use for the test
-       * </pre>
-       *
-       * <code>optional bytes abi_name = 51;</code>
-       */
-      public Builder clearAbiName() {
-        bitField0_ = (bitField0_ & ~0x00000080);
-        abiName_ = getDefaultInstance().getAbiName();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString abiBitness_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * ABI bitness that is current in use for the test. Example: '32', '64',
-       * </pre>
-       *
-       * <code>optional bytes abi_bitness = 52;</code>
-       */
-      public boolean hasAbiBitness() {
-        return ((bitField0_ & 0x00000100) == 0x00000100);
-      }
-      /**
-       * <pre>
-       * ABI bitness that is current in use for the test. Example: '32', '64',
-       * </pre>
-       *
-       * <code>optional bytes abi_bitness = 52;</code>
-       */
-      public com.google.protobuf.ByteString getAbiBitness() {
-        return abiBitness_;
-      }
-      /**
-       * <pre>
-       * ABI bitness that is current in use for the test. Example: '32', '64',
-       * </pre>
-       *
-       * <code>optional bytes abi_bitness = 52;</code>
-       */
-      public Builder setAbiBitness(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000100;
-        abiBitness_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * ABI bitness that is current in use for the test. Example: '32', '64',
-       * </pre>
-       *
-       * <code>optional bytes abi_bitness = 52;</code>
-       */
-      public Builder clearAbiBitness() {
-        bitField0_ = (bitField0_ & ~0x00000100);
-        abiBitness_ = getDefaultInstance().getAbiBitness();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString serial_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * Device USB serial number
-       * </pre>
-       *
-       * <code>optional bytes serial = 101;</code>
-       */
-      public boolean hasSerial() {
-        return ((bitField0_ & 0x00000200) == 0x00000200);
-      }
-      /**
-       * <pre>
-       * Device USB serial number
-       * </pre>
-       *
-       * <code>optional bytes serial = 101;</code>
-       */
-      public com.google.protobuf.ByteString getSerial() {
-        return serial_;
-      }
-      /**
-       * <pre>
-       * Device USB serial number
-       * </pre>
-       *
-       * <code>optional bytes serial = 101;</code>
-       */
-      public Builder setSerial(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000200;
-        serial_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Device USB serial number
-       * </pre>
-       *
-       * <code>optional bytes serial = 101;</code>
-       */
-      public Builder clearSerial() {
-        bitField0_ = (bitField0_ & ~0x00000200);
-        serial_ = getDefaultInstance().getSerial();
-        onChanged();
-        return this;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.AndroidDeviceInfoMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.AndroidDeviceInfoMessage)
-    private static final com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<AndroidDeviceInfoMessage>
-        PARSER = new com.google.protobuf.AbstractParser<AndroidDeviceInfoMessage>() {
-      public AndroidDeviceInfoMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new AndroidDeviceInfoMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<AndroidDeviceInfoMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<AndroidDeviceInfoMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface AndroidBuildInfoOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.AndroidBuildInfo)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * build ID.
-     * </pre>
-     *
-     * <code>optional bytes id = 1;</code>
-     */
-    boolean hasId();
-    /**
-     * <pre>
-     * build ID.
-     * </pre>
-     *
-     * <code>optional bytes id = 1;</code>
-     */
-    com.google.protobuf.ByteString getId();
-
-    /**
-     * <pre>
-     * device name (e.g., bullhead).
-     * </pre>
-     *
-     * <code>optional bytes name = 11;</code>
-     */
-    boolean hasName();
-    /**
-     * <pre>
-     * device name (e.g., bullhead).
-     * </pre>
-     *
-     * <code>optional bytes name = 11;</code>
-     */
-    com.google.protobuf.ByteString getName();
-
-    /**
-     * <pre>
-     * build type (e.g., userdebug)
-     * </pre>
-     *
-     * <code>optional bytes build_type = 12;</code>
-     */
-    boolean hasBuildType();
-    /**
-     * <pre>
-     * build type (e.g., userdebug)
-     * </pre>
-     *
-     * <code>optional bytes build_type = 12;</code>
-     */
-    com.google.protobuf.ByteString getBuildType();
-
-    /**
-     * <pre>
-     * branch name (e.g., master or nyc-dev)
-     * </pre>
-     *
-     * <code>optional bytes branch = 13;</code>
-     */
-    boolean hasBranch();
-    /**
-     * <pre>
-     * branch name (e.g., master or nyc-dev)
-     * </pre>
-     *
-     * <code>optional bytes branch = 13;</code>
-     */
-    com.google.protobuf.ByteString getBranch();
-
-    /**
-     * <pre>
-     * indicates the latest commit information of each branch (e.g., xml format).
-     * </pre>
-     *
-     * <code>optional bytes build_summary = 21;</code>
-     */
-    boolean hasBuildSummary();
-    /**
-     * <pre>
-     * indicates the latest commit information of each branch (e.g., xml format).
-     * </pre>
-     *
-     * <code>optional bytes build_summary = 21;</code>
-     */
-    com.google.protobuf.ByteString getBuildSummary();
-  }
-  /**
-   * <pre>
-   * To specify build info.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.AndroidBuildInfo}
-   */
-  public  static final class AndroidBuildInfo extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.AndroidBuildInfo)
-      AndroidBuildInfoOrBuilder {
-    // Use AndroidBuildInfo.newBuilder() to construct.
-    private AndroidBuildInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private AndroidBuildInfo() {
-      id_ = com.google.protobuf.ByteString.EMPTY;
-      name_ = com.google.protobuf.ByteString.EMPTY;
-      buildType_ = com.google.protobuf.ByteString.EMPTY;
-      branch_ = com.google.protobuf.ByteString.EMPTY;
-      buildSummary_ = com.google.protobuf.ByteString.EMPTY;
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private AndroidBuildInfo(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              id_ = input.readBytes();
-              break;
-            }
-            case 90: {
-              bitField0_ |= 0x00000002;
-              name_ = input.readBytes();
-              break;
-            }
-            case 98: {
-              bitField0_ |= 0x00000004;
-              buildType_ = input.readBytes();
-              break;
-            }
-            case 106: {
-              bitField0_ |= 0x00000008;
-              branch_ = input.readBytes();
-              break;
-            }
-            case 170: {
-              bitField0_ |= 0x00000010;
-              buildSummary_ = input.readBytes();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidBuildInfo_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidBuildInfo_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.class, com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int ID_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString id_;
-    /**
-     * <pre>
-     * build ID.
-     * </pre>
-     *
-     * <code>optional bytes id = 1;</code>
-     */
-    public boolean hasId() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * build ID.
-     * </pre>
-     *
-     * <code>optional bytes id = 1;</code>
-     */
-    public com.google.protobuf.ByteString getId() {
-      return id_;
-    }
-
-    public static final int NAME_FIELD_NUMBER = 11;
-    private com.google.protobuf.ByteString name_;
-    /**
-     * <pre>
-     * device name (e.g., bullhead).
-     * </pre>
-     *
-     * <code>optional bytes name = 11;</code>
-     */
-    public boolean hasName() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <pre>
-     * device name (e.g., bullhead).
-     * </pre>
-     *
-     * <code>optional bytes name = 11;</code>
-     */
-    public com.google.protobuf.ByteString getName() {
-      return name_;
-    }
-
-    public static final int BUILD_TYPE_FIELD_NUMBER = 12;
-    private com.google.protobuf.ByteString buildType_;
-    /**
-     * <pre>
-     * build type (e.g., userdebug)
-     * </pre>
-     *
-     * <code>optional bytes build_type = 12;</code>
-     */
-    public boolean hasBuildType() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <pre>
-     * build type (e.g., userdebug)
-     * </pre>
-     *
-     * <code>optional bytes build_type = 12;</code>
-     */
-    public com.google.protobuf.ByteString getBuildType() {
-      return buildType_;
-    }
-
-    public static final int BRANCH_FIELD_NUMBER = 13;
-    private com.google.protobuf.ByteString branch_;
-    /**
-     * <pre>
-     * branch name (e.g., master or nyc-dev)
-     * </pre>
-     *
-     * <code>optional bytes branch = 13;</code>
-     */
-    public boolean hasBranch() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <pre>
-     * branch name (e.g., master or nyc-dev)
-     * </pre>
-     *
-     * <code>optional bytes branch = 13;</code>
-     */
-    public com.google.protobuf.ByteString getBranch() {
-      return branch_;
-    }
-
-    public static final int BUILD_SUMMARY_FIELD_NUMBER = 21;
-    private com.google.protobuf.ByteString buildSummary_;
-    /**
-     * <pre>
-     * indicates the latest commit information of each branch (e.g., xml format).
-     * </pre>
-     *
-     * <code>optional bytes build_summary = 21;</code>
-     */
-    public boolean hasBuildSummary() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <pre>
-     * indicates the latest commit information of each branch (e.g., xml format).
-     * </pre>
-     *
-     * <code>optional bytes build_summary = 21;</code>
-     */
-    public com.google.protobuf.ByteString getBuildSummary() {
-      return buildSummary_;
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, id_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(11, name_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(12, buildType_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeBytes(13, branch_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeBytes(21, buildSummary_);
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, id_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(11, name_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(12, buildType_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(13, branch_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(21, buildSummary_);
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.AndroidBuildInfo)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.AndroidBuildInfo other = (com.android.vts.proto.VtsReportMessage.AndroidBuildInfo) obj;
-
-      boolean result = true;
-      result = result && (hasId() == other.hasId());
-      if (hasId()) {
-        result = result && getId()
-            .equals(other.getId());
-      }
-      result = result && (hasName() == other.hasName());
-      if (hasName()) {
-        result = result && getName()
-            .equals(other.getName());
-      }
-      result = result && (hasBuildType() == other.hasBuildType());
-      if (hasBuildType()) {
-        result = result && getBuildType()
-            .equals(other.getBuildType());
-      }
-      result = result && (hasBranch() == other.hasBranch());
-      if (hasBranch()) {
-        result = result && getBranch()
-            .equals(other.getBranch());
-      }
-      result = result && (hasBuildSummary() == other.hasBuildSummary());
-      if (hasBuildSummary()) {
-        result = result && getBuildSummary()
-            .equals(other.getBuildSummary());
-      }
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasId()) {
-        hash = (37 * hash) + ID_FIELD_NUMBER;
-        hash = (53 * hash) + getId().hashCode();
-      }
-      if (hasName()) {
-        hash = (37 * hash) + NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getName().hashCode();
-      }
-      if (hasBuildType()) {
-        hash = (37 * hash) + BUILD_TYPE_FIELD_NUMBER;
-        hash = (53 * hash) + getBuildType().hashCode();
-      }
-      if (hasBranch()) {
-        hash = (37 * hash) + BRANCH_FIELD_NUMBER;
-        hash = (53 * hash) + getBranch().hashCode();
-      }
-      if (hasBuildSummary()) {
-        hash = (37 * hash) + BUILD_SUMMARY_FIELD_NUMBER;
-        hash = (53 * hash) + getBuildSummary().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.AndroidBuildInfo prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify build info.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.AndroidBuildInfo}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.AndroidBuildInfo)
-        com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidBuildInfo_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidBuildInfo_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.class, com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        id_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        name_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        buildType_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        branch_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000008);
-        buildSummary_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000010);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_AndroidBuildInfo_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo build() {
-        com.android.vts.proto.VtsReportMessage.AndroidBuildInfo result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo buildPartial() {
-        com.android.vts.proto.VtsReportMessage.AndroidBuildInfo result = new com.android.vts.proto.VtsReportMessage.AndroidBuildInfo(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.id_ = id_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.name_ = name_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.buildType_ = buildType_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.branch_ = branch_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        result.buildSummary_ = buildSummary_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.AndroidBuildInfo) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.AndroidBuildInfo)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.AndroidBuildInfo other) {
-        if (other == com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance()) return this;
-        if (other.hasId()) {
-          setId(other.getId());
-        }
-        if (other.hasName()) {
-          setName(other.getName());
-        }
-        if (other.hasBuildType()) {
-          setBuildType(other.getBuildType());
-        }
-        if (other.hasBranch()) {
-          setBranch(other.getBranch());
-        }
-        if (other.hasBuildSummary()) {
-          setBuildSummary(other.getBuildSummary());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.AndroidBuildInfo parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.AndroidBuildInfo) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString id_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * build ID.
-       * </pre>
-       *
-       * <code>optional bytes id = 1;</code>
-       */
-      public boolean hasId() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * build ID.
-       * </pre>
-       *
-       * <code>optional bytes id = 1;</code>
-       */
-      public com.google.protobuf.ByteString getId() {
-        return id_;
-      }
-      /**
-       * <pre>
-       * build ID.
-       * </pre>
-       *
-       * <code>optional bytes id = 1;</code>
-       */
-      public Builder setId(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        id_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * build ID.
-       * </pre>
-       *
-       * <code>optional bytes id = 1;</code>
-       */
-      public Builder clearId() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        id_ = getDefaultInstance().getId();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * device name (e.g., bullhead).
-       * </pre>
-       *
-       * <code>optional bytes name = 11;</code>
-       */
-      public boolean hasName() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <pre>
-       * device name (e.g., bullhead).
-       * </pre>
-       *
-       * <code>optional bytes name = 11;</code>
-       */
-      public com.google.protobuf.ByteString getName() {
-        return name_;
-      }
-      /**
-       * <pre>
-       * device name (e.g., bullhead).
-       * </pre>
-       *
-       * <code>optional bytes name = 11;</code>
-       */
-      public Builder setName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * device name (e.g., bullhead).
-       * </pre>
-       *
-       * <code>optional bytes name = 11;</code>
-       */
-      public Builder clearName() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString buildType_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * build type (e.g., userdebug)
-       * </pre>
-       *
-       * <code>optional bytes build_type = 12;</code>
-       */
-      public boolean hasBuildType() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <pre>
-       * build type (e.g., userdebug)
-       * </pre>
-       *
-       * <code>optional bytes build_type = 12;</code>
-       */
-      public com.google.protobuf.ByteString getBuildType() {
-        return buildType_;
-      }
-      /**
-       * <pre>
-       * build type (e.g., userdebug)
-       * </pre>
-       *
-       * <code>optional bytes build_type = 12;</code>
-       */
-      public Builder setBuildType(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        buildType_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * build type (e.g., userdebug)
-       * </pre>
-       *
-       * <code>optional bytes build_type = 12;</code>
-       */
-      public Builder clearBuildType() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        buildType_ = getDefaultInstance().getBuildType();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString branch_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * branch name (e.g., master or nyc-dev)
-       * </pre>
-       *
-       * <code>optional bytes branch = 13;</code>
-       */
-      public boolean hasBranch() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <pre>
-       * branch name (e.g., master or nyc-dev)
-       * </pre>
-       *
-       * <code>optional bytes branch = 13;</code>
-       */
-      public com.google.protobuf.ByteString getBranch() {
-        return branch_;
-      }
-      /**
-       * <pre>
-       * branch name (e.g., master or nyc-dev)
-       * </pre>
-       *
-       * <code>optional bytes branch = 13;</code>
-       */
-      public Builder setBranch(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000008;
-        branch_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * branch name (e.g., master or nyc-dev)
-       * </pre>
-       *
-       * <code>optional bytes branch = 13;</code>
-       */
-      public Builder clearBranch() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        branch_ = getDefaultInstance().getBranch();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString buildSummary_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * indicates the latest commit information of each branch (e.g., xml format).
-       * </pre>
-       *
-       * <code>optional bytes build_summary = 21;</code>
-       */
-      public boolean hasBuildSummary() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <pre>
-       * indicates the latest commit information of each branch (e.g., xml format).
-       * </pre>
-       *
-       * <code>optional bytes build_summary = 21;</code>
-       */
-      public com.google.protobuf.ByteString getBuildSummary() {
-        return buildSummary_;
-      }
-      /**
-       * <pre>
-       * indicates the latest commit information of each branch (e.g., xml format).
-       * </pre>
-       *
-       * <code>optional bytes build_summary = 21;</code>
-       */
-      public Builder setBuildSummary(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000010;
-        buildSummary_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * indicates the latest commit information of each branch (e.g., xml format).
-       * </pre>
-       *
-       * <code>optional bytes build_summary = 21;</code>
-       */
-      public Builder clearBuildSummary() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        buildSummary_ = getDefaultInstance().getBuildSummary();
-        onChanged();
-        return this;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.AndroidBuildInfo)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.AndroidBuildInfo)
-    private static final com.android.vts.proto.VtsReportMessage.AndroidBuildInfo DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.AndroidBuildInfo();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.AndroidBuildInfo getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<AndroidBuildInfo>
-        PARSER = new com.google.protobuf.AbstractParser<AndroidBuildInfo>() {
-      public AndroidBuildInfo parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new AndroidBuildInfo(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<AndroidBuildInfo> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<AndroidBuildInfo> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface VtsHostInfoOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.VtsHostInfo)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * the host name (i.e., full domain name).
-     * </pre>
-     *
-     * <code>optional bytes hostname = 1;</code>
-     */
-    boolean hasHostname();
-    /**
-     * <pre>
-     * the host name (i.e., full domain name).
-     * </pre>
-     *
-     * <code>optional bytes hostname = 1;</code>
-     */
-    com.google.protobuf.ByteString getHostname();
-  }
-  /**
-   * <pre>
-   * To specify the information about a host node.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.VtsHostInfo}
-   */
-  public  static final class VtsHostInfo extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.VtsHostInfo)
-      VtsHostInfoOrBuilder {
-    // Use VtsHostInfo.newBuilder() to construct.
-    private VtsHostInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private VtsHostInfo() {
-      hostname_ = com.google.protobuf.ByteString.EMPTY;
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private VtsHostInfo(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              hostname_ = input.readBytes();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_VtsHostInfo_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_VtsHostInfo_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.VtsHostInfo.class, com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int HOSTNAME_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString hostname_;
-    /**
-     * <pre>
-     * the host name (i.e., full domain name).
-     * </pre>
-     *
-     * <code>optional bytes hostname = 1;</code>
-     */
-    public boolean hasHostname() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * the host name (i.e., full domain name).
-     * </pre>
-     *
-     * <code>optional bytes hostname = 1;</code>
-     */
-    public com.google.protobuf.ByteString getHostname() {
-      return hostname_;
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, hostname_);
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, hostname_);
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.VtsHostInfo)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.VtsHostInfo other = (com.android.vts.proto.VtsReportMessage.VtsHostInfo) obj;
-
-      boolean result = true;
-      result = result && (hasHostname() == other.hasHostname());
-      if (hasHostname()) {
-        result = result && getHostname()
-            .equals(other.getHostname());
-      }
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasHostname()) {
-        hash = (37 * hash) + HOSTNAME_FIELD_NUMBER;
-        hash = (53 * hash) + getHostname().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.VtsHostInfo prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify the information about a host node.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.VtsHostInfo}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.VtsHostInfo)
-        com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_VtsHostInfo_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_VtsHostInfo_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.VtsHostInfo.class, com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.VtsHostInfo.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        hostname_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_VtsHostInfo_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfo getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfo build() {
-        com.android.vts.proto.VtsReportMessage.VtsHostInfo result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfo buildPartial() {
-        com.android.vts.proto.VtsReportMessage.VtsHostInfo result = new com.android.vts.proto.VtsReportMessage.VtsHostInfo(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.hostname_ = hostname_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.VtsHostInfo) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.VtsHostInfo)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.VtsHostInfo other) {
-        if (other == com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance()) return this;
-        if (other.hasHostname()) {
-          setHostname(other.getHostname());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.VtsHostInfo parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.VtsHostInfo) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString hostname_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * the host name (i.e., full domain name).
-       * </pre>
-       *
-       * <code>optional bytes hostname = 1;</code>
-       */
-      public boolean hasHostname() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * the host name (i.e., full domain name).
-       * </pre>
-       *
-       * <code>optional bytes hostname = 1;</code>
-       */
-      public com.google.protobuf.ByteString getHostname() {
-        return hostname_;
-      }
-      /**
-       * <pre>
-       * the host name (i.e., full domain name).
-       * </pre>
-       *
-       * <code>optional bytes hostname = 1;</code>
-       */
-      public Builder setHostname(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        hostname_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the host name (i.e., full domain name).
-       * </pre>
-       *
-       * <code>optional bytes hostname = 1;</code>
-       */
-      public Builder clearHostname() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        hostname_ = getDefaultInstance().getHostname();
-        onChanged();
-        return this;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.VtsHostInfo)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.VtsHostInfo)
-    private static final com.android.vts.proto.VtsReportMessage.VtsHostInfo DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.VtsHostInfo();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.VtsHostInfo getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<VtsHostInfo>
-        PARSER = new com.google.protobuf.AbstractParser<VtsHostInfo>() {
-      public VtsHostInfo parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new VtsHostInfo(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<VtsHostInfo> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<VtsHostInfo> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.VtsHostInfo getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface TestCaseReportMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.TestCaseReportMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * the test case name.
-     * </pre>
-     *
-     * <code>optional bytes name = 1;</code>
-     */
-    boolean hasName();
-    /**
-     * <pre>
-     * the test case name.
-     * </pre>
-     *
-     * <code>optional bytes name = 1;</code>
-     */
-    com.google.protobuf.ByteString getName();
-
-    /**
-     * <pre>
-     * the test result.
-     * </pre>
-     *
-     * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-     */
-    boolean hasTestResult();
-    /**
-     * <pre>
-     * the test result.
-     * </pre>
-     *
-     * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.TestCaseResult getTestResult();
-
-    /**
-     * <pre>
-     * execution start and end time stamp.
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 21;</code>
-     */
-    boolean hasStartTimestamp();
-    /**
-     * <pre>
-     * execution start and end time stamp.
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 21;</code>
-     */
-    long getStartTimestamp();
-
-    /**
-     * <code>optional int64 end_timestamp = 22;</code>
-     */
-    boolean hasEndTimestamp();
-    /**
-     * <code>optional int64 end_timestamp = 22;</code>
-     */
-    long getEndTimestamp();
-
-    /**
-     * <pre>
-     * coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> 
-        getCoverageList();
-    /**
-     * <pre>
-     * coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index);
-    /**
-     * <pre>
-     * coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     */
-    int getCoverageCount();
-    /**
-     * <pre>
-     * coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-        getCoverageOrBuilderList();
-    /**
-     * <pre>
-     * coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> 
-        getProfilingList();
-    /**
-     * <pre>
-     * profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index);
-    /**
-     * <pre>
-     * profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     */
-    int getProfilingCount();
-    /**
-     * <pre>
-     * profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-        getProfilingOrBuilderList();
-    /**
-     * <pre>
-     * profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder getProfilingOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> 
-        getSystraceList();
-    /**
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index);
-    /**
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated int getSystraceCount();
-    /**
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated java.util.List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-        getSystraceOrBuilderList();
-    /**
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder getSystraceOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> 
-        getLogList();
-    /**
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index);
-    /**
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     */
-    int getLogCount();
-    /**
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-        getLogOrBuilderList();
-    /**
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(
-        int index);
-  }
-  /**
-   * <pre>
-   * To specify a test case execution report.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.TestCaseReportMessage}
-   */
-  public  static final class TestCaseReportMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.TestCaseReportMessage)
-      TestCaseReportMessageOrBuilder {
-    // Use TestCaseReportMessage.newBuilder() to construct.
-    private TestCaseReportMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private TestCaseReportMessage() {
-      name_ = com.google.protobuf.ByteString.EMPTY;
-      testResult_ = 0;
-      startTimestamp_ = 0L;
-      endTimestamp_ = 0L;
-      coverage_ = java.util.Collections.emptyList();
-      profiling_ = java.util.Collections.emptyList();
-      systrace_ = java.util.Collections.emptyList();
-      log_ = java.util.Collections.emptyList();
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private TestCaseReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              name_ = input.readBytes();
-              break;
-            }
-            case 88: {
-              int rawValue = input.readEnum();
-              com.android.vts.proto.VtsReportMessage.TestCaseResult value = com.android.vts.proto.VtsReportMessage.TestCaseResult.valueOf(rawValue);
-              if (value == null) {
-                unknownFields.mergeVarintField(11, rawValue);
-              } else {
-                bitField0_ |= 0x00000002;
-                testResult_ = rawValue;
-              }
-              break;
-            }
-            case 168: {
-              bitField0_ |= 0x00000004;
-              startTimestamp_ = input.readInt64();
-              break;
-            }
-            case 176: {
-              bitField0_ |= 0x00000008;
-              endTimestamp_ = input.readInt64();
-              break;
-            }
-            case 250: {
-              if (!((mutable_bitField0_ & 0x00000010) == 0x00000010)) {
-                coverage_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.CoverageReportMessage>();
-                mutable_bitField0_ |= 0x00000010;
-              }
-              coverage_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.CoverageReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 330: {
-              if (!((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-                profiling_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage>();
-                mutable_bitField0_ |= 0x00000020;
-              }
-              profiling_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 338: {
-              if (!((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
-                systrace_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.SystraceReportMessage>();
-                mutable_bitField0_ |= 0x00000040;
-              }
-              systrace_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.SystraceReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 810: {
-              if (!((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
-                log_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.LogMessage>();
-                mutable_bitField0_ |= 0x00000080;
-              }
-              log_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.LogMessage.PARSER, extensionRegistry));
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000010) == 0x00000010)) {
-          coverage_ = java.util.Collections.unmodifiableList(coverage_);
-        }
-        if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-          profiling_ = java.util.Collections.unmodifiableList(profiling_);
-        }
-        if (((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
-          systrace_ = java.util.Collections.unmodifiableList(systrace_);
-        }
-        if (((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
-          log_ = java.util.Collections.unmodifiableList(log_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestCaseReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestCaseReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.class, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int NAME_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString name_;
-    /**
-     * <pre>
-     * the test case name.
-     * </pre>
-     *
-     * <code>optional bytes name = 1;</code>
-     */
-    public boolean hasName() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * the test case name.
-     * </pre>
-     *
-     * <code>optional bytes name = 1;</code>
-     */
-    public com.google.protobuf.ByteString getName() {
-      return name_;
-    }
-
-    public static final int TEST_RESULT_FIELD_NUMBER = 11;
-    private int testResult_;
-    /**
-     * <pre>
-     * the test result.
-     * </pre>
-     *
-     * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-     */
-    public boolean hasTestResult() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <pre>
-     * the test result.
-     * </pre>
-     *
-     * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.TestCaseResult getTestResult() {
-      com.android.vts.proto.VtsReportMessage.TestCaseResult result = com.android.vts.proto.VtsReportMessage.TestCaseResult.valueOf(testResult_);
-      return result == null ? com.android.vts.proto.VtsReportMessage.TestCaseResult.UNKNOWN_RESULT : result;
-    }
-
-    public static final int START_TIMESTAMP_FIELD_NUMBER = 21;
-    private long startTimestamp_;
-    /**
-     * <pre>
-     * execution start and end time stamp.
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 21;</code>
-     */
-    public boolean hasStartTimestamp() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <pre>
-     * execution start and end time stamp.
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 21;</code>
-     */
-    public long getStartTimestamp() {
-      return startTimestamp_;
-    }
-
-    public static final int END_TIMESTAMP_FIELD_NUMBER = 22;
-    private long endTimestamp_;
-    /**
-     * <code>optional int64 end_timestamp = 22;</code>
-     */
-    public boolean hasEndTimestamp() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <code>optional int64 end_timestamp = 22;</code>
-     */
-    public long getEndTimestamp() {
-      return endTimestamp_;
-    }
-
-    public static final int COVERAGE_FIELD_NUMBER = 31;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> coverage_;
-    /**
-     * <pre>
-     * coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> getCoverageList() {
-      return coverage_;
-    }
-    /**
-     * <pre>
-     * coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-        getCoverageOrBuilderList() {
-      return coverage_;
-    }
-    /**
-     * <pre>
-     * coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     */
-    public int getCoverageCount() {
-      return coverage_.size();
-    }
-    /**
-     * <pre>
-     * coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index) {
-      return coverage_.get(index);
-    }
-    /**
-     * <pre>
-     * coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
-        int index) {
-      return coverage_.get(index);
-    }
-
-    public static final int PROFILING_FIELD_NUMBER = 41;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> profiling_;
-    /**
-     * <pre>
-     * profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> getProfilingList() {
-      return profiling_;
-    }
-    /**
-     * <pre>
-     * profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-        getProfilingOrBuilderList() {
-      return profiling_;
-    }
-    /**
-     * <pre>
-     * profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     */
-    public int getProfilingCount() {
-      return profiling_.size();
-    }
-    /**
-     * <pre>
-     * profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index) {
-      return profiling_.get(index);
-    }
-    /**
-     * <pre>
-     * profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder getProfilingOrBuilder(
-        int index) {
-      return profiling_.get(index);
-    }
-
-    public static final int SYSTRACE_FIELD_NUMBER = 42;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> systrace_;
-    /**
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> getSystraceList() {
-      return systrace_;
-    }
-    /**
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public java.util.List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-        getSystraceOrBuilderList() {
-      return systrace_;
-    }
-    /**
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public int getSystraceCount() {
-      return systrace_.size();
-    }
-    /**
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index) {
-      return systrace_.get(index);
-    }
-    /**
-     * <pre>
-     * systrace report message per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder getSystraceOrBuilder(
-        int index) {
-      return systrace_.get(index);
-    }
-
-    public static final int LOG_FIELD_NUMBER = 101;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> log_;
-    /**
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> getLogList() {
-      return log_;
-    }
-    /**
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-        getLogOrBuilderList() {
-      return log_;
-    }
-    /**
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     */
-    public int getLogCount() {
-      return log_.size();
-    }
-    /**
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index) {
-      return log_.get(index);
-    }
-    /**
-     * <pre>
-     * log for each test case. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 101;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(
-        int index) {
-      return log_.get(index);
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, name_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeEnum(11, testResult_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeInt64(21, startTimestamp_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeInt64(22, endTimestamp_);
-      }
-      for (int i = 0; i < coverage_.size(); i++) {
-        output.writeMessage(31, coverage_.get(i));
-      }
-      for (int i = 0; i < profiling_.size(); i++) {
-        output.writeMessage(41, profiling_.get(i));
-      }
-      for (int i = 0; i < systrace_.size(); i++) {
-        output.writeMessage(42, systrace_.get(i));
-      }
-      for (int i = 0; i < log_.size(); i++) {
-        output.writeMessage(101, log_.get(i));
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, name_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(11, testResult_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(21, startTimestamp_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(22, endTimestamp_);
-      }
-      for (int i = 0; i < coverage_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(31, coverage_.get(i));
-      }
-      for (int i = 0; i < profiling_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(41, profiling_.get(i));
-      }
-      for (int i = 0; i < systrace_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(42, systrace_.get(i));
-      }
-      for (int i = 0; i < log_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(101, log_.get(i));
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.TestCaseReportMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.TestCaseReportMessage other = (com.android.vts.proto.VtsReportMessage.TestCaseReportMessage) obj;
-
-      boolean result = true;
-      result = result && (hasName() == other.hasName());
-      if (hasName()) {
-        result = result && getName()
-            .equals(other.getName());
-      }
-      result = result && (hasTestResult() == other.hasTestResult());
-      if (hasTestResult()) {
-        result = result && testResult_ == other.testResult_;
-      }
-      result = result && (hasStartTimestamp() == other.hasStartTimestamp());
-      if (hasStartTimestamp()) {
-        result = result && (getStartTimestamp()
-            == other.getStartTimestamp());
-      }
-      result = result && (hasEndTimestamp() == other.hasEndTimestamp());
-      if (hasEndTimestamp()) {
-        result = result && (getEndTimestamp()
-            == other.getEndTimestamp());
-      }
-      result = result && getCoverageList()
-          .equals(other.getCoverageList());
-      result = result && getProfilingList()
-          .equals(other.getProfilingList());
-      result = result && getSystraceList()
-          .equals(other.getSystraceList());
-      result = result && getLogList()
-          .equals(other.getLogList());
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasName()) {
-        hash = (37 * hash) + NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getName().hashCode();
-      }
-      if (hasTestResult()) {
-        hash = (37 * hash) + TEST_RESULT_FIELD_NUMBER;
-        hash = (53 * hash) + testResult_;
-      }
-      if (hasStartTimestamp()) {
-        hash = (37 * hash) + START_TIMESTAMP_FIELD_NUMBER;
-        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
-            getStartTimestamp());
-      }
-      if (hasEndTimestamp()) {
-        hash = (37 * hash) + END_TIMESTAMP_FIELD_NUMBER;
-        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
-            getEndTimestamp());
-      }
-      if (getCoverageCount() > 0) {
-        hash = (37 * hash) + COVERAGE_FIELD_NUMBER;
-        hash = (53 * hash) + getCoverageList().hashCode();
-      }
-      if (getProfilingCount() > 0) {
-        hash = (37 * hash) + PROFILING_FIELD_NUMBER;
-        hash = (53 * hash) + getProfilingList().hashCode();
-      }
-      if (getSystraceCount() > 0) {
-        hash = (37 * hash) + SYSTRACE_FIELD_NUMBER;
-        hash = (53 * hash) + getSystraceList().hashCode();
-      }
-      if (getLogCount() > 0) {
-        hash = (37 * hash) + LOG_FIELD_NUMBER;
-        hash = (53 * hash) + getLogList().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.TestCaseReportMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify a test case execution report.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.TestCaseReportMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.TestCaseReportMessage)
-        com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestCaseReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestCaseReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.class, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-          getCoverageFieldBuilder();
-          getProfilingFieldBuilder();
-          getSystraceFieldBuilder();
-          getLogFieldBuilder();
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        name_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        testResult_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        startTimestamp_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        endTimestamp_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000008);
-        if (coverageBuilder_ == null) {
-          coverage_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000010);
-        } else {
-          coverageBuilder_.clear();
-        }
-        if (profilingBuilder_ == null) {
-          profiling_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000020);
-        } else {
-          profilingBuilder_.clear();
-        }
-        if (systraceBuilder_ == null) {
-          systrace_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000040);
-        } else {
-          systraceBuilder_.clear();
-        }
-        if (logBuilder_ == null) {
-          log_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000080);
-        } else {
-          logBuilder_.clear();
-        }
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestCaseReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.TestCaseReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.TestCaseReportMessage result = new com.android.vts.proto.VtsReportMessage.TestCaseReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.name_ = name_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.testResult_ = testResult_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.startTimestamp_ = startTimestamp_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.endTimestamp_ = endTimestamp_;
-        if (coverageBuilder_ == null) {
-          if (((bitField0_ & 0x00000010) == 0x00000010)) {
-            coverage_ = java.util.Collections.unmodifiableList(coverage_);
-            bitField0_ = (bitField0_ & ~0x00000010);
-          }
-          result.coverage_ = coverage_;
-        } else {
-          result.coverage_ = coverageBuilder_.build();
-        }
-        if (profilingBuilder_ == null) {
-          if (((bitField0_ & 0x00000020) == 0x00000020)) {
-            profiling_ = java.util.Collections.unmodifiableList(profiling_);
-            bitField0_ = (bitField0_ & ~0x00000020);
-          }
-          result.profiling_ = profiling_;
-        } else {
-          result.profiling_ = profilingBuilder_.build();
-        }
-        if (systraceBuilder_ == null) {
-          if (((bitField0_ & 0x00000040) == 0x00000040)) {
-            systrace_ = java.util.Collections.unmodifiableList(systrace_);
-            bitField0_ = (bitField0_ & ~0x00000040);
-          }
-          result.systrace_ = systrace_;
-        } else {
-          result.systrace_ = systraceBuilder_.build();
-        }
-        if (logBuilder_ == null) {
-          if (((bitField0_ & 0x00000080) == 0x00000080)) {
-            log_ = java.util.Collections.unmodifiableList(log_);
-            bitField0_ = (bitField0_ & ~0x00000080);
-          }
-          result.log_ = log_;
-        } else {
-          result.log_ = logBuilder_.build();
-        }
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.TestCaseReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.TestCaseReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.TestCaseReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.getDefaultInstance()) return this;
-        if (other.hasName()) {
-          setName(other.getName());
-        }
-        if (other.hasTestResult()) {
-          setTestResult(other.getTestResult());
-        }
-        if (other.hasStartTimestamp()) {
-          setStartTimestamp(other.getStartTimestamp());
-        }
-        if (other.hasEndTimestamp()) {
-          setEndTimestamp(other.getEndTimestamp());
-        }
-        if (coverageBuilder_ == null) {
-          if (!other.coverage_.isEmpty()) {
-            if (coverage_.isEmpty()) {
-              coverage_ = other.coverage_;
-              bitField0_ = (bitField0_ & ~0x00000010);
-            } else {
-              ensureCoverageIsMutable();
-              coverage_.addAll(other.coverage_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.coverage_.isEmpty()) {
-            if (coverageBuilder_.isEmpty()) {
-              coverageBuilder_.dispose();
-              coverageBuilder_ = null;
-              coverage_ = other.coverage_;
-              bitField0_ = (bitField0_ & ~0x00000010);
-              coverageBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getCoverageFieldBuilder() : null;
-            } else {
-              coverageBuilder_.addAllMessages(other.coverage_);
-            }
-          }
-        }
-        if (profilingBuilder_ == null) {
-          if (!other.profiling_.isEmpty()) {
-            if (profiling_.isEmpty()) {
-              profiling_ = other.profiling_;
-              bitField0_ = (bitField0_ & ~0x00000020);
-            } else {
-              ensureProfilingIsMutable();
-              profiling_.addAll(other.profiling_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.profiling_.isEmpty()) {
-            if (profilingBuilder_.isEmpty()) {
-              profilingBuilder_.dispose();
-              profilingBuilder_ = null;
-              profiling_ = other.profiling_;
-              bitField0_ = (bitField0_ & ~0x00000020);
-              profilingBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getProfilingFieldBuilder() : null;
-            } else {
-              profilingBuilder_.addAllMessages(other.profiling_);
-            }
-          }
-        }
-        if (systraceBuilder_ == null) {
-          if (!other.systrace_.isEmpty()) {
-            if (systrace_.isEmpty()) {
-              systrace_ = other.systrace_;
-              bitField0_ = (bitField0_ & ~0x00000040);
-            } else {
-              ensureSystraceIsMutable();
-              systrace_.addAll(other.systrace_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.systrace_.isEmpty()) {
-            if (systraceBuilder_.isEmpty()) {
-              systraceBuilder_.dispose();
-              systraceBuilder_ = null;
-              systrace_ = other.systrace_;
-              bitField0_ = (bitField0_ & ~0x00000040);
-              systraceBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getSystraceFieldBuilder() : null;
-            } else {
-              systraceBuilder_.addAllMessages(other.systrace_);
-            }
-          }
-        }
-        if (logBuilder_ == null) {
-          if (!other.log_.isEmpty()) {
-            if (log_.isEmpty()) {
-              log_ = other.log_;
-              bitField0_ = (bitField0_ & ~0x00000080);
-            } else {
-              ensureLogIsMutable();
-              log_.addAll(other.log_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.log_.isEmpty()) {
-            if (logBuilder_.isEmpty()) {
-              logBuilder_.dispose();
-              logBuilder_ = null;
-              log_ = other.log_;
-              bitField0_ = (bitField0_ & ~0x00000080);
-              logBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getLogFieldBuilder() : null;
-            } else {
-              logBuilder_.addAllMessages(other.log_);
-            }
-          }
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.TestCaseReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.TestCaseReportMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * the test case name.
-       * </pre>
-       *
-       * <code>optional bytes name = 1;</code>
-       */
-      public boolean hasName() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * the test case name.
-       * </pre>
-       *
-       * <code>optional bytes name = 1;</code>
-       */
-      public com.google.protobuf.ByteString getName() {
-        return name_;
-      }
-      /**
-       * <pre>
-       * the test case name.
-       * </pre>
-       *
-       * <code>optional bytes name = 1;</code>
-       */
-      public Builder setName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the test case name.
-       * </pre>
-       *
-       * <code>optional bytes name = 1;</code>
-       */
-      public Builder clearName() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-
-      private int testResult_ = 0;
-      /**
-       * <pre>
-       * the test result.
-       * </pre>
-       *
-       * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-       */
-      public boolean hasTestResult() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <pre>
-       * the test result.
-       * </pre>
-       *
-       * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestCaseResult getTestResult() {
-        com.android.vts.proto.VtsReportMessage.TestCaseResult result = com.android.vts.proto.VtsReportMessage.TestCaseResult.valueOf(testResult_);
-        return result == null ? com.android.vts.proto.VtsReportMessage.TestCaseResult.UNKNOWN_RESULT : result;
-      }
-      /**
-       * <pre>
-       * the test result.
-       * </pre>
-       *
-       * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-       */
-      public Builder setTestResult(com.android.vts.proto.VtsReportMessage.TestCaseResult value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        bitField0_ |= 0x00000002;
-        testResult_ = value.getNumber();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the test result.
-       * </pre>
-       *
-       * <code>optional .android.vts.TestCaseResult test_result = 11;</code>
-       */
-      public Builder clearTestResult() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        testResult_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private long startTimestamp_ ;
-      /**
-       * <pre>
-       * execution start and end time stamp.
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 21;</code>
-       */
-      public boolean hasStartTimestamp() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <pre>
-       * execution start and end time stamp.
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 21;</code>
-       */
-      public long getStartTimestamp() {
-        return startTimestamp_;
-      }
-      /**
-       * <pre>
-       * execution start and end time stamp.
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 21;</code>
-       */
-      public Builder setStartTimestamp(long value) {
-        bitField0_ |= 0x00000004;
-        startTimestamp_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * execution start and end time stamp.
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 21;</code>
-       */
-      public Builder clearStartTimestamp() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        startTimestamp_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      private long endTimestamp_ ;
-      /**
-       * <code>optional int64 end_timestamp = 22;</code>
-       */
-      public boolean hasEndTimestamp() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <code>optional int64 end_timestamp = 22;</code>
-       */
-      public long getEndTimestamp() {
-        return endTimestamp_;
-      }
-      /**
-       * <code>optional int64 end_timestamp = 22;</code>
-       */
-      public Builder setEndTimestamp(long value) {
-        bitField0_ |= 0x00000008;
-        endTimestamp_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int64 end_timestamp = 22;</code>
-       */
-      public Builder clearEndTimestamp() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        endTimestamp_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> coverage_ =
-        java.util.Collections.emptyList();
-      private void ensureCoverageIsMutable() {
-        if (!((bitField0_ & 0x00000010) == 0x00000010)) {
-          coverage_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.CoverageReportMessage>(coverage_);
-          bitField0_ |= 0x00000010;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.CoverageReportMessage, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> coverageBuilder_;
-
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> getCoverageList() {
-        if (coverageBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(coverage_);
-        } else {
-          return coverageBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public int getCoverageCount() {
-        if (coverageBuilder_ == null) {
-          return coverage_.size();
-        } else {
-          return coverageBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index) {
-        if (coverageBuilder_ == null) {
-          return coverage_.get(index);
-        } else {
-          return coverageBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public Builder setCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-        if (coverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureCoverageIsMutable();
-          coverage_.set(index, value);
-          onChanged();
-        } else {
-          coverageBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public Builder setCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder builderForValue) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          coverageBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public Builder addCoverage(com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-        if (coverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureCoverageIsMutable();
-          coverage_.add(value);
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public Builder addCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-        if (coverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureCoverageIsMutable();
-          coverage_.add(index, value);
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public Builder addCoverage(
-          com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder builderForValue) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.add(builderForValue.build());
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public Builder addCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder builderForValue) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public Builder addAllCoverage(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessage> values) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, coverage_);
-          onChanged();
-        } else {
-          coverageBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public Builder clearCoverage() {
-        if (coverageBuilder_ == null) {
-          coverage_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000010);
-          onChanged();
-        } else {
-          coverageBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public Builder removeCoverage(int index) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.remove(index);
-          onChanged();
-        } else {
-          coverageBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder getCoverageBuilder(
-          int index) {
-        return getCoverageFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
-          int index) {
-        if (coverageBuilder_ == null) {
-          return coverage_.get(index);  } else {
-          return coverageBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-           getCoverageOrBuilderList() {
-        if (coverageBuilder_ != null) {
-          return coverageBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(coverage_);
-        }
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder addCoverageBuilder() {
-        return getCoverageFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder addCoverageBuilder(
-          int index) {
-        return getCoverageFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 31;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder> 
-           getCoverageBuilderList() {
-        return getCoverageFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.CoverageReportMessage, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-          getCoverageFieldBuilder() {
-        if (coverageBuilder_ == null) {
-          coverageBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.CoverageReportMessage, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder>(
-                  coverage_,
-                  ((bitField0_ & 0x00000010) == 0x00000010),
-                  getParentForChildren(),
-                  isClean());
-          coverage_ = null;
-        }
-        return coverageBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> profiling_ =
-        java.util.Collections.emptyList();
-      private void ensureProfilingIsMutable() {
-        if (!((bitField0_ & 0x00000020) == 0x00000020)) {
-          profiling_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage>(profiling_);
-          bitField0_ |= 0x00000020;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.ProfilingReportMessage, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> profilingBuilder_;
-
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> getProfilingList() {
-        if (profilingBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(profiling_);
-        } else {
-          return profilingBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public int getProfilingCount() {
-        if (profilingBuilder_ == null) {
-          return profiling_.size();
-        } else {
-          return profilingBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index) {
-        if (profilingBuilder_ == null) {
-          return profiling_.get(index);
-        } else {
-          return profilingBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public Builder setProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-        if (profilingBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureProfilingIsMutable();
-          profiling_.set(index, value);
-          onChanged();
-        } else {
-          profilingBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public Builder setProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder builderForValue) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          profilingBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public Builder addProfiling(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-        if (profilingBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureProfilingIsMutable();
-          profiling_.add(value);
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public Builder addProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-        if (profilingBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureProfilingIsMutable();
-          profiling_.add(index, value);
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public Builder addProfiling(
-          com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder builderForValue) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.add(builderForValue.build());
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public Builder addProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder builderForValue) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public Builder addAllProfiling(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> values) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, profiling_);
-          onChanged();
-        } else {
-          profilingBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public Builder clearProfiling() {
-        if (profilingBuilder_ == null) {
-          profiling_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000020);
-          onChanged();
-        } else {
-          profilingBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public Builder removeProfiling(int index) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.remove(index);
-          onChanged();
-        } else {
-          profilingBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder getProfilingBuilder(
-          int index) {
-        return getProfilingFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder getProfilingOrBuilder(
-          int index) {
-        if (profilingBuilder_ == null) {
-          return profiling_.get(index);  } else {
-          return profilingBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-           getProfilingOrBuilderList() {
-        if (profilingBuilder_ != null) {
-          return profilingBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(profiling_);
-        }
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder addProfilingBuilder() {
-        return getProfilingFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder addProfilingBuilder(
-          int index) {
-        return getProfilingFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 41;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder> 
-           getProfilingBuilderList() {
-        return getProfilingFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.ProfilingReportMessage, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-          getProfilingFieldBuilder() {
-        if (profilingBuilder_ == null) {
-          profilingBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.ProfilingReportMessage, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder>(
-                  profiling_,
-                  ((bitField0_ & 0x00000020) == 0x00000020),
-                  getParentForChildren(),
-                  isClean());
-          profiling_ = null;
-        }
-        return profilingBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> systrace_ =
-        java.util.Collections.emptyList();
-      private void ensureSystraceIsMutable() {
-        if (!((bitField0_ & 0x00000040) == 0x00000040)) {
-          systrace_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.SystraceReportMessage>(systrace_);
-          bitField0_ |= 0x00000040;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.SystraceReportMessage, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder, com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> systraceBuilder_;
-
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> getSystraceList() {
-        if (systraceBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(systrace_);
-        } else {
-          return systraceBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public int getSystraceCount() {
-        if (systraceBuilder_ == null) {
-          return systrace_.size();
-        } else {
-          return systraceBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index) {
-        if (systraceBuilder_ == null) {
-          return systrace_.get(index);
-        } else {
-          return systraceBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder setSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-        if (systraceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSystraceIsMutable();
-          systrace_.set(index, value);
-          onChanged();
-        } else {
-          systraceBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder setSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder builderForValue) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          systraceBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder addSystrace(com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-        if (systraceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSystraceIsMutable();
-          systrace_.add(value);
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder addSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-        if (systraceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSystraceIsMutable();
-          systrace_.add(index, value);
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder addSystrace(
-          com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder builderForValue) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.add(builderForValue.build());
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder addSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder builderForValue) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder addAllSystrace(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessage> values) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, systrace_);
-          onChanged();
-        } else {
-          systraceBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder clearSystrace() {
-        if (systraceBuilder_ == null) {
-          systrace_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000040);
-          onChanged();
-        } else {
-          systraceBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder removeSystrace(int index) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.remove(index);
-          onChanged();
-        } else {
-          systraceBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder getSystraceBuilder(
-          int index) {
-        return getSystraceFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder getSystraceOrBuilder(
-          int index) {
-        if (systraceBuilder_ == null) {
-          return systrace_.get(index);  } else {
-          return systraceBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public java.util.List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-           getSystraceOrBuilderList() {
-        if (systraceBuilder_ != null) {
-          return systraceBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(systrace_);
-        }
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder addSystraceBuilder() {
-        return getSystraceFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.SystraceReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder addSystraceBuilder(
-          int index) {
-        return getSystraceFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * systrace report message per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 42 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder> 
-           getSystraceBuilderList() {
-        return getSystraceFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.SystraceReportMessage, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder, com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-          getSystraceFieldBuilder() {
-        if (systraceBuilder_ == null) {
-          systraceBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.SystraceReportMessage, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder, com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder>(
-                  systrace_,
-                  ((bitField0_ & 0x00000040) == 0x00000040),
-                  getParentForChildren(),
-                  isClean());
-          systrace_ = null;
-        }
-        return systraceBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> log_ =
-        java.util.Collections.emptyList();
-      private void ensureLogIsMutable() {
-        if (!((bitField0_ & 0x00000080) == 0x00000080)) {
-          log_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.LogMessage>(log_);
-          bitField0_ |= 0x00000080;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.LogMessage, com.android.vts.proto.VtsReportMessage.LogMessage.Builder, com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> logBuilder_;
-
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> getLogList() {
-        if (logBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(log_);
-        } else {
-          return logBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public int getLogCount() {
-        if (logBuilder_ == null) {
-          return log_.size();
-        } else {
-          return logBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index) {
-        if (logBuilder_ == null) {
-          return log_.get(index);
-        } else {
-          return logBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public Builder setLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage value) {
-        if (logBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLogIsMutable();
-          log_.set(index, value);
-          onChanged();
-        } else {
-          logBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public Builder setLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          logBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public Builder addLog(com.android.vts.proto.VtsReportMessage.LogMessage value) {
-        if (logBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLogIsMutable();
-          log_.add(value);
-          onChanged();
-        } else {
-          logBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public Builder addLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage value) {
-        if (logBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLogIsMutable();
-          log_.add(index, value);
-          onChanged();
-        } else {
-          logBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public Builder addLog(
-          com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.add(builderForValue.build());
-          onChanged();
-        } else {
-          logBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public Builder addLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          logBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public Builder addAllLog(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.LogMessage> values) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, log_);
-          onChanged();
-        } else {
-          logBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public Builder clearLog() {
-        if (logBuilder_ == null) {
-          log_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000080);
-          onChanged();
-        } else {
-          logBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public Builder removeLog(int index) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.remove(index);
-          onChanged();
-        } else {
-          logBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage.Builder getLogBuilder(
-          int index) {
-        return getLogFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(
-          int index) {
-        if (logBuilder_ == null) {
-          return log_.get(index);  } else {
-          return logBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-           getLogOrBuilderList() {
-        if (logBuilder_ != null) {
-          return logBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(log_);
-        }
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage.Builder addLogBuilder() {
-        return getLogFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage.Builder addLogBuilder(
-          int index) {
-        return getLogFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * log for each test case. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 101;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage.Builder> 
-           getLogBuilderList() {
-        return getLogFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.LogMessage, com.android.vts.proto.VtsReportMessage.LogMessage.Builder, com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-          getLogFieldBuilder() {
-        if (logBuilder_ == null) {
-          logBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.LogMessage, com.android.vts.proto.VtsReportMessage.LogMessage.Builder, com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder>(
-                  log_,
-                  ((bitField0_ & 0x00000080) == 0x00000080),
-                  getParentForChildren(),
-                  isClean());
-          log_ = null;
-        }
-        return logBuilder_;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.TestCaseReportMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.TestCaseReportMessage)
-    private static final com.android.vts.proto.VtsReportMessage.TestCaseReportMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.TestCaseReportMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.TestCaseReportMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<TestCaseReportMessage>
-        PARSER = new com.google.protobuf.AbstractParser<TestCaseReportMessage>() {
-      public TestCaseReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new TestCaseReportMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<TestCaseReportMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<TestCaseReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface ProfilingReportMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.ProfilingReportMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * the instrumentation point name.
-     * </pre>
-     *
-     * <code>optional bytes name = 1;</code>
-     */
-    boolean hasName();
-    /**
-     * <pre>
-     * the instrumentation point name.
-     * </pre>
-     *
-     * <code>optional bytes name = 1;</code>
-     */
-    com.google.protobuf.ByteString getName();
-
-    /**
-     * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-     */
-    boolean hasType();
-    /**
-     * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.VtsProfilingType getType();
-
-    /**
-     * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-     */
-    boolean hasRegressionMode();
-    /**
-     * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode getRegressionMode();
-
-    /**
-     * <pre>
-     * profiling start and end time stamp (for performance).
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 11;</code>
-     */
-    boolean hasStartTimestamp();
-    /**
-     * <pre>
-     * profiling start and end time stamp (for performance).
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 11;</code>
-     */
-    long getStartTimestamp();
-
-    /**
-     * <code>optional int64 end_timestamp = 12;</code>
-     */
-    boolean hasEndTimestamp();
-    /**
-     * <code>optional int64 end_timestamp = 12;</code>
-     */
-    long getEndTimestamp();
-
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    java.util.List<com.google.protobuf.ByteString> getLabelList();
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    int getLabelCount();
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    com.google.protobuf.ByteString getLabel(int index);
-
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    java.util.List<java.lang.Long> getValueList();
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    int getValueCount();
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    long getValue(int index);
-
-    /**
-     * <pre>
-     * x-axis and y-axis title labels when displaying the data as a graph
-     * </pre>
-     *
-     * <code>optional bytes x_axis_label = 31;</code>
-     */
-    boolean hasXAxisLabel();
-    /**
-     * <pre>
-     * x-axis and y-axis title labels when displaying the data as a graph
-     * </pre>
-     *
-     * <code>optional bytes x_axis_label = 31;</code>
-     */
-    com.google.protobuf.ByteString getXAxisLabel();
-
-    /**
-     * <code>optional bytes y_axis_label = 32;</code>
-     */
-    boolean hasYAxisLabel();
-    /**
-     * <code>optional bytes y_axis_label = 32;</code>
-     */
-    com.google.protobuf.ByteString getYAxisLabel();
-
-    /**
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     *
-     * <code>repeated bytes options = 41;</code>
-     */
-    java.util.List<com.google.protobuf.ByteString> getOptionsList();
-    /**
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     *
-     * <code>repeated bytes options = 41;</code>
-     */
-    int getOptionsCount();
-    /**
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     *
-     * <code>repeated bytes options = 41;</code>
-     */
-    com.google.protobuf.ByteString getOptions(int index);
-  }
-  /**
-   * <pre>
-   * To specify a profiling report.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.ProfilingReportMessage}
-   */
-  public  static final class ProfilingReportMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.ProfilingReportMessage)
-      ProfilingReportMessageOrBuilder {
-    // Use ProfilingReportMessage.newBuilder() to construct.
-    private ProfilingReportMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private ProfilingReportMessage() {
-      name_ = com.google.protobuf.ByteString.EMPTY;
-      type_ = 0;
-      regressionMode_ = 0;
-      startTimestamp_ = 0L;
-      endTimestamp_ = 0L;
-      label_ = java.util.Collections.emptyList();
-      value_ = java.util.Collections.emptyList();
-      xAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-      yAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-      options_ = java.util.Collections.emptyList();
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private ProfilingReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              name_ = input.readBytes();
-              break;
-            }
-            case 16: {
-              int rawValue = input.readEnum();
-              com.android.vts.proto.VtsReportMessage.VtsProfilingType value = com.android.vts.proto.VtsReportMessage.VtsProfilingType.valueOf(rawValue);
-              if (value == null) {
-                unknownFields.mergeVarintField(2, rawValue);
-              } else {
-                bitField0_ |= 0x00000002;
-                type_ = rawValue;
-              }
-              break;
-            }
-            case 24: {
-              int rawValue = input.readEnum();
-              com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode value = com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode.valueOf(rawValue);
-              if (value == null) {
-                unknownFields.mergeVarintField(3, rawValue);
-              } else {
-                bitField0_ |= 0x00000004;
-                regressionMode_ = rawValue;
-              }
-              break;
-            }
-            case 88: {
-              bitField0_ |= 0x00000008;
-              startTimestamp_ = input.readInt64();
-              break;
-            }
-            case 96: {
-              bitField0_ |= 0x00000010;
-              endTimestamp_ = input.readInt64();
-              break;
-            }
-            case 170: {
-              if (!((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-                label_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000020;
-              }
-              label_.add(input.readBytes());
-              break;
-            }
-            case 176: {
-              if (!((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
-                value_ = new java.util.ArrayList<java.lang.Long>();
-                mutable_bitField0_ |= 0x00000040;
-              }
-              value_.add(input.readInt64());
-              break;
-            }
-            case 178: {
-              int length = input.readRawVarint32();
-              int limit = input.pushLimit(length);
-              if (!((mutable_bitField0_ & 0x00000040) == 0x00000040) && input.getBytesUntilLimit() > 0) {
-                value_ = new java.util.ArrayList<java.lang.Long>();
-                mutable_bitField0_ |= 0x00000040;
-              }
-              while (input.getBytesUntilLimit() > 0) {
-                value_.add(input.readInt64());
-              }
-              input.popLimit(limit);
-              break;
-            }
-            case 250: {
-              bitField0_ |= 0x00000020;
-              xAxisLabel_ = input.readBytes();
-              break;
-            }
-            case 258: {
-              bitField0_ |= 0x00000040;
-              yAxisLabel_ = input.readBytes();
-              break;
-            }
-            case 330: {
-              if (!((mutable_bitField0_ & 0x00000200) == 0x00000200)) {
-                options_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000200;
-              }
-              options_.add(input.readBytes());
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-          label_ = java.util.Collections.unmodifiableList(label_);
-        }
-        if (((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
-          value_ = java.util.Collections.unmodifiableList(value_);
-        }
-        if (((mutable_bitField0_ & 0x00000200) == 0x00000200)) {
-          options_ = java.util.Collections.unmodifiableList(options_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ProfilingReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ProfilingReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.class, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int NAME_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString name_;
-    /**
-     * <pre>
-     * the instrumentation point name.
-     * </pre>
-     *
-     * <code>optional bytes name = 1;</code>
-     */
-    public boolean hasName() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * the instrumentation point name.
-     * </pre>
-     *
-     * <code>optional bytes name = 1;</code>
-     */
-    public com.google.protobuf.ByteString getName() {
-      return name_;
-    }
-
-    public static final int TYPE_FIELD_NUMBER = 2;
-    private int type_;
-    /**
-     * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-     */
-    public boolean hasType() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.VtsProfilingType getType() {
-      com.android.vts.proto.VtsReportMessage.VtsProfilingType result = com.android.vts.proto.VtsReportMessage.VtsProfilingType.valueOf(type_);
-      return result == null ? com.android.vts.proto.VtsReportMessage.VtsProfilingType.UNKNOWN_VTS_PROFILING_TYPE : result;
-    }
-
-    public static final int REGRESSION_MODE_FIELD_NUMBER = 3;
-    private int regressionMode_;
-    /**
-     * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-     */
-    public boolean hasRegressionMode() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode getRegressionMode() {
-      com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode result = com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode.valueOf(regressionMode_);
-      return result == null ? com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE : result;
-    }
-
-    public static final int START_TIMESTAMP_FIELD_NUMBER = 11;
-    private long startTimestamp_;
-    /**
-     * <pre>
-     * profiling start and end time stamp (for performance).
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 11;</code>
-     */
-    public boolean hasStartTimestamp() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <pre>
-     * profiling start and end time stamp (for performance).
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 11;</code>
-     */
-    public long getStartTimestamp() {
-      return startTimestamp_;
-    }
-
-    public static final int END_TIMESTAMP_FIELD_NUMBER = 12;
-    private long endTimestamp_;
-    /**
-     * <code>optional int64 end_timestamp = 12;</code>
-     */
-    public boolean hasEndTimestamp() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <code>optional int64 end_timestamp = 12;</code>
-     */
-    public long getEndTimestamp() {
-      return endTimestamp_;
-    }
-
-    public static final int LABEL_FIELD_NUMBER = 21;
-    private java.util.List<com.google.protobuf.ByteString> label_;
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getLabelList() {
-      return label_;
-    }
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    public int getLabelCount() {
-      return label_.size();
-    }
-    /**
-     * <code>repeated bytes label = 21;</code>
-     */
-    public com.google.protobuf.ByteString getLabel(int index) {
-      return label_.get(index);
-    }
-
-    public static final int VALUE_FIELD_NUMBER = 22;
-    private java.util.List<java.lang.Long> value_;
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    public java.util.List<java.lang.Long>
-        getValueList() {
-      return value_;
-    }
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    public int getValueCount() {
-      return value_.size();
-    }
-    /**
-     * <code>repeated int64 value = 22;</code>
-     */
-    public long getValue(int index) {
-      return value_.get(index);
-    }
-
-    public static final int X_AXIS_LABEL_FIELD_NUMBER = 31;
-    private com.google.protobuf.ByteString xAxisLabel_;
-    /**
-     * <pre>
-     * x-axis and y-axis title labels when displaying the data as a graph
-     * </pre>
-     *
-     * <code>optional bytes x_axis_label = 31;</code>
-     */
-    public boolean hasXAxisLabel() {
-      return ((bitField0_ & 0x00000020) == 0x00000020);
-    }
-    /**
-     * <pre>
-     * x-axis and y-axis title labels when displaying the data as a graph
-     * </pre>
-     *
-     * <code>optional bytes x_axis_label = 31;</code>
-     */
-    public com.google.protobuf.ByteString getXAxisLabel() {
-      return xAxisLabel_;
-    }
-
-    public static final int Y_AXIS_LABEL_FIELD_NUMBER = 32;
-    private com.google.protobuf.ByteString yAxisLabel_;
-    /**
-     * <code>optional bytes y_axis_label = 32;</code>
-     */
-    public boolean hasYAxisLabel() {
-      return ((bitField0_ & 0x00000040) == 0x00000040);
-    }
-    /**
-     * <code>optional bytes y_axis_label = 32;</code>
-     */
-    public com.google.protobuf.ByteString getYAxisLabel() {
-      return yAxisLabel_;
-    }
-
-    public static final int OPTIONS_FIELD_NUMBER = 41;
-    private java.util.List<com.google.protobuf.ByteString> options_;
-    /**
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     *
-     * <code>repeated bytes options = 41;</code>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getOptionsList() {
-      return options_;
-    }
-    /**
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     *
-     * <code>repeated bytes options = 41;</code>
-     */
-    public int getOptionsCount() {
-      return options_.size();
-    }
-    /**
-     * <pre>
-     * a list of strings where each string has the form of 'key=value'.
-     * used to tell certain properties of the data (e.g., passthrough vs.
-     * binderized).
-     * </pre>
-     *
-     * <code>repeated bytes options = 41;</code>
-     */
-    public com.google.protobuf.ByteString getOptions(int index) {
-      return options_.get(index);
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, name_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeEnum(2, type_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeEnum(3, regressionMode_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeInt64(11, startTimestamp_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeInt64(12, endTimestamp_);
-      }
-      for (int i = 0; i < label_.size(); i++) {
-        output.writeBytes(21, label_.get(i));
-      }
-      for (int i = 0; i < value_.size(); i++) {
-        output.writeInt64(22, value_.get(i));
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        output.writeBytes(31, xAxisLabel_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        output.writeBytes(32, yAxisLabel_);
-      }
-      for (int i = 0; i < options_.size(); i++) {
-        output.writeBytes(41, options_.get(i));
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, name_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(2, type_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(3, regressionMode_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(11, startTimestamp_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(12, endTimestamp_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < label_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(label_.get(i));
-        }
-        size += dataSize;
-        size += 2 * getLabelList().size();
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < value_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeInt64SizeNoTag(value_.get(i));
-        }
-        size += dataSize;
-        size += 2 * getValueList().size();
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(31, xAxisLabel_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(32, yAxisLabel_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < options_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(options_.get(i));
-        }
-        size += dataSize;
-        size += 2 * getOptionsList().size();
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.ProfilingReportMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.ProfilingReportMessage other = (com.android.vts.proto.VtsReportMessage.ProfilingReportMessage) obj;
-
-      boolean result = true;
-      result = result && (hasName() == other.hasName());
-      if (hasName()) {
-        result = result && getName()
-            .equals(other.getName());
-      }
-      result = result && (hasType() == other.hasType());
-      if (hasType()) {
-        result = result && type_ == other.type_;
-      }
-      result = result && (hasRegressionMode() == other.hasRegressionMode());
-      if (hasRegressionMode()) {
-        result = result && regressionMode_ == other.regressionMode_;
-      }
-      result = result && (hasStartTimestamp() == other.hasStartTimestamp());
-      if (hasStartTimestamp()) {
-        result = result && (getStartTimestamp()
-            == other.getStartTimestamp());
-      }
-      result = result && (hasEndTimestamp() == other.hasEndTimestamp());
-      if (hasEndTimestamp()) {
-        result = result && (getEndTimestamp()
-            == other.getEndTimestamp());
-      }
-      result = result && getLabelList()
-          .equals(other.getLabelList());
-      result = result && getValueList()
-          .equals(other.getValueList());
-      result = result && (hasXAxisLabel() == other.hasXAxisLabel());
-      if (hasXAxisLabel()) {
-        result = result && getXAxisLabel()
-            .equals(other.getXAxisLabel());
-      }
-      result = result && (hasYAxisLabel() == other.hasYAxisLabel());
-      if (hasYAxisLabel()) {
-        result = result && getYAxisLabel()
-            .equals(other.getYAxisLabel());
-      }
-      result = result && getOptionsList()
-          .equals(other.getOptionsList());
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasName()) {
-        hash = (37 * hash) + NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getName().hashCode();
-      }
-      if (hasType()) {
-        hash = (37 * hash) + TYPE_FIELD_NUMBER;
-        hash = (53 * hash) + type_;
-      }
-      if (hasRegressionMode()) {
-        hash = (37 * hash) + REGRESSION_MODE_FIELD_NUMBER;
-        hash = (53 * hash) + regressionMode_;
-      }
-      if (hasStartTimestamp()) {
-        hash = (37 * hash) + START_TIMESTAMP_FIELD_NUMBER;
-        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
-            getStartTimestamp());
-      }
-      if (hasEndTimestamp()) {
-        hash = (37 * hash) + END_TIMESTAMP_FIELD_NUMBER;
-        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
-            getEndTimestamp());
-      }
-      if (getLabelCount() > 0) {
-        hash = (37 * hash) + LABEL_FIELD_NUMBER;
-        hash = (53 * hash) + getLabelList().hashCode();
-      }
-      if (getValueCount() > 0) {
-        hash = (37 * hash) + VALUE_FIELD_NUMBER;
-        hash = (53 * hash) + getValueList().hashCode();
-      }
-      if (hasXAxisLabel()) {
-        hash = (37 * hash) + X_AXIS_LABEL_FIELD_NUMBER;
-        hash = (53 * hash) + getXAxisLabel().hashCode();
-      }
-      if (hasYAxisLabel()) {
-        hash = (37 * hash) + Y_AXIS_LABEL_FIELD_NUMBER;
-        hash = (53 * hash) + getYAxisLabel().hashCode();
-      }
-      if (getOptionsCount() > 0) {
-        hash = (37 * hash) + OPTIONS_FIELD_NUMBER;
-        hash = (53 * hash) + getOptionsList().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify a profiling report.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.ProfilingReportMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.ProfilingReportMessage)
-        com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ProfilingReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ProfilingReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.class, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        name_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        type_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        regressionMode_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        startTimestamp_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000008);
-        endTimestamp_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000010);
-        label_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000020);
-        value_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000040);
-        xAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000080);
-        yAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000100);
-        options_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000200);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ProfilingReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.ProfilingReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.ProfilingReportMessage result = new com.android.vts.proto.VtsReportMessage.ProfilingReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.name_ = name_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.type_ = type_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.regressionMode_ = regressionMode_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.startTimestamp_ = startTimestamp_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        result.endTimestamp_ = endTimestamp_;
-        if (((bitField0_ & 0x00000020) == 0x00000020)) {
-          label_ = java.util.Collections.unmodifiableList(label_);
-          bitField0_ = (bitField0_ & ~0x00000020);
-        }
-        result.label_ = label_;
-        if (((bitField0_ & 0x00000040) == 0x00000040)) {
-          value_ = java.util.Collections.unmodifiableList(value_);
-          bitField0_ = (bitField0_ & ~0x00000040);
-        }
-        result.value_ = value_;
-        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
-          to_bitField0_ |= 0x00000020;
-        }
-        result.xAxisLabel_ = xAxisLabel_;
-        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
-          to_bitField0_ |= 0x00000040;
-        }
-        result.yAxisLabel_ = yAxisLabel_;
-        if (((bitField0_ & 0x00000200) == 0x00000200)) {
-          options_ = java.util.Collections.unmodifiableList(options_);
-          bitField0_ = (bitField0_ & ~0x00000200);
-        }
-        result.options_ = options_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.ProfilingReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.ProfilingReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.getDefaultInstance()) return this;
-        if (other.hasName()) {
-          setName(other.getName());
-        }
-        if (other.hasType()) {
-          setType(other.getType());
-        }
-        if (other.hasRegressionMode()) {
-          setRegressionMode(other.getRegressionMode());
-        }
-        if (other.hasStartTimestamp()) {
-          setStartTimestamp(other.getStartTimestamp());
-        }
-        if (other.hasEndTimestamp()) {
-          setEndTimestamp(other.getEndTimestamp());
-        }
-        if (!other.label_.isEmpty()) {
-          if (label_.isEmpty()) {
-            label_ = other.label_;
-            bitField0_ = (bitField0_ & ~0x00000020);
-          } else {
-            ensureLabelIsMutable();
-            label_.addAll(other.label_);
-          }
-          onChanged();
-        }
-        if (!other.value_.isEmpty()) {
-          if (value_.isEmpty()) {
-            value_ = other.value_;
-            bitField0_ = (bitField0_ & ~0x00000040);
-          } else {
-            ensureValueIsMutable();
-            value_.addAll(other.value_);
-          }
-          onChanged();
-        }
-        if (other.hasXAxisLabel()) {
-          setXAxisLabel(other.getXAxisLabel());
-        }
-        if (other.hasYAxisLabel()) {
-          setYAxisLabel(other.getYAxisLabel());
-        }
-        if (!other.options_.isEmpty()) {
-          if (options_.isEmpty()) {
-            options_ = other.options_;
-            bitField0_ = (bitField0_ & ~0x00000200);
-          } else {
-            ensureOptionsIsMutable();
-            options_.addAll(other.options_);
-          }
-          onChanged();
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.ProfilingReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.ProfilingReportMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * the instrumentation point name.
-       * </pre>
-       *
-       * <code>optional bytes name = 1;</code>
-       */
-      public boolean hasName() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * the instrumentation point name.
-       * </pre>
-       *
-       * <code>optional bytes name = 1;</code>
-       */
-      public com.google.protobuf.ByteString getName() {
-        return name_;
-      }
-      /**
-       * <pre>
-       * the instrumentation point name.
-       * </pre>
-       *
-       * <code>optional bytes name = 1;</code>
-       */
-      public Builder setName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the instrumentation point name.
-       * </pre>
-       *
-       * <code>optional bytes name = 1;</code>
-       */
-      public Builder clearName() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-
-      private int type_ = 0;
-      /**
-       * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-       */
-      public boolean hasType() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsProfilingType getType() {
-        com.android.vts.proto.VtsReportMessage.VtsProfilingType result = com.android.vts.proto.VtsReportMessage.VtsProfilingType.valueOf(type_);
-        return result == null ? com.android.vts.proto.VtsReportMessage.VtsProfilingType.UNKNOWN_VTS_PROFILING_TYPE : result;
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-       */
-      public Builder setType(com.android.vts.proto.VtsReportMessage.VtsProfilingType value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        bitField0_ |= 0x00000002;
-        type_ = value.getNumber();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingType type = 2;</code>
-       */
-      public Builder clearType() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        type_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private int regressionMode_ = 0;
-      /**
-       * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-       */
-      public boolean hasRegressionMode() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode getRegressionMode() {
-        com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode result = com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode.valueOf(regressionMode_);
-        return result == null ? com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE : result;
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-       */
-      public Builder setRegressionMode(com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        bitField0_ |= 0x00000004;
-        regressionMode_ = value.getNumber();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional .android.vts.VtsProfilingRegressionMode regression_mode = 3;</code>
-       */
-      public Builder clearRegressionMode() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        regressionMode_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private long startTimestamp_ ;
-      /**
-       * <pre>
-       * profiling start and end time stamp (for performance).
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 11;</code>
-       */
-      public boolean hasStartTimestamp() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <pre>
-       * profiling start and end time stamp (for performance).
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 11;</code>
-       */
-      public long getStartTimestamp() {
-        return startTimestamp_;
-      }
-      /**
-       * <pre>
-       * profiling start and end time stamp (for performance).
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 11;</code>
-       */
-      public Builder setStartTimestamp(long value) {
-        bitField0_ |= 0x00000008;
-        startTimestamp_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * profiling start and end time stamp (for performance).
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 11;</code>
-       */
-      public Builder clearStartTimestamp() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        startTimestamp_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      private long endTimestamp_ ;
-      /**
-       * <code>optional int64 end_timestamp = 12;</code>
-       */
-      public boolean hasEndTimestamp() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <code>optional int64 end_timestamp = 12;</code>
-       */
-      public long getEndTimestamp() {
-        return endTimestamp_;
-      }
-      /**
-       * <code>optional int64 end_timestamp = 12;</code>
-       */
-      public Builder setEndTimestamp(long value) {
-        bitField0_ |= 0x00000010;
-        endTimestamp_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int64 end_timestamp = 12;</code>
-       */
-      public Builder clearEndTimestamp() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        endTimestamp_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<com.google.protobuf.ByteString> label_ = java.util.Collections.emptyList();
-      private void ensureLabelIsMutable() {
-        if (!((bitField0_ & 0x00000020) == 0x00000020)) {
-          label_ = new java.util.ArrayList<com.google.protobuf.ByteString>(label_);
-          bitField0_ |= 0x00000020;
-         }
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getLabelList() {
-        return java.util.Collections.unmodifiableList(label_);
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public int getLabelCount() {
-        return label_.size();
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public com.google.protobuf.ByteString getLabel(int index) {
-        return label_.get(index);
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public Builder setLabel(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureLabelIsMutable();
-        label_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public Builder addLabel(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureLabelIsMutable();
-        label_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public Builder addAllLabel(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureLabelIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, label_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated bytes label = 21;</code>
-       */
-      public Builder clearLabel() {
-        label_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000020);
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<java.lang.Long> value_ = java.util.Collections.emptyList();
-      private void ensureValueIsMutable() {
-        if (!((bitField0_ & 0x00000040) == 0x00000040)) {
-          value_ = new java.util.ArrayList<java.lang.Long>(value_);
-          bitField0_ |= 0x00000040;
-         }
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public java.util.List<java.lang.Long>
-          getValueList() {
-        return java.util.Collections.unmodifiableList(value_);
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public int getValueCount() {
-        return value_.size();
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public long getValue(int index) {
-        return value_.get(index);
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public Builder setValue(
-          int index, long value) {
-        ensureValueIsMutable();
-        value_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public Builder addValue(long value) {
-        ensureValueIsMutable();
-        value_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public Builder addAllValue(
-          java.lang.Iterable<? extends java.lang.Long> values) {
-        ensureValueIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, value_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int64 value = 22;</code>
-       */
-      public Builder clearValue() {
-        value_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000040);
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString xAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * x-axis and y-axis title labels when displaying the data as a graph
-       * </pre>
-       *
-       * <code>optional bytes x_axis_label = 31;</code>
-       */
-      public boolean hasXAxisLabel() {
-        return ((bitField0_ & 0x00000080) == 0x00000080);
-      }
-      /**
-       * <pre>
-       * x-axis and y-axis title labels when displaying the data as a graph
-       * </pre>
-       *
-       * <code>optional bytes x_axis_label = 31;</code>
-       */
-      public com.google.protobuf.ByteString getXAxisLabel() {
-        return xAxisLabel_;
-      }
-      /**
-       * <pre>
-       * x-axis and y-axis title labels when displaying the data as a graph
-       * </pre>
-       *
-       * <code>optional bytes x_axis_label = 31;</code>
-       */
-      public Builder setXAxisLabel(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000080;
-        xAxisLabel_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * x-axis and y-axis title labels when displaying the data as a graph
-       * </pre>
-       *
-       * <code>optional bytes x_axis_label = 31;</code>
-       */
-      public Builder clearXAxisLabel() {
-        bitField0_ = (bitField0_ & ~0x00000080);
-        xAxisLabel_ = getDefaultInstance().getXAxisLabel();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString yAxisLabel_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <code>optional bytes y_axis_label = 32;</code>
-       */
-      public boolean hasYAxisLabel() {
-        return ((bitField0_ & 0x00000100) == 0x00000100);
-      }
-      /**
-       * <code>optional bytes y_axis_label = 32;</code>
-       */
-      public com.google.protobuf.ByteString getYAxisLabel() {
-        return yAxisLabel_;
-      }
-      /**
-       * <code>optional bytes y_axis_label = 32;</code>
-       */
-      public Builder setYAxisLabel(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000100;
-        yAxisLabel_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional bytes y_axis_label = 32;</code>
-       */
-      public Builder clearYAxisLabel() {
-        bitField0_ = (bitField0_ & ~0x00000100);
-        yAxisLabel_ = getDefaultInstance().getYAxisLabel();
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<com.google.protobuf.ByteString> options_ = java.util.Collections.emptyList();
-      private void ensureOptionsIsMutable() {
-        if (!((bitField0_ & 0x00000200) == 0x00000200)) {
-          options_ = new java.util.ArrayList<com.google.protobuf.ByteString>(options_);
-          bitField0_ |= 0x00000200;
-         }
-      }
-      /**
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       *
-       * <code>repeated bytes options = 41;</code>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getOptionsList() {
-        return java.util.Collections.unmodifiableList(options_);
-      }
-      /**
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       *
-       * <code>repeated bytes options = 41;</code>
-       */
-      public int getOptionsCount() {
-        return options_.size();
-      }
-      /**
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       *
-       * <code>repeated bytes options = 41;</code>
-       */
-      public com.google.protobuf.ByteString getOptions(int index) {
-        return options_.get(index);
-      }
-      /**
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       *
-       * <code>repeated bytes options = 41;</code>
-       */
-      public Builder setOptions(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureOptionsIsMutable();
-        options_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       *
-       * <code>repeated bytes options = 41;</code>
-       */
-      public Builder addOptions(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureOptionsIsMutable();
-        options_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       *
-       * <code>repeated bytes options = 41;</code>
-       */
-      public Builder addAllOptions(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureOptionsIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, options_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * a list of strings where each string has the form of 'key=value'.
-       * used to tell certain properties of the data (e.g., passthrough vs.
-       * binderized).
-       * </pre>
-       *
-       * <code>repeated bytes options = 41;</code>
-       */
-      public Builder clearOptions() {
-        options_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000200);
-        onChanged();
-        return this;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.ProfilingReportMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.ProfilingReportMessage)
-    private static final com.android.vts.proto.VtsReportMessage.ProfilingReportMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.ProfilingReportMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<ProfilingReportMessage>
-        PARSER = new com.google.protobuf.AbstractParser<ProfilingReportMessage>() {
-      public ProfilingReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new ProfilingReportMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<ProfilingReportMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<ProfilingReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface SystraceReportMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.SystraceReportMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * the target process name used by systrace
-     * </pre>
-     *
-     * <code>optional bytes process_name = 1;</code>
-     */
-    boolean hasProcessName();
-    /**
-     * <pre>
-     * the target process name used by systrace
-     * </pre>
-     *
-     * <code>optional bytes process_name = 1;</code>
-     */
-    com.google.protobuf.ByteString getProcessName();
-
-    /**
-     * <pre>
-     * the produced html report
-     * </pre>
-     *
-     * <code>repeated bytes html = 11;</code>
-     */
-    java.util.List<com.google.protobuf.ByteString> getHtmlList();
-    /**
-     * <pre>
-     * the produced html report
-     * </pre>
-     *
-     * <code>repeated bytes html = 11;</code>
-     */
-    int getHtmlCount();
-    /**
-     * <pre>
-     * the produced html report
-     * </pre>
-     *
-     * <code>repeated bytes html = 11;</code>
-     */
-    com.google.protobuf.ByteString getHtml(int index);
-
-    /**
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     *
-     * <code>repeated bytes url = 21;</code>
-     */
-    java.util.List<com.google.protobuf.ByteString> getUrlList();
-    /**
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     *
-     * <code>repeated bytes url = 21;</code>
-     */
-    int getUrlCount();
-    /**
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     *
-     * <code>repeated bytes url = 21;</code>
-     */
-    com.google.protobuf.ByteString getUrl(int index);
-  }
-  /**
-   * <pre>
-   * To specify a systrace report.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.SystraceReportMessage}
-   */
-  public  static final class SystraceReportMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.SystraceReportMessage)
-      SystraceReportMessageOrBuilder {
-    // Use SystraceReportMessage.newBuilder() to construct.
-    private SystraceReportMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private SystraceReportMessage() {
-      processName_ = com.google.protobuf.ByteString.EMPTY;
-      html_ = java.util.Collections.emptyList();
-      url_ = java.util.Collections.emptyList();
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private SystraceReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              processName_ = input.readBytes();
-              break;
-            }
-            case 90: {
-              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-                html_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000002;
-              }
-              html_.add(input.readBytes());
-              break;
-            }
-            case 170: {
-              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
-                url_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000004;
-              }
-              url_.add(input.readBytes());
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-          html_ = java.util.Collections.unmodifiableList(html_);
-        }
-        if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
-          url_ = java.util.Collections.unmodifiableList(url_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_SystraceReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_SystraceReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.SystraceReportMessage.class, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int PROCESS_NAME_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString processName_;
-    /**
-     * <pre>
-     * the target process name used by systrace
-     * </pre>
-     *
-     * <code>optional bytes process_name = 1;</code>
-     */
-    public boolean hasProcessName() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * the target process name used by systrace
-     * </pre>
-     *
-     * <code>optional bytes process_name = 1;</code>
-     */
-    public com.google.protobuf.ByteString getProcessName() {
-      return processName_;
-    }
-
-    public static final int HTML_FIELD_NUMBER = 11;
-    private java.util.List<com.google.protobuf.ByteString> html_;
-    /**
-     * <pre>
-     * the produced html report
-     * </pre>
-     *
-     * <code>repeated bytes html = 11;</code>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getHtmlList() {
-      return html_;
-    }
-    /**
-     * <pre>
-     * the produced html report
-     * </pre>
-     *
-     * <code>repeated bytes html = 11;</code>
-     */
-    public int getHtmlCount() {
-      return html_.size();
-    }
-    /**
-     * <pre>
-     * the produced html report
-     * </pre>
-     *
-     * <code>repeated bytes html = 11;</code>
-     */
-    public com.google.protobuf.ByteString getHtml(int index) {
-      return html_.get(index);
-    }
-
-    public static final int URL_FIELD_NUMBER = 21;
-    private java.util.List<com.google.protobuf.ByteString> url_;
-    /**
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     *
-     * <code>repeated bytes url = 21;</code>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getUrlList() {
-      return url_;
-    }
-    /**
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     *
-     * <code>repeated bytes url = 21;</code>
-     */
-    public int getUrlCount() {
-      return url_.size();
-    }
-    /**
-     * <pre>
-     * URLs of the produced html reports
-     * </pre>
-     *
-     * <code>repeated bytes url = 21;</code>
-     */
-    public com.google.protobuf.ByteString getUrl(int index) {
-      return url_.get(index);
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, processName_);
-      }
-      for (int i = 0; i < html_.size(); i++) {
-        output.writeBytes(11, html_.get(i));
-      }
-      for (int i = 0; i < url_.size(); i++) {
-        output.writeBytes(21, url_.get(i));
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, processName_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < html_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(html_.get(i));
-        }
-        size += dataSize;
-        size += 1 * getHtmlList().size();
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < url_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(url_.get(i));
-        }
-        size += dataSize;
-        size += 2 * getUrlList().size();
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.SystraceReportMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.SystraceReportMessage other = (com.android.vts.proto.VtsReportMessage.SystraceReportMessage) obj;
-
-      boolean result = true;
-      result = result && (hasProcessName() == other.hasProcessName());
-      if (hasProcessName()) {
-        result = result && getProcessName()
-            .equals(other.getProcessName());
-      }
-      result = result && getHtmlList()
-          .equals(other.getHtmlList());
-      result = result && getUrlList()
-          .equals(other.getUrlList());
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasProcessName()) {
-        hash = (37 * hash) + PROCESS_NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getProcessName().hashCode();
-      }
-      if (getHtmlCount() > 0) {
-        hash = (37 * hash) + HTML_FIELD_NUMBER;
-        hash = (53 * hash) + getHtmlList().hashCode();
-      }
-      if (getUrlCount() > 0) {
-        hash = (37 * hash) + URL_FIELD_NUMBER;
-        hash = (53 * hash) + getUrlList().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.SystraceReportMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify a systrace report.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.SystraceReportMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.SystraceReportMessage)
-        com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_SystraceReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_SystraceReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.SystraceReportMessage.class, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.SystraceReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        processName_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        html_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000002);
-        url_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000004);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_SystraceReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.SystraceReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.SystraceReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.SystraceReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.SystraceReportMessage result = new com.android.vts.proto.VtsReportMessage.SystraceReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.processName_ = processName_;
-        if (((bitField0_ & 0x00000002) == 0x00000002)) {
-          html_ = java.util.Collections.unmodifiableList(html_);
-          bitField0_ = (bitField0_ & ~0x00000002);
-        }
-        result.html_ = html_;
-        if (((bitField0_ & 0x00000004) == 0x00000004)) {
-          url_ = java.util.Collections.unmodifiableList(url_);
-          bitField0_ = (bitField0_ & ~0x00000004);
-        }
-        result.url_ = url_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.SystraceReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.SystraceReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.SystraceReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.SystraceReportMessage.getDefaultInstance()) return this;
-        if (other.hasProcessName()) {
-          setProcessName(other.getProcessName());
-        }
-        if (!other.html_.isEmpty()) {
-          if (html_.isEmpty()) {
-            html_ = other.html_;
-            bitField0_ = (bitField0_ & ~0x00000002);
-          } else {
-            ensureHtmlIsMutable();
-            html_.addAll(other.html_);
-          }
-          onChanged();
-        }
-        if (!other.url_.isEmpty()) {
-          if (url_.isEmpty()) {
-            url_ = other.url_;
-            bitField0_ = (bitField0_ & ~0x00000004);
-          } else {
-            ensureUrlIsMutable();
-            url_.addAll(other.url_);
-          }
-          onChanged();
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.SystraceReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.SystraceReportMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString processName_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * the target process name used by systrace
-       * </pre>
-       *
-       * <code>optional bytes process_name = 1;</code>
-       */
-      public boolean hasProcessName() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * the target process name used by systrace
-       * </pre>
-       *
-       * <code>optional bytes process_name = 1;</code>
-       */
-      public com.google.protobuf.ByteString getProcessName() {
-        return processName_;
-      }
-      /**
-       * <pre>
-       * the target process name used by systrace
-       * </pre>
-       *
-       * <code>optional bytes process_name = 1;</code>
-       */
-      public Builder setProcessName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        processName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the target process name used by systrace
-       * </pre>
-       *
-       * <code>optional bytes process_name = 1;</code>
-       */
-      public Builder clearProcessName() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        processName_ = getDefaultInstance().getProcessName();
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<com.google.protobuf.ByteString> html_ = java.util.Collections.emptyList();
-      private void ensureHtmlIsMutable() {
-        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
-          html_ = new java.util.ArrayList<com.google.protobuf.ByteString>(html_);
-          bitField0_ |= 0x00000002;
-         }
-      }
-      /**
-       * <pre>
-       * the produced html report
-       * </pre>
-       *
-       * <code>repeated bytes html = 11;</code>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getHtmlList() {
-        return java.util.Collections.unmodifiableList(html_);
-      }
-      /**
-       * <pre>
-       * the produced html report
-       * </pre>
-       *
-       * <code>repeated bytes html = 11;</code>
-       */
-      public int getHtmlCount() {
-        return html_.size();
-      }
-      /**
-       * <pre>
-       * the produced html report
-       * </pre>
-       *
-       * <code>repeated bytes html = 11;</code>
-       */
-      public com.google.protobuf.ByteString getHtml(int index) {
-        return html_.get(index);
-      }
-      /**
-       * <pre>
-       * the produced html report
-       * </pre>
-       *
-       * <code>repeated bytes html = 11;</code>
-       */
-      public Builder setHtml(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureHtmlIsMutable();
-        html_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the produced html report
-       * </pre>
-       *
-       * <code>repeated bytes html = 11;</code>
-       */
-      public Builder addHtml(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureHtmlIsMutable();
-        html_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the produced html report
-       * </pre>
-       *
-       * <code>repeated bytes html = 11;</code>
-       */
-      public Builder addAllHtml(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureHtmlIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, html_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the produced html report
-       * </pre>
-       *
-       * <code>repeated bytes html = 11;</code>
-       */
-      public Builder clearHtml() {
-        html_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000002);
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<com.google.protobuf.ByteString> url_ = java.util.Collections.emptyList();
-      private void ensureUrlIsMutable() {
-        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
-          url_ = new java.util.ArrayList<com.google.protobuf.ByteString>(url_);
-          bitField0_ |= 0x00000004;
-         }
-      }
-      /**
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       *
-       * <code>repeated bytes url = 21;</code>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getUrlList() {
-        return java.util.Collections.unmodifiableList(url_);
-      }
-      /**
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       *
-       * <code>repeated bytes url = 21;</code>
-       */
-      public int getUrlCount() {
-        return url_.size();
-      }
-      /**
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       *
-       * <code>repeated bytes url = 21;</code>
-       */
-      public com.google.protobuf.ByteString getUrl(int index) {
-        return url_.get(index);
-      }
-      /**
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       *
-       * <code>repeated bytes url = 21;</code>
-       */
-      public Builder setUrl(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureUrlIsMutable();
-        url_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       *
-       * <code>repeated bytes url = 21;</code>
-       */
-      public Builder addUrl(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureUrlIsMutable();
-        url_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       *
-       * <code>repeated bytes url = 21;</code>
-       */
-      public Builder addAllUrl(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureUrlIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, url_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * URLs of the produced html reports
-       * </pre>
-       *
-       * <code>repeated bytes url = 21;</code>
-       */
-      public Builder clearUrl() {
-        url_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000004);
-        onChanged();
-        return this;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.SystraceReportMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.SystraceReportMessage)
-    private static final com.android.vts.proto.VtsReportMessage.SystraceReportMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.SystraceReportMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.SystraceReportMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<SystraceReportMessage>
-        PARSER = new com.google.protobuf.AbstractParser<SystraceReportMessage>() {
-      public SystraceReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new SystraceReportMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<SystraceReportMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<SystraceReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface CoverageReportMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.CoverageReportMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * the path to the source file from the project root.
-     * </pre>
-     *
-     * <code>optional bytes file_path = 11;</code>
-     */
-    boolean hasFilePath();
-    /**
-     * <pre>
-     * the path to the source file from the project root.
-     * </pre>
-     *
-     * <code>optional bytes file_path = 11;</code>
-     */
-    com.google.protobuf.ByteString getFilePath();
-
-    /**
-     * <pre>
-     * the name of the project where the file can be found
-     * </pre>
-     *
-     * <code>optional bytes project_name = 12;</code>
-     */
-    boolean hasProjectName();
-    /**
-     * <pre>
-     * the name of the project where the file can be found
-     * </pre>
-     *
-     * <code>optional bytes project_name = 12;</code>
-     */
-    com.google.protobuf.ByteString getProjectName();
-
-    /**
-     * <pre>
-     * the commit ID identifying the code revision
-     * </pre>
-     *
-     * <code>optional bytes revision = 13;</code>
-     */
-    boolean hasRevision();
-    /**
-     * <pre>
-     * the commit ID identifying the code revision
-     * </pre>
-     *
-     * <code>optional bytes revision = 13;</code>
-     */
-    com.google.protobuf.ByteString getRevision();
-
-    /**
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     *
-     * <code>repeated int64 line_coverage_vector = 23;</code>
-     */
-    java.util.List<java.lang.Long> getLineCoverageVectorList();
-    /**
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     *
-     * <code>repeated int64 line_coverage_vector = 23;</code>
-     */
-    int getLineCoverageVectorCount();
-    /**
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     *
-     * <code>repeated int64 line_coverage_vector = 23;</code>
-     */
-    long getLineCoverageVector(int index);
-
-    /**
-     * <pre>
-     * the number of source code lines that are instrumented for code coverage
-     * measurement.
-     * </pre>
-     *
-     * <code>optional int32 total_line_count = 101;</code>
-     */
-    boolean hasTotalLineCount();
-    /**
-     * <pre>
-     * the number of source code lines that are instrumented for code coverage
-     * measurement.
-     * </pre>
-     *
-     * <code>optional int32 total_line_count = 101;</code>
-     */
-    int getTotalLineCount();
-
-    /**
-     * <pre>
-     * the number of source code lines that are executed.
-     * </pre>
-     *
-     * <code>optional int32 covered_line_count = 102;</code>
-     */
-    boolean hasCoveredLineCount();
-    /**
-     * <pre>
-     * the number of source code lines that are executed.
-     * </pre>
-     *
-     * <code>optional int32 covered_line_count = 102;</code>
-     */
-    int getCoveredLineCount();
-
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * the directory path of a source file.
-     * </pre>
-     *
-     * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated boolean hasDirPath();
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * the directory path of a source file.
-     * </pre>
-     *
-     * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated com.google.protobuf.ByteString getDirPath();
-
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * the name of the source file.
-     * </pre>
-     *
-     * <code>optional bytes file_name = 2 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated boolean hasFileName();
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * the name of the source file.
-     * </pre>
-     *
-     * <code>optional bytes file_name = 2 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated com.google.protobuf.ByteString getFileName();
-
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * produced html report.
-     * </pre>
-     *
-     * <code>optional bytes html = 3 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated boolean hasHtml();
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * produced html report.
-     * </pre>
-     *
-     * <code>optional bytes html = 3 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated com.google.protobuf.ByteString getHtml();
-  }
-  /**
-   * <pre>
-   * To specify a coverage report.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.CoverageReportMessage}
-   */
-  public  static final class CoverageReportMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.CoverageReportMessage)
-      CoverageReportMessageOrBuilder {
-    // Use CoverageReportMessage.newBuilder() to construct.
-    private CoverageReportMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private CoverageReportMessage() {
-      filePath_ = com.google.protobuf.ByteString.EMPTY;
-      projectName_ = com.google.protobuf.ByteString.EMPTY;
-      revision_ = com.google.protobuf.ByteString.EMPTY;
-      lineCoverageVector_ = java.util.Collections.emptyList();
-      totalLineCount_ = 0;
-      coveredLineCount_ = 0;
-      dirPath_ = com.google.protobuf.ByteString.EMPTY;
-      fileName_ = com.google.protobuf.ByteString.EMPTY;
-      html_ = com.google.protobuf.ByteString.EMPTY;
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private CoverageReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000020;
-              dirPath_ = input.readBytes();
-              break;
-            }
-            case 18: {
-              bitField0_ |= 0x00000040;
-              fileName_ = input.readBytes();
-              break;
-            }
-            case 26: {
-              bitField0_ |= 0x00000080;
-              html_ = input.readBytes();
-              break;
-            }
-            case 90: {
-              bitField0_ |= 0x00000001;
-              filePath_ = input.readBytes();
-              break;
-            }
-            case 98: {
-              bitField0_ |= 0x00000002;
-              projectName_ = input.readBytes();
-              break;
-            }
-            case 106: {
-              bitField0_ |= 0x00000004;
-              revision_ = input.readBytes();
-              break;
-            }
-            case 184: {
-              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-                lineCoverageVector_ = new java.util.ArrayList<java.lang.Long>();
-                mutable_bitField0_ |= 0x00000008;
-              }
-              lineCoverageVector_.add(input.readInt64());
-              break;
-            }
-            case 186: {
-              int length = input.readRawVarint32();
-              int limit = input.pushLimit(length);
-              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008) && input.getBytesUntilLimit() > 0) {
-                lineCoverageVector_ = new java.util.ArrayList<java.lang.Long>();
-                mutable_bitField0_ |= 0x00000008;
-              }
-              while (input.getBytesUntilLimit() > 0) {
-                lineCoverageVector_.add(input.readInt64());
-              }
-              input.popLimit(limit);
-              break;
-            }
-            case 808: {
-              bitField0_ |= 0x00000008;
-              totalLineCount_ = input.readInt32();
-              break;
-            }
-            case 816: {
-              bitField0_ |= 0x00000010;
-              coveredLineCount_ = input.readInt32();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-          lineCoverageVector_ = java.util.Collections.unmodifiableList(lineCoverageVector_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_CoverageReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_CoverageReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.CoverageReportMessage.class, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int FILE_PATH_FIELD_NUMBER = 11;
-    private com.google.protobuf.ByteString filePath_;
-    /**
-     * <pre>
-     * the path to the source file from the project root.
-     * </pre>
-     *
-     * <code>optional bytes file_path = 11;</code>
-     */
-    public boolean hasFilePath() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * the path to the source file from the project root.
-     * </pre>
-     *
-     * <code>optional bytes file_path = 11;</code>
-     */
-    public com.google.protobuf.ByteString getFilePath() {
-      return filePath_;
-    }
-
-    public static final int PROJECT_NAME_FIELD_NUMBER = 12;
-    private com.google.protobuf.ByteString projectName_;
-    /**
-     * <pre>
-     * the name of the project where the file can be found
-     * </pre>
-     *
-     * <code>optional bytes project_name = 12;</code>
-     */
-    public boolean hasProjectName() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <pre>
-     * the name of the project where the file can be found
-     * </pre>
-     *
-     * <code>optional bytes project_name = 12;</code>
-     */
-    public com.google.protobuf.ByteString getProjectName() {
-      return projectName_;
-    }
-
-    public static final int REVISION_FIELD_NUMBER = 13;
-    private com.google.protobuf.ByteString revision_;
-    /**
-     * <pre>
-     * the commit ID identifying the code revision
-     * </pre>
-     *
-     * <code>optional bytes revision = 13;</code>
-     */
-    public boolean hasRevision() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <pre>
-     * the commit ID identifying the code revision
-     * </pre>
-     *
-     * <code>optional bytes revision = 13;</code>
-     */
-    public com.google.protobuf.ByteString getRevision() {
-      return revision_;
-    }
-
-    public static final int LINE_COVERAGE_VECTOR_FIELD_NUMBER = 23;
-    private java.util.List<java.lang.Long> lineCoverageVector_;
-    /**
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     *
-     * <code>repeated int64 line_coverage_vector = 23;</code>
-     */
-    public java.util.List<java.lang.Long>
-        getLineCoverageVectorList() {
-      return lineCoverageVector_;
-    }
-    /**
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     *
-     * <code>repeated int64 line_coverage_vector = 23;</code>
-     */
-    public int getLineCoverageVectorCount() {
-      return lineCoverageVector_.size();
-    }
-    /**
-     * <pre>
-     * i-th element gives the number of times i-th line is executed.
-     * </pre>
-     *
-     * <code>repeated int64 line_coverage_vector = 23;</code>
-     */
-    public long getLineCoverageVector(int index) {
-      return lineCoverageVector_.get(index);
-    }
-
-    public static final int TOTAL_LINE_COUNT_FIELD_NUMBER = 101;
-    private int totalLineCount_;
-    /**
-     * <pre>
-     * the number of source code lines that are instrumented for code coverage
-     * measurement.
-     * </pre>
-     *
-     * <code>optional int32 total_line_count = 101;</code>
-     */
-    public boolean hasTotalLineCount() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <pre>
-     * the number of source code lines that are instrumented for code coverage
-     * measurement.
-     * </pre>
-     *
-     * <code>optional int32 total_line_count = 101;</code>
-     */
-    public int getTotalLineCount() {
-      return totalLineCount_;
-    }
-
-    public static final int COVERED_LINE_COUNT_FIELD_NUMBER = 102;
-    private int coveredLineCount_;
-    /**
-     * <pre>
-     * the number of source code lines that are executed.
-     * </pre>
-     *
-     * <code>optional int32 covered_line_count = 102;</code>
-     */
-    public boolean hasCoveredLineCount() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <pre>
-     * the number of source code lines that are executed.
-     * </pre>
-     *
-     * <code>optional int32 covered_line_count = 102;</code>
-     */
-    public int getCoveredLineCount() {
-      return coveredLineCount_;
-    }
-
-    public static final int DIR_PATH_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString dirPath_;
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * the directory path of a source file.
-     * </pre>
-     *
-     * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public boolean hasDirPath() {
-      return ((bitField0_ & 0x00000020) == 0x00000020);
-    }
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * the directory path of a source file.
-     * </pre>
-     *
-     * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public com.google.protobuf.ByteString getDirPath() {
-      return dirPath_;
-    }
-
-    public static final int FILE_NAME_FIELD_NUMBER = 2;
-    private com.google.protobuf.ByteString fileName_;
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * the name of the source file.
-     * </pre>
-     *
-     * <code>optional bytes file_name = 2 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public boolean hasFileName() {
-      return ((bitField0_ & 0x00000040) == 0x00000040);
-    }
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * the name of the source file.
-     * </pre>
-     *
-     * <code>optional bytes file_name = 2 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public com.google.protobuf.ByteString getFileName() {
-      return fileName_;
-    }
-
-    public static final int HTML_FIELD_NUMBER = 3;
-    private com.google.protobuf.ByteString html_;
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * produced html report.
-     * </pre>
-     *
-     * <code>optional bytes html = 3 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public boolean hasHtml() {
-      return ((bitField0_ & 0x00000080) == 0x00000080);
-    }
-    /**
-     * <pre>
-     * TODO(ryanjcampbell&#64;) delete deprecated field
-     * produced html report.
-     * </pre>
-     *
-     * <code>optional bytes html = 3 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public com.google.protobuf.ByteString getHtml() {
-      return html_;
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        output.writeBytes(1, dirPath_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        output.writeBytes(2, fileName_);
-      }
-      if (((bitField0_ & 0x00000080) == 0x00000080)) {
-        output.writeBytes(3, html_);
-      }
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(11, filePath_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(12, projectName_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(13, revision_);
-      }
-      for (int i = 0; i < lineCoverageVector_.size(); i++) {
-        output.writeInt64(23, lineCoverageVector_.get(i));
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeInt32(101, totalLineCount_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeInt32(102, coveredLineCount_);
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, dirPath_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, fileName_);
-      }
-      if (((bitField0_ & 0x00000080) == 0x00000080)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(3, html_);
-      }
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(11, filePath_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(12, projectName_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(13, revision_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < lineCoverageVector_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeInt64SizeNoTag(lineCoverageVector_.get(i));
-        }
-        size += dataSize;
-        size += 2 * getLineCoverageVectorList().size();
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(101, totalLineCount_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(102, coveredLineCount_);
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.CoverageReportMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.CoverageReportMessage other = (com.android.vts.proto.VtsReportMessage.CoverageReportMessage) obj;
-
-      boolean result = true;
-      result = result && (hasFilePath() == other.hasFilePath());
-      if (hasFilePath()) {
-        result = result && getFilePath()
-            .equals(other.getFilePath());
-      }
-      result = result && (hasProjectName() == other.hasProjectName());
-      if (hasProjectName()) {
-        result = result && getProjectName()
-            .equals(other.getProjectName());
-      }
-      result = result && (hasRevision() == other.hasRevision());
-      if (hasRevision()) {
-        result = result && getRevision()
-            .equals(other.getRevision());
-      }
-      result = result && getLineCoverageVectorList()
-          .equals(other.getLineCoverageVectorList());
-      result = result && (hasTotalLineCount() == other.hasTotalLineCount());
-      if (hasTotalLineCount()) {
-        result = result && (getTotalLineCount()
-            == other.getTotalLineCount());
-      }
-      result = result && (hasCoveredLineCount() == other.hasCoveredLineCount());
-      if (hasCoveredLineCount()) {
-        result = result && (getCoveredLineCount()
-            == other.getCoveredLineCount());
-      }
-      result = result && (hasDirPath() == other.hasDirPath());
-      if (hasDirPath()) {
-        result = result && getDirPath()
-            .equals(other.getDirPath());
-      }
-      result = result && (hasFileName() == other.hasFileName());
-      if (hasFileName()) {
-        result = result && getFileName()
-            .equals(other.getFileName());
-      }
-      result = result && (hasHtml() == other.hasHtml());
-      if (hasHtml()) {
-        result = result && getHtml()
-            .equals(other.getHtml());
-      }
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasFilePath()) {
-        hash = (37 * hash) + FILE_PATH_FIELD_NUMBER;
-        hash = (53 * hash) + getFilePath().hashCode();
-      }
-      if (hasProjectName()) {
-        hash = (37 * hash) + PROJECT_NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getProjectName().hashCode();
-      }
-      if (hasRevision()) {
-        hash = (37 * hash) + REVISION_FIELD_NUMBER;
-        hash = (53 * hash) + getRevision().hashCode();
-      }
-      if (getLineCoverageVectorCount() > 0) {
-        hash = (37 * hash) + LINE_COVERAGE_VECTOR_FIELD_NUMBER;
-        hash = (53 * hash) + getLineCoverageVectorList().hashCode();
-      }
-      if (hasTotalLineCount()) {
-        hash = (37 * hash) + TOTAL_LINE_COUNT_FIELD_NUMBER;
-        hash = (53 * hash) + getTotalLineCount();
-      }
-      if (hasCoveredLineCount()) {
-        hash = (37 * hash) + COVERED_LINE_COUNT_FIELD_NUMBER;
-        hash = (53 * hash) + getCoveredLineCount();
-      }
-      if (hasDirPath()) {
-        hash = (37 * hash) + DIR_PATH_FIELD_NUMBER;
-        hash = (53 * hash) + getDirPath().hashCode();
-      }
-      if (hasFileName()) {
-        hash = (37 * hash) + FILE_NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getFileName().hashCode();
-      }
-      if (hasHtml()) {
-        hash = (37 * hash) + HTML_FIELD_NUMBER;
-        hash = (53 * hash) + getHtml().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.CoverageReportMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify a coverage report.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.CoverageReportMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.CoverageReportMessage)
-        com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_CoverageReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_CoverageReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.CoverageReportMessage.class, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.CoverageReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        filePath_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        projectName_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        revision_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        lineCoverageVector_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000008);
-        totalLineCount_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000010);
-        coveredLineCount_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000020);
-        dirPath_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000040);
-        fileName_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000080);
-        html_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000100);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_CoverageReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.CoverageReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.CoverageReportMessage result = new com.android.vts.proto.VtsReportMessage.CoverageReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.filePath_ = filePath_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.projectName_ = projectName_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.revision_ = revision_;
-        if (((bitField0_ & 0x00000008) == 0x00000008)) {
-          lineCoverageVector_ = java.util.Collections.unmodifiableList(lineCoverageVector_);
-          bitField0_ = (bitField0_ & ~0x00000008);
-        }
-        result.lineCoverageVector_ = lineCoverageVector_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.totalLineCount_ = totalLineCount_;
-        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        result.coveredLineCount_ = coveredLineCount_;
-        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
-          to_bitField0_ |= 0x00000020;
-        }
-        result.dirPath_ = dirPath_;
-        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
-          to_bitField0_ |= 0x00000040;
-        }
-        result.fileName_ = fileName_;
-        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
-          to_bitField0_ |= 0x00000080;
-        }
-        result.html_ = html_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.CoverageReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.CoverageReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.CoverageReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance()) return this;
-        if (other.hasFilePath()) {
-          setFilePath(other.getFilePath());
-        }
-        if (other.hasProjectName()) {
-          setProjectName(other.getProjectName());
-        }
-        if (other.hasRevision()) {
-          setRevision(other.getRevision());
-        }
-        if (!other.lineCoverageVector_.isEmpty()) {
-          if (lineCoverageVector_.isEmpty()) {
-            lineCoverageVector_ = other.lineCoverageVector_;
-            bitField0_ = (bitField0_ & ~0x00000008);
-          } else {
-            ensureLineCoverageVectorIsMutable();
-            lineCoverageVector_.addAll(other.lineCoverageVector_);
-          }
-          onChanged();
-        }
-        if (other.hasTotalLineCount()) {
-          setTotalLineCount(other.getTotalLineCount());
-        }
-        if (other.hasCoveredLineCount()) {
-          setCoveredLineCount(other.getCoveredLineCount());
-        }
-        if (other.hasDirPath()) {
-          setDirPath(other.getDirPath());
-        }
-        if (other.hasFileName()) {
-          setFileName(other.getFileName());
-        }
-        if (other.hasHtml()) {
-          setHtml(other.getHtml());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.CoverageReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.CoverageReportMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString filePath_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * the path to the source file from the project root.
-       * </pre>
-       *
-       * <code>optional bytes file_path = 11;</code>
-       */
-      public boolean hasFilePath() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * the path to the source file from the project root.
-       * </pre>
-       *
-       * <code>optional bytes file_path = 11;</code>
-       */
-      public com.google.protobuf.ByteString getFilePath() {
-        return filePath_;
-      }
-      /**
-       * <pre>
-       * the path to the source file from the project root.
-       * </pre>
-       *
-       * <code>optional bytes file_path = 11;</code>
-       */
-      public Builder setFilePath(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        filePath_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the path to the source file from the project root.
-       * </pre>
-       *
-       * <code>optional bytes file_path = 11;</code>
-       */
-      public Builder clearFilePath() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        filePath_ = getDefaultInstance().getFilePath();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString projectName_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * the name of the project where the file can be found
-       * </pre>
-       *
-       * <code>optional bytes project_name = 12;</code>
-       */
-      public boolean hasProjectName() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <pre>
-       * the name of the project where the file can be found
-       * </pre>
-       *
-       * <code>optional bytes project_name = 12;</code>
-       */
-      public com.google.protobuf.ByteString getProjectName() {
-        return projectName_;
-      }
-      /**
-       * <pre>
-       * the name of the project where the file can be found
-       * </pre>
-       *
-       * <code>optional bytes project_name = 12;</code>
-       */
-      public Builder setProjectName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        projectName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the name of the project where the file can be found
-       * </pre>
-       *
-       * <code>optional bytes project_name = 12;</code>
-       */
-      public Builder clearProjectName() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        projectName_ = getDefaultInstance().getProjectName();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString revision_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * the commit ID identifying the code revision
-       * </pre>
-       *
-       * <code>optional bytes revision = 13;</code>
-       */
-      public boolean hasRevision() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <pre>
-       * the commit ID identifying the code revision
-       * </pre>
-       *
-       * <code>optional bytes revision = 13;</code>
-       */
-      public com.google.protobuf.ByteString getRevision() {
-        return revision_;
-      }
-      /**
-       * <pre>
-       * the commit ID identifying the code revision
-       * </pre>
-       *
-       * <code>optional bytes revision = 13;</code>
-       */
-      public Builder setRevision(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        revision_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the commit ID identifying the code revision
-       * </pre>
-       *
-       * <code>optional bytes revision = 13;</code>
-       */
-      public Builder clearRevision() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        revision_ = getDefaultInstance().getRevision();
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<java.lang.Long> lineCoverageVector_ = java.util.Collections.emptyList();
-      private void ensureLineCoverageVectorIsMutable() {
-        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
-          lineCoverageVector_ = new java.util.ArrayList<java.lang.Long>(lineCoverageVector_);
-          bitField0_ |= 0x00000008;
-         }
-      }
-      /**
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       *
-       * <code>repeated int64 line_coverage_vector = 23;</code>
-       */
-      public java.util.List<java.lang.Long>
-          getLineCoverageVectorList() {
-        return java.util.Collections.unmodifiableList(lineCoverageVector_);
-      }
-      /**
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       *
-       * <code>repeated int64 line_coverage_vector = 23;</code>
-       */
-      public int getLineCoverageVectorCount() {
-        return lineCoverageVector_.size();
-      }
-      /**
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       *
-       * <code>repeated int64 line_coverage_vector = 23;</code>
-       */
-      public long getLineCoverageVector(int index) {
-        return lineCoverageVector_.get(index);
-      }
-      /**
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       *
-       * <code>repeated int64 line_coverage_vector = 23;</code>
-       */
-      public Builder setLineCoverageVector(
-          int index, long value) {
-        ensureLineCoverageVectorIsMutable();
-        lineCoverageVector_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       *
-       * <code>repeated int64 line_coverage_vector = 23;</code>
-       */
-      public Builder addLineCoverageVector(long value) {
-        ensureLineCoverageVectorIsMutable();
-        lineCoverageVector_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       *
-       * <code>repeated int64 line_coverage_vector = 23;</code>
-       */
-      public Builder addAllLineCoverageVector(
-          java.lang.Iterable<? extends java.lang.Long> values) {
-        ensureLineCoverageVectorIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, lineCoverageVector_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * i-th element gives the number of times i-th line is executed.
-       * </pre>
-       *
-       * <code>repeated int64 line_coverage_vector = 23;</code>
-       */
-      public Builder clearLineCoverageVector() {
-        lineCoverageVector_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000008);
-        onChanged();
-        return this;
-      }
-
-      private int totalLineCount_ ;
-      /**
-       * <pre>
-       * the number of source code lines that are instrumented for code coverage
-       * measurement.
-       * </pre>
-       *
-       * <code>optional int32 total_line_count = 101;</code>
-       */
-      public boolean hasTotalLineCount() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <pre>
-       * the number of source code lines that are instrumented for code coverage
-       * measurement.
-       * </pre>
-       *
-       * <code>optional int32 total_line_count = 101;</code>
-       */
-      public int getTotalLineCount() {
-        return totalLineCount_;
-      }
-      /**
-       * <pre>
-       * the number of source code lines that are instrumented for code coverage
-       * measurement.
-       * </pre>
-       *
-       * <code>optional int32 total_line_count = 101;</code>
-       */
-      public Builder setTotalLineCount(int value) {
-        bitField0_ |= 0x00000010;
-        totalLineCount_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the number of source code lines that are instrumented for code coverage
-       * measurement.
-       * </pre>
-       *
-       * <code>optional int32 total_line_count = 101;</code>
-       */
-      public Builder clearTotalLineCount() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        totalLineCount_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private int coveredLineCount_ ;
-      /**
-       * <pre>
-       * the number of source code lines that are executed.
-       * </pre>
-       *
-       * <code>optional int32 covered_line_count = 102;</code>
-       */
-      public boolean hasCoveredLineCount() {
-        return ((bitField0_ & 0x00000020) == 0x00000020);
-      }
-      /**
-       * <pre>
-       * the number of source code lines that are executed.
-       * </pre>
-       *
-       * <code>optional int32 covered_line_count = 102;</code>
-       */
-      public int getCoveredLineCount() {
-        return coveredLineCount_;
-      }
-      /**
-       * <pre>
-       * the number of source code lines that are executed.
-       * </pre>
-       *
-       * <code>optional int32 covered_line_count = 102;</code>
-       */
-      public Builder setCoveredLineCount(int value) {
-        bitField0_ |= 0x00000020;
-        coveredLineCount_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * the number of source code lines that are executed.
-       * </pre>
-       *
-       * <code>optional int32 covered_line_count = 102;</code>
-       */
-      public Builder clearCoveredLineCount() {
-        bitField0_ = (bitField0_ & ~0x00000020);
-        coveredLineCount_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString dirPath_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * the directory path of a source file.
-       * </pre>
-       *
-       * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public boolean hasDirPath() {
-        return ((bitField0_ & 0x00000040) == 0x00000040);
-      }
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * the directory path of a source file.
-       * </pre>
-       *
-       * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.google.protobuf.ByteString getDirPath() {
-        return dirPath_;
-      }
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * the directory path of a source file.
-       * </pre>
-       *
-       * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder setDirPath(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000040;
-        dirPath_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * the directory path of a source file.
-       * </pre>
-       *
-       * <code>optional bytes dir_path = 1 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder clearDirPath() {
-        bitField0_ = (bitField0_ & ~0x00000040);
-        dirPath_ = getDefaultInstance().getDirPath();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString fileName_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * the name of the source file.
-       * </pre>
-       *
-       * <code>optional bytes file_name = 2 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public boolean hasFileName() {
-        return ((bitField0_ & 0x00000080) == 0x00000080);
-      }
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * the name of the source file.
-       * </pre>
-       *
-       * <code>optional bytes file_name = 2 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.google.protobuf.ByteString getFileName() {
-        return fileName_;
-      }
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * the name of the source file.
-       * </pre>
-       *
-       * <code>optional bytes file_name = 2 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder setFileName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000080;
-        fileName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * the name of the source file.
-       * </pre>
-       *
-       * <code>optional bytes file_name = 2 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder clearFileName() {
-        bitField0_ = (bitField0_ & ~0x00000080);
-        fileName_ = getDefaultInstance().getFileName();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString html_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * produced html report.
-       * </pre>
-       *
-       * <code>optional bytes html = 3 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public boolean hasHtml() {
-        return ((bitField0_ & 0x00000100) == 0x00000100);
-      }
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * produced html report.
-       * </pre>
-       *
-       * <code>optional bytes html = 3 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.google.protobuf.ByteString getHtml() {
-        return html_;
-      }
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * produced html report.
-       * </pre>
-       *
-       * <code>optional bytes html = 3 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder setHtml(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000100;
-        html_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * TODO(ryanjcampbell&#64;) delete deprecated field
-       * produced html report.
-       * </pre>
-       *
-       * <code>optional bytes html = 3 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder clearHtml() {
-        bitField0_ = (bitField0_ & ~0x00000100);
-        html_ = getDefaultInstance().getHtml();
-        onChanged();
-        return this;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.CoverageReportMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.CoverageReportMessage)
-    private static final com.android.vts.proto.VtsReportMessage.CoverageReportMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.CoverageReportMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.CoverageReportMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<CoverageReportMessage>
-        PARSER = new com.google.protobuf.AbstractParser<CoverageReportMessage>() {
-      public CoverageReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new CoverageReportMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<CoverageReportMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<CoverageReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface HalInterfaceMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.HalInterfaceMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * HAL package name. e.g. android.hardware.foo.
-     * </pre>
-     *
-     * <code>optional bytes hal_package_name = 1;</code>
-     */
-    boolean hasHalPackageName();
-    /**
-     * <pre>
-     * HAL package name. e.g. android.hardware.foo.
-     * </pre>
-     *
-     * <code>optional bytes hal_package_name = 1;</code>
-     */
-    com.google.protobuf.ByteString getHalPackageName();
-
-    /**
-     * <pre>
-     * HAL (major) version. e.g. 1.
-     * </pre>
-     *
-     * <code>optional int32 hal_version_major = 2;</code>
-     */
-    boolean hasHalVersionMajor();
-    /**
-     * <pre>
-     * HAL (major) version. e.g. 1.
-     * </pre>
-     *
-     * <code>optional int32 hal_version_major = 2;</code>
-     */
-    int getHalVersionMajor();
-
-    /**
-     * <pre>
-     * HAL (minor) version. e.g. 0.
-     * </pre>
-     *
-     * <code>optional int32 hal_version_minor = 3;</code>
-     */
-    boolean hasHalVersionMinor();
-    /**
-     * <pre>
-     * HAL (minor) version. e.g. 0.
-     * </pre>
-     *
-     * <code>optional int32 hal_version_minor = 3;</code>
-     */
-    int getHalVersionMinor();
-
-    /**
-     * <pre>
-     * HAL interface name. e.g. IFoo.
-     * </pre>
-     *
-     * <code>optional bytes hal_interface_name = 4;</code>
-     */
-    boolean hasHalInterfaceName();
-    /**
-     * <pre>
-     * HAL interface name. e.g. IFoo.
-     * </pre>
-     *
-     * <code>optional bytes hal_interface_name = 4;</code>
-     */
-    com.google.protobuf.ByteString getHalInterfaceName();
-
-    /**
-     * <pre>
-     * HAL release level (e.g. "current", "27", "28")
-     * </pre>
-     *
-     * <code>optional bytes hal_release_level = 5;</code>
-     */
-    boolean hasHalReleaseLevel();
-    /**
-     * <pre>
-     * HAL release level (e.g. "current", "27", "28")
-     * </pre>
-     *
-     * <code>optional bytes hal_release_level = 5;</code>
-     */
-    com.google.protobuf.ByteString getHalReleaseLevel();
-  }
-  /**
-   * <pre>
-   * Information for a HAL interface.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.HalInterfaceMessage}
-   */
-  public  static final class HalInterfaceMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.HalInterfaceMessage)
-      HalInterfaceMessageOrBuilder {
-    // Use HalInterfaceMessage.newBuilder() to construct.
-    private HalInterfaceMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private HalInterfaceMessage() {
-      halPackageName_ = com.google.protobuf.ByteString.EMPTY;
-      halVersionMajor_ = 0;
-      halVersionMinor_ = 0;
-      halInterfaceName_ = com.google.protobuf.ByteString.EMPTY;
-      halReleaseLevel_ = com.google.protobuf.ByteString.EMPTY;
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private HalInterfaceMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              halPackageName_ = input.readBytes();
-              break;
-            }
-            case 16: {
-              bitField0_ |= 0x00000002;
-              halVersionMajor_ = input.readInt32();
-              break;
-            }
-            case 24: {
-              bitField0_ |= 0x00000004;
-              halVersionMinor_ = input.readInt32();
-              break;
-            }
-            case 34: {
-              bitField0_ |= 0x00000008;
-              halInterfaceName_ = input.readBytes();
-              break;
-            }
-            case 42: {
-              bitField0_ |= 0x00000010;
-              halReleaseLevel_ = input.readBytes();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_HalInterfaceMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_HalInterfaceMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.class, com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int HAL_PACKAGE_NAME_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString halPackageName_;
-    /**
-     * <pre>
-     * HAL package name. e.g. android.hardware.foo.
-     * </pre>
-     *
-     * <code>optional bytes hal_package_name = 1;</code>
-     */
-    public boolean hasHalPackageName() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * HAL package name. e.g. android.hardware.foo.
-     * </pre>
-     *
-     * <code>optional bytes hal_package_name = 1;</code>
-     */
-    public com.google.protobuf.ByteString getHalPackageName() {
-      return halPackageName_;
-    }
-
-    public static final int HAL_VERSION_MAJOR_FIELD_NUMBER = 2;
-    private int halVersionMajor_;
-    /**
-     * <pre>
-     * HAL (major) version. e.g. 1.
-     * </pre>
-     *
-     * <code>optional int32 hal_version_major = 2;</code>
-     */
-    public boolean hasHalVersionMajor() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <pre>
-     * HAL (major) version. e.g. 1.
-     * </pre>
-     *
-     * <code>optional int32 hal_version_major = 2;</code>
-     */
-    public int getHalVersionMajor() {
-      return halVersionMajor_;
-    }
-
-    public static final int HAL_VERSION_MINOR_FIELD_NUMBER = 3;
-    private int halVersionMinor_;
-    /**
-     * <pre>
-     * HAL (minor) version. e.g. 0.
-     * </pre>
-     *
-     * <code>optional int32 hal_version_minor = 3;</code>
-     */
-    public boolean hasHalVersionMinor() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <pre>
-     * HAL (minor) version. e.g. 0.
-     * </pre>
-     *
-     * <code>optional int32 hal_version_minor = 3;</code>
-     */
-    public int getHalVersionMinor() {
-      return halVersionMinor_;
-    }
-
-    public static final int HAL_INTERFACE_NAME_FIELD_NUMBER = 4;
-    private com.google.protobuf.ByteString halInterfaceName_;
-    /**
-     * <pre>
-     * HAL interface name. e.g. IFoo.
-     * </pre>
-     *
-     * <code>optional bytes hal_interface_name = 4;</code>
-     */
-    public boolean hasHalInterfaceName() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <pre>
-     * HAL interface name. e.g. IFoo.
-     * </pre>
-     *
-     * <code>optional bytes hal_interface_name = 4;</code>
-     */
-    public com.google.protobuf.ByteString getHalInterfaceName() {
-      return halInterfaceName_;
-    }
-
-    public static final int HAL_RELEASE_LEVEL_FIELD_NUMBER = 5;
-    private com.google.protobuf.ByteString halReleaseLevel_;
-    /**
-     * <pre>
-     * HAL release level (e.g. "current", "27", "28")
-     * </pre>
-     *
-     * <code>optional bytes hal_release_level = 5;</code>
-     */
-    public boolean hasHalReleaseLevel() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <pre>
-     * HAL release level (e.g. "current", "27", "28")
-     * </pre>
-     *
-     * <code>optional bytes hal_release_level = 5;</code>
-     */
-    public com.google.protobuf.ByteString getHalReleaseLevel() {
-      return halReleaseLevel_;
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, halPackageName_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeInt32(2, halVersionMajor_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeInt32(3, halVersionMinor_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeBytes(4, halInterfaceName_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeBytes(5, halReleaseLevel_);
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, halPackageName_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(2, halVersionMajor_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(3, halVersionMinor_);
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(4, halInterfaceName_);
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(5, halReleaseLevel_);
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.HalInterfaceMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.HalInterfaceMessage other = (com.android.vts.proto.VtsReportMessage.HalInterfaceMessage) obj;
-
-      boolean result = true;
-      result = result && (hasHalPackageName() == other.hasHalPackageName());
-      if (hasHalPackageName()) {
-        result = result && getHalPackageName()
-            .equals(other.getHalPackageName());
-      }
-      result = result && (hasHalVersionMajor() == other.hasHalVersionMajor());
-      if (hasHalVersionMajor()) {
-        result = result && (getHalVersionMajor()
-            == other.getHalVersionMajor());
-      }
-      result = result && (hasHalVersionMinor() == other.hasHalVersionMinor());
-      if (hasHalVersionMinor()) {
-        result = result && (getHalVersionMinor()
-            == other.getHalVersionMinor());
-      }
-      result = result && (hasHalInterfaceName() == other.hasHalInterfaceName());
-      if (hasHalInterfaceName()) {
-        result = result && getHalInterfaceName()
-            .equals(other.getHalInterfaceName());
-      }
-      result = result && (hasHalReleaseLevel() == other.hasHalReleaseLevel());
-      if (hasHalReleaseLevel()) {
-        result = result && getHalReleaseLevel()
-            .equals(other.getHalReleaseLevel());
-      }
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasHalPackageName()) {
-        hash = (37 * hash) + HAL_PACKAGE_NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getHalPackageName().hashCode();
-      }
-      if (hasHalVersionMajor()) {
-        hash = (37 * hash) + HAL_VERSION_MAJOR_FIELD_NUMBER;
-        hash = (53 * hash) + getHalVersionMajor();
-      }
-      if (hasHalVersionMinor()) {
-        hash = (37 * hash) + HAL_VERSION_MINOR_FIELD_NUMBER;
-        hash = (53 * hash) + getHalVersionMinor();
-      }
-      if (hasHalInterfaceName()) {
-        hash = (37 * hash) + HAL_INTERFACE_NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getHalInterfaceName().hashCode();
-      }
-      if (hasHalReleaseLevel()) {
-        hash = (37 * hash) + HAL_RELEASE_LEVEL_FIELD_NUMBER;
-        hash = (53 * hash) + getHalReleaseLevel().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.HalInterfaceMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * Information for a HAL interface.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.HalInterfaceMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.HalInterfaceMessage)
-        com.android.vts.proto.VtsReportMessage.HalInterfaceMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_HalInterfaceMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_HalInterfaceMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.class, com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        halPackageName_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        halVersionMajor_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        halVersionMinor_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        halInterfaceName_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000008);
-        halReleaseLevel_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000010);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_HalInterfaceMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.HalInterfaceMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.HalInterfaceMessage build() {
-        com.android.vts.proto.VtsReportMessage.HalInterfaceMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.HalInterfaceMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.HalInterfaceMessage result = new com.android.vts.proto.VtsReportMessage.HalInterfaceMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.halPackageName_ = halPackageName_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.halVersionMajor_ = halVersionMajor_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.halVersionMinor_ = halVersionMinor_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        result.halInterfaceName_ = halInterfaceName_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        result.halReleaseLevel_ = halReleaseLevel_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.HalInterfaceMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.HalInterfaceMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.HalInterfaceMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.getDefaultInstance()) return this;
-        if (other.hasHalPackageName()) {
-          setHalPackageName(other.getHalPackageName());
-        }
-        if (other.hasHalVersionMajor()) {
-          setHalVersionMajor(other.getHalVersionMajor());
-        }
-        if (other.hasHalVersionMinor()) {
-          setHalVersionMinor(other.getHalVersionMinor());
-        }
-        if (other.hasHalInterfaceName()) {
-          setHalInterfaceName(other.getHalInterfaceName());
-        }
-        if (other.hasHalReleaseLevel()) {
-          setHalReleaseLevel(other.getHalReleaseLevel());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.HalInterfaceMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.HalInterfaceMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString halPackageName_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * HAL package name. e.g. android.hardware.foo.
-       * </pre>
-       *
-       * <code>optional bytes hal_package_name = 1;</code>
-       */
-      public boolean hasHalPackageName() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * HAL package name. e.g. android.hardware.foo.
-       * </pre>
-       *
-       * <code>optional bytes hal_package_name = 1;</code>
-       */
-      public com.google.protobuf.ByteString getHalPackageName() {
-        return halPackageName_;
-      }
-      /**
-       * <pre>
-       * HAL package name. e.g. android.hardware.foo.
-       * </pre>
-       *
-       * <code>optional bytes hal_package_name = 1;</code>
-       */
-      public Builder setHalPackageName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        halPackageName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * HAL package name. e.g. android.hardware.foo.
-       * </pre>
-       *
-       * <code>optional bytes hal_package_name = 1;</code>
-       */
-      public Builder clearHalPackageName() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        halPackageName_ = getDefaultInstance().getHalPackageName();
-        onChanged();
-        return this;
-      }
-
-      private int halVersionMajor_ ;
-      /**
-       * <pre>
-       * HAL (major) version. e.g. 1.
-       * </pre>
-       *
-       * <code>optional int32 hal_version_major = 2;</code>
-       */
-      public boolean hasHalVersionMajor() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <pre>
-       * HAL (major) version. e.g. 1.
-       * </pre>
-       *
-       * <code>optional int32 hal_version_major = 2;</code>
-       */
-      public int getHalVersionMajor() {
-        return halVersionMajor_;
-      }
-      /**
-       * <pre>
-       * HAL (major) version. e.g. 1.
-       * </pre>
-       *
-       * <code>optional int32 hal_version_major = 2;</code>
-       */
-      public Builder setHalVersionMajor(int value) {
-        bitField0_ |= 0x00000002;
-        halVersionMajor_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * HAL (major) version. e.g. 1.
-       * </pre>
-       *
-       * <code>optional int32 hal_version_major = 2;</code>
-       */
-      public Builder clearHalVersionMajor() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        halVersionMajor_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private int halVersionMinor_ ;
-      /**
-       * <pre>
-       * HAL (minor) version. e.g. 0.
-       * </pre>
-       *
-       * <code>optional int32 hal_version_minor = 3;</code>
-       */
-      public boolean hasHalVersionMinor() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <pre>
-       * HAL (minor) version. e.g. 0.
-       * </pre>
-       *
-       * <code>optional int32 hal_version_minor = 3;</code>
-       */
-      public int getHalVersionMinor() {
-        return halVersionMinor_;
-      }
-      /**
-       * <pre>
-       * HAL (minor) version. e.g. 0.
-       * </pre>
-       *
-       * <code>optional int32 hal_version_minor = 3;</code>
-       */
-      public Builder setHalVersionMinor(int value) {
-        bitField0_ |= 0x00000004;
-        halVersionMinor_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * HAL (minor) version. e.g. 0.
-       * </pre>
-       *
-       * <code>optional int32 hal_version_minor = 3;</code>
-       */
-      public Builder clearHalVersionMinor() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        halVersionMinor_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString halInterfaceName_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * HAL interface name. e.g. IFoo.
-       * </pre>
-       *
-       * <code>optional bytes hal_interface_name = 4;</code>
-       */
-      public boolean hasHalInterfaceName() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
-      }
-      /**
-       * <pre>
-       * HAL interface name. e.g. IFoo.
-       * </pre>
-       *
-       * <code>optional bytes hal_interface_name = 4;</code>
-       */
-      public com.google.protobuf.ByteString getHalInterfaceName() {
-        return halInterfaceName_;
-      }
-      /**
-       * <pre>
-       * HAL interface name. e.g. IFoo.
-       * </pre>
-       *
-       * <code>optional bytes hal_interface_name = 4;</code>
-       */
-      public Builder setHalInterfaceName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000008;
-        halInterfaceName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * HAL interface name. e.g. IFoo.
-       * </pre>
-       *
-       * <code>optional bytes hal_interface_name = 4;</code>
-       */
-      public Builder clearHalInterfaceName() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        halInterfaceName_ = getDefaultInstance().getHalInterfaceName();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString halReleaseLevel_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * HAL release level (e.g. "current", "27", "28")
-       * </pre>
-       *
-       * <code>optional bytes hal_release_level = 5;</code>
-       */
-      public boolean hasHalReleaseLevel() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <pre>
-       * HAL release level (e.g. "current", "27", "28")
-       * </pre>
-       *
-       * <code>optional bytes hal_release_level = 5;</code>
-       */
-      public com.google.protobuf.ByteString getHalReleaseLevel() {
-        return halReleaseLevel_;
-      }
-      /**
-       * <pre>
-       * HAL release level (e.g. "current", "27", "28")
-       * </pre>
-       *
-       * <code>optional bytes hal_release_level = 5;</code>
-       */
-      public Builder setHalReleaseLevel(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000010;
-        halReleaseLevel_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * HAL release level (e.g. "current", "27", "28")
-       * </pre>
-       *
-       * <code>optional bytes hal_release_level = 5;</code>
-       */
-      public Builder clearHalReleaseLevel() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        halReleaseLevel_ = getDefaultInstance().getHalReleaseLevel();
-        onChanged();
-        return this;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.HalInterfaceMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.HalInterfaceMessage)
-    private static final com.android.vts.proto.VtsReportMessage.HalInterfaceMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.HalInterfaceMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.HalInterfaceMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<HalInterfaceMessage>
-        PARSER = new com.google.protobuf.AbstractParser<HalInterfaceMessage>() {
-      public HalInterfaceMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new HalInterfaceMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<HalInterfaceMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<HalInterfaceMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.HalInterfaceMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface ApiCoverageReportMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.ApiCoverageReportMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * Hal interface info.
-     * </pre>
-     *
-     * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-     */
-    boolean hasHalInterface();
-    /**
-     * <pre>
-     * Hal interface info.
-     * </pre>
-     *
-     * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.HalInterfaceMessage getHalInterface();
-    /**
-     * <pre>
-     * Hal interface info.
-     * </pre>
-     *
-     * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.HalInterfaceMessageOrBuilder getHalInterfaceOrBuilder();
-
-    /**
-     * <pre>
-     * APIs provided by the HAL with given package, version and interface name.
-     * </pre>
-     *
-     * <code>repeated bytes hal_api = 11;</code>
-     */
-    java.util.List<com.google.protobuf.ByteString> getHalApiList();
-    /**
-     * <pre>
-     * APIs provided by the HAL with given package, version and interface name.
-     * </pre>
-     *
-     * <code>repeated bytes hal_api = 11;</code>
-     */
-    int getHalApiCount();
-    /**
-     * <pre>
-     * APIs provided by the HAL with given package, version and interface name.
-     * </pre>
-     *
-     * <code>repeated bytes hal_api = 11;</code>
-     */
-    com.google.protobuf.ByteString getHalApi(int index);
-
-    /**
-     * <pre>
-     * APIs covered by the test.
-     * </pre>
-     *
-     * <code>repeated bytes covered_hal_api = 12;</code>
-     */
-    java.util.List<com.google.protobuf.ByteString> getCoveredHalApiList();
-    /**
-     * <pre>
-     * APIs covered by the test.
-     * </pre>
-     *
-     * <code>repeated bytes covered_hal_api = 12;</code>
-     */
-    int getCoveredHalApiCount();
-    /**
-     * <pre>
-     * APIs covered by the test.
-     * </pre>
-     *
-     * <code>repeated bytes covered_hal_api = 12;</code>
-     */
-    com.google.protobuf.ByteString getCoveredHalApi(int index);
-  }
-  /**
-   * <pre>
-   * To specify a API coverage report. Currently only for HAL API coverage.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.ApiCoverageReportMessage}
-   */
-  public  static final class ApiCoverageReportMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.ApiCoverageReportMessage)
-      ApiCoverageReportMessageOrBuilder {
-    // Use ApiCoverageReportMessage.newBuilder() to construct.
-    private ApiCoverageReportMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private ApiCoverageReportMessage() {
-      halApi_ = java.util.Collections.emptyList();
-      coveredHalApi_ = java.util.Collections.emptyList();
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private ApiCoverageReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.Builder subBuilder = null;
-              if (((bitField0_ & 0x00000001) == 0x00000001)) {
-                subBuilder = halInterface_.toBuilder();
-              }
-              halInterface_ = input.readMessage(com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.PARSER, extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(halInterface_);
-                halInterface_ = subBuilder.buildPartial();
-              }
-              bitField0_ |= 0x00000001;
-              break;
-            }
-            case 90: {
-              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-                halApi_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000002;
-              }
-              halApi_.add(input.readBytes());
-              break;
-            }
-            case 98: {
-              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
-                coveredHalApi_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000004;
-              }
-              coveredHalApi_.add(input.readBytes());
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-          halApi_ = java.util.Collections.unmodifiableList(halApi_);
-        }
-        if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
-          coveredHalApi_ = java.util.Collections.unmodifiableList(coveredHalApi_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ApiCoverageReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ApiCoverageReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.class, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int HAL_INTERFACE_FIELD_NUMBER = 1;
-    private com.android.vts.proto.VtsReportMessage.HalInterfaceMessage halInterface_;
-    /**
-     * <pre>
-     * Hal interface info.
-     * </pre>
-     *
-     * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-     */
-    public boolean hasHalInterface() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * Hal interface info.
-     * </pre>
-     *
-     * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.HalInterfaceMessage getHalInterface() {
-      return halInterface_ == null ? com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.getDefaultInstance() : halInterface_;
-    }
-    /**
-     * <pre>
-     * Hal interface info.
-     * </pre>
-     *
-     * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.HalInterfaceMessageOrBuilder getHalInterfaceOrBuilder() {
-      return halInterface_ == null ? com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.getDefaultInstance() : halInterface_;
-    }
-
-    public static final int HAL_API_FIELD_NUMBER = 11;
-    private java.util.List<com.google.protobuf.ByteString> halApi_;
-    /**
-     * <pre>
-     * APIs provided by the HAL with given package, version and interface name.
-     * </pre>
-     *
-     * <code>repeated bytes hal_api = 11;</code>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getHalApiList() {
-      return halApi_;
-    }
-    /**
-     * <pre>
-     * APIs provided by the HAL with given package, version and interface name.
-     * </pre>
-     *
-     * <code>repeated bytes hal_api = 11;</code>
-     */
-    public int getHalApiCount() {
-      return halApi_.size();
-    }
-    /**
-     * <pre>
-     * APIs provided by the HAL with given package, version and interface name.
-     * </pre>
-     *
-     * <code>repeated bytes hal_api = 11;</code>
-     */
-    public com.google.protobuf.ByteString getHalApi(int index) {
-      return halApi_.get(index);
-    }
-
-    public static final int COVERED_HAL_API_FIELD_NUMBER = 12;
-    private java.util.List<com.google.protobuf.ByteString> coveredHalApi_;
-    /**
-     * <pre>
-     * APIs covered by the test.
-     * </pre>
-     *
-     * <code>repeated bytes covered_hal_api = 12;</code>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getCoveredHalApiList() {
-      return coveredHalApi_;
-    }
-    /**
-     * <pre>
-     * APIs covered by the test.
-     * </pre>
-     *
-     * <code>repeated bytes covered_hal_api = 12;</code>
-     */
-    public int getCoveredHalApiCount() {
-      return coveredHalApi_.size();
-    }
-    /**
-     * <pre>
-     * APIs covered by the test.
-     * </pre>
-     *
-     * <code>repeated bytes covered_hal_api = 12;</code>
-     */
-    public com.google.protobuf.ByteString getCoveredHalApi(int index) {
-      return coveredHalApi_.get(index);
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeMessage(1, getHalInterface());
-      }
-      for (int i = 0; i < halApi_.size(); i++) {
-        output.writeBytes(11, halApi_.get(i));
-      }
-      for (int i = 0; i < coveredHalApi_.size(); i++) {
-        output.writeBytes(12, coveredHalApi_.get(i));
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getHalInterface());
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < halApi_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(halApi_.get(i));
-        }
-        size += dataSize;
-        size += 1 * getHalApiList().size();
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < coveredHalApi_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(coveredHalApi_.get(i));
-        }
-        size += dataSize;
-        size += 1 * getCoveredHalApiList().size();
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage other = (com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage) obj;
-
-      boolean result = true;
-      result = result && (hasHalInterface() == other.hasHalInterface());
-      if (hasHalInterface()) {
-        result = result && getHalInterface()
-            .equals(other.getHalInterface());
-      }
-      result = result && getHalApiList()
-          .equals(other.getHalApiList());
-      result = result && getCoveredHalApiList()
-          .equals(other.getCoveredHalApiList());
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasHalInterface()) {
-        hash = (37 * hash) + HAL_INTERFACE_FIELD_NUMBER;
-        hash = (53 * hash) + getHalInterface().hashCode();
-      }
-      if (getHalApiCount() > 0) {
-        hash = (37 * hash) + HAL_API_FIELD_NUMBER;
-        hash = (53 * hash) + getHalApiList().hashCode();
-      }
-      if (getCoveredHalApiCount() > 0) {
-        hash = (37 * hash) + COVERED_HAL_API_FIELD_NUMBER;
-        hash = (53 * hash) + getCoveredHalApiList().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify a API coverage report. Currently only for HAL API coverage.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.ApiCoverageReportMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.ApiCoverageReportMessage)
-        com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ApiCoverageReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ApiCoverageReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.class, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-          getHalInterfaceFieldBuilder();
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        if (halInterfaceBuilder_ == null) {
-          halInterface_ = null;
-        } else {
-          halInterfaceBuilder_.clear();
-        }
-        bitField0_ = (bitField0_ & ~0x00000001);
-        halApi_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000002);
-        coveredHalApi_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000004);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_ApiCoverageReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage result = new com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        if (halInterfaceBuilder_ == null) {
-          result.halInterface_ = halInterface_;
-        } else {
-          result.halInterface_ = halInterfaceBuilder_.build();
-        }
-        if (((bitField0_ & 0x00000002) == 0x00000002)) {
-          halApi_ = java.util.Collections.unmodifiableList(halApi_);
-          bitField0_ = (bitField0_ & ~0x00000002);
-        }
-        result.halApi_ = halApi_;
-        if (((bitField0_ & 0x00000004) == 0x00000004)) {
-          coveredHalApi_ = java.util.Collections.unmodifiableList(coveredHalApi_);
-          bitField0_ = (bitField0_ & ~0x00000004);
-        }
-        result.coveredHalApi_ = coveredHalApi_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.getDefaultInstance()) return this;
-        if (other.hasHalInterface()) {
-          mergeHalInterface(other.getHalInterface());
-        }
-        if (!other.halApi_.isEmpty()) {
-          if (halApi_.isEmpty()) {
-            halApi_ = other.halApi_;
-            bitField0_ = (bitField0_ & ~0x00000002);
-          } else {
-            ensureHalApiIsMutable();
-            halApi_.addAll(other.halApi_);
-          }
-          onChanged();
-        }
-        if (!other.coveredHalApi_.isEmpty()) {
-          if (coveredHalApi_.isEmpty()) {
-            coveredHalApi_ = other.coveredHalApi_;
-            bitField0_ = (bitField0_ & ~0x00000004);
-          } else {
-            ensureCoveredHalApiIsMutable();
-            coveredHalApi_.addAll(other.coveredHalApi_);
-          }
-          onChanged();
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.android.vts.proto.VtsReportMessage.HalInterfaceMessage halInterface_ = null;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.HalInterfaceMessage, com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.Builder, com.android.vts.proto.VtsReportMessage.HalInterfaceMessageOrBuilder> halInterfaceBuilder_;
-      /**
-       * <pre>
-       * Hal interface info.
-       * </pre>
-       *
-       * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-       */
-      public boolean hasHalInterface() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * Hal interface info.
-       * </pre>
-       *
-       * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.HalInterfaceMessage getHalInterface() {
-        if (halInterfaceBuilder_ == null) {
-          return halInterface_ == null ? com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.getDefaultInstance() : halInterface_;
-        } else {
-          return halInterfaceBuilder_.getMessage();
-        }
-      }
-      /**
-       * <pre>
-       * Hal interface info.
-       * </pre>
-       *
-       * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-       */
-      public Builder setHalInterface(com.android.vts.proto.VtsReportMessage.HalInterfaceMessage value) {
-        if (halInterfaceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          halInterface_ = value;
-          onChanged();
-        } else {
-          halInterfaceBuilder_.setMessage(value);
-        }
-        bitField0_ |= 0x00000001;
-        return this;
-      }
-      /**
-       * <pre>
-       * Hal interface info.
-       * </pre>
-       *
-       * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-       */
-      public Builder setHalInterface(
-          com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.Builder builderForValue) {
-        if (halInterfaceBuilder_ == null) {
-          halInterface_ = builderForValue.build();
-          onChanged();
-        } else {
-          halInterfaceBuilder_.setMessage(builderForValue.build());
-        }
-        bitField0_ |= 0x00000001;
-        return this;
-      }
-      /**
-       * <pre>
-       * Hal interface info.
-       * </pre>
-       *
-       * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-       */
-      public Builder mergeHalInterface(com.android.vts.proto.VtsReportMessage.HalInterfaceMessage value) {
-        if (halInterfaceBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) == 0x00000001) &&
-              halInterface_ != null &&
-              halInterface_ != com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.getDefaultInstance()) {
-            halInterface_ =
-              com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.newBuilder(halInterface_).mergeFrom(value).buildPartial();
-          } else {
-            halInterface_ = value;
-          }
-          onChanged();
-        } else {
-          halInterfaceBuilder_.mergeFrom(value);
-        }
-        bitField0_ |= 0x00000001;
-        return this;
-      }
-      /**
-       * <pre>
-       * Hal interface info.
-       * </pre>
-       *
-       * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-       */
-      public Builder clearHalInterface() {
-        if (halInterfaceBuilder_ == null) {
-          halInterface_ = null;
-          onChanged();
-        } else {
-          halInterfaceBuilder_.clear();
-        }
-        bitField0_ = (bitField0_ & ~0x00000001);
-        return this;
-      }
-      /**
-       * <pre>
-       * Hal interface info.
-       * </pre>
-       *
-       * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.Builder getHalInterfaceBuilder() {
-        bitField0_ |= 0x00000001;
-        onChanged();
-        return getHalInterfaceFieldBuilder().getBuilder();
-      }
-      /**
-       * <pre>
-       * Hal interface info.
-       * </pre>
-       *
-       * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.HalInterfaceMessageOrBuilder getHalInterfaceOrBuilder() {
-        if (halInterfaceBuilder_ != null) {
-          return halInterfaceBuilder_.getMessageOrBuilder();
-        } else {
-          return halInterface_ == null ?
-              com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.getDefaultInstance() : halInterface_;
-        }
-      }
-      /**
-       * <pre>
-       * Hal interface info.
-       * </pre>
-       *
-       * <code>optional .android.vts.HalInterfaceMessage hal_interface = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.HalInterfaceMessage, com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.Builder, com.android.vts.proto.VtsReportMessage.HalInterfaceMessageOrBuilder> 
-          getHalInterfaceFieldBuilder() {
-        if (halInterfaceBuilder_ == null) {
-          halInterfaceBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.HalInterfaceMessage, com.android.vts.proto.VtsReportMessage.HalInterfaceMessage.Builder, com.android.vts.proto.VtsReportMessage.HalInterfaceMessageOrBuilder>(
-                  getHalInterface(),
-                  getParentForChildren(),
-                  isClean());
-          halInterface_ = null;
-        }
-        return halInterfaceBuilder_;
-      }
-
-      private java.util.List<com.google.protobuf.ByteString> halApi_ = java.util.Collections.emptyList();
-      private void ensureHalApiIsMutable() {
-        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
-          halApi_ = new java.util.ArrayList<com.google.protobuf.ByteString>(halApi_);
-          bitField0_ |= 0x00000002;
-         }
-      }
-      /**
-       * <pre>
-       * APIs provided by the HAL with given package, version and interface name.
-       * </pre>
-       *
-       * <code>repeated bytes hal_api = 11;</code>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getHalApiList() {
-        return java.util.Collections.unmodifiableList(halApi_);
-      }
-      /**
-       * <pre>
-       * APIs provided by the HAL with given package, version and interface name.
-       * </pre>
-       *
-       * <code>repeated bytes hal_api = 11;</code>
-       */
-      public int getHalApiCount() {
-        return halApi_.size();
-      }
-      /**
-       * <pre>
-       * APIs provided by the HAL with given package, version and interface name.
-       * </pre>
-       *
-       * <code>repeated bytes hal_api = 11;</code>
-       */
-      public com.google.protobuf.ByteString getHalApi(int index) {
-        return halApi_.get(index);
-      }
-      /**
-       * <pre>
-       * APIs provided by the HAL with given package, version and interface name.
-       * </pre>
-       *
-       * <code>repeated bytes hal_api = 11;</code>
-       */
-      public Builder setHalApi(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureHalApiIsMutable();
-        halApi_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * APIs provided by the HAL with given package, version and interface name.
-       * </pre>
-       *
-       * <code>repeated bytes hal_api = 11;</code>
-       */
-      public Builder addHalApi(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureHalApiIsMutable();
-        halApi_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * APIs provided by the HAL with given package, version and interface name.
-       * </pre>
-       *
-       * <code>repeated bytes hal_api = 11;</code>
-       */
-      public Builder addAllHalApi(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureHalApiIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, halApi_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * APIs provided by the HAL with given package, version and interface name.
-       * </pre>
-       *
-       * <code>repeated bytes hal_api = 11;</code>
-       */
-      public Builder clearHalApi() {
-        halApi_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000002);
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<com.google.protobuf.ByteString> coveredHalApi_ = java.util.Collections.emptyList();
-      private void ensureCoveredHalApiIsMutable() {
-        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
-          coveredHalApi_ = new java.util.ArrayList<com.google.protobuf.ByteString>(coveredHalApi_);
-          bitField0_ |= 0x00000004;
-         }
-      }
-      /**
-       * <pre>
-       * APIs covered by the test.
-       * </pre>
-       *
-       * <code>repeated bytes covered_hal_api = 12;</code>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getCoveredHalApiList() {
-        return java.util.Collections.unmodifiableList(coveredHalApi_);
-      }
-      /**
-       * <pre>
-       * APIs covered by the test.
-       * </pre>
-       *
-       * <code>repeated bytes covered_hal_api = 12;</code>
-       */
-      public int getCoveredHalApiCount() {
-        return coveredHalApi_.size();
-      }
-      /**
-       * <pre>
-       * APIs covered by the test.
-       * </pre>
-       *
-       * <code>repeated bytes covered_hal_api = 12;</code>
-       */
-      public com.google.protobuf.ByteString getCoveredHalApi(int index) {
-        return coveredHalApi_.get(index);
-      }
-      /**
-       * <pre>
-       * APIs covered by the test.
-       * </pre>
-       *
-       * <code>repeated bytes covered_hal_api = 12;</code>
-       */
-      public Builder setCoveredHalApi(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureCoveredHalApiIsMutable();
-        coveredHalApi_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * APIs covered by the test.
-       * </pre>
-       *
-       * <code>repeated bytes covered_hal_api = 12;</code>
-       */
-      public Builder addCoveredHalApi(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureCoveredHalApiIsMutable();
-        coveredHalApi_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * APIs covered by the test.
-       * </pre>
-       *
-       * <code>repeated bytes covered_hal_api = 12;</code>
-       */
-      public Builder addAllCoveredHalApi(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureCoveredHalApiIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, coveredHalApi_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * APIs covered by the test.
-       * </pre>
-       *
-       * <code>repeated bytes covered_hal_api = 12;</code>
-       */
-      public Builder clearCoveredHalApi() {
-        coveredHalApi_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000004);
-        onChanged();
-        return this;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.ApiCoverageReportMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.ApiCoverageReportMessage)
-    private static final com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<ApiCoverageReportMessage>
-        PARSER = new com.google.protobuf.AbstractParser<ApiCoverageReportMessage>() {
-      public ApiCoverageReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new ApiCoverageReportMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<ApiCoverageReportMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<ApiCoverageReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface LogMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.LogMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * URL of a produced log file (e.g., stdout, stderr).
-     * </pre>
-     *
-     * <code>optional bytes url = 1;</code>
-     */
-    boolean hasUrl();
-    /**
-     * <pre>
-     * URL of a produced log file (e.g., stdout, stderr).
-     * </pre>
-     *
-     * <code>optional bytes url = 1;</code>
-     */
-    com.google.protobuf.ByteString getUrl();
-
-    /**
-     * <pre>
-     * Name of a log file.
-     * </pre>
-     *
-     * <code>optional bytes name = 2;</code>
-     */
-    boolean hasName();
-    /**
-     * <pre>
-     * Name of a log file.
-     * </pre>
-     *
-     * <code>optional bytes name = 2;</code>
-     */
-    com.google.protobuf.ByteString getName();
-
-    /**
-     * <pre>
-     * Content of log. Caution: do not put too much log in protobuf message,
-     * as BigTable for example recommends &lt; 10 MB for each record cell.
-     * </pre>
-     *
-     * <code>optional bytes content = 3;</code>
-     */
-    boolean hasContent();
-    /**
-     * <pre>
-     * Content of log. Caution: do not put too much log in protobuf message,
-     * as BigTable for example recommends &lt; 10 MB for each record cell.
-     * </pre>
-     *
-     * <code>optional bytes content = 3;</code>
-     */
-    com.google.protobuf.ByteString getContent();
-  }
-  /**
-   * <pre>
-   * To specify log report. This can be used either for per-test-module
-   * log message or per-test-case log message.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.LogMessage}
-   */
-  public  static final class LogMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.LogMessage)
-      LogMessageOrBuilder {
-    // Use LogMessage.newBuilder() to construct.
-    private LogMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private LogMessage() {
-      url_ = com.google.protobuf.ByteString.EMPTY;
-      name_ = com.google.protobuf.ByteString.EMPTY;
-      content_ = com.google.protobuf.ByteString.EMPTY;
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private LogMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              url_ = input.readBytes();
-              break;
-            }
-            case 18: {
-              bitField0_ |= 0x00000002;
-              name_ = input.readBytes();
-              break;
-            }
-            case 26: {
-              bitField0_ |= 0x00000004;
-              content_ = input.readBytes();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_LogMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_LogMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.LogMessage.class, com.android.vts.proto.VtsReportMessage.LogMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int URL_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString url_;
-    /**
-     * <pre>
-     * URL of a produced log file (e.g., stdout, stderr).
-     * </pre>
-     *
-     * <code>optional bytes url = 1;</code>
-     */
-    public boolean hasUrl() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * URL of a produced log file (e.g., stdout, stderr).
-     * </pre>
-     *
-     * <code>optional bytes url = 1;</code>
-     */
-    public com.google.protobuf.ByteString getUrl() {
-      return url_;
-    }
-
-    public static final int NAME_FIELD_NUMBER = 2;
-    private com.google.protobuf.ByteString name_;
-    /**
-     * <pre>
-     * Name of a log file.
-     * </pre>
-     *
-     * <code>optional bytes name = 2;</code>
-     */
-    public boolean hasName() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <pre>
-     * Name of a log file.
-     * </pre>
-     *
-     * <code>optional bytes name = 2;</code>
-     */
-    public com.google.protobuf.ByteString getName() {
-      return name_;
-    }
-
-    public static final int CONTENT_FIELD_NUMBER = 3;
-    private com.google.protobuf.ByteString content_;
-    /**
-     * <pre>
-     * Content of log. Caution: do not put too much log in protobuf message,
-     * as BigTable for example recommends &lt; 10 MB for each record cell.
-     * </pre>
-     *
-     * <code>optional bytes content = 3;</code>
-     */
-    public boolean hasContent() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <pre>
-     * Content of log. Caution: do not put too much log in protobuf message,
-     * as BigTable for example recommends &lt; 10 MB for each record cell.
-     * </pre>
-     *
-     * <code>optional bytes content = 3;</code>
-     */
-    public com.google.protobuf.ByteString getContent() {
-      return content_;
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, url_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(2, name_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(3, content_);
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, url_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, name_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(3, content_);
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.LogMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.LogMessage other = (com.android.vts.proto.VtsReportMessage.LogMessage) obj;
-
-      boolean result = true;
-      result = result && (hasUrl() == other.hasUrl());
-      if (hasUrl()) {
-        result = result && getUrl()
-            .equals(other.getUrl());
-      }
-      result = result && (hasName() == other.hasName());
-      if (hasName()) {
-        result = result && getName()
-            .equals(other.getName());
-      }
-      result = result && (hasContent() == other.hasContent());
-      if (hasContent()) {
-        result = result && getContent()
-            .equals(other.getContent());
-      }
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasUrl()) {
-        hash = (37 * hash) + URL_FIELD_NUMBER;
-        hash = (53 * hash) + getUrl().hashCode();
-      }
-      if (hasName()) {
-        hash = (37 * hash) + NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getName().hashCode();
-      }
-      if (hasContent()) {
-        hash = (37 * hash) + CONTENT_FIELD_NUMBER;
-        hash = (53 * hash) + getContent().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.LogMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.LogMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify log report. This can be used either for per-test-module
-     * log message or per-test-case log message.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.LogMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.LogMessage)
-        com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_LogMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_LogMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.LogMessage.class, com.android.vts.proto.VtsReportMessage.LogMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.LogMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        url_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        name_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        content_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_LogMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.LogMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.LogMessage build() {
-        com.android.vts.proto.VtsReportMessage.LogMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.LogMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.LogMessage result = new com.android.vts.proto.VtsReportMessage.LogMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.url_ = url_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.name_ = name_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.content_ = content_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.LogMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.LogMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.LogMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance()) return this;
-        if (other.hasUrl()) {
-          setUrl(other.getUrl());
-        }
-        if (other.hasName()) {
-          setName(other.getName());
-        }
-        if (other.hasContent()) {
-          setContent(other.getContent());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.LogMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.LogMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString url_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * URL of a produced log file (e.g., stdout, stderr).
-       * </pre>
-       *
-       * <code>optional bytes url = 1;</code>
-       */
-      public boolean hasUrl() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * URL of a produced log file (e.g., stdout, stderr).
-       * </pre>
-       *
-       * <code>optional bytes url = 1;</code>
-       */
-      public com.google.protobuf.ByteString getUrl() {
-        return url_;
-      }
-      /**
-       * <pre>
-       * URL of a produced log file (e.g., stdout, stderr).
-       * </pre>
-       *
-       * <code>optional bytes url = 1;</code>
-       */
-      public Builder setUrl(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        url_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * URL of a produced log file (e.g., stdout, stderr).
-       * </pre>
-       *
-       * <code>optional bytes url = 1;</code>
-       */
-      public Builder clearUrl() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        url_ = getDefaultInstance().getUrl();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * Name of a log file.
-       * </pre>
-       *
-       * <code>optional bytes name = 2;</code>
-       */
-      public boolean hasName() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <pre>
-       * Name of a log file.
-       * </pre>
-       *
-       * <code>optional bytes name = 2;</code>
-       */
-      public com.google.protobuf.ByteString getName() {
-        return name_;
-      }
-      /**
-       * <pre>
-       * Name of a log file.
-       * </pre>
-       *
-       * <code>optional bytes name = 2;</code>
-       */
-      public Builder setName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Name of a log file.
-       * </pre>
-       *
-       * <code>optional bytes name = 2;</code>
-       */
-      public Builder clearName() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString content_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * Content of log. Caution: do not put too much log in protobuf message,
-       * as BigTable for example recommends &lt; 10 MB for each record cell.
-       * </pre>
-       *
-       * <code>optional bytes content = 3;</code>
-       */
-      public boolean hasContent() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <pre>
-       * Content of log. Caution: do not put too much log in protobuf message,
-       * as BigTable for example recommends &lt; 10 MB for each record cell.
-       * </pre>
-       *
-       * <code>optional bytes content = 3;</code>
-       */
-      public com.google.protobuf.ByteString getContent() {
-        return content_;
-      }
-      /**
-       * <pre>
-       * Content of log. Caution: do not put too much log in protobuf message,
-       * as BigTable for example recommends &lt; 10 MB for each record cell.
-       * </pre>
-       *
-       * <code>optional bytes content = 3;</code>
-       */
-      public Builder setContent(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        content_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Content of log. Caution: do not put too much log in protobuf message,
-       * as BigTable for example recommends &lt; 10 MB for each record cell.
-       * </pre>
-       *
-       * <code>optional bytes content = 3;</code>
-       */
-      public Builder clearContent() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        content_ = getDefaultInstance().getContent();
-        onChanged();
-        return this;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.LogMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.LogMessage)
-    private static final com.android.vts.proto.VtsReportMessage.LogMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.LogMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.LogMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<LogMessage>
-        PARSER = new com.google.protobuf.AbstractParser<LogMessage>() {
-      public LogMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new LogMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<LogMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<LogMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.LogMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface UrlResourceMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.UrlResourceMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * URL of a resource file.
-     * </pre>
-     *
-     * <code>optional bytes url = 1;</code>
-     */
-    boolean hasUrl();
-    /**
-     * <pre>
-     * URL of a resource file.
-     * </pre>
-     *
-     * <code>optional bytes url = 1;</code>
-     */
-    com.google.protobuf.ByteString getUrl();
-
-    /**
-     * <pre>
-     * Name of a resource file representing its type and does not have to be
-     * the same as the exact file name.
-     * </pre>
-     *
-     * <code>optional bytes name = 2;</code>
-     */
-    boolean hasName();
-    /**
-     * <pre>
-     * Name of a resource file representing its type and does not have to be
-     * the same as the exact file name.
-     * </pre>
-     *
-     * <code>optional bytes name = 2;</code>
-     */
-    com.google.protobuf.ByteString getName();
-
-    /**
-     * <pre>
-     * Raw content of a resource file. Used if the file is small.
-     * </pre>
-     *
-     * <code>optional bytes content = 3;</code>
-     */
-    boolean hasContent();
-    /**
-     * <pre>
-     * Raw content of a resource file. Used if the file is small.
-     * </pre>
-     *
-     * <code>optional bytes content = 3;</code>
-     */
-    com.google.protobuf.ByteString getContent();
-  }
-  /**
-   * <pre>
-   * To specify a resource object (reachable via a URL or contained in the
-   * message). This can be used to store a log file or an XML (or HTML) report
-   * file kept in a Google Cloud Storage (GCS) bucket or partner's network file
-   * system, or hosted by a HTTP server.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.UrlResourceMessage}
-   */
-  public  static final class UrlResourceMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.UrlResourceMessage)
-      UrlResourceMessageOrBuilder {
-    // Use UrlResourceMessage.newBuilder() to construct.
-    private UrlResourceMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private UrlResourceMessage() {
-      url_ = com.google.protobuf.ByteString.EMPTY;
-      name_ = com.google.protobuf.ByteString.EMPTY;
-      content_ = com.google.protobuf.ByteString.EMPTY;
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private UrlResourceMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              url_ = input.readBytes();
-              break;
-            }
-            case 18: {
-              bitField0_ |= 0x00000002;
-              name_ = input.readBytes();
-              break;
-            }
-            case 26: {
-              bitField0_ |= 0x00000004;
-              content_ = input.readBytes();
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_UrlResourceMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_UrlResourceMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.UrlResourceMessage.class, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int URL_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString url_;
-    /**
-     * <pre>
-     * URL of a resource file.
-     * </pre>
-     *
-     * <code>optional bytes url = 1;</code>
-     */
-    public boolean hasUrl() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * URL of a resource file.
-     * </pre>
-     *
-     * <code>optional bytes url = 1;</code>
-     */
-    public com.google.protobuf.ByteString getUrl() {
-      return url_;
-    }
-
-    public static final int NAME_FIELD_NUMBER = 2;
-    private com.google.protobuf.ByteString name_;
-    /**
-     * <pre>
-     * Name of a resource file representing its type and does not have to be
-     * the same as the exact file name.
-     * </pre>
-     *
-     * <code>optional bytes name = 2;</code>
-     */
-    public boolean hasName() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <pre>
-     * Name of a resource file representing its type and does not have to be
-     * the same as the exact file name.
-     * </pre>
-     *
-     * <code>optional bytes name = 2;</code>
-     */
-    public com.google.protobuf.ByteString getName() {
-      return name_;
-    }
-
-    public static final int CONTENT_FIELD_NUMBER = 3;
-    private com.google.protobuf.ByteString content_;
-    /**
-     * <pre>
-     * Raw content of a resource file. Used if the file is small.
-     * </pre>
-     *
-     * <code>optional bytes content = 3;</code>
-     */
-    public boolean hasContent() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <pre>
-     * Raw content of a resource file. Used if the file is small.
-     * </pre>
-     *
-     * <code>optional bytes content = 3;</code>
-     */
-    public com.google.protobuf.ByteString getContent() {
-      return content_;
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, url_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(2, name_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(3, content_);
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, url_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, name_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(3, content_);
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.UrlResourceMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.UrlResourceMessage other = (com.android.vts.proto.VtsReportMessage.UrlResourceMessage) obj;
-
-      boolean result = true;
-      result = result && (hasUrl() == other.hasUrl());
-      if (hasUrl()) {
-        result = result && getUrl()
-            .equals(other.getUrl());
-      }
-      result = result && (hasName() == other.hasName());
-      if (hasName()) {
-        result = result && getName()
-            .equals(other.getName());
-      }
-      result = result && (hasContent() == other.hasContent());
-      if (hasContent()) {
-        result = result && getContent()
-            .equals(other.getContent());
-      }
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasUrl()) {
-        hash = (37 * hash) + URL_FIELD_NUMBER;
-        hash = (53 * hash) + getUrl().hashCode();
-      }
-      if (hasName()) {
-        hash = (37 * hash) + NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getName().hashCode();
-      }
-      if (hasContent()) {
-        hash = (37 * hash) + CONTENT_FIELD_NUMBER;
-        hash = (53 * hash) + getContent().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.UrlResourceMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify a resource object (reachable via a URL or contained in the
-     * message). This can be used to store a log file or an XML (or HTML) report
-     * file kept in a Google Cloud Storage (GCS) bucket or partner's network file
-     * system, or hosted by a HTTP server.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.UrlResourceMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.UrlResourceMessage)
-        com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_UrlResourceMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_UrlResourceMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.UrlResourceMessage.class, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.UrlResourceMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        url_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        name_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        content_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_UrlResourceMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.UrlResourceMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage build() {
-        com.android.vts.proto.VtsReportMessage.UrlResourceMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.UrlResourceMessage result = new com.android.vts.proto.VtsReportMessage.UrlResourceMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.url_ = url_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.name_ = name_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.content_ = content_;
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.UrlResourceMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.UrlResourceMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.UrlResourceMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.UrlResourceMessage.getDefaultInstance()) return this;
-        if (other.hasUrl()) {
-          setUrl(other.getUrl());
-        }
-        if (other.hasName()) {
-          setName(other.getName());
-        }
-        if (other.hasContent()) {
-          setContent(other.getContent());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.UrlResourceMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.UrlResourceMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString url_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * URL of a resource file.
-       * </pre>
-       *
-       * <code>optional bytes url = 1;</code>
-       */
-      public boolean hasUrl() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * URL of a resource file.
-       * </pre>
-       *
-       * <code>optional bytes url = 1;</code>
-       */
-      public com.google.protobuf.ByteString getUrl() {
-        return url_;
-      }
-      /**
-       * <pre>
-       * URL of a resource file.
-       * </pre>
-       *
-       * <code>optional bytes url = 1;</code>
-       */
-      public Builder setUrl(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        url_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * URL of a resource file.
-       * </pre>
-       *
-       * <code>optional bytes url = 1;</code>
-       */
-      public Builder clearUrl() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        url_ = getDefaultInstance().getUrl();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * Name of a resource file representing its type and does not have to be
-       * the same as the exact file name.
-       * </pre>
-       *
-       * <code>optional bytes name = 2;</code>
-       */
-      public boolean hasName() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <pre>
-       * Name of a resource file representing its type and does not have to be
-       * the same as the exact file name.
-       * </pre>
-       *
-       * <code>optional bytes name = 2;</code>
-       */
-      public com.google.protobuf.ByteString getName() {
-        return name_;
-      }
-      /**
-       * <pre>
-       * Name of a resource file representing its type and does not have to be
-       * the same as the exact file name.
-       * </pre>
-       *
-       * <code>optional bytes name = 2;</code>
-       */
-      public Builder setName(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Name of a resource file representing its type and does not have to be
-       * the same as the exact file name.
-       * </pre>
-       *
-       * <code>optional bytes name = 2;</code>
-       */
-      public Builder clearName() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString content_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * Raw content of a resource file. Used if the file is small.
-       * </pre>
-       *
-       * <code>optional bytes content = 3;</code>
-       */
-      public boolean hasContent() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <pre>
-       * Raw content of a resource file. Used if the file is small.
-       * </pre>
-       *
-       * <code>optional bytes content = 3;</code>
-       */
-      public com.google.protobuf.ByteString getContent() {
-        return content_;
-      }
-      /**
-       * <pre>
-       * Raw content of a resource file. Used if the file is small.
-       * </pre>
-       *
-       * <code>optional bytes content = 3;</code>
-       */
-      public Builder setContent(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        content_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Raw content of a resource file. Used if the file is small.
-       * </pre>
-       *
-       * <code>optional bytes content = 3;</code>
-       */
-      public Builder clearContent() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        content_ = getDefaultInstance().getContent();
-        onChanged();
-        return this;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.UrlResourceMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.UrlResourceMessage)
-    private static final com.android.vts.proto.VtsReportMessage.UrlResourceMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.UrlResourceMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.UrlResourceMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<UrlResourceMessage>
-        PARSER = new com.google.protobuf.AbstractParser<UrlResourceMessage>() {
-      public UrlResourceMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new UrlResourceMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<UrlResourceMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<UrlResourceMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.UrlResourceMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface TestReportMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.TestReportMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * The test suite name.
-     * </pre>
-     *
-     * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated boolean hasTestSuite();
-    /**
-     * <pre>
-     * The test suite name.
-     * </pre>
-     *
-     * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated com.google.protobuf.ByteString getTestSuite();
-
-    /**
-     * <pre>
-     * The test name.
-     * </pre>
-     *
-     * <code>optional bytes test = 2;</code>
-     */
-    boolean hasTest();
-    /**
-     * <pre>
-     * The test name.
-     * </pre>
-     *
-     * <code>optional bytes test = 2;</code>
-     */
-    com.google.protobuf.ByteString getTest();
-
-    /**
-     * <pre>
-     * The test type
-     * </pre>
-     *
-     * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-     */
-    boolean hasTestType();
-    /**
-     * <pre>
-     * The test type
-     * </pre>
-     *
-     * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.VtsTestType getTestType();
-
-    /**
-     * <pre>
-     * Target device info
-     * </pre>
-     *
-     * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage> 
-        getDeviceInfoList();
-    /**
-     * <pre>
-     * Target device info
-     * </pre>
-     *
-     * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage getDeviceInfo(int index);
-    /**
-     * <pre>
-     * Target device info
-     * </pre>
-     *
-     * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-     */
-    int getDeviceInfoCount();
-    /**
-     * <pre>
-     * Target device info
-     * </pre>
-     *
-     * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder> 
-        getDeviceInfoOrBuilderList();
-    /**
-     * <pre>
-     * Target device info
-     * </pre>
-     *
-     * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder getDeviceInfoOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * Build info
-     * </pre>
-     *
-     * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-     */
-    boolean hasBuildInfo();
-    /**
-     * <pre>
-     * Build info
-     * </pre>
-     *
-     * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.AndroidBuildInfo getBuildInfo();
-    /**
-     * <pre>
-     * Build info
-     * </pre>
-     *
-     * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder getBuildInfoOrBuilder();
-
-    /**
-     * <pre>
-     * Email addresses of subscribers to the test results
-     * </pre>
-     *
-     * <code>repeated bytes subscriber_email = 6;</code>
-     */
-    java.util.List<com.google.protobuf.ByteString> getSubscriberEmailList();
-    /**
-     * <pre>
-     * Email addresses of subscribers to the test results
-     * </pre>
-     *
-     * <code>repeated bytes subscriber_email = 6;</code>
-     */
-    int getSubscriberEmailCount();
-    /**
-     * <pre>
-     * Email addresses of subscribers to the test results
-     * </pre>
-     *
-     * <code>repeated bytes subscriber_email = 6;</code>
-     */
-    com.google.protobuf.ByteString getSubscriberEmail(int index);
-
-    /**
-     * <pre>
-     * Info about the host computer
-     * </pre>
-     *
-     * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-     */
-    boolean hasHostInfo();
-    /**
-     * <pre>
-     * Info about the host computer
-     * </pre>
-     *
-     * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.VtsHostInfo getHostInfo();
-    /**
-     * <pre>
-     * Info about the host computer
-     * </pre>
-     *
-     * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder getHostInfoOrBuilder();
-
-    /**
-     * <pre>
-     * Test case reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage> 
-        getTestCaseList();
-    /**
-     * <pre>
-     * Test case reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.TestCaseReportMessage getTestCase(int index);
-    /**
-     * <pre>
-     * Test case reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-     */
-    int getTestCaseCount();
-    /**
-     * <pre>
-     * Test case reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder> 
-        getTestCaseOrBuilderList();
-    /**
-     * <pre>
-     * Test case reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder getTestCaseOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * Profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> 
-        getProfilingList();
-    /**
-     * <pre>
-     * Profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index);
-    /**
-     * <pre>
-     * Profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-     */
-    int getProfilingCount();
-    /**
-     * <pre>
-     * Profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-        getProfilingOrBuilderList();
-    /**
-     * <pre>
-     * Profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder getProfilingOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * Systrace report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> 
-        getSystraceList();
-    /**
-     * <pre>
-     * Systrace report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index);
-    /**
-     * <pre>
-     * Systrace report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated int getSystraceCount();
-    /**
-     * <pre>
-     * Systrace report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated java.util.List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-        getSystraceOrBuilderList();
-    /**
-     * <pre>
-     * Systrace report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder getSystraceOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * Execution start and end time stamp.
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 101;</code>
-     */
-    boolean hasStartTimestamp();
-    /**
-     * <pre>
-     * Execution start and end time stamp.
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 101;</code>
-     */
-    long getStartTimestamp();
-
-    /**
-     * <code>optional int64 end_timestamp = 102;</code>
-     */
-    boolean hasEndTimestamp();
-    /**
-     * <code>optional int64 end_timestamp = 102;</code>
-     */
-    long getEndTimestamp();
-
-    /**
-     * <pre>
-     * Coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> 
-        getCoverageList();
-    /**
-     * <pre>
-     * Coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index);
-    /**
-     * <pre>
-     * Coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-     */
-    int getCoverageCount();
-    /**
-     * <pre>
-     * Coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-        getCoverageOrBuilderList();
-    /**
-     * <pre>
-     * Coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * API coverage report for each HAL interface.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> 
-        getApiCoverageList();
-    /**
-     * <pre>
-     * API coverage report for each HAL interface.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage getApiCoverage(int index);
-    /**
-     * <pre>
-     * API coverage report for each HAL interface.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-     */
-    int getApiCoverageCount();
-    /**
-     * <pre>
-     * API coverage report for each HAL interface.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder> 
-        getApiCoverageOrBuilderList();
-    /**
-     * <pre>
-     * API coverage report for each HAL interface.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder getApiCoverageOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * Log for a test module. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 1001;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> 
-        getLogList();
-    /**
-     * <pre>
-     * Log for a test module. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 1001;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index);
-    /**
-     * <pre>
-     * Log for a test module. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 1001;</code>
-     */
-    int getLogCount();
-    /**
-     * <pre>
-     * Log for a test module. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 1001;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-        getLogOrBuilderList();
-    /**
-     * <pre>
-     * Log for a test module. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 1001;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * URL links for the test run.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> 
-        getLinkResourceList();
-    /**
-     * <pre>
-     * URL links for the test run.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.UrlResourceMessage getLinkResource(int index);
-    /**
-     * <pre>
-     * URL links for the test run.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-     */
-    int getLinkResourceCount();
-    /**
-     * <pre>
-     * URL links for the test run.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder> 
-        getLinkResourceOrBuilderList();
-    /**
-     * <pre>
-     * URL links for the test run.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder getLinkResourceOrBuilder(
-        int index);
-  }
-  /**
-   * <pre>
-   * To specify a test execution report.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.TestReportMessage}
-   */
-  public  static final class TestReportMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.TestReportMessage)
-      TestReportMessageOrBuilder {
-    // Use TestReportMessage.newBuilder() to construct.
-    private TestReportMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private TestReportMessage() {
-      testSuite_ = com.google.protobuf.ByteString.EMPTY;
-      test_ = com.google.protobuf.ByteString.EMPTY;
-      testType_ = 0;
-      deviceInfo_ = java.util.Collections.emptyList();
-      subscriberEmail_ = java.util.Collections.emptyList();
-      testCase_ = java.util.Collections.emptyList();
-      profiling_ = java.util.Collections.emptyList();
-      systrace_ = java.util.Collections.emptyList();
-      startTimestamp_ = 0L;
-      endTimestamp_ = 0L;
-      coverage_ = java.util.Collections.emptyList();
-      apiCoverage_ = java.util.Collections.emptyList();
-      log_ = java.util.Collections.emptyList();
-      linkResource_ = java.util.Collections.emptyList();
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private TestReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              bitField0_ |= 0x00000001;
-              testSuite_ = input.readBytes();
-              break;
-            }
-            case 18: {
-              bitField0_ |= 0x00000002;
-              test_ = input.readBytes();
-              break;
-            }
-            case 24: {
-              int rawValue = input.readEnum();
-              com.android.vts.proto.VtsReportMessage.VtsTestType value = com.android.vts.proto.VtsReportMessage.VtsTestType.valueOf(rawValue);
-              if (value == null) {
-                unknownFields.mergeVarintField(3, rawValue);
-              } else {
-                bitField0_ |= 0x00000004;
-                testType_ = rawValue;
-              }
-              break;
-            }
-            case 34: {
-              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-                deviceInfo_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage>();
-                mutable_bitField0_ |= 0x00000008;
-              }
-              deviceInfo_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 42: {
-              com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder subBuilder = null;
-              if (((bitField0_ & 0x00000008) == 0x00000008)) {
-                subBuilder = buildInfo_.toBuilder();
-              }
-              buildInfo_ = input.readMessage(com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.PARSER, extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(buildInfo_);
-                buildInfo_ = subBuilder.buildPartial();
-              }
-              bitField0_ |= 0x00000008;
-              break;
-            }
-            case 50: {
-              if (!((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-                subscriberEmail_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-                mutable_bitField0_ |= 0x00000020;
-              }
-              subscriberEmail_.add(input.readBytes());
-              break;
-            }
-            case 58: {
-              com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder subBuilder = null;
-              if (((bitField0_ & 0x00000010) == 0x00000010)) {
-                subBuilder = hostInfo_.toBuilder();
-              }
-              hostInfo_ = input.readMessage(com.android.vts.proto.VtsReportMessage.VtsHostInfo.PARSER, extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(hostInfo_);
-                hostInfo_ = subBuilder.buildPartial();
-              }
-              bitField0_ |= 0x00000010;
-              break;
-            }
-            case 90: {
-              if (!((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
-                testCase_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage>();
-                mutable_bitField0_ |= 0x00000080;
-              }
-              testCase_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 170: {
-              if (!((mutable_bitField0_ & 0x00000100) == 0x00000100)) {
-                profiling_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage>();
-                mutable_bitField0_ |= 0x00000100;
-              }
-              profiling_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 178: {
-              if (!((mutable_bitField0_ & 0x00000200) == 0x00000200)) {
-                systrace_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.SystraceReportMessage>();
-                mutable_bitField0_ |= 0x00000200;
-              }
-              systrace_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.SystraceReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 808: {
-              bitField0_ |= 0x00000020;
-              startTimestamp_ = input.readInt64();
-              break;
-            }
-            case 816: {
-              bitField0_ |= 0x00000040;
-              endTimestamp_ = input.readInt64();
-              break;
-            }
-            case 826: {
-              if (!((mutable_bitField0_ & 0x00001000) == 0x00001000)) {
-                coverage_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.CoverageReportMessage>();
-                mutable_bitField0_ |= 0x00001000;
-              }
-              coverage_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.CoverageReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 834: {
-              if (!((mutable_bitField0_ & 0x00002000) == 0x00002000)) {
-                apiCoverage_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage>();
-                mutable_bitField0_ |= 0x00002000;
-              }
-              apiCoverage_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 8010: {
-              if (!((mutable_bitField0_ & 0x00004000) == 0x00004000)) {
-                log_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.LogMessage>();
-                mutable_bitField0_ |= 0x00004000;
-              }
-              log_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.LogMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 8090: {
-              if (!((mutable_bitField0_ & 0x00008000) == 0x00008000)) {
-                linkResource_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.UrlResourceMessage>();
-                mutable_bitField0_ |= 0x00008000;
-              }
-              linkResource_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.UrlResourceMessage.PARSER, extensionRegistry));
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-          deviceInfo_ = java.util.Collections.unmodifiableList(deviceInfo_);
-        }
-        if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
-          subscriberEmail_ = java.util.Collections.unmodifiableList(subscriberEmail_);
-        }
-        if (((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
-          testCase_ = java.util.Collections.unmodifiableList(testCase_);
-        }
-        if (((mutable_bitField0_ & 0x00000100) == 0x00000100)) {
-          profiling_ = java.util.Collections.unmodifiableList(profiling_);
-        }
-        if (((mutable_bitField0_ & 0x00000200) == 0x00000200)) {
-          systrace_ = java.util.Collections.unmodifiableList(systrace_);
-        }
-        if (((mutable_bitField0_ & 0x00001000) == 0x00001000)) {
-          coverage_ = java.util.Collections.unmodifiableList(coverage_);
-        }
-        if (((mutable_bitField0_ & 0x00002000) == 0x00002000)) {
-          apiCoverage_ = java.util.Collections.unmodifiableList(apiCoverage_);
-        }
-        if (((mutable_bitField0_ & 0x00004000) == 0x00004000)) {
-          log_ = java.util.Collections.unmodifiableList(log_);
-        }
-        if (((mutable_bitField0_ & 0x00008000) == 0x00008000)) {
-          linkResource_ = java.util.Collections.unmodifiableList(linkResource_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.TestReportMessage.class, com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int TEST_SUITE_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString testSuite_;
-    /**
-     * <pre>
-     * The test suite name.
-     * </pre>
-     *
-     * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public boolean hasTestSuite() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * The test suite name.
-     * </pre>
-     *
-     * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public com.google.protobuf.ByteString getTestSuite() {
-      return testSuite_;
-    }
-
-    public static final int TEST_FIELD_NUMBER = 2;
-    private com.google.protobuf.ByteString test_;
-    /**
-     * <pre>
-     * The test name.
-     * </pre>
-     *
-     * <code>optional bytes test = 2;</code>
-     */
-    public boolean hasTest() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
-    }
-    /**
-     * <pre>
-     * The test name.
-     * </pre>
-     *
-     * <code>optional bytes test = 2;</code>
-     */
-    public com.google.protobuf.ByteString getTest() {
-      return test_;
-    }
-
-    public static final int TEST_TYPE_FIELD_NUMBER = 3;
-    private int testType_;
-    /**
-     * <pre>
-     * The test type
-     * </pre>
-     *
-     * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-     */
-    public boolean hasTestType() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
-    }
-    /**
-     * <pre>
-     * The test type
-     * </pre>
-     *
-     * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.VtsTestType getTestType() {
-      com.android.vts.proto.VtsReportMessage.VtsTestType result = com.android.vts.proto.VtsReportMessage.VtsTestType.valueOf(testType_);
-      return result == null ? com.android.vts.proto.VtsReportMessage.VtsTestType.UNKNOWN_VTS_TESTTYPE : result;
-    }
-
-    public static final int DEVICE_INFO_FIELD_NUMBER = 4;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage> deviceInfo_;
-    /**
-     * <pre>
-     * Target device info
-     * </pre>
-     *
-     * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage> getDeviceInfoList() {
-      return deviceInfo_;
-    }
-    /**
-     * <pre>
-     * Target device info
-     * </pre>
-     *
-     * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder> 
-        getDeviceInfoOrBuilderList() {
-      return deviceInfo_;
-    }
-    /**
-     * <pre>
-     * Target device info
-     * </pre>
-     *
-     * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-     */
-    public int getDeviceInfoCount() {
-      return deviceInfo_.size();
-    }
-    /**
-     * <pre>
-     * Target device info
-     * </pre>
-     *
-     * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage getDeviceInfo(int index) {
-      return deviceInfo_.get(index);
-    }
-    /**
-     * <pre>
-     * Target device info
-     * </pre>
-     *
-     * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder getDeviceInfoOrBuilder(
-        int index) {
-      return deviceInfo_.get(index);
-    }
-
-    public static final int BUILD_INFO_FIELD_NUMBER = 5;
-    private com.android.vts.proto.VtsReportMessage.AndroidBuildInfo buildInfo_;
-    /**
-     * <pre>
-     * Build info
-     * </pre>
-     *
-     * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-     */
-    public boolean hasBuildInfo() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
-    }
-    /**
-     * <pre>
-     * Build info
-     * </pre>
-     *
-     * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo getBuildInfo() {
-      return buildInfo_ == null ? com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance() : buildInfo_;
-    }
-    /**
-     * <pre>
-     * Build info
-     * </pre>
-     *
-     * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder getBuildInfoOrBuilder() {
-      return buildInfo_ == null ? com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance() : buildInfo_;
-    }
-
-    public static final int SUBSCRIBER_EMAIL_FIELD_NUMBER = 6;
-    private java.util.List<com.google.protobuf.ByteString> subscriberEmail_;
-    /**
-     * <pre>
-     * Email addresses of subscribers to the test results
-     * </pre>
-     *
-     * <code>repeated bytes subscriber_email = 6;</code>
-     */
-    public java.util.List<com.google.protobuf.ByteString>
-        getSubscriberEmailList() {
-      return subscriberEmail_;
-    }
-    /**
-     * <pre>
-     * Email addresses of subscribers to the test results
-     * </pre>
-     *
-     * <code>repeated bytes subscriber_email = 6;</code>
-     */
-    public int getSubscriberEmailCount() {
-      return subscriberEmail_.size();
-    }
-    /**
-     * <pre>
-     * Email addresses of subscribers to the test results
-     * </pre>
-     *
-     * <code>repeated bytes subscriber_email = 6;</code>
-     */
-    public com.google.protobuf.ByteString getSubscriberEmail(int index) {
-      return subscriberEmail_.get(index);
-    }
-
-    public static final int HOST_INFO_FIELD_NUMBER = 7;
-    private com.android.vts.proto.VtsReportMessage.VtsHostInfo hostInfo_;
-    /**
-     * <pre>
-     * Info about the host computer
-     * </pre>
-     *
-     * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-     */
-    public boolean hasHostInfo() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
-    }
-    /**
-     * <pre>
-     * Info about the host computer
-     * </pre>
-     *
-     * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.VtsHostInfo getHostInfo() {
-      return hostInfo_ == null ? com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance() : hostInfo_;
-    }
-    /**
-     * <pre>
-     * Info about the host computer
-     * </pre>
-     *
-     * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder getHostInfoOrBuilder() {
-      return hostInfo_ == null ? com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance() : hostInfo_;
-    }
-
-    public static final int TEST_CASE_FIELD_NUMBER = 11;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage> testCase_;
-    /**
-     * <pre>
-     * Test case reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage> getTestCaseList() {
-      return testCase_;
-    }
-    /**
-     * <pre>
-     * Test case reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder> 
-        getTestCaseOrBuilderList() {
-      return testCase_;
-    }
-    /**
-     * <pre>
-     * Test case reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-     */
-    public int getTestCaseCount() {
-      return testCase_.size();
-    }
-    /**
-     * <pre>
-     * Test case reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage getTestCase(int index) {
-      return testCase_.get(index);
-    }
-    /**
-     * <pre>
-     * Test case reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder getTestCaseOrBuilder(
-        int index) {
-      return testCase_.get(index);
-    }
-
-    public static final int PROFILING_FIELD_NUMBER = 21;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> profiling_;
-    /**
-     * <pre>
-     * Profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> getProfilingList() {
-      return profiling_;
-    }
-    /**
-     * <pre>
-     * Profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-        getProfilingOrBuilderList() {
-      return profiling_;
-    }
-    /**
-     * <pre>
-     * Profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-     */
-    public int getProfilingCount() {
-      return profiling_.size();
-    }
-    /**
-     * <pre>
-     * Profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index) {
-      return profiling_.get(index);
-    }
-    /**
-     * <pre>
-     * Profiling reports
-     * </pre>
-     *
-     * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder getProfilingOrBuilder(
-        int index) {
-      return profiling_.get(index);
-    }
-
-    public static final int SYSTRACE_FIELD_NUMBER = 22;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> systrace_;
-    /**
-     * <pre>
-     * Systrace report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> getSystraceList() {
-      return systrace_;
-    }
-    /**
-     * <pre>
-     * Systrace report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public java.util.List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-        getSystraceOrBuilderList() {
-      return systrace_;
-    }
-    /**
-     * <pre>
-     * Systrace report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public int getSystraceCount() {
-      return systrace_.size();
-    }
-    /**
-     * <pre>
-     * Systrace report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index) {
-      return systrace_.get(index);
-    }
-    /**
-     * <pre>
-     * Systrace report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-     */
-    @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder getSystraceOrBuilder(
-        int index) {
-      return systrace_.get(index);
-    }
-
-    public static final int START_TIMESTAMP_FIELD_NUMBER = 101;
-    private long startTimestamp_;
-    /**
-     * <pre>
-     * Execution start and end time stamp.
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 101;</code>
-     */
-    public boolean hasStartTimestamp() {
-      return ((bitField0_ & 0x00000020) == 0x00000020);
-    }
-    /**
-     * <pre>
-     * Execution start and end time stamp.
-     * </pre>
-     *
-     * <code>optional int64 start_timestamp = 101;</code>
-     */
-    public long getStartTimestamp() {
-      return startTimestamp_;
-    }
-
-    public static final int END_TIMESTAMP_FIELD_NUMBER = 102;
-    private long endTimestamp_;
-    /**
-     * <code>optional int64 end_timestamp = 102;</code>
-     */
-    public boolean hasEndTimestamp() {
-      return ((bitField0_ & 0x00000040) == 0x00000040);
-    }
-    /**
-     * <code>optional int64 end_timestamp = 102;</code>
-     */
-    public long getEndTimestamp() {
-      return endTimestamp_;
-    }
-
-    public static final int COVERAGE_FIELD_NUMBER = 103;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> coverage_;
-    /**
-     * <pre>
-     * Coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> getCoverageList() {
-      return coverage_;
-    }
-    /**
-     * <pre>
-     * Coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-        getCoverageOrBuilderList() {
-      return coverage_;
-    }
-    /**
-     * <pre>
-     * Coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-     */
-    public int getCoverageCount() {
-      return coverage_.size();
-    }
-    /**
-     * <pre>
-     * Coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index) {
-      return coverage_.get(index);
-    }
-    /**
-     * <pre>
-     * Coverage report per file
-     * </pre>
-     *
-     * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
-        int index) {
-      return coverage_.get(index);
-    }
-
-    public static final int API_COVERAGE_FIELD_NUMBER = 104;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> apiCoverage_;
-    /**
-     * <pre>
-     * API coverage report for each HAL interface.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> getApiCoverageList() {
-      return apiCoverage_;
-    }
-    /**
-     * <pre>
-     * API coverage report for each HAL interface.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder> 
-        getApiCoverageOrBuilderList() {
-      return apiCoverage_;
-    }
-    /**
-     * <pre>
-     * API coverage report for each HAL interface.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-     */
-    public int getApiCoverageCount() {
-      return apiCoverage_.size();
-    }
-    /**
-     * <pre>
-     * API coverage report for each HAL interface.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage getApiCoverage(int index) {
-      return apiCoverage_.get(index);
-    }
-    /**
-     * <pre>
-     * API coverage report for each HAL interface.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder getApiCoverageOrBuilder(
-        int index) {
-      return apiCoverage_.get(index);
-    }
-
-    public static final int LOG_FIELD_NUMBER = 1001;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> log_;
-    /**
-     * <pre>
-     * Log for a test module. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 1001;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> getLogList() {
-      return log_;
-    }
-    /**
-     * <pre>
-     * Log for a test module. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 1001;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-        getLogOrBuilderList() {
-      return log_;
-    }
-    /**
-     * <pre>
-     * Log for a test module. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 1001;</code>
-     */
-    public int getLogCount() {
-      return log_.size();
-    }
-    /**
-     * <pre>
-     * Log for a test module. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 1001;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index) {
-      return log_.get(index);
-    }
-    /**
-     * <pre>
-     * Log for a test module. May contain multiple logs such as logcat, host log,
-     * etc.
-     * </pre>
-     *
-     * <code>repeated .android.vts.LogMessage log = 1001;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(
-        int index) {
-      return log_.get(index);
-    }
-
-    public static final int LINK_RESOURCE_FIELD_NUMBER = 1011;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> linkResource_;
-    /**
-     * <pre>
-     * URL links for the test run.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> getLinkResourceList() {
-      return linkResource_;
-    }
-    /**
-     * <pre>
-     * URL links for the test run.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder> 
-        getLinkResourceOrBuilderList() {
-      return linkResource_;
-    }
-    /**
-     * <pre>
-     * URL links for the test run.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-     */
-    public int getLinkResourceCount() {
-      return linkResource_.size();
-    }
-    /**
-     * <pre>
-     * URL links for the test run.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.UrlResourceMessage getLinkResource(int index) {
-      return linkResource_.get(index);
-    }
-    /**
-     * <pre>
-     * URL links for the test run.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder getLinkResourceOrBuilder(
-        int index) {
-      return linkResource_.get(index);
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, testSuite_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(2, test_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeEnum(3, testType_);
-      }
-      for (int i = 0; i < deviceInfo_.size(); i++) {
-        output.writeMessage(4, deviceInfo_.get(i));
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeMessage(5, getBuildInfo());
-      }
-      for (int i = 0; i < subscriberEmail_.size(); i++) {
-        output.writeBytes(6, subscriberEmail_.get(i));
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeMessage(7, getHostInfo());
-      }
-      for (int i = 0; i < testCase_.size(); i++) {
-        output.writeMessage(11, testCase_.get(i));
-      }
-      for (int i = 0; i < profiling_.size(); i++) {
-        output.writeMessage(21, profiling_.get(i));
-      }
-      for (int i = 0; i < systrace_.size(); i++) {
-        output.writeMessage(22, systrace_.get(i));
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        output.writeInt64(101, startTimestamp_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        output.writeInt64(102, endTimestamp_);
-      }
-      for (int i = 0; i < coverage_.size(); i++) {
-        output.writeMessage(103, coverage_.get(i));
-      }
-      for (int i = 0; i < apiCoverage_.size(); i++) {
-        output.writeMessage(104, apiCoverage_.get(i));
-      }
-      for (int i = 0; i < log_.size(); i++) {
-        output.writeMessage(1001, log_.get(i));
-      }
-      for (int i = 0; i < linkResource_.size(); i++) {
-        output.writeMessage(1011, linkResource_.get(i));
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, testSuite_);
-      }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, test_);
-      }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(3, testType_);
-      }
-      for (int i = 0; i < deviceInfo_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(4, deviceInfo_.get(i));
-      }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, getBuildInfo());
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < subscriberEmail_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeBytesSizeNoTag(subscriberEmail_.get(i));
-        }
-        size += dataSize;
-        size += 1 * getSubscriberEmailList().size();
-      }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(7, getHostInfo());
-      }
-      for (int i = 0; i < testCase_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(11, testCase_.get(i));
-      }
-      for (int i = 0; i < profiling_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(21, profiling_.get(i));
-      }
-      for (int i = 0; i < systrace_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(22, systrace_.get(i));
-      }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(101, startTimestamp_);
-      }
-      if (((bitField0_ & 0x00000040) == 0x00000040)) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(102, endTimestamp_);
-      }
-      for (int i = 0; i < coverage_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(103, coverage_.get(i));
-      }
-      for (int i = 0; i < apiCoverage_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(104, apiCoverage_.get(i));
-      }
-      for (int i = 0; i < log_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1001, log_.get(i));
-      }
-      for (int i = 0; i < linkResource_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1011, linkResource_.get(i));
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.TestReportMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.TestReportMessage other = (com.android.vts.proto.VtsReportMessage.TestReportMessage) obj;
-
-      boolean result = true;
-      result = result && (hasTestSuite() == other.hasTestSuite());
-      if (hasTestSuite()) {
-        result = result && getTestSuite()
-            .equals(other.getTestSuite());
-      }
-      result = result && (hasTest() == other.hasTest());
-      if (hasTest()) {
-        result = result && getTest()
-            .equals(other.getTest());
-      }
-      result = result && (hasTestType() == other.hasTestType());
-      if (hasTestType()) {
-        result = result && testType_ == other.testType_;
-      }
-      result = result && getDeviceInfoList()
-          .equals(other.getDeviceInfoList());
-      result = result && (hasBuildInfo() == other.hasBuildInfo());
-      if (hasBuildInfo()) {
-        result = result && getBuildInfo()
-            .equals(other.getBuildInfo());
-      }
-      result = result && getSubscriberEmailList()
-          .equals(other.getSubscriberEmailList());
-      result = result && (hasHostInfo() == other.hasHostInfo());
-      if (hasHostInfo()) {
-        result = result && getHostInfo()
-            .equals(other.getHostInfo());
-      }
-      result = result && getTestCaseList()
-          .equals(other.getTestCaseList());
-      result = result && getProfilingList()
-          .equals(other.getProfilingList());
-      result = result && getSystraceList()
-          .equals(other.getSystraceList());
-      result = result && (hasStartTimestamp() == other.hasStartTimestamp());
-      if (hasStartTimestamp()) {
-        result = result && (getStartTimestamp()
-            == other.getStartTimestamp());
-      }
-      result = result && (hasEndTimestamp() == other.hasEndTimestamp());
-      if (hasEndTimestamp()) {
-        result = result && (getEndTimestamp()
-            == other.getEndTimestamp());
-      }
-      result = result && getCoverageList()
-          .equals(other.getCoverageList());
-      result = result && getApiCoverageList()
-          .equals(other.getApiCoverageList());
-      result = result && getLogList()
-          .equals(other.getLogList());
-      result = result && getLinkResourceList()
-          .equals(other.getLinkResourceList());
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasTestSuite()) {
-        hash = (37 * hash) + TEST_SUITE_FIELD_NUMBER;
-        hash = (53 * hash) + getTestSuite().hashCode();
-      }
-      if (hasTest()) {
-        hash = (37 * hash) + TEST_FIELD_NUMBER;
-        hash = (53 * hash) + getTest().hashCode();
-      }
-      if (hasTestType()) {
-        hash = (37 * hash) + TEST_TYPE_FIELD_NUMBER;
-        hash = (53 * hash) + testType_;
-      }
-      if (getDeviceInfoCount() > 0) {
-        hash = (37 * hash) + DEVICE_INFO_FIELD_NUMBER;
-        hash = (53 * hash) + getDeviceInfoList().hashCode();
-      }
-      if (hasBuildInfo()) {
-        hash = (37 * hash) + BUILD_INFO_FIELD_NUMBER;
-        hash = (53 * hash) + getBuildInfo().hashCode();
-      }
-      if (getSubscriberEmailCount() > 0) {
-        hash = (37 * hash) + SUBSCRIBER_EMAIL_FIELD_NUMBER;
-        hash = (53 * hash) + getSubscriberEmailList().hashCode();
-      }
-      if (hasHostInfo()) {
-        hash = (37 * hash) + HOST_INFO_FIELD_NUMBER;
-        hash = (53 * hash) + getHostInfo().hashCode();
-      }
-      if (getTestCaseCount() > 0) {
-        hash = (37 * hash) + TEST_CASE_FIELD_NUMBER;
-        hash = (53 * hash) + getTestCaseList().hashCode();
-      }
-      if (getProfilingCount() > 0) {
-        hash = (37 * hash) + PROFILING_FIELD_NUMBER;
-        hash = (53 * hash) + getProfilingList().hashCode();
-      }
-      if (getSystraceCount() > 0) {
-        hash = (37 * hash) + SYSTRACE_FIELD_NUMBER;
-        hash = (53 * hash) + getSystraceList().hashCode();
-      }
-      if (hasStartTimestamp()) {
-        hash = (37 * hash) + START_TIMESTAMP_FIELD_NUMBER;
-        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
-            getStartTimestamp());
-      }
-      if (hasEndTimestamp()) {
-        hash = (37 * hash) + END_TIMESTAMP_FIELD_NUMBER;
-        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
-            getEndTimestamp());
-      }
-      if (getCoverageCount() > 0) {
-        hash = (37 * hash) + COVERAGE_FIELD_NUMBER;
-        hash = (53 * hash) + getCoverageList().hashCode();
-      }
-      if (getApiCoverageCount() > 0) {
-        hash = (37 * hash) + API_COVERAGE_FIELD_NUMBER;
-        hash = (53 * hash) + getApiCoverageList().hashCode();
-      }
-      if (getLogCount() > 0) {
-        hash = (37 * hash) + LOG_FIELD_NUMBER;
-        hash = (53 * hash) + getLogList().hashCode();
-      }
-      if (getLinkResourceCount() > 0) {
-        hash = (37 * hash) + LINK_RESOURCE_FIELD_NUMBER;
-        hash = (53 * hash) + getLinkResourceList().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.TestReportMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify a test execution report.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.TestReportMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.TestReportMessage)
-        com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.TestReportMessage.class, com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.TestReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-          getDeviceInfoFieldBuilder();
-          getBuildInfoFieldBuilder();
-          getHostInfoFieldBuilder();
-          getTestCaseFieldBuilder();
-          getProfilingFieldBuilder();
-          getSystraceFieldBuilder();
-          getCoverageFieldBuilder();
-          getApiCoverageFieldBuilder();
-          getLogFieldBuilder();
-          getLinkResourceFieldBuilder();
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        testSuite_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        test_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        testType_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        if (deviceInfoBuilder_ == null) {
-          deviceInfo_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000008);
-        } else {
-          deviceInfoBuilder_.clear();
-        }
-        if (buildInfoBuilder_ == null) {
-          buildInfo_ = null;
-        } else {
-          buildInfoBuilder_.clear();
-        }
-        bitField0_ = (bitField0_ & ~0x00000010);
-        subscriberEmail_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000020);
-        if (hostInfoBuilder_ == null) {
-          hostInfo_ = null;
-        } else {
-          hostInfoBuilder_.clear();
-        }
-        bitField0_ = (bitField0_ & ~0x00000040);
-        if (testCaseBuilder_ == null) {
-          testCase_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000080);
-        } else {
-          testCaseBuilder_.clear();
-        }
-        if (profilingBuilder_ == null) {
-          profiling_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000100);
-        } else {
-          profilingBuilder_.clear();
-        }
-        if (systraceBuilder_ == null) {
-          systrace_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000200);
-        } else {
-          systraceBuilder_.clear();
-        }
-        startTimestamp_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000400);
-        endTimestamp_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000800);
-        if (coverageBuilder_ == null) {
-          coverage_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00001000);
-        } else {
-          coverageBuilder_.clear();
-        }
-        if (apiCoverageBuilder_ == null) {
-          apiCoverage_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00002000);
-        } else {
-          apiCoverageBuilder_.clear();
-        }
-        if (logBuilder_ == null) {
-          log_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00004000);
-        } else {
-          logBuilder_.clear();
-        }
-        if (linkResourceBuilder_ == null) {
-          linkResource_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00008000);
-        } else {
-          linkResourceBuilder_.clear();
-        }
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.TestReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.TestReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.TestReportMessage result = new com.android.vts.proto.VtsReportMessage.TestReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.testSuite_ = testSuite_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
-        }
-        result.test_ = test_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
-        }
-        result.testType_ = testType_;
-        if (deviceInfoBuilder_ == null) {
-          if (((bitField0_ & 0x00000008) == 0x00000008)) {
-            deviceInfo_ = java.util.Collections.unmodifiableList(deviceInfo_);
-            bitField0_ = (bitField0_ & ~0x00000008);
-          }
-          result.deviceInfo_ = deviceInfo_;
-        } else {
-          result.deviceInfo_ = deviceInfoBuilder_.build();
-        }
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000008;
-        }
-        if (buildInfoBuilder_ == null) {
-          result.buildInfo_ = buildInfo_;
-        } else {
-          result.buildInfo_ = buildInfoBuilder_.build();
-        }
-        if (((bitField0_ & 0x00000020) == 0x00000020)) {
-          subscriberEmail_ = java.util.Collections.unmodifiableList(subscriberEmail_);
-          bitField0_ = (bitField0_ & ~0x00000020);
-        }
-        result.subscriberEmail_ = subscriberEmail_;
-        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
-          to_bitField0_ |= 0x00000010;
-        }
-        if (hostInfoBuilder_ == null) {
-          result.hostInfo_ = hostInfo_;
-        } else {
-          result.hostInfo_ = hostInfoBuilder_.build();
-        }
-        if (testCaseBuilder_ == null) {
-          if (((bitField0_ & 0x00000080) == 0x00000080)) {
-            testCase_ = java.util.Collections.unmodifiableList(testCase_);
-            bitField0_ = (bitField0_ & ~0x00000080);
-          }
-          result.testCase_ = testCase_;
-        } else {
-          result.testCase_ = testCaseBuilder_.build();
-        }
-        if (profilingBuilder_ == null) {
-          if (((bitField0_ & 0x00000100) == 0x00000100)) {
-            profiling_ = java.util.Collections.unmodifiableList(profiling_);
-            bitField0_ = (bitField0_ & ~0x00000100);
-          }
-          result.profiling_ = profiling_;
-        } else {
-          result.profiling_ = profilingBuilder_.build();
-        }
-        if (systraceBuilder_ == null) {
-          if (((bitField0_ & 0x00000200) == 0x00000200)) {
-            systrace_ = java.util.Collections.unmodifiableList(systrace_);
-            bitField0_ = (bitField0_ & ~0x00000200);
-          }
-          result.systrace_ = systrace_;
-        } else {
-          result.systrace_ = systraceBuilder_.build();
-        }
-        if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
-          to_bitField0_ |= 0x00000020;
-        }
-        result.startTimestamp_ = startTimestamp_;
-        if (((from_bitField0_ & 0x00000800) == 0x00000800)) {
-          to_bitField0_ |= 0x00000040;
-        }
-        result.endTimestamp_ = endTimestamp_;
-        if (coverageBuilder_ == null) {
-          if (((bitField0_ & 0x00001000) == 0x00001000)) {
-            coverage_ = java.util.Collections.unmodifiableList(coverage_);
-            bitField0_ = (bitField0_ & ~0x00001000);
-          }
-          result.coverage_ = coverage_;
-        } else {
-          result.coverage_ = coverageBuilder_.build();
-        }
-        if (apiCoverageBuilder_ == null) {
-          if (((bitField0_ & 0x00002000) == 0x00002000)) {
-            apiCoverage_ = java.util.Collections.unmodifiableList(apiCoverage_);
-            bitField0_ = (bitField0_ & ~0x00002000);
-          }
-          result.apiCoverage_ = apiCoverage_;
-        } else {
-          result.apiCoverage_ = apiCoverageBuilder_.build();
-        }
-        if (logBuilder_ == null) {
-          if (((bitField0_ & 0x00004000) == 0x00004000)) {
-            log_ = java.util.Collections.unmodifiableList(log_);
-            bitField0_ = (bitField0_ & ~0x00004000);
-          }
-          result.log_ = log_;
-        } else {
-          result.log_ = logBuilder_.build();
-        }
-        if (linkResourceBuilder_ == null) {
-          if (((bitField0_ & 0x00008000) == 0x00008000)) {
-            linkResource_ = java.util.Collections.unmodifiableList(linkResource_);
-            bitField0_ = (bitField0_ & ~0x00008000);
-          }
-          result.linkResource_ = linkResource_;
-        } else {
-          result.linkResource_ = linkResourceBuilder_.build();
-        }
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.TestReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.TestReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.TestReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.TestReportMessage.getDefaultInstance()) return this;
-        if (other.hasTestSuite()) {
-          setTestSuite(other.getTestSuite());
-        }
-        if (other.hasTest()) {
-          setTest(other.getTest());
-        }
-        if (other.hasTestType()) {
-          setTestType(other.getTestType());
-        }
-        if (deviceInfoBuilder_ == null) {
-          if (!other.deviceInfo_.isEmpty()) {
-            if (deviceInfo_.isEmpty()) {
-              deviceInfo_ = other.deviceInfo_;
-              bitField0_ = (bitField0_ & ~0x00000008);
-            } else {
-              ensureDeviceInfoIsMutable();
-              deviceInfo_.addAll(other.deviceInfo_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.deviceInfo_.isEmpty()) {
-            if (deviceInfoBuilder_.isEmpty()) {
-              deviceInfoBuilder_.dispose();
-              deviceInfoBuilder_ = null;
-              deviceInfo_ = other.deviceInfo_;
-              bitField0_ = (bitField0_ & ~0x00000008);
-              deviceInfoBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getDeviceInfoFieldBuilder() : null;
-            } else {
-              deviceInfoBuilder_.addAllMessages(other.deviceInfo_);
-            }
-          }
-        }
-        if (other.hasBuildInfo()) {
-          mergeBuildInfo(other.getBuildInfo());
-        }
-        if (!other.subscriberEmail_.isEmpty()) {
-          if (subscriberEmail_.isEmpty()) {
-            subscriberEmail_ = other.subscriberEmail_;
-            bitField0_ = (bitField0_ & ~0x00000020);
-          } else {
-            ensureSubscriberEmailIsMutable();
-            subscriberEmail_.addAll(other.subscriberEmail_);
-          }
-          onChanged();
-        }
-        if (other.hasHostInfo()) {
-          mergeHostInfo(other.getHostInfo());
-        }
-        if (testCaseBuilder_ == null) {
-          if (!other.testCase_.isEmpty()) {
-            if (testCase_.isEmpty()) {
-              testCase_ = other.testCase_;
-              bitField0_ = (bitField0_ & ~0x00000080);
-            } else {
-              ensureTestCaseIsMutable();
-              testCase_.addAll(other.testCase_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.testCase_.isEmpty()) {
-            if (testCaseBuilder_.isEmpty()) {
-              testCaseBuilder_.dispose();
-              testCaseBuilder_ = null;
-              testCase_ = other.testCase_;
-              bitField0_ = (bitField0_ & ~0x00000080);
-              testCaseBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getTestCaseFieldBuilder() : null;
-            } else {
-              testCaseBuilder_.addAllMessages(other.testCase_);
-            }
-          }
-        }
-        if (profilingBuilder_ == null) {
-          if (!other.profiling_.isEmpty()) {
-            if (profiling_.isEmpty()) {
-              profiling_ = other.profiling_;
-              bitField0_ = (bitField0_ & ~0x00000100);
-            } else {
-              ensureProfilingIsMutable();
-              profiling_.addAll(other.profiling_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.profiling_.isEmpty()) {
-            if (profilingBuilder_.isEmpty()) {
-              profilingBuilder_.dispose();
-              profilingBuilder_ = null;
-              profiling_ = other.profiling_;
-              bitField0_ = (bitField0_ & ~0x00000100);
-              profilingBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getProfilingFieldBuilder() : null;
-            } else {
-              profilingBuilder_.addAllMessages(other.profiling_);
-            }
-          }
-        }
-        if (systraceBuilder_ == null) {
-          if (!other.systrace_.isEmpty()) {
-            if (systrace_.isEmpty()) {
-              systrace_ = other.systrace_;
-              bitField0_ = (bitField0_ & ~0x00000200);
-            } else {
-              ensureSystraceIsMutable();
-              systrace_.addAll(other.systrace_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.systrace_.isEmpty()) {
-            if (systraceBuilder_.isEmpty()) {
-              systraceBuilder_.dispose();
-              systraceBuilder_ = null;
-              systrace_ = other.systrace_;
-              bitField0_ = (bitField0_ & ~0x00000200);
-              systraceBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getSystraceFieldBuilder() : null;
-            } else {
-              systraceBuilder_.addAllMessages(other.systrace_);
-            }
-          }
-        }
-        if (other.hasStartTimestamp()) {
-          setStartTimestamp(other.getStartTimestamp());
-        }
-        if (other.hasEndTimestamp()) {
-          setEndTimestamp(other.getEndTimestamp());
-        }
-        if (coverageBuilder_ == null) {
-          if (!other.coverage_.isEmpty()) {
-            if (coverage_.isEmpty()) {
-              coverage_ = other.coverage_;
-              bitField0_ = (bitField0_ & ~0x00001000);
-            } else {
-              ensureCoverageIsMutable();
-              coverage_.addAll(other.coverage_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.coverage_.isEmpty()) {
-            if (coverageBuilder_.isEmpty()) {
-              coverageBuilder_.dispose();
-              coverageBuilder_ = null;
-              coverage_ = other.coverage_;
-              bitField0_ = (bitField0_ & ~0x00001000);
-              coverageBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getCoverageFieldBuilder() : null;
-            } else {
-              coverageBuilder_.addAllMessages(other.coverage_);
-            }
-          }
-        }
-        if (apiCoverageBuilder_ == null) {
-          if (!other.apiCoverage_.isEmpty()) {
-            if (apiCoverage_.isEmpty()) {
-              apiCoverage_ = other.apiCoverage_;
-              bitField0_ = (bitField0_ & ~0x00002000);
-            } else {
-              ensureApiCoverageIsMutable();
-              apiCoverage_.addAll(other.apiCoverage_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.apiCoverage_.isEmpty()) {
-            if (apiCoverageBuilder_.isEmpty()) {
-              apiCoverageBuilder_.dispose();
-              apiCoverageBuilder_ = null;
-              apiCoverage_ = other.apiCoverage_;
-              bitField0_ = (bitField0_ & ~0x00002000);
-              apiCoverageBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getApiCoverageFieldBuilder() : null;
-            } else {
-              apiCoverageBuilder_.addAllMessages(other.apiCoverage_);
-            }
-          }
-        }
-        if (logBuilder_ == null) {
-          if (!other.log_.isEmpty()) {
-            if (log_.isEmpty()) {
-              log_ = other.log_;
-              bitField0_ = (bitField0_ & ~0x00004000);
-            } else {
-              ensureLogIsMutable();
-              log_.addAll(other.log_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.log_.isEmpty()) {
-            if (logBuilder_.isEmpty()) {
-              logBuilder_.dispose();
-              logBuilder_ = null;
-              log_ = other.log_;
-              bitField0_ = (bitField0_ & ~0x00004000);
-              logBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getLogFieldBuilder() : null;
-            } else {
-              logBuilder_.addAllMessages(other.log_);
-            }
-          }
-        }
-        if (linkResourceBuilder_ == null) {
-          if (!other.linkResource_.isEmpty()) {
-            if (linkResource_.isEmpty()) {
-              linkResource_ = other.linkResource_;
-              bitField0_ = (bitField0_ & ~0x00008000);
-            } else {
-              ensureLinkResourceIsMutable();
-              linkResource_.addAll(other.linkResource_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.linkResource_.isEmpty()) {
-            if (linkResourceBuilder_.isEmpty()) {
-              linkResourceBuilder_.dispose();
-              linkResourceBuilder_ = null;
-              linkResource_ = other.linkResource_;
-              bitField0_ = (bitField0_ & ~0x00008000);
-              linkResourceBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getLinkResourceFieldBuilder() : null;
-            } else {
-              linkResourceBuilder_.addAllMessages(other.linkResource_);
-            }
-          }
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.TestReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.TestReportMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.ByteString testSuite_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * The test suite name.
-       * </pre>
-       *
-       * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public boolean hasTestSuite() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * The test suite name.
-       * </pre>
-       *
-       * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.google.protobuf.ByteString getTestSuite() {
-        return testSuite_;
-      }
-      /**
-       * <pre>
-       * The test suite name.
-       * </pre>
-       *
-       * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder setTestSuite(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        testSuite_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * The test suite name.
-       * </pre>
-       *
-       * <code>optional bytes test_suite = 1 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder clearTestSuite() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        testSuite_ = getDefaultInstance().getTestSuite();
-        onChanged();
-        return this;
-      }
-
-      private com.google.protobuf.ByteString test_ = com.google.protobuf.ByteString.EMPTY;
-      /**
-       * <pre>
-       * The test name.
-       * </pre>
-       *
-       * <code>optional bytes test = 2;</code>
-       */
-      public boolean hasTest() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
-      }
-      /**
-       * <pre>
-       * The test name.
-       * </pre>
-       *
-       * <code>optional bytes test = 2;</code>
-       */
-      public com.google.protobuf.ByteString getTest() {
-        return test_;
-      }
-      /**
-       * <pre>
-       * The test name.
-       * </pre>
-       *
-       * <code>optional bytes test = 2;</code>
-       */
-      public Builder setTest(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000002;
-        test_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * The test name.
-       * </pre>
-       *
-       * <code>optional bytes test = 2;</code>
-       */
-      public Builder clearTest() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        test_ = getDefaultInstance().getTest();
-        onChanged();
-        return this;
-      }
-
-      private int testType_ = 0;
-      /**
-       * <pre>
-       * The test type
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-       */
-      public boolean hasTestType() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <pre>
-       * The test type
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsTestType getTestType() {
-        com.android.vts.proto.VtsReportMessage.VtsTestType result = com.android.vts.proto.VtsReportMessage.VtsTestType.valueOf(testType_);
-        return result == null ? com.android.vts.proto.VtsReportMessage.VtsTestType.UNKNOWN_VTS_TESTTYPE : result;
-      }
-      /**
-       * <pre>
-       * The test type
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-       */
-      public Builder setTestType(com.android.vts.proto.VtsReportMessage.VtsTestType value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        bitField0_ |= 0x00000004;
-        testType_ = value.getNumber();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * The test type
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsTestType test_type = 3;</code>
-       */
-      public Builder clearTestType() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        testType_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage> deviceInfo_ =
-        java.util.Collections.emptyList();
-      private void ensureDeviceInfoIsMutable() {
-        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
-          deviceInfo_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage>(deviceInfo_);
-          bitField0_ |= 0x00000008;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder> deviceInfoBuilder_;
-
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage> getDeviceInfoList() {
-        if (deviceInfoBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(deviceInfo_);
-        } else {
-          return deviceInfoBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public int getDeviceInfoCount() {
-        if (deviceInfoBuilder_ == null) {
-          return deviceInfo_.size();
-        } else {
-          return deviceInfoBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage getDeviceInfo(int index) {
-        if (deviceInfoBuilder_ == null) {
-          return deviceInfo_.get(index);
-        } else {
-          return deviceInfoBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public Builder setDeviceInfo(
-          int index, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage value) {
-        if (deviceInfoBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureDeviceInfoIsMutable();
-          deviceInfo_.set(index, value);
-          onChanged();
-        } else {
-          deviceInfoBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public Builder setDeviceInfo(
-          int index, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder builderForValue) {
-        if (deviceInfoBuilder_ == null) {
-          ensureDeviceInfoIsMutable();
-          deviceInfo_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          deviceInfoBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public Builder addDeviceInfo(com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage value) {
-        if (deviceInfoBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureDeviceInfoIsMutable();
-          deviceInfo_.add(value);
-          onChanged();
-        } else {
-          deviceInfoBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public Builder addDeviceInfo(
-          int index, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage value) {
-        if (deviceInfoBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureDeviceInfoIsMutable();
-          deviceInfo_.add(index, value);
-          onChanged();
-        } else {
-          deviceInfoBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public Builder addDeviceInfo(
-          com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder builderForValue) {
-        if (deviceInfoBuilder_ == null) {
-          ensureDeviceInfoIsMutable();
-          deviceInfo_.add(builderForValue.build());
-          onChanged();
-        } else {
-          deviceInfoBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public Builder addDeviceInfo(
-          int index, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder builderForValue) {
-        if (deviceInfoBuilder_ == null) {
-          ensureDeviceInfoIsMutable();
-          deviceInfo_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          deviceInfoBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public Builder addAllDeviceInfo(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage> values) {
-        if (deviceInfoBuilder_ == null) {
-          ensureDeviceInfoIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, deviceInfo_);
-          onChanged();
-        } else {
-          deviceInfoBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public Builder clearDeviceInfo() {
-        if (deviceInfoBuilder_ == null) {
-          deviceInfo_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000008);
-          onChanged();
-        } else {
-          deviceInfoBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public Builder removeDeviceInfo(int index) {
-        if (deviceInfoBuilder_ == null) {
-          ensureDeviceInfoIsMutable();
-          deviceInfo_.remove(index);
-          onChanged();
-        } else {
-          deviceInfoBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder getDeviceInfoBuilder(
-          int index) {
-        return getDeviceInfoFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder getDeviceInfoOrBuilder(
-          int index) {
-        if (deviceInfoBuilder_ == null) {
-          return deviceInfo_.get(index);  } else {
-          return deviceInfoBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder> 
-           getDeviceInfoOrBuilderList() {
-        if (deviceInfoBuilder_ != null) {
-          return deviceInfoBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(deviceInfo_);
-        }
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder addDeviceInfoBuilder() {
-        return getDeviceInfoFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder addDeviceInfoBuilder(
-          int index) {
-        return getDeviceInfoFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Target device info
-       * </pre>
-       *
-       * <code>repeated .android.vts.AndroidDeviceInfoMessage device_info = 4;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder> 
-           getDeviceInfoBuilderList() {
-        return getDeviceInfoFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder> 
-          getDeviceInfoFieldBuilder() {
-        if (deviceInfoBuilder_ == null) {
-          deviceInfoBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage.Builder, com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessageOrBuilder>(
-                  deviceInfo_,
-                  ((bitField0_ & 0x00000008) == 0x00000008),
-                  getParentForChildren(),
-                  isClean());
-          deviceInfo_ = null;
-        }
-        return deviceInfoBuilder_;
-      }
-
-      private com.android.vts.proto.VtsReportMessage.AndroidBuildInfo buildInfo_ = null;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.AndroidBuildInfo, com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder, com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder> buildInfoBuilder_;
-      /**
-       * <pre>
-       * Build info
-       * </pre>
-       *
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       */
-      public boolean hasBuildInfo() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
-      }
-      /**
-       * <pre>
-       * Build info
-       * </pre>
-       *
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo getBuildInfo() {
-        if (buildInfoBuilder_ == null) {
-          return buildInfo_ == null ? com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance() : buildInfo_;
-        } else {
-          return buildInfoBuilder_.getMessage();
-        }
-      }
-      /**
-       * <pre>
-       * Build info
-       * </pre>
-       *
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       */
-      public Builder setBuildInfo(com.android.vts.proto.VtsReportMessage.AndroidBuildInfo value) {
-        if (buildInfoBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          buildInfo_ = value;
-          onChanged();
-        } else {
-          buildInfoBuilder_.setMessage(value);
-        }
-        bitField0_ |= 0x00000010;
-        return this;
-      }
-      /**
-       * <pre>
-       * Build info
-       * </pre>
-       *
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       */
-      public Builder setBuildInfo(
-          com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder builderForValue) {
-        if (buildInfoBuilder_ == null) {
-          buildInfo_ = builderForValue.build();
-          onChanged();
-        } else {
-          buildInfoBuilder_.setMessage(builderForValue.build());
-        }
-        bitField0_ |= 0x00000010;
-        return this;
-      }
-      /**
-       * <pre>
-       * Build info
-       * </pre>
-       *
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       */
-      public Builder mergeBuildInfo(com.android.vts.proto.VtsReportMessage.AndroidBuildInfo value) {
-        if (buildInfoBuilder_ == null) {
-          if (((bitField0_ & 0x00000010) == 0x00000010) &&
-              buildInfo_ != null &&
-              buildInfo_ != com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance()) {
-            buildInfo_ =
-              com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.newBuilder(buildInfo_).mergeFrom(value).buildPartial();
-          } else {
-            buildInfo_ = value;
-          }
-          onChanged();
-        } else {
-          buildInfoBuilder_.mergeFrom(value);
-        }
-        bitField0_ |= 0x00000010;
-        return this;
-      }
-      /**
-       * <pre>
-       * Build info
-       * </pre>
-       *
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       */
-      public Builder clearBuildInfo() {
-        if (buildInfoBuilder_ == null) {
-          buildInfo_ = null;
-          onChanged();
-        } else {
-          buildInfoBuilder_.clear();
-        }
-        bitField0_ = (bitField0_ & ~0x00000010);
-        return this;
-      }
-      /**
-       * <pre>
-       * Build info
-       * </pre>
-       *
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder getBuildInfoBuilder() {
-        bitField0_ |= 0x00000010;
-        onChanged();
-        return getBuildInfoFieldBuilder().getBuilder();
-      }
-      /**
-       * <pre>
-       * Build info
-       * </pre>
-       *
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder getBuildInfoOrBuilder() {
-        if (buildInfoBuilder_ != null) {
-          return buildInfoBuilder_.getMessageOrBuilder();
-        } else {
-          return buildInfo_ == null ?
-              com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.getDefaultInstance() : buildInfo_;
-        }
-      }
-      /**
-       * <pre>
-       * Build info
-       * </pre>
-       *
-       * <code>optional .android.vts.AndroidBuildInfo build_info = 5;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.AndroidBuildInfo, com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder, com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder> 
-          getBuildInfoFieldBuilder() {
-        if (buildInfoBuilder_ == null) {
-          buildInfoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.AndroidBuildInfo, com.android.vts.proto.VtsReportMessage.AndroidBuildInfo.Builder, com.android.vts.proto.VtsReportMessage.AndroidBuildInfoOrBuilder>(
-                  getBuildInfo(),
-                  getParentForChildren(),
-                  isClean());
-          buildInfo_ = null;
-        }
-        return buildInfoBuilder_;
-      }
-
-      private java.util.List<com.google.protobuf.ByteString> subscriberEmail_ = java.util.Collections.emptyList();
-      private void ensureSubscriberEmailIsMutable() {
-        if (!((bitField0_ & 0x00000020) == 0x00000020)) {
-          subscriberEmail_ = new java.util.ArrayList<com.google.protobuf.ByteString>(subscriberEmail_);
-          bitField0_ |= 0x00000020;
-         }
-      }
-      /**
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       *
-       * <code>repeated bytes subscriber_email = 6;</code>
-       */
-      public java.util.List<com.google.protobuf.ByteString>
-          getSubscriberEmailList() {
-        return java.util.Collections.unmodifiableList(subscriberEmail_);
-      }
-      /**
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       *
-       * <code>repeated bytes subscriber_email = 6;</code>
-       */
-      public int getSubscriberEmailCount() {
-        return subscriberEmail_.size();
-      }
-      /**
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       *
-       * <code>repeated bytes subscriber_email = 6;</code>
-       */
-      public com.google.protobuf.ByteString getSubscriberEmail(int index) {
-        return subscriberEmail_.get(index);
-      }
-      /**
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       *
-       * <code>repeated bytes subscriber_email = 6;</code>
-       */
-      public Builder setSubscriberEmail(
-          int index, com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureSubscriberEmailIsMutable();
-        subscriberEmail_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       *
-       * <code>repeated bytes subscriber_email = 6;</code>
-       */
-      public Builder addSubscriberEmail(com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureSubscriberEmailIsMutable();
-        subscriberEmail_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       *
-       * <code>repeated bytes subscriber_email = 6;</code>
-       */
-      public Builder addAllSubscriberEmail(
-          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-        ensureSubscriberEmailIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, subscriberEmail_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Email addresses of subscribers to the test results
-       * </pre>
-       *
-       * <code>repeated bytes subscriber_email = 6;</code>
-       */
-      public Builder clearSubscriberEmail() {
-        subscriberEmail_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000020);
-        onChanged();
-        return this;
-      }
-
-      private com.android.vts.proto.VtsReportMessage.VtsHostInfo hostInfo_ = null;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.VtsHostInfo, com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder, com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder> hostInfoBuilder_;
-      /**
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       */
-      public boolean hasHostInfo() {
-        return ((bitField0_ & 0x00000040) == 0x00000040);
-      }
-      /**
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfo getHostInfo() {
-        if (hostInfoBuilder_ == null) {
-          return hostInfo_ == null ? com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance() : hostInfo_;
-        } else {
-          return hostInfoBuilder_.getMessage();
-        }
-      }
-      /**
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       */
-      public Builder setHostInfo(com.android.vts.proto.VtsReportMessage.VtsHostInfo value) {
-        if (hostInfoBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          hostInfo_ = value;
-          onChanged();
-        } else {
-          hostInfoBuilder_.setMessage(value);
-        }
-        bitField0_ |= 0x00000040;
-        return this;
-      }
-      /**
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       */
-      public Builder setHostInfo(
-          com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder builderForValue) {
-        if (hostInfoBuilder_ == null) {
-          hostInfo_ = builderForValue.build();
-          onChanged();
-        } else {
-          hostInfoBuilder_.setMessage(builderForValue.build());
-        }
-        bitField0_ |= 0x00000040;
-        return this;
-      }
-      /**
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       */
-      public Builder mergeHostInfo(com.android.vts.proto.VtsReportMessage.VtsHostInfo value) {
-        if (hostInfoBuilder_ == null) {
-          if (((bitField0_ & 0x00000040) == 0x00000040) &&
-              hostInfo_ != null &&
-              hostInfo_ != com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance()) {
-            hostInfo_ =
-              com.android.vts.proto.VtsReportMessage.VtsHostInfo.newBuilder(hostInfo_).mergeFrom(value).buildPartial();
-          } else {
-            hostInfo_ = value;
-          }
-          onChanged();
-        } else {
-          hostInfoBuilder_.mergeFrom(value);
-        }
-        bitField0_ |= 0x00000040;
-        return this;
-      }
-      /**
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       */
-      public Builder clearHostInfo() {
-        if (hostInfoBuilder_ == null) {
-          hostInfo_ = null;
-          onChanged();
-        } else {
-          hostInfoBuilder_.clear();
-        }
-        bitField0_ = (bitField0_ & ~0x00000040);
-        return this;
-      }
-      /**
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder getHostInfoBuilder() {
-        bitField0_ |= 0x00000040;
-        onChanged();
-        return getHostInfoFieldBuilder().getBuilder();
-      }
-      /**
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder getHostInfoOrBuilder() {
-        if (hostInfoBuilder_ != null) {
-          return hostInfoBuilder_.getMessageOrBuilder();
-        } else {
-          return hostInfo_ == null ?
-              com.android.vts.proto.VtsReportMessage.VtsHostInfo.getDefaultInstance() : hostInfo_;
-        }
-      }
-      /**
-       * <pre>
-       * Info about the host computer
-       * </pre>
-       *
-       * <code>optional .android.vts.VtsHostInfo host_info = 7;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.VtsHostInfo, com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder, com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder> 
-          getHostInfoFieldBuilder() {
-        if (hostInfoBuilder_ == null) {
-          hostInfoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.VtsHostInfo, com.android.vts.proto.VtsReportMessage.VtsHostInfo.Builder, com.android.vts.proto.VtsReportMessage.VtsHostInfoOrBuilder>(
-                  getHostInfo(),
-                  getParentForChildren(),
-                  isClean());
-          hostInfo_ = null;
-        }
-        return hostInfoBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage> testCase_ =
-        java.util.Collections.emptyList();
-      private void ensureTestCaseIsMutable() {
-        if (!((bitField0_ & 0x00000080) == 0x00000080)) {
-          testCase_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage>(testCase_);
-          bitField0_ |= 0x00000080;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.TestCaseReportMessage, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder, com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder> testCaseBuilder_;
-
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage> getTestCaseList() {
-        if (testCaseBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(testCase_);
-        } else {
-          return testCaseBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public int getTestCaseCount() {
-        if (testCaseBuilder_ == null) {
-          return testCase_.size();
-        } else {
-          return testCaseBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage getTestCase(int index) {
-        if (testCaseBuilder_ == null) {
-          return testCase_.get(index);
-        } else {
-          return testCaseBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public Builder setTestCase(
-          int index, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage value) {
-        if (testCaseBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureTestCaseIsMutable();
-          testCase_.set(index, value);
-          onChanged();
-        } else {
-          testCaseBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public Builder setTestCase(
-          int index, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder builderForValue) {
-        if (testCaseBuilder_ == null) {
-          ensureTestCaseIsMutable();
-          testCase_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          testCaseBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public Builder addTestCase(com.android.vts.proto.VtsReportMessage.TestCaseReportMessage value) {
-        if (testCaseBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureTestCaseIsMutable();
-          testCase_.add(value);
-          onChanged();
-        } else {
-          testCaseBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public Builder addTestCase(
-          int index, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage value) {
-        if (testCaseBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureTestCaseIsMutable();
-          testCase_.add(index, value);
-          onChanged();
-        } else {
-          testCaseBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public Builder addTestCase(
-          com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder builderForValue) {
-        if (testCaseBuilder_ == null) {
-          ensureTestCaseIsMutable();
-          testCase_.add(builderForValue.build());
-          onChanged();
-        } else {
-          testCaseBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public Builder addTestCase(
-          int index, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder builderForValue) {
-        if (testCaseBuilder_ == null) {
-          ensureTestCaseIsMutable();
-          testCase_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          testCaseBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public Builder addAllTestCase(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.TestCaseReportMessage> values) {
-        if (testCaseBuilder_ == null) {
-          ensureTestCaseIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, testCase_);
-          onChanged();
-        } else {
-          testCaseBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public Builder clearTestCase() {
-        if (testCaseBuilder_ == null) {
-          testCase_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000080);
-          onChanged();
-        } else {
-          testCaseBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public Builder removeTestCase(int index) {
-        if (testCaseBuilder_ == null) {
-          ensureTestCaseIsMutable();
-          testCase_.remove(index);
-          onChanged();
-        } else {
-          testCaseBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder getTestCaseBuilder(
-          int index) {
-        return getTestCaseFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder getTestCaseOrBuilder(
-          int index) {
-        if (testCaseBuilder_ == null) {
-          return testCase_.get(index);  } else {
-          return testCaseBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder> 
-           getTestCaseOrBuilderList() {
-        if (testCaseBuilder_ != null) {
-          return testCaseBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(testCase_);
-        }
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder addTestCaseBuilder() {
-        return getTestCaseFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder addTestCaseBuilder(
-          int index) {
-        return getTestCaseFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Test case reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.TestCaseReportMessage test_case = 11;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder> 
-           getTestCaseBuilderList() {
-        return getTestCaseFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.TestCaseReportMessage, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder, com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder> 
-          getTestCaseFieldBuilder() {
-        if (testCaseBuilder_ == null) {
-          testCaseBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.TestCaseReportMessage, com.android.vts.proto.VtsReportMessage.TestCaseReportMessage.Builder, com.android.vts.proto.VtsReportMessage.TestCaseReportMessageOrBuilder>(
-                  testCase_,
-                  ((bitField0_ & 0x00000080) == 0x00000080),
-                  getParentForChildren(),
-                  isClean());
-          testCase_ = null;
-        }
-        return testCaseBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> profiling_ =
-        java.util.Collections.emptyList();
-      private void ensureProfilingIsMutable() {
-        if (!((bitField0_ & 0x00000100) == 0x00000100)) {
-          profiling_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage>(profiling_);
-          bitField0_ |= 0x00000100;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.ProfilingReportMessage, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> profilingBuilder_;
-
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> getProfilingList() {
-        if (profilingBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(profiling_);
-        } else {
-          return profilingBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public int getProfilingCount() {
-        if (profilingBuilder_ == null) {
-          return profiling_.size();
-        } else {
-          return profilingBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage getProfiling(int index) {
-        if (profilingBuilder_ == null) {
-          return profiling_.get(index);
-        } else {
-          return profilingBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public Builder setProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-        if (profilingBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureProfilingIsMutable();
-          profiling_.set(index, value);
-          onChanged();
-        } else {
-          profilingBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public Builder setProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder builderForValue) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          profilingBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public Builder addProfiling(com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-        if (profilingBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureProfilingIsMutable();
-          profiling_.add(value);
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public Builder addProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage value) {
-        if (profilingBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureProfilingIsMutable();
-          profiling_.add(index, value);
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public Builder addProfiling(
-          com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder builderForValue) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.add(builderForValue.build());
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public Builder addProfiling(
-          int index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder builderForValue) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          profilingBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public Builder addAllProfiling(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessage> values) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, profiling_);
-          onChanged();
-        } else {
-          profilingBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public Builder clearProfiling() {
-        if (profilingBuilder_ == null) {
-          profiling_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000100);
-          onChanged();
-        } else {
-          profilingBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public Builder removeProfiling(int index) {
-        if (profilingBuilder_ == null) {
-          ensureProfilingIsMutable();
-          profiling_.remove(index);
-          onChanged();
-        } else {
-          profilingBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder getProfilingBuilder(
-          int index) {
-        return getProfilingFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder getProfilingOrBuilder(
-          int index) {
-        if (profilingBuilder_ == null) {
-          return profiling_.get(index);  } else {
-          return profilingBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-           getProfilingOrBuilderList() {
-        if (profilingBuilder_ != null) {
-          return profilingBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(profiling_);
-        }
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder addProfilingBuilder() {
-        return getProfilingFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder addProfilingBuilder(
-          int index) {
-        return getProfilingFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Profiling reports
-       * </pre>
-       *
-       * <code>repeated .android.vts.ProfilingReportMessage profiling = 21;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder> 
-           getProfilingBuilderList() {
-        return getProfilingFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.ProfilingReportMessage, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder> 
-          getProfilingFieldBuilder() {
-        if (profilingBuilder_ == null) {
-          profilingBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.ProfilingReportMessage, com.android.vts.proto.VtsReportMessage.ProfilingReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ProfilingReportMessageOrBuilder>(
-                  profiling_,
-                  ((bitField0_ & 0x00000100) == 0x00000100),
-                  getParentForChildren(),
-                  isClean());
-          profiling_ = null;
-        }
-        return profilingBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> systrace_ =
-        java.util.Collections.emptyList();
-      private void ensureSystraceIsMutable() {
-        if (!((bitField0_ & 0x00000200) == 0x00000200)) {
-          systrace_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.SystraceReportMessage>(systrace_);
-          bitField0_ |= 0x00000200;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.SystraceReportMessage, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder, com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> systraceBuilder_;
-
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage> getSystraceList() {
-        if (systraceBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(systrace_);
-        } else {
-          return systraceBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public int getSystraceCount() {
-        if (systraceBuilder_ == null) {
-          return systrace_.size();
-        } else {
-          return systraceBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessage getSystrace(int index) {
-        if (systraceBuilder_ == null) {
-          return systrace_.get(index);
-        } else {
-          return systraceBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder setSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-        if (systraceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSystraceIsMutable();
-          systrace_.set(index, value);
-          onChanged();
-        } else {
-          systraceBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder setSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder builderForValue) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          systraceBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder addSystrace(com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-        if (systraceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSystraceIsMutable();
-          systrace_.add(value);
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder addSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage value) {
-        if (systraceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSystraceIsMutable();
-          systrace_.add(index, value);
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder addSystrace(
-          com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder builderForValue) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.add(builderForValue.build());
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder addSystrace(
-          int index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder builderForValue) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          systraceBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder addAllSystrace(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessage> values) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, systrace_);
-          onChanged();
-        } else {
-          systraceBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder clearSystrace() {
-        if (systraceBuilder_ == null) {
-          systrace_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000200);
-          onChanged();
-        } else {
-          systraceBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public Builder removeSystrace(int index) {
-        if (systraceBuilder_ == null) {
-          ensureSystraceIsMutable();
-          systrace_.remove(index);
-          onChanged();
-        } else {
-          systraceBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder getSystraceBuilder(
-          int index) {
-        return getSystraceFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder getSystraceOrBuilder(
-          int index) {
-        if (systraceBuilder_ == null) {
-          return systrace_.get(index);  } else {
-          return systraceBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public java.util.List<? extends com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-           getSystraceOrBuilderList() {
-        if (systraceBuilder_ != null) {
-          return systraceBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(systrace_);
-        }
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder addSystraceBuilder() {
-        return getSystraceFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.SystraceReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder addSystraceBuilder(
-          int index) {
-        return getSystraceFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Systrace report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.SystraceReportMessage systrace = 22 [deprecated = true];</code>
-       */
-      @java.lang.Deprecated public java.util.List<com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder> 
-           getSystraceBuilderList() {
-        return getSystraceFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.SystraceReportMessage, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder, com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder> 
-          getSystraceFieldBuilder() {
-        if (systraceBuilder_ == null) {
-          systraceBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.SystraceReportMessage, com.android.vts.proto.VtsReportMessage.SystraceReportMessage.Builder, com.android.vts.proto.VtsReportMessage.SystraceReportMessageOrBuilder>(
-                  systrace_,
-                  ((bitField0_ & 0x00000200) == 0x00000200),
-                  getParentForChildren(),
-                  isClean());
-          systrace_ = null;
-        }
-        return systraceBuilder_;
-      }
-
-      private long startTimestamp_ ;
-      /**
-       * <pre>
-       * Execution start and end time stamp.
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 101;</code>
-       */
-      public boolean hasStartTimestamp() {
-        return ((bitField0_ & 0x00000400) == 0x00000400);
-      }
-      /**
-       * <pre>
-       * Execution start and end time stamp.
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 101;</code>
-       */
-      public long getStartTimestamp() {
-        return startTimestamp_;
-      }
-      /**
-       * <pre>
-       * Execution start and end time stamp.
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 101;</code>
-       */
-      public Builder setStartTimestamp(long value) {
-        bitField0_ |= 0x00000400;
-        startTimestamp_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Execution start and end time stamp.
-       * </pre>
-       *
-       * <code>optional int64 start_timestamp = 101;</code>
-       */
-      public Builder clearStartTimestamp() {
-        bitField0_ = (bitField0_ & ~0x00000400);
-        startTimestamp_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      private long endTimestamp_ ;
-      /**
-       * <code>optional int64 end_timestamp = 102;</code>
-       */
-      public boolean hasEndTimestamp() {
-        return ((bitField0_ & 0x00000800) == 0x00000800);
-      }
-      /**
-       * <code>optional int64 end_timestamp = 102;</code>
-       */
-      public long getEndTimestamp() {
-        return endTimestamp_;
-      }
-      /**
-       * <code>optional int64 end_timestamp = 102;</code>
-       */
-      public Builder setEndTimestamp(long value) {
-        bitField0_ |= 0x00000800;
-        endTimestamp_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>optional int64 end_timestamp = 102;</code>
-       */
-      public Builder clearEndTimestamp() {
-        bitField0_ = (bitField0_ & ~0x00000800);
-        endTimestamp_ = 0L;
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> coverage_ =
-        java.util.Collections.emptyList();
-      private void ensureCoverageIsMutable() {
-        if (!((bitField0_ & 0x00001000) == 0x00001000)) {
-          coverage_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.CoverageReportMessage>(coverage_);
-          bitField0_ |= 0x00001000;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.CoverageReportMessage, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> coverageBuilder_;
-
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage> getCoverageList() {
-        if (coverageBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(coverage_);
-        } else {
-          return coverageBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public int getCoverageCount() {
-        if (coverageBuilder_ == null) {
-          return coverage_.size();
-        } else {
-          return coverageBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage getCoverage(int index) {
-        if (coverageBuilder_ == null) {
-          return coverage_.get(index);
-        } else {
-          return coverageBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public Builder setCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-        if (coverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureCoverageIsMutable();
-          coverage_.set(index, value);
-          onChanged();
-        } else {
-          coverageBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public Builder setCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder builderForValue) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          coverageBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public Builder addCoverage(com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-        if (coverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureCoverageIsMutable();
-          coverage_.add(value);
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public Builder addCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage value) {
-        if (coverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureCoverageIsMutable();
-          coverage_.add(index, value);
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public Builder addCoverage(
-          com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder builderForValue) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.add(builderForValue.build());
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public Builder addCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder builderForValue) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          coverageBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public Builder addAllCoverage(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessage> values) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, coverage_);
-          onChanged();
-        } else {
-          coverageBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public Builder clearCoverage() {
-        if (coverageBuilder_ == null) {
-          coverage_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00001000);
-          onChanged();
-        } else {
-          coverageBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public Builder removeCoverage(int index) {
-        if (coverageBuilder_ == null) {
-          ensureCoverageIsMutable();
-          coverage_.remove(index);
-          onChanged();
-        } else {
-          coverageBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder getCoverageBuilder(
-          int index) {
-        return getCoverageFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder getCoverageOrBuilder(
-          int index) {
-        if (coverageBuilder_ == null) {
-          return coverage_.get(index);  } else {
-          return coverageBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-           getCoverageOrBuilderList() {
-        if (coverageBuilder_ != null) {
-          return coverageBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(coverage_);
-        }
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder addCoverageBuilder() {
-        return getCoverageFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder addCoverageBuilder(
-          int index) {
-        return getCoverageFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Coverage report per file
-       * </pre>
-       *
-       * <code>repeated .android.vts.CoverageReportMessage coverage = 103;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder> 
-           getCoverageBuilderList() {
-        return getCoverageFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.CoverageReportMessage, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder> 
-          getCoverageFieldBuilder() {
-        if (coverageBuilder_ == null) {
-          coverageBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.CoverageReportMessage, com.android.vts.proto.VtsReportMessage.CoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.CoverageReportMessageOrBuilder>(
-                  coverage_,
-                  ((bitField0_ & 0x00001000) == 0x00001000),
-                  getParentForChildren(),
-                  isClean());
-          coverage_ = null;
-        }
-        return coverageBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> apiCoverage_ =
-        java.util.Collections.emptyList();
-      private void ensureApiCoverageIsMutable() {
-        if (!((bitField0_ & 0x00002000) == 0x00002000)) {
-          apiCoverage_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage>(apiCoverage_);
-          bitField0_ |= 0x00002000;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder> apiCoverageBuilder_;
-
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> getApiCoverageList() {
-        if (apiCoverageBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(apiCoverage_);
-        } else {
-          return apiCoverageBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public int getApiCoverageCount() {
-        if (apiCoverageBuilder_ == null) {
-          return apiCoverage_.size();
-        } else {
-          return apiCoverageBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage getApiCoverage(int index) {
-        if (apiCoverageBuilder_ == null) {
-          return apiCoverage_.get(index);
-        } else {
-          return apiCoverageBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public Builder setApiCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage value) {
-        if (apiCoverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureApiCoverageIsMutable();
-          apiCoverage_.set(index, value);
-          onChanged();
-        } else {
-          apiCoverageBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public Builder setApiCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder builderForValue) {
-        if (apiCoverageBuilder_ == null) {
-          ensureApiCoverageIsMutable();
-          apiCoverage_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          apiCoverageBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public Builder addApiCoverage(com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage value) {
-        if (apiCoverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureApiCoverageIsMutable();
-          apiCoverage_.add(value);
-          onChanged();
-        } else {
-          apiCoverageBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public Builder addApiCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage value) {
-        if (apiCoverageBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureApiCoverageIsMutable();
-          apiCoverage_.add(index, value);
-          onChanged();
-        } else {
-          apiCoverageBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public Builder addApiCoverage(
-          com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder builderForValue) {
-        if (apiCoverageBuilder_ == null) {
-          ensureApiCoverageIsMutable();
-          apiCoverage_.add(builderForValue.build());
-          onChanged();
-        } else {
-          apiCoverageBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public Builder addApiCoverage(
-          int index, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder builderForValue) {
-        if (apiCoverageBuilder_ == null) {
-          ensureApiCoverageIsMutable();
-          apiCoverage_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          apiCoverageBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public Builder addAllApiCoverage(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> values) {
-        if (apiCoverageBuilder_ == null) {
-          ensureApiCoverageIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, apiCoverage_);
-          onChanged();
-        } else {
-          apiCoverageBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public Builder clearApiCoverage() {
-        if (apiCoverageBuilder_ == null) {
-          apiCoverage_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00002000);
-          onChanged();
-        } else {
-          apiCoverageBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public Builder removeApiCoverage(int index) {
-        if (apiCoverageBuilder_ == null) {
-          ensureApiCoverageIsMutable();
-          apiCoverage_.remove(index);
-          onChanged();
-        } else {
-          apiCoverageBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder getApiCoverageBuilder(
-          int index) {
-        return getApiCoverageFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder getApiCoverageOrBuilder(
-          int index) {
-        if (apiCoverageBuilder_ == null) {
-          return apiCoverage_.get(index);  } else {
-          return apiCoverageBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder> 
-           getApiCoverageOrBuilderList() {
-        if (apiCoverageBuilder_ != null) {
-          return apiCoverageBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(apiCoverage_);
-        }
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder addApiCoverageBuilder() {
-        return getApiCoverageFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder addApiCoverageBuilder(
-          int index) {
-        return getApiCoverageFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * API coverage report for each HAL interface.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage api_coverage = 104;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder> 
-           getApiCoverageBuilderList() {
-        return getApiCoverageFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder> 
-          getApiCoverageFieldBuilder() {
-        if (apiCoverageBuilder_ == null) {
-          apiCoverageBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder>(
-                  apiCoverage_,
-                  ((bitField0_ & 0x00002000) == 0x00002000),
-                  getParentForChildren(),
-                  isClean());
-          apiCoverage_ = null;
-        }
-        return apiCoverageBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> log_ =
-        java.util.Collections.emptyList();
-      private void ensureLogIsMutable() {
-        if (!((bitField0_ & 0x00004000) == 0x00004000)) {
-          log_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.LogMessage>(log_);
-          bitField0_ |= 0x00004000;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.LogMessage, com.android.vts.proto.VtsReportMessage.LogMessage.Builder, com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> logBuilder_;
-
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage> getLogList() {
-        if (logBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(log_);
-        } else {
-          return logBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public int getLogCount() {
-        if (logBuilder_ == null) {
-          return log_.size();
-        } else {
-          return logBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage getLog(int index) {
-        if (logBuilder_ == null) {
-          return log_.get(index);
-        } else {
-          return logBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public Builder setLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage value) {
-        if (logBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLogIsMutable();
-          log_.set(index, value);
-          onChanged();
-        } else {
-          logBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public Builder setLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          logBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public Builder addLog(com.android.vts.proto.VtsReportMessage.LogMessage value) {
-        if (logBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLogIsMutable();
-          log_.add(value);
-          onChanged();
-        } else {
-          logBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public Builder addLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage value) {
-        if (logBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLogIsMutable();
-          log_.add(index, value);
-          onChanged();
-        } else {
-          logBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public Builder addLog(
-          com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.add(builderForValue.build());
-          onChanged();
-        } else {
-          logBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public Builder addLog(
-          int index, com.android.vts.proto.VtsReportMessage.LogMessage.Builder builderForValue) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          logBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public Builder addAllLog(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.LogMessage> values) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, log_);
-          onChanged();
-        } else {
-          logBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public Builder clearLog() {
-        if (logBuilder_ == null) {
-          log_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00004000);
-          onChanged();
-        } else {
-          logBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public Builder removeLog(int index) {
-        if (logBuilder_ == null) {
-          ensureLogIsMutable();
-          log_.remove(index);
-          onChanged();
-        } else {
-          logBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage.Builder getLogBuilder(
-          int index) {
-        return getLogFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder getLogOrBuilder(
-          int index) {
-        if (logBuilder_ == null) {
-          return log_.get(index);  } else {
-          return logBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-           getLogOrBuilderList() {
-        if (logBuilder_ != null) {
-          return logBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(log_);
-        }
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage.Builder addLogBuilder() {
-        return getLogFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.LogMessage.Builder addLogBuilder(
-          int index) {
-        return getLogFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.LogMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Log for a test module. May contain multiple logs such as logcat, host log,
-       * etc.
-       * </pre>
-       *
-       * <code>repeated .android.vts.LogMessage log = 1001;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.LogMessage.Builder> 
-           getLogBuilderList() {
-        return getLogFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.LogMessage, com.android.vts.proto.VtsReportMessage.LogMessage.Builder, com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder> 
-          getLogFieldBuilder() {
-        if (logBuilder_ == null) {
-          logBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.LogMessage, com.android.vts.proto.VtsReportMessage.LogMessage.Builder, com.android.vts.proto.VtsReportMessage.LogMessageOrBuilder>(
-                  log_,
-                  ((bitField0_ & 0x00004000) == 0x00004000),
-                  getParentForChildren(),
-                  isClean());
-          log_ = null;
-        }
-        return logBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> linkResource_ =
-        java.util.Collections.emptyList();
-      private void ensureLinkResourceIsMutable() {
-        if (!((bitField0_ & 0x00008000) == 0x00008000)) {
-          linkResource_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.UrlResourceMessage>(linkResource_);
-          bitField0_ |= 0x00008000;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.UrlResourceMessage, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder, com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder> linkResourceBuilder_;
-
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> getLinkResourceList() {
-        if (linkResourceBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(linkResource_);
-        } else {
-          return linkResourceBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public int getLinkResourceCount() {
-        if (linkResourceBuilder_ == null) {
-          return linkResource_.size();
-        } else {
-          return linkResourceBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage getLinkResource(int index) {
-        if (linkResourceBuilder_ == null) {
-          return linkResource_.get(index);
-        } else {
-          return linkResourceBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public Builder setLinkResource(
-          int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage value) {
-        if (linkResourceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLinkResourceIsMutable();
-          linkResource_.set(index, value);
-          onChanged();
-        } else {
-          linkResourceBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public Builder setLinkResource(
-          int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder builderForValue) {
-        if (linkResourceBuilder_ == null) {
-          ensureLinkResourceIsMutable();
-          linkResource_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          linkResourceBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public Builder addLinkResource(com.android.vts.proto.VtsReportMessage.UrlResourceMessage value) {
-        if (linkResourceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLinkResourceIsMutable();
-          linkResource_.add(value);
-          onChanged();
-        } else {
-          linkResourceBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public Builder addLinkResource(
-          int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage value) {
-        if (linkResourceBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLinkResourceIsMutable();
-          linkResource_.add(index, value);
-          onChanged();
-        } else {
-          linkResourceBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public Builder addLinkResource(
-          com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder builderForValue) {
-        if (linkResourceBuilder_ == null) {
-          ensureLinkResourceIsMutable();
-          linkResource_.add(builderForValue.build());
-          onChanged();
-        } else {
-          linkResourceBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public Builder addLinkResource(
-          int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder builderForValue) {
-        if (linkResourceBuilder_ == null) {
-          ensureLinkResourceIsMutable();
-          linkResource_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          linkResourceBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public Builder addAllLinkResource(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessage> values) {
-        if (linkResourceBuilder_ == null) {
-          ensureLinkResourceIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, linkResource_);
-          onChanged();
-        } else {
-          linkResourceBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public Builder clearLinkResource() {
-        if (linkResourceBuilder_ == null) {
-          linkResource_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00008000);
-          onChanged();
-        } else {
-          linkResourceBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public Builder removeLinkResource(int index) {
-        if (linkResourceBuilder_ == null) {
-          ensureLinkResourceIsMutable();
-          linkResource_.remove(index);
-          onChanged();
-        } else {
-          linkResourceBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder getLinkResourceBuilder(
-          int index) {
-        return getLinkResourceFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder getLinkResourceOrBuilder(
-          int index) {
-        if (linkResourceBuilder_ == null) {
-          return linkResource_.get(index);  } else {
-          return linkResourceBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder> 
-           getLinkResourceOrBuilderList() {
-        if (linkResourceBuilder_ != null) {
-          return linkResourceBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(linkResource_);
-        }
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder addLinkResourceBuilder() {
-        return getLinkResourceFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.UrlResourceMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder addLinkResourceBuilder(
-          int index) {
-        return getLinkResourceFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * URL links for the test run.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage link_resource = 1011;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder> 
-           getLinkResourceBuilderList() {
-        return getLinkResourceFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.UrlResourceMessage, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder, com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder> 
-          getLinkResourceFieldBuilder() {
-        if (linkResourceBuilder_ == null) {
-          linkResourceBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.UrlResourceMessage, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder, com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder>(
-                  linkResource_,
-                  ((bitField0_ & 0x00008000) == 0x00008000),
-                  getParentForChildren(),
-                  isClean());
-          linkResource_ = null;
-        }
-        return linkResourceBuilder_;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.TestReportMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.TestReportMessage)
-    private static final com.android.vts.proto.VtsReportMessage.TestReportMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.TestReportMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.TestReportMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<TestReportMessage>
-        PARSER = new com.google.protobuf.AbstractParser<TestReportMessage>() {
-      public TestReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new TestReportMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<TestReportMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<TestReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.TestReportMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface TestPlanReportMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.TestPlanReportMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * Keys used to find all TestReportMessage messages of test modules in
-     * this plan.
-     * </pre>
-     *
-     * <code>repeated string test_module_name = 11;</code>
-     */
-    java.util.List<java.lang.String>
-        getTestModuleNameList();
-    /**
-     * <pre>
-     * Keys used to find all TestReportMessage messages of test modules in
-     * this plan.
-     * </pre>
-     *
-     * <code>repeated string test_module_name = 11;</code>
-     */
-    int getTestModuleNameCount();
-    /**
-     * <pre>
-     * Keys used to find all TestReportMessage messages of test modules in
-     * this plan.
-     * </pre>
-     *
-     * <code>repeated string test_module_name = 11;</code>
-     */
-    java.lang.String getTestModuleName(int index);
-    /**
-     * <pre>
-     * Keys used to find all TestReportMessage messages of test modules in
-     * this plan.
-     * </pre>
-     *
-     * <code>repeated string test_module_name = 11;</code>
-     */
-    com.google.protobuf.ByteString
-        getTestModuleNameBytes(int index);
-
-    /**
-     * <code>repeated int64 test_module_start_timestamp = 12;</code>
-     */
-    java.util.List<java.lang.Long> getTestModuleStartTimestampList();
-    /**
-     * <code>repeated int64 test_module_start_timestamp = 12;</code>
-     */
-    int getTestModuleStartTimestampCount();
-    /**
-     * <code>repeated int64 test_module_start_timestamp = 12;</code>
-     */
-    long getTestModuleStartTimestamp(int index);
-
-    /**
-     * <pre>
-     * The test plan name.
-     * </pre>
-     *
-     * <code>optional string test_plan_name = 21;</code>
-     */
-    boolean hasTestPlanName();
-    /**
-     * <pre>
-     * The test plan name.
-     * </pre>
-     *
-     * <code>optional string test_plan_name = 21;</code>
-     */
-    java.lang.String getTestPlanName();
-    /**
-     * <pre>
-     * The test plan name.
-     * </pre>
-     *
-     * <code>optional string test_plan_name = 21;</code>
-     */
-    com.google.protobuf.ByteString
-        getTestPlanNameBytes();
-
-    /**
-     * <pre>
-     * Report resource flies.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> 
-        getPartnerReportList();
-    /**
-     * <pre>
-     * Report resource flies.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.UrlResourceMessage getPartnerReport(int index);
-    /**
-     * <pre>
-     * Report resource flies.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-     */
-    int getPartnerReportCount();
-    /**
-     * <pre>
-     * Report resource flies.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder> 
-        getPartnerReportOrBuilderList();
-    /**
-     * <pre>
-     * Report resource flies.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder getPartnerReportOrBuilder(
-        int index);
-
-    /**
-     * <pre>
-     * Available HAL APIs for coverage measurement.
-     * Only used for profiling test plan.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> 
-        getHalApiReportList();
-    /**
-     * <pre>
-     * Available HAL APIs for coverage measurement.
-     * Only used for profiling test plan.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage getHalApiReport(int index);
-    /**
-     * <pre>
-     * Available HAL APIs for coverage measurement.
-     * Only used for profiling test plan.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-     */
-    int getHalApiReportCount();
-    /**
-     * <pre>
-     * Available HAL APIs for coverage measurement.
-     * Only used for profiling test plan.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder> 
-        getHalApiReportOrBuilderList();
-    /**
-     * <pre>
-     * Available HAL APIs for coverage measurement.
-     * Only used for profiling test plan.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder getHalApiReportOrBuilder(
-        int index);
-  }
-  /**
-   * <pre>
-   * To specify a test execution report.
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.TestPlanReportMessage}
-   */
-  public  static final class TestPlanReportMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.TestPlanReportMessage)
-      TestPlanReportMessageOrBuilder {
-    // Use TestPlanReportMessage.newBuilder() to construct.
-    private TestPlanReportMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private TestPlanReportMessage() {
-      testModuleName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-      testModuleStartTimestamp_ = java.util.Collections.emptyList();
-      testPlanName_ = "";
-      partnerReport_ = java.util.Collections.emptyList();
-      halApiReport_ = java.util.Collections.emptyList();
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private TestPlanReportMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 90: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
-                testModuleName_ = new com.google.protobuf.LazyStringArrayList();
-                mutable_bitField0_ |= 0x00000001;
-              }
-              testModuleName_.add(bs);
-              break;
-            }
-            case 96: {
-              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-                testModuleStartTimestamp_ = new java.util.ArrayList<java.lang.Long>();
-                mutable_bitField0_ |= 0x00000002;
-              }
-              testModuleStartTimestamp_.add(input.readInt64());
-              break;
-            }
-            case 98: {
-              int length = input.readRawVarint32();
-              int limit = input.pushLimit(length);
-              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002) && input.getBytesUntilLimit() > 0) {
-                testModuleStartTimestamp_ = new java.util.ArrayList<java.lang.Long>();
-                mutable_bitField0_ |= 0x00000002;
-              }
-              while (input.getBytesUntilLimit() > 0) {
-                testModuleStartTimestamp_.add(input.readInt64());
-              }
-              input.popLimit(limit);
-              break;
-            }
-            case 170: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000001;
-              testPlanName_ = bs;
-              break;
-            }
-            case 250: {
-              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-                partnerReport_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.UrlResourceMessage>();
-                mutable_bitField0_ |= 0x00000008;
-              }
-              partnerReport_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.UrlResourceMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 330: {
-              if (!((mutable_bitField0_ & 0x00000010) == 0x00000010)) {
-                halApiReport_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage>();
-                mutable_bitField0_ |= 0x00000010;
-              }
-              halApiReport_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
-          testModuleName_ = testModuleName_.getUnmodifiableView();
-        }
-        if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-          testModuleStartTimestamp_ = java.util.Collections.unmodifiableList(testModuleStartTimestamp_);
-        }
-        if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
-          partnerReport_ = java.util.Collections.unmodifiableList(partnerReport_);
-        }
-        if (((mutable_bitField0_ & 0x00000010) == 0x00000010)) {
-          halApiReport_ = java.util.Collections.unmodifiableList(halApiReport_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestPlanReportMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestPlanReportMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.class, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int TEST_MODULE_NAME_FIELD_NUMBER = 11;
-    private com.google.protobuf.LazyStringList testModuleName_;
-    /**
-     * <pre>
-     * Keys used to find all TestReportMessage messages of test modules in
-     * this plan.
-     * </pre>
-     *
-     * <code>repeated string test_module_name = 11;</code>
-     */
-    public com.google.protobuf.ProtocolStringList
-        getTestModuleNameList() {
-      return testModuleName_;
-    }
-    /**
-     * <pre>
-     * Keys used to find all TestReportMessage messages of test modules in
-     * this plan.
-     * </pre>
-     *
-     * <code>repeated string test_module_name = 11;</code>
-     */
-    public int getTestModuleNameCount() {
-      return testModuleName_.size();
-    }
-    /**
-     * <pre>
-     * Keys used to find all TestReportMessage messages of test modules in
-     * this plan.
-     * </pre>
-     *
-     * <code>repeated string test_module_name = 11;</code>
-     */
-    public java.lang.String getTestModuleName(int index) {
-      return testModuleName_.get(index);
-    }
-    /**
-     * <pre>
-     * Keys used to find all TestReportMessage messages of test modules in
-     * this plan.
-     * </pre>
-     *
-     * <code>repeated string test_module_name = 11;</code>
-     */
-    public com.google.protobuf.ByteString
-        getTestModuleNameBytes(int index) {
-      return testModuleName_.getByteString(index);
-    }
-
-    public static final int TEST_MODULE_START_TIMESTAMP_FIELD_NUMBER = 12;
-    private java.util.List<java.lang.Long> testModuleStartTimestamp_;
-    /**
-     * <code>repeated int64 test_module_start_timestamp = 12;</code>
-     */
-    public java.util.List<java.lang.Long>
-        getTestModuleStartTimestampList() {
-      return testModuleStartTimestamp_;
-    }
-    /**
-     * <code>repeated int64 test_module_start_timestamp = 12;</code>
-     */
-    public int getTestModuleStartTimestampCount() {
-      return testModuleStartTimestamp_.size();
-    }
-    /**
-     * <code>repeated int64 test_module_start_timestamp = 12;</code>
-     */
-    public long getTestModuleStartTimestamp(int index) {
-      return testModuleStartTimestamp_.get(index);
-    }
-
-    public static final int TEST_PLAN_NAME_FIELD_NUMBER = 21;
-    private volatile java.lang.Object testPlanName_;
-    /**
-     * <pre>
-     * The test plan name.
-     * </pre>
-     *
-     * <code>optional string test_plan_name = 21;</code>
-     */
-    public boolean hasTestPlanName() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * The test plan name.
-     * </pre>
-     *
-     * <code>optional string test_plan_name = 21;</code>
-     */
-    public java.lang.String getTestPlanName() {
-      java.lang.Object ref = testPlanName_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          testPlanName_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <pre>
-     * The test plan name.
-     * </pre>
-     *
-     * <code>optional string test_plan_name = 21;</code>
-     */
-    public com.google.protobuf.ByteString
-        getTestPlanNameBytes() {
-      java.lang.Object ref = testPlanName_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        testPlanName_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int PARTNER_REPORT_FIELD_NUMBER = 31;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> partnerReport_;
-    /**
-     * <pre>
-     * Report resource flies.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> getPartnerReportList() {
-      return partnerReport_;
-    }
-    /**
-     * <pre>
-     * Report resource flies.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder> 
-        getPartnerReportOrBuilderList() {
-      return partnerReport_;
-    }
-    /**
-     * <pre>
-     * Report resource flies.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-     */
-    public int getPartnerReportCount() {
-      return partnerReport_.size();
-    }
-    /**
-     * <pre>
-     * Report resource flies.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.UrlResourceMessage getPartnerReport(int index) {
-      return partnerReport_.get(index);
-    }
-    /**
-     * <pre>
-     * Report resource flies.
-     * </pre>
-     *
-     * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder getPartnerReportOrBuilder(
-        int index) {
-      return partnerReport_.get(index);
-    }
-
-    public static final int HAL_API_REPORT_FIELD_NUMBER = 41;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> halApiReport_;
-    /**
-     * <pre>
-     * Available HAL APIs for coverage measurement.
-     * Only used for profiling test plan.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> getHalApiReportList() {
-      return halApiReport_;
-    }
-    /**
-     * <pre>
-     * Available HAL APIs for coverage measurement.
-     * Only used for profiling test plan.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder> 
-        getHalApiReportOrBuilderList() {
-      return halApiReport_;
-    }
-    /**
-     * <pre>
-     * Available HAL APIs for coverage measurement.
-     * Only used for profiling test plan.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-     */
-    public int getHalApiReportCount() {
-      return halApiReport_.size();
-    }
-    /**
-     * <pre>
-     * Available HAL APIs for coverage measurement.
-     * Only used for profiling test plan.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage getHalApiReport(int index) {
-      return halApiReport_.get(index);
-    }
-    /**
-     * <pre>
-     * Available HAL APIs for coverage measurement.
-     * Only used for profiling test plan.
-     * </pre>
-     *
-     * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder getHalApiReportOrBuilder(
-        int index) {
-      return halApiReport_.get(index);
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      for (int i = 0; i < testModuleName_.size(); i++) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 11, testModuleName_.getRaw(i));
-      }
-      for (int i = 0; i < testModuleStartTimestamp_.size(); i++) {
-        output.writeInt64(12, testModuleStartTimestamp_.get(i));
-      }
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 21, testPlanName_);
-      }
-      for (int i = 0; i < partnerReport_.size(); i++) {
-        output.writeMessage(31, partnerReport_.get(i));
-      }
-      for (int i = 0; i < halApiReport_.size(); i++) {
-        output.writeMessage(41, halApiReport_.get(i));
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      {
-        int dataSize = 0;
-        for (int i = 0; i < testModuleName_.size(); i++) {
-          dataSize += computeStringSizeNoTag(testModuleName_.getRaw(i));
-        }
-        size += dataSize;
-        size += 1 * getTestModuleNameList().size();
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < testModuleStartTimestamp_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeInt64SizeNoTag(testModuleStartTimestamp_.get(i));
-        }
-        size += dataSize;
-        size += 1 * getTestModuleStartTimestampList().size();
-      }
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(21, testPlanName_);
-      }
-      for (int i = 0; i < partnerReport_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(31, partnerReport_.get(i));
-      }
-      for (int i = 0; i < halApiReport_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(41, halApiReport_.get(i));
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.TestPlanReportMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.TestPlanReportMessage other = (com.android.vts.proto.VtsReportMessage.TestPlanReportMessage) obj;
-
-      boolean result = true;
-      result = result && getTestModuleNameList()
-          .equals(other.getTestModuleNameList());
-      result = result && getTestModuleStartTimestampList()
-          .equals(other.getTestModuleStartTimestampList());
-      result = result && (hasTestPlanName() == other.hasTestPlanName());
-      if (hasTestPlanName()) {
-        result = result && getTestPlanName()
-            .equals(other.getTestPlanName());
-      }
-      result = result && getPartnerReportList()
-          .equals(other.getPartnerReportList());
-      result = result && getHalApiReportList()
-          .equals(other.getHalApiReportList());
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (getTestModuleNameCount() > 0) {
-        hash = (37 * hash) + TEST_MODULE_NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getTestModuleNameList().hashCode();
-      }
-      if (getTestModuleStartTimestampCount() > 0) {
-        hash = (37 * hash) + TEST_MODULE_START_TIMESTAMP_FIELD_NUMBER;
-        hash = (53 * hash) + getTestModuleStartTimestampList().hashCode();
-      }
-      if (hasTestPlanName()) {
-        hash = (37 * hash) + TEST_PLAN_NAME_FIELD_NUMBER;
-        hash = (53 * hash) + getTestPlanName().hashCode();
-      }
-      if (getPartnerReportCount() > 0) {
-        hash = (37 * hash) + PARTNER_REPORT_FIELD_NUMBER;
-        hash = (53 * hash) + getPartnerReportList().hashCode();
-      }
-      if (getHalApiReportCount() > 0) {
-        hash = (37 * hash) + HAL_API_REPORT_FIELD_NUMBER;
-        hash = (53 * hash) + getHalApiReportList().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.TestPlanReportMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * To specify a test execution report.
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.TestPlanReportMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.TestPlanReportMessage)
-        com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestPlanReportMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestPlanReportMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.class, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-          getPartnerReportFieldBuilder();
-          getHalApiReportFieldBuilder();
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        testModuleName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        testModuleStartTimestamp_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000002);
-        testPlanName_ = "";
-        bitField0_ = (bitField0_ & ~0x00000004);
-        if (partnerReportBuilder_ == null) {
-          partnerReport_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000008);
-        } else {
-          partnerReportBuilder_.clear();
-        }
-        if (halApiReportBuilder_ == null) {
-          halApiReport_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000010);
-        } else {
-          halApiReportBuilder_.clear();
-        }
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_TestPlanReportMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage build() {
-        com.android.vts.proto.VtsReportMessage.TestPlanReportMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.TestPlanReportMessage result = new com.android.vts.proto.VtsReportMessage.TestPlanReportMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((bitField0_ & 0x00000001) == 0x00000001)) {
-          testModuleName_ = testModuleName_.getUnmodifiableView();
-          bitField0_ = (bitField0_ & ~0x00000001);
-        }
-        result.testModuleName_ = testModuleName_;
-        if (((bitField0_ & 0x00000002) == 0x00000002)) {
-          testModuleStartTimestamp_ = java.util.Collections.unmodifiableList(testModuleStartTimestamp_);
-          bitField0_ = (bitField0_ & ~0x00000002);
-        }
-        result.testModuleStartTimestamp_ = testModuleStartTimestamp_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.testPlanName_ = testPlanName_;
-        if (partnerReportBuilder_ == null) {
-          if (((bitField0_ & 0x00000008) == 0x00000008)) {
-            partnerReport_ = java.util.Collections.unmodifiableList(partnerReport_);
-            bitField0_ = (bitField0_ & ~0x00000008);
-          }
-          result.partnerReport_ = partnerReport_;
-        } else {
-          result.partnerReport_ = partnerReportBuilder_.build();
-        }
-        if (halApiReportBuilder_ == null) {
-          if (((bitField0_ & 0x00000010) == 0x00000010)) {
-            halApiReport_ = java.util.Collections.unmodifiableList(halApiReport_);
-            bitField0_ = (bitField0_ & ~0x00000010);
-          }
-          result.halApiReport_ = halApiReport_;
-        } else {
-          result.halApiReport_ = halApiReportBuilder_.build();
-        }
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.TestPlanReportMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.TestPlanReportMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.TestPlanReportMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.getDefaultInstance()) return this;
-        if (!other.testModuleName_.isEmpty()) {
-          if (testModuleName_.isEmpty()) {
-            testModuleName_ = other.testModuleName_;
-            bitField0_ = (bitField0_ & ~0x00000001);
-          } else {
-            ensureTestModuleNameIsMutable();
-            testModuleName_.addAll(other.testModuleName_);
-          }
-          onChanged();
-        }
-        if (!other.testModuleStartTimestamp_.isEmpty()) {
-          if (testModuleStartTimestamp_.isEmpty()) {
-            testModuleStartTimestamp_ = other.testModuleStartTimestamp_;
-            bitField0_ = (bitField0_ & ~0x00000002);
-          } else {
-            ensureTestModuleStartTimestampIsMutable();
-            testModuleStartTimestamp_.addAll(other.testModuleStartTimestamp_);
-          }
-          onChanged();
-        }
-        if (other.hasTestPlanName()) {
-          bitField0_ |= 0x00000004;
-          testPlanName_ = other.testPlanName_;
-          onChanged();
-        }
-        if (partnerReportBuilder_ == null) {
-          if (!other.partnerReport_.isEmpty()) {
-            if (partnerReport_.isEmpty()) {
-              partnerReport_ = other.partnerReport_;
-              bitField0_ = (bitField0_ & ~0x00000008);
-            } else {
-              ensurePartnerReportIsMutable();
-              partnerReport_.addAll(other.partnerReport_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.partnerReport_.isEmpty()) {
-            if (partnerReportBuilder_.isEmpty()) {
-              partnerReportBuilder_.dispose();
-              partnerReportBuilder_ = null;
-              partnerReport_ = other.partnerReport_;
-              bitField0_ = (bitField0_ & ~0x00000008);
-              partnerReportBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getPartnerReportFieldBuilder() : null;
-            } else {
-              partnerReportBuilder_.addAllMessages(other.partnerReport_);
-            }
-          }
-        }
-        if (halApiReportBuilder_ == null) {
-          if (!other.halApiReport_.isEmpty()) {
-            if (halApiReport_.isEmpty()) {
-              halApiReport_ = other.halApiReport_;
-              bitField0_ = (bitField0_ & ~0x00000010);
-            } else {
-              ensureHalApiReportIsMutable();
-              halApiReport_.addAll(other.halApiReport_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.halApiReport_.isEmpty()) {
-            if (halApiReportBuilder_.isEmpty()) {
-              halApiReportBuilder_.dispose();
-              halApiReportBuilder_ = null;
-              halApiReport_ = other.halApiReport_;
-              bitField0_ = (bitField0_ & ~0x00000010);
-              halApiReportBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getHalApiReportFieldBuilder() : null;
-            } else {
-              halApiReportBuilder_.addAllMessages(other.halApiReport_);
-            }
-          }
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.TestPlanReportMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.TestPlanReportMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private com.google.protobuf.LazyStringList testModuleName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-      private void ensureTestModuleNameIsMutable() {
-        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
-          testModuleName_ = new com.google.protobuf.LazyStringArrayList(testModuleName_);
-          bitField0_ |= 0x00000001;
-         }
-      }
-      /**
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       *
-       * <code>repeated string test_module_name = 11;</code>
-       */
-      public com.google.protobuf.ProtocolStringList
-          getTestModuleNameList() {
-        return testModuleName_.getUnmodifiableView();
-      }
-      /**
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       *
-       * <code>repeated string test_module_name = 11;</code>
-       */
-      public int getTestModuleNameCount() {
-        return testModuleName_.size();
-      }
-      /**
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       *
-       * <code>repeated string test_module_name = 11;</code>
-       */
-      public java.lang.String getTestModuleName(int index) {
-        return testModuleName_.get(index);
-      }
-      /**
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       *
-       * <code>repeated string test_module_name = 11;</code>
-       */
-      public com.google.protobuf.ByteString
-          getTestModuleNameBytes(int index) {
-        return testModuleName_.getByteString(index);
-      }
-      /**
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       *
-       * <code>repeated string test_module_name = 11;</code>
-       */
-      public Builder setTestModuleName(
-          int index, java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureTestModuleNameIsMutable();
-        testModuleName_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       *
-       * <code>repeated string test_module_name = 11;</code>
-       */
-      public Builder addTestModuleName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureTestModuleNameIsMutable();
-        testModuleName_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       *
-       * <code>repeated string test_module_name = 11;</code>
-       */
-      public Builder addAllTestModuleName(
-          java.lang.Iterable<java.lang.String> values) {
-        ensureTestModuleNameIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, testModuleName_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       *
-       * <code>repeated string test_module_name = 11;</code>
-       */
-      public Builder clearTestModuleName() {
-        testModuleName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * Keys used to find all TestReportMessage messages of test modules in
-       * this plan.
-       * </pre>
-       *
-       * <code>repeated string test_module_name = 11;</code>
-       */
-      public Builder addTestModuleNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureTestModuleNameIsMutable();
-        testModuleName_.add(value);
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<java.lang.Long> testModuleStartTimestamp_ = java.util.Collections.emptyList();
-      private void ensureTestModuleStartTimestampIsMutable() {
-        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
-          testModuleStartTimestamp_ = new java.util.ArrayList<java.lang.Long>(testModuleStartTimestamp_);
-          bitField0_ |= 0x00000002;
-         }
-      }
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      public java.util.List<java.lang.Long>
-          getTestModuleStartTimestampList() {
-        return java.util.Collections.unmodifiableList(testModuleStartTimestamp_);
-      }
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      public int getTestModuleStartTimestampCount() {
-        return testModuleStartTimestamp_.size();
-      }
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      public long getTestModuleStartTimestamp(int index) {
-        return testModuleStartTimestamp_.get(index);
-      }
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      public Builder setTestModuleStartTimestamp(
-          int index, long value) {
-        ensureTestModuleStartTimestampIsMutable();
-        testModuleStartTimestamp_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      public Builder addTestModuleStartTimestamp(long value) {
-        ensureTestModuleStartTimestampIsMutable();
-        testModuleStartTimestamp_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      public Builder addAllTestModuleStartTimestamp(
-          java.lang.Iterable<? extends java.lang.Long> values) {
-        ensureTestModuleStartTimestampIsMutable();
-        com.google.protobuf.AbstractMessageLite.Builder.addAll(
-            values, testModuleStartTimestamp_);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated int64 test_module_start_timestamp = 12;</code>
-       */
-      public Builder clearTestModuleStartTimestamp() {
-        testModuleStartTimestamp_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000002);
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object testPlanName_ = "";
-      /**
-       * <pre>
-       * The test plan name.
-       * </pre>
-       *
-       * <code>optional string test_plan_name = 21;</code>
-       */
-      public boolean hasTestPlanName() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
-      }
-      /**
-       * <pre>
-       * The test plan name.
-       * </pre>
-       *
-       * <code>optional string test_plan_name = 21;</code>
-       */
-      public java.lang.String getTestPlanName() {
-        java.lang.Object ref = testPlanName_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            testPlanName_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <pre>
-       * The test plan name.
-       * </pre>
-       *
-       * <code>optional string test_plan_name = 21;</code>
-       */
-      public com.google.protobuf.ByteString
-          getTestPlanNameBytes() {
-        java.lang.Object ref = testPlanName_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          testPlanName_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <pre>
-       * The test plan name.
-       * </pre>
-       *
-       * <code>optional string test_plan_name = 21;</code>
-       */
-      public Builder setTestPlanName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        testPlanName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * The test plan name.
-       * </pre>
-       *
-       * <code>optional string test_plan_name = 21;</code>
-       */
-      public Builder clearTestPlanName() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        testPlanName_ = getDefaultInstance().getTestPlanName();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * The test plan name.
-       * </pre>
-       *
-       * <code>optional string test_plan_name = 21;</code>
-       */
-      public Builder setTestPlanNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000004;
-        testPlanName_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> partnerReport_ =
-        java.util.Collections.emptyList();
-      private void ensurePartnerReportIsMutable() {
-        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
-          partnerReport_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.UrlResourceMessage>(partnerReport_);
-          bitField0_ |= 0x00000008;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.UrlResourceMessage, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder, com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder> partnerReportBuilder_;
-
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage> getPartnerReportList() {
-        if (partnerReportBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(partnerReport_);
-        } else {
-          return partnerReportBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public int getPartnerReportCount() {
-        if (partnerReportBuilder_ == null) {
-          return partnerReport_.size();
-        } else {
-          return partnerReportBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage getPartnerReport(int index) {
-        if (partnerReportBuilder_ == null) {
-          return partnerReport_.get(index);
-        } else {
-          return partnerReportBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public Builder setPartnerReport(
-          int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage value) {
-        if (partnerReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensurePartnerReportIsMutable();
-          partnerReport_.set(index, value);
-          onChanged();
-        } else {
-          partnerReportBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public Builder setPartnerReport(
-          int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder builderForValue) {
-        if (partnerReportBuilder_ == null) {
-          ensurePartnerReportIsMutable();
-          partnerReport_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          partnerReportBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public Builder addPartnerReport(com.android.vts.proto.VtsReportMessage.UrlResourceMessage value) {
-        if (partnerReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensurePartnerReportIsMutable();
-          partnerReport_.add(value);
-          onChanged();
-        } else {
-          partnerReportBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public Builder addPartnerReport(
-          int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage value) {
-        if (partnerReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensurePartnerReportIsMutable();
-          partnerReport_.add(index, value);
-          onChanged();
-        } else {
-          partnerReportBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public Builder addPartnerReport(
-          com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder builderForValue) {
-        if (partnerReportBuilder_ == null) {
-          ensurePartnerReportIsMutable();
-          partnerReport_.add(builderForValue.build());
-          onChanged();
-        } else {
-          partnerReportBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public Builder addPartnerReport(
-          int index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder builderForValue) {
-        if (partnerReportBuilder_ == null) {
-          ensurePartnerReportIsMutable();
-          partnerReport_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          partnerReportBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public Builder addAllPartnerReport(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessage> values) {
-        if (partnerReportBuilder_ == null) {
-          ensurePartnerReportIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, partnerReport_);
-          onChanged();
-        } else {
-          partnerReportBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public Builder clearPartnerReport() {
-        if (partnerReportBuilder_ == null) {
-          partnerReport_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000008);
-          onChanged();
-        } else {
-          partnerReportBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public Builder removePartnerReport(int index) {
-        if (partnerReportBuilder_ == null) {
-          ensurePartnerReportIsMutable();
-          partnerReport_.remove(index);
-          onChanged();
-        } else {
-          partnerReportBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder getPartnerReportBuilder(
-          int index) {
-        return getPartnerReportFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder getPartnerReportOrBuilder(
-          int index) {
-        if (partnerReportBuilder_ == null) {
-          return partnerReport_.get(index);  } else {
-          return partnerReportBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder> 
-           getPartnerReportOrBuilderList() {
-        if (partnerReportBuilder_ != null) {
-          return partnerReportBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(partnerReport_);
-        }
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder addPartnerReportBuilder() {
-        return getPartnerReportFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.UrlResourceMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder addPartnerReportBuilder(
-          int index) {
-        return getPartnerReportFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Report resource flies.
-       * </pre>
-       *
-       * <code>repeated .android.vts.UrlResourceMessage partner_report = 31;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder> 
-           getPartnerReportBuilderList() {
-        return getPartnerReportFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.UrlResourceMessage, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder, com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder> 
-          getPartnerReportFieldBuilder() {
-        if (partnerReportBuilder_ == null) {
-          partnerReportBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.UrlResourceMessage, com.android.vts.proto.VtsReportMessage.UrlResourceMessage.Builder, com.android.vts.proto.VtsReportMessage.UrlResourceMessageOrBuilder>(
-                  partnerReport_,
-                  ((bitField0_ & 0x00000008) == 0x00000008),
-                  getParentForChildren(),
-                  isClean());
-          partnerReport_ = null;
-        }
-        return partnerReportBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> halApiReport_ =
-        java.util.Collections.emptyList();
-      private void ensureHalApiReportIsMutable() {
-        if (!((bitField0_ & 0x00000010) == 0x00000010)) {
-          halApiReport_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage>(halApiReport_);
-          bitField0_ |= 0x00000010;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder> halApiReportBuilder_;
-
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> getHalApiReportList() {
-        if (halApiReportBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(halApiReport_);
-        } else {
-          return halApiReportBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public int getHalApiReportCount() {
-        if (halApiReportBuilder_ == null) {
-          return halApiReport_.size();
-        } else {
-          return halApiReportBuilder_.getCount();
-        }
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage getHalApiReport(int index) {
-        if (halApiReportBuilder_ == null) {
-          return halApiReport_.get(index);
-        } else {
-          return halApiReportBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public Builder setHalApiReport(
-          int index, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage value) {
-        if (halApiReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureHalApiReportIsMutable();
-          halApiReport_.set(index, value);
-          onChanged();
-        } else {
-          halApiReportBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public Builder setHalApiReport(
-          int index, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder builderForValue) {
-        if (halApiReportBuilder_ == null) {
-          ensureHalApiReportIsMutable();
-          halApiReport_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          halApiReportBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public Builder addHalApiReport(com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage value) {
-        if (halApiReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureHalApiReportIsMutable();
-          halApiReport_.add(value);
-          onChanged();
-        } else {
-          halApiReportBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public Builder addHalApiReport(
-          int index, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage value) {
-        if (halApiReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureHalApiReportIsMutable();
-          halApiReport_.add(index, value);
-          onChanged();
-        } else {
-          halApiReportBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public Builder addHalApiReport(
-          com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder builderForValue) {
-        if (halApiReportBuilder_ == null) {
-          ensureHalApiReportIsMutable();
-          halApiReport_.add(builderForValue.build());
-          onChanged();
-        } else {
-          halApiReportBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public Builder addHalApiReport(
-          int index, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder builderForValue) {
-        if (halApiReportBuilder_ == null) {
-          ensureHalApiReportIsMutable();
-          halApiReport_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          halApiReportBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public Builder addAllHalApiReport(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage> values) {
-        if (halApiReportBuilder_ == null) {
-          ensureHalApiReportIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, halApiReport_);
-          onChanged();
-        } else {
-          halApiReportBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public Builder clearHalApiReport() {
-        if (halApiReportBuilder_ == null) {
-          halApiReport_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000010);
-          onChanged();
-        } else {
-          halApiReportBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public Builder removeHalApiReport(int index) {
-        if (halApiReportBuilder_ == null) {
-          ensureHalApiReportIsMutable();
-          halApiReport_.remove(index);
-          onChanged();
-        } else {
-          halApiReportBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder getHalApiReportBuilder(
-          int index) {
-        return getHalApiReportFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder getHalApiReportOrBuilder(
-          int index) {
-        if (halApiReportBuilder_ == null) {
-          return halApiReport_.get(index);  } else {
-          return halApiReportBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder> 
-           getHalApiReportOrBuilderList() {
-        if (halApiReportBuilder_ != null) {
-          return halApiReportBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(halApiReport_);
-        }
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder addHalApiReportBuilder() {
-        return getHalApiReportFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder addHalApiReportBuilder(
-          int index) {
-        return getHalApiReportFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.getDefaultInstance());
-      }
-      /**
-       * <pre>
-       * Available HAL APIs for coverage measurement.
-       * Only used for profiling test plan.
-       * </pre>
-       *
-       * <code>repeated .android.vts.ApiCoverageReportMessage hal_api_report = 41;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder> 
-           getHalApiReportBuilderList() {
-        return getHalApiReportFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder> 
-          getHalApiReportFieldBuilder() {
-        if (halApiReportBuilder_ == null) {
-          halApiReportBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage.Builder, com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessageOrBuilder>(
-                  halApiReport_,
-                  ((bitField0_ & 0x00000010) == 0x00000010),
-                  getParentForChildren(),
-                  isClean());
-          halApiReport_ = null;
-        }
-        return halApiReportBuilder_;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.TestPlanReportMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.TestPlanReportMessage)
-    private static final com.android.vts.proto.VtsReportMessage.TestPlanReportMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.TestPlanReportMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.TestPlanReportMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<TestPlanReportMessage>
-        PARSER = new com.google.protobuf.AbstractParser<TestPlanReportMessage>() {
-      public TestPlanReportMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new TestPlanReportMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<TestPlanReportMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<TestPlanReportMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface DashboardPostMessageOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:android.vts.DashboardPostMessage)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    boolean hasAccessToken();
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    java.lang.String getAccessToken();
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    com.google.protobuf.ByteString
-        getAccessTokenBytes();
-
-    /**
-     * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage> 
-        getTestReportList();
-    /**
-     * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.TestReportMessage getTestReport(int index);
-    /**
-     * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-     */
-    int getTestReportCount();
-    /**
-     * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder> 
-        getTestReportOrBuilderList();
-    /**
-     * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder getTestReportOrBuilder(
-        int index);
-
-    /**
-     * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-     */
-    java.util.List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage> 
-        getTestPlanReportList();
-    /**
-     * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.TestPlanReportMessage getTestPlanReport(int index);
-    /**
-     * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-     */
-    int getTestPlanReportCount();
-    /**
-     * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-     */
-    java.util.List<? extends com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder> 
-        getTestPlanReportOrBuilderList();
-    /**
-     * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-     */
-    com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder getTestPlanReportOrBuilder(
-        int index);
-  }
-  /**
-   * <pre>
-   * Proto wrapper for posting data to the VTS Dashboard
-   * </pre>
-   *
-   * Protobuf type {@code android.vts.DashboardPostMessage}
-   */
-  public  static final class DashboardPostMessage extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:android.vts.DashboardPostMessage)
-      DashboardPostMessageOrBuilder {
-    // Use DashboardPostMessage.newBuilder() to construct.
-    private DashboardPostMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private DashboardPostMessage() {
-      accessToken_ = "";
-      testReport_ = java.util.Collections.emptyList();
-      testPlanReport_ = java.util.Collections.emptyList();
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private DashboardPostMessage(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            default: {
-              if (!parseUnknownField(input, unknownFields,
-                                     extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-            case 10: {
-              com.google.protobuf.ByteString bs = input.readBytes();
-              bitField0_ |= 0x00000001;
-              accessToken_ = bs;
-              break;
-            }
-            case 18: {
-              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-                testReport_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.TestReportMessage>();
-                mutable_bitField0_ |= 0x00000002;
-              }
-              testReport_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.TestReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-            case 26: {
-              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
-                testPlanReport_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage>();
-                mutable_bitField0_ |= 0x00000004;
-              }
-              testPlanReport_.add(
-                  input.readMessage(com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.PARSER, extensionRegistry));
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
-          testReport_ = java.util.Collections.unmodifiableList(testReport_);
-        }
-        if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
-          testPlanReport_ = java.util.Collections.unmodifiableList(testPlanReport_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
-      }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_DashboardPostMessage_descriptor;
-    }
-
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_DashboardPostMessage_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              com.android.vts.proto.VtsReportMessage.DashboardPostMessage.class, com.android.vts.proto.VtsReportMessage.DashboardPostMessage.Builder.class);
-    }
-
-    private int bitField0_;
-    public static final int ACCESS_TOKEN_FIELD_NUMBER = 1;
-    private volatile java.lang.Object accessToken_;
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    public boolean hasAccessToken() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
-    }
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    public java.lang.String getAccessToken() {
-      java.lang.Object ref = accessToken_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (bs.isValidUtf8()) {
-          accessToken_ = s;
-        }
-        return s;
-      }
-    }
-    /**
-     * <pre>
-     * oauth2.0 access token
-     * </pre>
-     *
-     * <code>optional string access_token = 1;</code>
-     */
-    public com.google.protobuf.ByteString
-        getAccessTokenBytes() {
-      java.lang.Object ref = accessToken_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        accessToken_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int TEST_REPORT_FIELD_NUMBER = 2;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage> testReport_;
-    /**
-     * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage> getTestReportList() {
-      return testReport_;
-    }
-    /**
-     * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder> 
-        getTestReportOrBuilderList() {
-      return testReport_;
-    }
-    /**
-     * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-     */
-    public int getTestReportCount() {
-      return testReport_.size();
-    }
-    /**
-     * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.TestReportMessage getTestReport(int index) {
-      return testReport_.get(index);
-    }
-    /**
-     * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder getTestReportOrBuilder(
-        int index) {
-      return testReport_.get(index);
-    }
-
-    public static final int TEST_PLAN_REPORT_FIELD_NUMBER = 3;
-    private java.util.List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage> testPlanReport_;
-    /**
-     * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-     */
-    public java.util.List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage> getTestPlanReportList() {
-      return testPlanReport_;
-    }
-    /**
-     * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-     */
-    public java.util.List<? extends com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder> 
-        getTestPlanReportOrBuilderList() {
-      return testPlanReport_;
-    }
-    /**
-     * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-     */
-    public int getTestPlanReportCount() {
-      return testPlanReport_.size();
-    }
-    /**
-     * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage getTestPlanReport(int index) {
-      return testPlanReport_.get(index);
-    }
-    /**
-     * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-     */
-    public com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder getTestPlanReportOrBuilder(
-        int index) {
-      return testPlanReport_.get(index);
-    }
-
-    private byte memoizedIsInitialized = -1;
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, accessToken_);
-      }
-      for (int i = 0; i < testReport_.size(); i++) {
-        output.writeMessage(2, testReport_.get(i));
-      }
-      for (int i = 0; i < testPlanReport_.size(); i++) {
-        output.writeMessage(3, testPlanReport_.get(i));
-      }
-      unknownFields.writeTo(output);
-    }
-
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, accessToken_);
-      }
-      for (int i = 0; i < testReport_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, testReport_.get(i));
-      }
-      for (int i = 0; i < testPlanReport_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, testPlanReport_.get(i));
-      }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    private static final long serialVersionUID = 0L;
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
-      }
-      if (!(obj instanceof com.android.vts.proto.VtsReportMessage.DashboardPostMessage)) {
-        return super.equals(obj);
-      }
-      com.android.vts.proto.VtsReportMessage.DashboardPostMessage other = (com.android.vts.proto.VtsReportMessage.DashboardPostMessage) obj;
-
-      boolean result = true;
-      result = result && (hasAccessToken() == other.hasAccessToken());
-      if (hasAccessToken()) {
-        result = result && getAccessToken()
-            .equals(other.getAccessToken());
-      }
-      result = result && getTestReportList()
-          .equals(other.getTestReportList());
-      result = result && getTestPlanReportList()
-          .equals(other.getTestPlanReportList());
-      result = result && unknownFields.equals(other.unknownFields);
-      return result;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
-      }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptorForType().hashCode();
-      if (hasAccessToken()) {
-        hash = (37 * hash) + ACCESS_TOKEN_FIELD_NUMBER;
-        hash = (53 * hash) + getAccessToken().hashCode();
-      }
-      if (getTestReportCount() > 0) {
-        hash = (37 * hash) + TEST_REPORT_FIELD_NUMBER;
-        hash = (53 * hash) + getTestReportList().hashCode();
-      }
-      if (getTestPlanReportCount() > 0) {
-        hash = (37 * hash) + TEST_PLAN_REPORT_FIELD_NUMBER;
-        hash = (53 * hash) + getTestPlanReportList().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(com.android.vts.proto.VtsReportMessage.DashboardPostMessage prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * <pre>
-     * Proto wrapper for posting data to the VTS Dashboard
-     * </pre>
-     *
-     * Protobuf type {@code android.vts.DashboardPostMessage}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:android.vts.DashboardPostMessage)
-        com.android.vts.proto.VtsReportMessage.DashboardPostMessageOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_DashboardPostMessage_descriptor;
-      }
-
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_DashboardPostMessage_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                com.android.vts.proto.VtsReportMessage.DashboardPostMessage.class, com.android.vts.proto.VtsReportMessage.DashboardPostMessage.Builder.class);
-      }
-
-      // Construct using com.android.vts.proto.VtsReportMessage.DashboardPostMessage.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
-      }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
-      }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-          getTestReportFieldBuilder();
-          getTestPlanReportFieldBuilder();
-        }
-      }
-      public Builder clear() {
-        super.clear();
-        accessToken_ = "";
-        bitField0_ = (bitField0_ & ~0x00000001);
-        if (testReportBuilder_ == null) {
-          testReport_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
-        } else {
-          testReportBuilder_.clear();
-        }
-        if (testPlanReportBuilder_ == null) {
-          testPlanReport_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000004);
-        } else {
-          testPlanReportBuilder_.clear();
-        }
-        return this;
-      }
-
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return com.android.vts.proto.VtsReportMessage.internal_static_android_vts_DashboardPostMessage_descriptor;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.DashboardPostMessage getDefaultInstanceForType() {
-        return com.android.vts.proto.VtsReportMessage.DashboardPostMessage.getDefaultInstance();
-      }
-
-      public com.android.vts.proto.VtsReportMessage.DashboardPostMessage build() {
-        com.android.vts.proto.VtsReportMessage.DashboardPostMessage result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return result;
-      }
-
-      public com.android.vts.proto.VtsReportMessage.DashboardPostMessage buildPartial() {
-        com.android.vts.proto.VtsReportMessage.DashboardPostMessage result = new com.android.vts.proto.VtsReportMessage.DashboardPostMessage(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
-        }
-        result.accessToken_ = accessToken_;
-        if (testReportBuilder_ == null) {
-          if (((bitField0_ & 0x00000002) == 0x00000002)) {
-            testReport_ = java.util.Collections.unmodifiableList(testReport_);
-            bitField0_ = (bitField0_ & ~0x00000002);
-          }
-          result.testReport_ = testReport_;
-        } else {
-          result.testReport_ = testReportBuilder_.build();
-        }
-        if (testPlanReportBuilder_ == null) {
-          if (((bitField0_ & 0x00000004) == 0x00000004)) {
-            testPlanReport_ = java.util.Collections.unmodifiableList(testPlanReport_);
-            bitField0_ = (bitField0_ & ~0x00000004);
-          }
-          result.testPlanReport_ = testPlanReport_;
-        } else {
-          result.testPlanReport_ = testPlanReportBuilder_.build();
-        }
-        result.bitField0_ = to_bitField0_;
-        onBuilt();
-        return result;
-      }
-
-      public Builder clone() {
-        return (Builder) super.clone();
-      }
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.setField(field, value);
-      }
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return (Builder) super.clearField(field);
-      }
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return (Builder) super.clearOneof(oneof);
-      }
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, Object value) {
-        return (Builder) super.setRepeatedField(field, index, value);
-      }
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          Object value) {
-        return (Builder) super.addRepeatedField(field, value);
-      }
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof com.android.vts.proto.VtsReportMessage.DashboardPostMessage) {
-          return mergeFrom((com.android.vts.proto.VtsReportMessage.DashboardPostMessage)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(com.android.vts.proto.VtsReportMessage.DashboardPostMessage other) {
-        if (other == com.android.vts.proto.VtsReportMessage.DashboardPostMessage.getDefaultInstance()) return this;
-        if (other.hasAccessToken()) {
-          bitField0_ |= 0x00000001;
-          accessToken_ = other.accessToken_;
-          onChanged();
-        }
-        if (testReportBuilder_ == null) {
-          if (!other.testReport_.isEmpty()) {
-            if (testReport_.isEmpty()) {
-              testReport_ = other.testReport_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-            } else {
-              ensureTestReportIsMutable();
-              testReport_.addAll(other.testReport_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.testReport_.isEmpty()) {
-            if (testReportBuilder_.isEmpty()) {
-              testReportBuilder_.dispose();
-              testReportBuilder_ = null;
-              testReport_ = other.testReport_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-              testReportBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getTestReportFieldBuilder() : null;
-            } else {
-              testReportBuilder_.addAllMessages(other.testReport_);
-            }
-          }
-        }
-        if (testPlanReportBuilder_ == null) {
-          if (!other.testPlanReport_.isEmpty()) {
-            if (testPlanReport_.isEmpty()) {
-              testPlanReport_ = other.testPlanReport_;
-              bitField0_ = (bitField0_ & ~0x00000004);
-            } else {
-              ensureTestPlanReportIsMutable();
-              testPlanReport_.addAll(other.testPlanReport_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.testPlanReport_.isEmpty()) {
-            if (testPlanReportBuilder_.isEmpty()) {
-              testPlanReportBuilder_.dispose();
-              testPlanReportBuilder_ = null;
-              testPlanReport_ = other.testPlanReport_;
-              bitField0_ = (bitField0_ & ~0x00000004);
-              testPlanReportBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getTestPlanReportFieldBuilder() : null;
-            } else {
-              testPlanReportBuilder_.addAllMessages(other.testPlanReport_);
-            }
-          }
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        com.android.vts.proto.VtsReportMessage.DashboardPostMessage parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (com.android.vts.proto.VtsReportMessage.DashboardPostMessage) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private java.lang.Object accessToken_ = "";
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public boolean hasAccessToken() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
-      }
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public java.lang.String getAccessToken() {
-        java.lang.Object ref = accessToken_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (bs.isValidUtf8()) {
-            accessToken_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public com.google.protobuf.ByteString
-          getAccessTokenBytes() {
-        java.lang.Object ref = accessToken_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          accessToken_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public Builder setAccessToken(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        accessToken_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public Builder clearAccessToken() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        accessToken_ = getDefaultInstance().getAccessToken();
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * oauth2.0 access token
-       * </pre>
-       *
-       * <code>optional string access_token = 1;</code>
-       */
-      public Builder setAccessTokenBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  bitField0_ |= 0x00000001;
-        accessToken_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage> testReport_ =
-        java.util.Collections.emptyList();
-      private void ensureTestReportIsMutable() {
-        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
-          testReport_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.TestReportMessage>(testReport_);
-          bitField0_ |= 0x00000002;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.TestReportMessage, com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder, com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder> testReportBuilder_;
-
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage> getTestReportList() {
-        if (testReportBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(testReport_);
-        } else {
-          return testReportBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public int getTestReportCount() {
-        if (testReportBuilder_ == null) {
-          return testReport_.size();
-        } else {
-          return testReportBuilder_.getCount();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestReportMessage getTestReport(int index) {
-        if (testReportBuilder_ == null) {
-          return testReport_.get(index);
-        } else {
-          return testReportBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public Builder setTestReport(
-          int index, com.android.vts.proto.VtsReportMessage.TestReportMessage value) {
-        if (testReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureTestReportIsMutable();
-          testReport_.set(index, value);
-          onChanged();
-        } else {
-          testReportBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public Builder setTestReport(
-          int index, com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder builderForValue) {
-        if (testReportBuilder_ == null) {
-          ensureTestReportIsMutable();
-          testReport_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          testReportBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public Builder addTestReport(com.android.vts.proto.VtsReportMessage.TestReportMessage value) {
-        if (testReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureTestReportIsMutable();
-          testReport_.add(value);
-          onChanged();
-        } else {
-          testReportBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public Builder addTestReport(
-          int index, com.android.vts.proto.VtsReportMessage.TestReportMessage value) {
-        if (testReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureTestReportIsMutable();
-          testReport_.add(index, value);
-          onChanged();
-        } else {
-          testReportBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public Builder addTestReport(
-          com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder builderForValue) {
-        if (testReportBuilder_ == null) {
-          ensureTestReportIsMutable();
-          testReport_.add(builderForValue.build());
-          onChanged();
-        } else {
-          testReportBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public Builder addTestReport(
-          int index, com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder builderForValue) {
-        if (testReportBuilder_ == null) {
-          ensureTestReportIsMutable();
-          testReport_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          testReportBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public Builder addAllTestReport(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.TestReportMessage> values) {
-        if (testReportBuilder_ == null) {
-          ensureTestReportIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, testReport_);
-          onChanged();
-        } else {
-          testReportBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public Builder clearTestReport() {
-        if (testReportBuilder_ == null) {
-          testReport_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
-          onChanged();
-        } else {
-          testReportBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public Builder removeTestReport(int index) {
-        if (testReportBuilder_ == null) {
-          ensureTestReportIsMutable();
-          testReport_.remove(index);
-          onChanged();
-        } else {
-          testReportBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder getTestReportBuilder(
-          int index) {
-        return getTestReportFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder getTestReportOrBuilder(
-          int index) {
-        if (testReportBuilder_ == null) {
-          return testReport_.get(index);  } else {
-          return testReportBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder> 
-           getTestReportOrBuilderList() {
-        if (testReportBuilder_ != null) {
-          return testReportBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(testReport_);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder addTestReportBuilder() {
-        return getTestReportFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.TestReportMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder addTestReportBuilder(
-          int index) {
-        return getTestReportFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.TestReportMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.TestReportMessage test_report = 2;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder> 
-           getTestReportBuilderList() {
-        return getTestReportFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.TestReportMessage, com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder, com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder> 
-          getTestReportFieldBuilder() {
-        if (testReportBuilder_ == null) {
-          testReportBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.TestReportMessage, com.android.vts.proto.VtsReportMessage.TestReportMessage.Builder, com.android.vts.proto.VtsReportMessage.TestReportMessageOrBuilder>(
-                  testReport_,
-                  ((bitField0_ & 0x00000002) == 0x00000002),
-                  getParentForChildren(),
-                  isClean());
-          testReport_ = null;
-        }
-        return testReportBuilder_;
-      }
-
-      private java.util.List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage> testPlanReport_ =
-        java.util.Collections.emptyList();
-      private void ensureTestPlanReportIsMutable() {
-        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
-          testPlanReport_ = new java.util.ArrayList<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage>(testPlanReport_);
-          bitField0_ |= 0x00000004;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.TestPlanReportMessage, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder, com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder> testPlanReportBuilder_;
-
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage> getTestPlanReportList() {
-        if (testPlanReportBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(testPlanReport_);
-        } else {
-          return testPlanReportBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public int getTestPlanReportCount() {
-        if (testPlanReportBuilder_ == null) {
-          return testPlanReport_.size();
-        } else {
-          return testPlanReportBuilder_.getCount();
-        }
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage getTestPlanReport(int index) {
-        if (testPlanReportBuilder_ == null) {
-          return testPlanReport_.get(index);
-        } else {
-          return testPlanReportBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public Builder setTestPlanReport(
-          int index, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage value) {
-        if (testPlanReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureTestPlanReportIsMutable();
-          testPlanReport_.set(index, value);
-          onChanged();
-        } else {
-          testPlanReportBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public Builder setTestPlanReport(
-          int index, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder builderForValue) {
-        if (testPlanReportBuilder_ == null) {
-          ensureTestPlanReportIsMutable();
-          testPlanReport_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          testPlanReportBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public Builder addTestPlanReport(com.android.vts.proto.VtsReportMessage.TestPlanReportMessage value) {
-        if (testPlanReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureTestPlanReportIsMutable();
-          testPlanReport_.add(value);
-          onChanged();
-        } else {
-          testPlanReportBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public Builder addTestPlanReport(
-          int index, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage value) {
-        if (testPlanReportBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureTestPlanReportIsMutable();
-          testPlanReport_.add(index, value);
-          onChanged();
-        } else {
-          testPlanReportBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public Builder addTestPlanReport(
-          com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder builderForValue) {
-        if (testPlanReportBuilder_ == null) {
-          ensureTestPlanReportIsMutable();
-          testPlanReport_.add(builderForValue.build());
-          onChanged();
-        } else {
-          testPlanReportBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public Builder addTestPlanReport(
-          int index, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder builderForValue) {
-        if (testPlanReportBuilder_ == null) {
-          ensureTestPlanReportIsMutable();
-          testPlanReport_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          testPlanReportBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public Builder addAllTestPlanReport(
-          java.lang.Iterable<? extends com.android.vts.proto.VtsReportMessage.TestPlanReportMessage> values) {
-        if (testPlanReportBuilder_ == null) {
-          ensureTestPlanReportIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, testPlanReport_);
-          onChanged();
-        } else {
-          testPlanReportBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public Builder clearTestPlanReport() {
-        if (testPlanReportBuilder_ == null) {
-          testPlanReport_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000004);
-          onChanged();
-        } else {
-          testPlanReportBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public Builder removeTestPlanReport(int index) {
-        if (testPlanReportBuilder_ == null) {
-          ensureTestPlanReportIsMutable();
-          testPlanReport_.remove(index);
-          onChanged();
-        } else {
-          testPlanReportBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder getTestPlanReportBuilder(
-          int index) {
-        return getTestPlanReportFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder getTestPlanReportOrBuilder(
-          int index) {
-        if (testPlanReportBuilder_ == null) {
-          return testPlanReport_.get(index);  } else {
-          return testPlanReportBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public java.util.List<? extends com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder> 
-           getTestPlanReportOrBuilderList() {
-        if (testPlanReportBuilder_ != null) {
-          return testPlanReportBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(testPlanReport_);
-        }
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder addTestPlanReportBuilder() {
-        return getTestPlanReportFieldBuilder().addBuilder(
-            com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder addTestPlanReportBuilder(
-          int index) {
-        return getTestPlanReportFieldBuilder().addBuilder(
-            index, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .android.vts.TestPlanReportMessage test_plan_report = 3;</code>
-       */
-      public java.util.List<com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder> 
-           getTestPlanReportBuilderList() {
-        return getTestPlanReportFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          com.android.vts.proto.VtsReportMessage.TestPlanReportMessage, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder, com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder> 
-          getTestPlanReportFieldBuilder() {
-        if (testPlanReportBuilder_ == null) {
-          testPlanReportBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              com.android.vts.proto.VtsReportMessage.TestPlanReportMessage, com.android.vts.proto.VtsReportMessage.TestPlanReportMessage.Builder, com.android.vts.proto.VtsReportMessage.TestPlanReportMessageOrBuilder>(
-                  testPlanReport_,
-                  ((bitField0_ & 0x00000004) == 0x00000004),
-                  getParentForChildren(),
-                  isClean());
-          testPlanReport_ = null;
-        }
-        return testPlanReportBuilder_;
-      }
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:android.vts.DashboardPostMessage)
-    }
-
-    // @@protoc_insertion_point(class_scope:android.vts.DashboardPostMessage)
-    private static final com.android.vts.proto.VtsReportMessage.DashboardPostMessage DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new com.android.vts.proto.VtsReportMessage.DashboardPostMessage();
-    }
-
-    public static com.android.vts.proto.VtsReportMessage.DashboardPostMessage getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    @java.lang.Deprecated public static final com.google.protobuf.Parser<DashboardPostMessage>
-        PARSER = new com.google.protobuf.AbstractParser<DashboardPostMessage>() {
-      public DashboardPostMessage parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-          return new DashboardPostMessage(input, extensionRegistry);
-      }
-    };
-
-    public static com.google.protobuf.Parser<DashboardPostMessage> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<DashboardPostMessage> getParserForType() {
-      return PARSER;
-    }
-
-    public com.android.vts.proto.VtsReportMessage.DashboardPostMessage getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_AndroidDeviceInfoMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_AndroidDeviceInfoMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_AndroidBuildInfo_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_AndroidBuildInfo_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_VtsHostInfo_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_VtsHostInfo_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_TestCaseReportMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_TestCaseReportMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_ProfilingReportMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_ProfilingReportMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_SystraceReportMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_SystraceReportMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_CoverageReportMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_CoverageReportMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_HalInterfaceMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_HalInterfaceMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_ApiCoverageReportMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_ApiCoverageReportMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_LogMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_LogMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_UrlResourceMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_UrlResourceMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_TestReportMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_TestReportMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_TestPlanReportMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_TestPlanReportMessage_fieldAccessorTable;
-  private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_android_vts_DashboardPostMessage_descriptor;
-  private static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_android_vts_DashboardPostMessage_fieldAccessorTable;
-
-  public static com.google.protobuf.Descriptors.FileDescriptor
-      getDescriptor() {
-    return descriptor;
-  }
-  private static  com.google.protobuf.Descriptors.FileDescriptor
-      descriptor;
-  static {
-    java.lang.String[] descriptorData = {
-      "\n\034proto/VtsReportMessage.proto\022\013android." +
-      "vts\"\340\001\n\030AndroidDeviceInfoMessage\022\024\n\014prod" +
-      "uct_type\030\001 \001(\014\022\027\n\017product_variant\030\002 \001(\014\022" +
-      "\024\n\014build_flavor\030\013 \001(\014\022\020\n\010build_id\030\014 \001(\014\022" +
-      "\016\n\006branch\030\025 \001(\014\022\023\n\013build_alias\030\026 \001(\014\022\021\n\t" +
-      "api_level\030\037 \001(\014\022\020\n\010abi_name\0303 \001(\014\022\023\n\013abi" +
-      "_bitness\0304 \001(\014\022\016\n\006serial\030e \001(\014\"g\n\020Androi" +
-      "dBuildInfo\022\n\n\002id\030\001 \001(\014\022\014\n\004name\030\013 \001(\014\022\022\n\n" +
-      "build_type\030\014 \001(\014\022\016\n\006branch\030\r \001(\014\022\025\n\rbuil" +
-      "d_summary\030\025 \001(\014\"\037\n\013VtsHostInfo\022\020\n\010hostna",
-      "me\030\001 \001(\014\"\325\002\n\025TestCaseReportMessage\022\014\n\004na" +
-      "me\030\001 \001(\014\0220\n\013test_result\030\013 \001(\0162\033.android." +
-      "vts.TestCaseResult\022\027\n\017start_timestamp\030\025 " +
-      "\001(\003\022\025\n\rend_timestamp\030\026 \001(\003\0224\n\010coverage\030\037" +
-      " \003(\0132\".android.vts.CoverageReportMessage" +
-      "\0226\n\tprofiling\030) \003(\0132#.android.vts.Profil" +
-      "ingReportMessage\0228\n\010systrace\030* \003(\0132\".and" +
-      "roid.vts.SystraceReportMessageB\002\030\001\022$\n\003lo" +
-      "g\030e \003(\0132\027.android.vts.LogMessage\"\240\002\n\026Pro" +
-      "filingReportMessage\022\014\n\004name\030\001 \001(\014\022+\n\004typ",
-      "e\030\002 \001(\0162\035.android.vts.VtsProfilingType\022@" +
-      "\n\017regression_mode\030\003 \001(\0162\'.android.vts.Vt" +
-      "sProfilingRegressionMode\022\027\n\017start_timest" +
-      "amp\030\013 \001(\003\022\025\n\rend_timestamp\030\014 \001(\003\022\r\n\005labe" +
-      "l\030\025 \003(\014\022\r\n\005value\030\026 \003(\003\022\024\n\014x_axis_label\030\037" +
-      " \001(\014\022\024\n\014y_axis_label\030  \001(\014\022\017\n\007options\030) " +
-      "\003(\014\"H\n\025SystraceReportMessage\022\024\n\014process_" +
-      "name\030\001 \001(\014\022\014\n\004html\030\013 \003(\014\022\013\n\003url\030\025 \003(\014\"\345\001" +
-      "\n\025CoverageReportMessage\022\021\n\tfile_path\030\013 \001" +
-      "(\014\022\024\n\014project_name\030\014 \001(\014\022\020\n\010revision\030\r \001",
-      "(\014\022\034\n\024line_coverage_vector\030\027 \003(\003\022\030\n\020tota" +
-      "l_line_count\030e \001(\005\022\032\n\022covered_line_count" +
-      "\030f \001(\005\022\024\n\010dir_path\030\001 \001(\014B\002\030\001\022\025\n\tfile_nam" +
-      "e\030\002 \001(\014B\002\030\001\022\020\n\004html\030\003 \001(\014B\002\030\001\"\234\001\n\023HalInt" +
-      "erfaceMessage\022\030\n\020hal_package_name\030\001 \001(\014\022" +
-      "\031\n\021hal_version_major\030\002 \001(\005\022\031\n\021hal_versio" +
-      "n_minor\030\003 \001(\005\022\032\n\022hal_interface_name\030\004 \001(" +
-      "\014\022\031\n\021hal_release_level\030\005 \001(\014\"}\n\030ApiCover" +
-      "ageReportMessage\0227\n\rhal_interface\030\001 \001(\0132" +
-      " .android.vts.HalInterfaceMessage\022\017\n\007hal",
-      "_api\030\013 \003(\014\022\027\n\017covered_hal_api\030\014 \003(\014\"8\n\nL" +
-      "ogMessage\022\013\n\003url\030\001 \001(\014\022\014\n\004name\030\002 \001(\014\022\017\n\007" +
-      "content\030\003 \001(\014\"@\n\022UrlResourceMessage\022\013\n\003u" +
-      "rl\030\001 \001(\014\022\014\n\004name\030\002 \001(\014\022\017\n\007content\030\003 \001(\014\"" +
-      "\310\005\n\021TestReportMessage\022\026\n\ntest_suite\030\001 \001(" +
-      "\014B\002\030\001\022\014\n\004test\030\002 \001(\014\022+\n\ttest_type\030\003 \001(\0162\030" +
-      ".android.vts.VtsTestType\022:\n\013device_info\030" +
-      "\004 \003(\0132%.android.vts.AndroidDeviceInfoMes" +
-      "sage\0221\n\nbuild_info\030\005 \001(\0132\035.android.vts.A" +
-      "ndroidBuildInfo\022\030\n\020subscriber_email\030\006 \003(",
-      "\014\022+\n\thost_info\030\007 \001(\0132\030.android.vts.VtsHo" +
-      "stInfo\0225\n\ttest_case\030\013 \003(\0132\".android.vts." +
-      "TestCaseReportMessage\0226\n\tprofiling\030\025 \003(\013" +
-      "2#.android.vts.ProfilingReportMessage\0228\n" +
-      "\010systrace\030\026 \003(\0132\".android.vts.SystraceRe" +
-      "portMessageB\002\030\001\022\027\n\017start_timestamp\030e \001(\003" +
-      "\022\025\n\rend_timestamp\030f \001(\003\0224\n\010coverage\030g \003(" +
-      "\0132\".android.vts.CoverageReportMessage\022;\n" +
-      "\014api_coverage\030h \003(\0132%.android.vts.ApiCov" +
-      "erageReportMessage\022%\n\003log\030\351\007 \003(\0132\027.andro",
-      "id.vts.LogMessage\0227\n\rlink_resource\030\363\007 \003(" +
-      "\0132\037.android.vts.UrlResourceMessage\"\346\001\n\025T" +
-      "estPlanReportMessage\022\030\n\020test_module_name" +
-      "\030\013 \003(\t\022#\n\033test_module_start_timestamp\030\014 " +
-      "\003(\003\022\026\n\016test_plan_name\030\025 \001(\t\0227\n\016partner_r" +
-      "eport\030\037 \003(\0132\037.android.vts.UrlResourceMes" +
-      "sage\022=\n\016hal_api_report\030) \003(\0132%.android.v" +
-      "ts.ApiCoverageReportMessage\"\237\001\n\024Dashboar" +
-      "dPostMessage\022\024\n\014access_token\030\001 \001(\t\0223\n\013te" +
-      "st_report\030\002 \003(\0132\036.android.vts.TestReport",
-      "Message\022<\n\020test_plan_report\030\003 \003(\0132\".andr" +
-      "oid.vts.TestPlanReportMessage*\263\001\n\016TestCa" +
-      "seResult\022\022\n\016UNKNOWN_RESULT\020\000\022\031\n\025TEST_CAS" +
-      "E_RESULT_PASS\020\001\022\031\n\025TEST_CASE_RESULT_FAIL" +
-      "\020\002\022\031\n\025TEST_CASE_RESULT_SKIP\020\003\022\036\n\032TEST_CA" +
-      "SE_RESULT_EXCEPTION\020\004\022\034\n\030TEST_CASE_RESUL" +
-      "T_TIMEOUT\020\005*\234\001\n\013VtsTestType\022\030\n\024UNKNOWN_V" +
-      "TS_TESTTYPE\020\000\022\036\n\032VTS_HOST_DRIVEN_STRUCTU" +
-      "RAL\020\001\022\033\n\027VTS_HOST_DRIVEN_FUZZING\020\002\022\031\n\025VT" +
-      "S_TARGET_SIDE_GTEST\020\003\022\033\n\027VTS_TARGET_SIDE",
-      "_FUZZING\020\004*\243\001\n\032VtsProfilingRegressionMod" +
-      "e\022\033\n\027UNKNOWN_REGRESSION_MODE\020\000\022 \n\034VTS_RE" +
-      "GRESSION_MODE_DISABLED\020\001\022\"\n\036VTS_REGRESSI" +
-      "ON_MODE_INCREASING\020\002\022\"\n\036VTS_REGRESSION_M" +
-      "ODE_DECREASING\020\003*\244\001\n\020VtsProfilingType\022\036\n" +
-      "\032UNKNOWN_VTS_PROFILING_TYPE\020\000\022 \n\034VTS_PRO" +
-      "FILING_TYPE_TIMESTAMP\020\001\022%\n!VTS_PROFILING" +
-      "_TYPE_LABELED_VECTOR\020\002\022\'\n#VTS_PROFILING_" +
-      "TYPE_UNLABELED_VECTOR\020\003B+\n\025com.android.v" +
-      "ts.protoB\020VtsReportMessageP\000"
-    };
-    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
-        new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {
-          public com.google.protobuf.ExtensionRegistry assignDescriptors(
-              com.google.protobuf.Descriptors.FileDescriptor root) {
-            descriptor = root;
-            return null;
-          }
-        };
-    com.google.protobuf.Descriptors.FileDescriptor
-      .internalBuildGeneratedFileFrom(descriptorData,
-        new com.google.protobuf.Descriptors.FileDescriptor[] {
-        }, assigner);
-    internal_static_android_vts_AndroidDeviceInfoMessage_descriptor =
-      getDescriptor().getMessageTypes().get(0);
-    internal_static_android_vts_AndroidDeviceInfoMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_AndroidDeviceInfoMessage_descriptor,
-        new java.lang.String[] { "ProductType", "ProductVariant", "BuildFlavor", "BuildId", "Branch", "BuildAlias", "ApiLevel", "AbiName", "AbiBitness", "Serial", });
-    internal_static_android_vts_AndroidBuildInfo_descriptor =
-      getDescriptor().getMessageTypes().get(1);
-    internal_static_android_vts_AndroidBuildInfo_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_AndroidBuildInfo_descriptor,
-        new java.lang.String[] { "Id", "Name", "BuildType", "Branch", "BuildSummary", });
-    internal_static_android_vts_VtsHostInfo_descriptor =
-      getDescriptor().getMessageTypes().get(2);
-    internal_static_android_vts_VtsHostInfo_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_VtsHostInfo_descriptor,
-        new java.lang.String[] { "Hostname", });
-    internal_static_android_vts_TestCaseReportMessage_descriptor =
-      getDescriptor().getMessageTypes().get(3);
-    internal_static_android_vts_TestCaseReportMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_TestCaseReportMessage_descriptor,
-        new java.lang.String[] { "Name", "TestResult", "StartTimestamp", "EndTimestamp", "Coverage", "Profiling", "Systrace", "Log", });
-    internal_static_android_vts_ProfilingReportMessage_descriptor =
-      getDescriptor().getMessageTypes().get(4);
-    internal_static_android_vts_ProfilingReportMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_ProfilingReportMessage_descriptor,
-        new java.lang.String[] { "Name", "Type", "RegressionMode", "StartTimestamp", "EndTimestamp", "Label", "Value", "XAxisLabel", "YAxisLabel", "Options", });
-    internal_static_android_vts_SystraceReportMessage_descriptor =
-      getDescriptor().getMessageTypes().get(5);
-    internal_static_android_vts_SystraceReportMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_SystraceReportMessage_descriptor,
-        new java.lang.String[] { "ProcessName", "Html", "Url", });
-    internal_static_android_vts_CoverageReportMessage_descriptor =
-      getDescriptor().getMessageTypes().get(6);
-    internal_static_android_vts_CoverageReportMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_CoverageReportMessage_descriptor,
-        new java.lang.String[] { "FilePath", "ProjectName", "Revision", "LineCoverageVector", "TotalLineCount", "CoveredLineCount", "DirPath", "FileName", "Html", });
-    internal_static_android_vts_HalInterfaceMessage_descriptor =
-      getDescriptor().getMessageTypes().get(7);
-    internal_static_android_vts_HalInterfaceMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_HalInterfaceMessage_descriptor,
-        new java.lang.String[] { "HalPackageName", "HalVersionMajor", "HalVersionMinor", "HalInterfaceName", "HalReleaseLevel", });
-    internal_static_android_vts_ApiCoverageReportMessage_descriptor =
-      getDescriptor().getMessageTypes().get(8);
-    internal_static_android_vts_ApiCoverageReportMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_ApiCoverageReportMessage_descriptor,
-        new java.lang.String[] { "HalInterface", "HalApi", "CoveredHalApi", });
-    internal_static_android_vts_LogMessage_descriptor =
-      getDescriptor().getMessageTypes().get(9);
-    internal_static_android_vts_LogMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_LogMessage_descriptor,
-        new java.lang.String[] { "Url", "Name", "Content", });
-    internal_static_android_vts_UrlResourceMessage_descriptor =
-      getDescriptor().getMessageTypes().get(10);
-    internal_static_android_vts_UrlResourceMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_UrlResourceMessage_descriptor,
-        new java.lang.String[] { "Url", "Name", "Content", });
-    internal_static_android_vts_TestReportMessage_descriptor =
-      getDescriptor().getMessageTypes().get(11);
-    internal_static_android_vts_TestReportMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_TestReportMessage_descriptor,
-        new java.lang.String[] { "TestSuite", "Test", "TestType", "DeviceInfo", "BuildInfo", "SubscriberEmail", "HostInfo", "TestCase", "Profiling", "Systrace", "StartTimestamp", "EndTimestamp", "Coverage", "ApiCoverage", "Log", "LinkResource", });
-    internal_static_android_vts_TestPlanReportMessage_descriptor =
-      getDescriptor().getMessageTypes().get(12);
-    internal_static_android_vts_TestPlanReportMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_TestPlanReportMessage_descriptor,
-        new java.lang.String[] { "TestModuleName", "TestModuleStartTimestamp", "TestPlanName", "PartnerReport", "HalApiReport", });
-    internal_static_android_vts_DashboardPostMessage_descriptor =
-      getDescriptor().getMessageTypes().get(13);
-    internal_static_android_vts_DashboardPostMessage_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_android_vts_DashboardPostMessage_descriptor,
-        new java.lang.String[] { "AccessToken", "TestReport", "TestPlanReport", });
-  }
-
-  // @@protoc_insertion_point(outer_class_scope)
-}
diff --git a/src/main/java/com/android/vts/servlet/BaseServlet.java b/src/main/java/com/android/vts/servlet/BaseServlet.java
deleted file mode 100644
index 5319ee1..0000000
--- a/src/main/java/com/android/vts/servlet/BaseServlet.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.CoverageEntity;
-import com.android.vts.entity.TestSuiteResultEntity;
-import com.android.vts.entity.UserEntity;
-import com.android.vts.util.EmailHelper;
-import com.android.vts.util.GcsHelper;
-import com.google.appengine.api.users.User;
-import com.google.appengine.api.users.UserService;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.gson.Gson;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.ServletConfig;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-public abstract class BaseServlet extends HttpServlet {
-
-    protected final Logger logger = Logger.getLogger(getClass().getName());
-
-    protected String ERROR_MESSAGE_JSP = "WEB-INF/jsp/error_msg.jsp";
-
-    // Environment variables
-    protected static String GERRIT_URI;
-    protected static String GERRIT_SCOPE;
-    protected static String CLIENT_ID;
-    protected static String ANALYTICS_ID;
-
-    protected static final String TREE_DEFAULT_PARAM = "treeDefault";
-
-    public enum PageType {
-        TOT("Test", "/"),
-        RELEASE("Release", "/show_release"),
-        COVERAGE_OVERVIEW("Coverage", "/show_coverage_overview"),
-        PROFILING_LIST("Profiling", "/show_profiling_list"),
-        TABLE("", "/show_table"),
-        TREE("", "/show_tree"),
-        GRAPH("Profiling", "/show_graph"),
-        COVERAGE("Coverage", "/show_coverage"),
-        PERFORMANCE_DIGEST("Performance Digest", "/show_performance_digest"),
-        PLAN_RELEASE("", "/show_plan_release"),
-        PLAN_RUN("Plan Run", "/show_plan_run"),
-        PROFILING_OVERVIEW("", "/show_profiling_overview");
-
-        public final String defaultName;
-        public final String defaultUrl;
-
-        PageType(String defaultName, String defaultUrl) {
-            this.defaultName = defaultName;
-            this.defaultUrl = defaultUrl;
-        }
-    }
-
-    public static class Page {
-
-        private final PageType type;
-        private final String name;
-        private final String url;
-
-        public Page(PageType type) {
-            this.type = type;
-            this.name = type.defaultName;
-            this.url = type.defaultUrl;
-        }
-
-        public Page(PageType type, String name, String url) {
-            this.type = type;
-            this.name = type.defaultName + name;
-            this.url = type.defaultUrl + url;
-        }
-
-        public Page(PageType type, String name, String url, Boolean withoutDefault) {
-            this.type = type;
-            this.name = name;
-            this.url = type.defaultUrl + url;
-        }
-
-        public Page(PageType type, String url) {
-            this.type = type;
-            this.name = type.defaultName;
-            this.url = type.defaultUrl + url;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public String getUrl() {
-            return url;
-        }
-    }
-
-    public static final List<Page> navbarLinks;
-
-    static {
-        List<Page> links = new ArrayList<>();
-        links.add(new Page(PageType.TOT));
-        links.add(new Page(PageType.RELEASE));
-        links.add(new Page(PageType.COVERAGE_OVERVIEW));
-        links.add(new Page(PageType.PROFILING_LIST));
-        navbarLinks = links;
-    }
-
-    public abstract PageType getNavParentType();
-
-    /**
-     * Get a list of URL/Display name pairs for the breadcrumb hierarchy.
-     *
-     * @param request The HttpServletRequest object for the page request.
-     * @return a list of Page entries.
-     */
-    public abstract List<Page> getBreadcrumbLinks(HttpServletRequest request);
-
-    /** System Configuration Property class */
-    protected static Properties systemConfigProp = new Properties();
-
-    @Override
-    public void init(ServletConfig cfg) throws ServletException {
-        super.init(cfg);
-
-        systemConfigProp =
-                Properties.class.cast(cfg.getServletContext().getAttribute("systemConfigProp"));
-
-        GERRIT_URI = systemConfigProp.getProperty("gerrit.uri");
-        GERRIT_SCOPE = systemConfigProp.getProperty("gerrit.scope");
-        CLIENT_ID = systemConfigProp.getProperty("appengine.clientID");
-        ANALYTICS_ID = systemConfigProp.getProperty("analytics.id");
-
-        CoverageEntity.setPropertyValues(systemConfigProp);
-        TestSuiteResultEntity.setPropertyValues(systemConfigProp);
-        EmailHelper.setPropertyValues(systemConfigProp);
-        GcsHelper.setGcsProjectId(systemConfigProp.getProperty("gcs.projectID"));
-    }
-
-    @Override
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        // If the user is logged out, allow them to log back in and return to the page.
-        // Set the logout URL to direct back to a login page that directs to the current request.
-        UserService userService = UserServiceFactory.getUserService();
-        Optional<User> currentUser = Optional.ofNullable(userService.getCurrentUser());
-        String currentUserEmail =
-                currentUser.isPresent()
-                        ? currentUser.map(user -> user.getEmail().trim()).orElse("")
-                        : "";
-        String requestUri = request.getRequestURI();
-        String requestArgs = request.getQueryString();
-        String loginURI = userService.createLoginURL(requestUri + '?' + requestArgs);
-        String logoutURI = userService.createLogoutURL(loginURI);
-        if (currentUserEmail != "") {
-
-            int activeIndex;
-            switch (getNavParentType()) {
-                case PROFILING_LIST:
-                    activeIndex = 3;
-                    break;
-                case COVERAGE_OVERVIEW:
-                    activeIndex = 2;
-                    break;
-                case RELEASE:
-                    activeIndex = 1;
-                    break;
-                default:
-                    activeIndex = 0;
-                    break;
-            }
-            if (request.getParameter(TREE_DEFAULT_PARAM) != null) {
-                HttpSession session = request.getSession(true);
-                boolean treeDefault = request.getParameter(TREE_DEFAULT_PARAM).equals("true");
-                session.setAttribute(TREE_DEFAULT_PARAM, treeDefault);
-            }
-
-            request.setAttribute("serverName", request.getServerName());
-            request.setAttribute("logoutURL", logoutURI);
-            request.setAttribute("email", currentUserEmail);
-            request.setAttribute("analyticsID", new Gson().toJson(ANALYTICS_ID));
-            request.setAttribute("breadcrumbLinks", getBreadcrumbLinks(request));
-            request.setAttribute("navbarLinks", navbarLinks);
-            request.setAttribute("activeIndex", activeIndex);
-            response.setContentType("text/html");
-
-            if (currentUserEmail.endsWith("@google.com")
-                    || UserEntity.getUserList().contains(currentUserEmail)) {
-                doGetHandler(request, response);
-            } else {
-                RequestDispatcher dispatcher =
-                        request.getRequestDispatcher("WEB-INF/jsp/auth_error.jsp");
-                try {
-                    dispatcher.forward(request, response);
-                } catch (ServletException e) {
-                    logger.log(Level.SEVERE, "Servlet Exception caught : ", e);
-                }
-            }
-        } else {
-            response.sendRedirect(loginURI);
-        }
-    }
-
-    /**
-     * Implementation of the doGet method to be executed by servlet subclasses.
-     *
-     * @param request The HttpServletRequest object.
-     * @param response The HttpServletResponse object.
-     */
-    public abstract void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException;
-}
diff --git a/src/main/java/com/android/vts/servlet/DashboardMainServlet.java b/src/main/java/com/android/vts/servlet/DashboardMainServlet.java
deleted file mode 100644
index 73a7287..0000000
--- a/src/main/java/com/android/vts/servlet/DashboardMainServlet.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestStatusEntity;
-import com.android.vts.entity.UserFavoriteEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.PropertyProjection;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import com.google.appengine.api.users.User;
-import com.google.appengine.api.users.UserService;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.gson.Gson;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.stream.Collectors;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Represents the servlet that is invoked on loading the first page of dashboard. */
-public class DashboardMainServlet extends BaseServlet {
-    private static final String DASHBOARD_MAIN_JSP = "WEB-INF/jsp/dashboard_main.jsp";
-    private static final String NO_TESTS_ERROR = "No test results available.";
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.TOT;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        return null;
-    }
-
-    /** Helper class for displaying test entries on the main dashboard. */
-    public class TestDisplay implements Comparable<TestDisplay> {
-        private final Key testKey;
-        private final int passCount;
-        private final int failCount;
-        private boolean muteNotifications;
-        private boolean isFavorite;
-
-        /**
-         * Test display constructor.
-         *
-         * @param testKey The key of the test.
-         * @param passCount The number of tests passing.
-         * @param failCount The number of tests failing.
-         * @param muteNotifications The flag for user notification in case of test failure.
-         * @param isFavorite The flag for showing favorite mark on All Tests Tab page.
-         */
-        public TestDisplay(
-                Key testKey,
-                int passCount,
-                int failCount,
-                boolean muteNotifications,
-                boolean isFavorite) {
-            this.testKey = testKey;
-            this.passCount = passCount;
-            this.failCount = failCount;
-            this.muteNotifications = muteNotifications;
-            this.isFavorite = isFavorite;
-        }
-
-        /**
-         * Get the key of the test.
-         *
-         * @return The key of the test.
-         */
-        public String getName() {
-            return this.testKey.getName();
-        }
-
-        /**
-         * Get the number of passing test cases.
-         *
-         * @return The number of passing test cases.
-         */
-        public int getPassCount() {
-            return this.passCount;
-        }
-
-        /**
-         * Get the number of failing test cases.
-         *
-         * @return The number of failing test cases.
-         */
-        public int getFailCount() {
-            return this.failCount;
-        }
-
-        /**
-         * Get the notification mute status.
-         *
-         * @return True if the subscriber has muted notifications, false otherwise.
-         */
-        public boolean getMuteNotifications() {
-            return this.muteNotifications;
-        }
-
-        /** Set the notification mute status. */
-        public void setMuteNotifications(boolean muteNotifications) {
-            this.muteNotifications = muteNotifications;
-        }
-
-        /**
-         * Get the favorate status.
-         *
-         * @return True if an user set favorate for the test, false otherwise.
-         */
-        public boolean getIsFavorite() {
-            return this.isFavorite;
-        }
-
-        /** Set the favorite status. */
-        public void setIsFavorite(boolean isFavorite) {
-            this.isFavorite = isFavorite;
-        }
-
-        @Override
-        public int compareTo(TestDisplay test) {
-            return this.testKey.getName().compareTo(test.getName());
-        }
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        UserService userService = UserServiceFactory.getUserService();
-        User currentUser = userService.getCurrentUser();
-        RequestDispatcher dispatcher = null;
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        HttpSession session = request.getSession(true);
-        PageType referTo = PageType.TREE;
-        if (session.getAttribute("treeDefault") != null) {
-            boolean treeDefault = (boolean) session.getAttribute("treeDefault");
-            if (!treeDefault) {
-                referTo = PageType.TABLE;
-            }
-        }
-
-        List<TestDisplay> displayedTests = new ArrayList<>();
-        List<Key> unprocessedTestKeys = new ArrayList<>();
-
-        Map<Key, TestDisplay> testMap = new HashMap<>(); // map from table key to TestDisplay
-        Map<String, String> subscriptionMap = new HashMap<>();
-
-        boolean showAll = request.getParameter("showAll") != null;
-        String error = null;
-
-        List<String> allTestNames = TestEntity.getAllTestNames();
-
-        List<Key> favoriteKeyList = new ArrayList<Key>();
-        Filter userFilter =
-                new FilterPredicate(UserFavoriteEntity.USER, FilterOperator.EQUAL, currentUser);
-        Query filterQuery = new Query(UserFavoriteEntity.KIND).setFilter(userFilter);
-        Iterable<Entity> favoriteIter = datastore.prepare(filterQuery).asIterable();
-        favoriteIter.forEach(
-                fe -> {
-                    Key testKey = UserFavoriteEntity.fromEntity(fe).testKey;
-                    favoriteKeyList.add(testKey);
-                    subscriptionMap.put(testKey.getName(), KeyFactory.keyToString(fe.getKey()));
-                });
-
-        Query query =
-                new Query(TestStatusEntity.KIND)
-                        .addProjection(
-                                new PropertyProjection(TestStatusEntity.PASS_COUNT, Long.class))
-                        .addProjection(
-                                new PropertyProjection(TestStatusEntity.FAIL_COUNT, Long.class));
-        for (Entity status : datastore.prepare(query).asIterable()) {
-            TestStatusEntity statusEntity = TestStatusEntity.fromEntity(status);
-            if (statusEntity == null) continue;
-            Key testKey = KeyFactory.createKey(TestEntity.KIND, statusEntity.getTestName());
-            boolean isFavorite = favoriteKeyList.contains(testKey);
-            TestDisplay display = new TestDisplay(testKey, -1, -1, false, isFavorite);
-            if (!unprocessedTestKeys.contains(testKey)) {
-                display =
-                        new TestDisplay(
-                                testKey,
-                                statusEntity.getPassCount(),
-                                statusEntity.getFailCount(),
-                                false,
-                                isFavorite);
-            }
-            testMap.put(testKey, display);
-        }
-
-        if (testMap.size() == 0) {
-            error = NO_TESTS_ERROR;
-        }
-
-        if (showAll) {
-            for (Key testKey : testMap.keySet()) {
-                displayedTests.add(testMap.get(testKey));
-            }
-        } else {
-            if (testMap.size() > 0) {
-                for (Entity favoriteEntity : favoriteIter) {
-                    UserFavoriteEntity favorite = UserFavoriteEntity.fromEntity(favoriteEntity);
-                    Key testKey = favorite.testKey;
-                    if (!testMap.containsKey(testKey)) {
-                        continue;
-                    }
-                    TestDisplay display = testMap.get(testKey);
-                    display.setMuteNotifications(favorite.muteNotifications);
-                    displayedTests.add(display);
-                }
-            }
-        }
-        displayedTests.sort(Comparator.naturalOrder());
-
-        response.setStatus(HttpServletResponse.SC_OK);
-        request.setAttribute("allTestsJson", new Gson().toJson(allTestNames));
-        request.setAttribute("subscriptionMapJson", new Gson().toJson(subscriptionMap));
-        request.setAttribute("testNames", displayedTests);
-        request.setAttribute("showAll", showAll);
-        request.setAttribute("error", error);
-        request.setAttribute("resultsUrl", referTo.defaultUrl);
-        dispatcher = request.getRequestDispatcher(DASHBOARD_MAIN_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowCoverageOverviewServlet.java b/src/main/java/com/android/vts/servlet/ShowCoverageOverviewServlet.java
deleted file mode 100644
index 210c980..0000000
--- a/src/main/java/com/android/vts/servlet/ShowCoverageOverviewServlet.java
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.CodeCoverageEntity;
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestCoverageStatusEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-
-import com.android.vts.proto.VtsReportMessage;
-import com.android.vts.util.FilterUtil;
-import com.google.cloud.datastore.Datastore;
-import com.google.cloud.datastore.DatastoreOptions;
-import com.google.cloud.datastore.PathElement;
-import com.google.cloud.datastore.StructuredQuery.CompositeFilter;
-import com.google.cloud.datastore.StructuredQuery.Filter;
-import com.google.cloud.datastore.StructuredQuery.PropertyFilter;
-import com.google.gson.Gson;
-import com.google.visualization.datasource.DataSourceHelper;
-import com.google.visualization.datasource.DataSourceRequest;
-import com.google.visualization.datasource.base.DataSourceException;
-import com.google.visualization.datasource.base.ReasonType;
-import com.google.visualization.datasource.base.ResponseStatus;
-import com.google.visualization.datasource.base.StatusType;
-import com.google.visualization.datasource.base.TypeMismatchException;
-import com.google.visualization.datasource.datatable.ColumnDescription;
-import com.google.visualization.datasource.datatable.DataTable;
-import com.google.visualization.datasource.datatable.TableRow;
-import com.google.visualization.datasource.datatable.value.DateTimeValue;
-import com.google.visualization.datasource.datatable.value.NumberValue;
-import com.google.visualization.datasource.datatable.value.ValueType;
-import com.googlecode.objectify.Key;
-import com.ibm.icu.util.GregorianCalendar;
-import com.ibm.icu.util.TimeZone;
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.Predicate;
-import java.util.logging.Level;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** Represents the servlet that is invoked on loading the coverage overview page. */
-public class ShowCoverageOverviewServlet extends BaseServlet {
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.COVERAGE_OVERVIEW;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        return null;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-
-        String pageType =
-                request.getParameter("pageType") == null
-                        ? "html"
-                        : request.getParameter("pageType");
-
-        RequestDispatcher dispatcher;
-        if (pageType.equalsIgnoreCase("html")) {
-            dispatcher = this.getCoverageDispatcher(request, response);
-            try {
-                request.setAttribute("pageType", pageType);
-                response.setStatus(HttpServletResponse.SC_OK);
-                dispatcher.forward(request, response);
-            } catch (ServletException e) {
-                logger.log(Level.SEVERE, "Servlet Exception caught : ", e);
-            }
-        } else {
-
-            String testName = request.getParameter("testName");
-
-            DataTable data = getCoverageDataTable(testName);
-            DataSourceRequest dsRequest = null;
-
-            try {
-                // Extract the datasource request parameters.
-                dsRequest = new DataSourceRequest(request);
-
-                // NOTE: If you want to work in restricted mode, which means that only
-                // requests from the same domain can access the data source, uncomment the following
-                // call.
-                //
-                // DataSourceHelper.verifyAccessApproved(dsRequest);
-
-                // Apply the query to the data table.
-                DataTable newData =
-                        DataSourceHelper.applyQuery(
-                                dsRequest.getQuery(), data, dsRequest.getUserLocale());
-
-                // Set the response.
-                DataSourceHelper.setServletResponse(newData, dsRequest, response);
-            } catch (RuntimeException rte) {
-                logger.log(Level.SEVERE, "A runtime exception has occured", rte);
-                ResponseStatus status =
-                        new ResponseStatus(
-                                StatusType.ERROR, ReasonType.INTERNAL_ERROR, rte.getMessage());
-                if (dsRequest == null) {
-                    dsRequest = DataSourceRequest.getDefaultDataSourceRequest(request);
-                }
-                DataSourceHelper.setServletErrorResponse(status, dsRequest, response);
-            } catch (DataSourceException e) {
-                if (dsRequest != null) {
-                    DataSourceHelper.setServletErrorResponse(e, dsRequest, response);
-                } else {
-                    DataSourceHelper.setServletErrorResponse(e, request, response);
-                }
-            }
-        }
-    }
-
-    private List<Key<TestRunEntity>> getTestRunEntityKeyList(
-            List<TestCoverageStatusEntity> testCoverageStatusEntityList) {
-        return testCoverageStatusEntityList.stream()
-                .map(
-                        testCoverageStatusEntity -> {
-                            com.googlecode.objectify.Key testKey =
-                                    com.googlecode.objectify.Key.create(
-                                            TestEntity.class,
-                                            testCoverageStatusEntity.getTestName());
-                            return com.googlecode.objectify.Key.create(
-                                    testKey,
-                                    TestRunEntity.class,
-                                    testCoverageStatusEntity.getUpdatedTimestamp());
-                        })
-                .collect(Collectors.toList());
-    }
-
-    private Predicate<DeviceInfoEntity> isBranchAndDevice(String branch, String device) {
-        return d -> d.getBranch().equals(branch) && d.getBuildFlavor().equals(device);
-    }
-
-    private Predicate<DeviceInfoEntity> isBranch(String branch) {
-        return d -> d.getBranch().equals(branch);
-    }
-
-    private Predicate<DeviceInfoEntity> isDevice(String device) {
-        return d -> d.getBuildFlavor().equals(device);
-    }
-
-    private RequestDispatcher getCoverageDispatcher(
-            HttpServletRequest request, HttpServletResponse response) {
-
-        String COVERAGE_OVERVIEW_JSP = "WEB-INF/jsp/show_coverage_overview.jsp";
-
-        RequestDispatcher dispatcher = null;
-        boolean unfiltered = request.getParameter("unfiltered") != null;
-        boolean showPresubmit = request.getParameter("showPresubmit") != null;
-        boolean showPostsubmit = request.getParameter("showPostsubmit") != null;
-
-        // If no params are specified, set to default of postsubmit-only.
-        if (!(showPresubmit || showPostsubmit)) {
-            showPostsubmit = true;
-        }
-
-        // If unfiltered, set showPre- and Post-submit to true for accurate UI.
-        if (unfiltered) {
-            showPostsubmit = true;
-            showPresubmit = true;
-        }
-
-        // Add test names to list
-        List<String> resultNames =
-                Arrays.stream(VtsReportMessage.TestCaseResult.values())
-                        .map(testCaseResult -> testCaseResult.name())
-                        .collect(Collectors.toList());
-
-        Map<String, String[]> parameterMap = request.getParameterMap();
-
-        List<TestCoverageStatusEntity> testCoverageStatusEntityList =
-                TestCoverageStatusEntity.getAllTestCoverage();
-
-        List<com.googlecode.objectify.Key<TestRunEntity>> testRunEntityKeyList = new ArrayList<>();
-
-        if (Objects.nonNull(parameterMap.get("branch"))
-                || Objects.nonNull(parameterMap.get("device"))) {
-            List<com.googlecode.objectify.Key<DeviceInfoEntity>> deviceInfoEntityKeyList =
-                    TestCoverageStatusEntity.getDeviceInfoEntityKeyList(
-                            testCoverageStatusEntityList);
-
-            Collection<DeviceInfoEntity> deviceInfoEntityMap =
-                    ofy().load().keys(() -> deviceInfoEntityKeyList.iterator()).values();
-
-            Stream<DeviceInfoEntity> deviceInfoEntityStream = Stream.empty();
-            if (Objects.nonNull(parameterMap.get("branch"))
-                    && Objects.nonNull(parameterMap.get("device"))) {
-                String branch = parameterMap.get("branch")[0];
-                String device = parameterMap.get("device")[0];
-                deviceInfoEntityStream =
-                        deviceInfoEntityMap.stream().filter(isBranchAndDevice(branch, device));
-            } else if (Objects.nonNull(parameterMap.get("branch"))) {
-                String branch = parameterMap.get("branch")[0];
-                deviceInfoEntityStream = deviceInfoEntityMap.stream().filter(isBranch(branch));
-            } else if (Objects.nonNull(parameterMap.get("device"))) {
-                String device = parameterMap.get("device")[0];
-                deviceInfoEntityStream = deviceInfoEntityMap.stream().filter(isDevice(device));
-            } else {
-                logger.log(Level.WARNING, "unmet search condition!");
-            }
-            testRunEntityKeyList =
-                    deviceInfoEntityStream
-                            .map(
-                                    deviceInfoEntity -> {
-                                        com.googlecode.objectify.Key testKey =
-                                                com.googlecode.objectify.Key.create(
-                                                        TestEntity.class,
-                                                        deviceInfoEntity
-                                                                .getParent()
-                                                                .getParent()
-                                                                .getName());
-                                        return com.googlecode.objectify.Key.create(
-                                                testKey,
-                                                TestRunEntity.class,
-                                                deviceInfoEntity.getParent().getId());
-                                    })
-                            .collect(Collectors.toList());
-            logger.log(Level.INFO, "testRunEntityKeyList size => " + testRunEntityKeyList.size());
-        } else {
-            testRunEntityKeyList = this.getTestRunEntityKeyList(testCoverageStatusEntityList);
-        }
-        Iterator<Key<TestRunEntity>> testRunEntityKeyIterator = testRunEntityKeyList.iterator();
-
-        Map<Key<TestRunEntity>, TestRunEntity> keyTestRunEntityMap =
-                ofy().load().keys(() -> testRunEntityKeyIterator);
-
-        List<com.googlecode.objectify.Key<CodeCoverageEntity>> codeCoverageEntityKeyList =
-                new ArrayList<>();
-        Map<Long, TestRunEntity> testRunEntityMap = new HashMap<>();
-        for (Map.Entry<com.googlecode.objectify.Key<TestRunEntity>, TestRunEntity> entry :
-                keyTestRunEntityMap.entrySet()) {
-            com.googlecode.objectify.Key codeCoverageEntityKey =
-                    com.googlecode.objectify.Key.create(
-                            entry.getKey(), CodeCoverageEntity.class, entry.getValue().getId());
-            codeCoverageEntityKeyList.add(codeCoverageEntityKey);
-            testRunEntityMap.put(entry.getValue().getId(), entry.getValue());
-        }
-
-        Map<com.googlecode.objectify.Key<CodeCoverageEntity>, CodeCoverageEntity>
-                keyCodeCoverageEntityMap =
-                        ofy().load().keys(() -> codeCoverageEntityKeyList.iterator());
-
-        Map<Long, CodeCoverageEntity> codeCoverageEntityMap = new HashMap<>();
-        for (Map.Entry<com.googlecode.objectify.Key<CodeCoverageEntity>, CodeCoverageEntity> entry :
-                keyCodeCoverageEntityMap.entrySet()) {
-            codeCoverageEntityMap.put(entry.getValue().getId(), entry.getValue());
-        }
-
-        int coveredLines = 0;
-        int uncoveredLines = 0;
-        int passCount = 0;
-        int failCount = 0;
-        for (Map.Entry<Long, CodeCoverageEntity> entry : codeCoverageEntityMap.entrySet()) {
-            TestRunEntity testRunEntity = testRunEntityMap.get(entry.getKey());
-
-            CodeCoverageEntity codeCoverageEntity = entry.getValue();
-
-            coveredLines += codeCoverageEntity.getCoveredLineCount();
-            uncoveredLines +=
-                    codeCoverageEntity.getTotalLineCount()
-                            - codeCoverageEntity.getCoveredLineCount();
-            passCount += testRunEntity.getPassCount();
-            failCount += testRunEntity.getFailCount();
-        }
-
-        FilterUtil.setAttributes(request, parameterMap);
-
-        int[] testStats = new int[VtsReportMessage.TestCaseResult.values().length];
-        testStats[VtsReportMessage.TestCaseResult.TEST_CASE_RESULT_PASS.getNumber()] = passCount;
-        testStats[VtsReportMessage.TestCaseResult.TEST_CASE_RESULT_FAIL.getNumber()] = failCount;
-
-        response.setStatus(HttpServletResponse.SC_OK);
-        request.setAttribute("resultNames", resultNames);
-        request.setAttribute("resultNamesJson", new Gson().toJson(resultNames));
-        request.setAttribute("testRunEntityList", testRunEntityMap.values());
-        request.setAttribute("codeCoverageEntityMap", codeCoverageEntityMap);
-        request.setAttribute("coveredLines", new Gson().toJson(coveredLines));
-        request.setAttribute("uncoveredLines", new Gson().toJson(uncoveredLines));
-        request.setAttribute("testStats", new Gson().toJson(testStats));
-
-        request.setAttribute("unfiltered", unfiltered);
-        request.setAttribute("showPresubmit", showPresubmit);
-        request.setAttribute("showPostsubmit", showPostsubmit);
-
-        request.setAttribute(
-                "deviceOptions",
-                TestCoverageStatusEntity.getDeviceSet(testCoverageStatusEntityList));
-        request.setAttribute(
-                "branchOptions",
-                TestCoverageStatusEntity.getBranchSet(testCoverageStatusEntityList));
-        dispatcher = request.getRequestDispatcher(COVERAGE_OVERVIEW_JSP);
-        return dispatcher;
-    }
-
-    private DataTable getCoverageDataTable(String testName) {
-
-        Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
-
-        DataTable dataTable = new DataTable();
-        ArrayList<ColumnDescription> cd = new ArrayList<>();
-        ColumnDescription startDate =
-                new ColumnDescription("startDate", ValueType.DATETIME, "Date");
-        startDate.setPattern("yyyy-MM-dd");
-        cd.add(startDate);
-        cd.add(
-                new ColumnDescription(
-                        "coveredLineCount", ValueType.NUMBER, "Covered Source Code Line Count"));
-        cd.add(
-                new ColumnDescription(
-                        "totalLineCount", ValueType.NUMBER, "Total Source Code Line Count"));
-        cd.add(new ColumnDescription("percentage", ValueType.NUMBER, "Coverage Ratio (%)"));
-
-        dataTable.addColumns(cd);
-
-        Calendar cal = Calendar.getInstance();
-        cal.add(Calendar.MONTH, -6);
-        Long startTime = cal.getTime().getTime() * 1000;
-        Long endTime = Calendar.getInstance().getTime().getTime() * 1000;
-
-        com.google.cloud.datastore.Key startKey =
-                datastore
-                        .newKeyFactory()
-                        .setKind(TestRunEntity.KIND)
-                        .addAncestors(
-                                PathElement.of(TestEntity.KIND, testName),
-                                PathElement.of(TestRunEntity.KIND, startTime))
-                        .newKey(startTime);
-
-        com.google.cloud.datastore.Key endKey =
-                datastore
-                        .newKeyFactory()
-                        .setKind(TestRunEntity.KIND)
-                        .addAncestors(
-                                PathElement.of(TestEntity.KIND, testName),
-                                PathElement.of(TestRunEntity.KIND, endTime))
-                        .newKey(endTime);
-
-        Filter codeCoverageFilter =
-                CompositeFilter.and(
-                        PropertyFilter.lt("__key__", endKey),
-                        PropertyFilter.gt("__key__", startKey));
-
-        List<CodeCoverageEntity> codeCoverageEntityList =
-                ofy().load()
-                        .type(CodeCoverageEntity.class)
-                        .filter(codeCoverageFilter)
-                        .limit(10)
-                        .list();
-
-        DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd");
-        Map<String, List<CodeCoverageEntity>> codeCoverageEntityListMap =
-                codeCoverageEntityList
-                        .stream()
-                        .collect(
-                                Collectors.groupingBy(
-                                        v -> dateTimeFormatter.print(v.getId() / 1000)));
-
-        codeCoverageEntityListMap.forEach(
-                (key, entityList) -> {
-                    GregorianCalendar gCal = new GregorianCalendar();
-                    gCal.setTimeZone(TimeZone.getTimeZone("GMT"));
-                    gCal.setTimeInMillis(entityList.get(0).getId() / 1000);
-
-                    Long sumCoveredLine =
-                            entityList.stream().mapToLong(val -> val.getCoveredLineCount()).sum();
-                    Long sumTotalLine =
-                            entityList.stream().mapToLong(val -> val.getTotalLineCount()).sum();
-                    float percentage = 0;
-                    if (sumTotalLine > 0) {
-                        BigDecimal coveredLineNum = new BigDecimal(sumCoveredLine);
-                        BigDecimal totalLineNum = new BigDecimal(sumTotalLine);
-                        BigDecimal totalPercent = new BigDecimal(100);
-                        percentage =
-                                coveredLineNum
-                                        .multiply(totalPercent)
-                                        .divide(totalLineNum, 2, RoundingMode.HALF_DOWN)
-                                        .floatValue();
-                    }
-
-                    TableRow tableRow = new TableRow();
-                    tableRow.addCell(new DateTimeValue(gCal));
-                    tableRow.addCell(new NumberValue(sumCoveredLine));
-                    tableRow.addCell(new NumberValue(sumTotalLine));
-                    tableRow.addCell(new NumberValue(percentage));
-                    try {
-                        dataTable.addRow(tableRow);
-                    } catch (TypeMismatchException e) {
-                        logger.log(Level.WARNING, "Invalid type! ");
-                    }
-                });
-
-        return dataTable;
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowCoverageServlet.java b/src/main/java/com/android/vts/servlet/ShowCoverageServlet.java
deleted file mode 100644
index 08e5db6..0000000
--- a/src/main/java/com/android/vts/servlet/ShowCoverageServlet.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.android.vts.entity.CoverageEntity;
-import com.android.vts.entity.RoleEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.entity.UserEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.gson.Gson;
-import com.googlecode.objectify.Ref;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Servlet for handling requests to show code coverage.
- */
-public class ShowCoverageServlet extends BaseServlet {
-
-  private static final String COVERAGE_JSP = "WEB-INF/jsp/show_coverage.jsp";
-  private static final String TREE_JSP = "WEB-INF/jsp/show_tree.jsp";
-
-  @Override
-  public PageType getNavParentType() {
-    return PageType.TOT;
-  }
-
-  @Override
-  public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-    List<Page> links = new ArrayList<>();
-    String testName = request.getParameter("testName");
-    links.add(new Page(PageType.TABLE, testName, "?testName=" + testName));
-
-    String startTime = request.getParameter("startTime");
-    links.add(new Page(PageType.COVERAGE, "?testName=" + testName + "&startTime=" + startTime));
-    return links;
-  }
-
-  @Override
-  public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-      throws IOException {
-    RequestDispatcher dispatcher = null;
-
-    String test = request.getParameter("testName");
-    String timeString = request.getParameter("startTime");
-
-    Boolean isModerator = false;
-    String currentUserEmail = request.getAttribute("email").toString();
-    Optional<UserEntity> userEntityOptional = Optional
-        .ofNullable(UserEntity.getUser(currentUserEmail));
-    if (userEntityOptional.isPresent()) {
-      Ref refRole = Ref.create(RoleEntity.getRole("coverage-moderator"));
-      isModerator = userEntityOptional.get().getRoles().contains(refRole);
-    }
-
-    // Process the time key requested
-    long time = -1;
-    try {
-      time = Long.parseLong(timeString);
-    } catch (NumberFormatException e) {
-      request.setAttribute("testName", test);
-      dispatcher = request.getRequestDispatcher(TREE_JSP);
-      return;
-    }
-
-    com.googlecode.objectify.Key testKey = com.googlecode.objectify.Key
-        .create(TestEntity.class, test);
-    com.googlecode.objectify.Key testRunKey = com.googlecode.objectify.Key
-        .create(testKey, TestRunEntity.class, time);
-
-    List<CoverageEntity> coverageEntityList = ofy().load().type(CoverageEntity.class)
-        .ancestor(testRunKey).list();
-
-    Collections.sort(coverageEntityList, CoverageEntity.isIgnoredComparator);
-
-    request.setAttribute("isModerator", isModerator);
-    request.setAttribute("testName", request.getParameter("testName"));
-    request.setAttribute("gerritURI", new Gson().toJson(GERRIT_URI));
-    request.setAttribute("gerritScope", new Gson().toJson(GERRIT_SCOPE));
-    request.setAttribute("clientId", new Gson().toJson(CLIENT_ID));
-    request.setAttribute("startTime", request.getParameter("startTime"));
-    request.setAttribute("coverageEntityList", coverageEntityList);
-
-    dispatcher = request.getRequestDispatcher(COVERAGE_JSP);
-    try {
-      dispatcher.forward(request, response);
-    } catch (ServletException e) {
-      logger.log(Level.SEVERE, "Servlet Exception caught : ", e);
-    }
-  }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java b/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java
deleted file mode 100644
index ad5e871..0000000
--- a/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.util.GcsHelper;
-import com.google.appengine.api.memcache.ErrorHandlers;
-import com.google.appengine.api.memcache.MemcacheService;
-import com.google.appengine.api.memcache.MemcacheServiceFactory;
-import com.google.auth.oauth2.ServiceAccountCredentials;
-import com.google.cloud.storage.Blob;
-import com.google.cloud.storage.Bucket;
-import com.google.cloud.storage.Storage;
-import com.google.cloud.storage.Storage.BlobListOption;
-import com.google.cloud.storage.StorageOptions;
-import com.google.gson.Gson;
-import org.apache.commons.io.IOUtils;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.logging.Level;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-/**
- * A GCS log servlet read log zip file from Google Cloud Storage bucket and show the content in it
- * from the zip file by unarchiving it
- */
-@SuppressWarnings("serial")
-public class ShowGcsLogServlet extends BaseServlet {
-
-    private static final String GCS_LOG_JSP = "WEB-INF/jsp/show_gcs_log.jsp";
-
-    /** Google Cloud Storage project's key file to access the storage */
-    private static String GCS_KEY_FILE;
-    /** Google Cloud Storage project's default bucket name for vtslab test result files */
-    private static String GCS_BUCKET_NAME;
-    /** Google Cloud Storage project's default bucket name for vtslab infra log files */
-    private static String GCS_INFRA_LOG_BUCKET_NAME;
-
-    /**
-     * This is the key file to access vtslab-gcs project. It will allow the dashboard to have a full
-     * control of the bucket.
-     */
-    private InputStream keyFileInputStream;
-
-    /** This is the instance of java google storage library */
-    private Storage storage;
-
-    /** This is the instance of App Engine memcache service java library */
-    private MemcacheService syncCache = MemcacheServiceFactory.getMemcacheService();
-
-    /** GCS Test Report Bucket instance */
-    private Bucket vtsReportBucket;
-
-    /** GCS Infra Log Bucket instance */
-    private Bucket vtsInfraLogBucket;
-
-    @Override
-    public void init(ServletConfig cfg) throws ServletException {
-        super.init(cfg);
-
-        GCS_KEY_FILE = systemConfigProp.getProperty("gcs.keyFile");
-        GCS_BUCKET_NAME = systemConfigProp.getProperty("gcs.bucketName");
-        GCS_INFRA_LOG_BUCKET_NAME = systemConfigProp.getProperty("gcs.infraLogBucketName");
-
-        String keyFilePath = "keys/" + GCS_KEY_FILE;
-
-        byte[] keyFileByteArray = new byte[0];
-        try {
-            keyFileByteArray =
-                    IOUtils.toByteArray(
-                            this.getClass().getClassLoader().getResourceAsStream(keyFilePath));
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        this.keyFileInputStream = new ByteArrayInputStream(keyFileByteArray);
-        InputStream vtsReportInputStream = new ByteArrayInputStream(keyFileByteArray);
-        InputStream vtsInfraInputStream = new ByteArrayInputStream(keyFileByteArray);
-
-        Optional<Storage> optionalVtsReportStorage = GcsHelper.getStorage(vtsReportInputStream);
-        if (optionalVtsReportStorage.isPresent()) {
-            this.storage = optionalVtsReportStorage.get();
-            this.vtsReportBucket = storage.get(GCS_BUCKET_NAME);
-        } else {
-            logger.log(Level.SEVERE, "Error on getting storage instance!");
-            throw new ServletException("Creating storage instance exception!");
-        }
-
-        Optional<Storage> optionalVtsInfraStorage = GcsHelper.getStorage(vtsInfraInputStream);
-        if (optionalVtsInfraStorage.isPresent()) {
-            this.storage = optionalVtsInfraStorage.get();
-            this.vtsInfraLogBucket = storage.get(GCS_INFRA_LOG_BUCKET_NAME);
-        } else {
-            logger.log(Level.SEVERE, "Error on getting storage instance!");
-            throw new ServletException("Creating storage instance exception!");
-        }
-        syncCache.setErrorHandler(ErrorHandlers.getConsistentLogAndContinue(Level.INFO));
-    }
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.TOT;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        return null;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        if (keyFileInputStream == null) {
-            request.setAttribute("error_title", "GCS Key file Error");
-            request.setAttribute("error_message", "The GCS Key file is not existed!");
-            RequestDispatcher dispatcher = request.getRequestDispatcher(ERROR_MESSAGE_JSP);
-            try {
-                dispatcher.forward(request, response);
-            } catch (ServletException e) {
-                logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-            }
-        } else {
-            String pathInfo = request.getPathInfo();
-            if (Objects.nonNull(pathInfo)) {
-                if (pathInfo.equalsIgnoreCase("/download")) {
-                    downloadHandler(request, response);
-                } else {
-                    logger.log(Level.INFO, "Path Info => " + pathInfo);
-                    logger.log(Level.WARNING, "Unknown path access!");
-                }
-            } else {
-                defaultHandler(request, response);
-            }
-        }
-    }
-
-    private void downloadHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        String file = request.getParameter("file") == null ? "/" : request.getParameter("file");
-        Path filePathInfo = Paths.get(file);
-
-        Blob blobFile = vtsInfraLogBucket.get(filePathInfo.toString());
-
-        if (blobFile.exists()) {
-            response.setContentType("application/octet-stream");
-            response.setContentLength(blobFile.getSize().intValue());
-            response.setHeader(
-                    "Content-Disposition",
-                    "attachment; filename=\"" + filePathInfo.getFileName() + "\"");
-
-            response.getOutputStream().write(blobFile.getContent());
-        } else {
-            request.setAttribute("error_title", "Infra Log File Not Found");
-            request.setAttribute("error_message", "Please contact the administrator!");
-            RequestDispatcher dispatcher = request.getRequestDispatcher(ERROR_MESSAGE_JSP);
-            try {
-                dispatcher.forward(request, response);
-            } catch (ServletException e) {
-                logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-            }
-        }
-    }
-
-    private void defaultHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-
-        String action =
-                request.getParameter("action") == null ? "read" : request.getParameter("action");
-        String path = request.getParameter("path") == null ? "/" : request.getParameter("path");
-        String entry = request.getParameter("entry") == null ? "" : request.getParameter("entry");
-        Path pathInfo = Paths.get(path);
-
-        List<String> dirList = new ArrayList<>();
-        List<String> fileList = new ArrayList<>();
-        List<String> entryList = new ArrayList<>();
-        Map<String, Object> resultMap = new HashMap<>();
-        String entryContent = "";
-
-        if (pathInfo.toString().endsWith(".zip")) {
-
-            Blob blobFile = (Blob) this.syncCache.get(path.toString());
-            if (blobFile == null) {
-                blobFile = vtsReportBucket.get(path);
-                this.syncCache.put(path.toString(), blobFile);
-            }
-
-            if (action.equalsIgnoreCase("read")) {
-                InputStream blobInputStream = new ByteArrayInputStream(blobFile.getContent());
-                ZipInputStream zipInputStream = new ZipInputStream(blobInputStream);
-
-                ZipEntry zipEntry;
-                while ((zipEntry = zipInputStream.getNextEntry()) != null) {
-                    if (zipEntry.isDirectory()) {
-
-                    } else {
-                        if (entry.length() > 0) {
-                            logger.log(Level.INFO, "param entry => " + entry);
-                            if (zipEntry.getName().equals(entry)) {
-                                logger.log(Level.INFO, "matched !!!! " + zipEntry.getName());
-                                entryContent =
-                                        IOUtils.toString(
-                                                zipInputStream, StandardCharsets.UTF_8.name());
-                            }
-                        } else {
-                            entryList.add(zipEntry.getName());
-                        }
-                    }
-                }
-                resultMap.put("entryList", entryList);
-                resultMap.put("entryContent", entryContent);
-
-                String json = new Gson().toJson(resultMap);
-                response.setContentType("application/json");
-                response.setCharacterEncoding("UTF-8");
-                response.getWriter().write(json);
-            } else {
-                response.setContentType("application/octet-stream");
-                response.setContentLength(blobFile.getSize().intValue());
-                response.setHeader(
-                        "Content-Disposition",
-                        "attachment; filename=\"" + pathInfo.getFileName() + "\"");
-
-                response.getOutputStream().write(blobFile.getContent());
-            }
-
-        } else {
-
-            logger.log(Level.INFO, "path info => " + pathInfo);
-            logger.log(Level.INFO, "path name count => " + pathInfo.getNameCount());
-
-            BlobListOption[] listOptions;
-            if (pathInfo.getNameCount() == 0) {
-                listOptions = new BlobListOption[] {BlobListOption.currentDirectory()};
-            } else {
-                String prefixPathString = path.endsWith("/") ? path : path.concat("/");
-                if (pathInfo.getNameCount() <= 1) {
-                    dirList.add("/");
-                } else {
-                    dirList.add(getParentDirPath(prefixPathString));
-                }
-
-                listOptions =
-                        new BlobListOption[] {
-                            BlobListOption.currentDirectory(),
-                            BlobListOption.prefix(prefixPathString)
-                        };
-            }
-
-            Iterable<Blob> blobIterable = vtsReportBucket.list(listOptions).iterateAll();
-            Iterator<Blob> blobIterator = blobIterable.iterator();
-            while (blobIterator.hasNext()) {
-                Blob blob = blobIterator.next();
-                logger.log(Level.INFO, "blob name => " + blob);
-                if (blob.isDirectory()) {
-                    logger.log(Level.INFO, "directory name => " + blob.getName());
-                    dirList.add(blob.getName());
-                } else {
-                    logger.log(Level.INFO, "file name => " + blob.getName());
-                    fileList.add(Paths.get(blob.getName()).getFileName().toString());
-                }
-            }
-
-            response.setStatus(HttpServletResponse.SC_OK);
-            request.setAttribute("entryList", entryList);
-            request.setAttribute("dirList", dirList);
-            request.setAttribute("fileList", fileList);
-            request.setAttribute("path", path);
-            RequestDispatcher dispatcher = request.getRequestDispatcher(GCS_LOG_JSP);
-            try {
-                dispatcher.forward(request, response);
-            } catch (ServletException e) {
-                logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-            }
-        }
-    }
-
-    private String getParentDirPath(String fileOrDirPath) {
-        boolean endsWithSlashCheck = fileOrDirPath.endsWith(File.separator);
-        return fileOrDirPath.substring(
-                0,
-                fileOrDirPath.lastIndexOf(
-                        File.separatorChar,
-                        endsWithSlashCheck
-                                ? fileOrDirPath.length() - 2
-                                : fileOrDirPath.length() - 1));
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowGraphServlet.java b/src/main/java/com/android/vts/servlet/ShowGraphServlet.java
deleted file mode 100644
index 22b7098..0000000
--- a/src/main/java/com/android/vts/servlet/ShowGraphServlet.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.FilterUtil;
-import com.android.vts.util.Graph;
-import com.android.vts.util.GraphSerializer;
-import com.android.vts.util.Histogram;
-import com.android.vts.util.LineGraph;
-import com.android.vts.util.PerformanceUtil;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
-
-/** Servlet for handling requests to load graphs. */
-public class ShowGraphServlet extends BaseServlet {
-    private static final String GRAPH_JSP = "WEB-INF/jsp/show_graph.jsp";
-    private static final long DEFAULT_FILTER_OPTION = -1;
-
-    private static final String HIDL_HAL_OPTION = "hidl_hal_mode";
-    private static final String[] splitKeysArray = new String[] {HIDL_HAL_OPTION};
-    private static final Set<String> splitKeySet = new HashSet<>(Arrays.asList(splitKeysArray));
-    private static final String PROFILING_DATA_ALERT = "No profiling data was found.";
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.TOT;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        List<Page> links = new ArrayList<>();
-        String testName = request.getParameter("testName");
-        links.add(new Page(PageType.TABLE, testName, "?testName=" + testName));
-
-        String profilingPointName = request.getParameter("profilingPoint");
-        links.add(
-                new Page(
-                        PageType.GRAPH,
-                        "?testName=" + testName + "&profilingPoint=" + profilingPointName));
-        return links;
-    }
-
-    /**
-     * Process a profiling report message and add it to the map of graphs.
-     *
-     * @param profilingRun The Entity of a profiling point run to process.
-     * @param idString The ID derived from the test run to identify the profiling report.
-     * @param graphMap A map from graph name to Graph object.
-     */
-    private static void processProfilingRun(
-            Entity profilingRun, String idString, Map<String, Graph> graphMap) {
-        ProfilingPointRunEntity pt = ProfilingPointRunEntity.fromEntity(profilingRun);
-        if (pt == null) return;
-        String name = PerformanceUtil.getOptionAlias(pt, splitKeySet);
-        Graph g = null;
-        if (pt.getLabels() != null && pt.getLabels().size() == pt.getValues().size()) {
-            g = new LineGraph(name);
-        } else if (pt.getLabels() == null && pt.getValues().size() > 0) {
-            g = new Histogram(name);
-        } else {
-            return;
-        }
-        if (!graphMap.containsKey(name)) {
-            graphMap.put(name, g);
-        }
-        graphMap.get(name).addData(idString, pt);
-    }
-
-    /**
-     * Get a summary string describing the devices in the test run.
-     *
-     * @param devices The list of device descriptors for a particular test run.
-     * @return A string describing the devices in the test run.
-     */
-    private static String getDeviceSummary(List<DeviceInfoEntity> devices) {
-        if (devices == null) return null;
-        List<String> buildInfos = new ArrayList<>();
-        for (DeviceInfoEntity device : devices) {
-            buildInfos.add(device.getProduct() + " (" + device.getBuildId() + ")");
-        }
-        return StringUtils.join(buildInfos, ", ");
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        RequestDispatcher dispatcher = null;
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        String testName = request.getParameter("testName");
-        String profilingPointName = request.getParameter("profilingPoint");
-        String selectedDevice = request.getParameter("device");
-        Long endTime = null;
-        if (request.getParameter("endTime") != null) {
-            String time = request.getParameter("endTime");
-            try {
-                endTime = Long.parseLong(time);
-            } catch (NumberFormatException e) {
-            }
-        }
-        if (endTime == null) {
-            endTime = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        }
-        Long startTime = endTime - TimeUnit.DAYS.toMicros(1);
-
-        // Set of device names
-        List<String> devices = DatastoreHelper.getAllBuildFlavors();
-        if (!devices.contains(selectedDevice)) selectedDevice = null;
-
-        Map<String, Graph> graphMap = new HashMap<>();
-
-        // Create a query for test runs matching the time window filter
-        Key parentKey = KeyFactory.createKey(TestEntity.KIND, testName);
-        Filter timeFilter =
-                FilterUtil.getTimeFilter(parentKey, TestRunEntity.KIND, startTime, endTime);
-        Query testRunQuery =
-                new Query(TestRunEntity.KIND)
-                        .setAncestor(parentKey)
-                        .setFilter(timeFilter)
-                        .setKeysOnly();
-
-        // Process the test runs in the query
-        List<Key> gets = new ArrayList<>();
-        for (Entity testRun :
-                datastore
-                        .prepare(testRunQuery)
-                        .asIterable(DatastoreHelper.getLargeBatchOptions())) {
-            gets.add(
-                    KeyFactory.createKey(
-                            testRun.getKey(), ProfilingPointRunEntity.KIND, profilingPointName));
-        }
-        Map<Key, Entity> profilingPoints = datastore.get(gets);
-        Map<Key, Entity> testRunProfiling = new HashMap<>();
-        for (Key key : profilingPoints.keySet()) {
-            testRunProfiling.put(key.getParent(), profilingPoints.get(key));
-        }
-
-        Filter deviceFilter =
-                FilterUtil.getDeviceTimeFilter(parentKey, TestRunEntity.KIND, startTime, endTime);
-        if (selectedDevice != null) {
-            deviceFilter =
-                    Query.CompositeFilterOperator.and(
-                            deviceFilter,
-                            new Query.FilterPredicate(
-                                    DeviceInfoEntity.BUILD_FLAVOR,
-                                    Query.FilterOperator.EQUAL,
-                                    selectedDevice));
-        }
-        Query deviceQuery =
-                new Query(DeviceInfoEntity.KIND)
-                        .setAncestor(parentKey)
-                        .setFilter(deviceFilter)
-                        .setKeysOnly();
-        gets = new ArrayList<>();
-        for (Entity device :
-                datastore.prepare(deviceQuery).asIterable(DatastoreHelper.getLargeBatchOptions())) {
-            if (testRunProfiling.containsKey(device.getParent())) {
-                gets.add(device.getKey());
-            }
-        }
-
-        Map<Key, Entity> deviceInfos = datastore.get(gets);
-        Map<Key, List<DeviceInfoEntity>> testRunDevices = new HashMap<>();
-        for (Key deviceKey : deviceInfos.keySet()) {
-            if (!testRunDevices.containsKey(deviceKey.getParent())) {
-                testRunDevices.put(deviceKey.getParent(), new ArrayList<DeviceInfoEntity>());
-            }
-            DeviceInfoEntity device = DeviceInfoEntity.fromEntity(deviceInfos.get(deviceKey));
-            if (device == null) continue;
-            testRunDevices.get(deviceKey.getParent()).add(device);
-        }
-
-        for (Key runKey : testRunProfiling.keySet()) {
-            String idString = getDeviceSummary(testRunDevices.get(runKey));
-            if (idString != null) {
-                processProfilingRun(testRunProfiling.get(runKey), idString, graphMap);
-            }
-        }
-
-        // Get the names of the graphs to render
-        String[] names = graphMap.keySet().toArray(new String[graphMap.size()]);
-        Arrays.sort(names);
-
-        List<Graph> graphList = new ArrayList<>();
-        boolean hasHistogram = false;
-        for (String name : names) {
-            Graph g = graphMap.get(name);
-            if (g.size() > 0) {
-                graphList.add(g);
-                if (g instanceof Histogram) hasHistogram = true;
-            }
-        }
-
-        String filterVal = request.getParameter("filterVal");
-        try {
-            Long.parseLong(filterVal);
-        } catch (NumberFormatException e) {
-            filterVal = Long.toString(DEFAULT_FILTER_OPTION);
-        }
-        request.setAttribute("testName", request.getParameter("testName"));
-        request.setAttribute("filterVal", filterVal);
-        request.setAttribute("endTime", new Gson().toJson(endTime));
-        request.setAttribute("devices", devices);
-        request.setAttribute("selectedDevice", selectedDevice);
-        request.setAttribute("showFilterDropdown", hasHistogram);
-        if (graphList.size() == 0) request.setAttribute("error", PROFILING_DATA_ALERT);
-
-        Gson gson =
-                new GsonBuilder()
-                        .registerTypeHierarchyAdapter(Graph.class, new GraphSerializer())
-                        .create();
-        request.setAttribute("graphs", gson.toJson(graphList));
-
-        request.setAttribute("profilingPointName", profilingPointName);
-        dispatcher = request.getRequestDispatcher(GRAPH_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java b/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java
deleted file mode 100644
index 7fad9a2..0000000
--- a/src/main/java/com/android/vts/servlet/ShowGreenReleaseServlet.java
+++ /dev/null
@@ -1,502 +0,0 @@
-/*
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestSuiteResultEntity;
-import com.android.vts.util.FilterUtil;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.PropertyProjection;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-import java.util.logging.Level;
-import java.util.stream.Collectors;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-public class ShowGreenReleaseServlet extends BaseServlet {
-    private static final int MAX_RUNS_PER_PAGE = 9999;
-
-    /** Helper class for displaying each device build info on the green build page. */
-    public class DeviceBuildInfo implements Comparable<DeviceBuildInfo>, Cloneable {
-
-        /** Device model name ex) marlin, walleye */
-        private String deviceBuildTarget;
-        /** Candidate Build ID */
-        private String candidateBuildId;
-        /** Candidate Build ID Timestamp for url parameter */
-        private Long candidateBuildIdTimestamp;
-        /** Green Build ID */
-        private String greenBuildId;
-        /** Green Build ID Timestamp for url parameter */
-        private Long greenBuildIdTimestamp;
-
-        /**
-         * Device Build Info constructor.
-         *
-         * @param deviceBuildTarget The key of the test.
-         * @param candidateBuildId The number of tests failing.
-         */
-        public DeviceBuildInfo(String deviceBuildTarget, String candidateBuildId) {
-            this.deviceBuildTarget = deviceBuildTarget;
-            this.candidateBuildId = candidateBuildId;
-            this.candidateBuildIdTimestamp = 0L;
-            this.greenBuildId = "N/A";
-            this.greenBuildIdTimestamp = 0L;
-        }
-
-        /**
-         * Get the device name.
-         *
-         * @return The device name.
-         */
-        public String getDeviceBuildTarget() {
-            return this.deviceBuildTarget;
-        }
-
-        /**
-         * Get the candidate build ID.
-         *
-         * @return The candidate build ID.
-         */
-        public String getCandidateBuildId() {
-            return this.candidateBuildId;
-        }
-
-        /** Set the candidate build ID. */
-        public void setCandidateBuildId(String candidateBuildId) {
-            this.candidateBuildId = candidateBuildId;
-        }
-
-        /**
-         * Get the candidate build ID timestamp.
-         *
-         * @return The candidate build ID timestamp.
-         */
-        public Long getCandidateBuildIdTimestamp() {
-            return this.candidateBuildIdTimestamp;
-        }
-
-        /** Set the candidate build ID timestamp. */
-        public void setCandidateBuildIdTimestamp(Long candidateBuildIdTimestamp) {
-            this.candidateBuildIdTimestamp = candidateBuildIdTimestamp;
-        }
-
-        /**
-         * Get the green build ID.
-         *
-         * @return The green build ID.
-         */
-        public String getGreenBuildId() {
-            return this.greenBuildId;
-        }
-
-        /** Set the green build ID. */
-        public void setGreenBuildId(String greenBuildId) {
-            this.greenBuildId = greenBuildId;
-        }
-
-        /**
-         * Get the candidate build ID timestamp.
-         *
-         * @return The candidate build ID timestamp.
-         */
-        public Long getGreenBuildIdTimestamp() {
-            return this.greenBuildIdTimestamp;
-        }
-
-        /** Set the candidate build ID timestamp. */
-        public void setGreenBuildIdTimestamp(Long greenBuildIdTimestamp) {
-            this.greenBuildIdTimestamp = greenBuildIdTimestamp;
-        }
-
-        @Override
-        public int compareTo(DeviceBuildInfo deviceBuildInfo) {
-            return this.deviceBuildTarget.compareTo(deviceBuildInfo.getDeviceBuildTarget());
-        }
-
-        @Override
-        protected Object clone() throws CloneNotSupportedException {
-            return super.clone();
-        }
-    }
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.RELEASE;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        List<Page> links = new ArrayList<>();
-        String planName = request.getParameter("plan");
-        links.add(new Page(PageType.PLAN_RELEASE, planName, "?plan=" + planName));
-        return links;
-    }
-
-    // This function will build and return basic parameter HashMap based on parameter information
-    // and
-    // this value will also be used on green build page to show the basic structure.
-    private Map<String, List<DeviceBuildInfo>> getBasicParamMap(Map<String, List<String>> param) {
-        Map<String, List<DeviceBuildInfo>> basicParamMap = new HashMap<>();
-        param.forEach(
-                (branch, buildTargetList) -> {
-                    List<DeviceBuildInfo> deviceBuildTargetList = new ArrayList<>();
-                    buildTargetList.forEach(
-                            buildTargetName -> {
-                                deviceBuildTargetList.add(
-                                        new DeviceBuildInfo(buildTargetName, "N/A"));
-                            });
-                    basicParamMap.put(branch, deviceBuildTargetList);
-                });
-        return basicParamMap;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-
-        String testType =
-                request.getParameter("type") == null ? "plan" : request.getParameter("type");
-
-        RequestDispatcher dispatcher;
-        if (testType.equalsIgnoreCase("plan")) {
-            dispatcher = this.getTestPlanDispatcher(request, response);
-        } else {
-            dispatcher = this.getTestSuiteDispatcher(request, response);
-        }
-
-        try {
-            request.setAttribute("testType", testType);
-            response.setStatus(HttpServletResponse.SC_OK);
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : ", e);
-        }
-    }
-
-    private RequestDispatcher getTestPlanDispatcher(
-            HttpServletRequest request, HttpServletResponse response) {
-        String GREEN_RELEASE_JSP = "WEB-INF/jsp/show_green_plan_release.jsp";
-
-        String testPlan = request.getParameter("plan");
-
-        Calendar cal = Calendar.getInstance();
-        cal.add(Calendar.DATE, -7);
-        Long startTime = cal.getTime().getTime() * 1000;
-        Long endTime = Calendar.getInstance().getTime().getTime() * 1000;
-
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        Query deviceInfoQuery =
-                new Query(DeviceInfoEntity.KIND)
-                        .setAncestor(KeyFactory.createKey(TestPlanEntity.KIND, testPlan))
-                        .addProjection(
-                                new PropertyProjection(DeviceInfoEntity.BRANCH, String.class))
-                        .addProjection(
-                                new PropertyProjection(DeviceInfoEntity.BUILD_FLAVOR, String.class))
-                        .setDistinct(true);
-
-        Map<String, List<String>> paramInfoMap = new HashMap<>();
-        for (Entity entity : datastore.prepare(deviceInfoQuery).asIterable()) {
-            String branch = entity.getProperty(DeviceInfoEntity.BRANCH).toString();
-            String target = entity.getProperty(DeviceInfoEntity.BUILD_FLAVOR).toString();
-            if (paramInfoMap.containsKey(branch)) {
-                paramInfoMap.get(branch).add(target);
-            } else {
-                paramInfoMap.put(branch, new LinkedList<>(Arrays.asList(target)));
-            }
-        }
-
-        Map<String, List<DeviceBuildInfo>> baseParamMap = getBasicParamMap(paramInfoMap);
-        baseParamMap.forEach(
-                (branchKey, deviceBuildInfoList) -> {
-                    List<List<String>> allPassIdLists = new ArrayList<>();
-                    Map<String, List<TestPlanRunEntity>> allTestPlanRunEntityMap = new HashMap<>();
-                    deviceBuildInfoList.forEach(
-                            deviceBuildInfo -> {
-                                Map<String, String[]> paramMap =
-                                        new HashMap<String, String[]>() {
-                                            {
-                                                put("branch", new String[] {branchKey});
-                                                put(
-                                                        "device",
-                                                        new String[] {
-                                                            deviceBuildInfo.getDeviceBuildTarget()
-                                                        });
-                                            }
-                                        };
-
-                                SortDirection dir = SortDirection.DESCENDING;
-
-                                boolean unfiltered = false;
-                                boolean showPresubmit = false;
-                                boolean showPostsubmit = true;
-                                Filter typeFilter =
-                                        FilterUtil.getTestTypeFilter(
-                                                showPresubmit, showPostsubmit, unfiltered);
-                                Key testPlanKey =
-                                        KeyFactory.createKey(TestPlanEntity.KIND, testPlan);
-                                Filter testPlanRunFilter =
-                                        FilterUtil.getTimeFilter(
-                                                testPlanKey,
-                                                TestPlanRunEntity.KIND,
-                                                startTime,
-                                                endTime,
-                                                typeFilter);
-
-                                List<Filter> userTestFilters =
-                                        FilterUtil.getUserTestFilters(paramMap);
-                                userTestFilters.add(0, testPlanRunFilter);
-                                Filter userDeviceFilter = FilterUtil.getUserDeviceFilter(paramMap);
-
-                                List<Key> matchingKeyList =
-                                        FilterUtil.getMatchingKeys(
-                                                testPlanKey,
-                                                TestPlanRunEntity.KIND,
-                                                userTestFilters,
-                                                userDeviceFilter,
-                                                dir,
-                                                MAX_RUNS_PER_PAGE);
-
-                                logger.log(
-                                        Level.INFO,
-                                        "the number of matching key => " + matchingKeyList.size());
-                                if (matchingKeyList.size() > 0) {
-                                    Map<Key, Entity> entityMap = datastore.get(matchingKeyList);
-
-                                    List<TestPlanRunEntity> testPlanRunEntityList =
-                                            entityMap
-                                                    .values()
-                                                    .stream()
-                                                    .map(
-                                                            entity ->
-                                                                    TestPlanRunEntity.fromEntity(
-                                                                            entity))
-                                                    .collect(Collectors.toList());
-
-                                    allTestPlanRunEntityMap.put(
-                                            branchKey
-                                                    + "-"
-                                                    + deviceBuildInfo.getDeviceBuildTarget(),
-                                            testPlanRunEntityList);
-
-                                    // The passBuildIdList containing all passed buildId List for
-                                    // device
-                                    List<String> passBuildIdList =
-                                            testPlanRunEntityList
-                                                    .stream()
-                                                    .filter(entity -> entity.getFailCount() == 0L)
-                                                    .map(entity -> entity.getTestBuildId())
-                                                    .collect(Collectors.toList());
-                                    allPassIdLists.add(passBuildIdList);
-                                    logger.log(Level.INFO, "passBuildIdList => " + passBuildIdList);
-
-                                    // The logic for candidate build ID is starting from here
-                                    Comparator<TestPlanRunEntity> byPassing =
-                                            Comparator.comparingLong(
-                                                    elemFirst -> elemFirst.getPassCount());
-
-                                    Comparator<TestPlanRunEntity> byNonPassing =
-                                            Comparator.comparingLong(
-                                                    elemFirst -> elemFirst.getFailCount());
-
-                                    // This will get the TestPlanRunEntity having maximum number of
-                                    // passing and minimum number of fail
-                                    Optional<TestPlanRunEntity> testPlanRunEntity =
-                                            testPlanRunEntityList
-                                                    .stream()
-                                                    .sorted(
-                                                            byPassing
-                                                                    .reversed()
-                                                                    .thenComparing(byNonPassing))
-                                                    .findFirst();
-
-                                    String buildId =
-                                            testPlanRunEntity
-                                                    .map(entity -> entity.getTestBuildId())
-                                                    .orElse("");
-                                    deviceBuildInfo.setCandidateBuildId(buildId);
-                                    Long buildIdTimestamp =
-                                            testPlanRunEntity
-                                                    .map(
-                                                            entity -> {
-                                                                return entity.getStartTimestamp();
-                                                            })
-                                                    .orElse(0L);
-                                    deviceBuildInfo.setCandidateBuildIdTimestamp(buildIdTimestamp);
-                                } else {
-                                    allPassIdLists.add(new ArrayList<>());
-                                    deviceBuildInfo.setCandidateBuildId("No Test Results");
-                                }
-                            });
-                    Set<String> greenBuildIdList = FilterUtil.getCommonElements(allPassIdLists);
-                    if (greenBuildIdList.size() > 0) {
-                        String greenBuildId = greenBuildIdList.iterator().next();
-                        deviceBuildInfoList.forEach(
-                                deviceBuildInfo -> {
-                                    // This is to get the timestamp for greenBuildId
-                                    Optional<TestPlanRunEntity> testPlanRunEntity =
-                                            allTestPlanRunEntityMap
-                                                    .get(
-                                                            branchKey
-                                                                    + "-"
-                                                                    + deviceBuildInfo
-                                                                            .getDeviceBuildTarget())
-                                                    .stream()
-                                                    .filter(
-                                                            entity ->
-                                                                    entity.getFailCount() == 0L
-                                                                            && entity.getTestBuildId()
-                                                                                    .equalsIgnoreCase(
-                                                                                            greenBuildId))
-                                                    .findFirst();
-                                    // Setting the greenBuildId value and timestamp to
-                                    // deviceBuildInfo object
-                                    deviceBuildInfo.setGreenBuildId(greenBuildId);
-                                    Long buildIdTimestamp =
-                                            testPlanRunEntity
-                                                    .map(entity -> entity.getStartTimestamp())
-                                                    .orElse(0L);
-                                    deviceBuildInfo.setGreenBuildIdTimestamp(buildIdTimestamp);
-                                });
-                    }
-                });
-
-        request.setAttribute("plan", request.getParameter("plan"));
-        request.setAttribute("greenBuildInfo", baseParamMap);
-        RequestDispatcher dispatcher = request.getRequestDispatcher(GREEN_RELEASE_JSP);
-        return dispatcher;
-    }
-
-    private RequestDispatcher getTestSuiteDispatcher(
-            HttpServletRequest request, HttpServletResponse response) {
-        String GREEN_RELEASE_JSP = "WEB-INF/jsp/show_green_suite_release.jsp";
-
-        String testPlan = request.getParameter("plan");
-
-        List<TestSuiteResultEntity> branchTargetInfoList =
-                ofy().load()
-                        .type(TestSuiteResultEntity.class)
-                        .filter("suitePlan", testPlan)
-                        .project("branch")
-                        .distinct(true)
-                        .project("target")
-                        .distinct(true)
-                        .list();
-
-        Map<String, List<String>> paramInfoMap = new HashMap<>();
-        for (TestSuiteResultEntity testSuiteResultEntity : branchTargetInfoList) {
-            String branch = testSuiteResultEntity.getBranch();
-            String target = testSuiteResultEntity.getTarget();
-            if (paramInfoMap.containsKey(branch)) {
-                paramInfoMap.get(branch).add(target);
-            } else {
-                paramInfoMap.put(branch, new LinkedList<>(Arrays.asList(target)));
-            }
-        }
-
-        Calendar cal = Calendar.getInstance();
-        cal.add(Calendar.DATE, -7);
-        Long oneWeekAgoTimestamp = cal.getTime().getTime() * 1000;
-
-        Map<String, List<DeviceBuildInfo>> baseParamMap = getBasicParamMap(paramInfoMap);
-        baseParamMap.forEach(
-                (branchKey, deviceBuildInfoList) -> {
-                    List<List<String>> allPassIdLists = new ArrayList<>();
-
-                    deviceBuildInfoList.forEach(
-                            deviceBuildInfo -> {
-                                List<String> passBuildIdList =
-                                        ofy().load()
-                                                .type(TestSuiteResultEntity.class)
-                                                .filter("suitePlan", testPlan)
-                                                .filter("branch", branchKey)
-                                                .filter(
-                                                        "target",
-                                                        deviceBuildInfo.getDeviceBuildTarget())
-                                                .filter("failedTestCaseCount", 0)
-                                                .filterKey(
-                                                        ">=",
-                                                        com.googlecode.objectify.Key.create(
-                                                                TestSuiteResultEntity.class,
-                                                                oneWeekAgoTimestamp))
-                                                .project("buildId")
-                                                .list()
-                                                .stream()
-                                                .map(entity -> entity.getBuildId())
-                                                .collect(Collectors.toList());
-                                allPassIdLists.add(passBuildIdList);
-
-                                TestSuiteResultEntity candidateIdEntity =
-                                        ofy().load()
-                                                .type(TestSuiteResultEntity.class)
-                                                .filter("suitePlan", testPlan)
-                                                .filter("branch", branchKey)
-                                                .filter(
-                                                        "target",
-                                                        deviceBuildInfo.getDeviceBuildTarget())
-                                                .filterKey(
-                                                        ">=",
-                                                        com.googlecode.objectify.Key.create(
-                                                                TestSuiteResultEntity.class,
-                                                                oneWeekAgoTimestamp))
-                                                .project("buildId")
-                                                .order("__key__")
-                                                .order("-passedTestCaseRatio")
-                                                .first()
-                                                .now();
-                                if (candidateIdEntity == null) {
-                                    deviceBuildInfo.setCandidateBuildId("N/A");
-                                } else {
-                                    deviceBuildInfo.setCandidateBuildId(
-                                            candidateIdEntity.getBuildId());
-                                }
-                            });
-                });
-
-        request.setAttribute("plan", request.getParameter("plan"));
-        request.setAttribute("greenBuildInfo", baseParamMap);
-        RequestDispatcher dispatcher = request.getRequestDispatcher(GREEN_RELEASE_JSP);
-        return dispatcher;
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowPerformanceDigestServlet.java b/src/main/java/com/android/vts/servlet/ShowPerformanceDigestServlet.java
deleted file mode 100644
index 5a70738..0000000
--- a/src/main/java/com/android/vts/servlet/ShowPerformanceDigestServlet.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.PerformanceSummary;
-import com.android.vts.util.PerformanceUtil;
-import com.android.vts.util.ProfilingPointSummary;
-import com.android.vts.util.StatSummary;
-import java.io.IOException;
-import java.math.RoundingMode;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for producing tabular performance summaries. */
-public class ShowPerformanceDigestServlet extends BaseServlet {
-    private static final String PERF_DIGEST_JSP = "WEB-INF/jsp/show_performance_digest.jsp";
-
-    private static final String MEAN = "Mean";
-    private static final String MIN = "Min";
-    private static final String MAX = "Max";
-    private static final String MEAN_DELTA = "&Delta;Mean (%)";
-    private static final String HIGHER_IS_BETTER =
-            "Note: Higher values are better. Maximum is the best-case performance.";
-    private static final String LOWER_IS_BETTER =
-            "Note: Lower values are better. Minimum is the best-case performance.";
-    private static final String STD = "Std";
-
-    private static final DecimalFormat FORMATTER;
-
-    /** Initialize the decimal formatter. */
-    static {
-        FORMATTER = new DecimalFormat("#.##");
-        FORMATTER.setRoundingMode(RoundingMode.HALF_UP);
-    }
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.TOT;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        List<Page> links = new ArrayList<>();
-        String testName = request.getParameter("testName");
-        links.add(new Page(PageType.TABLE, testName, "?testName=" + testName));
-        links.add(new Page(PageType.PERFORMANCE_DIGEST, "?testName=" + testName));
-        return links;
-    }
-
-    /**
-     * Generates an HTML summary of the performance changes for the profiling results in the
-     * specified table.
-     *
-     * <p>Retrieves the past 24 hours of profiling data and compares it to the 24 hours that
-     * preceded it. Creates a table representation of the mean and standard deviation for each
-     * profiling point. When performance degrades, the cell is shaded red.
-     *
-     * @param profilingPoint The name of the profiling point to summarize.
-     * @param testSummary The ProfilingPointSummary object to compare against.
-     * @param perfSummaries List of PerformanceSummary objects for each profiling run (in reverse
-     *     chronological order).
-     * @param sectionLabels HTML string for the section labels (i.e. for each time interval).
-     * @returns An HTML string for a table comparing the profiling point results across time
-     *     intervals.
-     */
-    public static String getPerformanceSummary(
-            String profilingPoint,
-            ProfilingPointSummary testSummary,
-            List<PerformanceSummary> perfSummaries,
-            String sectionLabels) {
-        String tableHTML = "<table>";
-
-        // Format section labels
-        tableHTML += "<tr>";
-        tableHTML += "<th class='section-label grey lighten-2'>";
-        tableHTML += testSummary.yLabel + "</th>";
-        tableHTML += sectionLabels;
-        tableHTML += "</tr>";
-
-        String bestCaseString;
-        switch (testSummary.getRegressionMode()) {
-            case VTS_REGRESSION_MODE_DECREASING:
-                bestCaseString = MAX;
-                break;
-            default:
-                bestCaseString = MIN;
-                break;
-        }
-
-        // Format column labels
-        tableHTML += "<tr>";
-        for (int i = 0; i <= perfSummaries.size() + 1; i++) {
-            if (i > 1) {
-                tableHTML += "<th class='section-label grey lighten-2'>" + MEAN_DELTA + "</th>";
-            }
-            if (i == 0) {
-                tableHTML += "<th class='section-label grey lighten-2'>";
-                tableHTML += testSummary.xLabel + "</th>";
-            } else if (i > 0) {
-                tableHTML += "<th class='section-label grey lighten-2'>" + bestCaseString + "</th>";
-                tableHTML += "<th class='section-label grey lighten-2'>" + MEAN + "</th>";
-                tableHTML += "<th class='section-label grey lighten-2'>" + STD + "</th>";
-            }
-        }
-        tableHTML += "</tr>";
-
-        // Populate data cells
-        for (StatSummary stats : testSummary) {
-            String label = stats.getLabel();
-            tableHTML += "<tr><td class='axis-label grey lighten-2'>" + label;
-            tableHTML += "</td><td class='cell inner-cell'>";
-            tableHTML += FORMATTER.format(stats.getBestCase()) + "</td>";
-            tableHTML += "<td class='cell inner-cell'>";
-            tableHTML += FORMATTER.format(stats.getMean()) + "</td>";
-            tableHTML += "<td class='cell outer-cell'>";
-            if (stats.getCount() < 2) {
-                tableHTML += " - </td>";
-            } else {
-                tableHTML += FORMATTER.format(stats.getStd()) + "</td>";
-            }
-            for (PerformanceSummary prevPerformance : perfSummaries) {
-                if (prevPerformance.hasProfilingPoint(profilingPoint)) {
-                    StatSummary baseline =
-                            prevPerformance
-                                    .getProfilingPointSummary(profilingPoint)
-                                    .getStatSummary(label);
-                    tableHTML +=
-                            PerformanceUtil.getAvgCasePerformanceComparisonHTML(
-                                    baseline, stats, "cell inner-cell", "cell outer-cell", "", "");
-                } else {
-                    tableHTML += "<td></td><td></td><td></td><td></td>";
-                }
-            }
-            tableHTML += "</tr>";
-        }
-        tableHTML += "</table>";
-        return tableHTML;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        RequestDispatcher dispatcher = null;
-        String testName = request.getParameter("testName");
-        String selectedDevice = request.getParameter("device");
-        Long startTime = null;
-        if (request.getParameter("startTime") != null) {
-            String time = request.getParameter("startTime");
-            try {
-                startTime = Long.parseLong(time);
-            } catch (NumberFormatException e) {
-                logger.log(Level.WARNING, "Invalid start time passed to digest servlet: " + time);
-            }
-        }
-        if (startTime == null) {
-            startTime = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        }
-
-        // Add today to the list of time intervals to analyze
-        List<PerformanceSummary> summaries = new ArrayList<>();
-        PerformanceSummary today =
-                new PerformanceSummary(startTime - TimeUnit.DAYS.toMicros(1), startTime);
-        summaries.add(today);
-
-        // Add yesterday as a baseline time interval for analysis
-        long oneDayAgo = startTime - TimeUnit.DAYS.toMicros(1);
-        PerformanceSummary yesterday =
-                new PerformanceSummary(oneDayAgo - TimeUnit.DAYS.toMicros(1), oneDayAgo);
-        summaries.add(yesterday);
-
-        // Add last week as a baseline time interval for analysis
-        long oneWeek = TimeUnit.DAYS.toMicros(7);
-        long oneWeekAgo = startTime - oneWeek;
-        String spanString = "<span class='date-label'>";
-        String label =
-                spanString + TimeUnit.MICROSECONDS.toMillis(oneWeekAgo - oneWeek) + "</span>";
-        label += " - " + spanString + TimeUnit.MICROSECONDS.toMillis(oneWeekAgo) + "</span>";
-        PerformanceSummary lastWeek =
-                new PerformanceSummary(oneWeekAgo - oneWeek, oneWeekAgo, label);
-        summaries.add(lastWeek);
-        PerformanceUtil.updatePerformanceSummary(
-                testName, oneWeekAgo - oneWeek, startTime, selectedDevice, summaries);
-
-        int colCount = 0;
-        String sectionLabels = "";
-        List<PerformanceSummary> nonEmptySummaries = new ArrayList<>();
-        for (PerformanceSummary perfSummary : summaries) {
-            if (perfSummary.size() == 0) continue;
-
-            nonEmptySummaries.add(perfSummary);
-            String content = perfSummary.label;
-            sectionLabels += "<th class='section-label grey lighten-2 center' ";
-            if (colCount++ == 0) sectionLabels += "colspan='3'";
-            else sectionLabels += "colspan='4'";
-            sectionLabels += ">" + content + "</th>";
-        }
-
-        List<String> tables = new ArrayList<>();
-        List<String> tableTitles = new ArrayList<>();
-        List<String> tableSubtitles = new ArrayList<>();
-        if (nonEmptySummaries.size() != 0) {
-            PerformanceSummary todayPerformance = nonEmptySummaries.remove(0);
-            String[] profilingNames = todayPerformance.getProfilingPointNames();
-
-            for (String profilingPointName : profilingNames) {
-                ProfilingPointSummary baselinePerformance =
-                        todayPerformance.getProfilingPointSummary(profilingPointName);
-                String table =
-                        getPerformanceSummary(
-                                profilingPointName,
-                                baselinePerformance,
-                                nonEmptySummaries,
-                                sectionLabels);
-                if (table != null) {
-                    tables.add(table);
-                    tableTitles.add(profilingPointName);
-                    switch (baselinePerformance.getRegressionMode()) {
-                        case VTS_REGRESSION_MODE_DECREASING:
-                            tableSubtitles.add(HIGHER_IS_BETTER);
-                            break;
-                        default:
-                            tableSubtitles.add(LOWER_IS_BETTER);
-                            break;
-                    }
-                }
-            }
-        }
-
-        request.setAttribute("testName", testName);
-        request.setAttribute("tables", tables);
-        request.setAttribute("tableTitles", tableTitles);
-        request.setAttribute("tableSubtitles", tableSubtitles);
-        request.setAttribute("startTime", Long.toString(startTime));
-        request.setAttribute("selectedDevice", selectedDevice);
-        request.setAttribute("devices", DatastoreHelper.getAllBuildFlavors());
-
-        dispatcher = request.getRequestDispatcher(PERF_DIGEST_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : " + e.toString());
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java b/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java
deleted file mode 100644
index 0fa28f2..0000000
--- a/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestSuiteResultEntity;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.FilterUtil;
-import com.android.vts.util.Pagination;
-
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import org.apache.commons.lang.StringUtils;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-public class ShowPlanReleaseServlet extends BaseServlet {
-    private static final int MAX_RUNS_PER_PAGE = 90;
-
-    /** the previous cursor string token list where to start */
-    private static final LinkedHashSet<String> pageCountTokenSet = new LinkedHashSet<>();
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.RELEASE;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        String testType =
-                request.getParameter("type") == null ? "plan" : request.getParameter("type");
-        List<Page> links = new ArrayList<>();
-        String planName = request.getParameter("plan");
-        if (testType.equals("plan")) {
-            links.add(new Page(PageType.RELEASE, "TEST PLANS", "?type=" + testType, true));
-            links.add(new Page(PageType.PLAN_RELEASE, planName, "?plan=" + planName));
-        } else {
-            links.add(new Page(PageType.RELEASE, "TEST SUITES", "?type=" + testType, true));
-            links.add(
-                    new Page(
-                            PageType.PLAN_RELEASE,
-                            planName,
-                            "?plan=" + planName + "&type=" + testType));
-        }
-        return links;
-    }
-
-    /** Model to describe each test plan run . */
-    private class TestPlanRunMetadata implements Comparable<TestPlanRunMetadata> {
-        public final TestPlanRunEntity testPlanRun;
-        public final List<String> devices;
-        public final Set<DeviceInfoEntity> deviceSet;
-
-        public TestPlanRunMetadata(TestPlanRunEntity testPlanRun) {
-            this.testPlanRun = testPlanRun;
-            this.devices = new ArrayList<>();
-            this.deviceSet = new HashSet<>();
-        }
-
-        public void addDevice(DeviceInfoEntity device) {
-            if (device == null || deviceSet.contains(device)) return;
-            devices.add(
-                    device.getBranch()
-                            + "/"
-                            + device.getBuildFlavor()
-                            + " ("
-                            + device.getBuildId()
-                            + ")");
-            deviceSet.add(device);
-        }
-
-        public JsonObject toJson() {
-            JsonObject obj = new JsonObject();
-            obj.add("testPlanRun", testPlanRun.toJson());
-            obj.add("deviceInfo", new JsonPrimitive(StringUtils.join(devices, ", ")));
-            return obj;
-        }
-
-        @Override
-        public int compareTo(TestPlanRunMetadata o) {
-            return new Long(o.testPlanRun.getStartTimestamp())
-                    .compareTo(this.testPlanRun.getStartTimestamp());
-        }
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        String testType =
-                request.getParameter("type") == null ? "plan" : request.getParameter("type");
-
-        RequestDispatcher dispatcher;
-        if (testType.equalsIgnoreCase("plan")) {
-            dispatcher = this.getTestPlanDispatcher(request, response);
-        } else {
-            dispatcher = this.getTestSuiteDispatcher(request, response);
-        }
-
-        try {
-            request.setAttribute("testType", testType);
-            response.setStatus(HttpServletResponse.SC_OK);
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-        }
-    }
-
-    private RequestDispatcher getTestPlanDispatcher(
-            HttpServletRequest request, HttpServletResponse response) {
-        String PLAN_RELEASE_JSP = "WEB-INF/jsp/show_plan_release.jsp";
-
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        Long startTime = null; // time in microseconds
-        Long endTime = null; // time in microseconds
-        if (request.getParameter("startTime") != null) {
-            String time = request.getParameter("startTime");
-            try {
-                startTime = Long.parseLong(time);
-                startTime = startTime > 0 ? startTime : null;
-            } catch (NumberFormatException e) {
-                startTime = null;
-            }
-        }
-        if (request.getParameter("endTime") != null) {
-            String time = request.getParameter("endTime");
-            try {
-                endTime = Long.parseLong(time);
-                endTime = endTime > 0 ? endTime : null;
-            } catch (NumberFormatException e) {
-                endTime = null;
-            }
-        }
-        SortDirection dir = SortDirection.DESCENDING;
-        if (startTime != null && endTime == null) {
-            dir = SortDirection.ASCENDING;
-        }
-        boolean unfiltered = request.getParameter("unfiltered") != null;
-        boolean showPresubmit = request.getParameter("showPresubmit") != null;
-        boolean showPostsubmit = request.getParameter("showPostsubmit") != null;
-        // If no params are specified, set to default of postsubmit-only.
-        if (!(showPresubmit || showPostsubmit)) {
-            showPostsubmit = true;
-        }
-
-        // If unfiltered, set showPre- and Post-submit to true for accurate UI.
-        if (unfiltered) {
-            showPostsubmit = true;
-            showPresubmit = true;
-        }
-        Filter typeFilter = FilterUtil.getTestTypeFilter(showPresubmit, showPostsubmit, unfiltered);
-        String testPlan = request.getParameter("plan");
-        Key testPlanKey = KeyFactory.createKey(TestPlanEntity.KIND, testPlan);
-        Filter testPlanRunFilter =
-                FilterUtil.getTimeFilter(
-                        testPlanKey, TestPlanRunEntity.KIND, startTime, endTime, typeFilter);
-        Map<String, String[]> parameterMap = request.getParameterMap();
-        List<Filter> userTestFilters = FilterUtil.getUserTestFilters(parameterMap);
-        userTestFilters.add(0, testPlanRunFilter);
-        Filter userDeviceFilter = FilterUtil.getUserDeviceFilter(parameterMap);
-
-        List<TestPlanRunMetadata> testPlanRuns = new ArrayList<>();
-        Map<Key, TestPlanRunMetadata> testPlanMap = new HashMap<>();
-        Key minKey = null;
-        Key maxKey = null;
-        List<Key> gets =
-                FilterUtil.getMatchingKeys(
-                        testPlanKey,
-                        TestPlanRunEntity.KIND,
-                        userTestFilters,
-                        userDeviceFilter,
-                        dir,
-                        MAX_RUNS_PER_PAGE);
-        Map<Key, Entity> entityMap = datastore.get(gets);
-        logger.log(Level.INFO, "entityMap => " + entityMap);
-        for (Key key : gets) {
-            if (!entityMap.containsKey(key)) {
-                continue;
-            }
-            TestPlanRunEntity testPlanRun = TestPlanRunEntity.fromEntity(entityMap.get(key));
-            if (testPlanRun == null) {
-                continue;
-            }
-            TestPlanRunMetadata metadata = new TestPlanRunMetadata(testPlanRun);
-            testPlanRuns.add(metadata);
-            testPlanMap.put(key, metadata);
-            if (minKey == null || key.compareTo(minKey) < 0) {
-                minKey = key;
-            }
-            if (maxKey == null || key.compareTo(maxKey) > 0) {
-                maxKey = key;
-            }
-        }
-        if (minKey != null && maxKey != null) {
-            Filter deviceFilter =
-                    FilterUtil.getDeviceTimeFilter(
-                            testPlanKey, TestPlanRunEntity.KIND, minKey.getId(), maxKey.getId());
-            Query deviceQuery =
-                    new Query(DeviceInfoEntity.KIND)
-                            .setAncestor(testPlanKey)
-                            .setFilter(deviceFilter)
-                            .setKeysOnly();
-            List<Key> deviceGets = new ArrayList<>();
-            for (Entity device :
-                    datastore
-                            .prepare(deviceQuery)
-                            .asIterable(DatastoreHelper.getLargeBatchOptions())) {
-                if (testPlanMap.containsKey(device.getParent())) {
-                    deviceGets.add(device.getKey());
-                }
-            }
-            logger.log(Level.INFO, "deviceGets => " + deviceGets);
-            Map<Key, Entity> devices = datastore.get(deviceGets);
-            for (Key key : devices.keySet()) {
-                if (!testPlanMap.containsKey(key.getParent())) continue;
-                DeviceInfoEntity device = DeviceInfoEntity.fromEntity(devices.get(key));
-                if (device == null) continue;
-                TestPlanRunMetadata metadata = testPlanMap.get(key.getParent());
-                metadata.addDevice(device);
-            }
-        }
-
-        testPlanRuns.sort(Comparator.naturalOrder());
-        logger.log(Level.INFO, "testPlanRuns => " + testPlanRuns);
-
-        if (testPlanRuns.size() > 0) {
-            TestPlanRunMetadata firstRun = testPlanRuns.get(0);
-            endTime = firstRun.testPlanRun.getStartTimestamp();
-
-            TestPlanRunMetadata lastRun = testPlanRuns.get(testPlanRuns.size() - 1);
-            startTime = lastRun.testPlanRun.getStartTimestamp();
-        }
-
-        List<JsonObject> testPlanRunObjects = new ArrayList<>();
-        for (TestPlanRunMetadata metadata : testPlanRuns) {
-            testPlanRunObjects.add(metadata.toJson());
-        }
-
-        FilterUtil.setAttributes(request, parameterMap);
-
-        request.setAttribute("plan", request.getParameter("plan"));
-        request.setAttribute(
-                "hasNewer",
-                new Gson()
-                        .toJson(
-                                DatastoreHelper.hasNewer(
-                                        testPlanKey, TestPlanRunEntity.KIND, endTime)));
-        request.setAttribute(
-                "hasOlder",
-                new Gson()
-                        .toJson(
-                                DatastoreHelper.hasOlder(
-                                        testPlanKey, TestPlanRunEntity.KIND, startTime)));
-        request.setAttribute("planRuns", new Gson().toJson(testPlanRunObjects));
-
-        request.setAttribute("unfiltered", unfiltered);
-        request.setAttribute("showPresubmit", showPresubmit);
-        request.setAttribute("showPostsubmit", showPostsubmit);
-        request.setAttribute("startTime", new Gson().toJson(startTime));
-        request.setAttribute("endTime", new Gson().toJson(endTime));
-        request.setAttribute("branches", new Gson().toJson(DatastoreHelper.getAllBranches()));
-        request.setAttribute("devices", new Gson().toJson(DatastoreHelper.getAllBuildFlavors()));
-
-        RequestDispatcher dispatcher = request.getRequestDispatcher(PLAN_RELEASE_JSP);
-        return dispatcher;
-    }
-
-    private RequestDispatcher getTestSuiteDispatcher(
-            HttpServletRequest request, HttpServletResponse response) {
-        String PLAN_RELEASE_JSP = "WEB-INF/jsp/show_suite_release.jsp";
-
-        String testPlan = request.getParameter("plan");
-        String testCategoryType =
-                Objects.isNull(request.getParameter("testCategoryType"))
-                        ? "1"
-                        : request.getParameter("testCategoryType");
-        int page =
-                Objects.isNull(request.getParameter("page"))
-                        ? 1
-                        : Integer.valueOf(request.getParameter("page"));
-        String nextPageToken =
-                Objects.isNull(request.getParameter("nextPageToken"))
-                        ? ""
-                        : request.getParameter("nextPageToken");
-
-        com.googlecode.objectify.cmd.Query<TestSuiteResultEntity> testSuiteResultEntityQuery =
-                ofy().load()
-                        .type(TestSuiteResultEntity.class)
-                        .filter("suitePlan", testPlan)
-                        .filter(this.getTestTypeFieldName(testCategoryType), true);
-
-        if (Objects.nonNull(request.getParameter("branch"))) {
-            request.setAttribute("branch", request.getParameter("branch"));
-            testSuiteResultEntityQuery =
-                    testSuiteResultEntityQuery.filter("branch", request.getParameter("branch"));
-        }
-        if (Objects.nonNull(request.getParameter("hostName"))) {
-            request.setAttribute("hostName", request.getParameter("hostName"));
-            testSuiteResultEntityQuery =
-                    testSuiteResultEntityQuery.filter("hostName", request.getParameter("hostName"));
-        }
-        if (Objects.nonNull(request.getParameter("buildId"))) {
-            request.setAttribute("buildId", request.getParameter("buildId"));
-            testSuiteResultEntityQuery =
-                    testSuiteResultEntityQuery.filter("buildId", request.getParameter("buildId"));
-        }
-        if (Objects.nonNull(request.getParameter("deviceName"))) {
-            request.setAttribute("deviceName", request.getParameter("deviceName"));
-            testSuiteResultEntityQuery =
-                    testSuiteResultEntityQuery.filter(
-                            "deviceName", request.getParameter("deviceName"));
-        }
-        testSuiteResultEntityQuery = testSuiteResultEntityQuery.orderKey(true);
-
-        Pagination<TestSuiteResultEntity> testSuiteResultEntityPagination =
-                new Pagination(
-                        testSuiteResultEntityQuery,
-                        page,
-                        Pagination.DEFAULT_PAGE_SIZE,
-                        nextPageToken,
-                        pageCountTokenSet);
-
-        String nextPageTokenPagination = testSuiteResultEntityPagination.getNextPageCountToken();
-        if (!nextPageTokenPagination.trim().isEmpty()) {
-            this.pageCountTokenSet.add(nextPageTokenPagination);
-        }
-
-        logger.log(Level.INFO, "pageCountTokenSet => " + pageCountTokenSet);
-
-        logger.log(Level.INFO, "list => " + testSuiteResultEntityPagination.getList());
-        logger.log(
-                Level.INFO,
-                "next page count token => "
-                        + testSuiteResultEntityPagination.getNextPageCountToken());
-        logger.log(
-                Level.INFO,
-                "page min range => " + testSuiteResultEntityPagination.getMinPageRange());
-        logger.log(
-                Level.INFO,
-                "page max range => " + testSuiteResultEntityPagination.getMaxPageRange());
-        logger.log(Level.INFO, "page size => " + testSuiteResultEntityPagination.getPageSize());
-        logger.log(Level.INFO, "total count => " + testSuiteResultEntityPagination.getTotalCount());
-
-        request.setAttribute("plan", testPlan);
-        request.setAttribute("page", page);
-        request.setAttribute("testType", "suite");
-        request.setAttribute("testCategoryType", testCategoryType);
-        request.setAttribute("testSuiteResultEntityPagination", testSuiteResultEntityPagination);
-        RequestDispatcher dispatcher = request.getRequestDispatcher(PLAN_RELEASE_JSP);
-        return dispatcher;
-    }
-
-    private String getTestTypeFieldName(String testCategoryType) {
-        String fieldName;
-        switch (testCategoryType) {
-            case "1": // TOT
-                fieldName = "testTypeIndex.TOT";
-                break;
-            case "2": // OTA
-                fieldName = "testTypeIndex.OTA";
-                break;
-            case "4": // SIGNED
-                fieldName = "testTypeIndex.SIGNED";
-                break;
-            default:
-                fieldName = "testTypeIndex.TOT";
-                break;
-        }
-        return fieldName;
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowPlanRunServlet.java b/src/main/java/com/android/vts/servlet/ShowPlanRunServlet.java
deleted file mode 100644
index 9138a90..0000000
--- a/src/main/java/com/android/vts/servlet/ShowPlanRunServlet.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.util.TestRunMetadata;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for handling requests to load individual plan runs. */
-public class ShowPlanRunServlet extends BaseServlet {
-    private static final String PLAN_RUN_JSP = "WEB-INF/jsp/show_plan_run.jsp";
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.RELEASE;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        List<Page> links = new ArrayList<>();
-        String planName = request.getParameter("plan");
-        links.add(new Page(PageType.PLAN_RELEASE, planName, "?plan=" + planName));
-
-        String time = request.getParameter("time");
-        links.add(new Page(PageType.PLAN_RUN, "?plan=" + planName + "&time=" + time));
-        return links;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        Long time = null; // time in microseconds
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        RequestDispatcher dispatcher = null;
-
-        String plan = request.getParameter("plan");
-
-        if (request.getParameter("time") != null) {
-            String timeString = request.getParameter("time");
-            try {
-                time = Long.parseLong(timeString);
-                time = time > 0 ? time : null;
-            } catch (NumberFormatException e) {
-                time = null;
-            }
-        }
-
-        // Add result names to list
-        List<String> resultNames = new ArrayList<>();
-        for (TestCaseResult r : TestCaseResult.values()) {
-            resultNames.add(r.name());
-        }
-
-        List<JsonObject> passingTestObjects = new ArrayList<>();
-        List<JsonObject> failingTestObjects = new ArrayList<>();
-        List<JsonObject> testRunObjects = new ArrayList<>();
-
-        Key planKey = KeyFactory.createKey(TestPlanEntity.KIND, plan);
-        Key planRunKey = KeyFactory.createKey(planKey, TestPlanRunEntity.KIND, time);
-        String testBuildId = "";
-        int passCount = 0;
-        int failCount = 0;
-        long startTime = 0;
-        long endTime = 0;
-        long moduleCount = 0;
-        long totalApiCount = 0L;
-        long totalCoveredApiCount = 0L;
-        try {
-            Entity testPlanRunEntity = datastore.get(planRunKey);
-            TestPlanRunEntity testPlanRun = TestPlanRunEntity.fromEntity(testPlanRunEntity);
-            Map<Key, Entity> testRuns = datastore.get(testPlanRun.getOldTestRuns());
-            testBuildId = testPlanRun.getTestBuildId();
-            passCount = (int) testPlanRun.getPassCount();
-            failCount = (int) testPlanRun.getFailCount();
-            totalApiCount = testPlanRun.getTotalApiCount();
-            logger.log(Level.INFO, "totalApiCount => " + totalApiCount);
-            totalCoveredApiCount = testPlanRun.getCoveredApiCount();
-            logger.log(Level.INFO, "totalCoveredApiCount => " + totalCoveredApiCount);
-            startTime = testPlanRun.getStartTimestamp();
-            endTime = testPlanRun.getEndTimestamp();
-            moduleCount = testPlanRun.getTestRuns().size();
-
-            for (Key key : testPlanRun.getOldTestRuns()) {
-                if (!testRuns.containsKey(key)) continue;
-                TestRunEntity testRunEntity = TestRunEntity.fromEntity(testRuns.get(key));
-                if (testRunEntity == null) continue;
-                Query deviceInfoQuery = new Query(DeviceInfoEntity.KIND).setAncestor(key);
-                List<DeviceInfoEntity> devices = new ArrayList<>();
-                for (Entity device : datastore.prepare(deviceInfoQuery).asIterable()) {
-                    DeviceInfoEntity deviceEntity = DeviceInfoEntity.fromEntity(device);
-                    if (deviceEntity == null) continue;
-                    devices.add(deviceEntity);
-                }
-                TestRunMetadata metadata =
-                        new TestRunMetadata(key.getParent().getName(), testRunEntity, devices);
-                if (metadata.testRun.getFailCount() > 0) {
-                    failingTestObjects.add(metadata.toJson());
-                } else {
-                    passingTestObjects.add(metadata.toJson());
-                }
-            }
-        } catch (EntityNotFoundException e) {
-            // Invalid parameters
-        }
-        testRunObjects.addAll(failingTestObjects);
-        testRunObjects.addAll(passingTestObjects);
-
-        int[] topBuildResultCounts = new int[TestCaseResult.values().length];
-        topBuildResultCounts[TestCaseResult.TEST_CASE_RESULT_PASS.getNumber()] = passCount;
-        topBuildResultCounts[TestCaseResult.TEST_CASE_RESULT_FAIL.getNumber()] = failCount;
-
-        request.setAttribute("plan", request.getParameter("plan"));
-        request.setAttribute("time", request.getParameter("time"));
-
-        request.setAttribute("resultNames", resultNames);
-        request.setAttribute("resultNamesJson", new Gson().toJson(resultNames));
-        request.setAttribute("testRuns", new Gson().toJson(testRunObjects));
-        request.setAttribute("testBuildId", new Gson().toJson(testBuildId));
-        request.setAttribute("startTime", new Gson().toJson(startTime));
-        request.setAttribute("endTime", new Gson().toJson(endTime));
-        request.setAttribute("moduleCount", new Gson().toJson(moduleCount));
-        request.setAttribute("passingTestCaseCount", new Gson().toJson(passCount));
-        request.setAttribute("failingTestCaseCount", new Gson().toJson(failCount));
-        request.setAttribute("totalApiCount", totalApiCount);
-        request.setAttribute("totalCoveredApiCount", totalCoveredApiCount);
-
-        // data for pie chart
-        request.setAttribute("topBuildResultCounts", new Gson().toJson(topBuildResultCounts));
-
-        dispatcher = request.getRequestDispatcher(PLAN_RUN_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : " + e.toString());
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowProfilingListServlet.java b/src/main/java/com/android/vts/servlet/ShowProfilingListServlet.java
deleted file mode 100644
index ce138cc..0000000
--- a/src/main/java/com/android/vts/servlet/ShowProfilingListServlet.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.servlet;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-import com.android.vts.entity.TestEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Query;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.stream.Collectors;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Servlet for handling requests to display profiling tests.
- */
-public class ShowProfilingListServlet extends BaseServlet {
-
-  private static final String PROFILING_LIST_JSP = "WEB-INF/jsp/show_profiling_list.jsp";
-
-  @Override
-  public PageType getNavParentType() {
-    return PageType.PROFILING_LIST;
-  }
-
-  @Override
-  public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-    return null;
-  }
-
-  @Override
-  public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-      throws IOException {
-    List<String> tests = ofy().load().type(TestEntity.class)
-        .filter(TestEntity.HAS_PROFILING_DATA, true).list().stream()
-        .sorted(Comparator.comparing(TestEntity::getTestName)).map(t -> t.getTestName())
-        .collect(Collectors.toList());
-
-    response.setStatus(HttpServletResponse.SC_OK);
-    request.setAttribute("testNames", tests);
-    RequestDispatcher dispatcher = request.getRequestDispatcher(PROFILING_LIST_JSP);
-    try {
-      dispatcher.forward(request, response);
-    } catch (ServletException e) {
-      logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-    }
-  }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowProfilingOverviewServlet.java b/src/main/java/com/android/vts/servlet/ShowProfilingOverviewServlet.java
deleted file mode 100644
index 5dc8c6e..0000000
--- a/src/main/java/com/android/vts/servlet/ShowProfilingOverviewServlet.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.ProfilingPointEntity;
-import com.android.vts.entity.ProfilingPointSummaryEntity;
-import com.android.vts.util.BoxPlot;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.FilterUtil;
-import com.android.vts.util.GraphSerializer;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.stream.Collectors;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for handling requests to load graphs. */
-public class ShowProfilingOverviewServlet extends BaseServlet {
-    private static final String PROFILING_OVERVIEW_JSP = "WEB-INF/jsp/show_profiling_overview.jsp";
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.PROFILING_LIST;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        List<Page> links = new ArrayList<>();
-        String testName = request.getParameter("testName");
-        links.add(new Page(PageType.PROFILING_OVERVIEW, testName, "?testName=" + testName));
-        return links;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        RequestDispatcher dispatcher = null;
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        String testName = request.getParameter("testName");
-        long endTime = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        long startTime = endTime - TimeUnit.DAYS.toMicros(30);
-
-        // Create a query for test runs matching the time window filter
-
-        Map<String, String[]> parameterMap = request.getParameterMap();
-        boolean hasBranchFilter = parameterMap.containsKey(FilterUtil.FilterKey.BRANCH.getValue());
-        Filter deviceFilter;
-        if (hasBranchFilter) {
-            deviceFilter =
-                    FilterUtil.FilterKey.BRANCH.getFilterForString(
-                            FilterUtil.getFirstParameter(
-                                    parameterMap, FilterUtil.FilterKey.BRANCH.getValue()));
-        } else {
-            deviceFilter =
-                    FilterUtil.FilterKey.BRANCH.getFilterForString(ProfilingPointSummaryEntity.ALL);
-        }
-
-        boolean hasTargetFilter = parameterMap.containsKey(FilterUtil.FilterKey.TARGET.getValue());
-        if (hasTargetFilter) {
-            deviceFilter =
-                    Query.CompositeFilterOperator.and(
-                            deviceFilter,
-                            FilterUtil.FilterKey.TARGET.getFilterForString(
-                                    FilterUtil.getFirstParameter(
-                                            parameterMap, FilterUtil.FilterKey.TARGET.getValue())));
-        } else {
-            deviceFilter =
-                    Query.CompositeFilterOperator.and(
-                            deviceFilter,
-                            FilterUtil.FilterKey.TARGET.getFilterForString(
-                                    ProfilingPointSummaryEntity.ALL));
-        }
-
-        Filter startFilter =
-                new Query.FilterPredicate(
-                        ProfilingPointSummaryEntity.START_TIME,
-                        Query.FilterOperator.GREATER_THAN_OR_EQUAL,
-                        startTime);
-        Filter endFilter =
-                new Query.FilterPredicate(
-                        ProfilingPointSummaryEntity.START_TIME,
-                        Query.FilterOperator.LESS_THAN_OR_EQUAL,
-                        endTime);
-        Filter timeFilter = Query.CompositeFilterOperator.and(startFilter, endFilter);
-
-        Filter filter = Query.CompositeFilterOperator.and(timeFilter, deviceFilter);
-
-        Query profilingPointQuery =
-                new Query(ProfilingPointEntity.KIND)
-                        .setFilter(
-                                new Query.FilterPredicate(
-                                        ProfilingPointEntity.TEST_NAME,
-                                        Query.FilterOperator.EQUAL,
-                                        testName));
-
-        List<ProfilingPointEntity> profilingPoints = new ArrayList<>();
-        for (Entity e :
-                datastore
-                        .prepare(profilingPointQuery)
-                        .asIterable(DatastoreHelper.getLargeBatchOptions())) {
-            ProfilingPointEntity pp = ProfilingPointEntity.fromEntity(e);
-            if (pp == null) continue;
-            profilingPoints.add(pp);
-        }
-
-        Map<ProfilingPointEntity, Iterable<Entity>> asyncEntities = new HashMap<>();
-        for (ProfilingPointEntity pp : profilingPoints) {
-            Query profilingQuery =
-                    new Query(ProfilingPointSummaryEntity.KIND)
-                            .setAncestor(pp.getKey())
-                            .setFilter(filter);
-            asyncEntities.put(
-                    pp,
-                    datastore
-                            .prepare(profilingQuery)
-                            .asIterable(DatastoreHelper.getLargeBatchOptions()));
-        }
-
-        Map<String, BoxPlot> plotMap = new HashMap<>();
-        for (ProfilingPointEntity pp : profilingPoints) {
-            if (!plotMap.containsKey(pp.getProfilingPointName())) {
-                plotMap.put(
-                        pp.getProfilingPointName(), new BoxPlot(pp.getProfilingPointName(), null, pp.getXLabel()));
-            }
-            BoxPlot plot = plotMap.get(pp.getProfilingPointName());
-            Set<Long> timestamps = new HashSet<>();
-            for (Entity e : asyncEntities.get(pp)) {
-                ProfilingPointSummaryEntity pps = ProfilingPointSummaryEntity.fromEntity(e);
-                if (pps == null) continue;
-                plot.addSeriesData(Long.toString(pps.getStartTime()), pps.getSeries(), pps.getGlobalStats());
-                timestamps.add(pps.getStartTime());
-            }
-            List<Long> timestampList = new ArrayList<>(timestamps);
-            timestampList.sort(Comparator.reverseOrder());
-            List<String> timestampStrings =
-                    timestampList.stream().map(Object::toString).collect(Collectors.toList());
-            plot.setLabels(timestampStrings);
-        }
-
-        List<BoxPlot> plots = new ArrayList<>();
-        for (String key : plotMap.keySet()) {
-            BoxPlot plot = plotMap.get(key);
-            if (plot.size() == 0) continue;
-            plots.add(plot);
-        }
-        plots.sort((b1, b2) -> b1.getName().compareTo(b2.getName()));
-
-        Gson gson =
-                new GsonBuilder()
-                        .registerTypeHierarchyAdapter(BoxPlot.class, new GraphSerializer())
-                        .create();
-
-        FilterUtil.setAttributes(request, parameterMap);
-        request.setAttribute("plots", gson.toJson(plots));
-        request.setAttribute("testName", request.getParameter("testName"));
-        request.setAttribute("branches", new Gson().toJson(DatastoreHelper.getAllBranches()));
-        request.setAttribute("devices", new Gson().toJson(DatastoreHelper.getAllBuildFlavors()));
-        dispatcher = request.getRequestDispatcher(PROFILING_OVERVIEW_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : ", e);
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowReleaseServlet.java b/src/main/java/com/android/vts/servlet/ShowReleaseServlet.java
deleted file mode 100644
index ae175ae..0000000
--- a/src/main/java/com/android/vts/servlet/ShowReleaseServlet.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestSuiteResultEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.users.UserServiceFactory;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.stream.Collectors;
-
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/**
- * Represents the servlet that is invoked on loading the release page.
- */
-public class ShowReleaseServlet extends BaseServlet {
-
-  @Override
-  public PageType getNavParentType() {
-    return PageType.RELEASE;
-  }
-
-  @Override
-  public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-    return null;
-  }
-
-  @Override
-  public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-      throws IOException {
-    String testType =
-        request.getParameter("type") == null ? "plan" : request.getParameter("type");
-
-    RequestDispatcher dispatcher;
-    if (testType.equalsIgnoreCase("plan")) {
-      dispatcher = this.getTestPlanDispatcher(request, response);
-    } else {
-      dispatcher = this.getTestSuiteDispatcher(request, response);
-    }
-
-    try {
-      request.setAttribute("testType", testType);
-      response.setStatus(HttpServletResponse.SC_OK);
-      dispatcher.forward(request, response);
-    } catch (ServletException e) {
-      logger.log(Level.SEVERE, "Servlet Excpetion caught : ", e);
-    }
-  }
-
-  private RequestDispatcher getTestPlanDispatcher(
-      HttpServletRequest request, HttpServletResponse response) {
-    String RELEASE_JSP = "WEB-INF/jsp/show_release.jsp";
-
-    List<TestPlanEntity> testPlanEntityList = ofy().load().type(TestPlanEntity.class).list();
-
-    List<String> plans = testPlanEntityList.stream()
-        .sorted(Comparator.comparing(TestPlanEntity::getTestPlanName))
-        .map(te -> te.getTestPlanName()).collect(Collectors.toList());
-
-    request.setAttribute("isAdmin", UserServiceFactory.getUserService().isUserAdmin());
-    request.setAttribute("planNames", plans);
-    RequestDispatcher dispatcher = request.getRequestDispatcher(RELEASE_JSP);
-    return dispatcher;
-  }
-
-  private RequestDispatcher getTestSuiteDispatcher(
-      HttpServletRequest request, HttpServletResponse response) {
-    String RELEASE_JSP = "WEB-INF/jsp/show_release.jsp";
-
-    List<TestSuiteResultEntity> suiteResultEntityList = TestSuiteResultEntity.getTestSuitePlans();
-
-    List<String> plans =
-        suiteResultEntityList
-            .stream()
-            .map(suiteEntity -> suiteEntity.getSuitePlan())
-            .collect(Collectors.toList());
-    request.setAttribute("isAdmin", UserServiceFactory.getUserService().isUserAdmin());
-    request.setAttribute("planNames", plans);
-    RequestDispatcher dispatcher = request.getRequestDispatcher(RELEASE_JSP);
-    return dispatcher;
-  }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowTableServlet.java b/src/main/java/com/android/vts/servlet/ShowTableServlet.java
deleted file mode 100644
index b56ce9c..0000000
--- a/src/main/java/com/android/vts/servlet/ShowTableServlet.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.CodeCoverageEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.FilterUtil;
-import com.android.vts.util.TestResults;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-import com.google.gson.Gson;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Servlet for handling requests to load individual tables. */
-public class ShowTableServlet extends BaseServlet {
-    private static final String TABLE_JSP = "WEB-INF/jsp/show_table.jsp";
-    // Error message displayed on the webpage is tableName passed is null.
-    private static final String TABLE_NAME_ERROR = "Error : Table name must be passed!";
-    private static final String PROFILING_DATA_ALERT = "No profiling data was found.";
-    private static final int MAX_BUILD_IDS_PER_PAGE = 10;
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.TOT;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        List<Page> links = new ArrayList<>();
-        String testName = request.getParameter("testName");
-        links.add(new Page(PageType.TABLE, testName, "?testName=" + testName));
-        return links;
-    }
-
-    public static void processTestRun(TestResults testResults, Entity testRun) {
-        TestRunEntity testRunEntity = TestRunEntity.fromEntity(testRun);
-        if (testRunEntity == null) {
-            return;
-        }
-
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        List<Key> gets = new ArrayList<>();
-        for (long testCaseId : testRunEntity.getTestCaseIds()) {
-            gets.add(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseId));
-        }
-
-        List<Entity> testCases = new ArrayList<>();
-        Map<Key, Entity> entityMap = datastore.get(gets);
-        for (Key key : gets) {
-            if (entityMap.containsKey(key)) {
-                testCases.add(entityMap.get(key));
-            }
-        }
-
-        testResults.addTestRun(testRun, testCases);
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        boolean unfiltered = request.getParameter("unfiltered") != null;
-        boolean showPresubmit = request.getParameter("showPresubmit") != null;
-        boolean showPostsubmit = request.getParameter("showPostsubmit") != null;
-
-        Long startTime = null; // time in microseconds
-        Long endTime = null; // time in microseconds
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        RequestDispatcher dispatcher = null;
-
-        // message to display if profiling point data is not available
-        String profilingDataAlert = "";
-
-        if (request.getParameter("testName") == null) {
-            request.setAttribute("testName", TABLE_NAME_ERROR);
-            return;
-        }
-        String testName = request.getParameter("testName");
-
-        if (request.getParameter("startTime") != null) {
-            String time = request.getParameter("startTime");
-            try {
-                startTime = Long.parseLong(time);
-                startTime = startTime > 0 ? startTime : null;
-            } catch (NumberFormatException e) {
-                startTime = null;
-            }
-        }
-        if (request.getParameter("endTime") != null) {
-            String time = request.getParameter("endTime");
-            try {
-                endTime = Long.parseLong(time);
-                endTime = endTime > 0 ? endTime : null;
-            } catch (NumberFormatException e) {
-                endTime = null;
-            }
-        }
-
-        // If no params are specified, set to default of postsubmit-only.
-        if (!(showPresubmit || showPostsubmit)) {
-            showPostsubmit = true;
-        }
-
-        // If unfiltered, set showPre- and Post-submit to true for accurate UI.
-        if (unfiltered) {
-            showPostsubmit = true;
-            showPresubmit = true;
-        }
-
-        // Add result names to list
-        List<String> resultNames = new ArrayList<>();
-        for (TestCaseResult r : TestCaseResult.values()) {
-            resultNames.add(r.name());
-        }
-
-        TestResults testResults = new TestResults(testName);
-
-        SortDirection dir = SortDirection.DESCENDING;
-        if (startTime != null && endTime == null) {
-            dir = SortDirection.ASCENDING;
-        }
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, testName);
-
-        Filter typeFilter = FilterUtil.getTestTypeFilter(showPresubmit, showPostsubmit, unfiltered);
-        Filter testFilter =
-                FilterUtil.getTimeFilter(
-                        testKey, TestRunEntity.KIND, startTime, endTime, typeFilter);
-
-        Map<String, String[]> parameterMap = request.getParameterMap();
-        List<Filter> userTestFilters = FilterUtil.getUserTestFilters(parameterMap);
-        userTestFilters.add(0, testFilter);
-        Filter userDeviceFilter = FilterUtil.getUserDeviceFilter(parameterMap);
-
-        List<Key> gets =
-                FilterUtil.getMatchingKeys(
-                        testKey,
-                        TestRunEntity.KIND,
-                        userTestFilters,
-                        userDeviceFilter,
-                        dir,
-                        MAX_BUILD_IDS_PER_PAGE);
-        Map<Key, Entity> entityMap = datastore.get(gets);
-        for (Key key : gets) {
-            if (!entityMap.containsKey(key)) {
-                continue;
-            }
-            processTestRun(testResults, entityMap.get(key));
-        }
-        testResults.processReport();
-
-        if (testResults.profilingPointNames.length == 0) {
-            profilingDataAlert = PROFILING_DATA_ALERT;
-        }
-
-        FilterUtil.setAttributes(request, parameterMap);
-
-        request.setAttribute("testName", request.getParameter("testName"));
-
-        request.setAttribute("error", profilingDataAlert);
-
-        // pass values by converting to JSON
-        request.setAttribute("headerRow", new Gson().toJson(testResults.headerRow));
-        request.setAttribute("timeGrid", new Gson().toJson(testResults.timeGrid));
-        request.setAttribute("durationGrid", new Gson().toJson(testResults.durationGrid));
-        request.setAttribute("summaryGrid", new Gson().toJson(testResults.summaryGrid));
-        request.setAttribute("resultsGrid", new Gson().toJson(testResults.resultsGrid));
-        request.setAttribute("profilingPointNames", testResults.profilingPointNames);
-        request.setAttribute("resultNames", resultNames);
-        request.setAttribute("resultNamesJson", new Gson().toJson(resultNames));
-        request.setAttribute("logInfoMap", new Gson().toJson(testResults.logInfoMap));
-
-        // data for pie chart
-        request.setAttribute(
-                "topBuildResultCounts", new Gson().toJson(testResults.totResultCounts));
-        request.setAttribute("topBuildId", testResults.totBuildId);
-        request.setAttribute("startTime", new Gson().toJson(testResults.startTime));
-        request.setAttribute("endTime", new Gson().toJson(testResults.endTime));
-        request.setAttribute(
-                "hasNewer",
-                new Gson()
-                        .toJson(
-                                DatastoreHelper.hasNewer(
-                                        testKey, TestRunEntity.KIND, testResults.endTime)));
-        request.setAttribute(
-                "hasOlder",
-                new Gson()
-                        .toJson(
-                                DatastoreHelper.hasOlder(
-                                        testKey, TestRunEntity.KIND, testResults.startTime)));
-        request.setAttribute("unfiltered", unfiltered);
-        request.setAttribute("showPresubmit", showPresubmit);
-        request.setAttribute("showPostsubmit", showPostsubmit);
-
-        request.setAttribute("branches", new Gson().toJson(DatastoreHelper.getAllBranches()));
-        request.setAttribute("devices", new Gson().toJson(DatastoreHelper.getAllBuildFlavors()));
-
-        dispatcher = request.getRequestDispatcher(TABLE_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : " + e.toString());
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowTestAcknowledgmentServlet.java b/src/main/java/com/android/vts/servlet/ShowTestAcknowledgmentServlet.java
deleted file mode 100644
index c75352c..0000000
--- a/src/main/java/com/android/vts/servlet/ShowTestAcknowledgmentServlet.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.TestAcknowledgmentEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.util.DatastoreHelper;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-public class ShowTestAcknowledgmentServlet extends BaseServlet {
-    private static final String TEST_ACK_JSP = "WEB-INF/jsp/show_test_acknowledgments.jsp";
-
-    @Override
-    public PageType getNavParentType() {
-        return PageType.TOT;
-    }
-
-    @Override
-    public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-        List<Page> links = new ArrayList<>();
-        return links;
-    }
-
-    @Override
-    public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-            throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Query ackQuery = new Query(TestAcknowledgmentEntity.KIND);
-        List<JsonObject> testAcks = new ArrayList<>();
-        for (Entity ackEntity :
-                datastore.prepare(ackQuery).asIterable(DatastoreHelper.getLargeBatchOptions())) {
-            TestAcknowledgmentEntity ack = TestAcknowledgmentEntity.fromEntity(ackEntity);
-            if (ack == null) continue;
-            testAcks.add(ack.toJson());
-        }
-
-        List<String> allTestNames = TestEntity.getAllTestNames();
-
-        request.setAttribute("testAcknowledgments", new Gson().toJson(testAcks));
-        request.setAttribute("allTests", new Gson().toJson(allTestNames));
-        request.setAttribute("branches", new Gson().toJson(DatastoreHelper.getAllBranches()));
-        request.setAttribute("devices", new Gson().toJson(DatastoreHelper.getAllBuildFlavors()));
-        request.setAttribute("readOnly", new Gson().toJson(!UserServiceFactory.getUserService().isUserAdmin()));
-
-        RequestDispatcher dispatcher = request.getRequestDispatcher(TEST_ACK_JSP);
-        try {
-            dispatcher.forward(request, response);
-        } catch (ServletException e) {
-            logger.log(Level.SEVERE, "Servlet Exception caught : ", e);
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/servlet/ShowTreeServlet.java b/src/main/java/com/android/vts/servlet/ShowTreeServlet.java
deleted file mode 100644
index e087807..0000000
--- a/src/main/java/com/android/vts/servlet/ShowTreeServlet.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.servlet;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.util.DatastoreHelper;
-import com.android.vts.util.FilterUtil;
-import com.android.vts.util.TestRunDetails;
-import com.android.vts.util.TestRunMetadata;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.SortDirection;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Servlet for handling requests to load individual tables.
- */
-public class ShowTreeServlet extends BaseServlet {
-
-  private static final String TABLE_JSP = "WEB-INF/jsp/show_tree.jsp";
-  // Error message displayed on the webpage is tableName passed is null.
-  private static final String TABLE_NAME_ERROR = "Error : Table name must be passed!";
-  private static final String PROFILING_DATA_ALERT = "No profiling data was found.";
-  private static final int MAX_RESULT_COUNT = 60;
-  private static final int MAX_PREFETCH_COUNT = 10;
-
-  @Override
-  public PageType getNavParentType() {
-    return PageType.TOT;
-  }
-
-  @Override
-  public List<Page> getBreadcrumbLinks(HttpServletRequest request) {
-    List<Page> links = new ArrayList<>();
-    String testName = request.getParameter("testName");
-    links.add(new Page(PageType.TREE, testName, "?testName=" + testName));
-    return links;
-  }
-
-  /**
-   * Get the test run details for a test run.
-   *
-   * @param metadata The metadata for the test run whose details will be fetched.
-   * @return The TestRunDetails object for the provided test run.
-   */
-  public static TestRunDetails processTestDetails(TestRunMetadata metadata) {
-    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-    TestRunDetails details = new TestRunDetails();
-    List<Key> gets = new ArrayList<>();
-        for (long testCaseId : metadata.testRun.getTestCaseIds()) {
-            gets.add(KeyFactory.createKey(TestCaseRunEntity.KIND, testCaseId));
-        }
-    Map<Key, Entity> entityMap = datastore.get(gets);
-    for (int i = 0; i < 1; i++) {
-      for (Key key : entityMap.keySet()) {
-        TestCaseRunEntity testCaseRun = TestCaseRunEntity.fromEntity(entityMap.get(key));
-        if (testCaseRun == null) {
-          continue;
-        }
-        details.addTestCase(testCaseRun);
-      }
-    }
-    return details;
-  }
-
-  @Override
-  public void doGetHandler(HttpServletRequest request, HttpServletResponse response)
-      throws IOException {
-    boolean unfiltered = request.getParameter("unfiltered") != null;
-    boolean showPresubmit = request.getParameter("showPresubmit") != null;
-    boolean showPostsubmit = request.getParameter("showPostsubmit") != null;
-    Long startTime = null; // time in microseconds
-    Long endTime = null; // time in microseconds
-    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-    RequestDispatcher dispatcher = null;
-
-    // message to display if profiling point data is not available
-    String profilingDataAlert = "";
-
-    if (request.getParameter("testName") == null) {
-      request.setAttribute("testName", TABLE_NAME_ERROR);
-      return;
-    }
-    String testName = request.getParameter("testName");
-
-    if (request.getParameter("startTime") != null) {
-      String time = request.getParameter("startTime");
-      try {
-        startTime = Long.parseLong(time);
-        startTime = startTime > 0 ? startTime : null;
-      } catch (NumberFormatException e) {
-        startTime = null;
-      }
-    }
-    if (request.getParameter("endTime") != null) {
-      String time = request.getParameter("endTime");
-      try {
-        endTime = Long.parseLong(time);
-        endTime = endTime > 0 ? endTime : null;
-      } catch (NumberFormatException e) {
-        endTime = null;
-      }
-    }
-
-    // If no params are specified, set to default of postsubmit-only.
-    if (!(showPresubmit || showPostsubmit)) {
-      showPostsubmit = true;
-    }
-
-    // If unfiltered, set showPre- and Post-submit to true for accurate UI.
-    if (unfiltered) {
-      showPostsubmit = true;
-      showPresubmit = true;
-    }
-
-    // Add result names to list
-    List<String> resultNames = new ArrayList<>();
-    for (TestCaseResult r : TestCaseResult.values()) {
-      resultNames.add(r.name());
-    }
-
-    SortDirection dir = SortDirection.DESCENDING;
-    if (startTime != null && endTime == null) {
-      dir = SortDirection.ASCENDING;
-    }
-    Key testKey = KeyFactory.createKey(TestEntity.KIND, testName);
-
-    Filter typeFilter = FilterUtil.getTestTypeFilter(showPresubmit, showPostsubmit, unfiltered);
-    Filter testFilter =
-        FilterUtil.getTimeFilter(
-            testKey, TestRunEntity.KIND, startTime, endTime, typeFilter);
-
-    Map<String, String[]> parameterMap = request.getParameterMap();
-    List<Filter> userTestFilters = FilterUtil.getUserTestFilters(parameterMap);
-    userTestFilters.add(0, testFilter);
-    Filter userDeviceFilter = FilterUtil.getUserDeviceFilter(parameterMap);
-
-    List<TestRunMetadata> testRunMetadata = new ArrayList<>();
-    Map<Key, TestRunMetadata> metadataMap = new HashMap<>();
-    Key minKey = null;
-    Key maxKey = null;
-    List<Key> gets =
-        FilterUtil.getMatchingKeys(
-            testKey,
-            TestRunEntity.KIND,
-            userTestFilters,
-            userDeviceFilter,
-            dir,
-            MAX_RESULT_COUNT);
-    Map<Key, Entity> entityMap = datastore.get(gets);
-    for (Key key : gets) {
-      if (!entityMap.containsKey(key)) {
-        continue;
-      }
-      TestRunEntity testRunEntity = TestRunEntity.fromEntity(entityMap.get(key));
-      if (testRunEntity == null) {
-        continue;
-      }
-      if (minKey == null || key.compareTo(minKey) < 0) {
-        minKey = key;
-      }
-      if (maxKey == null || key.compareTo(maxKey) > 0) {
-        maxKey = key;
-      }
-      TestRunMetadata metadata = new TestRunMetadata(testName, testRunEntity);
-      testRunMetadata.add(metadata);
-      metadataMap.put(key, metadata);
-    }
-
-    List<String> profilingPointNames = new ArrayList<>();
-    if (minKey != null && maxKey != null) {
-      Filter deviceFilter =
-          FilterUtil.getDeviceTimeFilter(
-              testKey, TestRunEntity.KIND, minKey.getId(), maxKey.getId());
-      Query deviceQuery =
-          new Query(DeviceInfoEntity.KIND)
-              .setAncestor(testKey)
-              .setFilter(deviceFilter)
-              .setKeysOnly();
-      List<Key> deviceGets = new ArrayList<>();
-      for (Entity device :
-          datastore
-              .prepare(deviceQuery)
-              .asIterable(DatastoreHelper.getLargeBatchOptions())) {
-        if (metadataMap.containsKey(device.getParent())) {
-          deviceGets.add(device.getKey());
-        }
-      }
-      Map<Key, Entity> devices = datastore.get(deviceGets);
-      for (Key key : devices.keySet()) {
-        if (!metadataMap.containsKey(key.getParent())) {
-          continue;
-        }
-        DeviceInfoEntity device = DeviceInfoEntity.fromEntity(devices.get(key));
-        if (device == null) {
-          continue;
-        }
-        TestRunMetadata metadata = metadataMap.get(key.getParent());
-        metadata.addDevice(device);
-      }
-
-      Filter profilingFilter =
-          FilterUtil.getProfilingTimeFilter(
-              testKey, TestRunEntity.KIND, minKey.getId(), maxKey.getId());
-
-      Set<String> profilingPoints = new HashSet<>();
-      Query profilingPointQuery =
-          new Query(ProfilingPointRunEntity.KIND)
-              .setAncestor(testKey)
-              .setFilter(profilingFilter)
-              .setKeysOnly();
-      for (Entity e : datastore.prepare(profilingPointQuery).asIterable()) {
-        profilingPoints.add(e.getKey().getName());
-      }
-
-      if (profilingPoints.size() == 0) {
-        profilingDataAlert = PROFILING_DATA_ALERT;
-      }
-      profilingPointNames.addAll(profilingPoints);
-      profilingPointNames.sort(Comparator.naturalOrder());
-    }
-
-    testRunMetadata.sort(
-        (t1, t2) ->
-            new Long(t2.testRun.getStartTimestamp()).compareTo(t1.testRun.getStartTimestamp()));
-    List<JsonObject> testRunObjects = new ArrayList<>();
-
-    int prefetchCount = 0;
-    for (TestRunMetadata metadata : testRunMetadata) {
-      if (metadata.testRun.getFailCount() > 0 && prefetchCount < MAX_PREFETCH_COUNT) {
-        // process
-        metadata.addDetails(processTestDetails(metadata));
-        ++prefetchCount;
-      }
-      testRunObjects.add(metadata.toJson());
-    }
-
-    int[] topBuildResultCounts = null;
-    String topBuild = "";
-    if (testRunMetadata.size() > 0) {
-      TestRunMetadata firstRun = testRunMetadata.get(0);
-      topBuild = firstRun.getDeviceInfo();
-      endTime = firstRun.testRun.getStartTimestamp();
-      TestRunDetails topDetails = firstRun.getDetails();
-      if (topDetails == null) {
-        topDetails = processTestDetails(firstRun);
-      }
-      topBuildResultCounts = topDetails.resultCounts;
-
-      TestRunMetadata lastRun = testRunMetadata.get(testRunMetadata.size() - 1);
-      startTime = lastRun.testRun.getStartTimestamp();
-    }
-
-    FilterUtil.setAttributes(request, parameterMap);
-
-    request.setAttribute("testName", request.getParameter("testName"));
-
-    request.setAttribute("error", profilingDataAlert);
-
-    request.setAttribute("profilingPointNames", profilingPointNames);
-    request.setAttribute("resultNames", resultNames);
-    request.setAttribute("resultNamesJson", new Gson().toJson(resultNames));
-    request.setAttribute("testRuns", new Gson().toJson(testRunObjects));
-
-    // data for pie chart
-    request.setAttribute("topBuildResultCounts", new Gson().toJson(topBuildResultCounts));
-    request.setAttribute("topBuildId", topBuild);
-    request.setAttribute("startTime", new Gson().toJson(startTime));
-    request.setAttribute("endTime", new Gson().toJson(endTime));
-    request.setAttribute(
-        "hasNewer",
-        new Gson().toJson(DatastoreHelper.hasNewer(testKey, TestRunEntity.KIND, endTime)));
-    request.setAttribute(
-        "hasOlder",
-        new Gson()
-            .toJson(DatastoreHelper.hasOlder(testKey, TestRunEntity.KIND, startTime)));
-    request.setAttribute("unfiltered", unfiltered);
-    request.setAttribute("showPresubmit", showPresubmit);
-    request.setAttribute("showPostsubmit", showPostsubmit);
-
-    request.setAttribute("branches", new Gson().toJson(DatastoreHelper.getAllBranches()));
-    request.setAttribute("devices", new Gson().toJson(DatastoreHelper.getAllBuildFlavors()));
-
-    dispatcher = request.getRequestDispatcher(TABLE_JSP);
-    try {
-      dispatcher.forward(request, response);
-    } catch (ServletException e) {
-      logger.log(Level.SEVERE, "Servlet Exception caught : " + e.toString());
-    }
-  }
-}
diff --git a/src/main/java/com/android/vts/util/BoxPlot.java b/src/main/java/com/android/vts/util/BoxPlot.java
deleted file mode 100644
index 455d778..0000000
--- a/src/main/java/com/android/vts/util/BoxPlot.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.proto.VtsReportMessage;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/** Helper object for describing time-series box plot data. */
-public class BoxPlot extends Graph {
-    private static final String LABEL_KEY = "label";
-    private static final String SERIES_KEY = "seriesList";
-    private static final String MEAN_KEY = "mean";
-    private static final String STD_KEY = "std";
-    private static final String COUNT_KEY = "count";
-
-    private static final String DAY = "Day";
-
-    private final GraphType type = GraphType.BOX_PLOT;
-    private final String name;
-    private final String xLabel;
-    private final String yLabel;
-    private final Map<String, Map<String, StatSummary>> labelSeriesMap;
-    private final Set<String> seriesSet;
-
-    private int count;
-    private List<String> labels;
-
-    public BoxPlot(String name, String xLabel, String yLabel) {
-        this.name = name;
-        this.xLabel = xLabel == null ? DAY : xLabel;
-        this.yLabel = yLabel;
-        this.count = 0;
-        this.labelSeriesMap = new HashMap<>();
-        this.seriesSet = new HashSet<>();
-        this.labels = new ArrayList<>();
-    }
-
-    /**
-     * Get the x axis label.
-     *
-     * @return The x axis label.
-     */
-    @Override
-    public String getXLabel() {
-        return xLabel;
-    }
-
-    /**
-     * Get the graph type.
-     *
-     * @return The graph type.
-     */
-    @Override
-    public GraphType getType() {
-        return type;
-    }
-
-    /**
-     * Get the name of the graph.
-     *
-     * @return The name of the graph.
-     */
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Get the y axis label.
-     *
-     * @return The y axis label.
-     */
-    @Override
-    public String getYLabel() {
-        return yLabel;
-    }
-
-    /**
-     * Get the number of data points stored in the graph.
-     *
-     * @return The number of data points stored in the graph.
-     */
-    @Override
-    public int size() {
-        return this.count;
-    }
-
-    /**
-     * Add data to the graph.
-     *
-     * @param label The name of the category.
-     * @param profilingPoint The ProfilingPointRunEntity containing data to add.
-     */
-    @Override
-    public void addData(String label, ProfilingPointRunEntity profilingPoint) {
-        StatSummary stat =
-                new StatSummary(
-                        label, VtsReportMessage.VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE);
-        for (long value : profilingPoint.getValues()) {
-            stat.updateStats(value);
-        }
-        addSeriesData(label, "", stat);
-    }
-
-    public void addSeriesData(String label, String series, StatSummary stats) {
-        if (!labelSeriesMap.containsKey(label)) {
-            labelSeriesMap.put(label, new HashMap<>());
-        }
-        Map<String, StatSummary> seriesMap = labelSeriesMap.get(label);
-        seriesMap.put(series, stats);
-        seriesSet.add(series);
-        count += stats.getCount();
-    }
-
-    public void setLabels(List<String> labels) {
-        this.labels = labels;
-    }
-
-    /**
-     * Serializes the graph to json format.
-     *
-     * @return A JsonElement object representing the graph object.
-     */
-    @Override
-    public JsonObject toJson() {
-        JsonObject json = super.toJson();
-        List<JsonObject> stats = new ArrayList<>();
-        List<String> seriesList = new ArrayList<>(seriesSet);
-        seriesList.sort(Comparator.naturalOrder());
-        for (String label : labels) {
-            JsonObject statJson = new JsonObject();
-            String boxLabel = label;
-            List<JsonObject> statList = new ArrayList<>(seriesList.size());
-            Map<String, StatSummary> seriesMap = labelSeriesMap.get(label);
-            for (String series : seriesList) {
-                JsonObject statSummary = new JsonObject();
-                Double mean = null;
-                Double std = null;
-                Integer count = null;
-                if (seriesMap.containsKey(series) && seriesMap.get(series).getCount() > 0) {
-                    StatSummary stat = seriesMap.get(series);
-                    mean = stat.getMean();
-                    std = 0.;
-                    if (stat.getCount() > 1) {
-                        std = stat.getStd();
-                    }
-                    count = stat.getCount();
-                }
-                statSummary.addProperty(MEAN_KEY, mean);
-                statSummary.addProperty(STD_KEY, std);
-                statSummary.addProperty(COUNT_KEY, count);
-                statList.add(statSummary);
-            }
-            statJson.addProperty(LABEL_KEY, boxLabel);
-            statJson.add(VALUE_KEY, new Gson().toJsonTree(statList));
-            stats.add(statJson);
-        }
-        json.add(VALUE_KEY, new Gson().toJsonTree(stats));
-        json.add(SERIES_KEY, new Gson().toJsonTree(seriesList));
-        return json;
-    }
-}
diff --git a/src/main/java/com/android/vts/util/DatastoreHelper.java b/src/main/java/com/android/vts/util/DatastoreHelper.java
deleted file mode 100644
index 782887b..0000000
--- a/src/main/java/com/android/vts/util/DatastoreHelper.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * <p>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
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>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.
- */
-package com.android.vts.util;
-
-
-import com.android.vts.entity.ApiCoverageEntity;
-import com.android.vts.entity.BranchEntity;
-import com.android.vts.entity.BuildTargetEntity;
-import com.android.vts.entity.CodeCoverageEntity;
-import com.android.vts.entity.CoverageEntity;
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestPlanEntity;
-import com.android.vts.entity.TestPlanRunEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.entity.TestRunEntity.TestRunType;
-import com.android.vts.job.VtsAlertJobServlet;
-import com.android.vts.job.VtsCoverageAlertJobServlet;
-import com.android.vts.job.VtsProfilingStatsJobServlet;
-import com.android.vts.proto.VtsReportMessage.AndroidDeviceInfoMessage;
-import com.android.vts.proto.VtsReportMessage.ApiCoverageReportMessage;
-import com.android.vts.proto.VtsReportMessage.CoverageReportMessage;
-import com.android.vts.proto.VtsReportMessage.HalInterfaceMessage;
-import com.android.vts.proto.VtsReportMessage.LogMessage;
-import com.android.vts.proto.VtsReportMessage.ProfilingReportMessage;
-import com.android.vts.proto.VtsReportMessage.TestCaseReportMessage;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.proto.VtsReportMessage.TestPlanReportMessage;
-import com.android.vts.proto.VtsReportMessage.TestReportMessage;
-import com.android.vts.proto.VtsReportMessage.UrlResourceMessage;
-import com.google.appengine.api.datastore.DatastoreFailureException;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.DatastoreTimeoutException;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.FetchOptions;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import com.google.appengine.api.datastore.Transaction;
-import com.google.appengine.api.datastore.TransactionOptions;
-import com.google.common.collect.Lists;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.ConcurrentModificationException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-/**
- * DatastoreHelper, a helper class for interacting with Cloud Datastore.
- */
-public class DatastoreHelper {
-
-  /**
-   * The default kind name for datastore
-   */
-  public static final String NULL_ENTITY_KIND = "nullEntity";
-
-  public static final int MAX_WRITE_RETRIES = 5;
-  /**
-   * This variable is for maximum number of entities per transaction You can find the detail here
-   * (https://cloud.google.com/datastore/docs/concepts/limits)
-   */
-  public static final int MAX_ENTITY_SIZE_PER_TRANSACTION = 300;
-
-  protected static final Logger logger = Logger.getLogger(DatastoreHelper.class.getName());
-  private static final DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-  /**
-   * Get query fetch options for large batches of entities.
-   *
-   * @return FetchOptions with a large chunk and prefetch size.
-   */
-  public static FetchOptions getLargeBatchOptions() {
-    return FetchOptions.Builder.withChunkSize(1000).prefetchSize(1000);
-  }
-
-  /**
-   * Returns true if there are data points newer than lowerBound in the results table.
-   *
-   * @param parentKey The parent key to use in the query.
-   * @param kind The query entity kind.
-   * @param lowerBound The (exclusive) lower time bound, long, microseconds.
-   * @return boolean True if there are newer data points.
-   */
-  public static boolean hasNewer(Key parentKey, String kind, Long lowerBound) {
-    if (lowerBound == null || lowerBound <= 0) {
-      return false;
-    }
-    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-    Key startKey = KeyFactory.createKey(parentKey, kind, lowerBound);
-    Filter startFilter =
-            new FilterPredicate(
-                    Entity.KEY_RESERVED_PROPERTY, FilterOperator.GREATER_THAN, startKey);
-    Query q = new Query(kind).setAncestor(parentKey).setFilter(startFilter).setKeysOnly();
-    return datastore.prepare(q).countEntities(FetchOptions.Builder.withLimit(1)) > 0;
-  }
-
-  /**
-   * Returns true if there are data points older than upperBound in the table.
-   *
-   * @param parentKey The parent key to use in the query.
-   * @param kind The query entity kind.
-   * @param upperBound The (exclusive) upper time bound, long, microseconds.
-   * @return boolean True if there are older data points.
-   */
-  public static boolean hasOlder(Key parentKey, String kind, Long upperBound) {
-    if (upperBound == null || upperBound <= 0) {
-      return false;
-    }
-    Key endKey = KeyFactory.createKey(parentKey, kind, upperBound);
-    Filter endFilter =
-            new FilterPredicate(Entity.KEY_RESERVED_PROPERTY, FilterOperator.LESS_THAN, endKey);
-    Query q = new Query(kind).setAncestor(parentKey).setFilter(endFilter).setKeysOnly();
-    return datastore.prepare(q).countEntities(FetchOptions.Builder.withLimit(1)) > 0;
-  }
-
-  /**
-   * Get all of the devices branches.
-   *
-   * @return a list of all branches.
-   */
-  public static List<String> getAllBranches() {
-    Query query = new Query(BranchEntity.KIND).setKeysOnly();
-    List<String> branches = new ArrayList<>();
-    for (Entity e : datastore.prepare(query).asIterable(getLargeBatchOptions())) {
-      branches.add(e.getKey().getName());
-    }
-    return branches;
-  }
-
-  /**
-   * Get all of the device build flavors.
-   *
-   * @return a list of all device build flavors.
-   */
-  public static List<String> getAllBuildFlavors() {
-    Query query = new Query(BuildTargetEntity.KIND).setKeysOnly();
-    List<String> devices = new ArrayList<>();
-    for (Entity e : datastore.prepare(query).asIterable(getLargeBatchOptions())) {
-      devices.add(e.getKey().getName());
-    }
-    return devices;
-  }
-
-  /**
-   * Datastore Transactional process for data insertion with MAX_WRITE_RETRIES times and withXG of
-   * false value
-   *
-   * @param entity The entity that you want to insert to datastore.
-   * @param entityList The list of entity for using datastore put method.
-   */
-  private static boolean datastoreTransactionalRetry(Entity entity, List<Entity> entityList) {
-    return datastoreTransactionalRetryWithXG(entity, entityList, false);
-  }
-
-  /**
-   * Datastore Transactional process for data insertion with MAX_WRITE_RETRIES times
-   *
-   * @param entity The entity that you want to insert to datastore.
-   * @param entityList The list of entity for using datastore put method.
-   */
-  private static boolean datastoreTransactionalRetryWithXG(
-          Entity entity, List<Entity> entityList, boolean withXG) {
-    int retries = 0;
-    while (true) {
-      Transaction txn;
-      if (withXG) {
-        TransactionOptions options = TransactionOptions.Builder.withXG(withXG);
-        txn = datastore.beginTransaction(options);
-      } else {
-        txn = datastore.beginTransaction();
-      }
-
-      try {
-        // Check if test already exists in the database
-        if (!entity.getKind().equalsIgnoreCase(NULL_ENTITY_KIND)) {
-          try {
-            if (entity.getKind().equalsIgnoreCase("Test")) {
-              Entity datastoreEntity = datastore.get(entity.getKey());
-              TestEntity datastoreTestEntity = TestEntity.fromEntity(datastoreEntity);
-              if (datastoreTestEntity == null
-                      || !datastoreTestEntity.equals(entity)) {
-                entityList.add(entity);
-              }
-            } else if (entity.getKind().equalsIgnoreCase("TestPlan")) {
-              datastore.get(entity.getKey());
-            } else {
-              datastore.get(entity.getKey());
-            }
-          } catch (EntityNotFoundException e) {
-            entityList.add(entity);
-          }
-        }
-        datastore.put(txn, entityList);
-        txn.commit();
-        break;
-      } catch (ConcurrentModificationException
-              | DatastoreFailureException
-              | DatastoreTimeoutException e) {
-        entityList.remove(entity);
-        logger.log(
-                Level.WARNING,
-                "Retrying insert kind: " + entity.getKind() + " key: " + entity.getKey());
-        if (retries++ >= MAX_WRITE_RETRIES) {
-          logger.log(
-                  Level.SEVERE,
-                  "Exceeded maximum retries kind: "
-                          + entity.getKind()
-                          + " key: "
-                          + entity.getKey());
-          return false;
-        }
-      } finally {
-        if (txn.isActive()) {
-          logger.log(
-                  Level.WARNING, "Transaction rollback forced for : " + entity.getKind());
-          txn.rollback();
-        }
-      }
-    }
-    return true;
-  }
-}
diff --git a/src/main/java/com/android/vts/util/EmailHelper.java b/src/main/java/com/android/vts/util/EmailHelper.java
deleted file mode 100644
index de1d6e9..0000000
--- a/src/main/java/com/android/vts/util/EmailHelper.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * <p>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
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>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.
- */
-package com.android.vts.util;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.entity.UserFavoriteEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
-import org.apache.commons.lang.StringUtils;
-
-/** EmailHelper, a helper class for building and sending emails. */
-public class EmailHelper {
-    protected static final Logger logger = Logger.getLogger(EmailHelper.class.getName());
-    protected static String DEFAULT_EMAIL;
-    protected static String EMAIL_DOMAIN;
-    protected static String SENDER_EMAIL;
-    private static final String VTS_EMAIL_NAME = "VTS Alert Bot";
-
-    public static void setPropertyValues(Properties systemConfigProp) {
-        DEFAULT_EMAIL = systemConfigProp.getProperty("appengine.defaultEmail");
-        EMAIL_DOMAIN = systemConfigProp.getProperty("appengine.emailDomain");
-        SENDER_EMAIL = systemConfigProp.getProperty("appengine.senderEmail");
-    }
-
-    /**
-     * Create an email footer with the information from the test run.
-     *
-     * @param testRun The TestRunEntity containing test run metadata, or null.
-     * @param devices The list of devices whose fingerprints to include in the email, or null.
-     * @param link A link to the Dashboard page containing more information.
-     * @return The String email footer.
-     */
-    public static String getEmailFooter(
-            TestRunEntity testRun, List<DeviceInfoEntity> devices, String link) {
-        StringBuilder sb = new StringBuilder();
-        sb.append("<br><br>");
-        if (devices != null) {
-            for (DeviceInfoEntity device : devices) {
-                sb.append("Device: " + device.getFingerprint() + "<br>");
-            }
-        }
-
-        if (testRun != null) {
-            sb.append("VTS Build ID: " + testRun.getTestBuildId() + "<br>");
-            sb.append("Start Time: " + TimeUtil.getDateTimeZoneString(testRun.getStartTimestamp()));
-            sb.append("<br>End Time: " + TimeUtil.getDateTimeZoneString(testRun.getEndTimestamp()));
-        }
-        sb.append(
-                "<br><br>For details, visit the"
-                        + " <a href='"
-                        + link
-                        + "'>"
-                        + "VTS dashboard.</a>");
-        return sb.toString();
-    }
-
-    /**
-     * Fetches the list of subscriber email addresses for a test.
-     *
-     * @param testKey The key for the test for which to fetch the email addresses.
-     * @returns List of email addresses (String).
-     * @throws IOException
-     */
-    public static List<String> getSubscriberEmails(Key testKey) throws IOException {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Filter testFilter =
-                new FilterPredicate(UserFavoriteEntity.TEST_KEY, FilterOperator.EQUAL, testKey);
-        Query favoritesQuery = new Query(UserFavoriteEntity.KIND).setFilter(testFilter);
-        Set<String> emailSet = new HashSet<>();
-        if (!StringUtils.isBlank(DEFAULT_EMAIL)) {
-            emailSet.add(DEFAULT_EMAIL);
-        }
-        for (Entity favorite : datastore.prepare(favoritesQuery).asIterable()) {
-            UserFavoriteEntity favoriteEntity = UserFavoriteEntity.fromEntity(favorite);
-            // TODO this logic need to be reexamined thoroughly and improved
-            if (favoriteEntity != null
-                    && favoriteEntity.user != null
-                    && !favoriteEntity.muteNotifications) {
-                Optional<String> userEmail = Optional.of(favoriteEntity.user.getEmail());
-                if (userEmail.isPresent() &&
-                        userEmail.orElse("").endsWith(EMAIL_DOMAIN)) {
-                    emailSet.add(favoriteEntity.user.getEmail());
-                }
-            }
-        }
-        return new ArrayList<>(emailSet);
-    }
-
-    /**
-     * Sends an email to the specified email address to notify of a test status change.
-     *
-     * @param emails List of subscriber email addresses (byte[]) to which the email should be sent.
-     * @param subject The email subject field, string.
-     * @param body The html (string) body to send in the email.
-     * @returns The Message object to be sent.
-     * @throws MessagingException, UnsupportedEncodingException
-     */
-    public static Message composeEmail(List<String> emails, String subject, String body)
-            throws MessagingException, UnsupportedEncodingException {
-        if (emails.size() == 0) {
-            throw new MessagingException("No subscriber email addresses provided");
-        }
-        Properties props = new Properties();
-        Session session = Session.getDefaultInstance(props, null);
-
-        Message msg = new MimeMessage(session);
-        for (String email : emails) {
-            try {
-                msg.addRecipient(Message.RecipientType.TO, new InternetAddress(email, email));
-            } catch (MessagingException | UnsupportedEncodingException e) {
-                // Gracefully continue when a subscriber email is invalid.
-                logger.log(Level.WARNING, "Error sending email to recipient " + email + " : ", e);
-            }
-        }
-        msg.setFrom(new InternetAddress(SENDER_EMAIL, VTS_EMAIL_NAME));
-        msg.setSubject(subject);
-        msg.setContent(body, "text/html; charset=utf-8");
-        return msg;
-    }
-
-    /**
-     * Sends an email.
-     *
-     * @param msg Message object to send.
-     * @returns true if the message sends successfully, false otherwise
-     */
-    public static boolean send(Message msg) {
-        try {
-            Transport.send(msg);
-        } catch (MessagingException e) {
-            logger.log(Level.WARNING, "Error sending email : ", e);
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Sends a list of emails and logs any failures.
-     *
-     * @param messages List of Message objects to be sent.
-     */
-    public static void sendAll(List<Message> messages) {
-        for (Message msg : messages) {
-            send(msg);
-        }
-    }
-
-    /**
-     * Sends an email.
-     *
-     * @param recipients List of email address strings to which an email will be sent.
-     * @param subject The subject of the email.
-     * @param body The body of the email.
-     * @returns true if the message sends successfully, false otherwise
-     */
-    public static boolean send(List<String> recipients, String subject, String body) {
-        try {
-            Message msg = composeEmail(recipients, subject, body);
-            return send(msg);
-        } catch (MessagingException | UnsupportedEncodingException e) {
-            logger.log(Level.WARNING, "Error composing email : ", e);
-            return false;
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/util/FilterUtil.java b/src/main/java/com/android/vts/util/FilterUtil.java
deleted file mode 100644
index 5a567e5..0000000
--- a/src/main/java/com/android/vts/util/FilterUtil.java
+++ /dev/null
@@ -1,537 +0,0 @@
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * <p>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
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>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.
- */
-package com.android.vts.util;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.FetchOptions;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.datastore.Query.CompositeFilterOperator;
-import com.google.appengine.api.datastore.Query.Filter;
-import com.google.appengine.api.datastore.Query.FilterOperator;
-import com.google.appengine.api.datastore.Query.FilterPredicate;
-import com.google.common.collect.Sets;
-import com.google.gson.Gson;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import javax.servlet.http.HttpServletRequest;
-
-/** FilterUtil, a helper class for parsing and matching search queries to data. */
-public class FilterUtil {
-    protected static final Logger logger = Logger.getLogger(FilterUtil.class.getName());
-    private static final String INEQUALITY_REGEX = "(<=|>=|<|>|=)";
-
-    /** Key class to represent a filter token. */
-    public enum FilterKey {
-        DEVICE_BUILD_ID("deviceBuildId", DeviceInfoEntity.BUILD_ID, true),
-        BRANCH("branch", DeviceInfoEntity.BRANCH, true),
-        TARGET("device", DeviceInfoEntity.BUILD_FLAVOR, true),
-        VTS_BUILD_ID("testBuildId", TestRunEntity.TEST_BUILD_ID, false),
-        HOSTNAME("hostname", TestRunEntity.HOST_NAME, false),
-        PASSING("passing", TestRunEntity.PASS_COUNT, false),
-        NONPASSING("nonpassing", TestRunEntity.FAIL_COUNT, false);
-
-        private static final Map<String, FilterKey> keyMap;
-
-        static {
-            keyMap = new HashMap<>();
-            for (FilterKey k : EnumSet.allOf(FilterKey.class)) {
-                keyMap.put(k.keyString, k);
-            }
-        }
-
-        /**
-         * Test if a string is a valid device key.
-         *
-         * @param keyString The key string.
-         * @return True if they key string matches a key and the key is a device filter.
-         */
-        public static boolean isDeviceKey(String keyString) {
-            return keyMap.containsKey(keyString) && keyMap.get(keyString).isDevice;
-        }
-
-        /**
-         * Test if a string is a valid test key.
-         *
-         * @param keyString The key string.
-         * @return True if they key string matches a key and the key is a test filter.
-         */
-        public static boolean isTestKey(String keyString) {
-            return keyMap.containsKey(keyString) && !keyMap.get(keyString).isDevice;
-        }
-
-        /**
-         * Parses a key string into a key.
-         *
-         * @param keyString The key string.
-         * @return The key matching the key string.
-         */
-        public static FilterKey parse(String keyString) {
-            return keyMap.get(keyString);
-        }
-
-        private final String keyString;
-        private final String property;
-        private final boolean isDevice;
-
-        /**
-         * Constructs a key with the specified key string.
-         *
-         * @param keyString The identifying key string.
-         * @param propertyName The name of the property to match.
-         */
-        private FilterKey(String keyString, String propertyName, boolean isDevice) {
-            this.keyString = keyString;
-            this.property = propertyName;
-            this.isDevice = isDevice;
-        }
-
-        /**
-         * Return a filter predicate for string equality.
-         *
-         * @param matchString The string to match.
-         * @return A filter predicate enforcing equality on the property.
-         */
-        public FilterPredicate getFilterForString(String matchString) {
-            return new FilterPredicate(this.property, FilterOperator.EQUAL, matchString);
-        }
-
-        /**
-         * Return a filter predicate for number inequality or equality.
-         *
-         * @param matchNumber A string, either a number or an inequality symbol followed by a
-         *     number.
-         * @return A filter predicate enforcing equality on the property, or null if invalid.
-         */
-        public FilterPredicate getFilterForNumber(String matchNumber) {
-            String numberString = matchNumber.trim();
-            Pattern p = Pattern.compile(INEQUALITY_REGEX);
-            Matcher m = p.matcher(numberString);
-
-            // Default operator is equality.
-            FilterOperator op = FilterOperator.EQUAL;
-
-            // Determine if there is an inequality operator.
-            if (m.find() && m.start() == 0 && m.end() != numberString.length()) {
-                String opString = m.group();
-
-                // Inequality operator can be <=, <, >, >=, or =.
-                if (opString.equals("<=")) {
-                    op = FilterOperator.LESS_THAN_OR_EQUAL;
-                } else if (opString.equals("<")) {
-                    op = FilterOperator.LESS_THAN;
-                } else if (opString.equals(">")) {
-                    op = FilterOperator.GREATER_THAN;
-                } else if (opString.equals(">=")) {
-                    op = FilterOperator.GREATER_THAN_OR_EQUAL;
-                } else if (!opString.equals("=")) { // unrecognized inequality.
-                    return null;
-                }
-                numberString = matchNumber.substring(m.end()).trim();
-            }
-            try {
-                long number = Long.parseLong(numberString);
-                return new FilterPredicate(this.property, op, number);
-            } catch (NumberFormatException e) {
-                // invalid number
-                return null;
-            }
-        }
-
-        /**
-         * Get the enum value
-         *
-         * @return The string value associated with the key.
-         */
-        public String getValue() {
-            return this.keyString;
-        }
-    }
-
-    /**
-     * Get the common elements among multiple collections.
-     *
-     * @param collections The collections containing all sub collections to find common element.
-     * @return The common elements set found from the collections param.
-     */
-    public static <T> Set<T> getCommonElements(Collection<? extends Collection<T>> collections) {
-
-        Set<T> common = new LinkedHashSet<T>();
-        if (!collections.isEmpty()) {
-            Iterator<? extends Collection<T>> iterator = collections.iterator();
-            common.addAll(iterator.next());
-            while (iterator.hasNext()) {
-                common.retainAll(iterator.next());
-            }
-        }
-        return common;
-    }
-
-    /**
-     * Get the first value associated with the key in the parameter map.
-     *
-     * @param parameterMap The parameter map with string keys and (Object) String[] values.
-     * @param key The key whose value to get.
-     * @return The first value associated with the provided key.
-     */
-    public static String getFirstParameter(Map<String, String[]> parameterMap, String key) {
-        String[] values = (String[]) parameterMap.get(key);
-        if (values.length == 0) return null;
-        return values[0];
-    }
-
-    /**
-     * Get a filter on devices from a user search query.
-     *
-     * @param parameterMap The key-value map of url parameters.
-     * @return A filter with the values from the user search parameters.
-     */
-    public static Filter getUserDeviceFilter(Map<String, String[]> parameterMap) {
-        Filter deviceFilter = null;
-        for (String key : parameterMap.keySet()) {
-            if (!FilterKey.isDeviceKey(key)) continue;
-            String value = getFirstParameter(parameterMap, key);
-            if (value == null) continue;
-            FilterKey filterKey = FilterKey.parse(key);
-            Filter f = filterKey.getFilterForString(value);
-            if (deviceFilter == null) {
-                deviceFilter = f;
-            } else {
-                deviceFilter = CompositeFilterOperator.and(deviceFilter, f);
-            }
-        }
-        return deviceFilter;
-    }
-
-    /**
-     * Get a list of test filters given the user parameters.
-     *
-     * @param parameterMap The key-value map of url parameters.
-     * @return A list of filters, each having at most one inequality filter.
-     */
-    public static List<Filter> getUserTestFilters(Map<String, String[]> parameterMap) {
-        List<Filter> userFilters = new ArrayList<>();
-        for (String key : parameterMap.keySet()) {
-            if (!FilterKey.isTestKey(key)) continue;
-            String stringValue = getFirstParameter(parameterMap, key);
-            if (stringValue == null) continue;
-            FilterKey filterKey = FilterKey.parse(key);
-            switch (filterKey) {
-                case NONPASSING:
-                case PASSING:
-                    userFilters.add(filterKey.getFilterForNumber(stringValue));
-                    break;
-                case HOSTNAME:
-                case VTS_BUILD_ID:
-                    userFilters.add(filterKey.getFilterForString(stringValue.toLowerCase()));
-                    break;
-                default:
-                    continue;
-            }
-        }
-        return userFilters;
-    }
-
-    /**
-     * Get a filter on the test run type.
-     *
-     * @param showPresubmit True to display presubmit tests.
-     * @param showPostsubmit True to display postsubmit tests.
-     * @param unfiltered True if no filtering should be applied.
-     * @return A filter on the test type.
-     */
-    public static Filter getTestTypeFilter(
-            boolean showPresubmit, boolean showPostsubmit, boolean unfiltered) {
-        if (unfiltered) {
-            return null;
-        } else if (showPresubmit && !showPostsubmit) {
-            return new FilterPredicate(
-                    TestRunEntity.TYPE,
-                    FilterOperator.EQUAL,
-                    TestRunEntity.TestRunType.PRESUBMIT.getNumber());
-        } else if (showPostsubmit && !showPresubmit) {
-            return new FilterPredicate(
-                    TestRunEntity.TYPE,
-                    FilterOperator.EQUAL,
-                    TestRunEntity.TestRunType.POSTSUBMIT.getNumber());
-        } else {
-            List<Integer> types = new ArrayList<>();
-            types.add(TestRunEntity.TestRunType.PRESUBMIT.getNumber());
-            types.add(TestRunEntity.TestRunType.POSTSUBMIT.getNumber());
-            return new FilterPredicate(TestRunEntity.TYPE, FilterOperator.IN, types);
-        }
-    }
-
-    /**
-     * Get a filter for profiling points between a specified time window.
-     *
-     * @param grandparentKey The key of the profiling point grandparent entity.
-     * @param parentKind The kind of the profiling point parent.
-     * @param startTime The start time of the window, or null if unbounded.
-     * @param endTime The end time of the window, or null if unbounded.
-     * @return A filter to query for profiling points in the time window.
-     */
-    public static Filter getProfilingTimeFilter(
-            Key grandparentKey, String parentKind, Long startTime, Long endTime) {
-        if (startTime == null && endTime == null) {
-            endTime = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        }
-        Filter startFilter = null;
-        Filter endFilter = null;
-        Filter filter = null;
-        if (startTime != null) {
-            Key minRunKey = KeyFactory.createKey(grandparentKey, parentKind, startTime);
-            Key startKey =
-                    KeyFactory.createKey(
-                            minRunKey, ProfilingPointRunEntity.KIND, String.valueOf((char) 0x0));
-            startFilter =
-                    new FilterPredicate(
-                            Entity.KEY_RESERVED_PROPERTY,
-                            FilterOperator.GREATER_THAN_OR_EQUAL,
-                            startKey);
-            filter = startFilter;
-        }
-        if (endTime != null) {
-            Key maxRunKey = KeyFactory.createKey(grandparentKey, parentKind, endTime);
-            Key endKey =
-                    KeyFactory.createKey(
-                            maxRunKey, ProfilingPointRunEntity.KIND, String.valueOf((char) 0xff));
-            endFilter =
-                    new FilterPredicate(
-                            Entity.KEY_RESERVED_PROPERTY,
-                            FilterOperator.LESS_THAN_OR_EQUAL,
-                            endKey);
-            filter = endFilter;
-        }
-        if (startFilter != null && endFilter != null) {
-            filter = CompositeFilterOperator.and(startFilter, endFilter);
-        }
-        return filter;
-    }
-
-    /**
-     * Get a filter for device information between a specified time window.
-     *
-     * @param grandparentKey The key of the device's grandparent entity.
-     * @param parentKind The kind of the device's parent.
-     * @param startTime The start time of the window, or null if unbounded.
-     * @param endTime The end time of the window, or null if unbounded.
-     * @return A filter to query for devices in the time window.
-     */
-    public static Filter getDeviceTimeFilter(
-            Key grandparentKey, String parentKind, Long startTime, Long endTime) {
-        if (startTime == null && endTime == null) {
-            endTime = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        }
-        Filter startFilter = null;
-        Filter endFilter = null;
-        Filter filter = null;
-        if (startTime != null) {
-            Key minRunKey = KeyFactory.createKey(grandparentKey, parentKind, startTime);
-            Key startKey = KeyFactory.createKey(minRunKey, DeviceInfoEntity.KIND, 1);
-            startFilter =
-                    new FilterPredicate(
-                            Entity.KEY_RESERVED_PROPERTY,
-                            FilterOperator.GREATER_THAN_OR_EQUAL,
-                            startKey);
-            filter = startFilter;
-        }
-        if (endTime != null) {
-            Key maxRunKey = KeyFactory.createKey(grandparentKey, parentKind, endTime);
-            Key endKey = KeyFactory.createKey(maxRunKey, DeviceInfoEntity.KIND, Long.MAX_VALUE);
-            endFilter =
-                    new FilterPredicate(
-                            Entity.KEY_RESERVED_PROPERTY,
-                            FilterOperator.LESS_THAN_OR_EQUAL,
-                            endKey);
-            filter = endFilter;
-        }
-        if (startFilter != null && endFilter != null) {
-            filter = CompositeFilterOperator.and(startFilter, endFilter);
-        }
-        return filter;
-    }
-
-    /**
-     * Get the time range filter to apply to a query.
-     *
-     * @param testKey The key of the parent TestEntity object.
-     * @param kind The kind to use for the filters.
-     * @param startTime The start time in microseconds, or null if unbounded.
-     * @param endTime The end time in microseconds, or null if unbounded.
-     * @param testRunFilter The existing filter on test runs to apply, or null.
-     * @return A filter to apply on test runs.
-     */
-    public static Filter getTimeFilter(
-            Key testKey, String kind, Long startTime, Long endTime, Filter testRunFilter) {
-        if (startTime == null && endTime == null) {
-            endTime = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
-        }
-
-        Filter startFilter = null;
-        Filter endFilter = null;
-        Filter filter = null;
-        if (startTime != null) {
-            Key startKey = KeyFactory.createKey(testKey, kind, startTime);
-            startFilter =
-                    new FilterPredicate(
-                            Entity.KEY_RESERVED_PROPERTY,
-                            FilterOperator.GREATER_THAN_OR_EQUAL,
-                            startKey);
-            filter = startFilter;
-        }
-        if (endTime != null) {
-            Key endKey = KeyFactory.createKey(testKey, kind, endTime);
-            endFilter =
-                    new FilterPredicate(
-                            Entity.KEY_RESERVED_PROPERTY,
-                            FilterOperator.LESS_THAN_OR_EQUAL,
-                            endKey);
-            filter = endFilter;
-        }
-        if (startFilter != null && endFilter != null) {
-            filter = CompositeFilterOperator.and(startFilter, endFilter);
-        }
-        if (testRunFilter != null) {
-            filter = CompositeFilterOperator.and(filter, testRunFilter);
-        }
-        return filter;
-    }
-
-    public static Filter getTimeFilter(Key testKey, String kind, Long startTime, Long endTime) {
-        return getTimeFilter(testKey, kind, startTime, endTime, null);
-    }
-
-    /**
-     * Get the list of keys matching the provided test filter and device filter.
-     *
-     * @param ancestorKey The ancestor key to use in the query.
-     * @param kind The entity kind to use in the test query.
-     * @param testFilters The filter list to apply to test runs (each having <=1 inequality filter).
-     * @param deviceFilter The filter to apply to associated devices.
-     * @param dir The sort direction of the returned list.
-     * @param maxSize The maximum number of entities to return.
-     * @return a list of keys matching the provided test and device filters.
-     */
-    public static List<Key> getMatchingKeys(
-            Key ancestorKey,
-            String kind,
-            List<Filter> testFilters,
-            Filter deviceFilter,
-            Query.SortDirection dir,
-            int maxSize) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Set<Key> matchingTestKeys = null;
-        Key minKey = null;
-        Key maxKey = null;
-        for (Filter testFilter : testFilters) {
-            Query testQuery =
-                    new Query(kind).setAncestor(ancestorKey).setFilter(testFilter).setKeysOnly();
-            Set<Key> filterMatches = new HashSet<>();
-            FetchOptions ops = DatastoreHelper.getLargeBatchOptions();
-            if (deviceFilter == null && testFilters.size() == 1) {
-                ops.limit(maxSize);
-                testQuery.addSort(Entity.KEY_RESERVED_PROPERTY, dir);
-            }
-            logger.log(Level.INFO, "testQuery => " + testQuery);
-            for (Entity testRunKey : datastore.prepare(testQuery).asIterable(ops)) {
-                filterMatches.add(testRunKey.getKey());
-                if (maxKey == null || testRunKey.getKey().compareTo(maxKey) > 0)
-                    maxKey = testRunKey.getKey();
-                if (minKey == null || testRunKey.getKey().compareTo(minKey) < 0)
-                    minKey = testRunKey.getKey();
-            }
-            if (matchingTestKeys == null) {
-                matchingTestKeys = filterMatches;
-            } else {
-                matchingTestKeys = Sets.intersection(matchingTestKeys, filterMatches);
-            }
-        }
-        logger.log(Level.INFO, "matchingTestKeys => " + matchingTestKeys);
-
-        Set<Key> allMatchingKeys;
-        if (deviceFilter == null || matchingTestKeys.size() == 0) {
-            allMatchingKeys = matchingTestKeys;
-        } else {
-            deviceFilter =
-                    CompositeFilterOperator.and(
-                            deviceFilter,
-                            getDeviceTimeFilter(
-                                    minKey.getParent(),
-                                    minKey.getKind(),
-                                    minKey.getId(),
-                                    maxKey.getId()));
-            allMatchingKeys = new HashSet<>();
-            Query deviceQuery =
-                    new Query(DeviceInfoEntity.KIND)
-                            .setAncestor(ancestorKey)
-                            .setFilter(deviceFilter)
-                            .setKeysOnly();
-            for (Entity device :
-                    datastore
-                            .prepare(deviceQuery)
-                            .asIterable(DatastoreHelper.getLargeBatchOptions())) {
-                if (matchingTestKeys.contains(device.getKey().getParent())) {
-                    allMatchingKeys.add(device.getKey().getParent());
-                }
-            }
-        }
-        logger.log(Level.INFO, "allMatchingKeys => " + allMatchingKeys);
-        List<Key> gets = new ArrayList<>(allMatchingKeys);
-        if (dir == Query.SortDirection.DESCENDING) {
-            gets.sort(Comparator.reverseOrder());
-        } else {
-            gets.sort(Comparator.naturalOrder());
-        }
-        gets = gets.subList(0, Math.min(gets.size(), maxSize));
-        return gets;
-    }
-
-    /**
-     * Set the request with the provided key/value attribute map.
-     *
-     * @param request The request whose attributes to set.
-     * @param parameterMap The map from key to (Object) String[] value whose entries to parse.
-     */
-    public static void setAttributes(HttpServletRequest request, Map<String, String[]> parameterMap) {
-        for (String key : parameterMap.keySet()) {
-            if (!FilterKey.isDeviceKey(key) && !FilterKey.isTestKey(key)) continue;
-            FilterKey filterKey = FilterKey.parse(key);
-            String[] values = parameterMap.get(key);
-            if (values.length == 0) continue;
-            String stringValue = values[0];
-            request.setAttribute(filterKey.keyString, new Gson().toJson(stringValue));
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/util/GcsHelper.java b/src/main/java/com/android/vts/util/GcsHelper.java
deleted file mode 100644
index b2c6aac..0000000
--- a/src/main/java/com/android/vts/util/GcsHelper.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.android.vts.util;
-
-import com.google.auth.oauth2.ServiceAccountCredentials;
-import com.google.cloud.storage.Storage;
-import com.google.cloud.storage.StorageOptions;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Optional;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** GcsHelper, a helper class for interacting with Google Cloud Storage. */
-public class GcsHelper {
-    private static final Logger logger = Logger.getLogger(GcsHelper.class.getName());
-
-    /** Google Cloud Storage project ID */
-    private static String GCS_PROJECT_ID;
-
-    public static void setGcsProjectId(String gcsProjectId) {
-        GCS_PROJECT_ID = gcsProjectId;
-    }
-
-    /**
-     * Get GCS storage from Key file input stream parameter.
-     */
-    public static Optional<Storage> getStorage(InputStream keyFileInputStream) {
-
-        if (keyFileInputStream == null) {
-            logger.log(Level.SEVERE, "Error GCS key file is not exiting. Check key file!");
-            return Optional.empty();
-        } else {
-            try {
-                Storage storage =
-                        StorageOptions.newBuilder()
-                                .setProjectId(GCS_PROJECT_ID)
-                                .setCredentials(
-                                        ServiceAccountCredentials.fromStream(keyFileInputStream))
-                                .build()
-                                .getService();
-                return Optional.of(storage);
-            } catch (IOException e) {
-                logger.log(Level.SEVERE, "Error on creating storage instance!");
-                return Optional.empty();
-            }
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/util/Graph.java b/src/main/java/com/android/vts/util/Graph.java
deleted file mode 100644
index 00c2a3d..0000000
--- a/src/main/java/com/android/vts/util/Graph.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-
-/** Helper object for describing graph data. */
-public abstract class Graph {
-    public static final String VALUE_KEY = "values";
-    public static final String X_LABEL_KEY = "x_label";
-    public static final String Y_LABEL_KEY = "y_label";
-    public static final String IDS_KEY = "ids";
-    public static final String NAME_KEY = "name";
-    public static final String TYPE_KEY = "type";
-
-    public static enum GraphType { LINE_GRAPH, HISTOGRAM, BOX_PLOT }
-
-    /**
-     * Get the graph type.
-     *
-     * @return The graph type.
-     */
-    public abstract GraphType getType();
-
-    /**
-     * Get the x axis label.
-     *
-     * @return The x axis label.
-     */
-    public abstract String getXLabel();
-
-    /**
-     * Get the y axis label.
-     *
-     * @return The y axis label.
-     */
-    public abstract String getYLabel();
-
-    /**
-     * Get the name of the graph.
-     *
-     * @return The name of the graph.
-     */
-    public abstract String getName();
-
-    /**
-     * Get the number of data points stored in the graph.
-     *
-     * @return The number of data points stored in the graph.
-     */
-    public abstract int size();
-
-    /**
-     * Add data to the graph.
-     *
-     * @param id The name of the graph.
-     * @param profilingPoint The ProfilingPointEntity containing data to add.
-     */
-    public abstract void addData(String id, ProfilingPointRunEntity profilingPoint);
-
-    /**
-     * Serializes the graph to json format.
-     *
-     * @return A JsonElement object representing the graph object.
-     */
-    public JsonObject toJson() {
-        JsonObject json = new JsonObject();
-        json.add(X_LABEL_KEY, new JsonPrimitive(getXLabel()));
-        json.add(Y_LABEL_KEY, new JsonPrimitive(getYLabel()));
-        json.add(NAME_KEY, new JsonPrimitive(getName()));
-        json.add(TYPE_KEY, new JsonPrimitive(getType().toString()));
-        return json;
-    }
-}
diff --git a/src/main/java/com/android/vts/util/GraphSerializer.java b/src/main/java/com/android/vts/util/GraphSerializer.java
deleted file mode 100644
index 722b511..0000000
--- a/src/main/java/com/android/vts/util/GraphSerializer.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonSerializationContext;
-import com.google.gson.JsonSerializer;
-import java.lang.reflect.Type;
-
-/** Serializer class for Graph objects. */
-public class GraphSerializer implements JsonSerializer<Graph> {
-    @Override
-    public JsonElement serialize(Graph src, Type typeOfSrc, JsonSerializationContext context) {
-        return src.toJson();
-    }
-}
diff --git a/src/main/java/com/android/vts/util/Histogram.java b/src/main/java/com/android/vts/util/Histogram.java
deleted file mode 100644
index 2f62a57..0000000
--- a/src/main/java/com/android/vts/util/Histogram.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.google.common.primitives.Doubles;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.math3.stat.descriptive.rank.Percentile;
-
-/** Helper object for describing graph data. */
-public class Histogram extends Graph {
-    public static final String PERCENTILES_KEY = "percentiles";
-    public static final String PERCENTILE_VALUES_KEY = "percentile_values";
-    public static final String MIN_KEY = "min";
-    public static final String MAX_KEY = "max";
-
-    private List<Double> values;
-    private List<String> ids;
-    private String xLabel;
-    private String yLabel;
-    private String name;
-    private GraphType type = GraphType.HISTOGRAM;
-    private Double min = null;
-    private Double max = null;
-
-    public Histogram(String name) {
-        this.name = name;
-        this.values = new ArrayList<>();
-        this.ids = new ArrayList<>();
-    }
-
-    /**
-     * Get the x axis label.
-     *
-     * @return The x axis label.
-     */
-    @Override
-    public String getXLabel() {
-        return xLabel;
-    }
-
-    /**
-     * Get the graph type.
-     *
-     * @return The graph type.
-     */
-    @Override
-    public GraphType getType() {
-        return type;
-    }
-
-    /**
-     * Get the name of the graph.
-     *
-     * @return The name of the graph.
-     */
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Get the y axis label.
-     *
-     * @return The y axis label.
-     */
-    @Override
-    public String getYLabel() {
-        return yLabel;
-    }
-
-    /**
-     * Get the number of data points stored in the graph.
-     *
-     * @return The number of data points stored in the graph.
-     */
-    @Override
-    public int size() {
-        return values.size();
-    }
-
-    /**
-     * Get the minimum value.
-     *
-     * @return The minimum value.
-     */
-    public Double getMin() {
-        return min;
-    }
-
-    /**
-     * Get the maximum value.
-     *
-     * @return The maximum value.
-     */
-    public Double getMax() {
-        return max;
-    }
-
-    /**
-     * Add data to the graph.
-     *
-     * @param id The name of the graph.
-     * @param profilingPoint The ProfilingPointRunEntity containing data to add.
-     */
-    @Override
-    public void addData(String id, ProfilingPointRunEntity profilingPoint) {
-        if (profilingPoint.getValues().size() == 0)
-            return;
-        xLabel = profilingPoint.getXLabel();
-        yLabel = profilingPoint.getYLabel();
-        for (long v : profilingPoint.getValues()) {
-            double value = v;
-            values.add(value);
-            ids.add(id);
-            if (max == null || value > max)
-                max = value;
-            if (min == null || value < min)
-                min = value;
-        }
-    }
-
-    /**
-     * Serializes the graph to json format.
-     *
-     * @return A JsonElement object representing the graph object.
-     */
-    @Override
-    public JsonObject toJson() {
-        int[] percentiles = {1, 2, 5, 10, 25, 50, 75, 90, 95, 98, 99};
-        double[] percentileValues = new double[percentiles.length];
-        double[] valueList = Doubles.toArray(values);
-        for (int i = 0; i < percentiles.length; i++) {
-            percentileValues[i] =
-                    Math.round(new Percentile().evaluate(valueList, percentiles[i]) * 1000d)
-                    / 1000d;
-        }
-        JsonObject json = super.toJson();
-        json.add(VALUE_KEY, new Gson().toJsonTree(values).getAsJsonArray());
-        json.add(PERCENTILES_KEY, new Gson().toJsonTree(percentiles).getAsJsonArray());
-        json.add(PERCENTILE_VALUES_KEY, new Gson().toJsonTree(percentileValues).getAsJsonArray());
-        json.add(IDS_KEY, new Gson().toJsonTree(ids).getAsJsonArray());
-        json.add(MIN_KEY, new JsonPrimitive(min));
-        json.add(MAX_KEY, new JsonPrimitive(max));
-        return json;
-    }
-}
diff --git a/src/main/java/com/android/vts/util/LineGraph.java b/src/main/java/com/android/vts/util/LineGraph.java
deleted file mode 100644
index 4788961..0000000
--- a/src/main/java/com/android/vts/util/LineGraph.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/** Helper object for describing graph data. */
-public class LineGraph extends Graph {
-    public static final String TICKS_KEY = "ticks";
-
-    private List<ProfilingPointRunEntity> profilingRuns;
-    private List<String> ids;
-    private String xLabel;
-    private String yLabel;
-    private String name;
-    private GraphType type = GraphType.LINE_GRAPH;
-
-    public LineGraph(String name) {
-        this.name = name;
-        profilingRuns = new ArrayList<>();
-        ids = new ArrayList<>();
-    }
-
-    /**
-     * Get the x axis label.
-     *
-     * @return The x axis label.
-     */
-    @Override
-    public String getXLabel() {
-        return xLabel;
-    }
-
-    /**
-     * Get the graph type.
-     *
-     * @return The graph type.
-     */
-    @Override
-    public GraphType getType() {
-        return type;
-    }
-
-    /**
-     * Get the name of the graph.
-     *
-     * @return The name of the graph.
-     */
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Get the y axis label.
-     *
-     * @return The y axis label.
-     */
-    @Override
-    public String getYLabel() {
-        return yLabel;
-    }
-
-    /**
-     * Get the number of data points stored in the graph.
-     *
-     * @return The number of data points stored in the graph.
-     */
-    @Override
-    public int size() {
-        return profilingRuns.size();
-    }
-
-    /**
-     * Add data to the graph.
-     *
-     * @param id The name of the graph.
-     * @param profilingPoint The ProfilingPointRunEntity containing data to add.
-     */
-    @Override
-    public void addData(String id, ProfilingPointRunEntity profilingPoint) {
-        if (profilingPoint.getValues().size() == 0
-                || profilingPoint.getValues().size() != profilingPoint.getLabels().size())
-            return;
-        ids.add(id);
-        profilingRuns.add(profilingPoint);
-        xLabel = profilingPoint.getXLabel();
-        yLabel = profilingPoint.getYLabel();
-    }
-
-    /**
-     * Serializes the graph to json format.
-     *
-     * @return A JsonElement object representing the graph object.
-     */
-    @Override
-    public JsonObject toJson() {
-        JsonObject json = super.toJson();
-        // Use the most recent profiling vector to generate the labels
-        ProfilingPointRunEntity profilingRun = profilingRuns.get(profilingRuns.size() - 1);
-
-        List<String> axisTicks = new ArrayList<>();
-        Map<String, Integer> tickIndexMap = new HashMap<>();
-        for (int i = 0; i < profilingRun.getLabels().size(); i++) {
-            String label = profilingRun.getLabels().get(i);
-            axisTicks.add(label);
-            tickIndexMap.put(label, i);
-        }
-
-        long[][] lineGraphValues = new long[axisTicks.size()][profilingRuns.size()];
-        for (int reportIndex = 0; reportIndex < profilingRuns.size(); reportIndex++) {
-            ProfilingPointRunEntity pt = profilingRuns.get(reportIndex);
-            for (int i = 0; i < pt.getLabels().size(); i++) {
-                String label = pt.getLabels().get(i);
-
-                // Skip value if its label is not present
-                if (!tickIndexMap.containsKey(label))
-                    continue;
-                int labelIndex = tickIndexMap.get(label);
-
-                lineGraphValues[labelIndex][reportIndex] = pt.getValues().get(i);
-            }
-        }
-        json.add(VALUE_KEY, new Gson().toJsonTree(lineGraphValues).getAsJsonArray());
-        json.add(IDS_KEY, new Gson().toJsonTree(ids).getAsJsonArray());
-        json.add(TICKS_KEY, new Gson().toJsonTree(axisTicks));
-        return json;
-    }
-}
diff --git a/src/main/java/com/android/vts/util/Pagination.java b/src/main/java/com/android/vts/util/Pagination.java
deleted file mode 100644
index 4a0d652..0000000
--- a/src/main/java/com/android/vts/util/Pagination.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import com.google.cloud.datastore.Cursor;
-import com.google.cloud.datastore.QueryResults;
-import com.googlecode.objectify.cmd.Query;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/** Helper class for pagination. */
-public class Pagination<T> implements Iterable<T> {
-
-    /** the default page size */
-    public static final int DEFAULT_PAGE_SIZE = 10;
-    /** the default page window size */
-    private static final int DEFAULT_PAGE_WINDOW = 10;
-
-    /** the current page */
-    private int page;
-
-    /** the page window size */
-    private int pageSize = DEFAULT_PAGE_SIZE;
-
-    /** the total number of found entities */
-    private int totalCount;
-
-    /** the previous cursor string token where to start */
-    private String previousPageCountToken = "";
-
-    /** the previous cursor string token where to start */
-    private String currentPageCountToken = "";
-
-    /** the next cursor string token where to start */
-    private String nextPageCountToken = "";
-
-    /** the previous cursor string token list where to start */
-    private LinkedHashSet<String> pageCountTokenSet;
-
-    /** the maximum number of pages */
-    private int maxPages;
-
-    /** the list of object on the page */
-    private List<T> list = new ArrayList<>();
-
-    public Pagination(List<T> list, int page, int pageSize, int totalCount) {
-        this.list = list;
-        this.page = page;
-        this.pageSize = pageSize;
-        this.totalCount = totalCount;
-    }
-
-    public Pagination(
-            Query<T> query,
-            int page,
-            int pageSize,
-            String startPageToken,
-            LinkedHashSet<String> pageCountTokenSet) {
-        this.page = page;
-        this.pageSize = pageSize;
-        this.pageCountTokenSet = pageCountTokenSet;
-        this.currentPageCountToken = startPageToken;
-
-        List<String> pageCountTokenList =
-                this.pageCountTokenSet.stream().collect(Collectors.toList());
-        if (pageCountTokenList.size() > 0) {
-            int foundIndex = pageCountTokenList.indexOf(startPageToken);
-            if (foundIndex <= 0) {
-                this.previousPageCountToken = "";
-            } else {
-                this.previousPageCountToken = pageCountTokenList.get(foundIndex - 1);
-            }
-        }
-
-        int limitValue = pageSize * DEFAULT_PAGE_WINDOW + pageSize / 2;
-        query = query.limit(limitValue);
-        if (startPageToken.equals("")) {
-            this.totalCount = query.count();
-        } else {
-            query = query.startAt(Cursor.fromUrlSafe(startPageToken));
-            this.totalCount = query.count();
-        }
-
-        this.maxPages =
-                this.totalCount / this.pageSize + (this.totalCount % this.pageSize == 0 ? 0 : 1);
-
-        int iteratorIndex = 0;
-        int startIndex = (page % pageSize == 0 ? 9 : page % pageSize - 1) * pageSize;
-
-        QueryResults<T> resultIterator = query.iterator();
-        while (resultIterator.hasNext()) {
-            if (startIndex <= iteratorIndex && iteratorIndex < startIndex + this.pageSize)
-                this.list.add(resultIterator.next());
-            else resultIterator.next();
-            if (iteratorIndex == DEFAULT_PAGE_WINDOW * this.pageSize) {
-                if ( Objects.nonNull(resultIterator) && Objects.nonNull(resultIterator.getCursorAfter()) ) {
-                    this.nextPageCountToken = resultIterator.getCursorAfter().toUrlSafe();
-                }
-            }
-            iteratorIndex++;
-        }
-    }
-
-    public Iterator<T> iterator() {
-        return list.iterator();
-    }
-
-    /**
-     * Gets the total number of objects.
-     *
-     * @return the total number of objects as an int
-     */
-    public int getTotalCount() {
-        return totalCount;
-    }
-
-    /**
-     * Gets the number of page window.
-     *
-     * @return the number of page window as an int
-     */
-    public int getPageSize() {
-        return pageSize;
-    }
-
-    /**
-     * Gets the maximum number of pages.
-     *
-     * @return the maximum number of pages as an int
-     */
-    public int getMaxPages() {
-        return this.maxPages;
-    }
-
-    /**
-     * Gets the page.
-     *
-     * @return the page as an int
-     */
-    public int getPage() {
-        return page;
-    }
-
-    /**
-     * Gets the minimum page in the window.
-     *
-     * @return the page number
-     */
-    public int getMinPageRange() {
-        if (this.getPage() <= this.getPageSize()) {
-            return 1;
-        } else {
-            if ((this.getPage() % this.getPageSize()) == 0) {
-                return (this.getPage() / this.getPageSize() - 1) * this.getPageSize() + 1;
-            } else {
-                return this.getPage() / this.getPageSize() * this.getPageSize() + 1;
-            }
-        }
-    }
-
-    /**
-     * Gets the maximum page in the window.
-     *
-     * @return the page number
-     */
-    public int getMaxPageRange() {
-        if (this.getMaxPages() > this.getPageSize()) {
-            return getMinPageRange() + this.getPageSize() - 1;
-        } else {
-            return this.getMinPageRange() + this.getMaxPages() - 1;
-        }
-    }
-
-    /**
-     * Gets the subset of the list for the current page.
-     *
-     * @return a List
-     */
-    public List<T> getList() {
-        return this.list;
-    }
-
-    /**
-     * Gets the cursor token for the previous page starting point.
-     *
-     * @return a string of cursor of previous starting point
-     */
-    public String getPreviousPageCountToken() {
-        return this.previousPageCountToken;
-    }
-
-    /**
-     * Gets the cursor token for the current page starting point.
-     *
-     * @return a string of cursor of current starting point
-     */
-    public String getCurrentPageCountToken() {
-        return this.currentPageCountToken;
-    }
-
-    /**
-     * Gets the cursor token for the next page starting point.
-     *
-     * @return a string of cursor of next starting point
-     */
-    public String getNextPageCountToken() {
-        return this.nextPageCountToken;
-    }
-}
diff --git a/src/main/java/com/android/vts/util/PerformanceSummary.java b/src/main/java/com/android/vts/util/PerformanceSummary.java
deleted file mode 100644
index a9ce0b4..0000000
--- a/src/main/java/com/android/vts/util/PerformanceSummary.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * <p>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
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>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.
- */
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointEntity;
-import com.android.vts.entity.ProfilingPointSummaryEntity;
-import com.google.appengine.api.datastore.Entity;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
-
-/** PerformanceSummary, an object summarizing performance across profiling points for a test run. */
-public class PerformanceSummary {
-    protected static Logger logger = Logger.getLogger(PerformanceSummary.class.getName());
-    private Map<String, ProfilingPointSummary> summaryMap;
-
-    public final long startTime;
-    public final long endTime;
-    public final String label;
-
-    /** Creates a performance summary object. */
-    public PerformanceSummary(long startTime, long endTime, String label) {
-        this.summaryMap = new HashMap<>();
-        this.startTime = startTime;
-        this.endTime = endTime;
-        this.label = label;
-    }
-
-    /** Creates a performance summary object. */
-    public PerformanceSummary(long startTime, long endTime) {
-        this(
-                startTime,
-                endTime,
-                "<span class='date-label'>"
-                        + Long.toString(TimeUnit.MICROSECONDS.toMillis(endTime))
-                        + "</span>");
-    }
-
-    /**
-     * Determine if the performance summary contains the provided time.
-     *
-     * @param time The time (unix timestamp, microseconds) to check.
-     * @return True if the time is within the performance summary window, false otherwise.
-     */
-    public boolean contains(long time) {
-        return time >= startTime && time <= endTime;
-    }
-
-    /**
-     * Add the profiling data from a ProfilingPointRunEntity to the performance summary.
-     *
-     * @param profilingRun The Entity object whose data to add.
-     */
-    public void addData(ProfilingPointEntity profilingPoint, Entity profilingRun) {
-        ProfilingPointSummaryEntity ppSummary =
-                ProfilingPointSummaryEntity.fromEntity(profilingRun);
-        if (ppSummary == null) return;
-
-        String name = profilingPoint.getProfilingPointName();
-        if (ppSummary.getLabels() != null && ppSummary.getLabels().size() > 0) {
-            if (!ppSummary.getSeries().equals("")) {
-                name += " (" + ppSummary.getSeries() + ")";
-            }
-            if (!summaryMap.containsKey(name)) {
-                summaryMap.put(
-                        name,
-                        new ProfilingPointSummary(
-                                profilingPoint.getXLabel(),
-                                profilingPoint.getYLabel(),
-                            profilingPoint.getVtsProfilingRegressionMode(profilingPoint.getRegressionMode())));
-            }
-            summaryMap.get(name).update(ppSummary);
-        } else {
-            // Use the option suffix as the table name.
-            // Group all profiling points together into one table
-            if (!summaryMap.containsKey(ppSummary.getSeries())) {
-                summaryMap.put(
-                        ppSummary.getSeries(),
-                        new ProfilingPointSummary(
-                                profilingPoint.getXLabel(),
-                                profilingPoint.getYLabel(),
-                            profilingPoint.getVtsProfilingRegressionMode(profilingPoint.getRegressionMode())));
-            }
-            summaryMap.get(ppSummary.getSeries()).updateLabel(ppSummary, name);
-        }
-    }
-
-    /**
-     * Adds a ProfilingPointSummary object into the summary map only if the key doesn't exist.
-     *
-     * @param key The name of the profiling point.
-     * @param summary The ProfilingPointSummary object to add into the summary map.
-     * @return True if the data was inserted into the performance summary, false otherwise.
-     */
-    public boolean insertProfilingPointSummary(String key, ProfilingPointSummary summary) {
-        if (!summaryMap.containsKey(key)) {
-            summaryMap.put(key, summary);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Gets the number of profiling points.
-     *
-     * @return The number of profiling points in the performance summary.
-     */
-    public int size() {
-        return summaryMap.size();
-    }
-
-    /**
-     * Gets the names of the profiling points.
-     *
-     * @return A string array of profiling point names.
-     */
-    public String[] getProfilingPointNames() {
-        String[] profilingNames = summaryMap.keySet().toArray(new String[summaryMap.size()]);
-        Arrays.sort(profilingNames);
-        return profilingNames;
-    }
-
-    /**
-     * Determines if a profiling point is described by the performance summary.
-     *
-     * @param profilingPointName The name of the profiling point.
-     * @return True if the profiling point is contained in the performance summary, else false.
-     */
-    public boolean hasProfilingPoint(String profilingPointName) {
-        return summaryMap.containsKey(profilingPointName);
-    }
-
-    /**
-     * Gets the profiling point summary by name.
-     *
-     * @param profilingPointName The name of the profiling point to fetch.
-     * @return The ProfilingPointSummary object describing the specified profiling point.
-     */
-    public ProfilingPointSummary getProfilingPointSummary(String profilingPointName) {
-        return summaryMap.get(profilingPointName);
-    }
-}
diff --git a/src/main/java/com/android/vts/util/PerformanceUtil.java b/src/main/java/com/android/vts/util/PerformanceUtil.java
deleted file mode 100644
index 000f4e0..0000000
--- a/src/main/java/com/android/vts/util/PerformanceUtil.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * <p>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
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>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.
- */
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.ProfilingPointSummaryEntity;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Query;
-import java.io.IOException;
-import java.math.RoundingMode;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
-import org.apache.commons.lang.StringUtils;
-
-/** PerformanceUtil, a helper class for analyzing profiling and performance data. */
-public class PerformanceUtil {
-    protected static Logger logger = Logger.getLogger(PerformanceUtil.class.getName());
-
-    private static final int MAX_BATCH_SIZE = 2000;
-    private static final DecimalFormat FORMATTER;
-    private static final String NAME_DELIMITER = ", ";
-    private static final String OPTION_DELIMITER = "=";
-
-    /** Initialize the decimal formatter. */
-    static {
-        FORMATTER = new DecimalFormat("#.##");
-        FORMATTER.setRoundingMode(RoundingMode.HALF_UP);
-    }
-
-    /**
-     * Creates the HTML for a table cell representing the percent change between two numbers.
-     *
-     * <p>Computes the percent change (after - before)/before * 100 and inserts it into a table cell
-     * with the specified style. The color of the cell is white if 'after' is less than before.
-     * Otherwise, the cell is colored red with opacity according to the percent change (100%+ delta
-     * means 100% opacity). If the before value is 0 and the after value is positive, then the color
-     * of the cell is 100% red to indicate an increase of undefined magnitude.
-     *
-     * @param baseline The baseline value observed.
-     * @param test The value to compare against the baseline.
-     * @param classNames A string containing HTML classes to apply to the table cell.
-     * @param style A string containing additional CSS styles.
-     * @returns An HTML string for a colored table cell containing the percent change.
-     */
-    public static String getPercentChangeHTML(
-            double baseline,
-            double test,
-            String classNames,
-            String style,
-            VtsProfilingRegressionMode mode) {
-        String pctChangeString = "0 %";
-        double alpha = 0;
-        double delta = test - baseline;
-        if (baseline != 0) {
-            double pctChange = delta / baseline;
-            alpha = pctChange * 2;
-            pctChangeString = FORMATTER.format(pctChange * 100) + " %";
-        } else if (delta != 0) {
-            // If the percent change is undefined, the cell will be solid red or white
-            alpha = (int) Math.signum(delta); // get the sign of the delta (+1, 0, -1)
-            pctChangeString = "";
-        }
-        if (mode == VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING) {
-            alpha = -alpha;
-        }
-        String color = "background-color: rgba(255, 0, 0, " + alpha + "); ";
-        String html = "<td class='" + classNames + "' style='" + color + style + "'>";
-        html += pctChangeString + "</td>";
-        return html;
-    }
-
-    /**
-     * Compares a test StatSummary to a baseline StatSummary using best-case performance.
-     *
-     * @param baseline The StatSummary object containing initial values to compare against
-     * @param test The StatSummary object containing test values to be compared against the baseline
-     * @param innerClasses Class names to apply to cells on the inside of the grid
-     * @param outerClasses Class names to apply to cells on the outside of the grid
-     * @param innerStyles CSS styles to apply to cells on the inside of the grid
-     * @param outerStyles CSS styles to apply to cells on the outside of the grid
-     * @return HTML string representing the performance of the test versus the baseline
-     */
-    public static String getBestCasePerformanceComparisonHTML(
-            StatSummary baseline,
-            StatSummary test,
-            String innerClasses,
-            String outerClasses,
-            String innerStyles,
-            String outerStyles) {
-        if (test == null || baseline == null) {
-            return "<td></td><td></td><td></td><td></td>";
-        }
-        String row = "";
-        // Intensity of red color is a function of the relative (percent) change
-        // in the new value compared to the previous day's. Intensity is a linear function
-        // of percentage change, reaching a ceiling at 100% change (e.g. a doubling).
-        row +=
-                getPercentChangeHTML(
-                        baseline.getBestCase(),
-                        test.getBestCase(),
-                        innerClasses,
-                        innerStyles,
-                        test.getRegressionMode());
-        row += "<td class='" + innerClasses + "' style='" + innerStyles + "'>";
-        row += FORMATTER.format(baseline.getBestCase());
-        row += "<td class='" + innerClasses + "' style='" + innerStyles + "'>";
-        row += FORMATTER.format(baseline.getMean());
-        row += "<td class='" + outerClasses + "' style='" + outerStyles + "'>";
-        row += FORMATTER.format(baseline.getStd()) + "</td>";
-        return row;
-    }
-
-    /**
-     * Updates a PerformanceSummary object with data in the specified window.
-     *
-     * @param testName The name of the table whose profiling vectors to retrieve.
-     * @param startTime The (inclusive) start time in microseconds to scan from.
-     * @param endTime The (inclusive) end time in microseconds at which to stop scanning.
-     * @param selectedDevice The name of the device whose data to query for, or null for unfiltered.
-     * @param summaries The list of PerformanceSummary objects to populate with data.
-     * @throws IOException
-     */
-    public static void updatePerformanceSummary(
-            String testName,
-            long startTime,
-            long endTime,
-            String selectedDevice,
-            List<PerformanceSummary> summaries) {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Query profilingPointQuery =
-                new Query(ProfilingPointEntity.KIND)
-                        .setFilter(
-                                new Query.FilterPredicate(
-                                        ProfilingPointEntity.TEST_NAME,
-                                        Query.FilterOperator.EQUAL,
-                                        testName));
-
-        List<ProfilingPointEntity> profilingPoints = new ArrayList<>();
-        for (Entity e :
-                datastore
-                        .prepare(profilingPointQuery)
-                        .asIterable(DatastoreHelper.getLargeBatchOptions())) {
-            ProfilingPointEntity pp = ProfilingPointEntity.fromEntity(e);
-            if (pp == null) continue;
-            profilingPoints.add(pp);
-        }
-
-        Query.Filter startFilter =
-                new Query.FilterPredicate(
-                        ProfilingPointSummaryEntity.START_TIME,
-                        Query.FilterOperator.GREATER_THAN_OR_EQUAL,
-                        startTime);
-        Query.Filter endFilter =
-                new Query.FilterPredicate(
-                        ProfilingPointSummaryEntity.START_TIME,
-                        Query.FilterOperator.LESS_THAN_OR_EQUAL,
-                        endTime);
-        Query.Filter timeFilter = Query.CompositeFilterOperator.and(startFilter, endFilter);
-
-        Query.Filter deviceFilter;
-        if (selectedDevice != null) {
-            deviceFilter = FilterUtil.FilterKey.TARGET.getFilterForString(selectedDevice);
-        } else {
-            deviceFilter =
-                    FilterUtil.FilterKey.TARGET.getFilterForString(ProfilingPointSummaryEntity.ALL);
-        }
-        deviceFilter =
-                Query.CompositeFilterOperator.and(
-                        deviceFilter,
-                        FilterUtil.FilterKey.BRANCH.getFilterForString(
-                                ProfilingPointSummaryEntity.ALL));
-        Query.Filter filter = Query.CompositeFilterOperator.and(timeFilter, deviceFilter);
-
-        Map<ProfilingPointEntity, Iterable<Entity>> asyncEntities = new HashMap<>();
-        for (ProfilingPointEntity pp : profilingPoints) {
-            Query profilingQuery =
-                    new Query(ProfilingPointSummaryEntity.KIND)
-                            .setAncestor(pp.getKey())
-                            .setFilter(filter);
-            asyncEntities.put(
-                    pp,
-                    datastore
-                            .prepare(profilingQuery)
-                            .asIterable(DatastoreHelper.getLargeBatchOptions()));
-        }
-
-        for (ProfilingPointEntity pp : asyncEntities.keySet()) {
-            for (Entity ppSummaryEntity : asyncEntities.get(pp)) {
-                ProfilingPointSummaryEntity ppSummary =
-                        ProfilingPointSummaryEntity.fromEntity(ppSummaryEntity);
-                if (ppSummary == null) continue;
-                for (PerformanceSummary perfSummary : summaries) {
-                    if (perfSummary.contains(ppSummary.getStartTime())) {
-                        perfSummary.addData(pp, ppSummaryEntity);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Compares a test StatSummary to a baseline StatSummary using average-case performance.
-     *
-     * @param baseline The StatSummary object containing initial values to compare against
-     * @param test The StatSummary object containing test values to be compared against the baseline
-     * @param innerClasses Class names to apply to cells on the inside of the grid
-     * @param outerClasses Class names to apply to cells on the outside of the grid
-     * @param innerStyles CSS styles to apply to cells on the inside of the grid
-     * @param outerStyles CSS styles to apply to cells on the outside of the grid
-     * @return HTML string representing the performance of the test versus the baseline
-     */
-    public static String getAvgCasePerformanceComparisonHTML(
-            StatSummary baseline,
-            StatSummary test,
-            String innerClasses,
-            String outerClasses,
-            String innerStyles,
-            String outerStyles) {
-        if (test == null || baseline == null) {
-            return "<td></td><td></td><td></td><td></td>";
-        }
-        String row = "";
-        // Intensity of red color is a function of the relative (percent) change
-        // in the new value compared to the previous day's. Intensity is a linear function
-        // of percentage change, reaching a ceiling at 100% change (e.g. a doubling).
-        row +=
-                getPercentChangeHTML(
-                        baseline.getMean(),
-                        test.getMean(),
-                        innerClasses,
-                        innerStyles,
-                        test.getRegressionMode());
-        row += "<td class='" + innerClasses + "' style='" + innerStyles + "'>";
-        row += FORMATTER.format(baseline.getBestCase());
-        row += "<td class='" + innerClasses + "' style='" + innerStyles + "'>";
-        row += FORMATTER.format(baseline.getMean());
-        row += "<td class='" + outerClasses + "' style='" + outerStyles + "'>";
-        row += FORMATTER.format(baseline.getStd()) + "</td>";
-        return row;
-    }
-
-    /**
-     * Generates a string of the values in optionsList which have matches in the profiling entity.
-     *
-     * @param profilingRun The entity for a profiling point run.
-     * @param optionKeys A list of keys to match against the optionsList key value pairs.
-     * @return The values in optionsList whose key match a key in optionKeys.
-     */
-    public static String getOptionAlias(
-            ProfilingPointRunEntity profilingRun, Set<String> optionKeys) {
-        String name = "";
-        if (profilingRun.getOptions() != null) {
-            name = getOptionAlias(profilingRun.getOptions(), optionKeys);
-        }
-        return name;
-    }
-
-    /**
-     * Generates a string of the values in optionsList which have matches in the profiling entity.
-     *
-     * @param optionList The list of key=value option pair strings.
-     * @param optionKeys A list of keys to match against the optionsList key value pairs.
-     * @return The values in optionsList whose key match a key in optionKeys.
-     */
-    public static String getOptionAlias(List<String> optionList, Set<String> optionKeys) {
-        String name = "";
-        List<String> nameSuffixes = new ArrayList<>();
-        for (String optionString : optionList) {
-            String[] optionParts = optionString.split(OPTION_DELIMITER);
-            if (optionParts.length != 2) {
-                continue;
-            }
-            if (optionKeys.contains(optionParts[0].trim().toLowerCase())) {
-                nameSuffixes.add(optionParts[1].trim().toLowerCase());
-            }
-        }
-        if (nameSuffixes.size() > 0) {
-            StringUtils.join(nameSuffixes, NAME_DELIMITER);
-            name += StringUtils.join(nameSuffixes, NAME_DELIMITER);
-        }
-        return name;
-    }
-}
diff --git a/src/main/java/com/android/vts/util/ProfilingPointSummary.java b/src/main/java/com/android/vts/util/ProfilingPointSummary.java
deleted file mode 100644
index b08615a..0000000
--- a/src/main/java/com/android/vts/util/ProfilingPointSummary.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.ProfilingPointSummaryEntity;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/** Represents statistical summaries of each profiling point. */
-public class ProfilingPointSummary implements Iterable<StatSummary> {
-    private List<StatSummary> statSummaries;
-    private Map<String, Integer> labelIndices;
-    private List<String> labels;
-    private VtsProfilingRegressionMode regressionMode;
-    public String xLabel;
-    public String yLabel;
-
-    /** Initializes the summary with empty arrays. */
-    public ProfilingPointSummary(
-            String xLabel, String yLabel, VtsProfilingRegressionMode regressionMode) {
-        statSummaries = new ArrayList<>();
-        labelIndices = new HashMap<>();
-        labels = new ArrayList<>();
-        this.regressionMode = regressionMode;
-        this.xLabel = xLabel;
-        this.yLabel = yLabel;
-    }
-
-    /**
-     * Determines if a data label is present in the profiling point.
-     *
-     * @param label The name of the label.
-     * @return true if the label is present, false otherwise.
-     */
-    public boolean hasLabel(String label) {
-        return labelIndices.containsKey(label);
-    }
-
-    /**
-     * Gets the statistical summary for a specified data label.
-     *
-     * @param label The name of the label.
-     * @return The StatSummary object if it exists, or null otherwise.
-     */
-    public StatSummary getStatSummary(String label) {
-        if (!hasLabel(label)) return null;
-        return statSummaries.get(labelIndices.get(label));
-    }
-
-    /**
-     * Gets the last-seen regression mode.
-     *
-     * @return The VtsProfilingRegressionMode value.
-     */
-    public VtsProfilingRegressionMode getRegressionMode() {
-        return regressionMode;
-    }
-
-    /**
-     * Updates the profiling summary with the data from a new profiling report.
-     *
-     * @param ppSummary The profiling point run entity object containing profiling data.
-     */
-    public void update(ProfilingPointSummaryEntity ppSummary) {
-        for (String label : ppSummary.getLabels()) {
-            if (!ppSummary.getLabelStats().containsKey(label)) continue;
-            if (!labelIndices.containsKey(label)) {
-                labelIndices.put(label, statSummaries.size());
-                labels.add(label);
-                statSummaries.add(ppSummary.getLabelStats().get(label));
-            } else {
-                StatSummary summary = getStatSummary(label);
-                summary.merge(ppSummary.getLabelStats().get(label));
-            }
-        }
-    }
-
-    /**
-     * Updates the profiling summary at a label with the data from a new profiling report.
-     *
-     * <p>Updates the summary specified by the label with all values provided in the report. If
-     * labels are provided in the report, they will be ignored -- all values are updated only to the
-     * provided label.
-     *
-     * @param ppSummary The ProfilingPointSummaryEntity object containing profiling data.
-     * @param label The String label for which all values in the report will be updated.
-     */
-    public void updateLabel(ProfilingPointSummaryEntity ppSummary, String label) {
-        if (!labelIndices.containsKey(label)) {
-            labelIndices.put(label, labels.size());
-            labels.add(label);
-            StatSummary stat =
-                    new StatSummary(
-                            label,
-                            ppSummary.getGlobalStats().getMin(),
-                            ppSummary.getGlobalStats().getMax(),
-                            ppSummary.getGlobalStats().getMean(),
-                            ppSummary.getGlobalStats().getSumSq(),
-                            ppSummary.getGlobalStats().getCount(),
-                            ppSummary.getGlobalStats().getRegressionMode());
-            statSummaries.add(stat);
-        } else {
-            StatSummary summary = getStatSummary(label);
-            summary.merge(ppSummary.getGlobalStats());
-        }
-    }
-
-    /**
-     * Gets an iterator that returns stat summaries in the ordered the labels were specified in the
-     * ProfilingReportMessage objects.
-     */
-    @Override
-    public Iterator<StatSummary> iterator() {
-        Iterator<StatSummary> it =
-                new Iterator<StatSummary>() {
-                    private int currentIndex = 0;
-
-                    @Override
-                    public boolean hasNext() {
-                        return labels != null && currentIndex < labels.size();
-                    }
-
-                    @Override
-                    public StatSummary next() {
-                        String label = labels.get(currentIndex++);
-                        return statSummaries.get(labelIndices.get(label));
-                    }
-
-                    @Override
-                    public void remove() {
-                        // Not supported
-                        throw new UnsupportedOperationException();
-                    }
-                };
-        return it;
-    }
-}
diff --git a/src/main/java/com/android/vts/util/StatSummary.java b/src/main/java/com/android/vts/util/StatSummary.java
deleted file mode 100644
index 3b4713c..0000000
--- a/src/main/java/com/android/vts/util/StatSummary.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-
-/** Helper object for storing statistics. */
-public class StatSummary {
-    private String label;
-    private double min;
-    private double max;
-    private double mean;
-    private double sumSq;
-    private int n;
-    private VtsProfilingRegressionMode regression_mode;
-
-    /**
-     * Create a statistical summary.
-     *
-     * <p>Sets the label, min, max, mean, sum of squared error, n, and mode as provided.
-     *
-     * @param label The (String) label to assign to the summary.
-     * @param min The minimum observed value.
-     * @param max The maximum observed value.
-     * @param mean The average observed value.
-     * @param sumSq The sum of squared error.
-     * @param n The number of values observed.
-     * @param mode The VtsProfilingRegressionMode to use when analyzing performance.
-     */
-    public StatSummary(
-            String label,
-            double min,
-            double max,
-            double mean,
-            double sumSq,
-            int n,
-            VtsProfilingRegressionMode mode) {
-        this.label = label;
-        this.min = min;
-        this.max = max;
-        this.mean = mean;
-        this.sumSq = sumSq;
-        this.n = n;
-        this.regression_mode = mode;
-    }
-
-    /**
-     * Initializes the statistical summary.
-     *
-     * <p>Sets the label as provided. Initializes the mean, variance, and n (number of values seen)
-     * to 0.
-     *
-     * @param label The (String) label to assign to the summary.
-     * @param mode The VtsProfilingRegressionMode to use when analyzing performance.
-     */
-    public StatSummary(String label, VtsProfilingRegressionMode mode) {
-        this(label, Double.MAX_VALUE, Double.MIN_VALUE, 0, 0, 0, mode);
-    }
-
-    /**
-     * Update the mean and variance using Welford's single-pass method.
-     *
-     * @param value The observed value in the stream.
-     */
-    public void updateStats(double value) {
-        n += 1;
-        double oldMean = mean;
-        mean = oldMean + (value - oldMean) / n;
-        sumSq = sumSq + (value - mean) * (value - oldMean);
-        if (value < min) min = value;
-        if (value > max) max = value;
-    }
-
-    /**
-     * Combine the mean and variance with another StatSummary.
-     *
-     * @param stat The StatSummary to combine with.
-     */
-    public void merge(StatSummary stat) {
-        double delta = stat.getMean() - mean;
-        int newN = n + stat.getCount();
-        sumSq = sumSq + stat.getSumSq() + delta / newN * delta * n * stat.getCount();
-        double recipN = 1.0 / newN;
-        mean = n * recipN * mean + stat.getCount() * recipN * stat.getMean();
-        n = newN;
-    }
-
-    /**
-     * Gets the best case of the stream.
-     *
-     * @return The min or max.
-     */
-    public double getBestCase() {
-        switch (regression_mode) {
-            case VTS_REGRESSION_MODE_DECREASING:
-                return getMax();
-            default:
-                return getMin();
-        }
-    }
-
-    /**
-     * Gets the calculated min of the stream.
-     *
-     * @return The min.
-     */
-    public double getMin() {
-        return min;
-    }
-
-    /**
-     * Gets the calculated max of the stream.
-     *
-     * @return The max.
-     */
-    public double getMax() {
-        return max;
-    }
-
-    /**
-     * Gets the calculated mean of the stream.
-     *
-     * @return The mean.
-     */
-    public double getMean() {
-        return mean;
-    }
-
-    /**
-     * Gets the calculated sum of squared error of the stream.
-     *
-     * @return The sum of squared error.
-     */
-    public double getSumSq() {
-        return sumSq;
-    }
-
-    /**
-     * Gets the calculated standard deviation of the stream.
-     *
-     * @return The standard deviation.
-     */
-    public double getStd() {
-        return Math.sqrt(sumSq / (n - 1));
-    }
-
-    /**
-     * Gets the number of elements that have passed through the stream.
-     *
-     * @return Number of elements.
-     */
-    public int getCount() {
-        return n;
-    }
-
-    /**
-     * Gets the label for the summarized statistics.
-     *
-     * @return The (string) label.
-     */
-    public String getLabel() {
-        return label;
-    }
-
-    /**
-     * Gets the regression mode.
-     *
-     * @return The VtsProfilingRegressionMode value.
-     */
-    public VtsProfilingRegressionMode getRegressionMode() {
-        return regression_mode;
-    }
-}
diff --git a/src/main/java/com/android/vts/util/TaskQueueHelper.java b/src/main/java/com/android/vts/util/TaskQueueHelper.java
deleted file mode 100644
index 3d5df53..0000000
--- a/src/main/java/com/android/vts/util/TaskQueueHelper.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-package com.android.vts.util;
-
-import com.google.appengine.api.taskqueue.Queue;
-import com.google.appengine.api.taskqueue.TaskOptions;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/** TaskQueueHelper, a helper class for interacting with App Engine Task Queue API. */
-public class TaskQueueHelper {
-    protected static final Logger logger = Logger.getLogger(TaskQueueHelper.class.getName());
-    public static final int MAX_BATCH_ADD_SIZE = 100;
-
-    /**
-     * Add the list of tasks to the provided queue.
-     *
-     * @param queue The task queue in which to insert the tasks.
-     * @param tasks The list of tasks to add.
-     */
-    public static void addToQueue(Queue queue, List<TaskOptions> tasks) {
-        List<TaskOptions> puts = new ArrayList<>();
-        for (TaskOptions task : tasks) {
-            puts.add(task);
-            if (puts.size() == MAX_BATCH_ADD_SIZE) {
-                queue.addAsync(puts);
-                puts = new ArrayList<>();
-            } else if (puts.size() > MAX_BATCH_ADD_SIZE) {
-                logger.log(Level.SEVERE, "Too many tasks batched in the task queue API.");
-                return;
-            }
-        }
-        if (puts.size() > 0) {
-            queue.addAsync(puts);
-        }
-    }
-}
diff --git a/src/main/java/com/android/vts/util/TestResults.java b/src/main/java/com/android/vts/util/TestResults.java
deleted file mode 100644
index adb2a5a..0000000
--- a/src/main/java/com/android/vts/util/TestResults.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.CodeCoverageEntity;
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestCaseRunEntity.TestCase;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.android.vts.util.UrlUtil.LinkDisplay;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import org.apache.commons.lang.StringUtils;
-
-/** Helper object for describing test results data. */
-public class TestResults {
-    private final Logger logger = Logger.getLogger(getClass().getName());
-
-    private List<TestRunEntity> testRuns; // list of all test runs
-    private Map<Key, List<TestCaseRunEntity>>
-            testCaseRunMap; // map from test run key to the test run information
-    private Map<Key, List<DeviceInfoEntity>> deviceInfoMap; // map from test run key to device info
-    private Map<String, Integer> testCaseNameMap; // map from test case name to its order
-    private Set<String> profilingPointNameSet; // set of profiling point names
-
-    public String testName;
-    public String[] headerRow; // row to display above the test results table
-    public String[][] timeGrid; // grid of data storing timestamps to render as dates
-    public String[][] durationGrid; // grid of data storing timestamps to render as time intervals
-    public String[][] summaryGrid; // grid of data displaying a summary of the test run
-    public String[][] resultsGrid; // grid of data displaying test case results
-    public String[] profilingPointNames; // list of profiling point names in the test run
-    public Map<String, List<String[]>> logInfoMap; // map from test run index to url/display pairs
-    public int[] totResultCounts; // array of test result counts for the tip-of-tree runs
-    public String totBuildId = ""; // build ID of tip-of-tree run
-    public long startTime = Long.MAX_VALUE; // oldest timestamp displayed in the results table
-    public long endTime = Long.MIN_VALUE; // newest timestamp displayed in the results table
-
-    // Row labels for the test time-formatted information.
-    private static final String[] TIME_INFO_NAMES = {"Test Start", "Test End"};
-
-    // Row labels for the test duration information.
-    private static final String[] DURATION_INFO_NAMES = {"<b>Test Duration</b>"};
-
-    // Row labels for the test summary grid.
-    private static final String[] SUMMARY_NAMES = {
-        "Total", "Passing #", "Non-Passing #", "Passing %", "Covered Lines", "Coverage %", "Links"
-    };
-
-    // Row labels for the device summary information in the table header.
-    private static final String[] HEADER_NAMES = {
-        "<b>Stats Type \\ Device Build ID</b>",
-        "Branch",
-        "Build Target",
-        "Device",
-        "ABI Target",
-        "VTS Build ID",
-        "Hostname"
-    };
-
-    /**
-     * Create a test results object.
-     *
-     * @param testName The name of the test.
-     */
-    public TestResults(String testName) {
-        this.testName = testName;
-        this.testRuns = new ArrayList<>();
-        this.deviceInfoMap = new HashMap<>();
-        this.testCaseRunMap = new HashMap<>();
-        this.testCaseNameMap = new HashMap<>();
-        this.logInfoMap = new HashMap<>();
-        this.profilingPointNameSet = new HashSet<>();
-    }
-
-    /**
-     * Add a test run to the test results.
-     *
-     * @param testRun The Entity containing the test run information.
-     * @param testCaseRuns The collection of test case executions within the test run.
-     */
-    public void addTestRun(Entity testRun, Iterable<Entity> testCaseRuns) {
-        TestRunEntity testRunEntity = TestRunEntity.fromEntity(testRun);
-        if (testRunEntity == null) return;
-        if (testRunEntity.getStartTimestamp() < startTime) {
-            startTime = testRunEntity.getStartTimestamp();
-        }
-        if (testRunEntity.getStartTimestamp() > endTime) {
-            endTime = testRunEntity.getStartTimestamp();
-        }
-        testRuns.add(testRunEntity);
-        testCaseRunMap.put(testRun.getKey(), new ArrayList<TestCaseRunEntity>());
-
-        // Process the test cases in the test run
-        for (Entity e : testCaseRuns) {
-            TestCaseRunEntity testCaseRunEntity = TestCaseRunEntity.fromEntity(e);
-            if (testCaseRunEntity == null) continue;
-            testCaseRunMap.get(testRun.getKey()).add(testCaseRunEntity);
-            for (TestCase testCase : testCaseRunEntity.testCases) {
-                if (!testCaseNameMap.containsKey(testCase.name)) {
-                    testCaseNameMap.put(testCase.name, testCaseNameMap.size());
-                }
-            }
-        }
-    }
-
-    /** Creates a test case breakdown of the most recent test run. */
-    private void generateToTBreakdown() {
-        totResultCounts = new int[TestCaseResult.values().length];
-        if (testRuns.size() == 0) return;
-
-        TestRunEntity mostRecentRun = testRuns.get(0);
-        List<TestCaseRunEntity> testCaseResults = testCaseRunMap.get(mostRecentRun.getKey());
-        List<DeviceInfoEntity> deviceInfos = deviceInfoMap.get(mostRecentRun.getKey());
-        if (deviceInfos.size() > 0) {
-            DeviceInfoEntity totDevice = deviceInfos.get(0);
-            totBuildId = totDevice.getBuildId();
-        }
-        // Count array for each test result
-        for (TestCaseRunEntity testCaseRunEntity : testCaseResults) {
-            for (TestCase testCase : testCaseRunEntity.testCases) {
-                totResultCounts[testCase.result]++;
-            }
-        }
-    }
-
-    /**
-     * Get the number of test runs observed.
-     *
-     * @return The number of test runs observed.
-     */
-    public int getSize() {
-        return testRuns.size();
-    }
-
-    /** Fetch and process profiling point names for the set of test runs. */
-    private void processProfilingPoints() {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, this.testName);
-        Query.Filter profilingFilter =
-                FilterUtil.getProfilingTimeFilter(
-                        testKey, TestRunEntity.KIND, this.startTime, this.endTime);
-        Query profilingPointQuery =
-                new Query(ProfilingPointRunEntity.KIND)
-                        .setAncestor(testKey)
-                        .setFilter(profilingFilter)
-                        .setKeysOnly();
-        Iterable<Entity> profilingPoints = datastore.prepare(profilingPointQuery).asIterable();
-        // Process the profiling point observations in the test run
-        for (Entity e : profilingPoints) {
-            if (e.getKey().getName() != null) {
-                profilingPointNameSet.add(e.getKey().getName());
-            }
-        }
-    }
-
-    /** Fetch and process device information for the set of test runs. */
-    private void processDeviceInfos() {
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, this.testName);
-        Query.Filter deviceFilter =
-                FilterUtil.getDeviceTimeFilter(
-                        testKey, TestRunEntity.KIND, this.startTime, this.endTime);
-        Query deviceQuery =
-                new Query(DeviceInfoEntity.KIND)
-                        .setAncestor(testKey)
-                        .setFilter(deviceFilter)
-                        .setKeysOnly();
-        List<Key> deviceGets = new ArrayList<>();
-        for (Entity device :
-                datastore.prepare(deviceQuery).asIterable(DatastoreHelper.getLargeBatchOptions())) {
-            if (testCaseRunMap.containsKey(device.getParent())) {
-                deviceGets.add(device.getKey());
-            }
-        }
-        Map<Key, Entity> devices = datastore.get(deviceGets);
-        for (Key key : devices.keySet()) {
-            Entity device = devices.get(key);
-            if (!testCaseRunMap.containsKey(device.getParent())) return;
-            DeviceInfoEntity deviceEntity = DeviceInfoEntity.fromEntity(device);
-            if (deviceEntity == null) return;
-            if (!deviceInfoMap.containsKey(device.getParent())) {
-                deviceInfoMap.put(device.getParent(), new ArrayList<DeviceInfoEntity>());
-            }
-            deviceInfoMap.get(device.getParent()).add(deviceEntity);
-        }
-    }
-
-    /** Post-process the test runs to generate reports of the results. */
-    public void processReport() {
-        if (getSize() > 0) {
-            processDeviceInfos();
-            processProfilingPoints();
-        }
-        testRuns.sort((t1, t2) -> new Long(t2.getStartTimestamp()).compareTo(t1.getStartTimestamp()));
-        generateToTBreakdown();
-
-        headerRow = new String[testRuns.size() + 1];
-        headerRow[0] = StringUtils.join(HEADER_NAMES, "<br>");
-
-        summaryGrid = new String[SUMMARY_NAMES.length][testRuns.size() + 1];
-        for (int i = 0; i < SUMMARY_NAMES.length; i++) {
-            summaryGrid[i][0] = "<b>" + SUMMARY_NAMES[i] + "</b>";
-        }
-
-        timeGrid = new String[TIME_INFO_NAMES.length][testRuns.size() + 1];
-        for (int i = 0; i < TIME_INFO_NAMES.length; i++) {
-            timeGrid[i][0] = "<b>" + TIME_INFO_NAMES[i] + "</b>";
-        }
-
-        durationGrid = new String[DURATION_INFO_NAMES.length][testRuns.size() + 1];
-        for (int i = 0; i < DURATION_INFO_NAMES.length; i++) {
-            durationGrid[i][0] = "<b>" + DURATION_INFO_NAMES[i] + "</b>";
-        }
-
-        resultsGrid = new String[testCaseNameMap.size()][testRuns.size() + 1];
-        // first column for results grid
-        for (String testCaseName : testCaseNameMap.keySet()) {
-            resultsGrid[testCaseNameMap.get(testCaseName)][0] = testCaseName;
-        }
-
-        // Iterate through the test runs
-        for (int col = 0; col < testRuns.size(); col++) {
-            TestRunEntity testRun = testRuns.get(col);
-            CodeCoverageEntity codeCoverageEntity = testRun.getCodeCoverageEntity();
-
-            // Process the device information
-            List<DeviceInfoEntity> devices = deviceInfoMap.get(testRun.getKey());
-            List<String> buildIdList = new ArrayList<>();
-            List<String> buildAliasList = new ArrayList<>();
-            List<String> buildFlavorList = new ArrayList<>();
-            List<String> productVariantList = new ArrayList<>();
-            List<String> abiInfoList = new ArrayList<>();
-            for (DeviceInfoEntity deviceInfoEntity : devices) {
-                buildAliasList.add(deviceInfoEntity.getBranch());
-                buildFlavorList.add(deviceInfoEntity.getBuildFlavor());
-                productVariantList.add(deviceInfoEntity.getProduct());
-                buildIdList.add(deviceInfoEntity.getBuildId());
-                String abi = "";
-                String abiName = deviceInfoEntity.getAbiName();
-                String abiBitness = deviceInfoEntity.getAbiBitness();
-                if (abiName.length() > 0) {
-                    abi += abiName;
-                    if (abiBitness.length() > 0) {
-                        abi += " (" + abiBitness + " bit)";
-                    }
-                }
-                abiInfoList.add(abi);
-            }
-
-            String buildAlias = StringUtils.join(buildAliasList, ",");
-            String buildFlavor = StringUtils.join(buildFlavorList, ",");
-            String productVariant = StringUtils.join(productVariantList, ",");
-            String buildIds = StringUtils.join(buildIdList, ",");
-            String abiInfo = StringUtils.join(abiInfoList, ",");
-            String vtsBuildId = testRun.getTestBuildId();
-
-            int totalCount = 0;
-            int passCount = (int) testRun.getPassCount();
-            int nonpassCount = (int) testRun.getFailCount();
-            TestCaseResult aggregateStatus = TestCaseResult.UNKNOWN_RESULT;
-
-            long totalLineCount = 0;
-            long coveredLineCount = 0;
-            if (testRun.getHasCodeCoverage()) {
-                totalLineCount = codeCoverageEntity.getTotalLineCount();
-                coveredLineCount = codeCoverageEntity.getCoveredLineCount();
-            }
-
-            // Process test case results
-            for (TestCaseRunEntity testCaseEntity : testCaseRunMap.get(testRun.getKey())) {
-                // Update the aggregated test run status
-                totalCount += testCaseEntity.testCases.size();
-                for (TestCase testCase : testCaseEntity.testCases) {
-                    int result = testCase.result;
-                    String name = testCase.name;
-                    if (result == TestCaseResult.TEST_CASE_RESULT_PASS.getNumber()) {
-                        if (aggregateStatus == TestCaseResult.UNKNOWN_RESULT) {
-                            aggregateStatus = TestCaseResult.TEST_CASE_RESULT_PASS;
-                        }
-                    } else if (result != TestCaseResult.TEST_CASE_RESULT_SKIP.getNumber()) {
-                        aggregateStatus = TestCaseResult.TEST_CASE_RESULT_FAIL;
-                    }
-
-                    String systraceUrl = null;
-
-                    if (testCaseEntity.getSystraceUrl() != null) {
-                        String url = testCaseEntity.getSystraceUrl();
-                        LinkDisplay validatedLink = UrlUtil.processUrl(url);
-                        if (validatedLink != null) {
-                            systraceUrl = validatedLink.url;
-                        } else {
-                            logger.log(Level.WARNING, "Invalid systrace URL : " + url);
-                        }
-                    }
-
-                    int index = testCaseNameMap.get(name);
-                    String classNames = "test-case-status ";
-                    String glyph = "";
-                    TestCaseResult testCaseResult = TestCaseResult.valueOf(result);
-                    if (testCaseResult != null) classNames += testCaseResult.toString();
-                    else classNames += TestCaseResult.UNKNOWN_RESULT.toString();
-
-                    if (systraceUrl != null) {
-                        classNames += " width-1";
-                        glyph +=
-                                "<a href=\""
-                                        + systraceUrl
-                                        + "\" "
-                                        + "class=\"waves-effect waves-light btn red right inline-btn\">"
-                                        + "<i class=\"material-icons inline-icon\">info_outline</i></a>";
-                    }
-                    resultsGrid[index][col + 1] =
-                            "<div class=\"" + classNames + "\">&nbsp;</div>" + glyph;
-                }
-            }
-            String passInfo;
-            try {
-                double passPct =
-                        Math.round((100 * passCount / (passCount + nonpassCount)) * 100f) / 100f;
-                passInfo = Double.toString(passPct) + "%";
-            } catch (ArithmeticException e) {
-                passInfo = " - ";
-            }
-
-            // Process coverage metadata
-            String coverageInfo;
-            String coveragePctInfo;
-            try {
-                double coveragePct =
-                        Math.round((100 * coveredLineCount / totalLineCount) * 100f) / 100f;
-                coveragePctInfo =
-                        Double.toString(coveragePct)
-                                + "%"
-                                + "<a href=\"/show_coverage?testName="
-                                + testName
-                                + "&startTime="
-                                + testRun.getStartTimestamp()
-                                + "\" class=\"waves-effect waves-light btn red right inline-btn\">"
-                                + "<i class=\"material-icons inline-icon\">menu</i></a>";
-                coverageInfo = coveredLineCount + "/" + totalLineCount;
-            } catch (ArithmeticException e) {
-                coveragePctInfo = " - ";
-                coverageInfo = " - ";
-            }
-
-            // Process log information
-            String linkSummary = " - ";
-            List<String[]> linkEntries = new ArrayList<>();
-            logInfoMap.put(Integer.toString(col), linkEntries);
-
-            if (testRun.getLogLinks() != null) {
-                for (String rawUrl : testRun.getLogLinks()) {
-                    LinkDisplay validatedLink = UrlUtil.processUrl(rawUrl);
-                    if (validatedLink == null) {
-                        logger.log(Level.WARNING, "Invalid logging URL : " + rawUrl);
-                        continue;
-                    }
-                    String[] logInfo =
-                            new String[] {
-                                validatedLink.name,
-                                validatedLink.url // TODO: process the name from the URL
-                            };
-                    linkEntries.add(logInfo);
-                }
-            }
-            if (linkEntries.size() > 0) {
-                linkSummary = Integer.toString(linkEntries.size());
-                linkSummary +=
-                        "<i class=\"waves-effect waves-light btn red right inline-btn"
-                                + " info-btn material-icons inline-icon\""
-                                + " data-col=\""
-                                + Integer.toString(col)
-                                + "\""
-                                + ">launch</i>";
-            }
-
-            String icon = "<div class='status-icon " + aggregateStatus.toString() + "'>&nbsp</div>";
-            String hostname = testRun.getHostName();
-
-            // Populate the header row
-            headerRow[col + 1] =
-                    "<span class='valign-wrapper'><b>"
-                            + buildIds
-                            + "</b>"
-                            + icon
-                            + "</span>"
-                            + buildAlias
-                            + "<br>"
-                            + buildFlavor
-                            + "<br>"
-                            + productVariant
-                            + "<br>"
-                            + abiInfo
-                            + "<br>"
-                            + vtsBuildId
-                            + "<br>"
-                            + hostname;
-
-            // Populate the test summary grid
-            summaryGrid[0][col + 1] = Integer.toString(totalCount);
-            summaryGrid[1][col + 1] = Integer.toString(passCount);
-            summaryGrid[2][col + 1] = Integer.toString(nonpassCount);
-            summaryGrid[3][col + 1] = passInfo;
-            summaryGrid[4][col + 1] = coverageInfo;
-            summaryGrid[5][col + 1] = coveragePctInfo;
-            summaryGrid[6][col + 1] = linkSummary;
-
-            // Populate the test time info grid
-            timeGrid[0][col + 1] = Long.toString(testRun.getStartTimestamp());
-            timeGrid[1][col + 1] = Long.toString(testRun.getEndTimestamp());
-
-            // Populate the test duration info grid
-            durationGrid[0][col + 1] = Long.toString(testRun.getEndTimestamp() - testRun.getStartTimestamp());
-        }
-
-        profilingPointNames =
-                profilingPointNameSet.toArray(new String[profilingPointNameSet.size()]);
-        Arrays.sort(profilingPointNames);
-    }
-}
diff --git a/src/main/java/com/android/vts/util/TestRunDetails.java b/src/main/java/com/android/vts/util/TestRunDetails.java
deleted file mode 100644
index 584abaf..0000000
--- a/src/main/java/com/android/vts/util/TestRunDetails.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.TestCaseRunEntity;
-import com.android.vts.entity.TestCaseRunEntity.TestCase;
-import com.android.vts.proto.VtsReportMessage.TestCaseResult;
-import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-
-/** Helper object for describing test results data. */
-public class TestRunDetails {
-    private static final String NAME_KEY = "name";
-    private static final String DATA_KEY = "data";
-
-    private class ResultColumn {
-        private final String name;
-        private final List<String> testCases;
-
-        public ResultColumn(String name) {
-            this.name = name;
-            this.testCases = new ArrayList<>();
-        }
-
-        public void add(String testCase) {
-            this.testCases.add(testCase);
-        }
-
-        public int size() {
-            return this.testCases.size();
-        }
-
-        public JsonObject toJson() {
-            testCases.sort(Comparator.naturalOrder());
-            JsonObject json = new JsonObject();
-            json.add(NAME_KEY, new JsonPrimitive(name));
-            json.add(DATA_KEY, new Gson().toJsonTree(testCases));
-            return json;
-        }
-    }
-
-    private final ResultColumn[] columns;
-    public final int[] resultCounts = new int[TestCaseResult.values().length];
-
-    public TestRunDetails() {
-        columns = new ResultColumn[TestCaseResult.values().length];
-        for (TestCaseResult r : TestCaseResult.values()) {
-            columns[r.getNumber()] = new ResultColumn(r.name());
-        }
-    }
-
-    /**
-     * Add a test case entity to the details object.
-     * @param testCaseEntity The TestCaseRunEntity object storing test case results.
-     */
-    public void addTestCase(TestCaseRunEntity testCaseEntity) {
-        for (TestCase testCase : testCaseEntity.getTestCases()) {
-            int result = testCase.result;
-            if (result > resultCounts.length)
-                continue;
-            ++resultCounts[result];
-            ResultColumn column = columns[result];
-            column.add(testCase.name);
-        }
-    }
-
-    /**
-     * Serializes the test run details to json format.
-     *
-     * @return A JsonObject object representing the details object.
-     */
-    public JsonElement toJson() {
-        List<JsonObject> jsonColumns = new ArrayList<>();
-        for (ResultColumn column : columns) {
-            if (column.size() > 0) {
-                jsonColumns.add(column.toJson());
-            }
-        }
-        return new Gson().toJsonTree(jsonColumns);
-    }
-}
diff --git a/src/main/java/com/android/vts/util/TestRunMetadata.java b/src/main/java/com/android/vts/util/TestRunMetadata.java
deleted file mode 100644
index bf4bd24..0000000
--- a/src/main/java/com/android/vts/util/TestRunMetadata.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.lang.StringUtils;
-
-/** Helper object for describing test results data. */
-public class TestRunMetadata {
-    private static final String TEST_RUN = "testRun";
-    private static final String TEST_DETAILS = "testDetails";
-    private static final String DEVICE_INFO = "deviceInfo";
-    private static final String ABI_INFO = "abiInfo";
-    public final TestRunEntity testRun;
-
-    private final List<DeviceInfoEntity> devices;
-    private String deviceInfo;
-    private String abiInfo;
-    private TestRunDetails details;
-
-    /**
-     * Create a test metadata object.
-     *
-     * @param testName The name of the test.
-     * @param testRun The test run entity storing run information.
-     * @param devices The list of device entities describing the test run.
-     */
-    public TestRunMetadata(String testName, TestRunEntity testRun, List<DeviceInfoEntity> devices) {
-        this.testRun = testRun;
-        this.deviceInfo = "";
-        this.abiInfo = "";
-        this.details = null;
-        this.devices = devices;
-    }
-
-    /**
-     * Create a test metadata object.
-     *
-     * @param testName The name of the test.
-     * @param testRun The test run entity storing run information.
-     */
-    public TestRunMetadata(String testName, TestRunEntity testRun) {
-        this(testName, testRun, new ArrayList<DeviceInfoEntity>());
-    }
-
-    /**
-     * Add a device info to the test run metadata.
-     *
-     * @param device The entity to add.
-     */
-    public void addDevice(DeviceInfoEntity device) {
-        this.devices.add(device);
-    }
-
-    /** Get device information for the test run and add it to the metadata message. */
-    private void processDeviceInfo() {
-        List<String> deviceInfoList = new ArrayList<>();
-        List<String> abiInfoList = new ArrayList<>();
-
-        for (DeviceInfoEntity device : this.devices) {
-            String abi = "";
-            String abiName = device.getAbiName();
-            String abiBitness = device.getAbiBitness();
-            if (abiName.length() > 0) {
-                abi += abiName;
-                if (abiBitness.length() > 0) {
-                    abi += " (" + abiBitness + " bit)";
-                }
-            }
-            abiInfoList.add(abi);
-            deviceInfoList.add(device.getFingerprint());
-        }
-        this.abiInfo = StringUtils.join(abiInfoList, ", ");
-        this.deviceInfo = StringUtils.join(deviceInfoList, ", ");
-    }
-
-    /**
-     * Get the device info string in the test metadata.
-     *
-     * @return The string descriptor of the devices used in the test run.
-     */
-    public String getDeviceInfo() {
-        return this.deviceInfo;
-    }
-
-    /**
-     * Get the test run details (e.g. test case information) for the test run.
-     *
-     * @return The TestRunDetails object stored in the metadata, or null if not set.
-     */
-    public TestRunDetails getDetails() {
-        return this.details;
-    }
-
-    /**
-     * Add test case details to the metadata object.
-     *
-     * <p>Used for prefetching details on initial page load.
-     *
-     * @param details The TestRunDetails object storing test case results for the test run.
-     */
-    public void addDetails(TestRunDetails details) {
-        this.details = details;
-    }
-
-    /**
-     * Serializes the test run metadata to json format.
-     *
-     * @return A JsonElement object representing the details object.
-     */
-    public JsonObject toJson() {
-        processDeviceInfo();
-        JsonObject json = new JsonObject();
-        json.add(DEVICE_INFO, new JsonPrimitive(this.deviceInfo));
-        json.add(ABI_INFO, new JsonPrimitive(this.abiInfo));
-        json.add(TEST_RUN, this.testRun.toJson());
-        if (this.details != null) {
-            json.add(TEST_DETAILS, this.details.toJson());
-        }
-        return json;
-    }
-}
diff --git a/src/main/java/com/android/vts/util/TimeUtil.java b/src/main/java/com/android/vts/util/TimeUtil.java
deleted file mode 100644
index 7e9be26..0000000
--- a/src/main/java/com/android/vts/util/TimeUtil.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-package com.android.vts.util;
-
-import java.time.Instant;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
-
-/** TimeUtil, a helper class for formatting times. */
-public class TimeUtil {
-    protected static final Logger logger = Logger.getLogger(TimeUtil.class.getName());
-
-    public static final String DATE_FORMAT = "yyyy-MM-dd";
-    public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
-    public static final String DATE_TIME_ZONE_FORMAT = "yyyy-MM-dd HH:mm:ss (z)";
-    public static final ZoneId PT_ZONE = ZoneId.of("America/Los_Angeles");
-
-    /**
-     * Create a date time string with zone info from the provided timestamp.
-     *
-     * @param timeMicroseconds The time in microseconds
-     * @return A formatted date time string.
-     */
-    public static String getDateTimeZoneString(long timeMicroseconds) {
-        long timeMillis = TimeUnit.MICROSECONDS.toMillis(timeMicroseconds);
-        ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(timeMillis), PT_ZONE);
-        return DateTimeFormatter.ofPattern(DATE_TIME_ZONE_FORMAT).format(zdt);
-    }
-
-    /**
-     * Create a date string from the provided timestamp.
-     *
-     * @param timeMicroseconds The time in microseconds
-     * @return A formatted date string.
-     */
-    public static String getDateString(long timeMicroseconds) {
-        long timeMillis = TimeUnit.MICROSECONDS.toMillis(timeMicroseconds);
-        ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(timeMillis), PT_ZONE);
-        return DateTimeFormatter.ofPattern(DATE_FORMAT).format(zdt);
-    }
-
-    /**
-     * Create a date string from the provided timestamp.
-     *
-     * @param timeMicroseconds The time in microseconds
-     * @return A formatted date string.
-     */
-    public static String getDateTimeString(long timeMicroseconds) {
-        long timeMillis = TimeUnit.MICROSECONDS.toMillis(timeMicroseconds);
-        ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(timeMillis), PT_ZONE);
-        return DateTimeFormatter.ofPattern(DATE_TIME_FORMAT).format(zdt);
-    }
-
-    /**
-     * Create a ZonedDateTime object from the provided timestamp.
-     *
-     * @param timeMicroseconds The time in microseconds
-     * @return A ZonedDateTime object.
-     */
-    public static ZonedDateTime getZonedDateTime(long timeMicroseconds) {
-        long timeMillis = TimeUnit.MICROSECONDS.toMillis(timeMicroseconds);
-        return ZonedDateTime.ofInstant(Instant.ofEpochMilli(timeMillis), PT_ZONE);
-    }
-}
diff --git a/src/main/java/com/android/vts/util/UrlUtil.java b/src/main/java/com/android/vts/util/UrlUtil.java
deleted file mode 100644
index 03c23eb..0000000
--- a/src/main/java/com/android/vts/util/UrlUtil.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * <p>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
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>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.
- */
-package com.android.vts.util;
-
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-
-/** UrlUtil, a helper class for formatting and validating URLs. */
-public class UrlUtil {
-    private static final String HTTPS = "https";
-
-    public static class LinkDisplay {
-        public final String name;
-        public final String url;
-
-        /**
-         * Create a link display object.
-         *
-         * @param uri The hyperlink URI.
-         */
-        public LinkDisplay(URI uri) {
-            this.url = uri.toString();
-
-            // Parse the name from the URI path
-            int lastSeparator = uri.getPath().lastIndexOf('/');
-            if (lastSeparator < 0) {
-                this.name = uri.toString();
-            } else {
-                this.name = uri.getPath().substring(lastSeparator + 1);
-            }
-        }
-    }
-
-    /**
-     * Validates and formats a URL.
-     *
-     * <p>Ensures that the protocol is HTTPs and the URL is properly formatted. This avoids link
-     * issues in the UI and possible vulnerabilities due to embedded JS in URLs.
-     *
-     * @param urlString The url string to validate.
-     * @returns The validated LinkDisplay object.
-     */
-    public static LinkDisplay processUrl(String urlString) {
-        try {
-            URL url = new URL(urlString);
-            String scheme = url.getProtocol();
-            String userInfo = url.getUserInfo();
-            String host = url.getHost();
-            int port = url.getPort();
-            String path = url.getPath();
-            String query = url.getQuery();
-            String fragment = url.getRef();
-            if (!url.getProtocol().equals(HTTPS))
-                throw new MalformedURLException();
-            URI uri = new URI(scheme, userInfo, host, port, path, query, fragment);
-            return new LinkDisplay(uri);
-        } catch (MalformedURLException | URISyntaxException e) {
-            return null;
-        }
-    }
-}
diff --git a/src/main/proto/TestSuiteResultMessage.proto b/src/main/proto/TestSuiteResultMessage.proto
deleted file mode 100644
index be447e9..0000000
--- a/src/main/proto/TestSuiteResultMessage.proto
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018 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.
-
-syntax = "proto2";
-
-package android.vts;
-import "TestScheduleConfigMessage.proto";
-option java_package = "com.android.vts.proto";
-option java_outer_classname = "TestSuiteResultMessageProto";
-option java_multiple_files = false;
-
-// To specify the test results which are uploaded to vts dashboard.
-message TestSuiteResultMessage {
-  // oauth2.0 access token
-  optional string access_token = 1;
-
-  // GCS path to the corresponding result directory
-  optional string result_path = 2;
-
-  // whether the device(s) booted-up successfully
-  optional bool boot_success = 3  [default = true];
-
-  // test suite build info
-  required string branch = 11;
-  required string target = 12;
-  required string build_id = 13;
-
-  // attributes of Result tag
-  optional string suite_plan = 21;
-  optional string suite_version = 22;
-  optional string suite_build_number = 23;
-  optional int64 start_time = 24;
-  optional int64 end_time = 25;
-  optional string host_name = 26;
-  optional string suite_name = 27;
-
-  // attributes of Build tag
-  optional string build_system_fingerprint = 31;
-  optional string build_vendor_fingerprint = 32;
-  optional int32 test_type = 33  [default = 0];
-
-  // attributes of Summary tag
-  optional int32 passed_test_case_count = 41;
-  optional int32 failed_test_case_count = 42;
-  optional int32 modules_done = 43;
-  optional int32 modules_total = 44;
-
-  // GCS path to the corresponding infra log file.
-  optional string infra_log_path = 51;
-
-  // GCS path to the repacked device[+GSI] image set.
-  repeated string repacked_image_path = 52;
-
-  // Fetch info used to fetch and flash certain builds for retry_prompt command.
-  optional string vendor_build_id = 61;
-  optional string gsi_build_id = 62;
-
-  optional android.test.lab.ScheduleConfigMessage schedule_config = 63 [ deprecated = true ];
-}
\ No newline at end of file
diff --git a/src/main/resources/bug_tracking_system/buganizer/config.properties b/src/main/resources/bug_tracking_system/buganizer/config.properties
deleted file mode 100644
index d83ad57..0000000
--- a/src/main/resources/bug_tracking_system/buganizer/config.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-
-buganizer.uri.scheme=
-buganizer.uri.host=
-buganizer.uri.path=
-
-buganizer.labInfraIssue.template.name=
-buganizer.labInfraIssue.component.id=
-buganizer.labInfraIssue.template.id=
-
-buganizer.crashSecurity.template.name=
-buganizer.crashSecurity.component.id=
-buganizer.crashSecurity.template.id=
diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties
deleted file mode 100644
index 5d56f08..0000000
--- a/src/main/resources/config.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-
-appengine.version=
-appengine.clientID=
-appengine.serviceClientID=
-appengine.senderEmail=
-appengine.emailDomain=
-appengine.defaultEmail=
-
-gerrit.uri=
-gerrit.scope=
-
-analytics.id=
-
-gcs.projectID=
-gcs.keyFile=
-gcs.bucketName=
-gcs.infraLogBucketName=
-gcs.suiteTestFolderName=
-
-api.coverage.keyFile=
-api.coverage.spreadSheetId=
-api.coverage.spreadSheetRange=
-
-bug.tracking.system=
-
-user.adminEmail=
-user.adminName=
-user.adminCompany=
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
deleted file mode 100644
index 0300f9e..0000000
--- a/src/main/resources/log4j2.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="WARN">
-    <Appenders>
-        <Console name="Console" target="SYSTEM_OUT">
-            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
-        </Console>
-    </Appenders>
-    <Loggers>
-        <Root level="trace">
-            <AppenderRef ref="Console"/>
-        </Root>
-    </Loggers>
-</Configuration>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/appengine-web.xml b/src/main/webapp/WEB-INF/appengine-web.xml
deleted file mode 100644
index 714aa54..0000000
--- a/src/main/webapp/WEB-INF/appengine-web.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2016 Google Inc.
-  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.
--->
-
-<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
-  <threadsafe>true</threadsafe>
-  <sessions-enabled>true</sessions-enabled>
-  <runtime>java8</runtime>
-  <instance-class>F4_1G</instance-class>
-
-  <system-properties>
-  </system-properties>
-
-</appengine-web-app>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/cron.xml b/src/main/webapp/WEB-INF/cron.xml
deleted file mode 100644
index 78beefb..0000000
--- a/src/main/webapp/WEB-INF/cron.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright 2016 Google Inc. All Rights Reserved.
-
- 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.
--->
-<cronentries>
-  <cron>
-    <url>/cron/vts_performance_job</url>
-    <description>Send daily performance digests.</description>
-    <schedule>every day 07:30</schedule>
-    <timezone>America/Los_Angeles</timezone>
-  </cron>
-  <cron>
-    <url>/cron/vts_inactivity_job</url>
-    <description>Send daily inactivity warnings.</description>
-    <schedule>every day 07:30</schedule>
-    <timezone>America/Los_Angeles</timezone>
-  </cron>
-  <cron>
-    <url>/cron/test_suite_report_gcs_monitor</url>
-    <description>Process suite test report from gcs.</description>
-    <schedule>every 5 mins</schedule>
-    <timezone>America/Los_Angeles</timezone>
-  </cron>
-  <cron>
-    <url>/cron/vts_spreadsheet_sync_job</url>
-    <description>Sync google spreadsheet data with datastore entity.</description>
-    <schedule>every day 00:30</schedule>
-    <timezone>America/Los_Angeles</timezone>
-  </cron>
-</cronentries>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/datastore-indexes.xml b/src/main/webapp/WEB-INF/datastore-indexes.xml
deleted file mode 100644
index e4f4a10..0000000
--- a/src/main/webapp/WEB-INF/datastore-indexes.xml
+++ /dev/null
@@ -1,176 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2017 Google Inc.
-  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.
--->
-
-<datastore-indexes autoGenerate="true">
-
-  <datastore-index kind="TestPlanRun" ancestor="true" source="manual">
-    <property name="type" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestPlanRun" ancestor="true" source="manual">
-    <property name="type" direction="asc"/>
-    <property name="__key__" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestPlanRun" ancestor="true" source="manual">
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestPlanRun" ancestor="true" source="manual">
-    <property name="passCount" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestPlanRun" ancestor="true" source="manual">
-    <property name="failCount" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestStatus" ancestor="false" source="manual">
-    <property name="failCount" direction="asc"/>
-    <property name="passCount" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="true" source="manual">
-    <property name="type" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="true" source="manual">
-    <property name="type" direction="asc"/>
-    <property name="__key__" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="true" source="manual">
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="true" source="manual">
-    <property name="hasCoverage" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="true" source="manual">
-    <property name="passCount" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="true" source="manual">
-    <property name="failCount" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="false" source="manual">
-    <property name="testName" direction="asc"/>
-    <property name="startTimestamp" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="false" source="manual">
-    <property name="testName" direction="asc"/>
-    <property name="startTimestamp" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="false" source="manual">
-    <property name="testName" direction="asc"/>
-    <property name="type" direction="asc"/>
-    <property name="startTimestamp" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestRun" ancestor="false" source="manual">
-    <property name="testName" direction="asc"/>
-    <property name="type" direction="asc"/>
-    <property name="startTimestamp" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="ProfilingPointSummary" ancestor="true" source="manual">
-    <property name="branch" direction="asc"/>
-    <property name="buildFlavor" direction="asc"/>
-    <property name="startTime" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="DeviceInfo" ancestor="true" source="manual">
-    <property name="branch" direction="asc"/>
-    <property name="buildFlavor" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteFileEntity" ancestor="false" source="manual">
-    <property name="day" direction="asc"/>
-    <property name="month" direction="asc"/>
-    <property name="year" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="branch" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="hostName" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="buildId" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="deviceName" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="testType" direction="asc"/>
-    <property name="suitePlan" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="suitePlan" direction="asc"/>
-    <property name="testTypeIndex.TOT" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="suitePlan" direction="asc"/>
-    <property name="testTypeIndex.OTA" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="suitePlan" direction="asc"/>
-    <property name="testTypeIndex.SIGNED" direction="asc"/>
-    <property name="__key__" direction="desc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="suitePlan" direction="asc"/>
-    <property name="branch" direction="asc"/>
-    <property name="target" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="branch" direction="asc"/>
-    <property name="failedTestCaseCount" direction="asc"/>
-    <property name="suitePlan" direction="asc"/>
-    <property name="target" direction="asc"/>
-    <property name="__key__" direction="asc"/>
-    <property name="buildId" direction="asc"/>
-  </datastore-index>
-
-  <datastore-index kind="TestSuiteResultEntity" ancestor="false" source="manual">
-    <property name="branch" direction="asc"/>
-    <property name="suitePlan" direction="asc"/>
-    <property name="target" direction="asc"/>
-    <property name="__key__" direction="asc"/>
-    <property name="buildId" direction="asc"/>
-  </datastore-index>
-</datastore-indexes>
diff --git a/src/main/webapp/WEB-INF/jsp/auth_error.jsp b/src/main/webapp/WEB-INF/jsp/auth_error.jsp
deleted file mode 100644
index 43bd9f3..0000000
--- a/src/main/webapp/WEB-INF/jsp/auth_error.jsp
+++ /dev/null
@@ -1,38 +0,0 @@
-<%--
-  ~ Copyright (c) 2018 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <link rel='stylesheet' href='/css/dashboard_main.css'>
-  <%@ include file='header.jsp' %>
-  <body>
-
-    <div class='container wide'>
-
-      <div class="card-panel">
-        <span class="red-text text-darken-2">
-          <h3> Sorry! you got a wrong email account. </h3>
-          <br/>
-          You have to register an account to access dashboard.
-        </span>
-      </div>
-
-    </div>
-    <%@ include file='footer.jsp' %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/dashboard_main.jsp b/src/main/webapp/WEB-INF/jsp/dashboard_main.jsp
deleted file mode 100644
index 71f6679..0000000
--- a/src/main/webapp/WEB-INF/jsp/dashboard_main.jsp
+++ /dev/null
@@ -1,351 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <link rel='stylesheet' href='/css/dashboard_main.css'>
-  <%@ include file='header.jsp' %>
-  <body>
-    <script>
-        var allTests = ${allTestsJson};
-        var testSet = new Set(allTests);
-        var subscriptionMap = ${subscriptionMapJson};
-
-        var addFavorite = function() {
-            if ($(this).hasClass('disabled')) {
-                return;
-            }
-            var test = $('#input-box').val();
-            if (!testSet.has(test) || test in subscriptionMap) {
-                return;
-            }
-            $('#add-button').addClass('disabled');
-            $.post('/api/favorites', { testName: test}).then(function(data) {
-                if (!data.key) {
-                    return;
-                }
-                subscriptionMap[test] = data.key;
-                var wrapper = $('<div></div>');
-                var a = $('<a></a>')
-                    .attr('href', '${resultsUrl}?testName=' + test);
-                var div = $('<div class="col s11 card hoverable option"></div>');
-                div.addClass('valign-wrapper waves-effect');
-                div.appendTo(a);
-                var span = $('<span class="entry valign"></span>').text(test);
-                span.appendTo(div);
-                a.appendTo(wrapper);
-
-                var btnContainer = $('<div class="col s1 center btn-container"></div>');
-                var silence = $('<a class="col s6 btn-flat notification-button active"></a>');
-                silence.append('<i class="material-icons">notifications_active</i>');
-                silence.attr('test', test);
-                silence.attr('title', 'Disable notifications');
-                silence.appendTo(btnContainer);
-                silence.click(toggleNotifications);
-
-                var clear = $('<a class="col s6 btn-flat remove-button"></a>');
-                clear.append('<i class="material-icons">clear</i>');
-                clear.attr('test', test);
-                clear.attr('title', 'Remove favorite');
-                clear.appendTo(btnContainer);
-                clear.click(removeFavorite);
-
-                btnContainer.appendTo(wrapper);
-
-                wrapper.prependTo('#options').hide()
-                                          .slideDown(150);
-                $('#input-box').val(null);
-                Materialize.updateTextFields();
-            }).always(function() {
-                $('#add-button').removeClass('disabled');
-            });
-        }
-
-        var toggleNotifications = function() {
-            var self = $(this);
-            if (self.hasClass('disabled')) {
-                return;
-            }
-            self.addClass('disabled');
-            var test = self.attr('test');
-            if (!(test in subscriptionMap)) {
-                return;
-            }
-            var muteStatus = self.hasClass('active');
-            var element = self;
-            $.post('/api/favorites', { userFavoritesKey: subscriptionMap[test], muteNotifications: muteStatus}).then(function(data) {
-                element = self.clone();
-                if (element.hasClass('active')) {
-                    element.find('i').text('notifications_off')
-                    element.removeClass('active');
-                    element.addClass('inactive');
-                    element.attr('title', 'Enable notifications');
-                } else {
-                    element.find('i').text('notifications_active')
-                    element.removeClass('inactive');
-                    element.addClass('active');
-                    element.attr('title', 'Disable notifications');
-                }
-                element.click(toggleNotifications);
-                self.replaceWith(function() {
-                    return element;
-                });
-            }).always(function() {
-                element.removeClass('disabled');
-            });
-        }
-
-        var removeFavorite = function() {
-            var self = $(this);
-            if (self.hasClass('disabled')) {
-                return;
-            }
-            var test = self.attr('test');
-            if (!(test in subscriptionMap)) {
-                return;
-            }
-            self.addClass('disabled');
-            $.ajax({
-                url: '/api/favorites/' + subscriptionMap[test],
-                type: 'DELETE'
-            }).always(function() {
-                self.removeClass('disabled');
-            }).then(function() {
-                delete subscriptionMap[test];
-                self.parent().parent().slideUp(150, function() {
-                    self.remove();
-                });
-            });
-        }
-
-        var addFavoriteButton = function() {
-          var self = $(this);
-          var test = self.attr('test');
-
-          $.post('/api/favorites', { testName: test}).then(function(data) {
-            if (data.key) {
-              subscriptionMap[test] = data.key;
-
-              self.children().text("star");
-              self.switchClass("add-fav-button", "min-fav-button", 0);
-
-              self.off('click', addFavoriteButton);
-              self.on('click', removeFavoriteButton);
-            }
-          })
-          .fail(function() {
-            alert( "Error occurred on registering your favorite test case!" );
-          });
-        }
-
-        var removeFavoriteButton = function() {
-          var self = $(this);
-          var test = self.attr('test');
-
-          $.ajax({
-            url: '/api/favorites/' + subscriptionMap[test],
-            type: 'DELETE'
-          }).then(function() {
-            delete subscriptionMap[test];
-
-            self.children().text("star_border");
-            self.switchClass("min-fav-button", "add-fav-button", 0);
-
-            self.off('click', removeFavoriteButton);
-            self.on('click', addFavoriteButton);
-          });
-        }
-
-        $.widget('custom.sizedAutocomplete', $.ui.autocomplete, {
-            _resizeMenu: function() {
-                this.menu.element.outerWidth($('#input-box').width());
-            }
-        });
-
-        $(function() {
-            $('#input-box').sizedAutocomplete({
-                source: allTests,
-                classes: {
-                    'ui-autocomplete': 'card'
-                }
-            });
-
-            $('#input-box').keyup(function(event) {
-                if (event.keyCode == 13) {  // return button
-                    $('#add-button').click();
-                }
-            });
-
-            $('.remove-button').click(removeFavorite);
-            $('.notification-button').click(toggleNotifications);
-            $('#add-button').click(addFavorite);
-
-            $('.add-fav-button').click(addFavoriteButton);
-
-            $('.min-fav-button').click(removeFavoriteButton);
-
-            $('#favoritesLink').click(function() {
-                window.open('/', '_self');
-            });
-            $('#allLink').click(function() {
-                window.open('/?showAll=true', '_self');
-            });
-            $('#acksLink').click(function() {
-                window.open('/show_test_acknowledgments', '_self');
-            });
-        });
-    </script>
-    <div class='container wide'>
-
-      <c:if test="${!showAll}">
-        <ul id="guide_collapsible" class="collapsible" data-collapsible="accordion">
-          <li>
-            <div class="collapsible-header">
-              <i class="material-icons">library_books</i>
-              Notice
-              <span class="new badge right" style="position: inherit;">1</span>
-            </div>
-            <div class="collapsible-body">
-              <div class='row'>
-                <div class='col s12' style="margin: 15px 0px 0px 30px;">
-                  <c:choose>
-                    <c:when test="${fn:endsWith(serverName, 'googleplex.com')}">
-                      <c:set var="dataVersion" scope="page" value="new"/>
-                      <c:choose>
-                        <c:when test="${fn:startsWith(serverName, 'android-vts-internal')}">
-                          <c:set var="dataLink" scope="page" value="https://android-vts.appspot.com"/>
-                        </c:when>
-                        <c:when test="${fn:startsWith(serverName, 'android-vts-staging')}">
-                          <c:set var="dataLink" scope="page" value="https://android-vts-staging.appspot.com"/>
-                        </c:when>
-                        <c:otherwise>
-                          <c:set var="dataLink" scope="page" value="https://android-vts-staging.appspot.com"/>
-                        </c:otherwise>
-                      </c:choose>
-                    </c:when>
-                    <c:when test="${fn:endsWith(serverName, 'appspot.com')}">
-                      <c:set var="dataVersion" scope="page" value="previous"/>
-                      <c:choose>
-                        <c:when test="${fn:startsWith(serverName, 'android-vts-staging')}">
-                          <c:set var="dataLink" scope="page" value="https://android-vts-staging.googleplex.com"/>
-                        </c:when>
-                        <c:when test="${fn:startsWith(serverName, 'android-vts')}">
-                          <c:set var="dataLink" scope="page" value="https://android-vts-internal.googleplex.com"/>
-                        </c:when>
-                        <c:otherwise>
-                          <c:set var="dataLink" scope="page" value="https://android-vts-staging.googleplex.com"/>
-                        </c:otherwise>
-                      </c:choose>
-                    </c:when>
-                    <c:otherwise>
-                      <c:set var="dataVersion" scope="page" value="local dev"/>
-                      <c:set var="dataLink" scope="page" value="http://localhost"/>
-                    </c:otherwise>
-                  </c:choose>
-                  Recently, we launched new appspot servers for dashboard. Thus you will have two diffrent versions of server for each staging and production data.
-                  <br/>
-                  If you want to find the <c:out value = "${dataVersion}"/> test data, please visit the next url <a href="<c:out value = "${dataLink}"/>"><c:out value = "${dataLink}"/></a>.
-                </div>
-              </div>
-            </div>
-          </li>
-        </ul>
-      </c:if>
-
-      <c:choose>
-        <c:when test='${not empty error}'>
-          <div id='error-container' class='row card'>
-            <div class='col s12 center-align'>
-              <h5>${error}</h5>
-            </div>
-          </div>
-        </c:when>
-        <c:otherwise>
-          <div class='row home-tabs-row'>
-            <div class='col s12'>
-              <ul class='tabs'>
-                <li class='tab col s4' id='favoritesLink'><a class='${showAll ? "inactive" : "active"}'>Favorites</a></li>
-                <li class='tab col s4' id='allLink'><a class='${showAll ? "active" : "inactive"}'>All Tests</a></li>
-                <li class='tab col s4' id='acksLink'><a>Test Acknowledgements</a></li>
-              </ul>
-            </div>
-          </div>
-          <c:set var='width' value='${showAll ? 11 : 11}' />
-          <c:if test='${not showAll}'>
-            <div class='row'>
-              <div class='input-field col s8'>
-                <input type='text' id='input-box'></input>
-                <label for='input-box'>Search for tests to add to favorites</label>
-              </div>
-              <div id='add-button-wrapper' class='col s1 valign-wrapper'>
-                <a id='add-button' class='btn-floating btn waves-effect waves-light red valign'><i class='material-icons'>add</i></a>
-              </div>
-            </div>
-          </c:if>
-          <div class='row' id='options'>
-            <c:forEach items='${testNames}' var='test'>
-              <div>
-                <a href='${resultsUrl}?testName=${test.name}'>
-                  <div class='col s${width} card hoverable option valign-wrapper waves-effect'>
-                    <span class='entry valign'>${test.name}
-                      <c:if test='${test.failCount >= 0 && test.passCount >= 0}'>
-                        <c:set var='color' value='${test.failCount > 0 ? "red" : (test.passCount > 0 ? "green" : "grey")}' />
-                        <span class='indicator right center ${color}'>
-                          ${test.passCount} / ${test.passCount + test.failCount}
-                        </span>
-                      </c:if>
-                    </span>
-                  </div>
-                </a>
-                <c:choose>
-                  <c:when test="${showAll}">
-                    <div class="col s1 center btn-container">
-                      <c:choose>
-                        <c:when test="${test.isFavorite}">
-                          <a class="col s6 btn-flat min-fav-button" test="${test.name}" title="Remove favorite">
-                            <i class="material-icons">star</i>
-                          </a>
-                        </c:when>
-                        <c:otherwise>
-                          <a class="col s6 btn-flat add-fav-button" test="${test.name}" title="Add favorite">
-                            <i class="material-icons">star_border</i>
-                          </a>
-                        </c:otherwise>
-                      </c:choose>
-                    </div>
-                  </c:when>
-                  <c:otherwise>
-                    <div class='col s1 center btn-container'>
-                      <a class='col s6 btn-flat notification-button ${test.muteNotifications ? "inactive" : "active"}' test='${test.name}' title='${test.muteNotifications ? "Enable" : "Disable"} notifications'>
-                        <i class='material-icons'>notifications_${test.muteNotifications ? "off" : "active"}</i>
-                      </a>
-                      <a class='col s6 btn-flat remove-button' test='${test.name}' title='Remove favorite'>
-                        <i class='material-icons'>clear</i>
-                      </a>
-                    </div>
-                  </c:otherwise>
-                </c:choose>
-              </div>
-            </c:forEach>
-          </div>
-        </c:otherwise>
-      </c:choose>
-    </div>
-    <%@ include file='footer.jsp' %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/error_msg.jsp b/src/main/webapp/WEB-INF/jsp/error_msg.jsp
deleted file mode 100644
index 13e6657..0000000
--- a/src/main/webapp/WEB-INF/jsp/error_msg.jsp
+++ /dev/null
@@ -1,38 +0,0 @@
-<%--
-  ~ Copyright (c) 2018 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-<link rel='stylesheet' href='/css/dashboard_main.css'>
-<%@ include file='header.jsp' %>
-<body>
-
-<div class='container wide'>
-
-    <div class="card-panel">
-        <span class="red-text text-darken-2">
-          <h3> <c:out value="${error_title}"></c:out> </h3>
-          <br/>
-          <c:out value="${error_message}"></c:out>
-        </span>
-    </div>
-
-</div>
-<%@ include file='footer.jsp' %>
-</body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/footer.jsp b/src/main/webapp/WEB-INF/jsp/footer.jsp
deleted file mode 100644
index b804a21..0000000
--- a/src/main/webapp/WEB-INF/jsp/footer.jsp
+++ /dev/null
@@ -1,25 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
-<footer class="page-footer" style="height: 70px;">
-  <div class="footer-copyright">
-    <div class="container">
-      © 2017 - The Android Open Source Project
-    </div>
-  </div>
-</footer>
diff --git a/src/main/webapp/WEB-INF/jsp/header.jsp b/src/main/webapp/WEB-INF/jsp/header.jsp
deleted file mode 100644
index 1d7de87..0000000
--- a/src/main/webapp/WEB-INF/jsp/header.jsp
+++ /dev/null
@@ -1,70 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<head>
-  <link rel='stylesheet' href='https://www.gstatic.com/external_hosted/materialize/all_styles-bundle.css'>
-  <link rel='icon' href='https://www.gstatic.com/images/branding/googleg/1x/googleg_standard_color_32dp.png' sizes='32x32'>
-  <link rel='stylesheet' href='https://fonts.googleapis.com/icon?family=Material+Icons'>
-  <link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700'>
-  <link rel='stylesheet' href='/css/navbar.css'>
-  <link rel='stylesheet' href='/css/common.css'>
-  <script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>
-  <script src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js'></script>
-  <script src='https://www.gstatic.com/external_hosted/materialize/materialize.min.js'></script>
-  <script type='text/javascript'>
-    if (${analyticsID}) {
-        // Autogenerated from Google Analytics
-        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-            (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-        })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-        ga('create', ${analyticsID}, 'auto');
-        ga('send', 'pageview');
-    }
-  </script>
-  <title>VTS Dashboard</title>
-</head>
-<body>
-  <nav id='navbar'>
-    <div class='nav-wrapper'>
-      <a href='#' class='brand-logo center'>VTS Dashboard</a>
-      <ul class='nav-list'>
-        <c:forEach items='${navbarLinks}' var='link' varStatus='loop'>
-          <li class='${loop.index == activeIndex ? "active" : ""}'>
-            <a class='nav-list-item' href='${link.url}'>${link.name}</a>
-          </li>
-        </c:forEach>
-      </ul>
-      <ul class='right'><li>
-        <a id='dropdown-button' class='dropdown-button btn red lighten-3' href='#' data-activates='dropdown'>
-          ${email}
-        </a>
-      </li></ul>
-      <ul id='dropdown' class='dropdown-content'>
-        <li><a href='${logoutURL}'>Log out</a></li>
-      </ul>
-      <c:if test='${breadcrumbLinks != null}'>
-        <div id='nav-sublist'>
-          <c:forEach items='${breadcrumbLinks}' var='link'>
-            <a href='${link.url}' class='nav-sublist-item breadcrumb'>${link.name}</a>
-          </c:forEach>
-        </div>
-      </c:if>
-    </div>
-  </nav>
-</body>
diff --git a/src/main/webapp/WEB-INF/jsp/show_coverage.jsp b/src/main/webapp/WEB-INF/jsp/show_coverage.jsp
deleted file mode 100644
index ee68588..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_coverage.jsp
+++ /dev/null
@@ -1,210 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link rel="stylesheet" href="/css/show_coverage.css">
-  <script async defer src="https://apis.google.com/js/api.js"
-          onload="this.onload=function(){};handleClientLoad()"
-          onreadystatechange="if (this.readyState === 'complete') this.onload()">
-  </script>
-  <body>
-    <script type="text/javascript">
-        $(document).ready(function() {
-            // Initialize AJAX for CORS
-            $.ajaxSetup({
-                xhrFields : {
-                    withCredentials: true
-                }
-            });
-
-            $('.collapsible.popout').collapsible({
-              accordion : true
-            }).find('.collapsible-header').click(onClick);
-
-
-            $("div.collapsible-header > span.indicator.waves-effect").click(function(evt) {
-              evt.preventDefault();
-
-              $("#loader-indicator").show();
-
-              var cmd = $(evt.target).text();
-              var testRunId = $(evt.target).data("id");
-              var postData = { coverageId: testRunId, testName: "${testName}", testRunId: "${startTime}", cmd: cmd};
-              $.post("/api/coverage/data", postData, function() {
-                // success
-                console.log("success");
-                var detachedLi = $(evt.target).parent().parent().detach();
-                if (cmd == "enable") {
-                  $(evt.target).text("disable");
-                  $(evt.target).parent().removeClass("grey");
-                  $('ul.collapsible.popout').prepend(detachedLi);
-                } else {
-                  $(evt.target).text("enable");
-                  $(evt.target).parent().addClass("grey");
-                  $('ul.collapsible.popout').append(detachedLi);
-                }
-              })
-              .done(function() {
-                // Done
-                $("#loader-indicator").fadeOut("slow");
-              })
-              .fail(function() {
-                alert( "Error occurred during changing the status" );
-              });
-            });
-        });
-
-        function handleClientLoad() {
-          // Load the API client and auth2 library
-          gapi.load('client:auth2', initClient);
-        }
-
-        function initClient() {
-          gapi.client.init({
-            client_id: ${clientId},
-            scope: ${gerritScope}
-          }).then(function () {
-            // displayEntries();
-          });
-        }
-
-        /* Open a window to Gerrit so that user can login.
-           Minimize the previously clicked entry.
-        */
-        var gerritLogin = function(element) {
-            window.open(${gerritURI}, "Ratting", "toolbar=0,status=0");
-            element.click();
-        }
-
-        /* Loads source code for a particular entry and displays it with
-           coverage information as the accordion entry expands.
-        */
-        var onClick = function() {
-            // Remove source code from the accordion entry that was open before
-            var self = $(this);
-            var prev = self.parent().siblings('li.active');
-            if (prev.length > 0) {
-                prev.find('.table-container').empty();
-            }
-            var url = self.parent().data('url');
-            var container = self.parent().find('.table-container');
-            container.html('<div class="center-align">Loading...</div>');
-            var coverageVectors = self.parent().data('coverage');
-            if (self.parent().hasClass('active')) {
-                // Remove the code from display
-                container.empty();
-            } else {
-                /* Fetch and display the code.
-                   Note: a coverageVector may be shorter than sourceContents due
-                   to non-executable (i.e. comments or language-specific syntax)
-                   lines in the code. Trailing source lines that have no
-                   coverage information are assumed to be non-executable.
-                */
-                $.ajax({
-                    url: url,
-                    dataType: 'text'
-                }).promise().done(function(src) {
-                    src = atob(src);
-                    if (!src) return;
-                    srcLines = src.split('\n');
-                    covered = 0;
-                    total = 0;
-                    var table = $('<table class="table"></table>');
-                    var rows = srcLines.forEach(function(line, j) {
-                        var count = coverageVectors[j];
-                        var row = $('<tr></tr>');
-                        if (typeof count == 'undefined' || count < 0) {
-                            count = "--";
-                        } else if (count == 0) {
-                            row.addClass('uncovered');
-                            total += 1;
-                        } else {
-                            row.addClass('covered');
-                            total += 1;
-                        }
-                        row.append('<td class="count">' + String(count) + '</td>');
-                        row.append('<td class="line_no">' + String(j+1) + '</td>');
-                        code = $('<td class="code"></td>');
-                        code.text(String(line));
-                        code.appendTo(row);
-                        row.appendTo(table);
-                    });
-                    container.empty();
-                    container.append(table);
-                }).fail(function(error) {
-                    if (error.status == 0) {  // origin error, refresh cookie
-                        container.empty();
-                        container.html('<div class="center-align">' +
-                                       '<span class="login-button">' +
-                                       'Click to authorize Gerrit access' +
-                                       '</span></div>');
-                        container.find('.login-button').click(function() {
-                            gerritLogin(self);
-                        });
-                    } else {
-                        container.html('<div class="center-align">' +
-                                       'Not found.</div>');
-                    }
-                });
-            }
-        }
-    </script>
-    <div id='coverage-container' class='wide container'>
-      <h4 class="section-title"><b>Coverage:</b> </h4>
-      <ul class="collapsible popout" data-collapsible="accordion">
-        <c:forEach var="coverageEntity" items="${coverageEntityList}" varStatus="loop">
-          <li data-url="<c:url value="${coverageEntity.gerritUrl}"/>" data-index="${loop.index}" data-coverage="${coverageEntity.lineCoverage}">
-          <div class="collapsible-header <c:out value='${coverageEntity.isIgnored ? "grey" : ""}'/>">
-            <i class="material-icons">library_books</i>
-            <div class="truncate"><b>${coverageEntity.projectName}</b>/${coverageEntity.filePath}</div>
-            <div class="right total-count">${coverageEntity.coveredCount}/${coverageEntity.totalCount}</div>
-            <div class="indicator ${coverageEntity.percentage >= 70 ? "green" : "red"}">${coverageEntity.percentage}%</div>
-            <c:if test="${isModerator}">
-              <span data-id="${coverageEntity.id}" class="indicator waves-effect blue lighten-1" style="margin-left: 5px;"><c:out value='${coverageEntity.isIgnored ? "enable" : "disable"}'/></span>
-            </c:if>
-          </div>
-          <div class="collapsible-body row">
-            <div class="html-container">
-              <div class="table-container"></div>
-            </div>
-          </div>
-          </li>
-        </c:forEach>
-      </ul>
-    </div>
-
-      <div id="loader-indicator" class="loader-background" style="display: none">
-          <div class="preloader-wrapper big active">
-              <div class="spinner-layer spinner-blue-only">
-                  <div class="circle-clipper left">
-                      <div class="circle"></div>
-                  </div>
-                  <div class="gap-patch">
-                      <div class="circle"></div>
-                  </div>
-                  <div class="circle-clipper right">
-                      <div class="circle"></div>
-                  </div>
-              </div>
-          </div>
-      </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_coverage_overview.jsp b/src/main/webapp/WEB-INF/jsp/show_coverage_overview.jsp
deleted file mode 100644
index 0516c9d..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_coverage_overview.jsp
+++ /dev/null
@@ -1,505 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core' %>
-<%@ taglib prefix='fmt' uri='http://java.sun.com/jsp/jstl/fmt' %>
-
-<html>
-  <!-- <link rel='stylesheet' href='/css/dashboard_main.css'> -->
-  <%@ include file='header.jsp' %>
-  <link type='text/css' href='/css/show_test_runs_common.css' rel='stylesheet'>
-  <link type='text/css' href='/css/test_results.css' rel='stylesheet'>
-  <link rel='stylesheet' href='/css/search_header.css'>
-  <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/common.js'></script>
-  <script src='js/time.js'></script>
-  <script type='text/javascript'>
-      google.charts.load('current', {'packages':['table', 'corechart']});
-      google.charts.setOnLoadCallback(drawStatsChart);
-      google.charts.setOnLoadCallback(drawCoverageCharts);
-
-      $(document).ready(function() {
-
-          $('select').material_select();
-
-          $(".search-icon-wrapper").click(function() {
-              $(".search-wrapper").toggle();
-          });
-
-          var inputIdList = ["device", "branch"];
-
-          $("#schBtn").click(function (evt) {
-              if($(this).hasClass('disabled')) return;
-              var queryParam = "?";
-              $.each(inputIdList, function( index, value ) {
-                  var selectId = value.charAt(0).toUpperCase() + value.slice(1)
-                  var result = $("#search" + selectId).val();
-                  if ( !$.isEmptyObject(result) ) {
-                      queryParam += value + "=" + result.trim() + "&";
-                  }
-              });
-              var link = '${pageContext.request.contextPath}' + '/show_coverage_overview' + queryParam;
-              window.open(link, '_self');
-          });
-
-          var no_data_msg = "NO DATA";
-
-          $('#coverageModalGraph').modal({
-              width: '75%',
-              dismissible: true, // Modal can be dismissed by clicking outside of the modal
-              opacity: .5, // Opacity of modal background
-              inDuration: 300, // Transition in duration
-              outDuration: 200, // Transition out duration
-              startingTop: '4%', // Starting top style attribute
-              endingTop: '10%', // Ending top style attribute
-              ready: function(modal, trigger) { // Callback for Modal open. Modal and trigger parameters available.
-                  var testname = modal.data('testname');
-                  $('#coverageModalTitle').text("Code Coverage Chart : " + testname);
-                  var query = new google.visualization.Query('show_coverage_overview?pageType=datatable&testName=' + testname);
-                  // Send the query with a callback function.
-                  query.send(handleQueryResponse);
-              },
-              complete: function() {
-                  $('#coverage_combo_chart_div').empty();
-                  $('#coverage_line_chart_div').empty();
-                  $('#coverage_table_chart_div').empty();
-
-                  $("div.valign-wrapper > h2.center-align:contains('" + no_data_msg + "')").each(function(index){
-                    $(this).parent().remove();
-                  });
-                  $("span.indicator.badge.blue:contains('Graph')").each(function( index ) {
-                    $(this).removeClass('blue');
-                    $(this).addClass('grey');
-                  });
-
-                  $('#dataTableLoading').show("slow");
-              } // Callback for Modal close
-          });
-
-          // Handle the query response.
-          function handleQueryResponse(response) {
-            $('#dataTableLoading').hide("slow");
-            if (response.isError()) {
-              alert('Error in query: ' + response.getMessage() + ' ' + response.getDetailedMessage());
-              return;
-            }
-            // Draw the visualization.
-            var data = response.getDataTable();
-            if (data.getNumberOfRows() == 0) {
-              var blankData = '<div class="valign-wrapper" style="height: 90%;">'
-                            + '<h2 class="center-align" style="width: 100%;">' + no_data_msg + '</h2>'
-                            + '</div>';
-              $('#coverageModalTitle').after(blankData);
-              return;
-            }
-            data.sort([{column: 0}]);
-
-            var date_formatter = new google.visualization.DateFormat({ pattern: "yyyy-MM-dd" });
-            date_formatter.format(data, 0);
-
-            var dataView = new google.visualization.DataView(data);
-
-            // Disable coveredLine and totalLine
-            dataView.hideColumns([1,2]);
-
-            var lineOptions = {
-              title: 'Source Code Line Coverage',
-              width: '100%',
-              height: 450,
-              curveType: 'function',
-              intervals: { 'color' : 'series-color' },
-              interval: {
-                'fill': {
-                  'style': 'area',
-                  'curveType': 'function',
-                  'fillOpacity': 0.2
-                },
-                'bar': {
-                  'style': 'bars',
-                  'barWidth': 0,
-                  'lineWidth': 1,
-                  'pointSize': 3,
-                  'fillOpacity': 1
-                }},
-              legend: { position: 'bottom' },
-              tooltip: { isHtml: true },
-              fontName: 'Roboto',
-              titleTextStyle: {
-                color: '#757575',
-                fontSize: 16,
-                bold: false
-              },
-              pointsVisible: true,
-              vAxis:{
-                title: 'Code Coverage Ratio (%)',
-                titleTextStyle: {
-                  color: '#424242',
-                  fontSize: 12,
-                  italic: false
-                },
-                textStyle: {
-                  fontSize: 12,
-                  color: '#757575'
-                },
-              },
-              hAxis: {
-                title: 'Date',
-                format: 'yyyy-MM-dd',
-                minTextSpacing: 0,
-                showTextEvery: 1,
-                slantedText: true,
-                slantedTextAngle: 45,
-                textStyle: {
-                  fontSize: 12,
-                  color: '#757575'
-                },
-                titleTextStyle: {
-                  color: '#424242',
-                  fontSize: 12,
-                  italic: false
-                }
-              },
-            };
-            var lineChart = new google.visualization.LineChart(document.getElementById('coverage_line_chart_div'));
-            lineChart.draw(dataView, lineOptions);
-
-            var tableOptions = {
-              title: 'Covered/Total Source Code Line Count (SLOC)',
-              width: '95%',
-              // height: 350,
-              is3D: true
-            };
-            var tableChart = new google.visualization.Table(document.getElementById('coverage_table_chart_div'));
-            tableChart.draw(data, tableOptions);
-          }
-
-          $('.collapsible').collapsible({
-              accordion: false,
-              onOpen: function(el) {
-                  var header = $( el[0].children[0] );
-                  var body = $( el[0].children[1] );
-                  var icon = header.children('.material-icons.expand-arrow');
-                  var testName = header.data('test');
-                  var timestamp = header.data('time');
-                  var url = '/api/test_run?test=' + testName + '&timestamp=' + timestamp;
-                  $.get(url).done(function(data) {
-                      displayTestDetails(body, data, 16);
-                  }).fail(function() {
-                      icon.removeClass('rotate');
-                  }).always(function() {
-                      header.removeClass('disabled');
-                  });
-              }, // Callback for Collapsible open
-              onClose: function(el) {
-                  console.log(el);
-                  var body = $( el[0].children[1] );
-                  body.empty();
-              } // Callback for Collapsible close
-          });
-
-          $( "span.indicator.badge:contains('Coverage')" ).click(function (evt) {
-              var header = $(evt.currentTarget.parentElement);
-              var testName = header.data('test');
-              var startTime = header.data('time');
-              var url = '/show_coverage?testName=' + testName + '&startTime=' + startTime;
-              window.location.href = url;
-              return false;
-          });
-
-          $( "span.indicator.badge:contains('Links')" ).click(function (evt) {
-              var header = $(evt.currentTarget.parentElement);
-              var logLinks = header.data('links');
-              showLinks($('body'), logLinks);
-              return false;
-          });
-
-          $( "span.indicator.badge:contains('Graph')" ).click(function (evt) {
-              var header = $(evt.currentTarget.parentElement);
-              var testname = header.data('test');
-              $('#coverageModalGraph').data("testname", testname);
-              $('#coverageModalGraph').modal('open');
-              $(evt.target).removeClass("grey");
-              $(evt.target).addClass("blue");
-              return false;
-          });
-      });
-
-      // draw test statistics chart
-      function drawStatsChart() {
-          var testStats = ${testStats};
-          if (testStats.length < 1) {
-              return;
-          }
-          var resultNames = ${resultNamesJson};
-          var rows = resultNames.map(function(res, i) {
-              nickname = res.replace('TEST_CASE_RESULT_', '').replace('_', ' ')
-                         .trim().toLowerCase();
-              return [nickname, parseInt(testStats[i])];
-          });
-          rows.unshift(['Result', 'Count']);
-
-          // Get CSS color definitions (or default to white)
-          var colors = resultNames.map(function(res) {
-              return $('.' + res).css('background-color') || 'white';
-          });
-
-          var data = google.visualization.arrayToDataTable(rows);
-          var options = {
-              is3D: false,
-              colors: colors,
-              fontName: 'Roboto',
-              fontSize: '14px',
-              legend: {position: 'labeled'},
-              tooltip: {showColorCode: true, ignoreBounds: false},
-              chartArea: {height: '80%', width: '90%'},
-              pieHole: 0.4
-          };
-
-          var chart = new google.visualization.PieChart(document.getElementById('pie-chart-stats'));
-          chart.draw(data, options);
-      }
-
-      // draw the coverage pie charts
-      function drawCoverageCharts() {
-          var coveredLines = ${coveredLines};
-          var uncoveredLines = ${uncoveredLines};
-          var rows = [
-              ["Result", "Count"],
-              ["Covered Lines", coveredLines],
-              ["Uncovered Lines", uncoveredLines]
-          ];
-
-          // Get CSS color definitions (or default to white)
-          var colors = [
-              $('.TEST_CASE_RESULT_PASS').css('background-color') || 'white',
-              $('.TEST_CASE_RESULT_FAIL').css('background-color') || 'white'
-          ]
-
-          var data = google.visualization.arrayToDataTable(rows);
-
-          var optionsRaw = {
-              is3D: false,
-              colors: colors,
-              fontName: 'Roboto',
-              fontSize: '14px',
-              pieSliceText: 'value',
-              legend: {position: 'bottom'},
-              chartArea: {height: '80%', width: '90%'},
-              tooltip: {showColorCode: true, ignoreBounds: false, text: 'value'},
-              pieHole: 0.4
-          };
-
-          var optionsNormalized = {
-              is3D: false,
-              colors: colors,
-              fontName: 'Roboto',
-              fontSize: '14px',
-              legend: {position: 'bottom'},
-              tooltip: {showColorCode: true, ignoreBounds: false, text: 'percentage'},
-              chartArea: {height: '80%', width: '90%'},
-              pieHole: 0.4
-          };
-
-          var chart = new google.visualization.PieChart(document.getElementById('pie-chart-coverage-raw'));
-          chart.draw(data, optionsRaw);
-
-          chart = new google.visualization.PieChart(document.getElementById('pie-chart-coverage-normalized'));
-          chart.draw(data, optionsNormalized);
-      }
-
-      // refresh the page to see the runs matching the specified filter
-      function refresh() {
-        var link = '${pageContext.request.contextPath}' +
-            '/show_coverage_overview?' + search.args();
-        if (${unfiltered}) {
-          link += '&unfiltered=';
-        }
-        window.open(link,'_self');
-      }
-
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div id="filter-bar">
-        <div class="row card search-bar expanded">
-          <div class="header-wrapper">
-            <h5 class="section-header">
-              <b>Code Coverage</b>
-            </h5>
-            <div class="search-icon-wrapper">
-              <i class="material-icons">search</i>
-            </div>
-          </div>
-          <div class="search-wrapper" ${empty branch and empty device ? 'style="display: none"' : ''}>
-            <div class="row">
-              <div class="col s9">
-                <div class="input-field col s4">
-                  <c:set var="branchVal" value='${fn:replace(branch, "\\\"", "")}'></c:set>
-                  <select id="searchBranch">
-                      <option value="" <c:if test="${empty branch}">disabled selected</c:if> >Choose your branch</option>
-                      <c:forEach items='${branchOptions}' var='branchOption'>
-                        <option value="${branchOption}" ${branchVal == branchOption ? 'selected' : ''}>${branchOption}</option>
-                      </c:forEach>
-                  </select>
-                  <label>Branch Select</label>
-                </div>
-                <div class="input-field col s4">
-                  <c:set var="deviceVal" value='${fn:replace(device, "\\\"", "")}'></c:set>
-                  <select id="searchDevice">
-                    <option value="" <c:if test="${empty device}">disabled selected</c:if> >Choose your device</option>
-                    <c:forEach items='${deviceOptions}' var='deviceOption'>
-                      <option value="${deviceOption}" ${deviceVal == deviceOption ? 'selected' : ''}>${deviceOption}</option>
-                    </c:forEach>
-                  </select>
-                  <label>Device Select</label>
-                </div>
-                <div class="col s4"></div>
-              </div>
-              <div class="refresh-wrapper col s3">
-                <a id="schBtn" class="btn-floating btn-medium red waves-effect waves-light" style="margin-right: 30px;">
-                  <i class="medium material-icons">cached</i>
-                </a>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-      <div class='row'>
-        <div class='col s12'>
-          <div class='col s12 card center-align'>
-            <div id='legend-wrapper'>
-              <c:forEach items='${resultNames}' var='res'>
-                <div class='center-align legend-entry'>
-                  <c:set var='trimmed' value='${fn:replace(res, "TEST_CASE_RESULT_", "")}'/>
-                  <c:set var='nickname' value='${fn:replace(trimmed, "_", " ")}'/>
-                  <label for='${res}'>${nickname}</label>
-                  <div id='${res}' class='${res} legend-bubble'></div>
-                </div>
-              </c:forEach>
-            </div>
-          </div>
-        </div>
-        <div class='col s4 valign-wrapper'>
-          <!-- pie chart -->
-          <div class='pie-chart-wrapper col s12 valign center-align card'>
-            <h6 class='pie-chart-title'>Test Statistics</h6>
-            <div id='pie-chart-stats' class='pie-chart-div'></div>
-          </div>
-        </div>
-        <div class='col s4 valign-wrapper'>
-          <!-- pie chart -->
-          <div class='pie-chart-wrapper col s12 valign center-align card'>
-            <h6 class='pie-chart-title'>Line Coverage (Raw)</h6>
-            <div id='pie-chart-coverage-raw' class='pie-chart-div'></div>
-          </div>
-        </div>
-        <div class='col s4 valign-wrapper'>
-          <!-- pie chart -->
-          <div class='pie-chart-wrapper col s12 valign center-align card'>
-            <h6 class='pie-chart-title'>Line Coverage (Normalized)</h6>
-            <div id='pie-chart-coverage-normalized' class='pie-chart-div'></div>
-          </div>
-        </div>
-      </div>
-      <div class='col s12' id='test-results-container'>
-        <ul class="collapsible popout test-runs" data-collapsible="expandable">
-          <c:forEach var="testRunEntity" items="${testRunEntityList}" varStatus="loop">
-            <li class="test-run-container">
-              <div data-test="<c:out value="${testRunEntity.testName}" />" data-time="<c:out value="${testRunEntity.startTimestamp}" />" data-links='${testRunEntity.jsonLogLinks}' class="collapsible-header test-run">
-                <span class="test-run-metadata">
-                  <span class="test-run-label">
-                    <c:out value="${testRunEntity.testName}" />
-                  </span>
-                  <br />
-                  <b>VTS Build: </b><c:out value="${testRunEntity.testBuildId}" />
-                  <br />
-                  <b>Host: </b><c:out value="${testRunEntity.hostName}" />
-                  <br />
-                  <c:out value="${testRunEntity.startDateTime}" /> - <c:out value="${testRunEntity.endDateTime}" />+0900 (<c:out value="${(testRunEntity.endTimestamp - testRunEntity.startTimestamp) / 1000}" />s)
-                </span>
-                <span class="indicator badge green" style="color: white;">
-                  <c:out value="${testRunEntity.passCount}" />/<c:out value="${testRunEntity.passCount + testRunEntity.passCount}" />
-                </span>
-
-                <c:set var="coveredLineCnt" value="${codeCoverageEntityMap[testRunEntity.id].coveredLineCount}" />
-                <c:set var="totalLineCnt" value="${codeCoverageEntityMap[testRunEntity.id].totalLineCount}" />
-                <c:set var="covPct"
-                       value="${(coveredLineCnt / totalLineCnt * 1000) / 10}"/>
-
-                <c:choose>
-                  <c:when test = "${covPct <= 20}">
-                    <c:set var="badgeColor" value="red" />
-                  </c:when>
-                  <c:when test = "${covPct >= 70}">
-                    <c:set var="badgeColor" value="green" />
-                  </c:when>
-                  <c:otherwise>
-                    <c:set var="badgeColor" value="orange" />
-                  </c:otherwise>
-                </c:choose>
-
-                <span class="indicator badge padded hoverable waves-effect <c:out value="${badgeColor}" />" style="color: white; margin-left: 1px;">
-                  Coverage: <c:out value="${coveredLineCnt}" />/<c:out value="${totalLineCnt}" />
-                  (<fmt:formatNumber value="${(coveredLineCnt / totalLineCnt * 1000) / 10}" type="number" pattern="#.##"/>%)
-                </span>
-                <span class="indicator badge padded hoverable waves-effect grey lighten-1" style="color: white; margin-left: 1px;">Links</span>
-                <span class="indicator badge padded hoverable waves-effect grey lighten-1" style="color: white; margin-left: 1px;">Graph</span>
-                <i class="material-icons expand-arrow">expand_more</i>
-              </div>
-              <div class="collapsible-body test-results row"></div>
-            </li>
-          </c:forEach>
-        </ul>
-
-      </div>
-    </div>
-
-    <!-- Coverage Graph Modal Structure -->
-    <div id="coverageModalGraph" class="modal modal-fixed-footer" style="width: 75%;">
-      <div class="modal-content">
-        <h4 id="coverageModalTitle">Code Coverage Chart</h4>
-
-        <div class="preloader-wrapper big active loaders">
-          <div id="dataTableLoading" class="spinner-layer spinner-blue-only">
-            <div class="circle-clipper left">
-              <div class="circle"></div>
-            </div>
-            <div class="gap-patch">
-              <div class="circle"></div>
-            </div>
-            <div class="circle-clipper right">
-              <div class="circle"></div>
-            </div>
-          </div>
-        </div>
-
-        <!--Div that will hold the visualization graph -->
-        <div id="coverage_line_chart_div"></div>
-        <p></p>
-        <p></p>
-        <div id="coverage_table_chart_div" class="center-align"></div>
-      </div>
-      <div class="modal-footer">
-        <a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat ">Close</a>
-      </div>
-    </div>
-
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_gcs_log.jsp b/src/main/webapp/WEB-INF/jsp/show_gcs_log.jsp
deleted file mode 100644
index 8d73d34..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_gcs_log.jsp
+++ /dev/null
@@ -1,188 +0,0 @@
-<%--
-  ~ Copyright (c) 2018 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link rel='stylesheet' href='/css/show_gcs_log.css'>
-  <link rel='stylesheet' href='/css/search_header.css'>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/time.js'></script>
-  <script src='js/plan_runs.js'></script>
-  <script src='js/search_header.js'></script>
-  <script type='text/javascript'>
-      $(document).ready(function() {
-        var paraMap = {'path': '', 'entry': ''};
-        $('.modal').modal({
-          dismissible: true,  // Modal can be dismissed by clicking outside of the modal
-          opacity: .5,  // Opacity of modal background
-          inDuration: 300,  // Transition in duration
-          outDuration: 200,  // Transition out duration
-          startingTop: '4%',  // Starting top style attribute
-          endingTop: '10%',  // Ending top style attribute
-          ready: function(modal, trigger) {  // Callback for Modal open. Modal and trigger parameters available.
-            $('.loading-overlay').show();
-            if ($(modal).attr("id") == "logEntryListModal") {
-              console.log($(trigger));
-              $(trigger).addClass("active");
-              paraMap['path'] = "${path}" + trigger.text().trim();
-              var fileName = paraMap['path'].substring(paraMap['path'].lastIndexOf('/')+1);  // Getting filename
-              $(modal).find('#entry-list-modal-title').text(fileName);  // Set file name for modal window
-              var url = "${requestScope['javax.servlet.forward.servlet_path']}?path=" + paraMap['path'];
-              $(modal).find('#downloadLink').prop('href', url + "&action=download");
-              $.get( url, function(data) {
-                var entryList = $(modal).find('#modal-entry-list');
-                $(data.entryList).each(function( index, element ) {
-                  entryList.append("<li class='collection-item'><a href='#logEntryViewModal' class='modal-trigger'>" + element + "</a></li>");
-                });
-              }).done(function() {
-                  $('.loading-overlay').hide();
-              });
-            } else {
-              paraMap['entry'] = trigger.text().trim();
-              $(modal).find('#entry-view-modal-title').text(paraMap['entry']);
-              var entryUrl = "${requestScope['javax.servlet.forward.servlet_path']}?path=" + paraMap['path'] + "&entry=" + paraMap['entry'];
-              $.get( entryUrl, function(data) {
-                $(modal).find('#entry-view-modal-content').text(data.entryContent);
-              }).done(function() {
-                $('.loading-overlay').hide();
-              });
-            }
-          },
-          complete: function(modal) {
-              if ($(modal).attr("id") == "logEntryListModal") {
-                  $(modal).find('#modal-entry-list').find("li").remove();
-                  $("div.collection > a.collection-item.active").removeClass('active')
-              } else {
-                  $(modal).find('#entry-view-modal-content').text('');
-              }
-          }  // Callback for Modal close
-        });
-      });
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div class='row' id='release-container'>
-        <h5>Current Directory Path : ${path}</h5>
-        <hr/>
-        <div class="row">
-          <div class="col s7">
-            <h4>Directory List</h4>
-            <ul class="collection">
-            <c:forEach varStatus="dirLoop" var="dirName" items="${dirList}">
-              <li class="collection-item">
-                <a href="${requestScope['javax.servlet.forward.servlet_path']}?path=${dirName}">
-                  <c:out value="${dirName}"></c:out>
-                  <c:if test="${dirLoop.first && path ne '/'}">
-                    (Move to Parent)
-                  </c:if>
-                </a>
-              </li>
-              <c:if test="${!dirLoop.last}">
-              </c:if>
-            </c:forEach>
-            </ul>
-          </div>
-          <div class="col s5">
-            <h4>File List</h4>
-            <div class="collection">
-            <c:forEach varStatus="fileLoop" var="fileName" items="${fileList}">
-              <a href="#logEntryListModal" class="collection-item modal-trigger">
-                <c:out value="${fileName}"></c:out>
-              </a>
-              <c:if test="${!fileLoop.last}">
-              </c:if>
-            </c:forEach>
-            </div>
-          </div>
-        </div>
-
-      </div>
-    </div>
-
-    <%@ include file="footer.jsp" %>
-
-    <!-- Modal For Zip file entries -->
-    <div id="logEntryListModal" class="modal">
-      <div class="modal-content">
-        <h4 id="entry-list-modal-title" class="truncate"></h4>
-        <div id="entry-list-modal-content">
-          <ul id="modal-entry-list" class="collection"></ul>
-        </div>
-      </div>
-      <div class="modal-footer">
-        <div class="row">
-          <div class="col s3 offset-s6">
-            <a href="#!" id="downloadLink" class="modal-action modal-close waves-effect waves-green btn">Download</a>
-          </div>
-          <div class="col s3">
-            <a href="#!" class="modal-action modal-close waves-effect waves-green btn">Close</a>
-          </div>
-        </div>
-      </div>
-
-      <div class="loading-overlay">
-        <div class="preloader-wrapper big active" style="top: 25%; left: 45%;">
-          <div class="spinner-layer spinner-blue-only">
-            <div class="circle-clipper left">
-              <div class="circle"></div>
-            </div>
-            <div class="gap-patch">
-              <div class="circle"></div>
-            </div>
-            <div class="circle-clipper right">
-              <div class="circle"></div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-    </div>
-
-    <!-- Modal For Zip file entry's content -->
-    <div id="logEntryViewModal" class="modal modal-fixed-footer">
-      <div class="modal-content">
-        <h4 id="entry-view-modal-title" class="truncate"></h4>
-        <div id="entry-view-modal-content">
-
-        </div>
-      </div>
-      <div class="modal-footer">
-        <a href="#!" class="modal-action modal-close waves-effect waves-green btn">Close</a>
-      </div>
-
-      <div class="loading-overlay">
-        <div class="preloader-wrapper big active" style="top: 25%; left: 45%;">
-          <div class="spinner-layer spinner-blue-only">
-            <div class="circle-clipper left">
-              <div class="circle"></div>
-            </div>
-            <div class="gap-patch">
-              <div class="circle"></div>
-            </div>
-            <div class="circle-clipper right">
-              <div class="circle"></div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-    </div>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_graph.jsp b/src/main/webapp/WEB-INF/jsp/show_graph.jsp
deleted file mode 100644
index 7111f58..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_graph.jsp
+++ /dev/null
@@ -1,292 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/datepicker.css' rel='stylesheet'>
-  <link type='text/css' href='/css/show_graph.css' rel='stylesheet'>
-  <link rel='stylesheet' href='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.0/jquery-ui.css'>
-  <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>
-  <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js'></script>
-  <body>
-    <script type='text/javascript'>
-        google.charts.load('current', {packages:['corechart', 'table', 'line']});
-        google.charts.setOnLoadCallback(drawAllGraphs);
-
-        ONE_DAY = 86400000000;
-        MICRO_PER_MILLI = 1000;
-        N_BUCKETS = 200;
-
-        var graphs = ${graphs};
-
-        $(function() {
-            $('select').material_select();
-            var date = $('#date').datepicker({
-                showAnim: 'slideDown',
-                maxDate: new Date()
-            });
-            date.datepicker('setDate', new Date(${endTime} / MICRO_PER_MILLI));
-            $('#load').click(load);
-            $('#outlier-select').change(drawAllGraphs);
-        });
-
-        // Draw all graphs.
-        function drawAllGraphs() {
-            $('#profiling-container').empty();
-            var percentileIndex = Number($('#outlier-select').val());
-
-            // Get histogram extrema
-            var histMin = null;
-            var histMax = null;
-            graphs.forEach(function(g) {
-                if (g.type != 'HISTOGRAM') return;
-                var minVal;
-                var maxVal;
-                if (percentileIndex == -1) {
-                    minVal = g.min;
-                    maxVal = g.max;
-                } else {
-                    minVal = g.percentile_values[percentileIndex];
-                    var endIndex = g.percentiles.length - percentileIndex - 1
-                    maxVal = g.percentile_values[endIndex];
-                }
-                if (!histMin || minVal < histMin) histMin = minVal;
-                if (!histMax || maxVal > histMax) histMax = maxVal;
-            });
-
-            graphs.forEach(function(graph) {
-                if (graph.type == 'LINE_GRAPH') drawLineGraph(graph);
-                else if (graph.type == 'HISTOGRAM')
-                    drawHistogram(graph, histMin, histMax);
-            });
-        }
-
-       /**
-        * Draw a line graph.
-        *
-        * Args:
-        *     lineGraph: a JSON object containing the following fields:
-        *                - name: the name of the graph
-        *                - values: an array of numbers
-        *                - ticks: an array of strings to use as x-axis labels
-        *                - ids: an array of string labels for each point (e.g. the
-        *                       build info for the run that produced the point)
-        *                - x_label: the string label for the x axis
-        *                - y_label: the string label for the y axis
-        */
-        function drawLineGraph(lineGraph) {
-            if (!lineGraph.ticks || lineGraph.ticks.length < 1) {
-                return;
-            }
-            var title = 'Performance';
-            if (lineGraph.name) title += ' (' + lineGraph.name + ')';
-            lineGraph.ticks.forEach(function (label, i) {
-                lineGraph.values[i].unshift(label);
-            });
-            var data = new google.visualization.DataTable();
-            data.addColumn('string', lineGraph.x_label);
-            lineGraph.ids.forEach(function(id) {
-                data.addColumn('number', id);
-            });
-            data.addRows(lineGraph.values);
-            var options = {
-              chart: {
-                  title: title,
-                  subtitle: lineGraph.y_label
-              },
-              legend: { position: 'none' }
-            };
-            var container = $('<div class="row card center-align col s12 graph-wrapper"></div>');
-            container.appendTo('#profiling-container');
-            var chartDiv = $('<div class="col s12 graph"></div>');
-            chartDiv.appendTo(container);
-            var chart = new google.charts.Line(chartDiv[0]);
-            chart.draw(data, options);
-        }
-
-       /**
-        * Draw a histogram.
-        *
-        * Args:
-        *     hist: a JSON object containing the following fields:
-        *           - name: the name of the graph
-        *           - values: an array of numbers
-        *           - ids: an array of string labels for each point (e.g. the
-        *                  build info for the run that produced the point)
-        *           - x_label: the string label for the x axis
-        *           - y_label: the string label for the y axis
-        *     min: the minimum value to display
-        *     max: the maximum value to display
-        */
-        function drawHistogram(hist, min, max) {
-            if (!hist.values || hist.values.length == 0) return;
-            var title = 'Performance';
-            if (hist.name) title += ' (' + hist.name + ')';
-            var values = hist.values;
-            var histogramData = values.reduce(function(result, d, i) {
-                if (d <= max && d >= min) result.push([hist.ids[i], d]);
-                return result;
-            }, []);
-
-            var data = google.visualization.arrayToDataTable(histogramData, true);
-            var bucketSize = (max - min) / N_BUCKETS;
-
-            var options = {
-                title: title,
-                titleTextStyle: {
-                    color: '#757575',
-                    fontSize: 16,
-                    bold: false
-                },
-                legend: { position: 'none' },
-                colors: ['#4285F4'],
-                fontName: 'Roboto',
-                vAxis:{
-                    title: hist.y_label,
-                    titleTextStyle: {
-                        color: '#424242',
-                        fontSize: 12,
-                        italic: false
-                    },
-                    textStyle: {
-                        fontSize: 12,
-                        color: '#757575'
-                    },
-                },
-                hAxis: {
-                    title: hist.x_label,
-                    textStyle: {
-                        fontSize: 12,
-                        color: '#757575'
-                    },
-                    titleTextStyle: {
-                        color: '#424242',
-                        fontSize: 12,
-                        italic: false
-                    }
-                },
-                bar: { gap: 0 },
-                histogram: {
-                    minValue: min,
-                    maxValue: max,
-                    maxNumBuckets: N_BUCKETS,
-                    bucketSize: bucketSize
-                },
-                chartArea: {
-                    width: '100%',
-                    top: 40,
-                    left: 60,
-                    height: 375
-                }
-            };
-            var container = $('<div class="row card col s12 graph-wrapper"></div>');
-            container.appendTo('#profiling-container');
-
-            var chartDiv = $('<div class="col s12 graph"></div>');
-            chartDiv.appendTo(container);
-            var chart = new google.visualization.Histogram(chartDiv[0]);
-            chart.draw(data, options);
-
-            var tableDiv = $('<div class="col s12"></div>');
-            tableDiv.appendTo(container);
-
-            var tableHtml = '<table class="percentile-table"><thead><tr>';
-            hist.percentiles.forEach(function(p) {
-                tableHtml += '<th data-field="id">' + p + '%</th>';
-            });
-            tableHtml += '</tr></thead><tbody><tr>';
-            hist.percentile_values.forEach(function(v) {
-                tableHtml += '<td>' + v + '</td>';
-            });
-            tableHtml += '</tbody></table>';
-            $(tableHtml).appendTo(tableDiv);
-        }
-
-        // Reload the page.
-        function load() {
-            var endTime = $('#date').datepicker('getDate').getTime();
-            endTime = endTime + (ONE_DAY / MICRO_PER_MILLI) - 1;
-            var filterVal = $('#outlier-select').val();
-            var ctx = '${pageContext.request.contextPath}';
-            var link = ctx + '/show_graph?profilingPoint=${profilingPointName}' +
-                '&testName=${testName}' +
-                '&endTime=' + (endTime * MICRO_PER_MILLI) +
-                '&filterVal=' + filterVal;
-            if ($('#device-select').prop('selectedIndex') > 1) {
-                link += '&device=' + $('#device-select').val();
-            }
-            window.open(link,'_self');
-        }
-    </script>
-    <div id='download' class='fixed-action-btn'>
-      <a id='b' class='btn-floating btn-large red waves-effect waves-light'>
-        <i class='large material-icons'>file_download</i>
-      </a>
-    </div>
-    <div class='container wide'>
-      <div class='row card'>
-        <div id='header-container' class='valign-wrapper col s12'>
-          <div class='col s3 valign'>
-            <h5>Profiling Point:</h5>
-          </div>
-          <div class='col s9 right-align valign'>
-            <h5 class='profiling-name truncate'>${profilingPointName}</h5>
-          </div>
-        </div>
-        <div id='date-container' class='col s12'>
-          <c:set var='offset' value='${showFilterDropdown ? 0 : 2}' />
-          <c:if test='${showFilterDropdown}'>
-            <div id='outlier-select-wrapper' class='col s2'>
-              <select id='outlier-select'>
-                <option value='-1' ${filterVal eq -1 ? 'selected' : ''}>Show outliers</option>
-                <option value='0' ${filterVal eq 0 ? 'selected' : ''}>Filter outliers (1%)</option>
-                <option value='1' ${filterVal eq 1 ? 'selected' : ''}>Filter outliers (2%)</option>
-                <option value='2' ${filterVal eq 2 ? 'selected' : ''}>Filter outliers (5%)</option>
-              </select>
-            </div>
-          </c:if>
-          <div id='device-select-wrapper' class='input-field col s5 m3 offset-m${offset + 4} offset-s${offset}'>
-            <select id='device-select'>
-              <option value='' disabled>Select device</option>
-              <option value='0' ${empty selectedDevice ? 'selected' : ''}>All Devices</option>
-              <c:forEach items='${devices}' var='device' varStatus='loop'>
-                <option value=${device} ${selectedDevice eq device ? 'selected' : ''}>${device}</option>
-              </c:forEach>
-            </select>
-          </div>
-          <input type='text' id='date' name='date' class='col s4 m2'>
-          <a id='load' class='btn-floating btn-medium red right waves-effect waves-light'>
-            <i class='medium material-icons'>cached</i>
-          </a>
-        </div>
-      </div>
-      <div id='profiling-container'>
-      </div>
-      <c:if test='${not empty error}'>
-        <div id='error-container' class='row card'>
-          <div class='col s10 offset-s1 center-align'>
-            <!-- Error in case of profiling data is missing -->
-            <h5>${error}</h5>
-          </div>
-        </div>
-      </c:if>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_green_plan_release.jsp b/src/main/webapp/WEB-INF/jsp/show_green_plan_release.jsp
deleted file mode 100644
index 1bb00dd..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_green_plan_release.jsp
+++ /dev/null
@@ -1,104 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link rel='stylesheet' href='/css/show_plan_release.css'>
-  <link rel='stylesheet' href='/css/plan_runs.css'>
-  <link rel='stylesheet' href='/css/search_header.css'>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/time.js'></script>
-  <script src='js/plan_runs.js'></script>
-  <script src='js/search_header.js'></script>
-  <script type='text/javascript'>
-      $(document).ready(function() {
-
-      });
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div class="row">
-        <div class="col s12">
-          <h4 id="test-plan-section-header">Test Plans</h4>
-        </div>
-      </div>
-      <div class='row' id='test-plan-green-release-container'>
-        <table class="bordered highlight">
-          <thead>
-            <tr>
-              <th>Branch</th>
-              <th>Last Finished Build</th>
-              <th>Last Green Build</th>
-            </tr>
-          </thead>
-
-          <tbody>
-          <c:forEach var="branchList" items="${greenBuildInfo}">
-            <tr>
-              <td> <c:out value="${branchList.key}"></c:out> </td>
-              <td>
-                <c:forEach varStatus="deviceLoop" var="deviceBuildInfo" items="${branchList.value}">
-                  <p>
-                    <c:out value="${deviceBuildInfo.deviceBuildTarget}"></c:out> :
-                    <c:choose>
-                      <c:when test="${deviceBuildInfo.candidateBuildId eq 'No Test Results'}">
-                        <c:out value="${deviceBuildInfo.candidateBuildId}"></c:out>
-                      </c:when>
-                      <c:otherwise>
-                        <a href="/show_plan_run?plan=${plan}&time=${deviceBuildInfo.candidateBuildIdTimestamp}">
-                          <c:out value="${deviceBuildInfo.candidateBuildId}"></c:out>
-                        </a>
-                      </c:otherwise>
-                    </c:choose>
-                  </p>
-                  <c:if test="${!deviceLoop.last}">
-                    <hr/>
-                  </c:if>
-                </c:forEach>
-              </td>
-              <td>
-                <c:forEach varStatus="deviceLoop" var="deviceBuildInfo" items="${branchList.value}">
-                  <p>
-                    <c:choose>
-                      <c:when test="${deviceBuildInfo.greenBuildId eq 'N/A'}">
-                        <c:out value="${deviceBuildInfo.greenBuildId}"></c:out>
-                      </c:when>
-                      <c:otherwise>
-                        <a href="/show_plan_run?plan=${plan}&time=${deviceBuildInfo.greenBuildIdTimestamp}">
-                          <c:out value="${deviceBuildInfo.greenBuildId}"></c:out>
-                        </a>
-                      </c:otherwise>
-                    </c:choose>
-                  </p>
-                  <c:if test="${!deviceLoop.last}">
-                    <hr/>
-                  </c:if>
-                </c:forEach>
-              </td>
-            </tr>
-          </c:forEach>
-          </tbody>
-        </table>
-      </div>
-
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_green_suite_release.jsp b/src/main/webapp/WEB-INF/jsp/show_green_suite_release.jsp
deleted file mode 100644
index c883ee2..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_green_suite_release.jsp
+++ /dev/null
@@ -1,101 +0,0 @@
-<%--
-  ~ Copyright (c) 2018 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link rel='stylesheet' href='/css/show_plan_release.css'>
-  <link rel='stylesheet' href='/css/plan_runs.css'>
-  <link rel='stylesheet' href='/css/search_header.css'>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/time.js'></script>
-  <script src='js/plan_runs.js'></script>
-  <script src='js/search_header.js'></script>
-  <script type='text/javascript'>
-      $(document).ready(function() {
-
-      });
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div class="row">
-        <div class="col s12">
-          <h4 id="test-suite-section-header">Test Suites</h4>
-        </div>
-      </div>
-
-      <div class='row' id='test-plan-green-release-container'>
-        <table class="bordered highlight">
-          <thead>
-          <tr>
-            <th>Branch</th>
-            <th>Last Finished Build</th>
-            <th>Last Green Build</th>
-          </tr>
-          </thead>
-
-          <tbody>
-          <c:forEach var="branchList" items="${greenBuildInfo}">
-            <tr>
-              <td> <c:out value="${branchList.key}"></c:out> </td>
-              <td>
-                <c:forEach varStatus="deviceLoop" var="deviceBuildInfo" items="${branchList.value}">
-                  <p>
-                    <c:out value="${deviceBuildInfo.deviceBuildTarget}"></c:out> :
-                    <c:choose>
-                      <c:when test="${deviceBuildInfo.candidateBuildId eq 'No Test Results'}">
-                        <c:out value="${deviceBuildInfo.candidateBuildId}"></c:out>
-                      </c:when>
-                      <c:otherwise>
-                        <c:out value="${deviceBuildInfo.candidateBuildId}"></c:out>
-                      </c:otherwise>
-                    </c:choose>
-                  </p>
-                  <c:if test="${!deviceLoop.last}">
-                    <hr/>
-                  </c:if>
-                </c:forEach>
-              </td>
-              <td>
-                <c:forEach varStatus="deviceLoop" var="deviceBuildInfo" items="${branchList.value}">
-                  <p>
-                    <c:choose>
-                      <c:when test="${deviceBuildInfo.greenBuildId eq 'N/A'}">
-                        <c:out value="${deviceBuildInfo.greenBuildId}"></c:out>
-                      </c:when>
-                      <c:otherwise>
-                        <c:out value="${deviceBuildInfo.greenBuildId}"></c:out>
-                      </c:otherwise>
-                    </c:choose>
-                  </p>
-                  <c:if test="${!deviceLoop.last}">
-                    <hr/>
-                  </c:if>
-                </c:forEach>
-              </td>
-            </tr>
-          </c:forEach>
-          </tbody>
-        </table>
-      </div>
-
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_performance_digest.jsp b/src/main/webapp/WEB-INF/jsp/show_performance_digest.jsp
deleted file mode 100644
index 224d847..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_performance_digest.jsp
+++ /dev/null
@@ -1,100 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/datepicker.css' rel='stylesheet'>
-  <link type='text/css' href='/css/show_performance_digest.css' rel='stylesheet'>
-  <link rel='stylesheet' href='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.0/jquery-ui.css'>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
-  <body>
-    <script type='text/javascript'>
-        ONE_DAY = 86400000000;
-        MICRO_PER_MILLI = 1000;
-
-        function load() {
-            var time = $('#date').datepicker('getDate').getTime() - 1;
-            time = time * MICRO_PER_MILLI + ONE_DAY;  // end of day
-            var ctx = '${pageContext.request.contextPath}';
-            var link = ctx + '/show_performance_digest?profilingPoint=${profilingPointName}' +
-                '&testName=${testName}' +
-                '&startTime=' + time;
-            if ($('#device-select').prop('selectedIndex') > 1) {
-                link += '&device=' + $('#device-select').val();
-            }
-            window.open(link,'_self');
-        }
-
-        $(function() {
-            var date = $('#date').datepicker({
-                showAnim: "slideDown",
-                maxDate: new Date()
-            });
-            date.datepicker('setDate', new Date(${startTime} / MICRO_PER_MILLI));
-            $('#load').click(load);
-
-            $('.date-label').each(function(i) {
-                var label = $(this);
-                label.html(moment(parseInt(label.html())).format('M/D/YY'));
-            });
-            $('select').material_select();
-        });
-    </script>
-    <div class='wide container'>
-      <div class='row card'>
-        <div id='header-container' class='col s12'>
-          <div class='col s12'>
-            <h4>Daily Performance Digest</h4>
-          </div>
-          <div id='device-select-wrapper' class='input-field col s6 m3 offset-m6'>
-            <select id='device-select'>
-              <option value='' disabled>Select device</option>
-              <option value='0' ${empty selectedDevice ? 'selected' : ''}>All Devices</option>
-              <c:forEach items='${devices}' var='device' varStatus='loop'>
-                <option value=${device} ${selectedDevice eq device ? 'selected' : ''}>${device}</option>
-              </c:forEach>
-            </select>
-          </div>
-          <input type='text' id='date' name='date' class='col s5 m2'>
-          <a id='load' class='btn-floating btn-medium red right waves-effect waves-light'>
-            <i class='medium material-icons'>cached</i>
-          </a>
-        </div>
-      </div>
-      <div class='row'>
-        <c:forEach items='${tables}' var='table' varStatus='loop'>
-          <div class='col s12 card summary'>
-            <div class='col s3 valign'>
-              <h5>Profiling Point:</h5>
-            </div>
-            <div class='col s9 right-align valign'>
-              <h5 class="profiling-name truncate">${tableTitles[loop.index]}</h5>
-            </div>
-            ${table}
-            <span class='profiling-subtitle'>
-              ${tableSubtitles[loop.index]}
-            </span>
-          </div>
-        </c:forEach>
-      </div>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_plan_release.jsp b/src/main/webapp/WEB-INF/jsp/show_plan_release.jsp
deleted file mode 100644
index 9a312e9..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_plan_release.jsp
+++ /dev/null
@@ -1,119 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link rel='stylesheet' href='/css/show_plan_release.css'>
-  <link rel='stylesheet' href='/css/plan_runs.css'>
-  <link rel='stylesheet' href='/css/search_header.css'>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/time.js'></script>
-  <script src='js/plan_runs.js'></script>
-  <script src='js/search_header.js'></script>
-  <script type='text/javascript'>
-      var search;
-      $(document).ready(function() {
-          // disable buttons on load
-          if (!${hasNewer}) {
-            $('#newer-button').toggleClass('disabled');
-          }
-          if (!${hasOlder}) {
-            $('#older-button').toggleClass('disabled');
-          }
-
-          $('#newer-button').click(prev);
-          $('#older-button').click(next);
-          search = $('#filter-bar').createSearchHeader('Plan: ', '${plan}', refresh);
-          search.addFilter('Branch', 'branch', {
-            corpus: ${branches}
-          }, ${branch});
-          search.addFilter('Device', 'device', {
-            corpus: ${devices}
-          }, ${device});
-          search.addFilter('Device Build ID', 'deviceBuildId', {}, ${deviceBuildId});
-          search.addFilter('Test Build ID', 'testBuildId', {}, ${testBuildId});
-          search.addFilter('Host', 'hostname', {}, ${hostname});
-          search.addFilter('Passing Count', 'passing', {
-            validate: 'inequality',
-            width: 's2'
-          }, ${passing});
-          search.addFilter('Non-Passing Count', 'nonpassing', {
-            validate: 'inequality',
-            width: 's2'
-          }, ${nonpassing});
-          search.addRunTypeCheckboxes(${showPresubmit}, ${showPostsubmit});
-          search.display();
-          $('#release-container').showPlanRuns(${planRuns});
-      });
-
-      // view older data
-      function next() {
-        if($(this).hasClass('disabled')) return;
-        var endTime = ${startTime};
-        var link = '${pageContext.request.contextPath}' +
-            '/show_plan_release?plan=${plan}&endTime=' + endTime +
-            search.args();
-        if (${unfiltered}) {
-          link += '&unfiltered=';
-        }
-        window.open(link,'_self');
-      }
-
-      // view newer data
-      function prev() {
-        if($(this).hasClass('disabled')) return;
-        var startTime = ${endTime};
-        var link = '${pageContext.request.contextPath}' +
-            '/show_plan_release?plan=${plan}&startTime=' + startTime +
-            search.args();
-        if (${unfiltered}) {
-          link += '&unfiltered=';
-        }
-        window.open(link,'_self');
-      }
-
-      // refresh the page to see the runs matching the specified filter
-      function refresh() {
-        var link = '${pageContext.request.contextPath}' +
-            '/show_plan_release?plan=${plan}' + search.args();
-        if (${unfiltered}) {
-          link += '&unfiltered=';
-        }
-        window.open(link,'_self');
-      }
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div id='filter-bar'></div>
-      <div class='row' id='release-container'></div>
-      <div id='newer-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='newer-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_left</i>
-        </a>
-      </div>
-      <div id='older-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='older-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_right</i>
-        </a>
-      </div>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_plan_run.jsp b/src/main/webapp/WEB-INF/jsp/show_plan_run.jsp
deleted file mode 100644
index bec4c76..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_plan_run.jsp
+++ /dev/null
@@ -1,236 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/show_test_runs_common.css' rel='stylesheet'>
-  <link type='text/css' href='/css/test_results.css' rel='stylesheet'>
-  <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/time.js'></script>
-  <script src='js/test_results.js'></script>
-  <script type='text/javascript'>
-      google.charts.load('current', {'packages':['table', 'corechart']});
-      google.charts.setOnLoadCallback(drawPieChart);
-
-      $(document).ready(function() {
-          $('#test-results-container').showTests(${testRuns}, true);
-          drawSummary();
-
-        $('#apiCoverageModal').modal({
-              width: '75%',
-              dismissible: true, // Modal can be dismissed by clicking outside of the modal
-              opacity: .5, // Opacity of modal background
-              inDuration: 300, // Transition in duration
-              outDuration: 200, // Transition out duration
-              startingTop: '4%', // Starting top style attribute
-              endingTop: '10%', // Ending top style attribute
-              ready: function(modal, trigger) { // Callback for Modal open. Modal and trigger parameters available.
-                var urlSafeKeyList = modal.data('urlSafeKeyList');
-                var halApiInfoList = [];
-                var getAjaxList = $.map( urlSafeKeyList, function( urlSafeKey ) {
-                  return $.get( "/api/coverage/api/data?key=" + urlSafeKey, function(data) {
-                    halApiInfoList.push(data);
-                  })
-                  .fail(function() {
-                    alert( "Error : can't bring API coverage data from the server" );
-                  });
-                });
-
-                $.when.apply($, getAjaxList).then(function() {
-                  $.each(halApiInfoList, function( index, data ) {
-                    $("#halApiList").append(halApiListTemplate());
-                    var version = data.halMajorVersion + '.' + data.halMinorVersion;
-                    var defaultInfo = data.halPackageName + '@' + version + '::' + data.halInterfaceName;
-                    $("#halApiList > li:last > div.collapsible-header").html(
-                        '<i class="material-icons">report</i> HAL API Information : ' + defaultInfo
-                    );
-                    /*
-                    $("#halApiList > li:last > div.collapsible-body > ul.collection.with-header").append(
-                        '<li class="collection-header">' +
-                        '</li>'
-                    );
-                    */
-
-                    $("#halApiList > li:last > div.collapsible-body > ul.collection.with-header").append(
-                        $.map( data.halApi, function( apiName, idx ) {
-                          var colorClass = data.coveredHalApi.indexOf(apiName) > -1 ? "green" : "red"
-                          return '<li class="collection-item ' + colorClass + ' lighten-1">' + apiName + '</li>';
-                        }).join("")
-                    );
-                    $("#halApiList").collapsible('open', index);
-                  });
-                  $('#dataTableLoading').hide("slow");
-                });
-              },
-              complete: function() {
-                $("#halApiList").empty();
-                $('#dataTableLoading').show("slow");
-              } // Callback for Modal close
-            }
-        );
-      });
-
-      function halApiListTemplate() {
-         return '<li>' +
-            '<div class="collapsible-header">' +
-            '<i class="material-icons">report</i> API Information' +
-            '</div>' +
-            '<div class="collapsible-body">' +
-            '<ul class="collection with-header">' +
-            '</ul>' +
-            '</div>' +
-            '</li>';
-      }
-
-      // to draw pie chart
-      function drawPieChart() {
-          var topBuildResultCounts = ${topBuildResultCounts};
-          if (topBuildResultCounts.length < 1) {
-              return;
-          }
-          var resultNames = ${resultNamesJson};
-          var rows = resultNames.map(function(res, i) {
-              nickname = res.replace('TEST_CASE_RESULT_', '').replace('_', ' ')
-                         .trim().toLowerCase();
-              return [nickname, parseInt(topBuildResultCounts[i])];
-          });
-          rows.unshift(['Result', 'Count']);
-
-          // Get CSS color definitions (or default to white)
-          var colors = resultNames.map(function(res) {
-              return $('.' + res).css('background-color') || 'white';
-          });
-
-          var data = google.visualization.arrayToDataTable(rows);
-          var options = {
-              is3D: false,
-              colors: colors,
-              fontName: 'Roboto',
-              fontSize: '14px',
-              legend: {position: 'bottom'},
-              tooltip: {showColorCode: true, ignoreBounds: false},
-              chartArea: {height: '80%', width: '90%'},
-              pieHole: 0.4
-          };
-
-          var chart = new google.visualization.PieChart(document.getElementById('pie-chart-div'));
-          chart.draw(data, options);
-      }
-
-      // Draw a test plan run summary box.
-      function drawSummary() {
-          var testBuildId = ${testBuildId};
-          var startTime = ${startTime};
-          var endTime = ${endTime};
-          var moduleCount = ${moduleCount};
-          var passingTestCaseCount = ${passingTestCaseCount};
-          var failingTestCaseCount = ${failingTestCaseCount};
-          var div = $('<div></div>');
-          var details = $('<span></span>').appendTo(div);
-          details.append('<b>VTS Build: </b>' + testBuildId + '<br>');
-          details.append('<b>Start Time: </b>' + moment().renderTime(startTime, true) + '<br>');
-          details.append('<b>End Time: </b>' + moment().renderTime(endTime, true) + '<br>');
-          details.append('<b>Duration: </b>' + moment().renderDuration(endTime - startTime) + '<br>');
-          details.append('<b>Modules: </b>' + moduleCount + '<br>');
-          details.append('<b>Passing Test Cases: </b>' + passingTestCaseCount + '<br>');
-          details.append('<b>Non-Passing Test Cases: </b>' + failingTestCaseCount + '<br>');
-
-          <c:if test="${totalApiCount > 0 && totalCoveredApiCount >= 0}">
-          details.append('<b>Total API : </b><c:out value="${totalApiCount}"/><br>');
-          details.append('<b>Total Covered API : </b><c:out value="${totalCoveredApiCount}"/><br>');
-          </c:if>
-
-          div.appendTo($('#summary-container'));
-      }
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div class='row'>
-        <div class='col s7'>
-          <div class='col s12 card center-align'>
-            <div id='legend-wrapper'>
-              <c:forEach items='${resultNames}' var='res'>
-                <div class='center-align legend-entry'>
-                  <c:set var='trimmed' value='${fn:replace(res, "TEST_CASE_RESULT_", "")}'/>
-                  <c:set var='nickname' value='${fn:replace(trimmed, "_", " ")}'/>
-                  <label for='${res}'>${nickname}</label>
-                  <div id='${res}' class='${res} legend-bubble'></div>
-                </div>
-              </c:forEach>
-            </div>
-          </div>
-          <div id='summary-container' class='col s12 card'>
-            <span class='summary-header valign-wrapper'>
-              <i class='material-icons'>info_outline</i>Run Details
-            </span>
-          </div>
-        </div>
-        <div class='col s5 valign-wrapper'>
-          <!-- pie chart -->
-          <div id='pie-chart-wrapper' class='col s12 valign center-align card'>
-            <div id='pie-chart-div'></div>
-          </div>
-        </div>
-      </div>
-
-      <div class='col s12' id='test-results-container'></div>
-    </div>
-
-    <!-- Modal Structure -->
-    <div id="apiCoverageModal" class="modal modal-fixed-footer" style="width: 75%;">
-      <div class="modal-content">
-        <h4 id="coverageModalTitle">API Coverage</h4>
-
-        <div class="preloader-wrapper big active loaders">
-          <div id="dataTableLoading" class="spinner-layer spinner-blue-only">
-            <div class="circle-clipper left">
-              <div class="circle"></div>
-            </div>
-            <div class="gap-patch">
-              <div class="circle"></div>
-            </div>
-            <div class="circle-clipper right">
-              <div class="circle"></div>
-            </div>
-          </div>
-        </div>
-
-        <div class="row">
-          <div class="col s12">
-            <ul class="collection with-header">
-              <li class="collection-header">
-                <h4>Total HAL API List</h4>
-                <ul id="halApiList" class="collapsible popout" data-collapsible="expandable">
-
-                </ul>
-              </li>
-            </ul>
-          </div>
-        </div>
-      </div>
-      <div class="modal-footer">
-        <a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat ">Close</a>
-      </div>
-    </div>
-
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_profiling_list.jsp b/src/main/webapp/WEB-INF/jsp/show_profiling_list.jsp
deleted file mode 100644
index f1615d7..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_profiling_list.jsp
+++ /dev/null
@@ -1,44 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <link rel='stylesheet' href='/css/show_release.css'>
-  <%@ include file='header.jsp' %>
-  <body>
-    <div class='container'>
-      <div class='row'>
-        <div class='col s12'>
-          <h4 id='section-header'>Profiling Tests</h4>
-        </div>
-      </div>
-      <div class='row' id='options'>
-        <c:forEach items='${testNames}' var='test'>
-          <div>
-            <a href='/show_profiling_overview?testName=${test}'>
-              <div class='col s12 card hoverable option valign-wrapper waves-effect'>
-                <span class='entry valign'>${test}</span>
-              </div>
-            </a>
-          </div>
-        </c:forEach>
-      </div>
-    </div>
-    <%@ include file='footer.jsp' %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_profiling_overview.jsp b/src/main/webapp/WEB-INF/jsp/show_profiling_overview.jsp
deleted file mode 100644
index 62bd8de..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_profiling_overview.jsp
+++ /dev/null
@@ -1,172 +0,0 @@
-<%--
-  ~ Copyright (C) 2017 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/datepicker.css' rel='stylesheet'>
-  <link type='text/css' href='/css/show_profiling_overview.css' rel='stylesheet'>
-  <link rel='stylesheet' href='/css/search_header.css'>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/search_header.js'></script>
-  <script src='js/time.js'></script>
-  <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>
-  <body>
-    <script type='text/javascript'>
-        google.charts.load('current', {'packages':['corechart']});
-        google.charts.setOnLoadCallback(drawAllPlots);
-
-        var plots = ${plots};
-        var search;
-
-        $(document).ready(function() {
-            search = $('#filter-bar').createSearchHeader(
-                'Profiling Analysis', '', refresh);
-            search.addFilter('Branch', 'branch', {
-                corpus: ${branches}
-            }, ${branch});
-            search.addFilter('Device', 'device', {
-                corpus: ${devices}
-            }, ${device});
-          search.display();
-      });
-
-        /**
-        * Draw a box plot.
-        *
-        * Args:
-        *     container: the jquery selector in which to draw the graph.
-        *     lineGraph: a JSON-serialized BoxPlot.
-        */
-        function drawBoxPlot(container, plot) {
-            var data = new google.visualization.DataTable();
-            data.addColumn('string', 'x');
-            plot.seriesList.forEach(function(series) {
-                data.addColumn('number', series);
-                data.addColumn({id:'fill', type:'number', role:'interval'});
-                data.addColumn({id:'fill', type:'number', role:'interval'});
-                data.addColumn({id:'bar', type:'number', role:'interval'});
-                data.addColumn({id:'bar', type:'number', role:'interval'});
-                data.addColumn({type:'string', role:'tooltip', p: {'html': true}});
-            });
-            var rows = plot.values.map(function(day) {
-                var dateString = new moment().renderDate(1 * day.label);
-                var statArray = day.values.map(function(stat) {
-                    var tooltip = (
-                        dateString +
-                        '</br><b>Mean:</b> ' +
-                        stat.mean.toFixed(2) +
-                        '</br><b>Std:</b> ' +
-                        stat.std.toFixed(2) +
-                        '</br><b>Count:</b> ' +
-                        stat.count.toFixed(0));
-                    return [
-                        stat.mean,
-                        stat.mean + stat.std,
-                        stat.mean - stat.std,
-                        stat.mean + stat.std,
-                        stat.mean - stat.std,
-                        tooltip];
-                });
-                return [].concat.apply(
-                    [dateString], statArray);
-            });
-            data.addRows(rows);
-
-            var options = {
-                title: plot.name,
-                curveType: 'function',
-                intervals: { 'color' : 'series-color' },
-                interval: {
-                    'fill': {
-                        'style': 'area',
-                        'curveType': 'function',
-                        'fillOpacity': 0.2
-                    },
-                    'bar': {
-                        'style': 'bars',
-                        'barWidth': 0,
-                        'lineWidth': 1,
-                        'pointSize': 3,
-                        'fillOpacity': 1
-                    }},
-                legend: { position: 'bottom' },
-                tooltip: { isHtml: true },
-                fontName: 'Roboto',
-                titleTextStyle: {
-                    color: '#757575',
-                    fontSize: 16,
-                    bold: false
-                },
-                pointsVisible: true,
-                vAxis:{
-                    title: plot.y_label,
-                    titleTextStyle: {
-                        color: '#424242',
-                        fontSize: 12,
-                        italic: false
-                    },
-                    textStyle: {
-                        fontSize: 12,
-                        color: '#757575'
-                    },
-                },
-                hAxis: {
-                    textStyle: {
-                        fontSize: 12,
-                        color: '#757575'
-                    },
-                    titleTextStyle: {
-                        color: '#424242',
-                        fontSize: 12,
-                        italic: false
-                    }
-                },
-            };
-            var plot = new google.visualization.LineChart(container[0]);
-            plot.draw(data, options);
-        }
-
-        // Draw all graphs.
-        function drawAllPlots() {
-            var container = $('#profiling-container');
-            container.empty();
-
-            plots.forEach(function(g) {
-                var plot = $('<div class="box-plot row card"></div>');
-                plot.appendTo(container);
-                drawBoxPlot(plot.append('<div></div>'), g);
-            });
-        }
-
-        // refresh the page to see the runs matching the specified filter
-        function refresh() {
-            if($(this).hasClass('disabled')) return;
-            var link = '${pageContext.request.contextPath}' +
-                '/show_profiling_overview?testName=${testName}' + search.args();
-            window.open(link,'_self');
-        }
-    </script>
-    <div class='container wide'>
-      <div id='filter-bar' class='row'></div>
-      <div id='profiling-container'>
-      </div>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_release.jsp b/src/main/webapp/WEB-INF/jsp/show_release.jsp
deleted file mode 100644
index 9e8c2eb..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_release.jsp
+++ /dev/null
@@ -1,80 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <link rel='stylesheet' href='/css/show_release.css'>
-  <%@ include file='header.jsp' %>
-  <script type='text/javascript'>
-      $(document).ready(function() {
-          $("li.tab").each(function( index ) {
-              $(this).click(function() {
-                  window.open($(this).children().attr("href"), '_self');
-              });
-          });
-      });
-  </script>
-  <body>
-    <div class='container'>
-      <div class='row'>
-        <div class='col s12'>
-
-          <ul class="tabs z-depth-1">
-            <li class="tab col s6" id="planTabLink">
-              <a class="${testType == 'plan' ? 'active' : 'inactive'}" href="${requestScope['javax.servlet.forward.servlet_path']}?type=plan">Test Plans</a>
-            </li>
-            <li class="tab col s6" id="suiteTabLink">
-              <a class="${testType == 'suite' ? 'active' : 'inactive'}" href="${requestScope['javax.servlet.forward.servlet_path']}?type=suite">Test Suite Plans</a>
-            </li>
-          </ul>
-
-        </div>
-      </div>
-      <div class='row' id='options'>
-        <c:set var="typeParam" scope="session" value="${testType == 'suite' ? '&type=suite' : '&type=plan'}"/>
-
-        <c:forEach items='${planNames}' var='plan'>
-          <c:choose>
-            <c:when test="${isAdmin}">
-              <div class="col s10 center">
-                <a href='/show_plan_release?plan=${plan}${typeParam}'>
-                  <div class='col s12 card hoverable option valign-wrapper waves-effect'>
-                    <span class='entry valign'>${plan}</span>
-                  </div>
-                </a>
-              </div>
-              <div class="col s2 center btn-container" style="margin-top: 9px;">
-                <a href='/show_green_release?plan=${plan}${typeParam}' class="waves-effect waves-light btn">Green</a>
-              </div>
-            </c:when>
-            <c:otherwise>
-              <div class="col s12 center">
-                <a href='/show_plan_release?plan=${plan}${typeParam}'>
-                  <div class='col s12 card hoverable option valign-wrapper waves-effect'>
-                    <span class='entry valign'>${plan}</span>
-                  </div>
-                </a>
-              </div>
-            </c:otherwise>
-          </c:choose>
-        </c:forEach>
-      </div>
-    </div>
-    <%@ include file='footer.jsp' %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp b/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp
deleted file mode 100644
index 523291a..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp
+++ /dev/null
@@ -1,362 +0,0 @@
-<%--
-  ~ Copyright (c) 2018 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-<%@ taglib prefix='fmt' uri='http://java.sun.com/jsp/jstl/fmt'%>
-<jsp:useBean id="startDateObject" class="java.util.Date"/>
-<jsp:useBean id="endDateObject" class="java.util.Date"/>
-<c:set var="timeZone" value="America/Los_Angeles"/>
-
-<html>
-  <%@ include file='header.jsp' %>
-  <link type='text/css' href='/css/show_test_runs_common.css' rel='stylesheet'>
-  <link type='text/css' href='/css/test_results.css' rel='stylesheet'>
-  <link rel='stylesheet' href='/css/search_header.css'>
-  <script type='text/javascript'>
-      $(document).ready(function() {
-
-          $.deparam = $.deparam || function(uri){
-              if(uri === undefined){
-                  uri = window.location.search;
-              }
-              var queryString = {};
-              uri.replace(
-                  new RegExp(
-                      "([^?=&]+)(=([^&#]*))?", "g"),
-                  function($0, $1, $2, $3) { queryString[$1] = $3; }
-              );
-              return queryString;
-          };
-
-          $("li.tab").each(function( index ) {
-              $(this).click(function() {
-                  window.open($(this).children().attr("href"), '_self');
-              });
-          });
-
-          $(".search-icon-wrapper").click(function() {
-              $(".search-wrapper").slideToggle("fast", function() {
-                  // Animation complete.
-              });
-          });
-
-          <c:if test="${not empty branch or not empty hostName or not empty buildId or not empty deviceName}">
-          $(".search-wrapper").slideToggle("fast");
-          </c:if>
-
-          $("#searchBtn").click(function(event) {
-              event.preventDefault();
-
-              var url = '<c:out value="${requestScope['javax.servlet.forward.servlet_path']}" escapeXml="false"></c:out>';
-              var params = $.deparam('<c:out value="${requestScope['javax.servlet.forward.query_string']}" escapeXml="false"></c:out>');
-
-              var branch = $("#deviceBranch").val().trim();
-              if (  branch.length > 0 ) {
-                  params['branch'] = branch;
-              } else {
-                  delete params['branch'];
-              }
-              var host = $("#host").val().trim();
-              if ( host.length > 0 ) {
-                  params['hostName'] = host;
-              } else {
-                  delete params['hostName'];
-              }
-              var buildId = $("#deviceBuildId").val().trim();
-              if ( buildId.length > 0 ) {
-                  params['buildId'] = buildId;
-              } else {
-                  delete params['buildId'];
-              }
-              var deviceName = $("#deviceName").val().trim();
-              if ( deviceName.length > 0 ) {
-                params['deviceName'] = deviceName;
-              } else {
-                delete params['deviceName'];
-              }
-
-              $(location).prop('href', url + "?" + decodeURIComponent($.param(params)));
-              $(this).prop('href', url);
-          });
-
-          $("#deviceBranch").autocomplete({
-              source: [ "c++", "java", "php", "coldfusion", "javascript", "asp", "ruby" ],
-              open: function( event, ui ) {
-                  alert("open")
-              },
-              close: function( event, ui ) {
-                  alert("close")
-              }
-          });
-
-          $( "div.test-case-container > div.input-field > a.btn" ).each(function() {
-              $( this ).click(function() {
-                $(this).parent().prev().children().select();
-                document.execCommand('copy');
-                alert("Reproduce Command copied to clipboard.");
-              });
-          });
-      });
-  </script>
-  <body>
-    <div class='wide container'>
-
-        <div class="row card search-bar expanded">
-            <div class="header-wrapper">
-                <h5 class="section-header">
-                    <b>Plan: </b><span><c:out value="${plan}"></c:out></span>
-                </h5>
-                <div class="search-icon-wrapper">
-                    <i class="material-icons">search</i>
-                </div>
-            </div>
-            <div class="search-wrapper" style="display: none">
-                <div class="col s12">
-                    <div class="input-field col s4">
-                        <input id="deviceBranch" type="text" value="<c:out value="${branch}"></c:out>" autocomplete="off" />
-                        <label>Device Branch</label>
-                    </div>
-                    <div class="input-field col s4">
-                        <input id="host" type="text" value="<c:out value="${hostName}"></c:out>" autocomplete="off" />
-                        <label>Host</label>
-                    </div>
-                    <div class="input-field col s4">
-                        <input id="deviceBuildId" type="text" value="<c:out value="${buildId}"></c:out>" autocomplete="off" />
-                        <label>Device Build ID</label>
-                    </div>
-                </div>
-                <div class="col s12">
-                    <div class="input-field col s4">
-                        <input id="deviceName" type="text" value="<c:out value="${deviceName}"></c:out>" autocomplete="off" />
-                        <label>Device Name</label>
-                    </div>
-                    <div class="input-field col s4">
-
-                    </div>
-                    <div class="run-type-wrapper col s4 right-align">
-                        <a class="waves-effect waves-light btn" id="searchBtn">
-                            <i class="material-icons left">search</i>Apply
-                        </a>
-                    </div>
-                </div>
-            </div>
-        </div>
-
-        <div class='row'>
-            <div class='col s12'>
-
-                <ul class="tabs z-depth-1">
-                    <li class="tab col s4" id="totTabLink">
-                        <a class="<c:out value="${testCategoryType == '1' ? 'active' : 'inactive'}"></c:out>" href="${requestScope['javax.servlet.forward.servlet_path']}?plan=${plan}&type=${testType}&testCategoryType=1">TOT</a>
-                    </li>
-                    <li class="tab col s4" id="signedTabLink">
-                        <a class="<c:out value="${testCategoryType == '4' ? 'active' : 'inactive'}"></c:out>" href="${requestScope['javax.servlet.forward.servlet_path']}?plan=${plan}&type=${testType}&testCategoryType=4">SIGNED</a>
-                    </li>
-                    <li class="tab col s4" id="otaTabLink">
-                        <a class="<c:out value="${testCategoryType == '2' ? 'active' : 'inactive'}"></c:out>" href="${requestScope['javax.servlet.forward.servlet_path']}?plan=${plan}&type=${testType}&testCategoryType=2">OTA</a>
-                    </li>
-                </ul>
-
-            </div>
-        </div>
-
-      <div class='row' id='test-suite-green-release-container'>
-        <div class="col s12">
-
-            <ul class="collapsible popout test-runs">
-                <c:forEach var="testSuiteResultEntity" items="${testSuiteResultEntityPagination.list}">
-                    <li class="test-run-container">
-                    <div class="collapsible-header test-run">
-                        <div class="row" style="margin-bottom: 0px; line-height: 30px;">
-                            <div class="col s9">
-                                <b><c:out value="${testSuiteResultEntity.branch}"></c:out>/<c:out value="${testSuiteResultEntity.target}"></c:out> (<c:out value="${testSuiteResultEntity.buildId}"></c:out>)</b>
-                            </div>
-                            <div class="col s3">
-                                <span class="indicator right center
-                                <c:choose>
-                                    <c:when test="${testSuiteResultEntity.passedTestCaseCount eq 0 and testSuiteResultEntity.failedTestCaseCount eq 0}">
-                                        black
-                                    </c:when>
-                                    <c:otherwise>
-                                        green
-                                    </c:otherwise>
-                                </c:choose>
-                                ">
-                                    <c:out value="${testSuiteResultEntity.passedTestCaseCount}"></c:out>/<c:out value="${testSuiteResultEntity.passedTestCaseCount + testSuiteResultEntity.failedTestCaseCount}"></c:out>
-                                    (
-                                    <c:set var="integerVal" value="${fn:substringBefore(testSuiteResultEntity.passedTestCaseRatio, '.')}" />
-                                    <c:choose>
-                                        <c:when test="${integerVal eq '100'}">
-                                            100%
-                                        </c:when>
-                                        <c:otherwise>
-                                            <c:set var="decimalVal" value="${fn:substring(fn:substringAfter(testSuiteResultEntity.passedTestCaseRatio, '.'), 0, 2)}" />
-                                            <c:choose>
-                                                <c:when test="${decimalVal eq '00'}">
-                                                    <c:out value="${integerVal}"></c:out>%
-                                                </c:when>
-                                                <c:otherwise>
-                                                    <c:out value="${integerVal}"></c:out>.<c:out value="${decimalVal}"></c:out>%
-                                                </c:otherwise>
-                                            </c:choose>
-                                        </c:otherwise>
-                                    </c:choose>
-                                    )
-                                </span>
-                                <c:if test="${!testSuiteResultEntity.bootSuccess}">
-                                <span class="indicator right center" style="min-width: 0px; padding: 0 2px;"></span>
-                                <span class="indicator right center red">Boot Error</span>
-                                </c:if>
-                            </div>
-                            <div class="col s5">
-                                <span class="suite-test-run-metadata">
-                                    <b>Suite Build Number: </b><c:out value="${testSuiteResultEntity.suiteBuildNumber}"></c:out><br>
-                                    <b>Device Name: </b><c:out value="${testSuiteResultEntity.deviceName}"></c:out><br>
-                                </span>
-                            </div>
-                            <div class="col s5">
-                                <span class="suite-test-run-metadata">
-                                    <b>Host: </b><c:out value="${testSuiteResultEntity.hostName}"></c:out><br>
-                                    <b>Modules: </b><c:out value="${testSuiteResultEntity.modulesDone}"></c:out>/<c:out value="${testSuiteResultEntity.modulesTotal}"></c:out><br>
-                                </span>
-                            </div>
-                            <div class="col s2" style="padding: 5px 12px;">
-                                <a href="<c:out value="${testSuiteResultEntity.buganizerLink}"></c:out>" class="waves-effect waves-light btn right blue-grey" style="padding: 0 15px;" target="_blank">
-                                    Buganizer
-                                </a>
-                            </div>
-                            <div class="col s12">
-                                <span class="suite-test-run-metadata">
-                                    <b>Result Log Path: </b>
-                                    <a href="show_gcs_log?path=${testSuiteResultEntity.screenResultLogPath}">
-                                        <c:out value="${testSuiteResultEntity.screenResultLogPath}"></c:out>
-                                    </a>
-                                    <br>
-                                    <b>Infra Log Path: </b>
-                                    <a href="show_gcs_log/download?file=${testSuiteResultEntity.screenInfraLogPath}">
-                                        <c:out value="${testSuiteResultEntity.screenInfraLogPath}"></c:out>
-                                    </a>
-                                    <br>
-                                </span>
-                            </div>
-                            <div class="col s10">
-                                <span style="font-size: 13px;">
-                                <jsp:setProperty name="startDateObject" property="time" value="${testSuiteResultEntity.startTime}"/>
-                                <jsp:setProperty name="endDateObject" property="time" value="${testSuiteResultEntity.endTime}"/>
-                                <fmt:formatDate value="${startDateObject}" pattern="yyyy-MM-dd HH:mm:ss" timeZone="${timeZone}" /> - <fmt:formatDate value="${endDateObject}" pattern="yyyy-MM-dd HH:mm:ss z" timeZone="${timeZone}" />
-                                <c:set var="executionTime" scope="page" value="${(testSuiteResultEntity.endTime - testSuiteResultEntity.startTime) / 1000}"/>
-                                (<c:out value="${executionTime}"></c:out>s)
-                                </span>
-                            </div>
-                            <div class="col s2">
-                                <i class="material-icons expand-arrow">expand_more</i>
-                            </div>
-                        </div>
-                    </div>
-                        <div class="collapsible-body test-results row" style="display: none;">
-                            <div class="col test-col grey lighten-5 s12 left-most right-most">
-                                <h5 class="test-result-label white" style="text-transform: capitalize;">
-                                    Vendor Fingerprint
-                                </h5>
-                                <div class="test-case-container">
-                                    <c:out value="${testSuiteResultEntity.buildVendorFingerprint}"></c:out>
-                                </div>
-                            </div>
-                            <div class="col test-col grey lighten-5 s12 left-most right-most">
-                                <h5 class="test-result-label white" style="text-transform: capitalize;">
-                                    System Fingerprint
-                                </h5>
-                                <div class="test-case-container">
-                                    <c:out value="${testSuiteResultEntity.buildSystemFingerprint}"></c:out>
-                                </div>
-                            </div>
-                            <div class="col test-col grey lighten-5 s12 left-most right-most">
-                                <h5 class="test-result-label white" style="text-transform: capitalize;">
-                                    Reproduce Command
-                                </h5>
-                                <div class="row test-case-container">
-                                    <div class="input-field col s9">
-                                        <input type="text" class="validate" readonly="true" onclick="this.select()" value="reproduce --report_path=gs://vts-report/<c:out value="${testSuiteResultEntity.getTestSuiteFileEntityKey().getName()}"></c:out> --suite=<c:out value="${fn:toLowerCase(testSuiteResultEntity.getSuiteName())}"></c:out>" />
-                                    </div>
-                                    <div class="input-field col s3">
-                                        <a class="waves-effect waves-light btn right"><i class="material-icons left">content_copy</i>Copy</a>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </li>
-                </c:forEach>
-            </ul>
-
-        </div>
-      </div>
-
-      <div class="row">
-          <c:set var="searchQueryString" value="" />
-          <c:if test="${not empty branch}">
-              <c:set var="searchQueryString" value="${searchQueryString}&branch=${branch}" />
-          </c:if>
-          <c:if test="${not empty hostName}">
-              <c:set var="searchQueryString" value="${searchQueryString}&hostName=${hostName}" />
-          </c:if>
-          <c:if test="${not empty buildId}">
-              <c:set var="searchQueryString" value="${searchQueryString}&buildId=${buildId}" />
-          </c:if>
-          <c:if test="${not empty deviceName}">
-              <c:set var="searchQueryString" value="${searchQueryString}&deviceName=${deviceName}" />
-          </c:if>
-        <div class="col s12 center-align">
-          <ul class="pagination">
-            <c:choose>
-                <c:when test="${testSuiteResultEntityPagination.minPageRange gt testSuiteResultEntityPagination.pageSize}">
-                    <li class="waves-effect">
-                        <a href="${requestScope['javax.servlet.forward.servlet_path']}?plan=${plan}&type=${testType}&testCategoryType=${testCategoryType}&page=${testSuiteResultEntityPagination.minPageRange - 1}&nextPageToken=${testSuiteResultEntityPagination.previousPageCountToken}${searchQueryString}">
-                            <i class="material-icons">chevron_left</i>
-                        </a>
-                    </li>
-                </c:when>
-                <c:otherwise>
-
-                </c:otherwise>
-            </c:choose>
-            <c:forEach var="pageLoop" begin="${testSuiteResultEntityPagination.minPageRange}" end="${testSuiteResultEntityPagination.maxPageRange}">
-              <li class="waves-effect<c:if test="${pageLoop eq page}"> active</c:if>">
-                  <a href="${requestScope['javax.servlet.forward.servlet_path']}?plan=${plan}&type=${testType}&testCategoryType=${testCategoryType}&page=${pageLoop}<c:if test="${testSuiteResultEntityPagination.currentPageCountToken ne ''}">&nextPageToken=${testSuiteResultEntityPagination.currentPageCountToken}</c:if>${searchQueryString}">
-                      <c:out value="${pageLoop}" />
-                  </a>
-              </li>
-            </c:forEach>
-            <c:choose>
-                <c:when test="${testSuiteResultEntityPagination.maxPages gt testSuiteResultEntityPagination.pageSize}">
-                    <li class="waves-effect">
-                        <a href="${requestScope['javax.servlet.forward.servlet_path']}?plan=${plan}&type=${testType}&testCategoryType=${testCategoryType}&page=${testSuiteResultEntityPagination.maxPageRange + 1}&nextPageToken=${testSuiteResultEntityPagination.nextPageCountToken}${searchQueryString}">
-                            <i class="material-icons">chevron_right</i>
-                        </a>
-                    </li>
-                </c:when>
-                <c:otherwise>
-
-                </c:otherwise>
-            </c:choose>
-          </ul>
-        </div>
-      </div>
-
-    </div>
-    <%@ include file='footer.jsp' %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_table.jsp b/src/main/webapp/WEB-INF/jsp/show_table.jsp
deleted file mode 100644
index ec4597c..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_table.jsp
+++ /dev/null
@@ -1,338 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/show_table.css' rel='stylesheet'>
-  <link type='text/css' href='/css/show_test_runs_common.css' rel='stylesheet'>
-  <link type='text/css' href='/css/search_header.css' rel='stylesheet'>
-  <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/search_header.js'></script>
-  <script src='js/time.js'></script>
-  <script type='text/javascript'>
-      google.charts.load('current', {'packages':['table', 'corechart']});
-      google.charts.setOnLoadCallback(drawGridTable);
-      google.charts.setOnLoadCallback(activateLogLinks);
-      google.charts.setOnLoadCallback(drawPieChart);
-      google.charts.setOnLoadCallback(function() {
-          $('.gradient').removeClass('gradient');
-      });
-
-      var search;
-
-      $(document).ready(function() {
-          search = $('#filter-bar').createSearchHeader('Module: ', '${testName}', refresh);
-          search.addFilter('Branch', 'branch', {
-            corpus: ${branches}
-          }, ${branch});
-          search.addFilter('Device', 'device', {
-            corpus: ${devices}
-          }, ${device});
-          search.addFilter('Device Build ID', 'deviceBuildId', {}, ${deviceBuildId});
-          search.addFilter('Test Build ID', 'testBuildId', {}, ${testBuildId});
-          search.addFilter('Host', 'hostname', {}, ${hostname});
-          search.addFilter('Passing Count', 'passing', {
-            validate: 'inequality',
-            width: 's2'
-          }, ${passing});
-          search.addFilter('Non-Passing Count', 'nonpassing', {
-            validate: 'inequality',
-            width: 's2'
-          }, ${nonpassing});
-          search.addRunTypeCheckboxes(${showPresubmit}, ${showPostsubmit});
-          search.display();
-
-          // disable buttons on load
-          if (!${hasNewer}) {
-              $('#newer-button').toggleClass('disabled');
-          }
-          if (!${hasOlder}) {
-              $('#older-button').toggleClass('disabled');
-          }
-          $('#treeLink').click(function() {
-              window.open('/show_tree?testName=${testName}&treeDefault=true', '_self');
-          });
-          $('#newer-button').click(prev);
-          $('#older-button').click(next);
-      });
-
-      // Actives the log links to display the log info modal when clicked.
-      function activateLogLinks() {
-          $('.info-btn').click(function(e) {
-              showLog(${logInfoMap}[$(this).data('col')]);
-          });
-      }
-
-      /** Displays a modal window with the specified log entries.
-       *
-       * @param logEntries Array of string arrays. Each entry in the outer array
-       *                   must contain (1) name string, and (2) url string.
-       */
-      function showLog(logEntries) {
-          if (!logEntries || logEntries.length == 0) return;
-
-          var logList = $('<ul class="collection"></ul>');
-          var entries = logEntries.reduce(function(acc, entry) {
-              if (!entry || entry.length == 0) return acc;
-              var link = '<a href="' + entry[1] + '"';
-              link += 'class="collection-item">' + entry[0] + '</li>';
-              return acc + link;
-          }, '');
-          logList.html(entries);
-          var infoContainer = $('#info-modal>.modal-content>.info-container');
-          infoContainer.empty();
-          logList.appendTo(infoContainer);
-          var modal = $('#info-modal');
-          modal.modal();
-          modal.modal('open');
-      }
-
-      // refresh the page to see the selected test types (pre-/post-submit)
-      function refresh() {
-          if($(this).hasClass('disabled')) return;
-          var link = '${pageContext.request.contextPath}' +
-              '/show_table?testName=${testName}' + search.args();
-          if (${unfiltered}) {
-              link += '&unfiltered=';
-          }
-          window.open(link,'_self');
-      }
-
-      // view older data
-      function next() {
-          if($(this).hasClass('disabled')) return;
-          var endTime = ${startTime};
-          var link = '${pageContext.request.contextPath}' +
-              '/show_table?testName=${testName}&endTime=' + endTime +
-              search.args();
-          if (${unfiltered}) {
-              link += '&unfiltered=';
-          }
-          window.open(link,'_self');
-      }
-
-      // view newer data
-      function prev() {
-          if($(this).hasClass('disabled')) return;
-          var startTime = ${endTime};
-          var link = '${pageContext.request.contextPath}' +
-              '/show_table?testName=${testName}&startTime=' + startTime +
-              search.args();
-          if (${unfiltered}) {
-              link += '&unfiltered=';
-          }
-          window.open(link,'_self');
-        }
-
-      // to draw pie chart
-      function drawPieChart() {
-          var topBuildResultCounts = ${topBuildResultCounts};
-          if (topBuildResultCounts.length < 1) {
-              return;
-          }
-          var resultNames = ${resultNamesJson};
-          var rows = resultNames.map(function(res, i) {
-              nickname = res.replace('TEST_CASE_RESULT_', '').replace('_', ' ')
-                         .trim().toLowerCase();
-              return [nickname, parseInt(topBuildResultCounts[i])];
-          });
-          rows.unshift(['Result', 'Count']);
-
-          // Get CSS color definitions (or default to white)
-          var colors = resultNames.map(function(res) {
-              return $('.' + res).css('background-color') || 'white';
-          });
-
-          var data = google.visualization.arrayToDataTable(rows);
-          var options = {
-              is3D: false,
-              colors: colors,
-              fontName: 'Roboto',
-              fontSize: '14px',
-              legend: {position: 'bottom'},
-              tooltip: {showColorCode: true, ignoreBounds: false},
-              chartArea: {height: '80%', width: '90%'},
-              pieHole: 0.4
-          };
-
-          var chart = new google.visualization.PieChart(document.getElementById('pie-chart-div'));
-          chart.draw(data, options);
-      }
-
-      // table for grid data
-      function drawGridTable() {
-          var data = new google.visualization.DataTable();
-
-          // Add column headers.
-          headerRow = ${headerRow};
-          headerRow.forEach(function(d, i) {
-              var classNames = 'table-header-content';
-              if (i == 0) classNames += ' table-header-legend';
-              data.addColumn('string', '<span class="' + classNames + '">' +
-                             d + '</span>');
-          });
-
-          var timeGrid = ${timeGrid};
-          var durationGrid = ${durationGrid};
-          var summaryGrid = ${summaryGrid};
-          var resultsGrid = ${resultsGrid};
-
-          // Format time grid to a formatted date
-          timeGrid = timeGrid.map(function(row) {
-              return row.map(function(cell, j) {
-                  if (j == 0) return cell;
-                  return moment().renderTime(cell);
-              });
-          });
-
-          // Format duration grid to HH:mm:ss.SSS
-          durationGrid = durationGrid.map(function(row) {
-              return row.map(function(cell, j) {
-                  if (j == 0) return cell;
-                  return moment().renderDuration(cell);
-              });
-          });
-
-          // add rows to the data.
-          data.addRows(timeGrid);
-          data.addRows(durationGrid);
-          data.addRows(summaryGrid);
-          data.addRows(resultsGrid);
-
-          var table = new google.visualization.Table(document.getElementById('grid-table-div'));
-          var classNames = {
-              headerRow : 'table-header',
-              headerCell : 'table-header-cell'
-          };
-          var options = {
-              showRowNumber: false,
-              alternatingRowStyle: true,
-              allowHtml: true,
-              frozenColumns: 1,
-              cssClassNames: classNames,
-              sort: 'disable'
-          };
-          table.draw(data, options);
-      }
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div class='row'>
-        <div class='col s12'>
-          <div class='card'>
-            <ul class='tabs'>
-              <li class='tab col s6' id='treeLink'><a>Tree</a></li>
-              <li class='tab col s6'><a class='active'>Table</a></li>
-            </ul>
-          </div>
-          <div id='filter-bar'></div>
-        </div>
-        <div class='col s7'>
-          <div class='col s12 card center-align'>
-            <div id='legend-wrapper'>
-              <c:forEach items='${resultNames}' var='res'>
-                <div class='center-align legend-entry'>
-                  <c:set var='trimmed' value='${fn:replace(res, "TEST_CASE_RESULT_", "")}'/>
-                  <c:set var='nickname' value='${fn:replace(trimmed, "_", " ")}'/>
-                  <label for='${res}'>${nickname}</label>
-                  <div id='${res}' class='${res} legend-bubble'></div>
-                </div>
-              </c:forEach>
-            </div>
-          </div>
-          <div id='profiling-container' class='col s12'>
-            <c:choose>
-              <c:when test='${empty profilingPointNames}'>
-                <div id='error-div' class='center-align card'><h5>${error}</h5></div>
-              </c:when>
-              <c:otherwise>
-                <ul id='profiling-body' class='collapsible' data-collapsible='accordion'>
-                  <li>
-                    <div class='collapsible-header'><i class='material-icons'>timeline</i>Profiling Graphs</div>
-                    <div class='collapsible-body'>
-                      <ul id='profiling-list' class='collection'>
-                        <c:forEach items='${profilingPointNames}' var='pt'>
-                          <c:set var='profPointArgs' value='testName=${testName}&profilingPoint=${pt}'/>
-                          <c:set var='timeArgs' value='endTime=${endTime}'/>
-                          <a href='/show_graph?${profPointArgs}&${timeArgs}'
-                             class='collection-item profiling-point-name'>${pt}
-                          </a>
-                        </c:forEach>
-                      </ul>
-                    </div>
-                  </li>
-                  <li>
-                    <a class='collapsible-link' href='/show_performance_digest?testName=${testName}'>
-                      <div class='collapsible-header'><i class='material-icons'>toc</i>Performance Digest</div>
-                    </a>
-                  </li>
-                </ul>
-              </c:otherwise>
-            </c:choose>
-          </div>
-        </div>
-        <div class='col s5 valign-wrapper'>
-          <!-- pie chart -->
-          <div id='pie-chart-wrapper' class='col s12 valign center-align card'>
-            <h6 class='pie-chart-title'>Test Status for Device Build ID: ${topBuildId}</h6>
-            <div id='pie-chart-div'></div>
-          </div>
-        </div>
-      </div>
-
-      <div class='col s12'>
-        <div id='chart-holder' class='col s12 card'>
-          <!-- Grid tables-->
-          <div id='grid-table-div'></div>
-        </div>
-      </div>
-      <div id='newer-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='newer-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_left</i>
-        </a>
-      </div>
-      <div id='older-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='older-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_right</i>
-        </a>
-      </div>
-    </div>
-    <div id="help-modal" class="modal">
-      <div class="modal-content">
-        <h4>${searchHelpHeader}</h4>
-        <p>${searchHelpBody}</p>
-      </div>
-      <div class="modal-footer">
-        <a href="#!" class="modal-action modal-close waves-effect btn-flat">Close</a>
-      </div>
-    </div>
-    <div id="info-modal" class="modal">
-      <div class="modal-content">
-        <h4>Logs</h4>
-        <div class="info-container"></div>
-      </div>
-      <div class="modal-footer">
-        <a href="#!" class="modal-action modal-close waves-effect btn-flat">Close</a>
-      </div>
-    </div>
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_test_acknowledgments.jsp b/src/main/webapp/WEB-INF/jsp/show_test_acknowledgments.jsp
deleted file mode 100644
index 84ece88..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_test_acknowledgments.jsp
+++ /dev/null
@@ -1,52 +0,0 @@
-<%--
-  ~ Copyright (c) 2017 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <link rel='stylesheet' href='/css/show_test_acknowledgments.css'>
-  <link rel='stylesheet' href='/css/test_acknowledgments.css'>
-  <%@ include file='header.jsp' %>
-  <script src='js/test_acknowledgments.js'></script>
-  <script>
-    $(document).ready(function() {
-      $('#favoritesLink').click(function() {
-        window.open('/', '_self');
-      });
-      $('#allLink').click(function() {
-        window.open('/?showAll=true', '_self');
-      });
-      var acks = $('#acknowledgments').testAcknowledgments(
-        ${allTests}, ${branches}, ${devices}, ${testAcknowledgments}, ${readOnly});
-    });
-  </script>
-  <body>
-    <div class='container wide'>
-      <div class='row home-tabs-row'>
-        <div class='col s12'>
-          <ul class='tabs'>
-            <li class='tab col s4' id='favoritesLink'><a>Favorites</a></li>
-            <li class='tab col s4' id='allLink'><a>All Tests</a></li>
-            <li class='tab col s4'><a class='active'>Test Acknowledgements</a></li>
-          </ul>
-        </div>
-      </div>
-      <div class='row' id='acknowledgments'></div>
-    </div>
-    <%@ include file='footer.jsp' %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/jsp/show_tree.jsp b/src/main/webapp/WEB-INF/jsp/show_tree.jsp
deleted file mode 100644
index aa9b311..0000000
--- a/src/main/webapp/WEB-INF/jsp/show_tree.jsp
+++ /dev/null
@@ -1,323 +0,0 @@
-<%--
-  ~ Copyright (c) 2016 Google Inc. All Rights Reserved.
-  ~
-  ~ 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.
-  --%>
-<%@ page contentType='text/html;charset=UTF-8' language='java' %>
-<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %>
-<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%>
-
-<html>
-  <%@ include file="header.jsp" %>
-  <link type='text/css' href='/css/show_test_runs_common.css' rel='stylesheet'>
-  <link type='text/css' href='/css/test_results.css' rel='stylesheet'>
-  <link rel='stylesheet' href='/css/search_header.css'>
-  <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>
-  <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script>
-  <script src='js/search_header.js'></script>
-  <script src='js/time.js'></script>
-  <script src='js/test_results.js'></script>
-  <script type='text/javascript'>
-      google.charts.load('current', {'packages':['table', 'corechart']});
-      google.charts.setOnLoadCallback(drawPieChart);
-
-      var search;
-
-      $(document).ready(function() {
-          search = $('#filter-bar').createSearchHeader('Module: ', '${testName}', refresh);
-          search.addFilter('Branch', 'branch', {
-            corpus: ${branches}
-          }, ${branch});
-          search.addFilter('Device', 'device', {
-            corpus: ${devices}
-          }, ${device});
-          search.addFilter('Device Build ID', 'deviceBuildId', {}, ${deviceBuildId});
-          search.addFilter('Test Build ID', 'testBuildId', {}, ${testBuildId});
-          search.addFilter('Host', 'hostname', {}, ${hostname});
-          search.addFilter('Passing Count', 'passing', {
-            validate: 'inequality',
-            width: 's2'
-          }, ${passing});
-          search.addFilter('Non-Passing Count', 'nonpassing', {
-            validate: 'inequality',
-            width: 's2'
-          }, ${nonpassing});
-          search.addRunTypeCheckboxes(${showPresubmit}, ${showPostsubmit});
-          search.display();
-
-          // disable buttons on load
-          if (!${hasNewer}) {
-              $('#newer-button').toggleClass('disabled');
-          }
-          if (!${hasOlder}) {
-              $('#older-button').toggleClass('disabled');
-          }
-          $('#tableLink').click(function() {
-              window.open('/show_table?testName=${testName}&treeDefault=false', '_self');
-          });
-          $('#newer-button').click(prev);
-          $('#older-button').click(next);
-          $('#test-results-container').showTests(${testRuns});
-
-          $('#apiCoverageModal').modal({
-                  width: '75%',
-                  dismissible: true, // Modal can be dismissed by clicking outside of the modal
-                  opacity: .5, // Opacity of modal background
-                  inDuration: 300, // Transition in duration
-                  outDuration: 200, // Transition out duration
-                  startingTop: '4%', // Starting top style attribute
-                  endingTop: '10%', // Ending top style attribute
-                  ready: function(modal, trigger) { // Callback for Modal open. Modal and trigger parameters available.
-                      var urlSafeKeyList = modal.data('urlSafeKeyList');
-                      var halApiInfoList = [];
-                      var getAjaxList = $.map( urlSafeKeyList, function( urlSafeKey ) {
-                          return $.get( "/api/coverage/api/data?key=" + urlSafeKey, function(data) {
-                                  halApiInfoList.push(data);
-                              })
-                              .fail(function() {
-                                  alert( "Error : can't bring API coverage data from the server" );
-                              });
-                      });
-
-                      $.when.apply($, getAjaxList).then(function() {
-                          $.each(halApiInfoList, function( index, data ) {
-                              $("#halApiList").append(halApiListTemplate());
-                              var version = data.halMajorVersion + '.' + data.halMinorVersion;
-                              var defaultInfo = data.halPackageName + '@' + version + '::' + data.halInterfaceName;
-                              $("#halApiList > li:last > div.collapsible-header").html(
-                                  '<i class="material-icons">report</i> HAL API Information : ' + defaultInfo
-                              );
-
-                              $("#halApiList > li:last > div.collapsible-body > ul.collection.with-header").append(
-                                  $.map( data.halApi, function( apiName, idx ) {
-                                      var colorClass = data.coveredHalApi.indexOf(apiName) > -1 ? "green" : "red"
-                                      return '<li class="collection-item ' + colorClass + ' lighten-1">' + apiName + '</li>';
-                                  }).join("")
-                              );
-                              $("#halApiList").collapsible('open', index);
-                          });
-                          $('#dataTableLoading').hide("slow");
-                      });
-                  },
-                  complete: function() {
-                      $("#halApiList").empty();
-                      $('#dataTableLoading').show("slow");
-                  } // Callback for Modal close
-              }
-          );
-      });
-
-      function halApiListTemplate() {
-          return '<li>' +
-              '<div class="collapsible-header">' +
-              '<i class="material-icons">report</i> API Information' +
-              '</div>' +
-              '<div class="collapsible-body">' +
-              '<ul class="collection with-header">' +
-              '</ul>' +
-              '</div>' +
-              '</li>';
-      }
-
-      // refresh the page to see the selected test types (pre-/post-submit)
-      function refresh() {
-          if($(this).hasClass('disabled')) return;
-          var link = '${pageContext.request.contextPath}' +
-              '/show_tree?testName=${testName}' + search.args();
-          if (${unfiltered}) {
-            link += '&unfiltered=';
-          }
-          window.open(link,'_self');
-      }
-
-      // view older data
-      function next() {
-          if($(this).hasClass('disabled')) return;
-          var endTime = ${startTime};
-          var link = '${pageContext.request.contextPath}' +
-              '/show_tree?testName=${testName}&endTime=' + endTime +
-              search.args();
-          if (${unfiltered}) {
-              link += '&unfiltered=';
-          }
-          window.open(link,'_self');
-      }
-
-      // view newer data
-      function prev() {
-          if($(this).hasClass('disabled')) return;
-          var startTime = ${endTime};
-          var link = '${pageContext.request.contextPath}' +
-              '/show_tree?testName=${testName}&startTime=' + startTime +
-              search.args();
-          if (${unfiltered}) {
-              link += '&unfiltered=';
-          }
-          window.open(link,'_self');
-        }
-
-      // to draw pie chart
-      function drawPieChart() {
-          var topBuildResultCounts = ${topBuildResultCounts};
-          if (topBuildResultCounts.length < 1) {
-              return;
-          }
-          var resultNames = ${resultNamesJson};
-          var rows = resultNames.map(function(res, i) {
-              nickname = res.replace('TEST_CASE_RESULT_', '').replace('_', ' ')
-                         .trim().toLowerCase();
-              return [nickname, parseInt(topBuildResultCounts[i])];
-          });
-          rows.unshift(['Result', 'Count']);
-
-          // Get CSS color definitions (or default to white)
-          var colors = resultNames.map(function(res) {
-              return $('.' + res).css('background-color') || 'white';
-          });
-
-          var data = google.visualization.arrayToDataTable(rows);
-          var options = {
-              is3D: false,
-              colors: colors,
-              fontName: 'Roboto',
-              fontSize: '14px',
-              legend: {position: 'bottom'},
-              tooltip: {showColorCode: true, ignoreBounds: false},
-              chartArea: {height: '80%', width: '90%'},
-              pieHole: 0.4
-          };
-
-          var chart = new google.visualization.PieChart(document.getElementById('pie-chart-div'));
-          chart.draw(data, options);
-      }
-  </script>
-
-  <body>
-    <div class='wide container'>
-      <div class='row'>
-        <div class='col s12'>
-          <div class='card'>
-            <ul class='tabs'>
-              <li class='tab col s6'><a class='active'>Tree</a></li>
-              <li class='tab col s6' id='tableLink'><a>Table</a></li>
-            </ul>
-          </div>
-          <div id='filter-bar'></div>
-        </div>
-        <div class='col s7'>
-          <div class='col s12 card center-align'>
-            <div id='legend-wrapper'>
-              <c:forEach items='${resultNames}' var='res'>
-                <div class='center-align legend-entry'>
-                  <c:set var='trimmed' value='${fn:replace(res, "TEST_CASE_RESULT_", "")}'/>
-                  <c:set var='nickname' value='${fn:replace(trimmed, "_", " ")}'/>
-                  <label for='${res}'>${nickname}</label>
-                  <div id='${res}' class='${res} legend-bubble'></div>
-                </div>
-              </c:forEach>
-            </div>
-          </div>
-          <div id='profiling-container' class='col s12'>
-            <c:choose>
-              <c:when test='${empty profilingPointNames}'>
-                <div id='error-div' class='center-align card'><h5>${error}</h5></div>
-              </c:when>
-              <c:otherwise>
-                <ul id='profiling-body' class='collapsible' data-collapsible='accordion'>
-                  <li>
-                    <div class='collapsible-header'><i class='material-icons'>timeline</i>Profiling Graphs</div>
-                    <div class='collapsible-body'>
-                      <ul id='profiling-list' class='collection'>
-                        <c:forEach items='${profilingPointNames}' var='pt'>
-                          <c:set var='profPointArgs' value='testName=${testName}&profilingPoint=${pt}'/>
-                          <c:set var='timeArgs' value='endTime=${endTime}'/>
-                          <a href='/show_graph?${profPointArgs}&${timeArgs}'
-                             class='collection-item profiling-point-name'>${pt}
-                          </a>
-                        </c:forEach>
-                      </ul>
-                    </div>
-                  </li>
-                  <li>
-                    <a class='collapsible-link' href='/show_performance_digest?testName=${testName}'>
-                      <div class='collapsible-header'><i class='material-icons'>toc</i>Performance Digest</div>
-                    </a>
-                  </li>
-                </ul>
-              </c:otherwise>
-            </c:choose>
-          </div>
-        </div>
-        <div class='col s5 valign-wrapper'>
-          <!-- pie chart -->
-          <div id='pie-chart-wrapper' class='col s12 valign center-align card'>
-            <h6 class='pie-chart-title'>${topBuildId}</h6>
-            <div id='pie-chart-div'></div>
-          </div>
-        </div>
-      </div>
-
-      <div class='col s12' id='test-results-container'>
-      </div>
-      <div id='newer-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='newer-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_left</i>
-        </a>
-      </div>
-      <div id='older-wrapper' class='page-button-wrapper fixed-action-btn'>
-        <a id='older-button' class='btn-floating btn red waves-effect'>
-          <i class='large material-icons'>keyboard_arrow_right</i>
-        </a>
-      </div>
-    </div>
-
-    <!-- Modal Structure -->
-    <div id="apiCoverageModal" class="modal modal-fixed-footer" style="width: 75%;">
-      <div class="modal-content">
-        <h4 id="coverageModalTitle">API Coverage</h4>
-
-        <div class="preloader-wrapper big active loaders">
-          <div id="dataTableLoading" class="spinner-layer spinner-blue-only">
-            <div class="circle-clipper left">
-              <div class="circle"></div>
-            </div>
-            <div class="gap-patch">
-              <div class="circle"></div>
-            </div>
-            <div class="circle-clipper right">
-              <div class="circle"></div>
-            </div>
-          </div>
-        </div>
-
-        <div class="row">
-          <div class="col s12">
-            <ul class="collection with-header">
-              <li class="collection-header">
-                <h4>Total HAL API List</h4>
-                <ul id="halApiList" class="collapsible popout" data-collapsible="expandable">
-
-                </ul>
-              </li>
-            </ul>
-          </div>
-        </div>
-      </div>
-      <div class="modal-footer">
-        <a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat ">Close</a>
-      </div>
-    </div>
-
-    <%@ include file="footer.jsp" %>
-  </body>
-</html>
diff --git a/src/main/webapp/WEB-INF/queue.xml b/src/main/webapp/WEB-INF/queue.xml
deleted file mode 100644
index 3a116f2..0000000
--- a/src/main/webapp/WEB-INF/queue.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright (C) 2017 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.
--->
-<queue-entries>
-  <queue>
-    <name>profilingStatsQueue</name>
-    <rate>200/s</rate>
-    <bucket-size>40</bucket-size>
-  </queue>
-  <queue>
-    <name>suiteTestQueue</name>
-    <rate>20/s</rate>
-    <bucket-size>40</bucket-size>
-    <max-concurrent-requests>10</max-concurrent-requests>
-  </queue>
-  <queue>
-    <name>coverageApiQueue</name>
-    <rate>20/s</rate>
-    <bucket-size>100</bucket-size>
-    <max-concurrent-requests>10</max-concurrent-requests>
-  </queue>
-</queue-entries>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index a683f48..0000000
--- a/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,363 +0,0 @@
-<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
-<!--
-Copyright 2016 Google Inc. All Rights Reserved.
-
- 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.
--->
-
-<listener>
-    <listener-class>
-        com.android.vts.config.ObjectifyListener
-    </listener-class>
-</listener>
-
-<filter>
-    <filter-name>ObjectifyFilter</filter-name>
-    <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
-</filter>
-<filter-mapping>
-    <filter-name>ObjectifyFilter</filter-name>
-    <url-pattern>/*</url-pattern>
-</filter-mapping>
-
-<servlet>
-  <servlet-name>dashboard_main</servlet-name>
-  <servlet-class>com.android.vts.servlet.DashboardMainServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_release</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowReleaseServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_green_release</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowGreenReleaseServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_coverage_overview</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowCoverageOverviewServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_tree</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowTreeServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_table</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowTableServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_graph</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowGraphServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_profiling_list</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowProfilingListServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_profiling_overview</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowProfilingOverviewServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_plan_release</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowPlanReleaseServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_plan_run</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowPlanRunServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_performance_digest</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowPerformanceDigestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_coverage</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowCoverageServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_test_acknowledgments</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowTestAcknowledgmentServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>show_gcs_log</servlet-name>
-  <servlet-class>com.android.vts.servlet.ShowGcsLogServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>test_data_api</servlet-name>
-  <servlet-class>com.android.vts.api.TestDataForDevServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>datastore_api</servlet-name>
-  <servlet-class>com.android.vts.api.DatastoreRestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>data_api</servlet-name>
-  <servlet-class>com.android.vts.api.DataRestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>coverage_api</servlet-name>
-  <servlet-class>com.android.vts.api.CoverageRestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>test_run_api</servlet-name>
-  <servlet-class>com.android.vts.api.TestRunRestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>favorites_api</servlet-name>
-  <servlet-class>com.android.vts.api.UserFavoriteRestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>test_suite_api</servlet-name>
-  <servlet-class>com.android.vts.api.TestSuiteResultRestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>bigtable_legacy_api</servlet-name>
-  <servlet-class>com.android.vts.api.BigtableLegacyJsonServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>test_acknowledgments</servlet-name>
-  <servlet-class>com.android.vts.api.TestAcknowledgmentRestServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>vts_alert_job</servlet-name>
-  <servlet-class>com.android.vts.job.VtsAlertJobServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>vts_performance_job</servlet-name>
-  <servlet-class>com.android.vts.job.VtsPerformanceJobServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>vts_profiling_stats_job</servlet-name>
-  <servlet-class>com.android.vts.job.VtsProfilingStatsJobServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>vts_coverage_job</servlet-name>
-  <servlet-class>com.android.vts.job.VtsCoverageAlertJobServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>vts_inactivity_job</servlet-name>
-  <servlet-class>com.android.vts.job.VtsInactivityJobServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>vts_spreadsheet_sync_job</servlet-name>
-  <servlet-class>com.android.vts.job.VtsSpreadSheetSyncServlet</servlet-class>
-</servlet>
-
-<servlet>
-  <servlet-name>suite_test_report_gcs_monitor_job</servlet-name>
-  <servlet-class>com.android.vts.job.VtsSuiteTestJobServlet</servlet-class>
-</servlet>
-
-<servlet-mapping>
-  <servlet-name>dashboard_main</servlet-name>
-  <url-pattern>/</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_release</servlet-name>
-  <url-pattern>/show_release/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_green_release</servlet-name>
-  <url-pattern>/show_green_release/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_coverage_overview</servlet-name>
-  <url-pattern>/show_coverage_overview/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_tree</servlet-name>
-  <url-pattern>/show_tree/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_table</servlet-name>
-  <url-pattern>/show_table/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_graph</servlet-name>
-  <url-pattern>/show_graph/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_profiling_list</servlet-name>
-  <url-pattern>/show_profiling_list/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_profiling_overview</servlet-name>
-  <url-pattern>/show_profiling_overview/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_plan_release</servlet-name>
-  <url-pattern>/show_plan_release/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_plan_run</servlet-name>
-  <url-pattern>/show_plan_run/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_performance_digest</servlet-name>
-  <url-pattern>/show_performance_digest/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_coverage</servlet-name>
-  <url-pattern>/show_coverage/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_test_acknowledgments</servlet-name>
-  <url-pattern>/show_test_acknowledgments/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>show_gcs_log</servlet-name>
-  <url-pattern>/show_gcs_log/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>bigtable_legacy_api</servlet-name>
-  <url-pattern>/api/bigtable/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>test_data_api</servlet-name>
-  <url-pattern>/api/test_data/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>datastore_api</servlet-name>
-  <url-pattern>/api/datastore/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>data_api</servlet-name>
-  <url-pattern>/api/data/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>coverage_api</servlet-name>
-  <url-pattern>/api/coverage/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>test_run_api</servlet-name>
-  <url-pattern>/api/test_run/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>favorites_api</servlet-name>
-  <url-pattern>/api/favorites/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>test_acknowledgments</servlet-name>
-  <url-pattern>/api/test_acknowledgments/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>test_suite_api</servlet-name>
-  <url-pattern>/api/test_suite/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>vts_alert_job</servlet-name>
-  <url-pattern>/task/vts_alert_job/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>vts_coverage_job</servlet-name>
-  <url-pattern>/task/vts_coverage_job/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>vts_profiling_stats_job</servlet-name>
-  <url-pattern>/task/vts_profiling_stats_job/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>vts_performance_job</servlet-name>
-  <url-pattern>/cron/vts_performance_job/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>vts_inactivity_job</servlet-name>
-  <url-pattern>/cron/vts_inactivity_job/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>vts_spreadsheet_sync_job</servlet-name>
-  <url-pattern>/cron/vts_spreadsheet_sync_job/*</url-pattern>
-</servlet-mapping>
-
-<servlet-mapping>
-  <servlet-name>suite_test_report_gcs_monitor_job</servlet-name>
-  <url-pattern>/cron/test_suite_report_gcs_monitor/*</url-pattern>
-</servlet-mapping>
-
-<security-constraint>
-  <web-resource-collection>
-    <web-resource-name>tasks</web-resource-name>
-    <url-pattern>/cron/*</url-pattern>
-    <url-pattern>/task/*</url-pattern>
-  </web-resource-collection>
-  <auth-constraint>
-    <role-name>admin</role-name>
-  </auth-constraint>
-</security-constraint>
-
-<security-constraint>
-  <web-resource-collection>
-    <web-resource-name>all</web-resource-name>
-    <url-pattern>/show_*</url-pattern>
-  </web-resource-collection>
-  <auth-constraint>
-    <role-name>*</role-name>
-  </auth-constraint>
-</security-constraint>
-</web-app>
diff --git a/src/main/webapp/css/common.css b/src/main/webapp/css/common.css
deleted file mode 100644
index 3e0a1c9..0000000
--- a/src/main/webapp/css/common.css
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 2017 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.
-*/
-
-@media only screen and (min-width: 993px) {
-    .wide.container {
-        width: 80%;
-        max-width: 1600px;
-        min-height: 80vh;
-    }
-}
-.TEST_CASE_RESULT_PASS {
-    background-color: #7FFF00;
-}
-.TEST_CASE_RESULT_FAIL {
-    background-color: #ff4d4d;
-}
-.TEST_CASE_RESULT_SKIP {
-    background-color: #A8A8A8;
-}
-.TEST_CASE_RESULT_EXCEPTION {
-    background-color: black;
-}
-.TEST_CASE_RESULT_TIMEOUT {
-    background-color: #9900CC;
-}
-.UNKNOWN_RESULT {
-    background-color: white;
-    border: 1px #A8A8A8 solid;
-}
diff --git a/src/main/webapp/css/dashboard_main.css b/src/main/webapp/css/dashboard_main.css
deleted file mode 100644
index e4b4658..0000000
--- a/src/main/webapp/css/dashboard_main.css
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Copyright (C) 2016 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.
-*/
-.row.home-tabs-row {
-    margin-bottom: 50px;
-}
-
-.row.home-tabs-row li.col.tab {
-    cursor: pointer;
-    user-select: none;
-}
-
-#add-button-wrapper {
-    margin-top: 10px;
-    height: 61px;
-}
-
-.btn-container > .btn-flat {
-    margin-top: 8px;
-    user-select: none;
-    color: grey;
-}
-
-.btn-container > .btn-flat.inactive {
-    color: lightgray;
-}
-
-.row .col.card.option {
-    padding: 6px 15px 6px 15px;
-    margin: 5px 0;
-    border-radius: 25px;
-}
-
-#error-container {
-    padding-top: 50px;
-    padding-bottom: 50px;
-}
-
-.entry {
-    font-size: 20px;
-    font-weight: 300;
-    position: relative;
-}
-
-.indicator {
-    color: white;
-    font-size: 12px;
-    font-weight: bold;
-    padding: 1px 6px;
-    right: 0;
-    min-width: 40px;
-    border-radius: 10px;
-    margin-top: 5px;
-}
-
-#show-button {
-    border-radius: 100px;
-}
-
-#show-button-arrow {
-    margin-left: 3px;
-}
-
-#section-header {
-    cursor: default;
-    user-select: none;
-    color: #ee6e73;
-}
-
-#section-header:after {
-    border: 1px solid #ee6e73;
-    margin-top: 10px;
-    margin-bottom: 0;
-    display: block;
-    content: " ";
-}
-
-.ui-menu {
-    overflow-y: auto;
-    z-index: 100;
-    max-height: 50%;
-}
-
-.ui-menu-item {
-    font-size: 16px;
-    padding: 4px 10px;
-    transition: background-color .25s;
-}
-
-.ui-menu-item:hover {
-    background-color: #e0f2f1;
-}
-
-.ui-menu-item:active {
-    background-color: #b2dfdb;
-}
-
-.ui-helper-hidden-accessible {
-    display: none;
-}
diff --git a/src/main/webapp/css/datepicker.css b/src/main/webapp/css/datepicker.css
deleted file mode 100644
index b98dd80..0000000
--- a/src/main/webapp/css/datepicker.css
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 2016 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.
-*/
-.ui-datepicker table {
-    font-family: Roboto !important;
-    font-size: 13px !important;
-    white-space: nowrap !important;
-}
-
-#ui-datepicker-div {
-    font-family: "Roboto", sans-serif;
-    padding: 0;
-}
-
-.ui-corner-all {
-    border-bottom-right-radius: 0 !important;
-    border-bottom-left-radius: 0 !important;
-    border-top-right-radius: 0 !important;
-    border-top-left-radius: 0 !important;
-}
-
-.ui-datepicker td span.ui-state-default, .ui-datepicker td a.ui-state-default {
-    text-align: center;
-    padding: 0.7em 0.4em;
-    border: none;
-    border-radius: 10em;
-    background: none;
-}
-
-.ui-datepicker td span.ui-state-hover, .ui-datepicker td a.ui-state-hover {
-    background: #e0f2f1;
-}
-
-.ui-datepicker td span.ui-state-active, .ui-datepicker td a.ui-state-active {
-    color: white;
-    font-weight: 600;
-    background: #009688;
-}
-
-.ui-datepicker-header.ui-widget-header.ui-helper-clearfix.ui-corner-all {
-    background: #009688;
-    border: none;
-    color: white;
-}
-
-.ui-datepicker-next.ui-state-hover.ui-datepicker-next-hover {
-    right: 2px;
-    top: 2px;
-}
-
-.ui-datepicker-prev.ui-state-hover.ui-datepicker-prev-hover {
-    left: 2px;
-    top: 2px;
-}
-
-.ui-datepicker-next.ui-corner-all.ui-state-hover, .ui-datepicker-prev.ui-corner-all.ui-state-hover {
-    background: none;
-    border: none;
-}
diff --git a/src/main/webapp/css/navbar.css b/src/main/webapp/css/navbar.css
deleted file mode 100644
index cf16f60..0000000
--- a/src/main/webapp/css/navbar.css
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright (C) 2016 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.
-*/
-nav#navbar {
-    margin-bottom: 30px;
-    user-select: none;
-}
-nav#navbar .nav-wrapper {
-    height: auto;
-}
-nav#navbar ul.nav-list {
-    display: inline-block;
-}
-nav#navbar ul li {
-    transition: background-color .3s;
-    float: left;
-    padding: 0;
-}
-nav#navbar ul li.active {
-    background-color: rgba(0,0,0,0.1);
-}
-nav#navbar ul li a:hover, nav#navbar ul li.active {
-    background-color: #ea454b;
-}
-nav#navbar ul a.nav-list-item {
-    font-size: 1.2rem;
-}
-nav#navbar #nav-sublist {
-    line-height: 35px;
-    background: white;
-    padding-left: 15px;
-    width: 100%;
-    display: inline-block;
-    position: relative;
-}
-nav#navbar #nav-sublist .breadcrumb.nav-sublist-item {
-    font-size: 15px;
-    font-weight: 400;
-    color: rgba(238, 110, 115, 0.85);
-    line-height: 35px;
-}
-nav#navbar #nav-sublist .breadcrumb.nav-sublist-item:last-child {
-    color: rgb(238, 110, 115);
-    font-weight: 500;
-}
-nav#navbar #nav-sublist .breadcrumb.nav-sublist-item::before {
-    font-size: 22px;
-    color: rgba(238, 110, 115, 0.85);
-    line-height: 35px;
-    margin: 0 5px;
-}
-nav#navbar #dropdown-button {
-    font-style: italic;
-    color: rgba(255, 255, 255, 0.75);
-    margin-left: 0;
-    margin-top: 0;
-}
diff --git a/src/main/webapp/css/plan_runs.css b/src/main/webapp/css/plan_runs.css
deleted file mode 100644
index b84a656..0000000
--- a/src/main/webapp/css/plan_runs.css
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Copyright (C) 2017 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.
-*/
-.release-entry {
-    border-radius: 5px 5px 10px 10px;
-    margin: 0 0 0.65rem 0;
-}
-.release-entry .plan-run-metadata {
-    text-overflow: ellipsis;
-    overflow-x: hidden;
-    white-space: nowrap;
-    display: inline-block;
-    font-size: 13px;
-    color: black;
-    line-height: 16px;
-    padding: 7px;
-    width: 100%;
-}
-.counter {
-    color: white;
-    font-size: 12px;
-    font-weight: bold;
-    display: block;
-    border-radius: 0 0 10px 10px;
-}
\ No newline at end of file
diff --git a/src/main/webapp/css/search_header.css b/src/main/webapp/css/search_header.css
deleted file mode 100644
index d3abaf3..0000000
--- a/src/main/webapp/css/search_header.css
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Copyright (C) 2017 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.
-*/
-.row.card.search-bar {
-    margin-left: 0;
-    margin-right: 0;
-}
-.row.card.search-bar.expanded {
-    border-radius: 0 0 15px 15px;
-}
-.search-bar .section-header {
-    color: rgb(97, 97, 97);
-    font-weight: 300;
-    padding: 15px 20px 15px;
-    margin: 0;
-    cursor: default;
-    user-select: none;
-    display: inline-block;
-}
-.search-bar .section-header b {
-    color: #ee6e73;
-}
-.search-bar .search-icon-wrapper {
-    text-align: center;
-    display: inline-block;
-    position: absolute;
-    right: 0;
-    height: 57px;
-    width: 57px;
-    cursor: pointer;
-    user-select: none;
-}
-.search-bar .search-icon-wrapper i {
-    line-height: 57px;
-    color: rgb(97, 97, 97);
-}
-.search-bar .search-wrapper {
-    border-top: 1px solid rgb(221, 221, 221);
-}
-.search-bar .search-wrapper .refresh-wrapper a {
-    float: right;
-    margin-top: 17px;
-}
-.search-bar .input-field input[type=text].invalid {
-    color: #F44336;
-}
-.search-bar .search-wrapper .run-type-wrapper {
-    margin: 20px 0;
-}
-.search-bar .search-wrapper .run-type-wrapper [type="checkbox"]+label {
-    margin-right: 35px;
-}
-.search-bar-menu.ui-menu {
-    overflow: auto;
-    z-index: 100;
-    max-height: 75%;
-}
-.search-bar-menu .ui-menu-item {
-    font-size: 16px;
-    padding: 4px 10px;
-    transition: background-color .25s;
-}
-.search-bar-menu .ui-menu-item:hover {
-    background-color: #e0f2f1;
-}
-
-.search-bar-menu .ui-menu-item:active {
-    background-color: #b2dfdb;
-}
-.ui-helper-hidden-accessible {
-    display: none;
-}
diff --git a/src/main/webapp/css/show_coverage.css b/src/main/webapp/css/show_coverage.css
deleted file mode 100644
index 7178ec3..0000000
--- a/src/main/webapp/css/show_coverage.css
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Copyright (C) 2016 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.
-*/
-
-.collapsible.popout {
-    margin-bottom: 50px;
-}
-
-.table {
-    font-size: 12px;
-    border: none;
-    width: 100%;
-    word-spacing: 4px;
-    font-family: monospace;
-    white-space: PRE;
-    border-collapse: collapse;
-}
-
-.section-title {
-    margin-left: 24px;
-}
-
-.html-container {
-    padding:  25px 25px;
-}
-
-.login-button {
-    border: 1px solid gray;
-    color: gray;
-    border-radius: 15px;
-    padding: 4px 15px;
-    cursor: pointer;
-}
-
-td {
-    padding: 0;
-}
-
-.count {
-    white-space: nowrap;
-    text-align: right;
-    border-right: 1px solid black;
-    padding-right: 5px;
-}
-
-.line_no {
-    padding-left: 35px;
-    white-space: nowrap;
-    padding-right: 5px;
-    border-right: 1px dotted gray;
-}
-
-.code {
-    padding-left: 10px;
-    width: 99%;
-}
-
-.indicator {
-    display: inline-block;
-    width: 50px;
-    line-height: 18px;
-    border-radius: 10px;
-    padding: 3px 5px;
-    font-size: 12px;
-    font-weight: bold;
-    color: white;
-}
-
-.total-count {
-    margin-left: auto;
-    margin-right: 8px;
-    padding-right: 5px;
-    line-height: 22px;
-    border-right: 1px solid gray;
-    font-size: 12px;
-    font-weight: bold;
-    color: gray;
-}
-
-.uncovered {
-    background-color: LightPink;
-}
-
-.covered {
-    background-color: LightGreen;
-}
-
-.source-name {
-    margin-top: -25px;
-    padding-left: 45px;
-}
-
-.loader-background {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    background-color: #000;
-
-    position: fixed;
-    z-index: 100;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    opacity: 0.5;
-}
\ No newline at end of file
diff --git a/src/main/webapp/css/show_gcs_log.css b/src/main/webapp/css/show_gcs_log.css
deleted file mode 100644
index 1960485..0000000
--- a/src/main/webapp/css/show_gcs_log.css
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (C) 2018 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.
-*/
-
-.loading-overlay {
-    display: none;
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    background-color: #A8A8A8;
-    opacity: 0.4;
-}
diff --git a/src/main/webapp/css/show_graph.css b/src/main/webapp/css/show_graph.css
deleted file mode 100644
index 51e4c04..0000000
--- a/src/main/webapp/css/show_graph.css
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 2016 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.
-*/
-
-#download {
-    bottom: 25px;
-    right: 25px;
-}
-
-#header-container {
-    padding: 50px;
-    padding-bottom: 30px;
-}
-
-#device-select-wrapper {
-    margin-top: 0;
-}
-
-#date-container {
-    padding: 0 50px;
-    padding-bottom: 25px;
-}
-
-#load {
-    margin-top: 5px;
-}
-
-.profiling-name {
-    font-weight: 200;
-    font-style: italic;
-    font-size: 1.4rem
-}
-
-#error-container {
-    padding-top: 25px;
-    padding-bottom: 25px;
-}
-
-.graph-wrapper {
-    padding: 30px;
-}
-
-.graph {
-    height: 500px;
-    padding-bottom: 30px;
-}
-
-.percentile-table {
-    width: auto;
-    margin: auto;
-    margin-top: 20px;
-}
-
-.percentile-table td, th{
-    font-size: 11px;
-    text-align: center;
-    padding: 5px 10px;
-}
-
diff --git a/src/main/webapp/css/show_performance_digest.css b/src/main/webapp/css/show_performance_digest.css
deleted file mode 100644
index 5d0c0e6..0000000
--- a/src/main/webapp/css/show_performance_digest.css
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Copyright (C) 2016 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.
-*/
-
-#header-container {
-    padding: 25px;
-}
-
-#load {
-    margin-top: 15px;
-}
-
-#device-select-wrapper {
-    margin-top: 9px;
-}
-
-#date {
-    margin-bottom: 0;
-    margin-top: 10px;
-}
-
-div.col.card.summary {
-    padding: 0 20px 20px;
-}
-
-.profiling-name {
-    font-weight: 200;
-    font-style: italic;
-    font-size: 1.4rem
-}
-
-.profiling-subtitle {
-    font-style: italic;
-    font-size: 12px;
-    margin-left: 2px;
-}
-
-.summary table {
-    width: 100%;
-    border-collapse: collapse;
-    border: 1px solid black;
-    font-size: 12px;
-    font-family: Roboto !important;
-}
-
-.summary table td, th {
-    padding: 2px;
-}
-
-.section-label {
-    border: 1px solid black;
-}
-
-.axis-label {
-    border-top: 1px solid lightgray;
-    border-right: 1px solid black;
-    text-align: right;
-}
-
-.cell {
-    border-top: 1px solid lightgray;
-    text-align: right;
-}
-
-.inner-cell {
-    border-right: 1px solid lightgray;
-}
-
-.outer-cell {
-    border-right: 1px solid black;
-}
diff --git a/src/main/webapp/css/show_plan_release.css b/src/main/webapp/css/show_plan_release.css
deleted file mode 100644
index f55b8da..0000000
--- a/src/main/webapp/css/show_plan_release.css
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Copyright (C) 2017 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.
-*/
-.page-button-wrapper {
-    top: 50%;
-    bottom: auto;
-    padding: 0;
-}
-#newer-wrapper {
-    left: 23px;
-    right: auto;
-}
diff --git a/src/main/webapp/css/show_profiling_overview.css b/src/main/webapp/css/show_profiling_overview.css
deleted file mode 100644
index 76c194d..0000000
--- a/src/main/webapp/css/show_profiling_overview.css
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Copyright (C) 2017 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.
-*/
-
-.row.card.box-plot {
-    height: 400px;
-    padding: 25px 10px;
-}
-div.google-visualization-tooltip {
-    padding: 10px;
-    white-space: nowrap;
-}
diff --git a/src/main/webapp/css/show_release.css b/src/main/webapp/css/show_release.css
deleted file mode 100644
index 1f1758b..0000000
--- a/src/main/webapp/css/show_release.css
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Copyright (C) 2017 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.
-*/
-
-.row .col.card.option {
-    padding: 10px 15px 10px 25px;
-    margin: 5px 0;
-    border-radius: 25px;
-}
-.entry {
-    font-size: 20px;
-    font-weight: 300;
-    position: relative;
-}
-#show-button-arrow {
-    margin-left: 3px;
-}
-#section-header {
-    cursor: default;
-    user-select: none;
-    color: #ee6e73;
-}
-#section-header:after {
-    border: 1px solid #ee6e73;
-    margin-top: 10px;
-    margin-bottom: 0;
-    display: block;
-    content: " ";
-}
diff --git a/src/main/webapp/css/show_table.css b/src/main/webapp/css/show_table.css
deleted file mode 100644
index 627d859..0000000
--- a/src/main/webapp/css/show_table.css
+++ /dev/null
@@ -1,137 +0,0 @@
-/* Copyright (C) 2016 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.
-*/
-
-table {
-    font-family: Roboto !important;
-    font-size: 13px !important;
-    white-space: nowrap !important;
-}
-.table-header-cell {
-    background-color: white;
-    transition: max-width 1s;
-    max-width: 150px;
-}
-.table-header-cell:hover {
-    transition-delay: 0.5s;
-    max-width: 1000px;
-}
-.table-header-content.table-header-legend {
-    max-width: none;
-}
-.table-header-content {
-    font-weight: initial;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    display: inline-block;
-    max-width: inherit;
-    width: 100%;
-}
-.page-button-wrapper {
-    top: 50%;
-    bottom: auto;
-    padding: 0;
-}
-#newer-wrapper {
-    left: 23px;
-    right: auto;
-}
-#chart-holder {
-    padding: 30px 5px;
-}
-#pie-chart-div {
-    width: 100%;
-    height: 300px;
-}
-#profiling-container {
-    padding: 0;
-}
-#error-div {
-    padding: 30px 25px;
-}
-#profiling-body {
-    border: none;
-}
-#profiling-list {
-    max-height: 200px;
-    overflow-y: scroll;
-}
-.collapsible-header {
-    user-select: none;
-}
-.collapsible-link {
-    color: inherit;
-}
-.collection a.collection-item.profiling-point-name {
-    color: #616161;
-    font-size: 13px;
-    padding: 2px 0 2px 25px;
-}
-#legend-wrapper {
-    display: inline-block;
-    padding: 10px 15px 12px;
-}
-.btn.inline-btn {
-    border-radius: 50px;
-    height: auto;
-    line-height: inherit;
-    padding: 1px;
-    margin-left: 2px;
-}
-i.material-icons.inline-icon {
-    font-size: inherit;
-}
-a.legend-circle {
-    width: 15px;
-    height: 15px;
-    padding: 0;
-    border-radius: 15px;
-}
-.legend-header-cell {
-    text-transform: capitalize;
-}
-.legend-entry {
-    display: inline-block;
-    margin: 0 5px;
-    min-width: 50px;
-}
-.legend-bubble {
-    border-radius: 20px;
-    height: 20px;
-    width: 20px;
-    margin: 0 auto;
-}
-#pie-chart-wrapper {
-    padding: 25px 0;
-}
-.pie-chart-title {
-    cursor: default;
-}
-div.status-icon {
-    width: 10px;
-    height: 10px;
-    border-radius: 10px;
-    display: inline-block;
-    margin-left: 5px;
-}
-.test-case-status {
-    border-radius: 50px;
-    display: inline-block;
-    height: 100%;
-    width: 100%;
-}
-.test-case-status.width-1 {
-    width: calc(100% - 18px);
-}
diff --git a/src/main/webapp/css/show_test_acknowledgments.css b/src/main/webapp/css/show_test_acknowledgments.css
deleted file mode 100644
index 38edb31..0000000
--- a/src/main/webapp/css/show_test_acknowledgments.css
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright (C) 2017 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.
-*/
-.row.home-tabs-row {
-    margin-bottom: 50px;
-}
-.row.home-tabs-row li.col.tab {
-    cursor: pointer;
-    user-select: none;
-}
\ No newline at end of file
diff --git a/src/main/webapp/css/show_test_runs_common.css b/src/main/webapp/css/show_test_runs_common.css
deleted file mode 100644
index ff48b73..0000000
--- a/src/main/webapp/css/show_test_runs_common.css
+++ /dev/null
@@ -1,156 +0,0 @@
-/* Copyright (C) 2017 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.
-*/
-.page-button-wrapper {
-    top: 50%;
-    bottom: auto;
-    padding: 0;
-}
-#newer-wrapper {
-    left: 23px;
-    right: auto;
-}
-#chart-holder {
-    padding: 30px 5px;
-}
-#pie-chart-div {
-    width: 100%;
-    height: 300px;
-}
-.row .col div.pie-chart-div {
-    width: 100%;
-    height: 255px;
-}
-#profiling-container {
-    padding: 0;
-}
-#summary-container {
-    padding: 0;
-    line-height: 18px;
-    font-weight: 300;
-    color: rgb(97, 97, 97);
-}
-#summary-container .summary-header {
-    font-size: 18px;
-    font-weight: normal;
-    color: rgba(0, 0, 0, 0.87);
-    border-bottom: 1px solid rgb(221, 221, 221);
-    margin: 0;
-    padding: 10px 15px;
-}
-#summary-container .summary-header i {
-    margin-right: 10px;
-}
-#summary-container div {
-    margin: 15px;
-}
-#error-div {
-    padding: 30px 25px;
-}
-#profiling-body {
-    border: none;
-}
-#profiling-list {
-    max-height: 200px;
-    overflow-y: scroll;
-}
-.collapsible-header {
-    user-select: none;
-}
-.collapsible-link {
-    color: inherit;
-}
-.collection a.collection-item.profiling-point-name {
-    color: #616161;
-    font-size: 13px;
-    padding: 2px 0 2px 25px;
-}
-#legend-wrapper {
-    display: inline-block;
-    padding: 10px 15px 12px;
-}
-.btn.inline-btn {
-    border-radius: 50px;
-    height: auto;
-    line-height: inherit;
-    padding: 1px;
-    margin-left: 2px;
-}
-i.material-icons.inline-icon {
-    font-size: inherit;
-}
-a.legend-circle {
-    width: 15px;
-    height: 15px;
-    padding: 0;
-    border-radius: 15px;
-}
-.legend-header-cell {
-    text-transform: capitalize;
-}
-.legend-entry {
-    display: inline-block;
-    margin: 0 5px;
-    min-width: 50px;
-}
-.legend-bubble {
-    border-radius: 20px;
-    height: 20px;
-    width: 20px;
-    margin: 0 auto;
-}
-#pie-chart-wrapper, .row .col.pie-chart-wrapper {
-    padding: 25px 0;
-}
-.pie-chart-title {
-    cursor: default;
-}
-div.status-icon {
-    width: 10px;
-    height: 10px;
-    border-radius: 10px;
-    display: inline-block;
-    margin-left: 5px;
-}
-.test-case-status {
-    border-radius: 50px;
-    display: inline-block;
-    height: 100%;
-    width: 100%;
-}
-.test-case-status.width-1 {
-    width: calc(100% - 18px);
-}
-.TEST_CASE_RESULT_PASS {
-    background-color: #4CAF50;
-}
-.TEST_CASE_RESULT_FAIL {
-    background-color: #F44336;
-}
-.TEST_CASE_RESULT_SKIP {
-    background-color: #A8A8A8;
-}
-.TEST_CASE_RESULT_EXCEPTION {
-    background-color: black;
-}
-.TEST_CASE_RESULT_TIMEOUT {
-    background-color: #9900CC;
-}
-.UNKNOWN_RESULT {
-    background-color: white;
-    border: 1px #A8A8A8 solid;
-}
-.tabs > div.indicator {
-    height: 3px;
-}
diff --git a/src/main/webapp/css/test_acknowledgments.css b/src/main/webapp/css/test_acknowledgments.css
deleted file mode 100644
index 834b86d..0000000
--- a/src/main/webapp/css/test_acknowledgments.css
+++ /dev/null
@@ -1,145 +0,0 @@
-/* Copyright (C) 2017 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.
-*/
-div.col.s12.section-header-col:after {
-    border: 1px solid #ee6e73;
-    margin-top: 10px;
-    margin-bottom: 0;
-    display: block;
-    content: " ";
-}
-div.col.s12.section-header-col h4.section-header {
-    cursor: default;
-    user-select: none;
-    color: #ee6e73;
-}
-div.col.s12.section-header-col p.acknowledgment-info {
-    font-size: 18px;
-    color: rgba(0,0,0,0.6);
-    font-weight: 300;
-}
-.search-row .input-field.col.s8 > label {
-    pointer-events: none;
-}
-.search-row .col.s1 .btn.btn-floating {
-    margin-top: 22px;
-}
-.acknowledgments {
-    width: 100%;
-    margin-top: 25px;
-    display: inline-block;
-}
-.ack-entry .col.card {
-    margin: 5px 0;
-    border-radius: 5px;
-    word-break: break-word;
-    cursor: pointer;
-}
-.ack-entry span.info-icon.right {
-    padding: 5px 0 0 0;
-    height: auto;
-    margin-right: -15px;
-    pointer-events: none;
-}
-.ack-entry span.info-icon.right i {
-    font-size: 16px;
-    line-height: 16px;
-    user-select: none;
-    color: grey;
-}
-.ack-entry .btn-container > .btn-flat {
-    margin-top: 10px;
-    user-select: none;
-    color: grey;
-}
-.ack-entry .count-indicator {
-    font-size: 12px;
-    font-style: italic;
-    font-weight: 300;
-    vertical-align: text-top;
-}
-.acknowledgments-modal.modal {
-    width: 80%;
-}
-.acknowledgments-modal.modal h4, .acknowledgments-modal.modal h5 {
-    user-select: none;
-    cursor: default;
-}
-.acknowledgments-modal.modal .modal-content .row .modal-section > .col {
-    padding: 0;
-}
-.acknowledgments-modal.modal .modal-content h5 {
-    color: rgb(97, 97, 97);
-    font-weight: 300;
-}
-.acknowledgments-modal.modal .modal-content h5 b {
-    color: #ee6e73;
-}
-.acknowledgments-modal.modal .modal-content .chips {
-    max-height: 30%;
-    overflow-y: auto;
-}
-.acknowledgments-modal.modal .modal-content .chips .chip {
-    font-size: 13px;
-    height: auto;
-    line-height: 13px;
-    padding: 5px 10px;
-    margin-right: 5px;
-    margin-top: 5px;
-}
-.acknowledgments-modal.modal .modal-content .chips .chip i.material-icons {
-    line-height: 13px;
-}
-.acknowledgments-modal.modal .modal-content .input-container {
-    position: relative;
-}
-.acknowledgments-modal.modal .modal-content .input-container .material-icons.add-button {
-    position: absolute;
-    top: 13px;
-    right: 5px;
-    color: #9e9e9e;
-    cursor: pointer;
-}
-.acknowledgments-modal.modal .modal-content .input-container > input[type=text] {
-    font-size: 15px;
-    height: 30px;
-    border: 0;
-    color: rgba(0,0,0,0.6);
-    margin-top: 10px;
-}
-.acknowledgments-modal.modal .modal-content .input-field {
-    margin-top: -25px;
-}
-.acknowledgments-modal.modal .modal-content .input-field textarea.note-field:disabled {
-    color: rgba(0,0,0,0.6);
-}
-.ui-autocomplete.card.autocomplete-dropdown {
-    z-index: 10000000;
-    overflow: auto;
-    max-height: 250px;
-}
-.ui-autocomplete.card.autocomplete-dropdown .ui-menu-item {
-    font-size: 12px;
-    padding: 4px 10px;
-    transition: background-color .25s;
-}
-.ui-autocomplete.card.autocomplete-dropdown .ui-menu-item:hover {
-    background-color: #e0f2f1;
-}
-.ui-autocomplete.card.autocomplete-dropdown .ui-menu-item:active {
-    background-color: #b2dfdb;
-}
-.ui-helper-hidden-accessible {
-    display: none;
-}
diff --git a/src/main/webapp/css/test_results.css b/src/main/webapp/css/test_results.css
deleted file mode 100644
index 1e7c13b..0000000
--- a/src/main/webapp/css/test_results.css
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Copyright (C) 2017 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.
-*/
-li.test-run-container.active {
-    border-radius: 0 0 10px 10px;
-}
-.collapsible-header {
-    user-select: none;
-}
-.collapsible-header.disabled {
-    pointer-events: none;
-}
-.collapsible-header.test-run {
-    position: relative;
-}
-.test-run-metadata {
-    font-size: 13px;
-    line-height: 15px;
-    padding-top: 10px;
-    padding-bottom: 10px;
-    position: relative;
-    display: inline-block;
-    cursor: text;
-    user-select: initial;
-}
-.suite-test-run-metadata {
-    font-size: 13px;
-    line-height: 15px;
-    position: relative;
-    display: inline-block;
-    cursor: text;
-    user-select: initial;
-}
-.test-results.row {
-    margin: 0;
-    border-radius: 0 0 10px 10px;
-}
-.test-case-container {
-    font-weight: 400;
-    padding: 10px 15px 15px;
-    max-height: 33%;
-    overflow: auto;
-    box-shadow: inset 0 5px 7px -5px lightgrey;
-}
-.row .col.test-col {
-    padding: 0;
-}
-.row .col.test-col.bordered {
-    border-right: 1px solid lightgray;
-}
-.row .col.test-col.left-most {
-    border-radius: 0 0 0 10px;
-}
-.row .col.test-col.right-most {
-    border-radius: 0 0 10px 0;
-}
-.row .col.test-col.left-most.right-most {
-    border-radius: 0 0 10px 10px;
-}
-.test-result-label {
-    text-transform: capitalize;
-    border-bottom: 1px solid lightgray;
-    padding: 4px 15px;
-    margin: 0;
-}
-.loaders {
-    position: absolute;
-    left:0;
-    right:0;
-    top:0;
-    bottom:0;
-    margin:auto;
-}
-.indicator {
-    color: white;
-    font-size: 12px;
-    line-height: 20px;
-    font-weight: bold;
-    padding: 1px 6px;
-    margin-top: 10px;
-    min-width: 40px;
-    border-radius: 10px;
-}
-.indicator.padded {
-    margin-right: 5px;
-}
-.test-col .indicator {
-    margin-top: 2px;
-}
-.material-icons.expand-arrow {
-    right: 3px;
-    bottom: 0px;
-    position: absolute;
-    transition: transform 0.2s;
-}
-.rotate {
-    transform: rotate(-180deg);
-}
-i.material-icons.inline-icon {
-    font-size: inherit;
-}
-.test-run-label {
-    font-size: 18px;
-    line-height: 35px;
-    font-weight: 300;
-}
diff --git a/src/main/webapp/js/common.js b/src/main/webapp/js/common.js
deleted file mode 100644
index a815868..0000000
--- a/src/main/webapp/js/common.js
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * Copyright (c) 2018 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-/**
- * Display the log links in a modal window.
- * @param linkList A list of [name, url] tuples representing log links.
- */
-function showLinks(container, linkList) {
-  if (!linkList || linkList.length == 0) return;
-
-  var logCollection = $('<ul class="collection"></ul>');
-  var entries = linkList.reduce(function(acc, entry) {
-    if (!entry || entry.length == 0) return acc;
-    var link = '<a href="' + entry[1] + '"';
-    link += 'class="collection-item">' + entry[0] + '</li>';
-    return acc + link;
-  }, '');
-  logCollection.html(entries);
-
-  if (container.find('#info-modal').length == 0) {
-    var modal =
-        $('<div id="info-modal" class="modal modal-fixed-footer"></div>');
-    var content = $('<div class="modal-content"></div>');
-    content.append('<h4>Links</h4>');
-    content.append('<div class="info-container"></div>');
-    content.appendTo(modal);
-    var footer = $('<div class="modal-footer"></div>');
-    footer.append('<a class="btn-flat modal-close">Close</a></div>');
-    footer.appendTo(modal);
-    modal.appendTo(container);
-  }
-  var infoContainer = $('#info-modal>.modal-content>.info-container');
-  infoContainer.empty();
-  logCollection.appendTo(infoContainer);
-  $('#info-modal').modal({dismissible: true});
-  $('#info-modal').modal('open');
-}
-
-/**
- * Get the nickname for a test case result.
- *
- * Removes the result prefix and suffix, extracting only the result name.
- *
- * @param testCaseResult The string name of a VtsReportMessage.TestCaseResult.
- * @returns the string nickname of the result.
- */
-function getNickname(testCaseResult) {
-  return testCaseResult.replace('TEST_CASE_RESULT_', '')
-      .replace('_RESULT', '')
-      .trim()
-      .toLowerCase();
-}
-
-/**
- * Display test data in the body beneath a test run's metadata.
- * @param container The jquery object in which to insert the test metadata.
- * @param data The json object containing the columns to display.
- * @param lineHeight The height of each list element.
- */
-function displayTestDetails(container, data, lineHeight) {
-  var nCol = data.length;
-  var width = 's' + (12 / nCol);
-  test = container;
-  var maxLines = 0;
-  data.forEach(function(column, index) {
-    if (column.data == undefined || column.name == undefined) {
-      return;
-    }
-    var classes = 'col test-col grey lighten-5 ' + width;
-    if (index != nCol - 1) {
-      classes += ' bordered';
-    }
-    if (index == 0) {
-      classes += ' left-most';
-    }
-    if (index == nCol - 1) {
-      classes += ' right-most';
-    }
-    var colContainer = $('<div class="' + classes + '"></div>');
-    var col = $('<div class="test-case-container"></div>');
-    colContainer.appendTo(container);
-    var count = column.data.length;
-    var head = $('<h5 class="test-result-label white"></h5>')
-                   .text(getNickname(column.name))
-                   .appendTo(colContainer)
-                   .css('text-transform', 'capitalize');
-    $('<div class="indicator right center"></div>')
-        .text(count)
-        .addClass(column.name)
-        .appendTo(head);
-    col.appendTo(colContainer);
-    var list = $('<ul></ul>').appendTo(col);
-    column.data.forEach(function(testCase) {
-      $('<li></li>')
-          .text(testCase)
-          .addClass('test-case')
-          .css('font-size', lineHeight - 2)
-          .css('line-height', lineHeight + 'px')
-          .appendTo(list);
-    });
-    if (count > maxLines) {
-      maxLines = count;
-    }
-  });
-  var containers = container.find('.test-case-container');
-  containers.height(maxLines * lineHeight);
-}
diff --git a/src/main/webapp/js/plan_runs.js b/src/main/webapp/js/plan_runs.js
deleted file mode 100644
index 6f11083..0000000
--- a/src/main/webapp/js/plan_runs.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-(function ($, moment) {
-
-  /**
-   * Display test plan metadata in a vertical popout.
-   * @param container The jquery object in which to insert the plan metadata.
-   * @param metadataList The list of metadata objects to render on the display.
-   */
-  function renderCard(container, entry) {
-    var card = $('<a class="col s12 m6 l4"></a>');
-    var link = (
-      '/show_plan_run?plan=' + entry.testPlanRun.testPlanName +
-      '&time=' + entry.testPlanRun.startTimestamp);
-    card.attr('href', link);
-    card.appendTo(container);
-    var div = $('<div class="hoverable card release-entry"></div>');
-    var startTime = entry.testPlanRun.startTimestamp;
-    var endTime = entry.testPlanRun.endTimestamp;
-    div.appendTo(card);
-    var span = $('<span></span>');
-    span.addClass('plan-run-metadata');
-    span.appendTo(div);
-    $('<b></b>').text(entry.deviceInfo).appendTo(span);
-    span.append('<br>');
-    $('<b></b>').text('VTS Build: ').appendTo(span);
-    span.append(entry.testPlanRun.testBuildId).append('<br>');
-    var timeString = (
-      moment().renderTime(startTime, false) + ' - ' +
-      moment().renderTime(endTime, true) + ' (' +
-      moment().renderDuration(endTime - startTime) + ')');
-    span.append(timeString);
-    var counter = $('<span></span>');
-    var color = entry.testPlanRun.failCount > 0 ? 'red' : 'green';
-    counter.addClass('counter center ' + color);
-    counter.append(
-      entry.testPlanRun.passCount + '/' +
-      (entry.testPlanRun.passCount + entry.testPlanRun.failCount));
-    counter.appendTo(div);
-  }
-
-  $.fn.showPlanRuns = function(data) {
-    var self = $(this);
-    data.forEach(function (entry) {
-      renderCard(self, entry);
-    })
-  }
-
-})(jQuery, moment);
diff --git a/src/main/webapp/js/search_header.js b/src/main/webapp/js/search_header.js
deleted file mode 100644
index 4f108c4..0000000
--- a/src/main/webapp/js/search_header.js
+++ /dev/null
@@ -1,251 +0,0 @@
-/**
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-(function ($) {
-  var _inequalityRegex = '(^)(<|>|<=|>=|=)?[ ]*?[0-9]+$';
-  var _inequalityHint = 'e.g. 5, >0, <=10';
-
-  function _validate(input, valueSet) {
-    var value = input.val();
-    if (valueSet.has(value) || !value) {
-      input.removeClass('invalid');
-    } else {
-      input.addClass('invalid');
-    }
-  }
-
-  function _createInput(key, config) {
-    var value = config.value;
-    var values = config.options.corpus;
-    var displayName = config.displayName;
-    var width = config.options.width || 's4';
-    var div = $('<div class="input-field col"></div>');
-    div.addClass(width);
-    var input = $('<input class="filter-input"></input>');
-    input.attr('type', config.options.type || 'text');
-    input.appendTo(div);
-    var label = $('<label></label>').text(displayName).appendTo(div);
-    if (value) {
-      input.attr('value', value);
-      label.addClass('active');
-    }
-    if (config.options.validate == 'inequality') {
-      input.addClass('validate');
-      input.attr('pattern', _inequalityRegex);
-      input.attr('placeholder', _inequalityHint);
-      label.addClass('active');
-    }
-    input.focusout(function() {
-      config.value = input.val();
-    });
-    if (values && values.length > 0) {
-      var valueSet = new Set(values);
-      input.sizedAutocomplete({
-        source: values,
-        classes: {
-          'ui-autocomplete': 'card search-bar-menu'
-        }
-      });
-      input.focusout(function() {
-        _validate(input, valueSet);
-      });
-    }
-    if (values && values.length > 0 && value) {
-      _validate(input, valueSet);
-    }
-    return div;
-  }
-
-  function _verifyCheckboxes(checkboxes, refreshObject) {
-    var oneChecked = checkboxes.presubmit || checkboxes.postsubmit;
-    if (!oneChecked) {
-      refreshObject.addClass('disabled');
-    } else {
-      refreshObject.removeClass('disabled');
-    }
-  }
-
-  function _createRunTypeBoxes(checkboxes, refreshObject) {
-    var container = $('<div class="run-type-wrapper col s12"></div>');
-    var presubmit = $('<input type="checkbox" id="presubmit"></input>');
-    presubmit.appendTo(container);
-    if (checkboxes.presubmit) {
-      presubmit.prop('checked', true);
-    }
-    container.append('<label for="presubmit">Presubmit</label>');
-    var postsubmit = $('<input type="checkbox" id="postsubmit"></input>');
-    postsubmit.appendTo(container);
-    if (checkboxes.postsubmit) {
-      postsubmit.prop('checked', true);
-    }
-    container.append('<label for="postsubmit">Postsubmit</label>');
-    presubmit.change(function() {
-      checkboxes.presubmit = presubmit.prop('checked');
-      _verifyCheckboxes(checkboxes, refreshObject);
-    });
-    postsubmit.change(function() {
-      checkboxes.postsubmit = postsubmit.prop('checked');
-      _verifyCheckboxes(checkboxes, refreshObject);
-    });
-    return container;
-  }
-
-  function _expand(
-      container, filters, checkboxes, onRefreshCallback, animate=true) {
-    var wrapper = $('<div class="search-wrapper"></div>');
-    var col = $('<div class="col s9"></div>');
-    col.appendTo(wrapper);
-    Object.keys(filters).forEach(function(key) {
-      col.append(_createInput(key, filters[key]));
-    });
-    var refreshCol = $('<div class="col s3 refresh-wrapper"></div>');
-    var refresh = $('<a class="btn-floating btn-medium red right waves-effect waves-light"></a>')
-      .append($('<i class="medium material-icons">cached</i>'))
-      .appendTo(refreshCol);
-    refresh.click(onRefreshCallback);
-    refreshCol.appendTo(wrapper);
-    if (Object.keys(checkboxes).length > 0) {
-      col.append(_createRunTypeBoxes(checkboxes, refresh));
-    }
-    if (animate) {
-      wrapper.hide().appendTo(container).slideDown({
-        duration: 200,
-        easing: "easeOutQuart",
-        queue: false
-      });
-    } else {
-      wrapper.appendTo(container);
-    }
-    container.addClass('expanded')
-  }
-
-  function _renderHeader(
-      container, label, value, filters, checkboxes, expand, onRefreshCallback) {
-    var div = $('<div class="row card search-bar"></div>');
-    var wrapper = $('<div class="header-wrapper"></div>');
-    var header = $('<h5 class="section-header"></h5>');
-    $('<b></b>').text(label).appendTo(header);
-    $('<span></span>').text(value).appendTo(header);
-    header.appendTo(wrapper);
-    var iconWrapper = $('<div class="search-icon-wrapper"></div>');
-    $('<i class="material-icons">search</i>').appendTo(iconWrapper);
-    iconWrapper.appendTo(wrapper);
-    wrapper.appendTo(div);
-    if (expand) {
-      _expand(div, filters, checkboxes, onRefreshCallback, false);
-    } else {
-      var expanded = false;
-      iconWrapper.click(function() {
-        if (expanded) return;
-        expanded = true;
-        _expand(div, filters, checkboxes, onRefreshCallback);
-      });
-    }
-    div.appendTo(container);
-  }
-
-  function _addFilter(filters, displayName, keyName, options, defaultValue) {
-    filters[keyName] = {};
-    filters[keyName].displayName = displayName;
-    filters[keyName].value = defaultValue;
-    filters[keyName].options = options;
-  }
-
-  function _getOptionString(filters, checkboxes) {
-    var args = Object.keys(filters).reduce(function(acc, key) {
-      if (filters[key].value) {
-        return acc + '&' + key + '=' + encodeURIComponent(filters[key].value);
-      }
-      return acc;
-    }, '');
-    if (checkboxes.presubmit != undefined && checkboxes.presubmit) {
-      args += '&showPresubmit='
-    }
-    if (checkboxes.postsubmit != undefined && checkboxes.postsubmit) {
-      args += '&showPostsubmit='
-    }
-    return args;
-  }
-
-  /**
-   * Create a search header element.
-   * @param label The header label.
-   * @param value The value to display next to the label.
-   * @param onRefreshCallback The function to call on refresh.
-   */
-  $.fn.createSearchHeader = function(label, value, onRefreshCallback) {
-    var self = $(this);
-    $.widget('custom.sizedAutocomplete', $.ui.autocomplete, {
-      _resizeMenu : function() {
-        this.menu.element.outerWidth($('.search-bar .filter-input').width());
-      }
-    });
-    var filters = {};
-    var checkboxes = {};
-    var expandOnRender = false;
-    var displayed = false;
-    return {
-      /**
-       * Add a filter to the display.
-       * @param displayName The input placeholder/label text.
-       * @param keyName The URL key to use for the filter options.
-       * @param options A dict of additional options (e.g. width, type).
-       * @param defaultValue A default filter value.
-       */
-      addFilter : function(displayName, keyName, options, defaultValue) {
-        if (displayed) return;
-        _addFilter(filters, displayName, keyName, options, defaultValue);
-        if (defaultValue) expandOnRender = true;
-      },
-      /**
-       * Enable run type checkboxes in the filter options.
-       *
-       * This will display two checkboxes for selecting pre-/postsubmit runs.
-       * @param showPresubmit True if presubmit runs are selected.
-       * @param showPostsubmit True if postsubmit runs are selected.
-       *
-       */
-      addRunTypeCheckboxes: function(showPresubmit, showPostsubmit) {
-        if (displayed) return;
-        checkboxes['presubmit'] = showPresubmit;
-        checkboxes['postsubmit'] = showPostsubmit;
-        if (!showPostsubmit || showPresubmit) {
-          expandOnRender = true;
-        }
-      },
-      /**
-       * Display the created search bar.
-       *
-       * This must be called after filters have been added. After displaying, no
-       * modifications to the filter options will take effect.
-       */
-      display : function() {
-        displayed = true;
-        _renderHeader(
-          self, label, value, filters, checkboxes, expandOnRender,
-          onRefreshCallback);
-      },
-      /**
-       * Get the URL arguments string for the current set of filters.
-       * @returns a URI-encoded component with the search bar keys and values.
-       */
-      args : function () {
-        return _getOptionString(filters, checkboxes);
-      }
-    }
-  }
-
-})(jQuery);
diff --git a/src/main/webapp/js/test_acknowledgments.js b/src/main/webapp/js/test_acknowledgments.js
deleted file mode 100644
index 810d9d6..0000000
--- a/src/main/webapp/js/test_acknowledgments.js
+++ /dev/null
@@ -1,439 +0,0 @@
-/**
- * Copyright (c) 2017 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.
- */
-
-(function($) {
-
-  var _isModalOpen = false;
-  var _isReadOnly = true;
-  var _allTestsSet = new Set();
-  var _allBranches = [];
-  var _allDevices = [];
-
-  var _writableSummary = 'Known test failures are acknowledged below for specific branch and \
-    device configurations, and corresponding test breakage alerts will be silenced. Click an \
-    entry to edit or see more information about the test failure.'
-  var _readOnlySummary = 'Known test failures are acknowledged below for specific branch and \
-    device configurations, and corresponding test breakage alerts will be silenced. Click an \
-    entry to see  more information about the test failure. To add, edit, or remove a test \
-    acknowledgment, contact a VTS Dashboard administrator.'
-
-  $.widget('custom.sizedAutocomplete', $.ui.autocomplete, {
-    options: {
-      parent: ''
-    },
-    _resizeMenu: function() {
-      this.menu.element.outerWidth($(this.options.parent).width());
-    }
-  });
-
-  /**
-   * Remove an acknowledgment from the list.
-   * @param ack (jQuery object) The object for acknowledgment.
-   * @param key (String) The value to display next to the label.
-   */
-  function removeAcknowledgment(ack, key) {
-    if (ack.hasClass('disabled')) {
-      return;
-    }
-    ack.addClass('disabled');
-    $.ajax({
-      url: '/api/test_acknowledgments/' + key,
-      type: 'DELETE'
-    }).always(function() {
-      ack.removeClass('disabled');
-    }).then(function() {
-      ack.slideUp(150, function() {
-        ack.remove();
-      });
-    });
-  }
-
-  /**
-   * Callback for when a chip is removed from a chiplist.
-   * @param text (String) The value stored in the chip.
-   * @param allChipsSet (Set) The set of all chip values.
-   * @param allIndicator (jQuery object) The object for "All" indicator adjacent to the chips.
-   */
-  function chipRemoveCallback(text, allChipsSet, allIndicator) {
-    allChipsSet.delete(text);
-    if (allChipsSet.size == 0) {
-      allIndicator.show();
-    }
-  }
-
-  /**
-   * Add chips to the chip UI.
-   * @param allChipsSet (Set) The set of all chip values.
-   * @param container (jQuery object) The object in which to insert the chips.
-   * @param chipList (list) The list of chip values to insert.
-   * @param allIndicator (jQuery object) The object for "All" indicator adjacent to the chips.
-   */
-  function addChips(allChipsSet, container, chipList, allIndicator) {
-    if (chipList && chipList.length > 0) {
-      chipList.forEach(function(text) {
-        if (allChipsSet.has(text)) return;
-        var chip = $('<span class="chip">' + text + '</span>');
-        if (!_isReadOnly) {
-          var icon = $('<i class="material-icons">clear</i>').appendTo(chip);
-          icon.click(function() {
-            chipRemoveCallback(text, allChipsSet, allIndicator);
-          });
-        }
-        chip.appendTo(container);
-        allChipsSet.add(text);
-      });
-      allIndicator.hide();
-    }
-  }
-
-  /**
-   * Create a chip input UI.
-   * @param container (jQuery object) The object in which to insert the input box.
-   * @param placeholder (String) The placeholder text to display in the input.
-   * @param allChipsSet (Set) The set of all chip values.
-   * @param chipContainer (jQuery object) The object in which to insert new chips from the input.
-   * @param allIndicator (jQuery object) The object for "All" indicator adjacent to the chips.
-   * @returns The chip input jQuery object.
-   */
-  function addChipInput(container, placeholder, allChipsSet, chipContainer, allIndicator) {
-    var input = $('<input type="text"></input>');
-    input.attr('placeholder', placeholder);
-    input.keyup(function(e) {
-      if (e.keyCode === 13 && input.val().trim()) {
-        addChips(allChipsSet, chipContainer, [input.val()], allIndicator);
-        input.val('');
-      }
-    });
-    var addButton = $('<i class="material-icons add-button">add</i>');
-    addButton.click(function() {
-      if (input.val().trim()) {
-        addChips(allChipsSet, chipContainer, [input.val()], allIndicator);
-        input.val('');
-        addButton.hide();
-      }
-    });
-    addButton.hide();
-    input.focus(function() {
-      addButton.show();
-    });
-    input.focusout(function() {
-      if (!input.val().trim()) {
-        addButton.hide();
-      }
-    });
-    var holder = $('<div class="col s12 input-container"></div>').appendTo(container);
-    input.appendTo(holder);
-    addButton.appendTo(holder);
-    return input;
-  }
-
-  /**
-   * Callback to save changes to the acknowledgment.
-   * @param ack (jQuery object) The object for acknowledgment.
-   * @param modal (jQuery object) The jQueryUI modal object which invoked the callback.
-   * @param key (String) The key associated with the acknowledgment.
-   * @param test (String) The test name in the acknowledgment.
-   * @param branchSet (Set) The set of all branches in the acknowledgment.
-   * @param deviceSet (Set) The set of all devoces in the acknowledgment.
-   * @param testCaseSet (Set) The set of all test cases in the acknowledgment.
-   * @param note (String) The note in the acknowledgment.
-   */
-  function saveCallback(ack, modal, key, test, branchSet, deviceSet, testCaseSet, note) {
-    var allEmpty = true;
-    var firstUnemptyInput = null;
-    var vals = modal.find('.modal-section>.input-container>input').each(function(_, input) {
-      if (!!$(input).val()) {
-        allEmpty = false;
-        if (!firstUnemptyInput) firstUnemptyInput = $(input);
-      }
-    });
-    if (!allEmpty) {
-      firstUnemptyInput.focus();
-      return false;
-    }
-    var branches = Array.from(branchSet);
-    branches.sort();
-    var devices = Array.from(deviceSet);
-    devices.sort();
-    var testCaseNames = Array.from(testCaseSet);
-    testCaseNames.sort();
-    var data = {
-      'key' : key,
-      'testName' : test,
-      'branches' : branches,
-      'devices' : devices,
-      'testCaseNames' : testCaseNames,
-      'note': note
-    };
-    $.post('/api/test_acknowledgments', JSON.stringify(data)).done(function(newKey) {
-      var newAck = createAcknowledgment(newKey, test, branches, devices, testCaseNames, note);
-      if (key == null) {
-        ack.replaceWith(newAck.hide());
-        newAck.slideDown(150);
-      } else {
-        ack.replaceWith(newAck);
-      }
-    }).always(function() {
-      modal.modal({
-        complete: function() { _isModalOpen = false; }
-      });
-      modal.modal('close');
-    });
-  }
-
-  /**
-   * Callback to save changes to the acknowledgment.
-   * @param ack (jQuery object) The object for the acknowledgment.
-   * @param key (String) The key associated with the acknowledgment.
-   * @param test (String) The test name in the acknowledgment.
-   * @param branches (list) The list of all branches in the acknowledgment.
-   * @param devices (Set) The list of all devoces in the acknowledgment.
-   * @param testCases (Set) The list of all test cases in the acknowledgment.
-   * @param note (String) The note in the acknowledgment.
-   */
-  function showModal(ack, key, test, branches, devices, testCases, note) {
-    if (_isModalOpen) {
-      return;
-    }
-    _isModalOpen = true;
-    var wrapper = $('#modal');
-    wrapper.empty();
-    wrapper.modal();
-    var content = $('<div class="modal-content"><h4>Test Acknowledgment</h4></div>');
-    var row = $('<div class="row"></div>').appendTo(content);
-    row.append('<div class="col s12"><h5><b>Test: </b>' + test + '</h5></div>');
-
-    var branchSet = new Set();
-    var branchContainer = $('<div class="col l4 s12 modal-section"></div>').appendTo(row);
-    var branchHeader = $('<h5></h5>').appendTo(branchContainer);
-    branchHeader.append('<b>Branches:</b>');
-    var allBranchesLabel = $('<span> All</span>').appendTo(branchHeader);
-    var branchChips = $('<div class="col s12 chips branch-chips"></div>').appendTo(branchContainer);
-    addChips(branchSet, branchChips, branches, allBranchesLabel);
-    if (!_isReadOnly) {
-      var branchInput = addChipInput(
-        branchContainer, 'Specify a branch...', branchSet, branchChips, allBranchesLabel);
-      branchInput.sizedAutocomplete({
-        source: _allBranches,
-        classes: {
-          'ui-autocomplete': 'card autocomplete-dropdown'
-        },
-        parent: branchInput
-      });
-    }
-
-    var deviceSet = new Set();
-    var deviceContainer = $('<div class="col l4 s12 modal-section"></div>').appendTo(row);
-    var deviceHeader = $('<h5></h5>').appendTo(deviceContainer);
-    deviceHeader.append('<b>Devices:</b>');
-    var allDevicesLabel = $('<span> All</span>').appendTo(deviceHeader);
-    var deviceChips = $('<div class="col s12 chips device-chips"></div>').appendTo(deviceContainer);
-    addChips(deviceSet, deviceChips, devices, allDevicesLabel);
-    if (!_isReadOnly) {
-      var deviceInput = addChipInput(
-        deviceContainer, 'Specify a device...', deviceSet, deviceChips, allDevicesLabel);
-      deviceInput.sizedAutocomplete({
-        source: _allDevices,
-        classes: {
-          'ui-autocomplete': 'card autocomplete-dropdown'
-        },
-        parent: deviceInput
-      });
-    }
-
-    var testCaseSet = new Set();
-    var testCaseContainer = $('<div class="col l4 s12 modal-section"></div>').appendTo(row);
-    var testCaseHeader = $('<h5></h5>').appendTo(testCaseContainer);
-    testCaseHeader.append('<b>Test Cases:</b>');
-    var allTestCasesLabel = $('<span> All</span>').appendTo(testCaseHeader);
-    var testCaseChips = $('<div class="col s12 chips test-case-chips"></div>').appendTo(
-      testCaseContainer);
-    addChips(testCaseSet, testCaseChips, testCases, allTestCasesLabel);
-    var testCaseInput = null;
-    if (!_isReadOnly) {
-      testCaseInput = addChipInput(
-        testCaseContainer, 'Specify a test case...', testCaseSet, testCaseChips, allTestCasesLabel);
-    }
-
-    row.append('<div class="col s12"><h5><b>Note:</b></h5></div>');
-    var inputField = $('<div class="input-field col s12"></div>').appendTo(row);
-    var textArea = $('<textarea placeholder="Type a note..."></textarea>');
-    textArea.addClass('materialize-textarea note-field');
-    textArea.appendTo(inputField);
-    textArea.val(note);
-    if (_isReadOnly) {
-      textArea.attr('disabled', true);
-    }
-
-    content.appendTo(wrapper);
-    var footer = $('<div class="modal-footer"></div>');
-    if (!_isReadOnly) {
-      var save = $('<a class="btn">Save</a></div>').appendTo(footer);
-      save.click(function() {
-        saveCallback(ack, wrapper, key, test, branchSet, deviceSet, testCaseSet, textArea.val());
-      });
-    }
-    var close = $('<a class="btn-flat">Close</a></div>').appendTo(footer);
-    close.click(function() {
-      wrapper.modal({
-        complete: function() { _isModalOpen = false; }
-      });
-      wrapper.modal('close');
-    })
-    footer.appendTo(wrapper);
-    if (!_isReadOnly) {
-      $.get('/api/test_run?test=' + test + '&timestamp=latest').done(function(data) {
-        var allTestCases = data.reduce(function(array, column) {
-          return array.concat(column.data);
-        }, []);
-        testCaseInput.sizedAutocomplete({
-          source: allTestCases,
-          classes: {
-            'ui-autocomplete': 'card autocomplete-dropdown'
-          },
-          parent: testCaseInput
-        });
-      }).always(function() {
-        wrapper.modal('open');
-      });
-    } else {
-      wrapper.modal('open');
-    }
-  }
-
-  /**
-   * Create a test acknowledgment object.
-   * @param key (String) The key associated with the acknowledgment.
-   * @param test (String) The test name in the acknowledgment.
-   * @param branches (list) The list of all branches in the acknowledgment.
-   * @param devices (Set) The list of all devoces in the acknowledgment.
-   * @param testCases (Set) The list of all test cases in the acknowledgment.
-   * @param note (String) The note in the acknowledgment.
-   */
-  function createAcknowledgment(key, test, branches, devices, testCases, note) {
-    var wrapper = $('<div class="col s12 ack-entry"></div>');
-    var details = $('<div class="col card hoverable"></div>').appendTo(wrapper);
-    details.addClass(_isReadOnly ? 's12' : 's11')
-    var testDiv = $('<div class="col s12"><b>' + test + '</b></div>').appendTo(details);
-    var infoBtn = $('<span class="info-icon right"></a>').appendTo(testDiv);
-    infoBtn.append('<i class="material-icons">info_outline</i>');
-    details.click(function() {
-      showModal(wrapper, key, test, branches, devices, testCases, note);
-    });
-    var branchesSummary = 'All';
-    if (!!branches && branches.length == 1) {
-      branchesSummary = branches[0];
-    } else if (!!branches && branches.length > 1) {
-      branchesSummary = branches[0];
-      branchesSummary += '<span class="count-indicator"> (+' + (branches.length - 1) + ')</span>';
-    }
-    $('<div class="col l4 s12"><b>Branches: </b>' + branchesSummary + '</div>').appendTo(details);
-    var devicesSummary = 'All';
-    if (!!devices && devices.length == 1) {
-      devicesSummary = devices[0];
-    } else if (!!devices && devices.length > 1) {
-      devicesSummary = devices[0];
-      devicesSummary += '<span class="count-indicator"> (+' + (devices.length - 1) + ')</span>';
-    }
-    $('<div class="col l4 s12"><b>Devices: </b>' + devicesSummary + '</div>').appendTo(details);
-    var testCaseSummary = 'All';
-    if (!!testCases && testCases.length == 1) {
-      testCaseSummary = testCases[0];
-    } else if (!!testCases && testCases.length > 1) {
-      testCaseSummary = testCases[0];
-      testCaseSummary += '<span class="count-indicator"> (+' + (testCases.length - 1) + ')</span>';
-    }
-    details.append('<div class="col l4  s12"><b>Test Cases: </b>' + testCaseSummary + '</div>');
-
-    if (!_isReadOnly) {
-      var btnContainer = $('<div class="col s1 center btn-container"></div>');
-
-      var clear = $('<a class="col s12 btn-flat remove-button"></a>');
-      clear.append('<i class="material-icons">clear</i>');
-      clear.attr('title', 'Remove');
-      clear.click(function() { removeAcknowledgment(wrapper, key); });
-      clear.appendTo(btnContainer);
-
-      btnContainer.appendTo(wrapper);
-    }
-    return wrapper;
-  }
-
-  /**
-   * Create a test acknowledgments UI.
-   * @param allTests (list) The list of all test names.
-   * @param allBranches (list) The list of all branches.
-   * @param allDevices (list) The list of all device names.
-   * @param testAcknowledgments (list) JSON-serialized TestAcknowledgmentEntity object list.
-   * @param readOnly (boolean) True if the acknowledgments are read-only, false if mutable.
-   */
-  $.fn.testAcknowledgments = function(
-      allTests, allBranches, allDevices, testAcknowledgments, readOnly) {
-    var self = $(this);
-    _allTestsSet = new Set(allTests);
-    _allBranches = allBranches;
-    _allDevices = allDevices;
-    _isReadOnly = readOnly;
-    var searchRow = $('<div class="search-row"></div>');
-    var headerRow = $('<div></div>');
-    var acks = $('<div class="acknowledgments"></div>');
-
-    if (!_isReadOnly) {
-      var inputWrapper = $('<div class="input-field col s8"></div>');
-      var input = $('<input type="text"></input>').appendTo(inputWrapper);
-      inputWrapper.append('<label>Search for tests to add an acknowledgment</label>');
-      inputWrapper.appendTo(searchRow);
-      input.sizedAutocomplete({
-        source: allTests,
-        classes: {
-          'ui-autocomplete': 'card autocomplete-dropdown'
-        },
-        parent: input
-      });
-
-      var btnWrapper = $('<div class="col s1"></div>');
-      var btn = $('<a class="btn waves-effect waves-light red btn-floating"></a>');
-      btn.append('<i class="material-icons">add</a>');
-      btn.appendTo(btnWrapper);
-      btnWrapper.appendTo(searchRow);
-      btn.click(function() {
-        if (!_allTestsSet.has(input.val())) return;
-        var ack = createAcknowledgment(undefined, input.val());
-        ack.hide().prependTo(acks);
-        showModal(ack, undefined, input.val());
-      });
-      searchRow.appendTo(self);
-    }
-
-    var headerCol = $('<div class="col s12 section-header-col"></div>').appendTo(headerRow);
-    if (_isReadOnly) {
-      headerCol.append('<p class="acknowledgment-info">' + _readOnlySummary + '</p>');
-    } else {
-      headerCol.append('<p class="acknowledgment-info">' + _writableSummary + '</p>');
-    }
-    headerRow.appendTo(self);
-
-    testAcknowledgments.forEach(function(ack) {
-      var wrapper = createAcknowledgment(
-        ack.key, ack.testName, ack.branches, ack.devices, ack.testCaseNames, ack.note);
-      wrapper.appendTo(acks);
-    });
-    acks.appendTo(self);
-
-    self.append('<div class="modal modal-fixed-footer acknowledgments-modal" id="modal"></div>');
-  };
-
-})(jQuery);
diff --git a/src/main/webapp/js/test_results.js b/src/main/webapp/js/test_results.js
deleted file mode 100644
index 24d4c0b..0000000
--- a/src/main/webapp/js/test_results.js
+++ /dev/null
@@ -1,349 +0,0 @@
-/**
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-(function($, moment) {
-
-/**
- * Display the log links in a modal window.
- * @param linkList A list of [name, url] tuples representing log links.
- */
-function showLinks(container, linkList) {
-  if (!linkList || linkList.length == 0) return;
-
-  var logCollection = $('<ul class="collection"></ul>');
-  var entries = linkList.reduce(function(acc, entry) {
-    if (!entry || entry.length == 0) return acc;
-    var link = '<a href="' + entry[1] + '"';
-    link += 'class="collection-item">' + entry[0] + '</li>';
-    return acc + link;
-  }, '');
-  logCollection.html(entries);
-
-  if (container.find('#info-modal').length == 0) {
-    var modal =
-        $('<div id="info-modal" class="modal modal-fixed-footer"></div>');
-    var content = $('<div class="modal-content"></div>');
-    content.append('<h4>Links</h4>');
-    content.append('<div class="info-container"></div>');
-    content.appendTo(modal);
-    var footer = $('<div class="modal-footer"></div>');
-    footer.append('<a class="btn-flat modal-close">Close</a></div>');
-    footer.appendTo(modal);
-    modal.appendTo(container);
-  }
-  var infoContainer = $('#info-modal>.modal-content>.info-container');
-  infoContainer.empty();
-  logCollection.appendTo(infoContainer);
-  $('#info-modal').modal({dismissible: true});
-  $('#info-modal').modal('open');
-}
-
-/**
- * Get the nickname for a test case result.
- *
- * Removes the result prefix and suffix, extracting only the result name.
- *
- * @param testCaseResult The string name of a VtsReportMessage.TestCaseResult.
- * @returns the string nickname of the result.
- */
-function getNickname(testCaseResult) {
-  return testCaseResult.replace('TEST_CASE_RESULT_', '')
-      .replace('_RESULT', '')
-      .trim()
-      .toLowerCase();
-}
-
-/**
- * Get the badge color from ratio value.
- *
- * @param the percentage value.
- * @returns the string of color for the badge.
- */
-function getBadgeColor(ratio) {
-  var color = "orange";
-  if (ratio <= 20) {
-    color = "red";
-  } else if (ratio >= 70) {
-    color = "green";
-  }
-  return color;
-}
-
-/**
- * Get the rounded value.
- *
- * @param the percentage value.
- * @returns the rounded value from percentage value.
- */
-function getRoundValue(ratio) {
-    return Math.round(ratio * 1000) / 10;
-}
-
-/**
- * Display test data in the body beneath a test run's metadata.
- * @param container The jquery object in which to insert the test metadata.
- * @param data The json object containing the columns to display.
- * @param lineHeight The height of each list element.
- */
-function displayTestDetails(container, data, lineHeight) {
-  var nCol = data.length;
-  var width = 's' + (12 / nCol);
-  test = container;
-  var maxLines = 0;
-  data.forEach(function(column, index) {
-    if (column.data == undefined || column.name == undefined) {
-      return;
-    }
-    var classes = 'col test-col grey lighten-5 ' + width;
-    if (index != nCol - 1) {
-      classes += ' bordered';
-    }
-    if (index == 0) {
-      classes += ' left-most';
-    }
-    if (index == nCol - 1) {
-      classes += ' right-most';
-    }
-    var colContainer = $('<div class="' + classes + '"></div>');
-    var col = $('<div class="test-case-container"></div>');
-    colContainer.appendTo(container);
-    var count = column.data.length;
-    var head = $('<h5 class="test-result-label white"></h5>')
-                   .text(getNickname(column.name))
-                   .appendTo(colContainer)
-                   .css('text-transform', 'capitalize');
-    $('<div class="indicator right center"></div>')
-        .text(count)
-        .addClass(column.name)
-        .appendTo(head);
-    col.appendTo(colContainer);
-    var list = $('<ul></ul>').appendTo(col);
-    column.data.forEach(function(testCase) {
-      $('<li></li>')
-          .text(testCase)
-          .addClass('test-case')
-          .css('font-size', lineHeight - 2)
-          .css('line-height', lineHeight + 'px')
-          .appendTo(list);
-    });
-    if (count > maxLines) {
-      maxLines = count;
-    }
-  });
-  var containers = container.find('.test-case-container');
-  containers.height(maxLines * lineHeight);
-}
-
-/**
- * Click handler for displaying test run details.
- * @param e The click event.
- */
-function testRunClick(e) {
-  var header = $(this);
-  var icon = header.find('.material-icons.expand-arrow');
-  var container = header.parent().find('.test-results');
-  var test = header.attr('test');
-  var time = header.attr('time');
-  var url = '/api/test_run?test=' + test + '&timestamp=' + time;
-  if (header.parent().hasClass('active')) {
-    header.parent().removeClass('active');
-    header.removeClass('active');
-    icon.removeClass('rotate');
-    header.siblings('.collapsible-body').stop(true, false).slideUp({
-      duration: 100,
-      easing: 'easeOutQuart',
-      queue: false,
-      complete: function() {
-        header.css('height', '');
-      }
-    });
-  } else {
-    container.empty();
-    header.parent().addClass('active');
-    header.addClass('active');
-    header.addClass('disabled');
-    icon.addClass('rotate');
-    $.get(url)
-        .done(function(data) {
-          displayTestDetails(container, data, 16);
-          header.siblings('.collapsible-body').stop(true, false).slideDown({
-            duration: 100,
-            easing: 'easeOutQuart',
-            queue: false,
-            complete: function() {
-              header.css('height', '');
-            }
-          });
-        })
-        .fail(function() {
-          icon.removeClass('rotate');
-        })
-        .always(function() {
-          header.removeClass('disabled');
-        });
-  }
-}
-
-/**
- * Append a clickable indicator link to the container.
- * @param container The jquery object to append the indicator to.
- * @param content The text to display in the indicator.
- * @param classes Additional space-delimited classes to add to the indicator.
- * @param click The click handler to assign to the indicator.
- * @returns The jquery object for the indicator.
- */
-function createClickableIndicator(container, content, classes, click) {
-  var link = $('<span></span>');
-  link.addClass('indicator badge padded hoverable waves-effect');
-  link.addClass(classes);
-  link.css('color', 'white');
-  link.css('margin-left', '1px');
-  link.append(content);
-  link.appendTo(container);
-  link.click(click);
-  return link;
-}
-
-function displayTestMetadata(container, metadataList, showTestNames = false) {
-  var popout = $('<ul></ul>');
-  popout.attr('data-collapsible', 'expandable');
-  popout.addClass('collapsible popout test-runs');
-  popout.appendTo(container);
-  popout.unbind();
-  metadataList.forEach(function(metadata) {
-    var li = $('<li class="test-run-container"></li>');
-    li.appendTo(popout);
-    var div = $('<div></div>');
-    var test = metadata.testRun.testName;
-    var startTime = metadata.testRun.startTimestamp;
-    var endTime = metadata.testRun.endTimestamp;
-    div.attr('test', test);
-    div.attr('time', startTime);
-    div.addClass('collapsible-header test-run');
-    div.appendTo(li);
-    div.unbind().click(testRunClick);
-    var span = $('<span></span>');
-    span.addClass('test-run-metadata');
-    span.appendTo(div);
-    span.click(function() {
-      return false;
-    });
-    if (showTestNames) {
-      $('<span class="test-run-label"></span>').text(test).appendTo(span);
-      span.append('<br>');
-    }
-    if (metadata.deviceInfo) {
-      $('<b></b>').text(metadata.deviceInfo).appendTo(span);
-      span.append('<br>');
-    }
-    if (metadata.abiInfo) {
-      $('<b></b>').text('ABI: ').appendTo(span)
-      span.append(metadata.abiInfo).append('<br>');
-    }
-    $('<b></b>').text('VTS Build: ').appendTo(span)
-    span.append(metadata.testRun.testBuildId).append('<br>');
-    $('<b></b>').text('Host: ').appendTo(span)
-    span.append(metadata.testRun.hostName).append('<br>');
-    var timeString =
-        (moment().renderTime(startTime, false) + ' - ' +
-         moment().renderTime(endTime, true) + ' (' +
-         moment().renderDuration(endTime - startTime) + ')');
-    span.append(timeString);
-    var indicator = $('<span></span>');
-    var color = metadata.testRun.failCount > 0 ? 'red' : 'green';
-    indicator.addClass('indicator badge ' + color);
-    indicator.css('color', 'white');
-    indicator.append(
-        metadata.testRun.passCount + '/' +
-        (metadata.testRun.passCount + metadata.testRun.failCount));
-    indicator.appendTo(div);
-    if (metadata.testRun.coveredLineCount != undefined &&
-        metadata.testRun.totalLineCount != undefined) {
-      var url = ('/show_coverage?testName=' + test + '&startTime=' + startTime);
-      var covered = metadata.testRun.coveredLineCount;
-      var total = metadata.testRun.totalLineCount;
-      var covPct = getRoundValue(covered / total);
-      var color = getBadgeColor(covPct);
-      var coverage =
-          ('Coverage: ' + covered + '/' + total + ' (' + covPct + '%)');
-      createClickableIndicator(div, coverage, color, function(evt) {
-        window.location.href = url;
-        return false;
-      });
-    }
-    if (metadata.testRun.coveredApiCount != undefined &&
-        metadata.testRun.totalApiCount != undefined) {
-      var covered = metadata.testRun.coveredApiCount;
-      var total = metadata.testRun.totalApiCount;
-      var covPct = getRoundValue(covered / total);
-      var color = getBadgeColor(covPct);
-      var apiCoverage = ('API Coverage: ' + covered + '/' + total + ' (' + covPct + '%)');
-      createClickableIndicator(div, apiCoverage, color, function(evt) {
-        $('#apiCoverageModal')
-            .data('urlSafeKeyList', metadata.testRun.apiCoverageKeyList);
-        $('#apiCoverageModal').modal('open');
-        return false;
-      });
-    }
-    if (metadata.testRun.logLinks != undefined) {
-      createClickableIndicator(div, 'Links', 'grey lighten-1', function() {
-        showLinks(popout, metadata.testRun.logLinks);
-        return false;
-      });
-    }
-    if ($('#coverageModalGraph').length) {
-      createClickableIndicator(div, 'Graph', 'grey lighten-1', function(evt) {
-        $('#coverageModalGraph').data('testname', test);
-        $('#coverageModalGraph').modal('open');
-        $(evt.target).removeClass('grey');
-        $(evt.target).addClass('blue');
-        return false;
-      });
-    }
-
-    var expand = $('<i></i>');
-    expand.addClass('material-icons expand-arrow')
-    expand.text('expand_more');
-    expand.appendTo(div);
-    var body = $('<div></div>')
-                   .addClass('collapsible-body test-results row')
-                   .appendTo(li);
-    if (metadata.testDetails != undefined) {
-      expand.addClass('rotate');
-      li.addClass('active');
-      div.addClass('active');
-      displayTestDetails(body, metadata.testDetails, 16);
-      div.siblings('.collapsible-body').stop(true, false).slideDown({
-        duration: 0,
-        queue: false,
-        complete: function() {
-          div.css('height', '');
-        }
-      });
-    }
-  });
-}
-
-/**
- * Display test metadata in a vertical popout.
- * @param container The jquery object in which to insert the test metadata.
- * @param metadataList The list of metadata objects to render on the display.
- * @param showTestNames True to label each entry with the test module name.
- */
-$.fn.showTests = function(metadataList, showTestNames = false) {
-  displayTestMetadata($(this), metadataList, showTestNames);
-}
-})(jQuery, moment);
diff --git a/src/main/webapp/js/time.js b/src/main/webapp/js/time.js
deleted file mode 100644
index 6178eda..0000000
--- a/src/main/webapp/js/time.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Copyright (c) 2017 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-(function (moment) {
-
-  /**
-   * Renders a timestamp in the user timezone.
-   * @param timestamp The long timestamp to render (in microseconds).
-   * @param showTimezone True if the timezone should be rendered, false otherwise.
-   * @returns the string-formatted version of the provided timestamp.
-   */
-  moment.prototype.renderTime = function (timestamp, showTimezone) {
-    var time = moment(timestamp / 1000);
-    var format = 'YYYY-M-DD H:mm:ss';
-    if (!!showTimezone) {
-        format = format + 'ZZ';
-    }
-    return time.format(format);
-  }
-
-  /**
-   * Renders a date in the user timezone.
-   * @param timestamp The long timestamp to render (in microseconds).
-   * @param showTimezone True if the timezone should be rendered, false otherwise.
-   * @returns the string-formatted version of the provided timestamp.
-   */
-  moment.prototype.renderDate = function (timestamp, showTimezone) {
-    var time = moment(timestamp / 1000);
-    var format = 'YYYY-M-DD';
-    if (!!showTimezone) {
-        format = format + 'ZZ';
-    }
-    return time.format(format);
-  }
-
-  /**
-   * Renders a duration in the user timezone.
-   * @param durationTimestamp The long duration to render (in microseconds).
-   * @returns the string-formatted duration of the provided duration timestamp.
-   */
-  moment.prototype.renderDuration = function (durationTimestamp) {
-    var fmt = 's[s]';
-    var duration = moment.utc(durationTimestamp / 1000);
-    if (duration.hours() > 0) {
-      fmt = 'H[h], m[m], ' + fmt;
-    } else if (duration.minutes() > 0) {
-      fmt = 'm[m], ' + fmt;
-    }
-    return duration.format(fmt);
-  }
-
-})(moment);
diff --git a/src/test/java/com/android/vts/api/CoverageRestServletTest.java b/src/test/java/com/android/vts/api/CoverageRestServletTest.java
deleted file mode 100644
index f900f79..0000000
--- a/src/test/java/com/android/vts/api/CoverageRestServletTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.api;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.when;
-import static com.googlecode.objectify.ObjectifyService.factory;
-
-import com.android.vts.entity.ApiCoverageEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.util.ObjectifyTestBase;
-import com.google.gson.Gson;
-import com.google.gson.internal.LinkedTreeMap;
-import com.googlecode.objectify.Key;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-import java.util.Arrays;
-import java.util.List;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.BeforeEach;
-import org.mockito.Mock;
-
-public class CoverageRestServletTest extends ObjectifyTestBase {
-
-    private Gson gson;
-
-    @Mock
-    private HttpServletRequest request;
-
-    @Mock
-    private HttpServletResponse response;
-
-    /** It be executed before each @Test method */
-    @BeforeEach
-    void setUpExtra() {
-        gson = new Gson();
-
-        /********
-        System.getenv().forEach((k,v) -> {
-            System.out.println("key => " + k);
-            System.out.println("value => " + v);
-        });
-         *********/
-    }
-
-    @Test
-    public void testApiData() throws IOException, ServletException {
-
-        factory().register(ApiCoverageEntity.class);
-
-        List<String> halApi = Arrays.asList("allocate", "dumpDebugInfo");
-        List<String> coveredHalApi = Arrays.asList("allocate", "dumpDebugInfo");
-
-        Key testParentKey = Key.create(TestEntity.class, "test1");
-        Key testRunParentKey = Key.create(testParentKey, TestRunEntity.class, 1);
-        ApiCoverageEntity apiCoverageEntity =
-                new ApiCoverageEntity(
-                        testRunParentKey,
-                        "android.hardware.graphics.allocator",
-                        4,
-                        1,
-                        "IAllocator",
-                        halApi,
-                        coveredHalApi);
-        apiCoverageEntity.save();
-
-        String key = apiCoverageEntity.getUrlSafeKey();
-
-        when(request.getPathInfo()).thenReturn("/api/data");
-
-        when(request.getParameter("key")).thenReturn(key);
-
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-
-        when(response.getWriter()).thenReturn(pw);
-
-        CoverageRestServlet coverageRestServlet = new CoverageRestServlet();
-        coverageRestServlet.doGet(request, response);
-        String result = sw.getBuffer().toString().trim();
-
-        LinkedTreeMap resultMap = gson.fromJson(result, LinkedTreeMap.class);
-
-        assertEquals(resultMap.get("halInterfaceName"), "IAllocator");
-        assertEquals(resultMap.get("halPackageName"), "android.hardware.graphics.allocator");
-        assertEquals(resultMap.get("halApi"), Arrays.asList("allocate", "dumpDebugInfo"));
-        assertEquals(resultMap.get("coveredHalApi"), Arrays.asList("allocate", "dumpDebugInfo"));
-
-    }
-
-}
diff --git a/src/test/java/com/android/vts/api/DataRestServletTest.java b/src/test/java/com/android/vts/api/DataRestServletTest.java
deleted file mode 100644
index b01c761..0000000
--- a/src/test/java/com/android/vts/api/DataRestServletTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.BranchEntity;
-import com.android.vts.entity.BuildTargetEntity;
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.util.ObjectifyTestBase;
-import com.google.gson.Gson;
-import com.googlecode.objectify.Key;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.Mock;
-import org.mockito.Spy;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.LinkedList;
-
-import static com.googlecode.objectify.ObjectifyService.factory;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.when;
-
-public class DataRestServletTest extends ObjectifyTestBase {
-
-    private Gson gson;
-
-    @Spy private DataRestServlet servlet;
-
-    @Mock private HttpServletRequest request;
-
-    @Mock private HttpServletResponse response;
-
-    /** It be executed before each @Test method */
-    @BeforeEach
-    void setUpExtra() {
-        gson = new Gson();
-
-        factory().register(TestEntity.class);
-        factory().register(TestRunEntity.class);
-        factory().register(BranchEntity.class);
-        factory().register(BuildTargetEntity.class);
-        factory().register(DeviceInfoEntity.class);
-
-        BranchEntity branchEntity1 = new BranchEntity("master");
-        branchEntity1.save();
-        BranchEntity branchEntity2 = new BranchEntity("pi");
-        branchEntity2.save();
-
-        BuildTargetEntity buildTargetEntity1 = new BuildTargetEntity("aosp_arm64_ab-userdebug");
-        buildTargetEntity1.save();
-        BuildTargetEntity buildTargetEntity2 = new BuildTargetEntity("sailfish-userdebug");
-        buildTargetEntity2.save();
-
-        Key testParentKey = Key.create(TestEntity.class, "test1");
-        Key testRunParentKey = Key.create(testParentKey, TestRunEntity.class, 1);
-        DeviceInfoEntity deviceInfoEntity1 =
-                new DeviceInfoEntity(
-                        testRunParentKey,
-                        "pi",
-                        "sailfish",
-                        "sailfish-userdebug",
-                        "4585723",
-                        "64",
-                        "arm64-v8a");
-        deviceInfoEntity1.setId(2384723984L);
-        deviceInfoEntity1.save();
-
-        DeviceInfoEntity deviceInfoEntity2 =
-                new DeviceInfoEntity(
-                        testRunParentKey,
-                        "master",
-                        "walleye",
-                        "aosp_arm64_ab-userdebug",
-                        "4585723",
-                        "64",
-                        "arm64-v8a");
-        deviceInfoEntity2.setId(2384723422L);
-        deviceInfoEntity2.save();
-    }
-
-    @Test
-    public void testBranchData() throws IOException, ServletException {
-
-        when(request.getPathInfo()).thenReturn("/branch");
-        when(request.getParameter("schKey")).thenReturn("*");
-
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-
-        when(response.getWriter()).thenReturn(pw);
-
-        servlet.doGet(request, response);
-        String result = sw.getBuffer().toString().trim();
-
-        LinkedList resultList = gson.fromJson(result, LinkedList.class);
-
-        assertEquals(resultList.size(), 2);
-        assertEquals(resultList.get(0), "master");
-        assertEquals(resultList.get(1), "pi");
-    }
-
-    @Test
-    public void testDeviceData() throws IOException, ServletException {
-
-        when(request.getPathInfo()).thenReturn("/device");
-        when(request.getParameter("schKey")).thenReturn("*");
-
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-
-        when(response.getWriter()).thenReturn(pw);
-
-        servlet.doGet(request, response);
-        String result = sw.getBuffer().toString().trim();
-
-        LinkedList resultList = gson.fromJson(result, LinkedList.class);
-
-        assertEquals(resultList.size(), 2);
-        assertEquals(resultList.get(0), "aosp_arm64_ab-userdebug");
-        assertEquals(resultList.get(1), "sailfish-userdebug");
-    }
-}
diff --git a/src/test/java/com/android/vts/api/VtsSpreadSheetSyncServletTest.java b/src/test/java/com/android/vts/api/VtsSpreadSheetSyncServletTest.java
deleted file mode 100644
index 661ea9e..0000000
--- a/src/test/java/com/android/vts/api/VtsSpreadSheetSyncServletTest.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.api;
-
-import com.android.vts.entity.ApiCoverageExcludedEntity;
-import com.android.vts.job.VtsSpreadSheetSyncServlet;
-import com.android.vts.util.ObjectifyTestBase;
-import com.google.api.client.extensions.appengine.datastore.AppEngineDataStoreFactory;
-import com.google.api.services.sheets.v4.SheetsScopes;
-import com.google.gson.Gson;
-import lombok.extern.slf4j.Slf4j;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.Mock;
-import org.mockito.Spy;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collections;
-import java.util.List;
-import java.util.Properties;
-
-import static com.googlecode.objectify.ObjectifyService.factory;
-import static com.googlecode.objectify.ObjectifyService.ofy;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.when;
-
-@Slf4j
-public class VtsSpreadSheetSyncServletTest extends ObjectifyTestBase {
-
-    private Gson gson;
-
-    @Spy private VtsSpreadSheetSyncServlet servlet;
-
-    @Mock private HttpServletRequest request;
-
-    @Mock private HttpServletResponse response;
-
-    @Mock private ServletContext context;
-
-    @Mock private ServletConfig servletConfig;
-
-    @Mock private ServletOutputStream outputStream;
-
-    private final AppEngineDataStoreFactory DATA_STORE_FACTORY = new AppEngineDataStoreFactory();
-
-    private final List<String> GOOGLE_API_SCOPES =
-            Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY);
-
-    /** It be executed before each @Test method */
-    @BeforeEach
-    void setUpExtra() {
-
-        factory().register(ApiCoverageExcludedEntity.class);
-
-        gson = new Gson();
-
-        Properties systemConfigProp = new Properties();
-
-        InputStream defaultInputStream =
-                VtsSpreadSheetSyncServletTest.class
-                        .getClassLoader()
-                        .getResourceAsStream("config.properties");
-
-        try {
-            systemConfigProp.load(defaultInputStream);
-        } catch (FileNotFoundException e) {
-            log.error(e.getMessage());
-        } catch (IOException e) {
-            log.error(e.getMessage());
-        }
-
-        when(request.getServletContext()).thenReturn(context);
-        when(request.getServletContext().getAttribute("dataStoreFactory"))
-                .thenReturn(DATA_STORE_FACTORY);
-        when(request.getServletContext().getAttribute("googleApiScopes"))
-                .thenReturn(GOOGLE_API_SCOPES);
-
-        when(servletConfig.getServletContext()).thenReturn(context);
-        when(servletConfig.getServletContext().getAttribute("systemConfigProp"))
-                .thenReturn(systemConfigProp);
-
-    }
-
-    @Test
-    public void testSyncServletJob() throws IOException, ServletException {
-
-        when(request.getPathInfo()).thenReturn("/cron/vts_spreadsheet_sync_job");
-
-        when(servlet.getServletConfig()).thenReturn(servletConfig);
-        when(response.getOutputStream()).thenReturn(outputStream);
-
-        servlet.init(servletConfig);
-        servlet.doGet(request, response);
-        String result = outputStream.toString().trim();
-
-        List<ApiCoverageExcludedEntity> apiCoverageExcludedEntityList =
-                ofy().load().type(ApiCoverageExcludedEntity.class).list();
-
-        assertEquals(apiCoverageExcludedEntityList.size(), 2);
-        assertEquals(apiCoverageExcludedEntityList.get(0).getApiName(), "getMasterMuteTest");
-        assertEquals(
-                apiCoverageExcludedEntityList.get(0).getPackageName(),
-                "android.hardware.audio.test");
-        assertEquals(apiCoverageExcludedEntityList.get(1).getApiName(), "getMasterVolumeTest");
-        assertEquals(
-                apiCoverageExcludedEntityList.get(1).getPackageName(),
-                "android.hardware.video.test");
-    }
-}
diff --git a/src/test/java/com/android/vts/entity/ApiCoverageExcludedEntityTest.java b/src/test/java/com/android/vts/entity/ApiCoverageExcludedEntityTest.java
deleted file mode 100644
index 40d3af9..0000000
--- a/src/test/java/com/android/vts/entity/ApiCoverageExcludedEntityTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.util.ObjectifyTestBase;
-import com.googlecode.objectify.Key;
-import org.junit.jupiter.api.Test;
-
-import static com.googlecode.objectify.ObjectifyService.factory;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class ApiCoverageExcludedEntityTest extends ObjectifyTestBase {
-
-    @Test
-    public void saveTest() {
-        factory().register(ApiCoverageExcludedEntity.class);
-
-        String packageName = "android.hardware.audio";
-        String apiName = "createTestPatch";
-        String version = "2.1";
-        ApiCoverageExcludedEntity apiCoverageExcludedEntity =
-                new ApiCoverageExcludedEntity(
-                        packageName, version, "IDevice", apiName, "not testable");
-        apiCoverageExcludedEntity.save();
-
-        assertEquals(apiCoverageExcludedEntity.getPackageName(), packageName);
-        assertEquals(apiCoverageExcludedEntity.getApiName(), apiName);
-        assertEquals(apiCoverageExcludedEntity.getMajorVersion(), 2);
-        assertEquals(apiCoverageExcludedEntity.getMinorVersion(), 1);
-    }
-
-    @Test
-    public void getUrlSafeKeyTest() {
-        factory().register(CodeCoverageEntity.class);
-        factory().register(ApiCoverageExcludedEntity.class);
-
-        Key testParentKey = Key.create(TestEntity.class, "test1");
-        Key testRunParentKey = Key.create(testParentKey, TestRunEntity.class, 1);
-
-        CodeCoverageEntity codeCoverageEntity =
-                new CodeCoverageEntity(testRunParentKey, 1000, 3500);
-        codeCoverageEntity.save();
-
-        String urlKey =
-                "kind%3A+%22Test%22%0A++name%3A+%22test1%22%0A%7D%0Apath+%7B%0A++kind%3A+%22TestRun%22%0A++id%3A+1%0A%7D%0Apath+%7B%0A++kind%3A+%22CodeCoverage%22%0A++id%3A+1%0A%7D%0A";
-        assertTrue(codeCoverageEntity.getUrlSafeKey().endsWith(urlKey));
-    }
-}
diff --git a/src/test/java/com/android/vts/entity/CodeCoverageEntityTest.java b/src/test/java/com/android/vts/entity/CodeCoverageEntityTest.java
deleted file mode 100644
index 06cad28..0000000
--- a/src/test/java/com/android/vts/entity/CodeCoverageEntityTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.util.ObjectifyTestBase;
-import com.googlecode.objectify.Key;
-import org.junit.jupiter.api.Test;
-
-
-import static com.googlecode.objectify.ObjectifyService.factory;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class CodeCoverageEntityTest extends ObjectifyTestBase {
-
-    @Test
-    public void saveTest() {
-        factory().register(CodeCoverageEntity.class);
-
-        Key testParentKey = Key.create(TestEntity.class, "test1");
-        Key testRunParentKey = Key.create(testParentKey, TestRunEntity.class, 1);
-
-        CodeCoverageEntity codeCoverageEntity = new CodeCoverageEntity(testRunParentKey, 1000, 3500);
-        codeCoverageEntity.save();
-
-        assertEquals(codeCoverageEntity.getCoveredLineCount(), 1000);
-        assertEquals(codeCoverageEntity.getTotalLineCount(), 3500);
-    }
-
-    @Test
-    public void getUrlSafeKeyTest() {
-        factory().register(CodeCoverageEntity.class);
-
-        Key testParentKey = Key.create(TestEntity.class, "test1");
-        Key testRunParentKey = Key.create(testParentKey, TestRunEntity.class, 1);
-
-        CodeCoverageEntity codeCoverageEntity = new CodeCoverageEntity(testRunParentKey, 1000, 3500);
-        codeCoverageEntity.save();
-
-        String urlKey =
-                "kind%3A+%22Test%22%0A++name%3A+%22test1%22%0A%7D%0Apath+%7B%0A++kind%3A+%22TestRun%22%0A++id%3A+1%0A%7D%0Apath+%7B%0A++kind%3A+%22CodeCoverage%22%0A++id%3A+1%0A%7D%0A";
-        assertTrue(codeCoverageEntity.getUrlSafeKey().endsWith(urlKey));
-    }
-
-}
diff --git a/src/test/java/com/android/vts/entity/CodeCoverageFileEntityTest.java b/src/test/java/com/android/vts/entity/CodeCoverageFileEntityTest.java
deleted file mode 100644
index 5c944b2..0000000
--- a/src/test/java/com/android/vts/entity/CodeCoverageFileEntityTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.util.ObjectifyTestBase;
-import com.googlecode.objectify.Key;
-import org.junit.jupiter.api.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
-import static com.googlecode.objectify.ObjectifyService.factory;
-import static com.googlecode.objectify.ObjectifyService.ofy;
-import static org.junit.Assert.assertEquals;
-
-public class CodeCoverageFileEntityTest extends ObjectifyTestBase {
-
-    @Test
-    public void saveTest() {
-
-        factory().register(CodeCoverageFileEntity.class);
-
-        Key testParentKey = Key.create(TestEntity.class, "test1");
-        Key testRunParentKey = Key.create(testParentKey, TestRunEntity.class, 1);
-
-        List<Long> lineCoverage = Arrays.asList(-1L, -1L, -1L, 4L, 2L, 0L);
-        CodeCoverageFileEntity codeCoverageFileEntity = new CodeCoverageFileEntity(
-                10000,
-                testRunParentKey,
-                "audio/12.0/DevicesFile.h",
-                "",
-                lineCoverage,
-                10020,
-                40030,
-                "platform/hardware/interfaces",
-                "e8d6e9385a64b742ad1952c6d9");
-        codeCoverageFileEntity.save();
-
-        CodeCoverageFileEntity loadCodeCoverageFileEntity = ofy().load().type(CodeCoverageFileEntity.class).first().now();
-
-        assertEquals(loadCodeCoverageFileEntity, codeCoverageFileEntity);
-    }
-
-}
diff --git a/src/test/java/com/android/vts/entity/TestAcknowledgmentEntityTest.java b/src/test/java/com/android/vts/entity/TestAcknowledgmentEntityTest.java
deleted file mode 100644
index 8ed68b6..0000000
--- a/src/test/java/com/android/vts/entity/TestAcknowledgmentEntityTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.entity;
-
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Text;
-import com.google.appengine.api.users.User;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
-import com.google.appengine.tools.development.testing.LocalUserServiceTestConfig;
-import com.google.gson.JsonObject;
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestAcknowledgmentEntityTest {
-    private final LocalServiceTestHelper helper =
-            new LocalServiceTestHelper(new LocalUserServiceTestConfig())
-                    .setEnvIsAdmin(true)
-                    .setEnvIsLoggedIn(true)
-                    .setEnvEmail("testemail@domain.com")
-                    .setEnvAuthDomain("test");
-
-    @Before
-    public void setUp() {
-        helper.setUp();
-    }
-
-    @After
-    public void tearDown() {
-        helper.tearDown();
-    }
-
-    /** Test serialization to/from Entity objects. */
-    @Test
-    public void testEntitySerialization() {
-        Key key = KeyFactory.createKey(TestEntity.KIND, "test");
-        User user = UserServiceFactory.getUserService().getCurrentUser();
-        List<String> branches = new ArrayList<>();
-        branches.add("branch1");
-        List<String> devices = new ArrayList<>();
-        devices.add("device1");
-        List<String> testCaseNames = new ArrayList<>();
-        testCaseNames.add("testCase1");
-        Text note = new Text("note");
-        TestAcknowledgmentEntity ack =
-                new TestAcknowledgmentEntity(key, user, branches, devices, testCaseNames, note);
-        Entity e = ack.toEntity();
-
-        Assert.assertNotNull(e);
-        Assert.assertEquals(key, e.getProperty(TestAcknowledgmentEntity.TEST_KEY));
-        Assert.assertEquals(user, e.getProperty(TestAcknowledgmentEntity.USER_OBJ));
-        Assert.assertTrue(
-                ((List<String>) e.getProperty(TestAcknowledgmentEntity.BRANCHES))
-                        .containsAll(branches));
-        Assert.assertTrue(
-                ((List<String>) e.getProperty(TestAcknowledgmentEntity.DEVICES))
-                        .containsAll(devices));
-        Assert.assertTrue(
-                ((List<String>) e.getProperty(TestAcknowledgmentEntity.TEST_CASE_NAMES))
-                        .containsAll(testCaseNames));
-        Assert.assertEquals(note, e.getProperty(TestAcknowledgmentEntity.NOTE));
-
-        TestAcknowledgmentEntity deserialized = TestAcknowledgmentEntity.fromEntity(e);
-        Assert.assertNotNull(deserialized);
-        Assert.assertEquals(key, deserialized.test);
-        Assert.assertEquals(user, deserialized.getUserObj());
-        Assert.assertTrue(deserialized.getBranches().containsAll(branches));
-        Assert.assertTrue(deserialized.getDevices().containsAll(devices));
-        Assert.assertTrue(deserialized.getTestCaseNames().containsAll(testCaseNames));
-        Assert.assertEquals(note.getValue(), deserialized.getNote());
-    }
-
-    /** Test serialization to/from Entity objects when optional parameters are null. */
-    @Test
-    public void testEntitySerializationWithNulls() {
-        Key key = KeyFactory.createKey(TestEntity.KIND, "test");
-        User user = UserServiceFactory.getUserService().getCurrentUser();
-        TestAcknowledgmentEntity ack =
-                new TestAcknowledgmentEntity(key, user, null, null, null, null);
-        Entity e = ack.toEntity();
-
-        Assert.assertNotNull(e);
-        Assert.assertEquals(key, e.getProperty(TestAcknowledgmentEntity.TEST_KEY));
-        Assert.assertEquals(user, e.getProperty(TestAcknowledgmentEntity.USER_OBJ));
-        Assert.assertFalse(e.hasProperty(TestAcknowledgmentEntity.BRANCHES));
-        Assert.assertFalse(e.hasProperty(TestAcknowledgmentEntity.DEVICES));
-        Assert.assertFalse(e.hasProperty(TestAcknowledgmentEntity.TEST_CASE_NAMES));
-        Assert.assertFalse(e.hasProperty(TestAcknowledgmentEntity.NOTE));
-
-        TestAcknowledgmentEntity deserialized = TestAcknowledgmentEntity.fromEntity(e);
-        Assert.assertNotNull(deserialized);
-        Assert.assertEquals(key, deserialized.test);
-        Assert.assertEquals(user, deserialized.getUserObj());
-        Assert.assertEquals(0, deserialized.getBranches().size());
-        Assert.assertEquals(0, deserialized.getDevices().size());
-        Assert.assertEquals(0, deserialized.getTestCaseNames().size());
-        Assert.assertNull(deserialized.getNote());
-    }
-
-    /** Test serialization to/from Json objects. */
-    @Test
-    public void testJsonSerialization() {
-        Key key = KeyFactory.createKey(TestEntity.KIND, "test");
-        User user = UserServiceFactory.getUserService().getCurrentUser();
-        List<String> branches = new ArrayList<>();
-        branches.add("branch1");
-        List<String> devices = new ArrayList<>();
-        devices.add("device1");
-        List<String> testCaseNames = new ArrayList<>();
-        testCaseNames.add("testCase1");
-        Text note = new Text("note");
-        TestAcknowledgmentEntity ack =
-                new TestAcknowledgmentEntity(key, user, branches, devices, testCaseNames, note);
-        Entity e = new Entity(KeyFactory.createKey(TestAcknowledgmentEntity.KIND, "fakekey"));
-        e.setPropertiesFrom(ack.toEntity());
-        JsonObject json = TestAcknowledgmentEntity.fromEntity(e).toJson();
-
-        TestAcknowledgmentEntity deserialized = TestAcknowledgmentEntity.fromJson(user, json);
-        Assert.assertNotNull(deserialized);
-        Assert.assertEquals(key, deserialized.test);
-        Assert.assertEquals(user, deserialized.getUserObj());
-        Assert.assertTrue(deserialized.getBranches().containsAll(branches));
-        Assert.assertTrue(deserialized.getDevices().containsAll(devices));
-        Assert.assertTrue(deserialized.getTestCaseNames().containsAll(testCaseNames));
-        Assert.assertEquals(note.getValue(), deserialized.getNote());
-    }
-
-    /** Test serialization to/from Json objects when optional properties are null. */
-    @Test
-    public void testJsonSerializationWithNulls() {
-        Key key = KeyFactory.createKey(TestEntity.KIND, "test");
-        User user = UserServiceFactory.getUserService().getCurrentUser();
-        TestAcknowledgmentEntity ack =
-                new TestAcknowledgmentEntity(key, user, null, null, null, null);
-        Entity e = new Entity(KeyFactory.createKey(TestAcknowledgmentEntity.KIND, "fakekey"));
-        e.setPropertiesFrom(ack.toEntity());
-        JsonObject json = TestAcknowledgmentEntity.fromEntity(e).toJson();
-
-        TestAcknowledgmentEntity deserialized = TestAcknowledgmentEntity.fromJson(user, json);
-        Assert.assertNotNull(deserialized);
-        Assert.assertEquals(key, deserialized.test);
-        Assert.assertEquals(user, deserialized.getUserObj());
-        Assert.assertEquals(0, deserialized.getBranches().size());
-        Assert.assertEquals(0, deserialized.getDevices().size());
-        Assert.assertEquals(0, deserialized.getTestCaseNames().size());
-        Assert.assertEquals("", deserialized.getNote());
-    }
-}
diff --git a/src/test/java/com/android/vts/entity/TestCaseRunEntityTest.java b/src/test/java/com/android/vts/entity/TestCaseRunEntityTest.java
deleted file mode 100644
index d4abd38..0000000
--- a/src/test/java/com/android/vts/entity/TestCaseRunEntityTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.entity;
-
-import com.android.vts.util.ObjectifyTestBase;
-import org.junit.jupiter.api.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
-import static com.googlecode.objectify.ObjectifyService.factory;
-import static org.junit.Assert.assertEquals;
-
-public class TestCaseRunEntityTest extends ObjectifyTestBase {
-
-    @Test
-    public void saveTest() {
-
-        factory().register(TestCaseRunEntity.class);
-
-        List<Integer> results = Arrays.asList(1, 1, 1, 1, 1, 1, 1);
-        List<String> testCaseNames =
-                Arrays.asList(
-                        "AudioEffectsFactoryTest.EnumerateEffects(default)_32bit",
-                        "AudioEffectsFactoryTest.CreateEffect(default)_32bit",
-                        "AudioEffectsFactoryTest.GetDescriptor(default)_32bit",
-                        "AudioEffectsFactoryTest.DebugDumpArgument(default)_32bit",
-                        "AudioEffectTest.Close(default)_32bit",
-                        "AudioEffectTest.GetDescriptor(default)_32bit",
-                        "AudioEffectTest.GetSetConfig(default)_32bit");
-
-        TestCaseRunEntity testCaseRunEntity = new TestCaseRunEntity();
-        for (int index = 0; index < results.size(); index++) {
-            String testCaseName = testCaseNames.get(index);
-            int result = results.get(index);
-            testCaseRunEntity.addTestCase(testCaseName, result);
-        }
-        TestCaseRunEntity loadedTestCaseRunEntity = saveClearLoad(testCaseRunEntity);
-
-        assertEquals(loadedTestCaseRunEntity.getTestCases().size(), results.size());
-        assertEquals(
-                (Integer) loadedTestCaseRunEntity.getTestCases().get(0).result, results.get(0));
-        assertEquals(loadedTestCaseRunEntity.getTestCases().get(0).name, testCaseNames.get(0));
-    }
-}
diff --git a/src/test/java/com/android/vts/job/VtsAlertJobServletTest.java b/src/test/java/com/android/vts/job/VtsAlertJobServletTest.java
deleted file mode 100644
index 9c24c65..0000000
--- a/src/test/java/com/android/vts/job/VtsAlertJobServletTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.job;
-
-import static com.googlecode.objectify.ObjectifyService.factory;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.TestAcknowledgmentEntity;
-import com.android.vts.util.ObjectifyTestBase;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.users.User;
-import com.google.appengine.api.users.UserServiceFactory;
-import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
-import com.google.appengine.tools.development.testing.LocalUserServiceTestConfig;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.BeforeEach;
-
-public class VtsAlertJobServletTest extends ObjectifyTestBase {
-    private final LocalServiceTestHelper userHelper =
-            new LocalServiceTestHelper(new LocalUserServiceTestConfig())
-                    .setEnvIsAdmin(true)
-                    .setEnvIsLoggedIn(true)
-                    .setEnvEmail("testemail@domain.com")
-                    .setEnvAuthDomain("test");
-
-    User user;
-    private Key testKey;
-    private Set<String> allTestCases;
-    private List<DeviceInfoEntity> allDevices;
-
-    @BeforeEach
-    void setUpExtra() {
-        factory().register(DeviceInfoEntity.class);
-        factory().register(TestAcknowledgmentEntity.class);
-
-        userHelper.setUp();
-        user = UserServiceFactory.getUserService().getCurrentUser();
-
-        testKey = KeyFactory.createKey(TestAcknowledgmentEntity.KIND, "test");
-
-        allTestCases = new HashSet<>();
-        allTestCases.add("testCase1");
-        allTestCases.add("testCase2");
-        allTestCases.add("testCase3");
-
-        allDevices = new ArrayList<>();
-        DeviceInfoEntity device1 =
-                new DeviceInfoEntity(
-                        testKey, "branch1", "product1", "flavor1", "1234", "32", "abi");
-        DeviceInfoEntity device2 =
-                new DeviceInfoEntity(
-                        testKey, "branch2", "product2", "flavor2", "1235", "32", "abi");
-        allDevices.add(device1);
-        allDevices.add(device2);
-    }
-
-    @AfterEach
-    public void tearDown() {
-        userHelper.tearDown();
-    }
-
-    /** Test that acknowledge-all works correctly. */
-    @Test
-    public void testSeparateAcknowledgedAll() {
-
-        Set<String> testCases = new HashSet<>(allTestCases);
-        List<TestAcknowledgmentEntity> acks = new ArrayList<>();
-        TestAcknowledgmentEntity ack =
-                new TestAcknowledgmentEntity(testKey, user, null, null, null, null);
-        acks.add(ack);
-
-        Set<String> acknowledged =
-                VtsAlertJobServlet.separateAcknowledged(testCases, allDevices, acks);
-        assertEquals(allTestCases.size(), acknowledged.size());
-        assertTrue(acknowledged.containsAll(allTestCases));
-        assertEquals(0, testCases.size());
-    }
-
-    /** Test that specific branch/device/test case acknowledgement works correctly. */
-    @Test
-    public void testSeparateAcknowledgedSpecific() {
-
-        Set<String> testCases = new HashSet<>(allTestCases);
-        List<TestAcknowledgmentEntity> acks = new ArrayList<>();
-        List<String> branches = new ArrayList<>();
-        branches.add("branch1");
-
-        List<String> devices = new ArrayList<>();
-        devices.add("flavor2");
-
-        List<String> testCaseNames = new ArrayList<>();
-        testCaseNames.add("testCase1");
-
-        TestAcknowledgmentEntity ack =
-                new TestAcknowledgmentEntity(
-                        testKey, user, branches, devices, testCaseNames, null);
-        acks.add(ack);
-
-        Set<String> acknowledged =
-                VtsAlertJobServlet.separateAcknowledged(testCases, allDevices, acks);
-        assertEquals(0, acknowledged.size());
-        assertEquals(allTestCases.size(), testCases.size());
-    }
-
-    /** Test that specific branch/device/test case acknowledgement skips device mismatches. */
-    @Test
-    public void testSeparateAcknowledgedSpecificMismatch() {
-
-        Set<String> testCases = new HashSet<>(allTestCases);
-        List<TestAcknowledgmentEntity> acks = new ArrayList<>();
-        List<String> branches = new ArrayList<>();
-        branches.add("branch1");
-
-        List<String> devices = new ArrayList<>();
-        devices.add("flavor1");
-
-        List<String> testCaseNames = new ArrayList<>();
-        testCaseNames.add("testCase1");
-
-        TestAcknowledgmentEntity ack =
-                new TestAcknowledgmentEntity(
-                        testKey, user, branches, devices, testCaseNames, null);
-        acks.add(ack);
-
-        Set<String> acknowledged =
-                VtsAlertJobServlet.separateAcknowledged(testCases, allDevices, acks);
-        assertEquals(1, acknowledged.size());
-        assertTrue(acknowledged.contains("testCase1"));
-        assertTrue(!testCases.contains("testCase1"));
-    }
-}
diff --git a/src/test/java/com/android/vts/job/VtsPerformanceJobServletTest.java b/src/test/java/com/android/vts/job/VtsPerformanceJobServletTest.java
deleted file mode 100644
index 814ab3a..0000000
--- a/src/test/java/com/android/vts/job/VtsPerformanceJobServletTest.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.job;
-
-import static org.junit.Assert.assertEquals;
-
-import com.android.vts.entity.ProfilingPointEntity;
-import com.android.vts.entity.ProfilingPointSummaryEntity;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.android.vts.util.ObjectifyTestBase;
-import com.android.vts.util.PerformanceSummary;
-import com.android.vts.util.ProfilingPointSummary;
-import com.android.vts.util.StatSummary;
-import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
-import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-
-public class VtsPerformanceJobServletTest extends ObjectifyTestBase {
-    private final LocalServiceTestHelper helper =
-            new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
-
-    private static final String LABEL = "testLabel";
-    private static final String ROOT = "src/test/resources/servlet";
-    private static final String[] LABELS = new String[] {"label1", "label2", "label3"};
-    private static final long[] HIGH_VALS = new long[] {10, 20, 30};
-    private static final long[] LOW_VALS = new long[] {1, 2, 3};
-
-    List<PerformanceSummary> dailySummaries;
-    List<String> legendLabels;
-
-    /**
-     * Helper method for creating ProfilingPointSummaryEntity objects.
-     *
-     * @param labels The list of data labels.
-     * @param values The list of data values. Must be equal in size to the labels list.
-     * @param regressionMode The regression mode.
-     * @return A ProfilingPointSummaryEntity with specified data.
-     */
-    private static ProfilingPointSummaryEntity createProfilingReport(
-            String[] labels, long[] values, VtsProfilingRegressionMode regressionMode) {
-        List<String> labelList = Arrays.asList(labels);
-        StatSummary globalStats = new StatSummary("global", regressionMode);
-        Map<String, StatSummary> labelStats = new HashMap<>();
-        for (int i = 0; i < labels.length; ++i) {
-            StatSummary stat = new StatSummary(labels[i], regressionMode);
-            stat.updateStats(values[i]);
-            labelStats.put(labels[i], stat);
-            globalStats.updateStats(values[i]);
-        }
-        return new ProfilingPointSummaryEntity(
-                ProfilingPointEntity.createKey("test", "pp"),
-                globalStats,
-                labelList,
-                labelStats,
-                "branch",
-                "build",
-                null,
-                0);
-    }
-
-    /** Asserts whether text is the same as the contents in the baseline file specified. */
-    private static void compareToBaseline(String text, String baselineFilename)
-            throws FileNotFoundException, IOException {
-        File f = new File(ROOT, baselineFilename);
-        String baseline = "";
-        try (BufferedReader br = new BufferedReader(new FileReader(f))) {
-            StringBuilder sb = new StringBuilder();
-            String line = br.readLine();
-
-            while (line != null) {
-                sb.append(line);
-                line = br.readLine();
-            }
-            baseline = sb.toString();
-        }
-        assertEquals(baseline, text);
-    }
-
-    @BeforeEach
-    public void setUp() {
-        helper.setUp();
-    }
-
-    @AfterEach
-    public void tearDown() {
-        helper.tearDown();
-    }
-
-    public void setUp(boolean grouped) {
-        dailySummaries = new ArrayList<>();
-        legendLabels = new ArrayList<>();
-        legendLabels.add("");
-
-        // Add today's data
-        PerformanceSummary today = new PerformanceSummary(0, 1);
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        ProfilingPointSummary summary = new ProfilingPointSummary("", "", mode);
-        ProfilingPointSummaryEntity pt = createProfilingReport(LABELS, HIGH_VALS, mode);
-        if (grouped) {
-            summary.updateLabel(pt, LABEL);
-            summary.updateLabel(pt, LABEL);
-        } else {
-            summary.update(pt);
-            summary.update(pt);
-        }
-        today.insertProfilingPointSummary("p1", summary);
-
-        mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING;
-        summary = new ProfilingPointSummary("", "", mode);
-        pt = createProfilingReport(LABELS, LOW_VALS, mode);
-        if (grouped) {
-            summary.updateLabel(pt, LABEL);
-            summary.updateLabel(pt, LABEL);
-        } else {
-            summary.update(pt);
-            summary.update(pt);
-        }
-        today.insertProfilingPointSummary("p2", summary);
-        dailySummaries.add(today);
-        legendLabels.add("today");
-
-        // Add yesterday data with regressions
-        PerformanceSummary yesterday = new PerformanceSummary(0, 1);
-        mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        summary = new ProfilingPointSummary("", "", mode);
-        pt = createProfilingReport(LABELS, LOW_VALS, mode);
-        if (grouped) {
-            summary.updateLabel(pt, LABEL);
-            summary.updateLabel(pt, LABEL);
-        } else {
-            summary.update(pt);
-            summary.update(pt);
-        }
-        yesterday.insertProfilingPointSummary("p1", summary);
-
-        mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING;
-        summary = new ProfilingPointSummary("x", "y", mode);
-        pt = createProfilingReport(LABELS, HIGH_VALS, mode);
-        if (grouped) {
-            summary.updateLabel(pt, LABEL);
-            summary.updateLabel(pt, LABEL);
-        } else {
-            summary.update(pt);
-            summary.update(pt);
-        }
-        yesterday.insertProfilingPointSummary("p2", summary);
-        dailySummaries.add(yesterday);
-        legendLabels.add("yesterday");
-
-        // Add last week data without regressions
-        PerformanceSummary lastWeek = new PerformanceSummary(0, 1);
-        mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        summary = new ProfilingPointSummary("", "", mode);
-        pt = createProfilingReport(LABELS, HIGH_VALS, mode);
-        summary.update(pt);
-        summary.update(pt);
-        lastWeek.insertProfilingPointSummary("p1", summary);
-
-        mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING;
-        summary = new ProfilingPointSummary("", "", mode);
-        pt = createProfilingReport(LABELS, LOW_VALS, mode);
-        summary.update(pt);
-        summary.update(pt);
-        lastWeek.insertProfilingPointSummary("p2", summary);
-        dailySummaries.add(lastWeek);
-        legendLabels.add("last week");
-    }
-
-    /**
-     * End-to-end test of performance report in the normal case. The normal case is when a profiling
-     * point is added or removed from the test.
-     */
-    @Test
-    public void testPerformanceSummaryNormal() throws FileNotFoundException, IOException {
-        setUp(false);
-        String output =
-                VtsPerformanceJobServlet.getPerformanceSummary(
-                        "test", dailySummaries, legendLabels);
-        compareToBaseline(output, "performanceSummary1.html");
-    }
-
-    /**
-     * End-to-end test of performance report when a profiling point was removed in the latest run.
-     */
-    @Test
-    public void testPerformanceSummaryDroppedProfilingPoint()
-            throws FileNotFoundException, IOException {
-        setUp(false);
-        PerformanceSummary yesterday = dailySummaries.get(dailySummaries.size() - 1);
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        ProfilingPointSummary summary = new ProfilingPointSummary("x", "y", mode);
-        ProfilingPointSummaryEntity pt = createProfilingReport(LABELS, HIGH_VALS, mode);
-        summary.update(pt);
-        summary.update(pt);
-        yesterday.insertProfilingPointSummary("p3", summary);
-        String output =
-                VtsPerformanceJobServlet.getPerformanceSummary(
-                        "test", dailySummaries, legendLabels);
-        compareToBaseline(output, "performanceSummary2.html");
-    }
-
-    /** End-to-end test of performance report when a profiling point was added in the latest run. */
-    @Test
-    public void testPerformanceSummaryAddedProfilingPoint()
-            throws FileNotFoundException, IOException {
-        setUp(false);
-        PerformanceSummary today = dailySummaries.get(0);
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        ProfilingPointSummary summary = new ProfilingPointSummary("", "", mode);
-        ProfilingPointSummaryEntity pt = createProfilingReport(LABELS, HIGH_VALS, mode);
-        summary.update(pt);
-        summary.update(pt);
-        today.insertProfilingPointSummary("p3", summary);
-        String output =
-                VtsPerformanceJobServlet.getPerformanceSummary(
-                        "test", dailySummaries, legendLabels);
-        compareToBaseline(output, "performanceSummary3.html");
-    }
-
-    /**
-     * End-to-end test of performance report labels are grouped (e.g. as if using unlabeled data)
-     */
-    @Test
-    public void testPerformanceSummaryGroupedNormal() throws FileNotFoundException, IOException {
-        setUp(true);
-        String output =
-                VtsPerformanceJobServlet.getPerformanceSummary(
-                        "test", dailySummaries, legendLabels);
-        compareToBaseline(output, "performanceSummary4.html");
-    }
-}
diff --git a/src/test/java/com/android/vts/job/VtsProfilingStatsJobServletTest.java b/src/test/java/com/android/vts/job/VtsProfilingStatsJobServletTest.java
deleted file mode 100644
index 36637a3..0000000
--- a/src/test/java/com/android/vts/job/VtsProfilingStatsJobServletTest.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.job;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import com.android.vts.entity.DeviceInfoEntity;
-import com.android.vts.entity.ProfilingPointEntity;
-import com.android.vts.entity.ProfilingPointRunEntity;
-import com.android.vts.entity.ProfilingPointSummaryEntity;
-import com.android.vts.entity.TestEntity;
-import com.android.vts.entity.TestRunEntity;
-import com.android.vts.proto.VtsReportMessage;
-import com.android.vts.util.ObjectifyTestBase;
-import com.android.vts.util.StatSummary;
-import com.android.vts.util.TimeUtil;
-import com.google.appengine.api.datastore.DatastoreService;
-import com.google.appengine.api.datastore.DatastoreServiceFactory;
-import com.google.appengine.api.datastore.Entity;
-import com.google.appengine.api.datastore.EntityNotFoundException;
-import com.google.appengine.api.datastore.Key;
-import com.google.appengine.api.datastore.KeyFactory;
-import com.google.appengine.api.datastore.Query;
-import com.google.appengine.api.taskqueue.dev.LocalTaskQueue;
-import com.google.appengine.api.taskqueue.dev.QueueStateInfo;
-import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
-import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
-import com.google.appengine.tools.development.testing.LocalTaskQueueTestConfig;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.Month;
-import java.time.ZonedDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import org.apache.commons.math3.stat.descriptive.moment.Mean;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-
-public class VtsProfilingStatsJobServletTest extends ObjectifyTestBase {
-    private final LocalServiceTestHelper helper =
-            new LocalServiceTestHelper(
-                    new LocalDatastoreServiceTestConfig(),
-                    new LocalTaskQueueTestConfig()
-                            .setQueueXmlPath("src/main/webapp/WEB-INF/queue.xml"));
-    private static final double THRESHOLD = 1e-10;
-
-    @BeforeEach
-    public void setUp() {
-        helper.setUp();
-    }
-
-    @AfterEach
-    public void tearDown() {
-        helper.tearDown();
-    }
-
-    private static void createProfilingRun() {
-        Date d = new Date();
-        long time = TimeUnit.MILLISECONDS.toMicros(d.getTime());
-        long canonicalTime = VtsProfilingStatsJobServlet.getCanonicalTime(time);
-        String test = "test";
-        String profilingPointName = "profilingPoint";
-        String xLabel = "xLabel";
-        String yLabel = "yLabel";
-        VtsReportMessage.VtsProfilingType type =
-                VtsReportMessage.VtsProfilingType.VTS_PROFILING_TYPE_UNLABELED_VECTOR;
-        VtsReportMessage.VtsProfilingRegressionMode mode =
-                VtsReportMessage.VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, test);
-        Key testRunKey = KeyFactory.createKey(testKey, TestRunEntity.KIND, time);
-        Long[] valueArray = new Long[] {1l, 2l, 3l, 4l, 5l};
-        StatSummary stats =
-                new StatSummary(
-                        "expected",
-                        VtsReportMessage.VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE);
-        for (long value : valueArray) {
-            stats.updateStats(value);
-        }
-        Mean mean = new Mean();
-        List<Long> values = Arrays.asList(valueArray);
-        ProfilingPointRunEntity profilingPointRunEntity =
-                new ProfilingPointRunEntity(
-                        testRunKey,
-                        profilingPointName,
-                        type.getNumber(),
-                        mode.getNumber(),
-                        null,
-                        values,
-                        xLabel,
-                        yLabel,
-                        null);
-
-        String branch = "master";
-        String product = "product";
-        String flavor = "flavor";
-        String id = "12345";
-        String bitness = "64";
-        String abiName = "abi";
-        DeviceInfoEntity device =
-                new DeviceInfoEntity(testRunKey, branch, product, flavor, id, bitness, abiName);
-    }
-
-    /**
-     * Test that tasks are correctly scheduled on the queue.
-     *
-     * @throws InterruptedException
-     */
-    @Test
-    public void testTasksScheduled() throws InterruptedException {
-        String[] testNames = new String[] {"test1", "test2", "test3"};
-        List<Key> testKeys = new ArrayList();
-        Set<Key> testKeySet = new HashSet<>();
-        String kind = "TEST";
-        for (String testName : testNames) {
-            Key key = KeyFactory.createKey(kind, testName);
-            testKeys.add(key);
-            testKeySet.add(key);
-        }
-        VtsProfilingStatsJobServlet.addTasks(testKeys);
-        Thread.sleep(1000); // wait one second (tasks are scheduled asychronously), must wait.
-        LocalTaskQueue taskQueue = LocalTaskQueueTestConfig.getLocalTaskQueue();
-        QueueStateInfo qsi = taskQueue.getQueueStateInfo().get(VtsProfilingStatsJobServlet.QUEUE);
-        assertNotNull(qsi);
-        assertEquals(testNames.length, qsi.getTaskInfo().size());
-
-        int i = 0;
-        for (QueueStateInfo.TaskStateInfo taskStateInfo : qsi.getTaskInfo()) {
-            assertEquals(
-                    VtsProfilingStatsJobServlet.PROFILING_STATS_JOB_URL, taskStateInfo.getUrl());
-            assertEquals("POST", taskStateInfo.getMethod());
-            String body = taskStateInfo.getBody();
-            String[] parts = body.split("=");
-            assertEquals(2, parts.length);
-            assertEquals(VtsProfilingStatsJobServlet.PROFILING_POINT_KEY, parts[0]);
-            String keyString = parts[1];
-            Key profilingPointRunKey;
-            try {
-                profilingPointRunKey = KeyFactory.stringToKey(keyString);
-            } catch (IllegalArgumentException e) {
-                fail();
-                return;
-            }
-            assertTrue(testKeys.contains(profilingPointRunKey));
-        }
-    }
-
-    /** Test that canonical time is correctly derived from a timestamp in the middle of the day. */
-    @Test
-    public void testCanonicalTimeMidday() {
-        int year = 2017;
-        Month month = Month.MAY;
-        int day = 28;
-        int hour = 14;
-        int minute = 30;
-        LocalDateTime now = LocalDateTime.of(year, month.getValue(), day, hour, minute);
-        ZonedDateTime zdt = ZonedDateTime.of(now, TimeUtil.PT_ZONE);
-        long time = TimeUnit.SECONDS.toMicros(zdt.toEpochSecond());
-        long canonicalTime = VtsProfilingStatsJobServlet.getCanonicalTime(time);
-        long canonicalTimeSec = TimeUnit.MICROSECONDS.toSeconds(canonicalTime);
-        ZonedDateTime canonical =
-                ZonedDateTime.ofInstant(Instant.ofEpochSecond(canonicalTimeSec), TimeUtil.PT_ZONE);
-        assertEquals(month, canonical.getMonth());
-        assertEquals(day, canonical.getDayOfMonth());
-        assertEquals(0, canonical.getHour());
-        assertEquals(0, canonical.getMinute());
-    }
-
-    /** Test that canonical time is correctly derived at the boundary of two days (midnight). */
-    @Test
-    public void testCanonicalTimeMidnight() {
-        int year = 2017;
-        Month month = Month.MAY;
-        int day = 28;
-        int hour = 0;
-        int minute = 0;
-        LocalDateTime now = LocalDateTime.of(year, month.getValue(), day, hour, minute);
-        ZonedDateTime zdt = ZonedDateTime.of(now, TimeUtil.PT_ZONE);
-        long time = TimeUnit.SECONDS.toMicros(zdt.toEpochSecond());
-        long canonicalTime = VtsProfilingStatsJobServlet.getCanonicalTime(time);
-        long canonicalTimeSec = TimeUnit.MICROSECONDS.toSeconds(canonicalTime);
-        ZonedDateTime canonical =
-                ZonedDateTime.ofInstant(Instant.ofEpochSecond(canonicalTimeSec), TimeUtil.PT_ZONE);
-        assertEquals(zdt, canonical);
-    }
-
-    /** Test that new summaries are created with a clean database. */
-    @Test
-    public void testNewSummary() {
-        Date d = new Date();
-        long time = TimeUnit.MILLISECONDS.toMicros(d.getTime());
-        String test = "test";
-
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, test);
-        Key testRunKey = KeyFactory.createKey(testKey, TestRunEntity.KIND, time);
-        Long[] valueArray = new Long[] {1l, 2l, 3l, 4l, 5l};
-        StatSummary expected =
-                new StatSummary(
-                        "expected",
-                        VtsReportMessage.VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE);
-        for (long value : valueArray) {
-            expected.updateStats(value);
-        }
-        Mean mean = new Mean();
-        List<Long> values = Arrays.asList(valueArray);
-        ProfilingPointRunEntity profilingPointRunEntity =
-                new ProfilingPointRunEntity(
-                        testRunKey,
-                        "profilingPoint",
-                        VtsReportMessage.VtsProfilingType.VTS_PROFILING_TYPE_UNLABELED_VECTOR_VALUE,
-                        VtsReportMessage.VtsProfilingRegressionMode
-                                .VTS_REGRESSION_MODE_INCREASING_VALUE,
-                        null,
-                        values,
-                        "xLabel",
-                        "yLabel",
-                        null);
-
-        DeviceInfoEntity device =
-                new DeviceInfoEntity(
-                        testRunKey, "master", "product", "flavor", "12345", "64", "abi");
-
-        List<DeviceInfoEntity> devices = new ArrayList<>();
-        devices.add(device);
-
-        boolean result =
-                VtsProfilingStatsJobServlet.updateSummaries(
-                        testKey, profilingPointRunEntity, devices, time);
-        assertTrue(result);
-
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-
-        // Check profiling point entity
-        Key profilingPointKey = ProfilingPointEntity.createKey(test, profilingPointRunEntity.getName());
-        ProfilingPointEntity profilingPointEntity = null;
-        try {
-            Entity profilingPoint = datastore.get(profilingPointKey);
-            profilingPointEntity = ProfilingPointEntity.fromEntity(profilingPoint);
-        } catch (EntityNotFoundException exception) {
-            fail();
-        }
-        assertNotNull(profilingPointEntity);
-        assertEquals(profilingPointRunEntity.getName(), profilingPointEntity.getProfilingPointName());
-        assertEquals(profilingPointRunEntity.getXLabel(), profilingPointEntity.getXLabel());
-        assertEquals(profilingPointRunEntity.getYLabel(), profilingPointEntity.getYLabel());
-        assertEquals(profilingPointRunEntity.getType(), profilingPointEntity.getType());
-        assertEquals(profilingPointRunEntity.getRegressionMode(), profilingPointEntity.getRegressionMode());
-
-        // Check all summary entities
-        Query q = new Query(ProfilingPointSummaryEntity.KIND).setAncestor(profilingPointKey);
-        for (Entity e : datastore.prepare(q).asIterable()) {
-            ProfilingPointSummaryEntity pps = ProfilingPointSummaryEntity.fromEntity(e);
-            assertNotNull(pps);
-            assertTrue(
-                    pps.getBranch().equals(device.getBranch())
-                            || pps.getBranch().equals(ProfilingPointSummaryEntity.ALL));
-            assertTrue(
-                    pps.getBuildFlavor().equals(ProfilingPointSummaryEntity.ALL)
-                            || pps.getBuildFlavor().equals(device.getBuildFlavor()));
-            assertEquals(expected.getCount(), pps.getGlobalStats().getCount());
-            assertEquals(expected.getMax(), pps.getGlobalStats().getMax(), THRESHOLD);
-            assertEquals(expected.getMin(), pps.getGlobalStats().getMin(), THRESHOLD);
-            assertEquals(expected.getMean(), pps.getGlobalStats().getMean(), THRESHOLD);
-            assertEquals(expected.getSumSq(), pps.getGlobalStats().getSumSq(), THRESHOLD);
-        }
-    }
-
-    /** Test that existing summaries are updated correctly when a job pushes new profiling data. */
-    @Test
-    public void testUpdateSummary() {
-        Date d = new Date();
-        long time = TimeUnit.MILLISECONDS.toMicros(d.getTime());
-        String test = "test2";
-
-        Key testKey = KeyFactory.createKey(TestEntity.KIND, test);
-        Key testRunKey = KeyFactory.createKey(testKey, TestRunEntity.KIND, time);
-        Long[] valueArray = new Long[] {0l};
-        List<Long> values = Arrays.asList(valueArray);
-
-        // Create a new profiling point run
-        ProfilingPointRunEntity profilingPointRunEntity =
-                new ProfilingPointRunEntity(
-                        testRunKey,
-                        "profilingPoint2",
-                        VtsReportMessage.VtsProfilingType.VTS_PROFILING_TYPE_UNLABELED_VECTOR_VALUE,
-                        VtsReportMessage.VtsProfilingRegressionMode
-                                .VTS_REGRESSION_MODE_INCREASING_VALUE,
-                        null,
-                        values,
-                        "xLabel",
-                        "yLabel",
-                        null);
-
-        // Create a device for the run
-        String series = "";
-        DeviceInfoEntity device =
-                new DeviceInfoEntity(
-                        testRunKey, "master", "product", "flavor", "12345", "64", "abi");
-
-        List<DeviceInfoEntity> devices = new ArrayList<>();
-        devices.add(device);
-
-        // Create the existing stats
-        Key profilingPointKey = ProfilingPointEntity.createKey(test, profilingPointRunEntity.getName());
-        StatSummary expected =
-                new StatSummary(
-                        "label",
-                        0,
-                        10,
-                        5,
-                        100,
-                        10,
-                        VtsReportMessage.VtsProfilingRegressionMode.UNKNOWN_REGRESSION_MODE);
-        ProfilingPointSummaryEntity summary =
-                new ProfilingPointSummaryEntity(
-                        profilingPointKey,
-                        expected,
-                        new ArrayList<>(),
-                        new HashMap<>(),
-                        device.getBranch(),
-                        device.getBuildFlavor(),
-                        series,
-                        time);
-
-        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
-        datastore.put(summary.toEntity());
-
-        // Update the summaries in the database
-        boolean result =
-                VtsProfilingStatsJobServlet.updateSummaries(
-                        testKey, profilingPointRunEntity, devices, time);
-        assertTrue(result);
-
-        // Calculate the expected stats with the values from the new run
-        for (long value : values) expected.updateStats(value);
-
-        // Get the summary and check the values match what is expected
-        Key summaryKey =
-                ProfilingPointSummaryEntity.createKey(
-                        profilingPointKey, device.getBranch(), device.getBuildFlavor(), series, time);
-        ProfilingPointSummaryEntity pps = null;
-        try {
-            Entity e = datastore.get(summaryKey);
-            pps = ProfilingPointSummaryEntity.fromEntity(e);
-        } catch (EntityNotFoundException e) {
-            fail();
-        }
-        assertNotNull(pps);
-        assertTrue(pps.getBranch().equals(device.getBranch()));
-        assertTrue(pps.getBuildFlavor().equals(device.getBuildFlavor()));
-        assertEquals(expected.getCount(), pps.getGlobalStats().getCount());
-        assertEquals(expected.getMax(), pps.getGlobalStats().getMax(), THRESHOLD);
-        assertEquals(expected.getMin(), pps.getGlobalStats().getMin(), THRESHOLD);
-        assertEquals(expected.getMean(), pps.getGlobalStats().getMean(), THRESHOLD);
-        assertEquals(expected.getSumSq(), pps.getGlobalStats().getSumSq(), THRESHOLD);
-    }
-}
diff --git a/src/test/java/com/android/vts/util/LocalDatastoreExtension.java b/src/test/java/com/android/vts/util/LocalDatastoreExtension.java
deleted file mode 100644
index b06303c..0000000
--- a/src/test/java/com/android/vts/util/LocalDatastoreExtension.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.util;
-
-import com.google.cloud.datastore.testing.LocalDatastoreHelper;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.junit.jupiter.api.extension.BeforeAllCallback;
-import org.junit.jupiter.api.extension.BeforeEachCallback;
-import org.junit.jupiter.api.extension.ExtensionContext;
-import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
-
-/** Sets up and tears down the Local Datastore emulator, defaults to strong consistency */
-@RequiredArgsConstructor
-@Slf4j
-public class LocalDatastoreExtension implements BeforeAllCallback, BeforeEachCallback {
-
-    private final double consistency;
-
-    public LocalDatastoreExtension() {
-        this(1.0);
-    }
-
-    @Override
-    public void beforeAll(final ExtensionContext context) throws Exception {
-        if (getHelper(context) == null) {
-            log.info("Creating new LocalDatastoreHelper");
-
-            final LocalDatastoreHelper helper = LocalDatastoreHelper.create(consistency);
-            context.getRoot().getStore(Namespace.GLOBAL).put(LocalDatastoreHelper.class, helper);
-            helper.start();
-        }
-    }
-
-    @Override
-    public void beforeEach(final ExtensionContext context) throws Exception {
-        final LocalDatastoreHelper helper = getHelper(context);
-        helper.reset();
-    }
-
-    /** Get the helper created in beforeAll; it should be global so there will one per test run */
-    public static LocalDatastoreHelper getHelper(final ExtensionContext context) {
-        return context.getRoot()
-                .getStore(Namespace.GLOBAL)
-                .get(LocalDatastoreHelper.class, LocalDatastoreHelper.class);
-    }
-}
diff --git a/src/test/java/com/android/vts/util/MockitoExtension.java b/src/test/java/com/android/vts/util/MockitoExtension.java
deleted file mode 100644
index 821574f..0000000
--- a/src/test/java/com/android/vts/util/MockitoExtension.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.util;
-
-import org.junit.jupiter.api.extension.BeforeEachCallback;
-import org.junit.jupiter.api.extension.ExtensionContext;
-import org.mockito.MockitoAnnotations;
-
-/**
- * This will enable mockito annotations programmatically, by invoking MockitoAnnotations.initMocks()
- */
-public class MockitoExtension implements BeforeEachCallback {
-
-    @Override
-    public void beforeEach(final ExtensionContext context) throws Exception {
-        final Object testInstance = context.getTestInstance().get();
-
-        MockitoAnnotations.initMocks(testInstance);
-    }
-}
diff --git a/src/test/java/com/android/vts/util/ObjectifyExtension.java b/src/test/java/com/android/vts/util/ObjectifyExtension.java
deleted file mode 100644
index a60ba0e..0000000
--- a/src/test/java/com/android/vts/util/ObjectifyExtension.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.util;
-
-import com.google.cloud.datastore.Datastore;
-import com.googlecode.objectify.ObjectifyFactory;
-import com.googlecode.objectify.ObjectifyService;
-import com.googlecode.objectify.util.Closeable;
-import org.junit.jupiter.api.extension.AfterEachCallback;
-import org.junit.jupiter.api.extension.BeforeEachCallback;
-import org.junit.jupiter.api.extension.ExtensionContext;
-import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
-
-/** Sets up and tears down the GAE local unit test harness environment */
-public class ObjectifyExtension implements BeforeEachCallback, AfterEachCallback {
-
-    private static final Namespace NAMESPACE = Namespace.create(ObjectifyExtension.class);
-
-    @Override
-    public void beforeEach(final ExtensionContext context) throws Exception {
-        final Datastore datastore =
-                LocalDatastoreExtension.getHelper(context).getOptions().getService();
-
-        ObjectifyService.init(new ObjectifyFactory(datastore));
-
-        final Closeable rootService = ObjectifyService.begin();
-
-        context.getStore(NAMESPACE).put(Closeable.class, rootService);
-    }
-
-    @Override
-    public void afterEach(final ExtensionContext context) throws Exception {
-        final Closeable rootService =
-                context.getStore(NAMESPACE).get(Closeable.class, Closeable.class);
-
-        rootService.close();
-    }
-}
diff --git a/src/test/java/com/android/vts/util/ObjectifyTestBase.java b/src/test/java/com/android/vts/util/ObjectifyTestBase.java
deleted file mode 100644
index 0b3b5e8..0000000
--- a/src/test/java/com/android/vts/util/ObjectifyTestBase.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-package com.android.vts.util;
-
-import com.google.cloud.datastore.Datastore;
-import com.google.cloud.datastore.EntityValue;
-import com.google.cloud.datastore.FullEntity;
-import com.google.cloud.datastore.IncompleteKey;
-import com.google.cloud.datastore.Value;
-import com.googlecode.objectify.Key;
-import com.googlecode.objectify.cache.MemcacheService;
-import com.googlecode.objectify.impl.AsyncDatastore;
-import org.junit.jupiter.api.extension.ExtendWith;
-
-import static com.googlecode.objectify.ObjectifyService.factory;
-import static com.googlecode.objectify.ObjectifyService.ofy;
-
-/** All tests should extend this class to set up the GAE environment. */
-@ExtendWith({
-    MockitoExtension.class,
-    LocalDatastoreExtension.class,
-    ObjectifyExtension.class,
-})
-public class ObjectifyTestBase {
-    /** Set embedded entity with property name */
-    protected Value<FullEntity<?>> makeEmbeddedEntityWithProperty(
-            final String name, final Value<?> value) {
-        return EntityValue.of(FullEntity.newBuilder().set(name, value).build());
-    }
-
-    /** Get datastore instance */
-    protected Datastore datastore() {
-        return factory().datastore();
-    }
-
-    /** Get memcache instance */
-    protected MemcacheService memcache() {
-        return factory().memcache();
-    }
-
-    /** Get asynchronous datastore instance */
-    protected AsyncDatastore asyncDatastore() {
-        return factory().asyncDatastore();
-    }
-
-    /** Save an entity and clear cache data and return entity by finding the key */
-    protected <E> E saveClearLoad(final E thing) {
-        final Key<E> key = ofy().save().entity(thing).now();
-        ofy().clear();
-        return ofy().load().key(key).now();
-    }
-
-    /** Get the entity instance from class type */
-    protected FullEntity.Builder<?> makeEntity(final Class<?> kind) {
-        return makeEntity(Key.getKind(kind));
-    }
-
-    /** Get the entity instance from class name */
-    protected FullEntity.Builder<?> makeEntity(final String kind) {
-        final IncompleteKey incompleteKey =
-                factory().datastore().newKeyFactory().setKind(kind).newKey();
-        return FullEntity.newBuilder(incompleteKey);
-    }
-}
diff --git a/src/test/java/com/android/vts/util/ProfilingPointSummaryTest.java b/src/test/java/com/android/vts/util/ProfilingPointSummaryTest.java
deleted file mode 100644
index e44a1b0..0000000
--- a/src/test/java/com/android/vts/util/ProfilingPointSummaryTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import com.android.vts.entity.ProfilingPointEntity;
-import com.android.vts.entity.ProfilingPointSummaryEntity;
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
-import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ProfilingPointSummaryTest {
-    private final LocalServiceTestHelper helper =
-            new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
-    private static String[] labels = new String[] {"label1", "label2", "label3"};
-    private static long[] values = new long[] {1, 2, 3};
-    private static ProfilingPointSummary summary;
-
-    /**
-     * Helper method for creating ProfilingPointSummaryEntity objects.
-     *
-     * @param labels The list of data labels.
-     * @param values The list of data values. Must be equal in size to the labels list.
-     * @param regressionMode The regression mode.
-     * @return A ProfilingPointSummaryEntity with specified data.
-     */
-    private static ProfilingPointSummaryEntity createProfilingReport(
-            String[] labels, long[] values, VtsProfilingRegressionMode regressionMode) {
-        List<String> labelList = Arrays.asList(labels);
-        StatSummary globalStats = new StatSummary("global", regressionMode);
-        Map<String, StatSummary> labelStats = new HashMap<>();
-        for (int i = 0; i < labels.length; ++i) {
-            StatSummary stat = new StatSummary(labels[i], regressionMode);
-            stat.updateStats(values[i]);
-            labelStats.put(labels[i], stat);
-            globalStats.updateStats(values[i]);
-        }
-        return new ProfilingPointSummaryEntity(
-                ProfilingPointEntity.createKey("test", "pp"),
-                globalStats,
-                labelList,
-                labelStats,
-                "branch",
-                "build",
-                null,
-                0);
-    }
-
-    @Before
-    public void setUp() {
-        helper.setUp();
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        summary = new ProfilingPointSummary("x", "y", mode);
-        ProfilingPointSummaryEntity pt = createProfilingReport(labels, values, mode);
-        summary.update(pt);
-    }
-
-    @After
-    public void tearDown() {
-        helper.tearDown();
-    }
-
-    /** Test that all labels are found by hasLabel. */
-    @Test
-    public void testHasLabel() {
-        for (String label : labels) {
-            assertTrue(summary.hasLabel(label));
-        }
-    }
-
-    /** Test that invalid labels are not found by hasLabel. */
-    @Test
-    public void testInvalidHasLabel() {
-        assertFalse(summary.hasLabel("bad label"));
-    }
-
-    /** Test that all stat summaries can be retrieved by profiling point label. */
-    @Test
-    public void testGetStatSummary() {
-        for (String label : labels) {
-            StatSummary stats = summary.getStatSummary(label);
-            assertNotNull(stats);
-            assertEquals(label, stats.getLabel());
-        }
-    }
-
-    /** Test that the getStatSummary method returns null when the label is not present. */
-    @Test
-    public void testInvalidGetStatSummary() {
-        StatSummary stats = summary.getStatSummary("bad label");
-        assertNull(stats);
-    }
-
-    /** Test that StatSummary objects are iterated in the order that the labels were provided. */
-    @Test
-    public void testIterator() {
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        ProfilingPointSummaryEntity pt = createProfilingReport(labels, values, mode);
-        summary.update(pt);
-
-        int i = 0;
-        for (StatSummary stats : summary) {
-            assertEquals(labels[i++], stats.getLabel());
-        }
-    }
-
-    /** Test that the updateLabel method updates the StatSummary for just the label provided. */
-    @Test
-    public void testUpdateLabelGrouped() {
-        VtsProfilingRegressionMode mode = VtsProfilingRegressionMode.VTS_REGRESSION_MODE_INCREASING;
-        summary = new ProfilingPointSummary("x", "y", mode);
-        ProfilingPointSummaryEntity pt = createProfilingReport(labels, values, mode);
-        summary.updateLabel(pt, labels[0]);
-
-        // Ensure the label specified is present and has been updated for each data point.
-        assertTrue(summary.hasLabel(labels[0]));
-        assertNotNull(summary.getStatSummary(labels[0]));
-        assertEquals(summary.getStatSummary(labels[0]).getCount(), labels.length);
-
-        // Check that the other labels were not updated.
-        for (int i = 1; i < labels.length; i++) {
-            assertFalse(summary.hasLabel(labels[i]));
-        }
-    }
-}
diff --git a/src/test/java/com/android/vts/util/StatSummaryTest.java b/src/test/java/com/android/vts/util/StatSummaryTest.java
deleted file mode 100644
index a5a4f76..0000000
--- a/src/test/java/com/android/vts/util/StatSummaryTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2016 Google Inc. All Rights Reserved.
- *
- * 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.
- */
-
-package com.android.vts.util;
-
-import static org.junit.Assert.assertEquals;
-
-import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode;
-import java.util.Random;
-import org.junit.Before;
-import org.junit.Test;
-
-public class StatSummaryTest {
-    private static double threshold = 0.0000000001;
-    private StatSummary test;
-
-    @Before
-    public void setUp() {
-        test = new StatSummary("label", VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING);
-    }
-
-    /** Test computation of average. */
-    @Test
-    public void testAverage() {
-        int n = 1000;
-        double mean = (n - 1) / 2.0;
-        for (int i = 0; i < n; i++) {
-            test.updateStats(i);
-        }
-        assertEquals(n, test.getCount(), threshold);
-        assertEquals(mean, test.getMean(), threshold);
-    }
-
-    /** Test computation of minimum. */
-    @Test
-    public void testMin() {
-        double min = Double.MAX_VALUE;
-        int n = 1000;
-        Random rand = new Random();
-        for (int i = 0; i < n; i++) {
-            double value = rand.nextInt(1000);
-            if (value < min) min = value;
-            test.updateStats(value);
-        }
-        assertEquals(n, test.getCount(), threshold);
-        assertEquals(min, test.getMin(), threshold);
-    }
-
-    /** Test computation of maximum. */
-    @Test
-    public void testMax() {
-        double max = Double.MIN_VALUE;
-        int n = 1000;
-        Random rand = new Random();
-        for (int i = 0; i < n; i++) {
-            double value = rand.nextInt(1000);
-            if (value > max) max = value;
-            test.updateStats(value);
-        }
-        assertEquals(max, test.getMax(), threshold);
-    }
-
-    /** Test computation of standard deviation. */
-    @Test
-    public void testStd() {
-        int n = 1000;
-        double[] values = new double[n];
-        Random rand = new Random();
-        double sum = 0.0;
-        for (int i = 0; i < n; i++) {
-            values[i] = rand.nextInt(1000);
-            sum += values[i];
-            test.updateStats(values[i]);
-        }
-        double mean = sum / n;
-        double sumSq = 0;
-        for (int i = 0; i < n; i++) {
-            sumSq += (values[i] - mean) * (values[i] - mean);
-        }
-        double std = Math.sqrt(sumSq / (n - 1));
-        assertEquals(std, test.getStd(), threshold);
-    }
-
-    /** Test computation of standard deviation. */
-    @Test
-    public void testMerge() {
-        StatSummary test2 =
-                new StatSummary("label", VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING);
-        StatSummary all =
-                new StatSummary("label", VtsProfilingRegressionMode.VTS_REGRESSION_MODE_DECREASING);
-        int n1 = 1000;
-        int n2 = 2000;
-        Random rand = new Random();
-        for (int i = 0; i < n1; i++) {
-            int value = rand.nextInt(1000);
-            test.updateStats(value);
-            all.updateStats(value);
-        }
-        for (int i = 0; i < n2; i++) {
-            int value = rand.nextInt(1000);
-            test2.updateStats(value);
-            all.updateStats(value);
-        }
-
-        test.merge(test2);
-        assertEquals(all.getCount(), test.getCount());
-        assertEquals(all.getStd(), test.getStd(), threshold);
-        assertEquals(all.getMean(), test.getMean(), threshold);
-    }
-}
diff --git a/src/test/java/com/android/vts/util/TimeUtilTest.java b/src/test/java/com/android/vts/util/TimeUtilTest.java
deleted file mode 100644
index 439991d..0000000
--- a/src/test/java/com/android/vts/util/TimeUtilTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-package com.android.vts.util;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class TimeUtilTest {
-
-    /** Test that date/time strings are formatted correctly. */
-    @Test
-    public void testFormatDateTime() {
-        long time = 1504286976352052l;
-        String expected = "2017-09-01 10:29:36 (PDT)";
-        String timeString = TimeUtil.getDateTimeZoneString(time);
-        assertEquals(expected, timeString);
-    }
-
-    /** Test that date strings are formatted correctly. */
-    @Test
-    public void testFormatDate() {
-        long time = 1504248634455491l;
-        String expected = "2017-08-31";
-        String timeString = TimeUtil.getDateString(time);
-        assertEquals(expected, timeString);
-    }
-}
diff --git a/src/test/resources/config.properties b/src/test/resources/config.properties
deleted file mode 100644
index 2368374..0000000
--- a/src/test/resources/config.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-
-testProjectID=
-
-api.coverage.keyFile=
-api.coverage.spreadSheetId=
-api.coverage.spreadSheetRange=
diff --git a/src/test/resources/data/android_vts.vts_api_coverage_exlude_test.ods b/src/test/resources/data/android_vts.vts_api_coverage_exlude_test.ods
deleted file mode 100644
index eb557d0..0000000
--- a/src/test/resources/data/android_vts.vts_api_coverage_exlude_test.ods
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/driver/chromedriver b/src/test/resources/driver/chromedriver
deleted file mode 100755
index bbb06c3..0000000
--- a/src/test/resources/driver/chromedriver
+++ /dev/null
Binary files differ
diff --git a/src/test/resources/driver/config.properties b/src/test/resources/driver/config.properties
deleted file mode 100644
index 939fa90..0000000
--- a/src/test/resources/driver/config.properties
+++ /dev/null
@@ -1 +0,0 @@
-LOCALHOST=localhost:8080
\ No newline at end of file
diff --git a/src/test/resources/log4j2-test.xml b/src/test/resources/log4j2-test.xml
deleted file mode 100644
index 98cfd73..0000000
--- a/src/test/resources/log4j2-test.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="INFO">
-    <Appenders>
-        <Console name="Console" target="SYSTEM_OUT">
-            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
-        </Console>
-    </Appenders>
-    <Loggers>
-        <Root level="info">
-            <AppenderRef ref="Console"/>
-        </Root>
-    </Loggers>
-</Configuration>
\ No newline at end of file
diff --git a/src/test/resources/servlet/performanceSummary1.html b/src/test/resources/servlet/performanceSummary1.html
deleted file mode 100644
index 3b01593..0000000
--- a/src/test/resources/servlet/performanceSummary1.html
+++ /dev/null
@@ -1 +0,0 @@
-<p style='font-family: arial'><b>test</b></p><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p1</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Lower values are better. Minimum is the best-case performance.</i><br><br><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p2</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Higher values are better. Maximum is the best-case performance.</i><br><br>
\ No newline at end of file
diff --git a/src/test/resources/servlet/performanceSummary2.html b/src/test/resources/servlet/performanceSummary2.html
deleted file mode 100644
index 3b01593..0000000
--- a/src/test/resources/servlet/performanceSummary2.html
+++ /dev/null
@@ -1 +0,0 @@
-<p style='font-family: arial'><b>test</b></p><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p1</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Lower values are better. Minimum is the best-case performance.</i><br><br><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p2</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Higher values are better. Maximum is the best-case performance.</i><br><br>
\ No newline at end of file
diff --git a/src/test/resources/servlet/performanceSummary3.html b/src/test/resources/servlet/performanceSummary3.html
deleted file mode 100644
index 1ff1028..0000000
--- a/src/test/resources/servlet/performanceSummary3.html
+++ /dev/null
@@ -1 +0,0 @@
-<p style='font-family: arial'><b>test</b></p><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p1</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Lower values are better. Minimum is the best-case performance.</i><br><br><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p2</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td class='' style='background-color: rgba(255, 0, 0, -0.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>0 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Higher values are better. Maximum is the best-case performance.</i><br><br><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p3</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label1</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label2</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>label3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Lower values are better. Minimum is the best-case performance.</i><br><br>
\ No newline at end of file
diff --git a/src/test/resources/servlet/performanceSummary4.html b/src/test/resources/servlet/performanceSummary4.html
deleted file mode 100644
index 8fc8997..0000000
--- a/src/test/resources/servlet/performanceSummary4.html
+++ /dev/null
@@ -1 +0,0 @@
-<p style='font-family: arial'><b>test</b></p><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p1</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Min (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Min</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>testLabel</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>10</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>8.94</td><td class='' style='background-color: rgba(255, 0, 0, 18.0); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>900 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>1<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0.89</td><td></td><td></td><td></td><td></td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Lower values are better. Minimum is the best-case performance.</i><br><br><table cellpadding='2' style='width: 100%; border-collapse: collapse; border: 1px solid black; font-size: 12px; font-family: arial;'><tr><td colspan='16'>p2</td></tr><tr><td colspan='16'></td></tr><tr><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='1'></th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='3'>today</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>yesterday</th><th style='border: 1px solid black; border-bottom: none; background-color: lightgray;' colspan='4'>last week</th></tr><tr><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'></th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>&Delta;Max (%)</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Max</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Mean</th><th style='border: 1px solid black; border-bottom-width: 2px; border-top: 1px dotted gray; background-color: lightgray;'>Std</th></tr><tr><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right; background-color: lightgray;'>testLabel</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>3</td><td style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>2</td><td style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>0.89</td><td class='' style='background-color: rgba(255, 0, 0, 1.8); border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>-90 %</td><td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>30<td class='' style='border-top: 1px dotted gray; border-right: 1px dotted gray; text-align: right;'>20<td class='' style='border-top: 1px dotted gray; border-right: 2px solid black; text-align: right;'>8.94</td><td></td><td></td><td></td><td></td></tr></table><i style='font-family: arial; font-size: 12px'>Note: Higher values are better. Maximum is the best-case performance.</i><br><br>
\ No newline at end of file
diff --git a/testdata/test-plan-report-data.json b/testdata/test-plan-report-data.json
deleted file mode 100644
index ec733a5..0000000
--- a/testdata/test-plan-report-data.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "testPlanList": [
-    {
-      "testPlanName": "vts-serving-staging-fuzz",
-      "testModules": ["BionicUnitTests", "CpuProfilingTest"],
-      "testTimes": [1515562811, 1515562811]
-    },
-    {
-      "testPlanName": "vts-serving-staging-hal-conventional",
-      "testModules": ["BionicUnitTests", "CpuProfilingTest"],
-      "testTimes": [1515562811, 1515562811]
-    }
-  ]
-}
\ No newline at end of file
diff --git a/testdata/test-report-data.json b/testdata/test-report-data.json
deleted file mode 100644
index fb19a6a..0000000
--- a/testdata/test-report-data.json
+++ /dev/null
@@ -1,272 +0,0 @@
-{
-  "testList": [
-    {
-      "testRunList": [
-        {
-          "testName": "BionicUnitTests",
-          "type": 1,
-          "startTimestamp":1515562811,
-          "endTimestamp": 1515389691,
-          "testBuildId": "4075328",
-          "hostName": "test.google.com",
-          "passCount": 1861,
-          "failCount": 1,
-          "coveredLineCount": 223,
-          "totalLineCount": 23423432,
-          "testCaseIds": [2120003,9120003,7140003,9110002,7150002,110006,2160001,130003],
-          "failingTestcaseIds": [2120003,9120003,7140003,9110002],
-          "failingTestcaseOffsets": [212,234,388,384],
-          "links": ["https://google.com/test_run_details.txt","https://google.com/BionicUnitTests_1496812169433653.log","https://google.com/BionicUnitTests_1496812169433653.txt"],
-          "coverageList": [
-            {
-              "group": "wkejfiowfe",
-              "coveredLineCount": 23423,
-              "totalLineCount": 234324,
-              "filePath": "/wjefoiwejfio/jwoiejfiwef",
-              "projectName": "wklejfoiwjefio",
-              "projectVersion": "weoifj",
-              "lineCoverage": [
-                "0",
-                "3",
-                "34"
-              ]
-            }
-          ],
-          "profilingList": [
-            {
-              "name": "skldjfwoief",
-              "type": 2,
-              "regressionMode": 2,
-              "labels": [
-                "slkdfjwoiefj",
-                "woiejfoiwefjoiwef",
-                "wieojfiowef"
-              ],
-              "values": [
-                23487234,
-                23984798324,
-                29837498324,
-                29837489635
-              ],
-              "xLabel": "slkdjfoiwef",
-              "yLabel": "slkdjfoiwef",
-              "options": [
-                "skldjfiwef",
-                "woiejfiowf",
-                "wioejf"
-              ]
-            }
-          ],
-          "testCaseRunList": [
-            {
-              "testCaseNames": [
-                "stdatomic.atomic_exchange_64bit",
-                "stdatomic.atomic_compare_exchange_64bit",
-                "stdatomic.atomic_exchange_64bit",
-                "stdatomic.atomic_compare_exchange_64bit",
-                "stdatomic.atomic_exchange_64bit",
-                "stdatomic.atomic_compare_exchange_64bit"
-              ],
-              "results": [
-                2,
-                2,
-                2,
-                2,
-                2,
-                2
-              ]
-            }
-          ],
-          "deviceInfoList": [
-            {
-              "branch": "master",
-              "product": "sailfish",
-              "buildFlavor": "sailfish-userdebug",
-              "buildId": "4531434",
-              "abiBitness": "64",
-              "abiName": "arm64-v8a"
-            },
-            {
-              "branch": "master",
-              "product": "sailfish",
-              "buildFlavor": "sailfish-userdebug",
-              "buildId": "4531434",
-              "abiBitness": "32",
-              "abiName": "armeabi-v7a"
-            },
-            {
-              "branch": "master",
-              "product": "sailfish",
-              "buildFlavor": "sailfish-userdebug",
-              "buildId": "4531434",
-              "abiBitness": "64",
-              "abiName": "armeabi-v7a"
-            },
-            {
-              "branch": "master",
-              "product": "sailfish",
-              "buildFlavor": "sailfish-userdebug",
-              "buildId": "4531434",
-              "abiBitness": "32",
-              "abiName": "arm64-v8a"
-            }
-          ],
-          "buildTargetList": [
-            {
-              "targetName": "aosp_sailfish-userdebug"
-            },
-            {
-              "targetName": "aosp_arm64_ab-userdebug"
-            },
-            {
-              "targetName": "basic-userdebug"
-            }
-          ],
-          "branchList": [
-            {
-              "branchName": "master"
-            },
-            {
-              "branchName": "aaaa.170902.001"
-            },
-            {
-              "branchName": "oc"
-            }
-          ]
-        },
-        {
-          "testName": "CpuProfilingTest",
-          "type": 2,
-          "startTimestamp":1515562811,
-          "endTimestamp": 1515303611,
-          "testBuildId": "4075338",
-          "hostName": "test.google.com",
-          "passCount": 1361,
-          "failCount": 3,
-          "coveredLineCount": 34562,
-          "totalLineCount": 2343932,
-          "testCaseIds": [2120003,9120003,7140003,9110002,7150002,110006,2160001,130003],
-          "failingTestcaseIds": [2120003,9120003,7140003,9110002],
-          "failingTestcaseOffsets": [212,234,388,384],
-          "links": ["https://google.com/test_run_details.txt","https://google.com/BionicUnitTests_1496812169433653.log","https://google.com/BionicUnitTests_1496812169433653.txt"],
-          "coverageList": [
-            {
-              "group": "wkejfiowfe",
-              "coveredLineCount": 23423,
-              "totalLineCount": 234324,
-              "filePath": "/wjefoiwejfio/jwoiejfiwef",
-              "projectName": "wklejfoiwjefio",
-              "projectVersion": "weoifj",
-              "lineCoverage": [
-                "0",
-                "3",
-                "34"
-              ]
-            }
-          ],
-          "profilingList": [
-            {
-              "name": "skldjfwoief",
-              "type": 2,
-              "regressionMode": 0,
-              "labels": [
-                "slkdfjwoiefj",
-                "woiejfoiwefjoiwef",
-                "wieojfiowef"
-              ],
-              "values": [
-                23487234,
-                23984798324,
-                29837498324,
-                29837489635
-              ],
-              "xLabel": "slkdjfoiwef",
-              "yLabel": "slkdjfoiwef",
-              "options": [
-                "skldjfiwef",
-                "woiejfiowf",
-                "wioejf"
-              ]
-            }
-          ],
-          "testCaseRunList": [
-            {
-              "testCaseNames": [
-                "stdatomic.atomic_exchange_64bit",
-                "stdatomic.atomic_compare_exchange_64bit",
-                "stdatomic.atomic_exchange_64bit",
-                "stdatomic.atomic_compare_exchange_64bit",
-                "stdatomic.atomic_exchange_64bit",
-                "stdatomic.atomic_compare_exchange_64bit"
-              ],
-              "results": [
-                2,
-                2,
-                2,
-                2,
-                2,
-                2
-              ]
-            }
-          ],
-          "deviceInfoList": [
-            {
-              "branch": "master",
-              "product": "sailfish",
-              "buildFlavor": "sailfish-userdebug",
-              "buildId": "4531434",
-              "abiBitness": "64",
-              "abiName": "arm64-v8a"
-            },
-            {
-              "branch": "master",
-              "product": "sailfish",
-              "buildFlavor": "sailfish-userdebug",
-              "buildId": "4531434",
-              "abiBitness": "32",
-              "abiName": "armeabi-v7a"
-            },
-            {
-              "branch": "master",
-              "product": "sailfish",
-              "buildFlavor": "sailfish-userdebug",
-              "buildId": "4531434",
-              "abiBitness": "64",
-              "abiName": "armeabi-v7a"
-            },
-            {
-              "branch": "master",
-              "product": "sailfish",
-              "buildFlavor": "sailfish-userdebug",
-              "buildId": "4531434",
-              "abiBitness": "32",
-              "abiName": "arm64-v8a"
-            }
-          ],
-          "buildTargetList": [
-            {
-              "targetName": "aosp_sailfish-userdebug"
-            },
-            {
-              "targetName": "aosp_arm64_ab-userdebug"
-            },
-            {
-              "targetName": "basic-userdebug"
-            }
-          ],
-          "branchList": [
-            {
-              "branchName": "master"
-            },
-            {
-              "branchName": "aaaa.170902.001"
-            },
-            {
-              "branchName": "oc"
-            }
-          ]
-        }
-      ]
-    }
-  ]
-}
\ No newline at end of file