Merge "Document Debug Tracks on docs.perfetto.dev." into main
diff --git a/Android.bp b/Android.bp
index e239297..f66c143 100644
--- a/Android.bp
+++ b/Android.bp
@@ -4639,7 +4639,6 @@
         "protos/perfetto/metrics/chrome/performance_mark_hashes.proto",
         "protos/perfetto/metrics/chrome/reported_by_page.proto",
         "protos/perfetto/metrics/chrome/scroll_jank.proto",
-        "protos/perfetto/metrics/chrome/scroll_jank_v2.proto",
         "protos/perfetto/metrics/chrome/scroll_jank_v3.proto",
         "protos/perfetto/metrics/chrome/slice_names.proto",
         "protos/perfetto/metrics/chrome/test_chrome_metric.proto",
@@ -10524,7 +10523,6 @@
         "src/trace_processor/metrics/sql/chrome/chrome_reliable_range.sql",
         "src/trace_processor/metrics/sql/chrome/chrome_scroll_inputs_per_frame.sql",
         "src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_caused_by_scheduling.sql",
-        "src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v2.sql",
         "src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql",
         "src/trace_processor/metrics/sql/chrome/chrome_slice_names.sql",
         "src/trace_processor/metrics/sql/chrome/chrome_stack_samples_for_task.sql",
@@ -10772,11 +10770,9 @@
         "src/trace_processor/perfetto_sql/stdlib/chrome/cpu_powerups.sql",
         "src/trace_processor/perfetto_sql/stdlib/chrome/histograms.sql",
         "src/trace_processor/perfetto_sql/stdlib/chrome/metadata.sql",
-        "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank.sql",
-        "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank_cause.sql",
-        "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_to_breakdowns.sql",
         "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql",
         "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql",
+        "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql",
         "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/utils.sql",
         "src/trace_processor/perfetto_sql/stdlib/chrome/speedometer.sql",
         "src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql",
diff --git a/BUILD b/BUILD
index a219ceb..a6e2834 100644
--- a/BUILD
+++ b/BUILD
@@ -1963,7 +1963,6 @@
         "src/trace_processor/metrics/sql/chrome/chrome_reliable_range.sql",
         "src/trace_processor/metrics/sql/chrome/chrome_scroll_inputs_per_frame.sql",
         "src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_caused_by_scheduling.sql",
-        "src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v2.sql",
         "src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql",
         "src/trace_processor/metrics/sql/chrome/chrome_slice_names.sql",
         "src/trace_processor/metrics/sql/chrome/chrome_stack_samples_for_task.sql",
@@ -2267,11 +2266,9 @@
 perfetto_filegroup(
     name = "src_trace_processor_perfetto_sql_stdlib_chrome_scroll_jank_scroll_jank",
     srcs = [
-        "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank.sql",
-        "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank_cause.sql",
-        "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_to_breakdowns.sql",
         "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql",
         "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql",
+        "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql",
         "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/utils.sql",
     ],
 )
@@ -4146,7 +4143,6 @@
         "protos/perfetto/metrics/chrome/performance_mark_hashes.proto",
         "protos/perfetto/metrics/chrome/reported_by_page.proto",
         "protos/perfetto/metrics/chrome/scroll_jank.proto",
-        "protos/perfetto/metrics/chrome/scroll_jank_v2.proto",
         "protos/perfetto/metrics/chrome/scroll_jank_v3.proto",
         "protos/perfetto/metrics/chrome/slice_names.proto",
         "protos/perfetto/metrics/chrome/test_chrome_metric.proto",
diff --git a/docs/toc.md b/docs/toc.md
index 40f3eb9..d7c34e3 100644
--- a/docs/toc.md
+++ b/docs/toc.md
@@ -48,7 +48,7 @@
   * [PerfettoSQL](#)
     * [Standard Library](analysis/stdlib-docs.autogen)
     * [Syntax](analysis/perfetto-sql-syntax.md)
-    * [Prelude](analysis/sql-tables.autogen)
+    * [Prelude tables](analysis/sql-tables.autogen)
     * [Common Queries](analysis/common-queries.md)
     * [Built-ins](analysis/builtin.md)
 
diff --git a/protos/perfetto/config/android/android_sdk_sysprop_guard_config.proto b/protos/perfetto/config/android/android_sdk_sysprop_guard_config.proto
index 44b4f1a..61f5f53 100644
--- a/protos/perfetto/config/android/android_sdk_sysprop_guard_config.proto
+++ b/protos/perfetto/config/android/android_sdk_sysprop_guard_config.proto
@@ -48,8 +48,8 @@
   // restarted.
   //
   // Specifically this sets the following system properties:
-  //   - debug.tracing.renderengine.skia_tracing_enabled
-  //   - debug.tracing.renderengine.skia_use_perfetto_track_events
+  //   - debug.tracing.ctl.renderengine.skia_tracing_enabled
+  //   - debug.tracing.ctl.renderengine.skia_use_perfetto_track_events
   //
   // Does not affect actual track_event data *collection*, which must be
   // configured seperately.
@@ -65,12 +65,12 @@
   //
   // ATTENTION: affects ALL HWUI APPS if hwui_package_name_filter is not set!
   // If filtering is NOT set, this controls these GLOBAL system properties:
-  //   - debug.tracing.hwui.skia_tracing_enabled
-  //   - debug.tracing.hwui.skia_use_perfetto_track_events
+  //   - debug.tracing.ctl.hwui.skia_tracing_enabled
+  //   - debug.tracing.ctl.hwui.skia_use_perfetto_track_events
   // If filtering IS set, this controls these APP-SPECIFIC system properties,
   // for each package listed in the filter:
-  //   - debug.tracing.hwui.skia_tracing_enabled.<package.name>
-  //   - debug.tracing.hwui.skia_use_perfetto_track_events.<package.name>
+  //   - debug.tracing.ctl.hwui.skia_tracing_enabled.<package.name>
+  //   - debug.tracing.ctl.hwui.skia_use_perfetto_track_events.<package.name>
   //
   // Does not affect actual track_event data *collection*, which must be
   // configured seperately.
diff --git a/protos/perfetto/config/perfetto_config.proto b/protos/perfetto/config/perfetto_config.proto
index a9d53e6..99b62de 100644
--- a/protos/perfetto/config/perfetto_config.proto
+++ b/protos/perfetto/config/perfetto_config.proto
@@ -436,8 +436,8 @@
   // restarted.
   //
   // Specifically this sets the following system properties:
-  //   - debug.tracing.renderengine.skia_tracing_enabled
-  //   - debug.tracing.renderengine.skia_use_perfetto_track_events
+  //   - debug.tracing.ctl.renderengine.skia_tracing_enabled
+  //   - debug.tracing.ctl.renderengine.skia_use_perfetto_track_events
   //
   // Does not affect actual track_event data *collection*, which must be
   // configured seperately.
@@ -453,12 +453,12 @@
   //
   // ATTENTION: affects ALL HWUI APPS if hwui_package_name_filter is not set!
   // If filtering is NOT set, this controls these GLOBAL system properties:
-  //   - debug.tracing.hwui.skia_tracing_enabled
-  //   - debug.tracing.hwui.skia_use_perfetto_track_events
+  //   - debug.tracing.ctl.hwui.skia_tracing_enabled
+  //   - debug.tracing.ctl.hwui.skia_use_perfetto_track_events
   // If filtering IS set, this controls these APP-SPECIFIC system properties,
   // for each package listed in the filter:
-  //   - debug.tracing.hwui.skia_tracing_enabled.<package.name>
-  //   - debug.tracing.hwui.skia_use_perfetto_track_events.<package.name>
+  //   - debug.tracing.ctl.hwui.skia_tracing_enabled.<package.name>
+  //   - debug.tracing.ctl.hwui.skia_use_perfetto_track_events.<package.name>
   //
   // Does not affect actual track_event data *collection*, which must be
   // configured seperately.
@@ -3135,6 +3135,13 @@
       // consumer.
       STOP_TRACING = 2;
 
+      // 3 was taken by CLONE_SNAPSHOT but that has been moved to 4.
+      // The early implementation of CLONE_SNAPSHOT had various bugs
+      // (b/290798988, b/290799105) and made it into Android U. The number
+      // change is to make sure nobody rolls out a config that hits the broken
+      // behaviour.
+      reserved 3;
+
       // When this mode is chosen, this causes a snapshot of the current tracing
       // session to be created after |stop_delay_ms| while the current tracing
       // session continues undisturbed (% an extra flush). This mode can be
@@ -3146,10 +3153,10 @@
       // consumer is supposed to call CloneSession() itself after the event.
       // Use use_clone_snapshot_if_available=true when targeting older versions
       // of perfetto.
-      CLONE_SNAPSHOT = 3;
+      CLONE_SNAPSHOT = 4;
 
-      // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android U+
-      // (14+) / Perfetto v34+. A bug in older versions of the tracing service
+      // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android V+
+      // (15+) / Perfetto v38+. A bug in older versions of the tracing service
       // might cause indefinitely long tracing sessions (see b/274931668).
     }
     optional TriggerMode trigger_mode = 1;
@@ -3162,7 +3169,11 @@
     // versions of Android and fall back to STOP_TRACING on older versions where
     // CLONE_SNAPSHOT did not exist.
     // When using this flag, trigger_mode must be set to STOP_TRACING.
-    optional bool use_clone_snapshot_if_available = 4;
+    optional bool use_clone_snapshot_if_available = 5;
+
+    // DEPRECATED, was use_clone_snapshot_if_available in U. See the comment
+    // around CLONE_SNAPSHOT.
+    reserved 4;
 
     message Trigger {
       // The producer must specify this name to activate the trigger.
diff --git a/protos/perfetto/config/trace_config.proto b/protos/perfetto/config/trace_config.proto
index d19e73a..ffee900 100644
--- a/protos/perfetto/config/trace_config.proto
+++ b/protos/perfetto/config/trace_config.proto
@@ -314,6 +314,13 @@
       // consumer.
       STOP_TRACING = 2;
 
+      // 3 was taken by CLONE_SNAPSHOT but that has been moved to 4.
+      // The early implementation of CLONE_SNAPSHOT had various bugs
+      // (b/290798988, b/290799105) and made it into Android U. The number
+      // change is to make sure nobody rolls out a config that hits the broken
+      // behaviour.
+      reserved 3;
+
       // When this mode is chosen, this causes a snapshot of the current tracing
       // session to be created after |stop_delay_ms| while the current tracing
       // session continues undisturbed (% an extra flush). This mode can be
@@ -325,10 +332,10 @@
       // consumer is supposed to call CloneSession() itself after the event.
       // Use use_clone_snapshot_if_available=true when targeting older versions
       // of perfetto.
-      CLONE_SNAPSHOT = 3;
+      CLONE_SNAPSHOT = 4;
 
-      // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android U+
-      // (14+) / Perfetto v34+. A bug in older versions of the tracing service
+      // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android V+
+      // (15+) / Perfetto v38+. A bug in older versions of the tracing service
       // might cause indefinitely long tracing sessions (see b/274931668).
     }
     optional TriggerMode trigger_mode = 1;
@@ -341,7 +348,11 @@
     // versions of Android and fall back to STOP_TRACING on older versions where
     // CLONE_SNAPSHOT did not exist.
     // When using this flag, trigger_mode must be set to STOP_TRACING.
-    optional bool use_clone_snapshot_if_available = 4;
+    optional bool use_clone_snapshot_if_available = 5;
+
+    // DEPRECATED, was use_clone_snapshot_if_available in U. See the comment
+    // around CLONE_SNAPSHOT.
+    reserved 4;
 
     message Trigger {
       // The producer must specify this name to activate the trigger.
diff --git a/protos/perfetto/metrics/chrome/BUILD.gn b/protos/perfetto/metrics/chrome/BUILD.gn
index f82d634..60c60a7 100644
--- a/protos/perfetto/metrics/chrome/BUILD.gn
+++ b/protos/perfetto/metrics/chrome/BUILD.gn
@@ -31,7 +31,6 @@
     "performance_mark_hashes.proto",
     "reported_by_page.proto",
     "scroll_jank.proto",
-    "scroll_jank_v2.proto",
     "scroll_jank_v3.proto",
     "slice_names.proto",
     "test_chrome_metric.proto",
diff --git a/protos/perfetto/metrics/chrome/all_chrome_metrics.proto b/protos/perfetto/metrics/chrome/all_chrome_metrics.proto
index 908af94..596bc7f 100644
--- a/protos/perfetto/metrics/chrome/all_chrome_metrics.proto
+++ b/protos/perfetto/metrics/chrome/all_chrome_metrics.proto
@@ -29,7 +29,6 @@
 import "protos/perfetto/metrics/chrome/reported_by_page.proto";
 import "protos/perfetto/metrics/chrome/slice_names.proto";
 import "protos/perfetto/metrics/chrome/scroll_jank.proto";
-import "protos/perfetto/metrics/chrome/scroll_jank_v2.proto";
 import "protos/perfetto/metrics/chrome/scroll_jank_v3.proto";
 import "protos/perfetto/metrics/chrome/test_chrome_metric.proto";
 import "protos/perfetto/metrics/chrome/touch_jank.proto";
@@ -53,6 +52,5 @@
   optional ChromeSliceNames chrome_slice_names = 1013;
   optional ChromeUnsymbolizedArgs chrome_unsymbolized_args = 1014;
   optional ChromeArgsClassNames chrome_args_class_names = 1015;
-  optional ChromeScrollJankV2 chrome_scroll_jank_v2 = 1016;
   optional ChromeScrollJankV3 chrome_scroll_jank_v3 = 1017;
 }
diff --git a/protos/perfetto/metrics/chrome/scroll_jank_v2.proto b/protos/perfetto/metrics/chrome/scroll_jank_v2.proto
deleted file mode 100644
index 4e9ef6d..0000000
--- a/protos/perfetto/metrics/chrome/scroll_jank_v2.proto
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2023 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 perfetto.protos;
-
-import "protos/perfetto/metrics/custom_options.proto";
-
-message ChromeScrollJankV2 {
-  // Total time spent processing scroll updates.
-  optional double scroll_processing_ms = 1 [(unit) = "ms_biggerIsBetter"];
-  // Of the total scrolling processing time, this much is considered
-  // "janky". This excludes jank caused due to
-  // `RendererCompositorQueueingDelay`, which can add nontrivial noise.
-  optional double scroll_jank_processing_ms = 2 [(unit) = "ms_smallerIsBetter"];
-  // Computed as: `100 * scroll_jank_processing_ms / scroll_processing_ms`.
-  optional double scroll_jank_percentage = 3 [(unit) = "n%_smallerIsBetter"];
-  // The number of scroll janks. Similar to above, this excludes jank caused
-  // due to `RendererCompositorQueueingDelay`, which can add nontrivial noise.
-  optional int64 num_scroll_janks = 4 [(unit) = "count_smallerIsBetter"];
-  // The primary cause, sub-cause, and duration for scroll jank, one for each
-  // jank. There are exactly `num_scroll_janks` items in this field.
-  message ScrollJankCauseAndDuration {
-    optional string cause = 1;
-    optional string sub_cause = 2;
-    optional double duration_ms = 3 [(unit) = "ms_smallerIsBetter"];
-  }
-  repeated ScrollJankCauseAndDuration scroll_jank_causes_and_durations = 5;
-}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index 34039ff..75043d0 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -436,8 +436,8 @@
   // restarted.
   //
   // Specifically this sets the following system properties:
-  //   - debug.tracing.renderengine.skia_tracing_enabled
-  //   - debug.tracing.renderengine.skia_use_perfetto_track_events
+  //   - debug.tracing.ctl.renderengine.skia_tracing_enabled
+  //   - debug.tracing.ctl.renderengine.skia_use_perfetto_track_events
   //
   // Does not affect actual track_event data *collection*, which must be
   // configured seperately.
@@ -453,12 +453,12 @@
   //
   // ATTENTION: affects ALL HWUI APPS if hwui_package_name_filter is not set!
   // If filtering is NOT set, this controls these GLOBAL system properties:
-  //   - debug.tracing.hwui.skia_tracing_enabled
-  //   - debug.tracing.hwui.skia_use_perfetto_track_events
+  //   - debug.tracing.ctl.hwui.skia_tracing_enabled
+  //   - debug.tracing.ctl.hwui.skia_use_perfetto_track_events
   // If filtering IS set, this controls these APP-SPECIFIC system properties,
   // for each package listed in the filter:
-  //   - debug.tracing.hwui.skia_tracing_enabled.<package.name>
-  //   - debug.tracing.hwui.skia_use_perfetto_track_events.<package.name>
+  //   - debug.tracing.ctl.hwui.skia_tracing_enabled.<package.name>
+  //   - debug.tracing.ctl.hwui.skia_use_perfetto_track_events.<package.name>
   //
   // Does not affect actual track_event data *collection*, which must be
   // configured seperately.
@@ -3135,6 +3135,13 @@
       // consumer.
       STOP_TRACING = 2;
 
+      // 3 was taken by CLONE_SNAPSHOT but that has been moved to 4.
+      // The early implementation of CLONE_SNAPSHOT had various bugs
+      // (b/290798988, b/290799105) and made it into Android U. The number
+      // change is to make sure nobody rolls out a config that hits the broken
+      // behaviour.
+      reserved 3;
+
       // When this mode is chosen, this causes a snapshot of the current tracing
       // session to be created after |stop_delay_ms| while the current tracing
       // session continues undisturbed (% an extra flush). This mode can be
@@ -3146,10 +3153,10 @@
       // consumer is supposed to call CloneSession() itself after the event.
       // Use use_clone_snapshot_if_available=true when targeting older versions
       // of perfetto.
-      CLONE_SNAPSHOT = 3;
+      CLONE_SNAPSHOT = 4;
 
-      // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android U+
-      // (14+) / Perfetto v34+. A bug in older versions of the tracing service
+      // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android V+
+      // (15+) / Perfetto v38+. A bug in older versions of the tracing service
       // might cause indefinitely long tracing sessions (see b/274931668).
     }
     optional TriggerMode trigger_mode = 1;
@@ -3162,7 +3169,11 @@
     // versions of Android and fall back to STOP_TRACING on older versions where
     // CLONE_SNAPSHOT did not exist.
     // When using this flag, trigger_mode must be set to STOP_TRACING.
-    optional bool use_clone_snapshot_if_available = 4;
+    optional bool use_clone_snapshot_if_available = 5;
+
+    // DEPRECATED, was use_clone_snapshot_if_available in U. See the comment
+    // around CLONE_SNAPSHOT.
+    reserved 4;
 
     message Trigger {
       // The producer must specify this name to activate the trigger.
@@ -10908,8 +10919,10 @@
   // Extension range reserved for chromium:
   // https://source.chromium.org/chromium/chromium/src/+/main:base/tracing/protos/chrome_track_event.proto
   extensions 1000 to 1999;
+  // Extension range reserved for https://b.corp.google.com/issues/301227627.
+  extensions 2000 to 2000;
   // Extension range for future use.
-  extensions 2000 to 9899;
+  extensions 2001 to 9899;
   // Reserved for Perfetto unit and integration tests.
   extensions 9900 to 10000;
 
diff --git a/protos/perfetto/trace/track_event/track_event.proto b/protos/perfetto/trace/track_event/track_event.proto
index 9991979..cde2fbb 100644
--- a/protos/perfetto/trace/track_event/track_event.proto
+++ b/protos/perfetto/trace/track_event/track_event.proto
@@ -283,8 +283,10 @@
   // Extension range reserved for chromium:
   // https://source.chromium.org/chromium/chromium/src/+/main:base/tracing/protos/chrome_track_event.proto
   extensions 1000 to 1999;
+  // Extension range reserved for https://b.corp.google.com/issues/301227627.
+  extensions 2000 to 2000;
   // Extension range for future use.
-  extensions 2000 to 9899;
+  extensions 2001 to 9899;
   // Reserved for Perfetto unit and integration tests.
   extensions 9900 to 10000;
 
diff --git a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
index 27df202..9d7599a 100644
--- a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
@@ -24,7 +24,7 @@
 namespace trace_processor {
 namespace {
 
-std::array<FtraceMessageDescriptor, 484> descriptors{{
+std::array<FtraceMessageDescriptor, 485> descriptors{{
     {nullptr, 0, {}},
     {nullptr, 0, {}},
     {nullptr, 0, {}},
@@ -5323,6 +5323,18 @@
             {"info_val", ProtoSchemaType::kUint64},
         },
     },
+    {
+        "samsung_tracing_mark_write",
+        5,
+        {
+            {},
+            {"pid", ProtoSchemaType::kInt32},
+            {"trace_name", ProtoSchemaType::kString},
+            {"trace_begin", ProtoSchemaType::kUint32},
+            {"trace_type", ProtoSchemaType::kUint32},
+            {"value", ProtoSchemaType::kInt32},
+        },
+    },
 }};
 
 }  // namespace
diff --git a/src/trace_processor/metrics/sql/chrome/BUILD.gn b/src/trace_processor/metrics/sql/chrome/BUILD.gn
index 78d7df7..30962b8 100644
--- a/src/trace_processor/metrics/sql/chrome/BUILD.gn
+++ b/src/trace_processor/metrics/sql/chrome/BUILD.gn
@@ -36,7 +36,6 @@
     "chrome_reliable_range.sql",
     "chrome_scroll_inputs_per_frame.sql",
     "chrome_scroll_jank_caused_by_scheduling.sql",
-    "chrome_scroll_jank_v2.sql",
     "chrome_scroll_jank_v3.sql",
     "chrome_slice_names.sql",
     "chrome_stack_samples_for_task.sql",
diff --git a/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v2.sql b/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v2.sql
deleted file mode 100644
index 2884d7a..0000000
--- a/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v2.sql
+++ /dev/null
@@ -1,96 +0,0 @@
---
--- Copyright 2020 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
---
---     https://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.
---
--- A collection of metrics related to janky scrolling. Please refer to the
--- corresponding `chrome/scroll_jank_v2.proto` for more details.
-
-INCLUDE PERFETTO MODULE chrome.scroll_jank.event_latency_scroll_jank_cause;
-
-DROP VIEW IF EXISTS __chrome_scroll_jank_v2_scroll_processing;
-
-CREATE VIEW __chrome_scroll_jank_v2_scroll_processing
-AS
-SELECT COALESCE(SUM(jank.dur), 0) / 1.0e6 AS scroll_processing_ms
-FROM
-  chrome_scroll_event_latency_jank AS jank
-LEFT JOIN
-  chrome_event_latency_scroll_jank_cause AS cause
-  ON
-    jank.id = cause.slice_id;
-
-DROP VIEW IF EXISTS __chrome_scroll_jank_v2_causes_and_durations;
-
-CREATE VIEW __chrome_scroll_jank_v2_causes_and_durations
-AS
-SELECT
-  COALESCE(SUM(jank.dur), 0) / 1.0e6 AS scroll_jank_processing_ms,
-  COUNT(*) AS num_scroll_janks,
-  RepeatedField(
-    ChromeScrollJankV2_ScrollJankCauseAndDuration(
-      'cause',
-      cause.cause_of_jank,
-      'sub_cause',
-      cause.sub_cause_of_jank,
-      'duration_ms',
-      jank.dur / 1.0e6))
-    AS scroll_jank_causes_and_durations
-FROM
-  chrome_scroll_event_latency_jank AS jank
-LEFT JOIN
-  chrome_event_latency_scroll_jank_cause AS cause
-  ON
-    jank.id = cause.slice_id
-WHERE
-  jank.jank AND cause.cause_of_jank != 'RendererCompositorQueueingDelay';
-
-DROP VIEW IF EXISTS __chrome_scroll_jank_v2;
-
-CREATE VIEW __chrome_scroll_jank_v2
-AS
-SELECT
-  100.0 * scroll_jank_processing_ms / scroll_processing_ms
-    AS scroll_jank_percentage,
-  *
-FROM
-  (
-    SELECT
-      total_scroll_processing.scroll_processing_ms,
-      causes_and_durations.scroll_jank_processing_ms,
-      causes_and_durations.num_scroll_janks,
-      causes_and_durations.scroll_jank_causes_and_durations
-    FROM
-      __chrome_scroll_jank_v2_scroll_processing
-        AS total_scroll_processing,
-      __chrome_scroll_jank_v2_causes_and_durations AS causes_and_durations
-  );
-
-DROP VIEW IF EXISTS chrome_scroll_jank_v2_output;
-
-CREATE VIEW chrome_scroll_jank_v2_output
-AS
-SELECT
-  ChromeScrollJankV2(
-    'scroll_processing_ms',
-    scroll_processing_ms,
-    'scroll_jank_processing_ms',
-    scroll_jank_processing_ms,
-    'scroll_jank_percentage',
-    scroll_jank_percentage,
-    'num_scroll_janks',
-    num_scroll_janks,
-    'scroll_jank_causes_and_durations',
-    scroll_jank_causes_and_durations)
-FROM
-  __chrome_scroll_jank_v2;
diff --git a/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql b/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql
index 514f184..f1effb2 100644
--- a/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql
+++ b/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql
@@ -32,7 +32,7 @@
 SELECT
   -- MAX does not matter for these aggregations, since the values are the
   -- same across rows.
-  (SELECT COUNT(*) FROM chrome_janky_frame_info_with_delay)
+  (SELECT COUNT(*) FROM chrome_frame_info_with_delay)
     AS trace_num_frames,
   (SELECT COUNT(*) FROM chrome_janky_frames)
     AS trace_num_janky_frames,
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/BUILD.gn
index 3e30a16..6e5f2f4 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/BUILD.gn
@@ -16,11 +16,9 @@
 
 perfetto_sql_source_set("scroll_jank") {
   sources = [
-    "event_latency_scroll_jank.sql",
-    "event_latency_scroll_jank_cause.sql",
-    "event_latency_to_breakdowns.sql",
     "scroll_jank_intervals.sql",
     "scroll_jank_v3.sql",
+    "scroll_jank_v3_cause.sql",
     "utils.sql",
   ]
 }
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank.sql
deleted file mode 100644
index 7690359..0000000
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank.sql
+++ /dev/null
@@ -1,182 +0,0 @@
---
--- Copyright 2022 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
---
---     https://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.
---
--- A scroll jank metric based on EventLatency slices.
---
--- We define an update to be janky if comparing forwards or backwards (ignoring
--- coalesced and not shown on the screen updates) a given updates exceeds the duration
--- of its predecessor or successor by 50% of a vsync interval (defaulted to 60 FPS).
---
--- WARNING: This metric should not be used as a source of truth. It is under
---          active development and the values & meaning might change without
---          notice.
-
-INCLUDE PERFETTO MODULE chrome.scroll_jank.utils;
-INCLUDE PERFETTO MODULE chrome.scroll_jank.event_latency_to_breakdowns;
-INCLUDE PERFETTO MODULE chrome.vsync_intervals;
-
--- Creates table view where each EventLatency event has its upid.
-CREATE VIEW internal_event_latency_with_track
-AS
-SELECT
-  slice.*,
-  process_track.upid AS upid
-FROM slice JOIN process_track
-  ON slice.track_id = process_track.id
-WHERE slice.name = "EventLatency";
-
--- Select scroll EventLatency events that were shown on the screen.
--- An update event was shown on the screen if and only if
--- it has a "SubmitCompositorFrameToPresentationCompositorFrame" breakdown.
--- But this logic is not applied for begin events, because a begin event is an artifical marker
--- and never gets shown to the screen because it doesn't contain any update.
--- Also it automaticly only includes non-coalesced EventLatency events,
--- because coalesced ones are not shown on the screen.
-CREATE VIEW internal_filtered_scroll_event_latency
-AS
-WITH shown_on_display_event_latency_ids AS (
-  SELECT
-  event_latency_id
-  FROM chrome_event_latency_breakdowns
-  WHERE name = "SubmitCompositorFrameToPresentationCompositorFrame" OR event_type = "GESTURE_SCROLL_BEGIN"
-)
-SELECT
-  internal_event_latency_with_track.id,
-  internal_event_latency_with_track.track_id,
-  internal_event_latency_with_track.upid,
-  internal_event_latency_with_track.ts,
-  internal_event_latency_with_track.dur,
-  EXTRACT_ARG(internal_event_latency_with_track.arg_set_id, "event_latency.event_type") AS event_type
-FROM internal_event_latency_with_track JOIN shown_on_display_event_latency_ids
-  ON internal_event_latency_with_track.id = shown_on_display_event_latency_ids.event_latency_id
-WHERE
-  event_type IN (
-    "GESTURE_SCROLL_BEGIN", "GESTURE_SCROLL_UPDATE",
-    "INERTIAL_GESTURE_SCROLL_UPDATE", "FIRST_GESTURE_SCROLL_UPDATE");
-
--- Select begin events and it's next begin event witin the same process (same upid).
---
--- Note: Must be a TABLE because it uses a window function which can behave
---       strangely in views.
-CREATE PERFETTO TABLE internal_scroll_event_latency_begins
-AS
-SELECT
-  *,
-  LEAD(ts) OVER sorted_begins AS next_gesture_begin_ts
-FROM internal_filtered_scroll_event_latency
-WHERE event_type = "GESTURE_SCROLL_BEGIN"
-WINDOW sorted_begins AS (PARTITION BY upid ORDER BY ts ASC);
-
--- For each scroll update event finds it's begin event.
--- Pair [upid, next_gesture_begin_ts] represent a gesture key.
--- We need to know the gesture key of gesture scroll to calculate a jank only within this gesture scroll.
--- Because different gesture scrolls can have different properties.
-CREATE VIEW internal_scroll_event_latency_updates
-AS
-SELECT
-  internal_filtered_scroll_event_latency.*,
-  internal_scroll_event_latency_begins.ts AS gesture_begin_ts,
-  internal_scroll_event_latency_begins.next_gesture_begin_ts AS next_gesture_begin_ts
-FROM internal_filtered_scroll_event_latency LEFT JOIN internal_scroll_event_latency_begins
-  ON internal_filtered_scroll_event_latency.ts >= internal_scroll_event_latency_begins.ts
-     AND (internal_filtered_scroll_event_latency.ts < next_gesture_begin_ts OR next_gesture_begin_ts IS NULL)
-     AND internal_filtered_scroll_event_latency.upid = internal_scroll_event_latency_begins.upid
-WHERE internal_filtered_scroll_event_latency.id != internal_scroll_event_latency_begins.id
-      AND internal_filtered_scroll_event_latency.event_type != "GESTURE_SCROLL_BEGIN";
-
--- Find the last EventLatency scroll update event in the scroll.
--- We will use the last EventLatency event insted of "InputLatency::GestureScrollEnd" event.
--- We need to know when the scroll gesture ends so that we can later calculate
--- the average vsync interval just up to the end of the gesture.
-CREATE VIEW internal_scroll_event_latency_updates_ends
-AS
-SELECT
-  id,
-  upid,
-  gesture_begin_ts,
-  ts,
-  dur,
-  MAX(ts + dur) AS gesture_end_ts
-FROM internal_scroll_event_latency_updates
-GROUP BY upid, gesture_begin_ts;
-
-CREATE VIEW internal_scroll_event_latency_updates_with_ends
-AS
-SELECT
-  internal_scroll_event_latency_updates.*,
-  internal_scroll_event_latency_updates_ends.gesture_end_ts AS gesture_end_ts
-FROM internal_scroll_event_latency_updates LEFT JOIN internal_scroll_event_latency_updates_ends
-  ON internal_scroll_event_latency_updates.upid = internal_scroll_event_latency_updates_ends.upid
-    AND internal_scroll_event_latency_updates.gesture_begin_ts = internal_scroll_event_latency_updates_ends.gesture_begin_ts;
-
--- Creates table where each event contains info about it's previous and next events.
--- We consider only previous and next events from the same scroll id
--- to don't calculate a jank between different scrolls.
---
--- Note: Must be a TABLE because it uses a window function which can behave
---       strangely in views.
-CREATE PERFETTO TABLE internal_scroll_event_latency_with_neighbours
-AS
-SELECT
-  *,
-  LEAD(id) OVER sorted_events AS next_id,
-  LEAD(ts) OVER sorted_events AS next_ts,
-  LEAD(dur) OVER sorted_events AS next_dur,
-  LAG(id) OVER sorted_events AS prev_id,
-  LAG(ts) OVER sorted_events AS prev_ts,
-  LAG(dur) OVER sorted_events AS prev_dur,
-  calculate_avg_vsync_interval(gesture_begin_ts, gesture_end_ts) AS avg_vsync_interval
-FROM internal_scroll_event_latency_updates_with_ends
-WINDOW sorted_events AS (PARTITION BY upid, next_gesture_begin_ts ORDER BY id ASC, ts ASC);
-
-CREATE VIEW internal_scroll_event_latency_neighbors_jank
-AS
-SELECT
-  is_janky_frame(gesture_begin_ts, gesture_begin_ts, next_ts,
-    gesture_begin_ts, gesture_end_ts, dur / avg_vsync_interval, next_dur / avg_vsync_interval) AS next_jank,
-  is_janky_frame(gesture_begin_ts, gesture_begin_ts, prev_ts,
-    gesture_begin_ts, gesture_end_ts, dur / avg_vsync_interval, prev_dur / avg_vsync_interval) AS prev_jank,
-  internal_scroll_event_latency_with_neighbours.*
-FROM internal_scroll_event_latency_with_neighbours;
-
--- Creates a view where each event contains information about whether it is janky
--- with respect to previous and next events within the same scroll.
---
--- @column jank                   Whether this event is janky.
--- @column next_jank              Whether the subsequent event is janky.
--- @column prev_jank              Whether the previous event is janky.
--- @column id                     ID of the frame.
--- @column track_id               Track ID of the frame.
--- @column upid                   Process ID of the frame.
--- @column ts                     Timestamp of the frame.
--- @column dur                    Duration of the frame.
--- @column event_type             Event type.
--- @column gesture_begin_ts       Timestamp of the associated gesture begin
---                                event.
--- @column next_gesture_begin_ts  Timestamp of the subsequent gesture begin
---                                event.
--- @column gesture_end_ts         Timestamp of the associated gesture end event.
--- @column next_id                ID of the next frame
--- @column next_ts                Timestamp of the next frame.
--- @column next_dur               Duration of the next frame.
--- @column prev_id                ID of the previous frame.
--- @column prev_ts                Timestamp of the previous frame.
--- @column prev_dur               Duration of the previous frame.
-CREATE VIEW chrome_scroll_event_latency_jank
-AS
-SELECT
-  (next_jank IS NOT NULL AND next_jank) OR (prev_jank IS NOT NULL AND prev_jank) AS jank,
-  *
-FROM internal_scroll_event_latency_neighbors_jank;
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank_cause.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank_cause.sql
deleted file mode 100644
index 08a6d6a..0000000
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank_cause.sql
+++ /dev/null
@@ -1,194 +0,0 @@
---
--- Copyright 2022 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
---
---     https://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.
---
--- Calculating how often each breakdown causes a scroll jank.
--- We define that a breakdown causes a scroll jank in the janky EventLatency event if it increased
--- more than other breakdowns relatevly to its neigbour EventLatency events.
---
--- WARNING: This metric should not be used as a source of truth. It is under
---          active development and the values & meaning might change without
---          notice.
-
-
-INCLUDE PERFETTO MODULE chrome.scroll_jank.event_latency_scroll_jank;
-
--- Calculating the jank delta for EventLatency events which are janky relatevly to its next EventLatency event.
--- For breakdowns that exist in the current EventLatency but not the next EventLatency
--- we use a default of 0 so that the full duration is considered when looking for the maximum increase.
--- Breakdowns that exist in the next EventLatency event, but not in the current EventLatency event,
--- are ignored because they do not cause a jank anyway.
-CREATE VIEW internal_event_latency_scroll_breakdowns_next_jank_deltas
-AS
-SELECT
-    cur_breakdowns.*,
-    next_breakdowns.event_type as next_event_type,
-    next_breakdowns.slice_id as next_breakdown_id,
-    next_breakdowns.dur as next_dur,
-    cur_breakdowns.dur - COALESCE(next_breakdowns.dur, 0) as delta_dur_ns
-FROM internal_event_latency_scroll_breakdowns_jank as cur_breakdowns LEFT JOIN internal_event_latency_scroll_breakdowns_jank as next_breakdowns
-ON cur_breakdowns.next_event_latency_id = next_breakdowns.event_latency_id AND
-    cur_breakdowns.name = next_breakdowns.name
-WHERE cur_breakdowns.next_jank = 1;
-
--- Calculating the jank delta for EventLatency events which are janky relatevly to its prev EventLatency event.
--- For breakdowns that exist in the current EventLatency but not the prev EventLatency
--- we use a default of 0 so that the full duration is considered when looking for the maximum increase.
--- Breakdowns that exist in the prev EventLatency event, but not in the current EventLatency event,
--- are ignored because they do not cause a jank anyway.
-CREATE VIEW internal_event_latency_scroll_breakdowns_prev_jank_deltas
-AS
-SELECT
-    cur_breakdowns.*,
-    prev_breakdowns.event_type as prev_event_type,
-    prev_breakdowns.slice_id as prev_breakdown_id,
-    prev_breakdowns.dur as prev_dur,
-    cur_breakdowns.dur - COALESCE(prev_breakdowns.dur, 0) as delta_dur_ns
-FROM internal_event_latency_scroll_breakdowns_jank as cur_breakdowns LEFT JOIN internal_event_latency_scroll_breakdowns_jank as prev_breakdowns
-ON cur_breakdowns.prev_event_latency_id = prev_breakdowns.event_latency_id AND
-    cur_breakdowns.name = prev_breakdowns.name
-WHERE cur_breakdowns.prev_jank = 1;
-
--- Add a jank indicator to each breakdown. Jank indicator is related to an entire EventLatency envent, not only to a breakdown.
-CREATE VIEW internal_event_latency_scroll_breakdowns_jank
-AS
-SELECT
-  chrome_event_latency_breakdowns.*,
-  chrome_scroll_event_latency_jank.jank,
-  chrome_scroll_event_latency_jank.next_jank,
-  chrome_scroll_event_latency_jank.prev_jank,
-  chrome_scroll_event_latency_jank.next_id as next_event_latency_id,
-  chrome_scroll_event_latency_jank.prev_id as prev_event_latency_id
-FROM chrome_event_latency_breakdowns JOIN chrome_scroll_event_latency_jank
-ON chrome_event_latency_breakdowns.event_latency_id = chrome_scroll_event_latency_jank.id
-WHERE chrome_event_latency_breakdowns.event_type in ("GESTURE_SCROLL_UPDATE", "FIRST_GESTURE_SCROLL_UPDATE", "INERTIAL_GESTURE_SCROLL_UPDATE");
-
--- Merge breakdowns from the |internal_event_latency_scroll_breakdowns_next_jank_deltas|
--- and |internal_event_latency_scroll_breakdowns_prev_jank_deltas| tables and select the maximum |delta_dur_ns| of them.
--- This is necessary in order to get a single reason for the jank for the event later.
-CREATE VIEW internal_event_latency_scroll_breakdowns_max_jank_deltas
-AS
-SELECT
-  COALESCE(next.slice_id, prev.slice_id) as slice_id,
-  COALESCE(next.name, prev.name) as name,
-  COALESCE(next.event_latency_id, prev.event_latency_id) as event_latency_id,
-  COALESCE(next.event_latency_track_id, prev.event_latency_track_id) as track_id,
-  COALESCE(next.event_latency_dur, prev.event_latency_dur) as event_latency_dur,
-  COALESCE(next.event_latency_ts, prev.event_latency_ts) as event_latency_ts,
-  COALESCE(next.event_type, prev.event_type) as event_type,
-  COALESCE(next.event_latency_ts, prev.event_latency_ts) as ts,
-  COALESCE(next.event_latency_dur, prev.event_latency_dur) as dur,
-  COALESCE(next.jank, prev.jank) as jank,
-  COALESCE(next.next_jank, 0) as next_jank,
-  COALESCE(prev.prev_jank, 0) as prev_jank,
-  next.next_event_latency_id as next_event_latency_id,
-  prev.prev_event_latency_id as prev_event_latency_id,
-  next.delta_dur_ns as next_delta_dur_ns,
-  prev.delta_dur_ns as prev_delta_dur_ns,
-  CASE
-    WHEN prev.delta_dur_ns IS NULL OR next.delta_dur_ns >  prev.delta_dur_ns
-      THEN next.delta_dur_ns
-    ELSE prev.delta_dur_ns
-  END as delta_dur_ns,
-  CASE
-    WHEN prev.delta_dur_ns IS NULL OR next.delta_dur_ns >  prev.delta_dur_ns
-      THEN next.next_breakdown_id
-    ELSE prev.prev_breakdown_id
-  END as max_jank_neigbour_breakdown_id
-FROM internal_event_latency_scroll_breakdowns_next_jank_deltas as next
-FULL JOIN internal_event_latency_scroll_breakdowns_prev_jank_deltas as prev
-ON next.slice_id = prev.slice_id;
-
--- Selecting breakdowns which have a maximum ns duration delta as a main causes of a jank for this EventLatency event.
-CREATE VIEW internal_event_latency_scroll_jank_cause_top_level
-AS
-SELECT
-  event_latency_id as slice_id,
-  track_id,
-  event_latency_dur as dur,
-  event_latency_ts as ts,
-  event_type,
-  next_jank,
-  prev_jank,
-  next_event_latency_id,
-  prev_event_latency_id,
-  next_delta_dur_ns,
-  prev_delta_dur_ns,
-  name as cause_of_jank,
-  slice_id as max_jank_breakdown_id,
-  max_jank_neigbour_breakdown_id,
-  MAX(delta_dur_ns) as max_delta_dur_ns
-FROM internal_event_latency_scroll_breakdowns_max_jank_deltas
-GROUP BY event_latency_id;
-
--- Selecting sub-breakdowns of the main causes of a jank which have a maximum ns duration delta with a neighbour event's breakdowns.
-CREATE VIEW internal_event_latency_scroll_sub_breakdowns_max_deltas
-AS
-SELECT
-  cur_event_latency.slice_id as event_latency_id,
-  cur_sub_breakdowns.name as sub_breakdown_name,
-  MAX(cur_sub_breakdowns.dur - neighbour_sub_breakdowns.dur) as max_sub_breakdown_delta_dur_ns
-FROM internal_event_latency_scroll_jank_cause_top_level as cur_event_latency
-LEFT JOIN slices as cur_sub_breakdowns
-  ON cur_event_latency.max_jank_breakdown_id = cur_sub_breakdowns.parent_id
-LEFT JOIN slices as neighbour_sub_breakdowns
-  ON cur_event_latency.max_jank_neigbour_breakdown_id = neighbour_sub_breakdowns.parent_id AND
-   cur_sub_breakdowns.name = neighbour_sub_breakdowns.name
-GROUP BY cur_event_latency.slice_id, cur_event_latency.max_jank_breakdown_id;
-
--- Selecting the main cause of jank and its sub-cause of jank.
---
--- @column slice_id               The id of the EventLatency/frame.
--- @column track_id               The track id associated with the EventLatency.
--- @column dur                    The duration of the frame presentation.
--- @column ts                     The timestamp of the frame.
--- @column event_type             The event type.
--- @column next_jank              Whether the subsequent event is janky.
--- @column prev_jank              Whether the previous event is janky.
--- @column next_event_latency_id  The ID of the next frame.
--- @column prev_event_latency_id  The ID of the previous frame.
--- @column next_delta_dur_ns      The duration delta in ns of the next frame.
--- @column prev_delta_dur_ns      The duration delta in ns of the previous
---                                frame.
--- @column cause_of_jank          The stage of EventLatency responsible for the
---                                jank.
--- @column max_jank_breakdown_id  The ID of the stage of maximum jank.
--- @column max_jank_neighbor_breakdown_id     The ID of the stage of maximum
---                                jank in a neighboring frame.
--- @column max_delta_dur_ns       The maximum delta duration of jank in ns.
--- @column sub_cause_of_jank      The sub-stage of the cause_of_jank that is
---                                responsible for the jank, if such a stage
---                                exists.
-CREATE VIEW chrome_event_latency_scroll_jank_cause
-AS
-SELECT
-  internal_event_latency_scroll_jank_cause_top_level.*,
-  max_sub_breakdowns.sub_breakdown_name as sub_cause_of_jank
-FROM internal_event_latency_scroll_jank_cause_top_level
-LEFT JOIN internal_event_latency_scroll_sub_breakdowns_max_deltas as max_sub_breakdowns
-ON internal_event_latency_scroll_jank_cause_top_level.slice_id = max_sub_breakdowns.event_latency_id;
-
--- Calculate how often each breakdown is a main cause of a jank for EventLatency events.
---
--- @column cause_of_jank             Cause of jank in the trace
--- @column sub_cause_of_jank         Associated sub-cause of jank in the trace.
--- @column cnt                       # of janks with this cause/subcause pair.
-CREATE VIEW chrome_event_latency_scroll_jank_cause_cnt
-AS
-SELECT
-  cause_of_jank,
-  sub_cause_of_jank,
-  COUNT(*) as cnt
-FROM chrome_event_latency_scroll_jank_cause
-GROUP BY cause_of_jank, sub_cause_of_jank;
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_to_breakdowns.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_to_breakdowns.sql
deleted file mode 100644
index a8e9c0e..0000000
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_to_breakdowns.sql
+++ /dev/null
@@ -1,193 +0,0 @@
---
--- Copyright 2022 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
---
---     https://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.
---
--- Creates metric with info about breakdowns and jank for GestureScrollBegin and GestureScrollUpdate.
-
--- Select EventLatency events.
-CREATE VIEW internal_event_latency
-AS
-SELECT
-  *,
-  EXTRACT_ARG(arg_set_id, "event_latency.event_type") AS event_type
-FROM slice
-WHERE
-  name = "EventLatency";
-
--- Select breakdowns related to EventLatencies.
---
--- @column slice_id                  ID of the slice.
--- @column name                      Slice name.
--- @column dur                       Slice duration.
--- @column track_id                  Track ID of the slice.
--- @column ts                        Timestamp of the slice.
--- @column event_latency_id          ID of the associated EventLatency slice.
--- @column event_latency_track_id    Track ID of the associated EventLatency.
--- @column event_latency_ts          Timestamp of the associated EventLatency.
--- @column event_latency_dur         Duration of the associated EventLatency.
--- @column event_type                Event type of the associated EventLatency.
-CREATE VIEW chrome_event_latency_breakdowns
-AS
-SELECT
-  slice.id AS slice_id,
-  slice.name AS name,
-  slice.dur AS dur,
-  slice.track_id AS track_id,
-  slice.ts AS ts,
-  internal_event_latency.slice_id AS event_latency_id,
-  internal_event_latency.track_id AS event_latency_track_id,
-  internal_event_latency.ts AS event_latency_ts,
-  internal_event_latency.dur AS event_latency_dur,
-  internal_event_latency.event_type AS event_type
-FROM slice JOIN internal_event_latency
-  ON slice.parent_id = internal_event_latency.slice_id;
-
--- The function takes a breakdown name and checks if the breakdown name is known or not.
--- Returns the input breakdown name if it's an unknown breakdown, NULL otherwise.
-CREATE PERFETTO FUNCTION internal_invalid_name_or_null(name STRING)
-RETURNS STRING AS
-SELECT
-  CASE
-    WHEN
-    $name not in (
-      "GenerationToBrowserMain", "GenerationToRendererCompositor",
-      "BrowserMainToRendererCompositor", "RendererCompositorQueueingDelay",
-      "RendererCompositorToMain", "RendererCompositorProcessing",
-      "RendererMainProcessing", "EndActivateToSubmitCompositorFrame",
-      "SubmitCompositorFrameToPresentationCompositorFrame",
-      "ArrivedInRendererCompositorToTermination",
-      "RendererCompositorStartedToTermination",
-      "RendererMainFinishedToTermination",
-      "RendererCompositorFinishedToTermination",
-      "RendererMainStartedToTermination",
-      "RendererCompositorFinishedToBeginImplFrame",
-      "RendererCompositorFinishedToCommit",
-      "RendererCompositorFinishedToEndCommit",
-      "RendererCompositorFinishedToActivation",
-      "RendererCompositorFinishedToEndActivate",
-      "RendererCompositorFinishedToSubmitCompositorFrame",
-      "RendererMainFinishedToBeginImplFrame",
-      "RendererMainFinishedToSendBeginMainFrame",
-      "RendererMainFinishedToCommit", "RendererMainFinishedToEndCommit",
-      "RendererMainFinishedToActivation", "RendererMainFinishedToEndActivate",
-      "RendererMainFinishedToSubmitCompositorFrame",
-      "BeginImplFrameToSendBeginMainFrame",
-      "RendererCompositorFinishedToSendBeginMainFrame",
-      "SendBeginMainFrameToCommit", "Commit",
-      "EndCommitToActivation", "Activation")
-      THEN $name
-    ELSE NULL
-  END;
-
--- Creates a view where each row contains information about one EventLatency event. Columns are duration of breakdowns.
--- In the result it will be something like this:
--- | event_latency_id | event_latency_ts | event_latency_dur | event_type       | GenerationToBrowserMainNs | BrowserMainToRendererCompositorNs |...|
--- |------------------|------------------|-------------------|------------------|----------------------------|------------------------------------|---|
--- | 123              | 1661947470       | 20                | 1234567          | 30                         | 50                                 |   |
---
--- @column event_latency_id                  The EventLatency ID.
--- @column event_latency_track_id            The EventLatency Track ID.
--- @column event_latency_ts                  Timestamp of EventLatency.
--- @column event_latency_dur                 Duration of EventLatency.
--- @column event_type                        Event type.
--- @column GenerationToRendererCompositorNs  Duration of the
---                                           GenerationToRendererCompositorNs
---                                           stage. All subsequent columns are
---                                           durations and named for their
---                                           respective stages.
--- @column GenerationToBrowserMainNs         Duration, see above.
--- @column BrowserMainToRendererCompositorNs Duration, see above.
--- @column RendererCompositorQueueingDelayNs Duration, see above.
--- @column RendererCompositorProcessingNs    Duration, see above.
--- @column RendererCompositorToMainNs        Duration, see above.
--- @column RendererMainProcessingNs          Duration, see above.
--- @column ArrivedInRendererCompositorToTerminationNs   Duration, see above.
--- @column RendererCompositorStartedToTerminationNs     Duration, see above.
--- @column RendererCompositorFinishedToTerminationNs    Duration, see above.
--- @column RendererMainStartedToTerminationNs           Duration, see above.
--- @column RendererMainFinishedToTerminationNs          Duration, see above.
--- @column BeginImplFrameToSendBeginMainFrameNs         Duration, see above.
--- @column RendererCompositorFinishedToSendBeginMainFrameNs Duration, see above.
--- @column RendererCompositorFinishedToBeginImplFrameNs     Duration, see above.
--- @column RendererCompositorFinishedToCommitNs         Duration, see above.
--- @column RendererCompositorFinishedToEndCommitNs      Duration, see above.
--- @column RendererCompositorFinishedToActivationNs     Duration, see above.
--- @column RendererCompositorFinishedToEndActivateNs    Duration, see above.
--- @column RendererCompositorFinishedToSubmitCompositorFrameNs Duration, see
---                                                             above.
--- @column RendererMainFinishedToBeginImplFrameNs       Duration, see above.
--- @column RendererMainFinishedToSendBeginMainFrameNs   Duration, see above.
--- @column RendererMainFinishedToCommitNs    Duration, see above.
--- @column RendererMainFinishedToEndCommitNs Duration, see above.
--- @column RendererMainFinishedToActivationNs           Duration, see above.
--- @column RendererMainFinishedToEndActivateNs          Duration, see above.
--- @column RendererMainFinishedToSubmitCompositorFrameNs       Duration, see
---                                                             above.
--- @column EndActivateToSubmitCompositorFrameNs         Duration, see above.
--- @column SubmitCompositorFrameToPresentationCompositorFrameNs Duration, see
---                                                              above.
--- @column SendBeginMainFrameToCommitNs      Duration, see above.
--- @column CommitNs                          Duration, see above.
--- @column EndCommitToActivationNs           Duration, see above.
--- @column ActivationNs                      Duration, see above.
--- @column unknown_stages_seen               List of any unknown stages.
-CREATE VIEW chrome_event_latency_to_breakdowns
-AS
-SELECT
-  event_latency_id,
-  event_latency_track_id,
-  event_latency_ts,
-  event_latency_dur,
-  event_type,
-  max(CASE WHEN name = "GenerationToRendererCompositor" THEN dur END) AS GenerationToRendererCompositorNs,
-  max(CASE WHEN name = "GenerationToBrowserMain" THEN dur END) AS GenerationToBrowserMainNs,
-  max(CASE WHEN name = "BrowserMainToRendererCompositor" THEN dur END) AS BrowserMainToRendererCompositorNs,
-  max(CASE WHEN name = "RendererCompositorQueueingDelay" THEN dur END) AS RendererCompositorQueueingDelayNs,
-  max(CASE WHEN name = "RendererCompositorProcessing" THEN dur END) AS RendererCompositorProcessingNs,
-  max(CASE WHEN name = "RendererCompositorToMain" THEN dur END) AS RendererCompositorToMainNs,
-  max(CASE WHEN name = "RendererMainProcessing" THEN dur END) AS RendererMainProcessingNs,
-
-  max(CASE WHEN name = "ArrivedInRendererCompositorToTermination" THEN dur END) AS ArrivedInRendererCompositorToTerminationNs,
-  max(CASE WHEN name = "RendererCompositorStartedToTermination" THEN dur END) AS RendererCompositorStartedToTerminationNs,
-  max(CASE WHEN name = "RendererCompositorFinishedToTermination" THEN dur END) AS RendererCompositorFinishedToTerminationNs,
-  max(CASE WHEN name = "RendererMainStartedToTermination" THEN dur END) AS RendererMainStartedToTerminationNs,
-  max(CASE WHEN name = "RendererMainFinishedToTermination" THEN dur END) AS RendererMainFinishedToTerminationNs,
-
-  max(CASE WHEN name = "BeginImplFrameToSendBeginMainFrame" THEN dur END) AS BeginImplFrameToSendBeginMainFrameNs,
-  max(CASE WHEN name = "RendererCompositorFinishedToSendBeginMainFrame" THEN dur END) AS RendererCompositorFinishedToSendBeginMainFrameNs,
-  max(CASE WHEN name = "RendererCompositorFinishedToBeginImplFrame" THEN dur END) AS RendererCompositorFinishedToBeginImplFrameNs,
-  max(CASE WHEN name = "RendererCompositorFinishedToCommit" THEN dur END) AS RendererCompositorFinishedToCommitNs,
-  max(CASE WHEN name = "RendererCompositorFinishedToEndCommit" THEN dur END) AS RendererCompositorFinishedToEndCommitNs,
-  max(CASE WHEN name = "RendererCompositorFinishedToActivation" THEN dur END) AS RendererCompositorFinishedToActivationNs,
-  max(CASE WHEN name = "RendererCompositorFinishedToEndActivate" THEN dur END) AS RendererCompositorFinishedToEndActivateNs,
-  max(CASE WHEN name = "RendererCompositorFinishedToSubmitCompositorFrame" THEN dur END) AS RendererCompositorFinishedToSubmitCompositorFrameNs,
-  max(CASE WHEN name = "RendererMainFinishedToBeginImplFrame" THEN dur END) AS RendererMainFinishedToBeginImplFrameNs,
-  max(CASE WHEN name = "RendererMainFinishedToSendBeginMainFrame" THEN dur END) AS RendererMainFinishedToSendBeginMainFrameNs,
-  max(CASE WHEN name = "RendererMainFinishedToCommit" THEN dur END) AS RendererMainFinishedToCommitNs,
-  max(CASE WHEN name = "RendererMainFinishedToEndCommit" THEN dur END) AS RendererMainFinishedToEndCommitNs,
-  max(CASE WHEN name = "RendererMainFinishedToActivation" THEN dur END) AS RendererMainFinishedToActivationNs,
-  max(CASE WHEN name = "RendererMainFinishedToEndActivate" THEN dur END) AS RendererMainFinishedToEndActivateNs,
-  max(CASE WHEN name = "RendererMainFinishedToSubmitCompositorFrame" THEN dur END) AS RendererMainFinishedToSubmitCompositorFrameNs,
-
-  max(CASE WHEN name = "EndActivateToSubmitCompositorFrame" THEN dur END) AS EndActivateToSubmitCompositorFrameNs,
-  max(CASE WHEN name = "SubmitCompositorFrameToPresentationCompositorFrame" THEN dur END) AS SubmitCompositorFrameToPresentationCompositorFrameNs,
-  max(CASE WHEN name = "SendBeginMainFrameToCommit" THEN dur END) AS SendBeginMainFrameToCommitNs,
-  max(CASE WHEN name = "Commit" THEN dur END) AS CommitNs,
-  max(CASE WHEN name = "EndCommitToActivation" THEN dur END) AS EndCommitToActivationNs,
-  max(CASE WHEN name = "Activation" THEN dur END) AS ActivationNs,
-  -- This column indicates whether there are unknown breakdowns.
-  -- Contains: NULL if there are no unknown breakdowns, otherwise a list of unknown breakdows.
-  group_concat(internal_invalid_name_or_null(name), ', ') AS unknown_stages_seen
-FROM chrome_event_latency_breakdowns
-GROUP BY event_latency_id;
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
index 372df5b..c6b505a 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
@@ -12,66 +12,103 @@
 -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
---
 
 INCLUDE PERFETTO MODULE common.slices;
 
 -- Hardware info is useful when using sql metrics for analysis
 -- in BTP.
 INCLUDE PERFETTO MODULE chrome.metadata;
-INCLUDE PERFETTO MODULE chrome.scroll_jank.event_latency_scroll_jank_cause;
+INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3_cause;
 
--- Grabs all gesture updates that were not coalesced with their
--- respective scroll ids and start/end timestamps.
+-- Grabs all gesture updates with respective scroll ids and start/end
+-- timestamps, regardless of being coalesced.
 --
--- @column id                       Slice id.
--- @column start_ts                 The start timestamp of the scroll.
--- @column end_ts                   The end timestamp of the scroll.
--- @column last_coalesced_input_ts  The timestamp of the last coalesced input.
+-- @column ts                       The start timestamp of the scroll.
+-- @column dur                      The duration of the scroll.
+-- @column id                       Slice id for the scroll.
 -- @column scroll_update_id         The id of the scroll update event.
 -- @column scroll_id                The id of the scroll.
-CREATE VIEW chrome_presented_gesture_scrolls AS
-WITH
-  chrome_gesture_scrolls AS (
-    SELECT
-      ts AS start_ts,
-      ts + dur AS end_ts,
-      id,
-      -- TODO(b/250089570) Add trace_id to EventLatency and update this script to use it.
-      EXTRACT_ARG(arg_set_id, 'chrome_latency_info.trace_id') AS scroll_update_id,
-      EXTRACT_ARG(arg_set_id, 'chrome_latency_info.gesture_scroll_id') AS scroll_id,
-      EXTRACT_ARG(arg_set_id, 'chrome_latency_info.is_coalesced') AS is_coalesced
-    FROM slice
-    WHERE name = "InputLatency::GestureScrollUpdate"
-          AND dur != -1),
-  updates_with_coalesce_info AS (
-    SELECT
-      chrome_updates.*,
-      (
-        SELECT
-          MAX(id)
-        FROM chrome_gesture_scrolls updates
-        WHERE updates.is_coalesced = false
-          AND updates.start_ts <= chrome_updates.start_ts) AS coalesced_inside_id
-        FROM
-          chrome_gesture_scrolls chrome_updates)
+-- @column is_coalesced             Whether this input event was coalesced.
+CREATE PERFETTO TABLE chrome_gesture_scroll_updates AS
 SELECT
-  MIN(id) AS id,
-  MIN(start_ts) AS start_ts,
-  MAX(end_ts) AS end_ts,
-  MAX(start_ts) AS last_coalesced_input_ts,
+  ts,
+  dur,
+  id,
+  -- TODO(b/250089570) Add trace_id to EventLatency and update this script to use it.
+  EXTRACT_ARG(arg_set_id, 'chrome_latency_info.trace_id') AS scroll_update_id,
+  EXTRACT_ARG(arg_set_id, 'chrome_latency_info.gesture_scroll_id') AS scroll_id,
+  EXTRACT_ARG(arg_set_id, 'chrome_latency_info.is_coalesced') AS is_coalesced
+FROM slice
+WHERE name = "InputLatency::GestureScrollUpdate" AND dur != -1;
+
+CREATE PERFETTO TABLE internal_non_coalesced_gesture_scrolls AS
+SELECT
+  id,
+  ts,
+  dur,
   scroll_update_id,
-  MIN(scroll_id) AS scroll_id
-FROM updates_with_coalesce_info
-GROUP BY coalesced_inside_id;
+  scroll_id
+FROM  chrome_gesture_scroll_updates
+WHERE is_coalesced = false
+ORDER BY ts ASC;
+
+-- Scroll updates, corresponding to all input events that were converted to a
+-- presented scroll update.
+--
+-- @column id                       Minimum slice id for input presented in this
+--                                  frame, the non coalesced input.
+-- @column ts                       The start timestamp for producing the frame.
+-- @column dur                      The duration between producing and
+--                                  presenting the frame.
+-- @column last_coalesced_input_ts  The timestamp of the last input that arrived
+--                                  and got coalesced into the frame.
+-- @column scroll_update_id         The id of the scroll update event, a unique
+--                                  identifier to the gesture.
+-- @column scroll_id                The id of the ongoing scroll.
+CREATE PERFETTO TABLE chrome_presented_gesture_scrolls AS
+WITH
+scroll_updates_with_coalesce_info as MATERIALIZED (
+  SELECT
+    id,
+    ts,
+    -- For each scroll update, find the latest non-coalesced update which
+    -- happened before it. For coalesced scroll updates, this will be the
+    -- presented scroll update they have been coalesced into.
+    (
+      SELECT id
+      FROM internal_non_coalesced_gesture_scrolls non_coalesced
+      WHERE non_coalesced.ts <= scroll_update.ts
+      ORDER BY ts DESC
+      LIMIT 1
+     ) as coalesced_to_scroll_update_slice_id
+  FROM chrome_gesture_scroll_updates scroll_update
+  ORDER BY coalesced_to_scroll_update_slice_id, ts
+)
+SELECT
+  id,
+  ts,
+  dur,
+  -- Find the latest input that was coalesced into this scroll update.
+  (
+    SELECT coalesce_info.ts
+    FROM scroll_updates_with_coalesce_info coalesce_info
+    WHERE
+      coalesce_info.coalesced_to_scroll_update_slice_id =
+        internal_non_coalesced_gesture_scrolls.id
+    ORDER BY ts DESC
+    LIMIT 1
+  ) as last_coalesced_input_ts,
+  scroll_update_id,
+  scroll_id
+FROM internal_non_coalesced_gesture_scrolls;
 
 -- Associate every trace_id with it's perceived delta_y on the screen after
 -- prediction.
 --
 -- @column scroll_update_id         The id of the scroll update event.
--- @column delta_y                  The percieved delta_y on the screen post
+-- @column delta_y                  The perceived delta_y on the screen post
 --                                  prediction.
-CREATE VIEW chrome_scroll_updates_with_deltas AS
+CREATE PERFETTO TABLE chrome_scroll_updates_with_deltas AS
 SELECT
   EXTRACT_ARG(arg_set_id, 'scroll_deltas.trace_id') AS scroll_update_id,
   EXTRACT_ARG(arg_set_id, 'scroll_deltas.provided_to_compositor_delta_y') AS delta_y
@@ -82,7 +119,7 @@
 -- with gesture scroll updates, as event latencies don't have trace
 -- ids associated with it.
 --
--- @column start_ts                     Start timestampt for the EventLatency.
+-- @column ts                           Start timestamp for the EventLatency.
 -- @column event_latency_id             Slice id of the EventLatency.
 -- @column dur                          Duration of the EventLatency.
 -- @column input_latency_end_ts         End timestamp for input aka the
@@ -93,9 +130,9 @@
 --                                      SwapEndToPresentationCompositorFrame
 --                                      substage.
 -- @column event_type                   EventLatency event type.
-CREATE VIEW chrome_gesture_scroll_event_latencies AS
+CREATE PERFETTO TABLE chrome_gesture_scroll_event_latencies AS
 SELECT
-  slice.ts AS start_ts,
+  slice.ts,
   slice.id AS event_latency_id,
   slice.dur AS dur,
   descendant_slice_end(slice.id, "LatchToSwapEnd") AS input_latency_end_ts,
@@ -115,7 +152,7 @@
 -- the LatchToSwapEnd slice.
 --
 -- @column id                           ID of the frame.
--- @column start_ts                     Start timestamp of the frame.
+-- @column ts                           Start timestamp of the frame.
 -- @column last_coalesced_input_ts      The timestamp of the last coalesced
 --                                      input.
 -- @column scroll_id                    ID of the associated scroll.
@@ -123,10 +160,10 @@
 -- @column event_latency_id             ID of the associated EventLatency.
 -- @column dur                          Duration of the associated EventLatency.
 -- @column presentation_timestamp       Frame presentation timestamp.
-CREATE VIEW chrome_full_frame_view AS
+CREATE PERFETTO TABLE chrome_full_frame_view AS
 SELECT
   frames.id,
-  frames.start_ts,
+  frames.ts,
   frames.last_coalesced_input_ts,
   frames.scroll_id,
   frames.scroll_update_id,
@@ -135,26 +172,26 @@
   events.presentation_timestamp
 FROM chrome_presented_gesture_scrolls frames
 JOIN chrome_gesture_scroll_event_latencies events
-  ON frames.start_ts = events.start_ts
-  AND events.input_latency_end_ts = frames.end_ts;
+  ON frames.ts = events.ts
+  AND events.input_latency_end_ts = (frames.ts + frames.dur);
 
 -- Join deltas with EventLatency data.
 --
 -- @column id                           ID of the frame.
--- @column start_ts                     Start timestamp of the frame.
+-- @column ts                           Start timestamp of the frame.
 -- @column scroll_id                    ID of the associated scroll.
 -- @column scroll_update_id             ID of the associated scroll update.
 -- @column last_coalesced_input_ts      The timestamp of the last coalesced
 --                                      input.
--- @column delta_y                      The percieved delta_y on the screen post
+-- @column delta_y                      The perceived delta_y on the screen post
 -- --                                   prediction.
 -- @column event_latency_id             ID of the associated EventLatency.
 -- @column dur                          Duration of the associated EventLatency.
 -- @column presentation_timestamp       Frame presentation timestamp.
-CREATE VIEW chrome_full_frame_delta_view AS
+CREATE PERFETTO TABLE chrome_full_frame_delta_view AS
 SELECT
   frames.id,
-  frames.start_ts,
+  frames.ts,
   frames.scroll_id,
   frames.scroll_update_id,
   frames.last_coalesced_input_ts,
@@ -166,33 +203,6 @@
 LEFT JOIN chrome_scroll_updates_with_deltas deltas
   ON deltas.scroll_update_id = frames.scroll_update_id;
 
--- Join the frame view with scroll jank cause and subcause based
--- on event latency id.
---
--- @column id                           ID of the frame.
--- @column start_ts                     Start timestamp of the frame.
--- @column scroll_id                    ID of the associated scroll.
--- @column scroll_update_id             ID of the associated scroll update.
--- @column last_coalesced_input_ts      The timestamp of the last coalesced
---                                      input.
--- @column delta_y                      The percieved delta_y on the screen post
--- --                                   prediction.
--- @column event_latency_id             ID of the associated EventLatency.
--- @column dur                          Duration of the associated EventLatency.
--- @column presentation_timestamp       Frame presentation timestamp.
--- @column cause_of_jank                The stage of the EventLatency that is
---                                      the cause of jank.
--- @column sub_cause_of_jank            The sub-stage of the cause_of_jank that
---                                      is the cause of jank, if it exists.
-CREATE PERFETTO TABLE chrome_frame_view_with_jank AS
-SELECT
-  frames.*,
-  jank_cause.cause_of_jank,
-  jank_cause.sub_cause_of_jank
-FROM chrome_event_latency_scroll_jank_cause jank_cause
-RIGHT JOIN chrome_full_frame_delta_view frames
-  ON jank_cause.slice_id = frames.event_latency_id;
-
 -- Group all gestures presented at the same timestamp together in
 -- a single row.
 --
@@ -204,24 +214,20 @@
 -- @column scroll_update_id             ID of the associated scroll update.
 -- @column encapsulated_scroll_ids      All scroll updates associated with the
 --                                      frame presentation timestamp.
--- @column total_delta                  Sum of all percieved delta_y values at
+-- @column total_delta                  Sum of all perceived delta_y values at
 --                                      the frame presentation timestamp.
--- @column segregated_delta_y           Lists all of the percieved delta_y
+-- @column segregated_delta_y           Lists all of the perceived delta_y
 --                                      values at the frame presentation
 --                                      timestamp.
 -- @column event_latency_id             ID of the associated EventLatency.
 -- @column dur                          Maximum duration of the associated
 --                                      EventLatency.
 -- @column presentation_timestamp       Frame presentation timestamp.
--- @column cause_of_jank                The stage of the EventLatency that is
---                                      the cause of jank.
--- @column sub_cause_of_jank            The sub-stage of the cause_of_jank that
---                                      is the cause of jank, if it exists.
-CREATE VIEW chrome_merged_frame_view_with_jank AS
+CREATE VIEW chrome_merged_frame_view AS
 SELECT
   id,
   MAX(last_coalesced_input_ts) AS max_start_ts,
-  MIN(start_ts) AS min_start_ts,
+  MIN(ts) AS min_start_ts,
   scroll_id,
   scroll_update_id,
   GROUP_CONCAT(scroll_update_id,',') AS encapsulated_scroll_ids,
@@ -229,10 +235,8 @@
   GROUP_CONCAT(delta_y, ',') AS segregated_delta_y,
   event_latency_id,
   MAX(dur) AS dur,
-  presentation_timestamp,
-  cause_of_jank,
-  sub_cause_of_jank
-FROM chrome_frame_view_with_jank
+  presentation_timestamp
+FROM chrome_full_frame_delta_view
 GROUP BY presentation_timestamp
 ORDER BY presentation_timestamp;
 
@@ -256,18 +260,14 @@
 -- @column dur                     Duration of the EventLatency.
 -- @column presentation_timestamp  Timestamp at which the frame was shown on the
 --                                 screen.
--- @column cause_of_jank           Cause of jank will be present if a frame
---                                 takes more than 1/2 a vsync than it's
---                                 neighbours, will be filtered to real
---                                 positives later.
--- @column sub_cause_of_jank       If the cause is GPU related, a sub cause is
---                                 present for further breakdown.
 -- @column delay_since_last_frame  Time elapsed since the previous frame was
 --                                 presented, usually equals |VSYNC| if no frame
 --                                 drops happened.
 -- @column delay_since_last_input  Difference in OS timestamps of inputs in the
 --                                 current and the previous frame.
-CREATE VIEW chrome_janky_frame_info_with_delay AS
+-- @column prev_event_latency_id   The event latency id that will be used as a
+--                                 reference to determine the jank cause.
+CREATE VIEW chrome_frame_info_with_delay AS
 SELECT
   *,
   (presentation_timestamp -
@@ -275,8 +275,9 @@
   OVER (PARTITION BY scroll_id ORDER BY presentation_timestamp)) / 1e6 AS delay_since_last_frame,
   (min_start_ts -
   LAG(max_start_ts, 1, min_start_ts)
-  OVER (PARTITION BY scroll_id ORDER BY min_start_ts)) / 1e6 AS delay_since_last_input
-FROM chrome_merged_frame_view_with_jank;
+  OVER (PARTITION BY scroll_id ORDER BY min_start_ts)) / 1e6 AS delay_since_last_input,
+  LAG(event_latency_id, 1, -1) OVER (PARTITION BY scroll_id ORDER BY min_start_ts) AS prev_event_latency_id
+FROM chrome_merged_frame_view;
 
 -- Calculate |VSYNC_INTERVAL| as the lowest delay between frames larger than
 -- zero.
@@ -287,11 +288,54 @@
 CREATE VIEW chrome_vsyncs AS
 SELECT
   MIN(delay_since_last_frame) AS vsync_interval
-FROM chrome_janky_frame_info_with_delay
+FROM chrome_frame_info_with_delay
 WHERE delay_since_last_frame > 0;
 
 -- Filter the frame view only to frames that had missed vsyncs.
 --
+-- @column delay_since_last_frame Time elapsed since the previous frame was
+--                                presented, will be more than |VSYNC| in this
+--                                view.
+-- @column event_latency_id       Event latency id of the presented frame.
+-- @column vsync_interval         Vsync interval at the time of recording the
+--                                trace.
+-- @column hardware_class         Device brand and model.
+-- @column scroll_id              The scroll corresponding to this frame.
+-- @column prev_event_latency_id  The event latency id that will be used as a
+--                                reference to determine the jank cause.
+CREATE VIEW chrome_janky_frames_no_cause AS
+SELECT
+  delay_since_last_frame,
+  event_latency_id,
+  (SELECT vsync_interval FROM chrome_vsyncs) AS vsync_interval,
+  chrome_hardware_class() AS hardware_class,
+  scroll_id,
+  prev_event_latency_id
+FROM chrome_frame_info_with_delay
+WHERE delay_since_last_frame > (select vsync_interval + vsync_interval / 2 from chrome_vsyncs)
+      AND delay_since_last_input < (select vsync_interval + vsync_interval / 2 from chrome_vsyncs);
+
+-- Janky frame information including the jank cause.
+-- @column delay_since_last_frame Time elapsed since the previous frame was
+--                                presented, will be more than |VSYNC| in this
+--                                view.
+-- @column event_latency_id       Event latency id of the presented frame.
+-- @column vsync_interval         Vsync interval at the time of recording the
+--                                trace.
+-- @column hardware_class         Device brand and model.
+-- @column scroll_id              The scroll corresponding to this frame.
+-- @column prev_event_latency_id  The event latency id that will be used as a
+--                                reference to determine the jank cause.
+-- @column cause_id               Id of the slice corresponding to the offending stage.
+CREATE VIEW chrome_janky_frames_no_subcause AS
+SELECT
+  *,
+  get_v3_jank_cause_id(event_latency_id, prev_event_latency_id) AS cause_id
+FROM chrome_janky_frames_no_cause;
+
+-- Finds all causes of jank for all janky frames, and a cause of sub jank
+-- if the cause of jank was GPU related.
+--
 -- @column cause_of_jank          The reason the Vsync was missed.
 -- @column sub_cause_of_jank      Further breakdown if the root cause was GPU
 --                                related.
@@ -305,16 +349,25 @@
 -- @column scroll_id              The scroll corresponding to this frame.
 CREATE VIEW chrome_janky_frames AS
 SELECT
-  cause_of_jank,
-  sub_cause_of_jank,
+  slice_name_from_id(cause_id) AS cause_of_jank,
+  slice_name_from_id(
+    -- Getting sub-cause
+    get_v3_jank_cause_id(
+      -- Here the cause itself is the parent.
+      cause_id,
+      -- Get the previous cause id as a child to the previous |EventLatency|.
+     (SELECT
+      id
+      FROM slice
+      WHERE name = slice_name_from_id(cause_id)
+        AND parent_id = prev_event_latency_id)
+    )) AS sub_cause_of_jank,
   delay_since_last_frame,
   event_latency_id,
-  (SELECT vsync_interval FROM chrome_vsyncs) AS vsync_interval,
-  chrome_hardware_class() AS hardware_class,
+  vsync_interval,
+  hardware_class,
   scroll_id
-FROM chrome_janky_frame_info_with_delay
-WHERE delay_since_last_frame > (select vsync_interval + vsync_interval / 2 from chrome_vsyncs)
-      AND delay_since_last_input < (select vsync_interval + vsync_interval / 2 from chrome_vsyncs);
+FROM chrome_janky_frames_no_subcause;
 
 -- Counting all unique frame presentation timestamps.
 --
@@ -352,7 +405,7 @@
   frames AS (
     SELECT scroll_id, COUNT(*) AS num_frames
     FROM
-      chrome_janky_frame_info_with_delay
+      chrome_frame_info_with_delay
     GROUP BY scroll_id
   ),
   janky_frames AS (
@@ -401,66 +454,4 @@
     AS scroll_jank_causes
 FROM
   chrome_janky_frames
-GROUP BY scroll_id;
-
--- An "intermediate" view for computing `chrome_scroll_jank_v3_output` below.
---
--- @column trace_num_frames          The number of frames in the trace.
--- @column trace_num_janky_frames    The number of delayed/janky frames in the
---                                   trace.
--- @column vsync_interval            The standard vsync interval.
--- @column scrolls                   A proto amalgamation of metrics per scroll
---                                   including the number of frames, number of
---                                   janky frames, percent of janky frames,
---                                   maximum presentation delay, and the causes
---                                   of jank (cause, sub-cause, delay).
-CREATE VIEW chrome_scroll_jank_v3_intermediate AS
-SELECT
-  -- MAX does not matter for these aggregations, since the values are the
-  -- same across rows.
-  (SELECT COUNT(*) FROM chrome_janky_frame_info_with_delay)
-    AS trace_num_frames,
-  (SELECT COUNT(*) FROM chrome_janky_frames)
-    AS trace_num_janky_frames,
-  causes.vsync_interval,
-  RepeatedField(
-    ChromeScrollJankV3_Scroll(
-      'num_frames',
-      frames.num_frames,
-      'num_janky_frames',
-      frames.num_janky_frames,
-      'scroll_jank_percentage',
-      frames.scroll_jank_percentage,
-      'max_delay_since_last_frame',
-      causes.max_delay_since_last_frame,
-      'scroll_jank_causes',
-      causes.scroll_jank_causes))
-    AS scrolls
-FROM
-  chrome_frames_per_scroll AS frames
-INNER JOIN chrome_causes_per_scroll AS causes
-  ON frames.scroll_id = causes.scroll_id;
-
--- For producing a "native" Perfetto UI metric.
---
--- @column scroll_jank_summary     A proto amalgamation summarizing all of the
---                                 scroll jank in a trace, including the number
---                                 of frames, janky frames, percentage of janky
---                                 frames, vsync interval, and a summary of this
---                                 data (including individual causes) for each
---                                 scroll.
-CREATE VIEW chrome_scroll_jank_v3_output AS
-SELECT
-  ChromeScrollJankV3(
-    'trace_num_frames',
-    trace_num_frames,
-    'trace_num_janky_frames',
-    trace_num_janky_frames,
-    'trace_scroll_jank_percentage',
-    100.0 * trace_num_janky_frames / trace_num_frames,
-    'vsync_interval_ms',
-    vsync_interval,
-    'scrolls',
-    scrolls) AS scroll_jank_summary
-FROM
-  chrome_scroll_jank_v3_intermediate;
+GROUP BY scroll_id;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
new file mode 100644
index 0000000..164ba7a
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
@@ -0,0 +1,66 @@
+--
+-- Copyright 2023 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
+--
+--     https://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.
+
+-- Helper functions for scroll_jank_v3 metric computation.
+
+INCLUDE PERFETTO MODULE common.slices;
+
+
+-- Given two slice Ids A and B, find the maximum difference
+-- between the durations of it's direct children with matching names
+-- for example if slice A has children named (X, Y, Z) with durations of (10, 10, 5)
+-- and slice B has children named (X, Y) with durations of (9, 9), the function will return
+-- the slice id of the slice named Z that is A's child, as no matching slice named Z was found
+-- under B, making 5 - 0 = 5 the maximum delta between both slice's direct children
+--
+-- @arg janky_slice_id LONG The slice id of the parent slice that we want to
+--                          cause among it's children.
+-- @arg prev_slice_id  LONG The slice id of the parent slice that's the reference
+--                          in comparison to |janky_slice_id|.
+-- @ret breakdown_id   LONG The slice id of the breakdown that has the maximum
+--                          duration delta.
+CREATE PERFETTO FUNCTION get_v3_jank_cause_id(
+  janky_slice_id LONG,
+  prev_slice_id LONG
+)
+RETURNS LONG AS
+WITH
+  current_breakdowns AS (
+    SELECT
+      *
+    FROM direct_children_slice($janky_slice_id)
+  ),
+  prev_breakdowns AS (
+    SELECT
+      *
+    FROM direct_children_slice($prev_slice_id)
+  ),
+  joint_breakdowns AS (
+    SELECT
+      cur.id AS breakdown_id,
+      (cur.dur - COALESCE(prev.dur, 0)) AS breakdown_delta
+    FROM current_breakdowns cur
+    LEFT JOIN prev_breakdowns prev ON
+      cur.name = prev.name
+  ),
+  max_breakdown AS (
+    SELECT
+      MAX(breakdown_delta) AS breakdown_delta,
+      breakdown_id
+    FROM joint_breakdowns
+  )
+  SELECT
+    breakdown_id
+  FROM max_breakdown;
diff --git a/src/traced/service/builtin_producer.cc b/src/traced/service/builtin_producer.cc
index 5a89a59..d46447c 100644
--- a/src/traced/service/builtin_producer.cc
+++ b/src/traced/service/builtin_producer.cc
@@ -57,16 +57,16 @@
 constexpr char kAndroidSdkSyspropGuardDataSourceName[] =
     "android.sdk_sysprop_guard";
 constexpr char kPerfettoSdkSyspropGuardGenerationPropertyName[] =
-    "debug.tracing.perfetto.sdk_sysprop_guard_generation";
+    "debug.tracing.ctl.perfetto.sdk_sysprop_guard_generation";
 constexpr char kHwuiSkiaBroadTracingPropertyName[] =
-    "debug.tracing.hwui.skia_tracing_enabled";
+    "debug.tracing.ctl.hwui.skia_tracing_enabled";
 constexpr char kHwuiSkiaUsePerfettoPropertyName[] =
-    "debug.tracing.hwui.skia_use_perfetto_track_events";
+    "debug.tracing.ctl.hwui.skia_use_perfetto_track_events";
 constexpr char kHwuiSkiaPropertyPackageSeparator[] = ".";
 constexpr char kSurfaceFlingerSkiaBroadTracingPropertyName[] =
-    "debug.tracing.renderengine.skia_tracing_enabled";
+    "debug.tracing.ctl.renderengine.skia_tracing_enabled";
 constexpr char kSurfaceFlingerSkiaUsePerfettoPropertyName[] =
-    "debug.tracing.renderengine.skia_use_perfetto_track_events";
+    "debug.tracing.ctl.renderengine.skia_use_perfetto_track_events";
 
 }  // namespace
 
diff --git a/src/traced/service/builtin_producer_unittest.cc b/src/traced/service/builtin_producer_unittest.cc
index 7d96dee..6efd068 100644
--- a/src/traced/service/builtin_producer_unittest.cc
+++ b/src/traced/service/builtin_producer_unittest.cc
@@ -33,16 +33,16 @@
 constexpr char kAndroidSdkSyspropGuardDataSourceName[] =
     "android.sdk_sysprop_guard";
 constexpr char kPerfettoSdkSyspropGuardGenerationPropertyName[] =
-    "debug.tracing.perfetto.sdk_sysprop_guard_generation";
+    "debug.tracing.ctl.perfetto.sdk_sysprop_guard_generation";
 constexpr char kHwuiSkiaBroadTracingPropertyName[] =
-    "debug.tracing.hwui.skia_tracing_enabled";
+    "debug.tracing.ctl.hwui.skia_tracing_enabled";
 constexpr char kHwuiSkiaUsePerfettoPropertyName[] =
-    "debug.tracing.hwui.skia_use_perfetto_track_events";
+    "debug.tracing.ctl.hwui.skia_use_perfetto_track_events";
 constexpr char kHwuiSkiaPropertyPackageSeparator[] = ".";
 constexpr char kSurfaceFlingerSkiaBroadTracingPropertyName[] =
-    "debug.tracing.renderengine.skia_tracing_enabled";
+    "debug.tracing.ctl.renderengine.skia_tracing_enabled";
 constexpr char kSurfaceFlingerSkiaUsePerfettoPropertyName[] =
-    "debug.tracing.renderengine.skia_use_perfetto_track_events";
+    "debug.tracing.ctl.renderengine.skia_use_perfetto_track_events";
 
 using ::testing::_;
 using ::testing::InvokeWithoutArgs;
diff --git a/test/trace_processor/diff_tests/chrome/chrome_scroll_jank_v2.out b/test/trace_processor/diff_tests/chrome/chrome_scroll_jank_v2.out
deleted file mode 100644
index b13137f..0000000
--- a/test/trace_processor/diff_tests/chrome/chrome_scroll_jank_v2.out
+++ /dev/null
@@ -1,3 +0,0 @@
-
-"scroll_processing_ms","scroll_jank_processing_ms","scroll_jank_percentage"
-12374.560000,154.217000,1.246242
diff --git a/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank.out b/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank.out
deleted file mode 100644
index effa4b0..0000000
--- a/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank.out
+++ /dev/null
@@ -1,12 +0,0 @@
-
-"jank","next_jank","prev_jank","gesture_begin_ts","gesture_end_ts","ts","dur","event_type","next_ts","next_dur","prev_ts","prev_dur"
-1,0,1,3107579952792897,3107581649376897,3107580143766897,35454000,"INERTIAL_GESTURE_SCROLL_UPDATE",3107580152108897,35464000,3107580135417897,27100000
-1,1,0,3107578477792897,3107579903554897,3107578535792897,39440000,"GESTURE_SCROLL_UPDATE",3107578556443897,27153000,3107578527792897,39081000
-1,0,1,3107578477792897,3107579903554897,3107579191373897,35485000,"INERTIAL_GESTURE_SCROLL_UPDATE",3107579199700897,35521000,3107579183046897,27103000
-1,0,1,3107578477792897,3107579903554897,3107579600751897,43838000,"INERTIAL_GESTURE_SCROLL_UPDATE",3107579609175897,43757000,3107579592394897,35480000
-0,0,0,3107579952792897,3107581649376897,3107579952792897,25970000,"FIRST_GESTURE_SCROLL_UPDATE",3107579956792897,30333000,"[NULL]","[NULL]"
-0,0,0,3107579952792897,3107581649376897,3107579956792897,30333000,"GESTURE_SCROLL_UPDATE",3107579968792897,26657000,3107579952792897,25970000
-0,0,0,3107579952792897,3107581649376897,3107579968792897,26657000,"GESTURE_SCROLL_UPDATE",3107579976792897,27003000,3107579956792897,30333000
-0,0,0,3107579952792897,3107581649376897,3107579976792897,27003000,"GESTURE_SCROLL_UPDATE",3107579985792897,26361000,3107579968792897,26657000
-0,0,0,3107579952792897,3107581649376897,3107579985792897,26361000,"GESTURE_SCROLL_UPDATE",3107579993792897,26709000,3107579976792897,27003000
-0,0,0,3107579952792897,3107581649376897,3107579993792897,26709000,"GESTURE_SCROLL_UPDATE",3107579998792897,30183000,3107579985792897,26361000
diff --git a/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank_cause.out b/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank_cause.out
deleted file mode 100644
index 6fc5c2f..0000000
--- a/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank_cause.out
+++ /dev/null
@@ -1,6 +0,0 @@
-
-"dur","ts","event_type","next_jank","prev_jank","next_delta_dur_ns","prev_delta_dur_ns","cause_of_jank","max_delta_dur_ns","sub_cause_of_jank"
-39440000,3107578535792897,"GESTURE_SCROLL_UPDATE",1,0,9233000,"[NULL]","SubmitCompositorFrameToPresentationCompositorFrame",9233000,"BufferReadyToLatch"
-35485000,3107579191373897,"INERTIAL_GESTURE_SCROLL_UPDATE",0,1,"[NULL]",7445000,"SubmitCompositorFrameToPresentationCompositorFrame",7445000,"BufferReadyToLatch"
-43838000,3107579600751897,"INERTIAL_GESTURE_SCROLL_UPDATE",0,1,"[NULL]",8059000,"SubmitCompositorFrameToPresentationCompositorFrame",8059000,"BufferReadyToLatch"
-35454000,3107580143766897,"INERTIAL_GESTURE_SCROLL_UPDATE",0,1,"[NULL]",7219000,"SubmitCompositorFrameToPresentationCompositorFrame",7219000,"StartDrawToSwapStart"
diff --git a/test/trace_processor/diff_tests/chrome/event_latency_to_breakdowns.out b/test/trace_processor/diff_tests/chrome/event_latency_to_breakdowns.out
deleted file mode 100644
index 099e02b..0000000
--- a/test/trace_processor/diff_tests/chrome/event_latency_to_breakdowns.out
+++ /dev/null
@@ -1,32 +0,0 @@
-
-"event_latency_ts","event_latency_dur","event_type","GenerationToRendererCompositorNs","GenerationToBrowserMainNs","BrowserMainToRendererCompositorNs","RendererCompositorQueueingDelayNs","unknown_stages_seen"
-3107578415792897,17551000,"TOUCH_PRESSED",7945000,"[NULL]","[NULL]",108000,"[NULL]"
-3107578415792897,20411000,"GESTURE_TAP_DOWN",9648000,"[NULL]","[NULL]",33000,"[NULL]"
-3107578418792897,6034000,"TOUCH_MOVED",5803000,"[NULL]","[NULL]",34000,"[NULL]"
-3107578423792897,6439000,"TOUCH_MOVED",6192000,"[NULL]","[NULL]",82000,"[NULL]"
-3107578427792897,4318000,"TOUCH_MOVED",4189000,"[NULL]","[NULL]",34000,"[NULL]"
-3107578431792897,5754000,"TOUCH_MOVED",5407000,"[NULL]","[NULL]",87000,"[NULL]"
-3107578435792897,3983000,"TOUCH_MOVED",3857000,"[NULL]","[NULL]",28000,"[NULL]"
-3107578439792897,4734000,"TOUCH_MOVED",4550000,"[NULL]","[NULL]",57000,"[NULL]"
-3107578448792897,4346000,"TOUCH_MOVED",4085000,"[NULL]","[NULL]",79000,"[NULL]"
-3107578452792897,3863000,"TOUCH_MOVED",3702000,"[NULL]","[NULL]",36000,"[NULL]"
-3107578456792897,4743000,"TOUCH_MOVED",4579000,"[NULL]","[NULL]",50000,"[NULL]"
-3107578460792897,4516000,"TOUCH_MOVED",4389000,"[NULL]","[NULL]",32000,"[NULL]"
-3107578464792897,4709000,"TOUCH_MOVED",4525000,"[NULL]","[NULL]",62000,"[NULL]"
-3107578468792897,4876000,"TOUCH_MOVED",4751000,"[NULL]","[NULL]",31000,"[NULL]"
-3107578473792897,3960000,"TOUCH_MOVED",3792000,"[NULL]","[NULL]",53000,"[NULL]"
-3107578477792897,26678000,"GESTURE_TAP_CANCEL",5674000,"[NULL]","[NULL]",51000,"[NULL]"
-3107578477792897,3956000,"TOUCH_MOVED",3793000,"[NULL]","[NULL]",36000,"[NULL]"
-3107578477792897,6671000,"GESTURE_SCROLL_BEGIN","[NULL]",5477000,871000,24000,"[NULL]"
-3107578477792897,30595000,"FIRST_GESTURE_SCROLL_UPDATE","[NULL]",6101000,1077000,5608000,"[NULL]"
-3107578481792897,5625000,"TOUCH_MOVED",5463000,"[NULL]","[NULL]",45000,"[NULL]"
-3107578481792897,8937000,"GESTURE_SCROLL_UPDATE","[NULL]",5903000,455000,2428000,"[NULL]"
-3107578483992897,3438000,"TOUCH_PRESSED",788000,"[NULL]","[NULL]",14000,"[NULL]"
-3107578485792897,4373000,"TOUCH_MOVED",4213000,"[NULL]","[NULL]",45000,"[NULL]"
-3107578485792897,30948000,"GESTURE_SCROLL_UPDATE","[NULL]",5302000,979000,7100000,"[NULL]"
-3107578489792897,5294000,"TOUCH_MOVED",5191000,"[NULL]","[NULL]",53000,"[NULL]"
-3107578489792897,9525000,"GESTURE_SCROLL_UPDATE","[NULL]",5045000,454000,3882000,"[NULL]"
-3107578494792897,3912000,"TOUCH_MOVED",3821000,"[NULL]","[NULL]",41000,"[NULL]"
-3107578494792897,30309000,"GESTURE_SCROLL_UPDATE","[NULL]",3671000,1262000,7674000,"[NULL]"
-3107578498792897,7457000,"TOUCH_MOVED",7359000,"[NULL]","[NULL]",47000,"[NULL]"
-3107578498792897,8728000,"GESTURE_SCROLL_UPDATE","[NULL]",3560000,4430000,617000,"[NULL]"
diff --git a/test/trace_processor/diff_tests/chrome/scroll_jank_v3.out b/test/trace_processor/diff_tests/chrome/scroll_jank_v3.out
index e539208..f3d91cd 100644
--- a/test/trace_processor/diff_tests/chrome/scroll_jank_v3.out
+++ b/test/trace_processor/diff_tests/chrome/scroll_jank_v3.out
@@ -1,4 +1,4 @@
 "cause_of_jank","sub_cause_of_jank","delay_since_last_frame","vsync_interval"
-"[NULL]","[NULL]",33.462000,16.368000
+"RendererCompositorQueueingDelay","[NULL]",33.462000,16.368000
 "RendererCompositorFinishedToBeginImplFrame","[NULL]",100.274000,16.368000
 "RendererCompositorQueueingDelay","[NULL]",33.404000,16.368000
diff --git a/test/trace_processor/diff_tests/chrome/tests_scroll_jank.py b/test/trace_processor/diff_tests/chrome/tests_scroll_jank.py
index 8e88fc5..8f7aebc 100644
--- a/test/trace_processor/diff_tests/chrome/tests_scroll_jank.py
+++ b/test/trace_processor/diff_tests/chrome/tests_scroll_jank.py
@@ -44,27 +44,6 @@
         """,
         out=Path('scroll_jank.out'))
 
-  def test_event_latency_to_breakdowns(self):
-    return DiffTestBlueprint(
-        trace=DataPath('event_latency_with_args.perfetto-trace'),
-        query="""
-        SELECT IMPORT('chrome.scroll_jank.event_latency_to_breakdowns');
-
-        SELECT
-          event_latency_ts,
-          event_latency_dur,
-          event_type,
-          GenerationToRendererCompositorNs,
-          GenerationToBrowserMainNs,
-          BrowserMainToRendererCompositorNs,
-          RendererCompositorQueueingDelayNs,
-          unknown_stages_seen
-        FROM chrome_event_latency_to_breakdowns
-        ORDER BY event_latency_id
-        LIMIT 30;
-        """,
-        out=Path('event_latency_to_breakdowns.out'))
-
   def test_chrome_frames_with_missed_vsyncs(self):
     return DiffTestBlueprint(
         trace=DataPath('chrome_input_with_frame_view.pftrace'),
@@ -92,53 +71,6 @@
         """,
         out=Path('scroll_jank_v3_percentage.out'))
 
-  def test_event_latency_scroll_jank(self):
-    return DiffTestBlueprint(
-        trace=DataPath('event_latency_with_args.perfetto-trace'),
-        query="""
-        SELECT IMPORT('chrome.scroll_jank.event_latency_scroll_jank');
-
-        SELECT
-          jank,
-          next_jank,
-          prev_jank,
-          gesture_begin_ts,
-          gesture_end_ts,
-          ts,
-          dur,
-          event_type,
-          next_ts,
-          next_dur,
-          prev_ts,
-          prev_dur
-        FROM chrome_scroll_event_latency_jank
-        ORDER BY jank DESC
-        LIMIT 10;
-        """,
-        out=Path('event_latency_scroll_jank.out'))
-
-  def test_event_latency_scroll_jank_cause(self):
-    return DiffTestBlueprint(
-        trace=DataPath('event_latency_with_args.perfetto-trace'),
-        query="""
-        SELECT IMPORT('chrome.scroll_jank.event_latency_scroll_jank_cause');
-
-        SELECT
-          dur,
-          ts,
-          event_type,
-          next_jank,
-          prev_jank,
-          next_delta_dur_ns,
-          prev_delta_dur_ns,
-          cause_of_jank,
-          max_delta_dur_ns,
-          sub_cause_of_jank
-        FROM chrome_event_latency_scroll_jank_cause
-        ORDER by ts;
-        """,
-        out=Path('event_latency_scroll_jank_cause.out'))
-
   def test_scroll_flow_event(self):
     return DiffTestBlueprint(
         trace=DataPath('chrome_scroll_without_vsync.pftrace'),
@@ -193,34 +125,6 @@
         """,
         out=Path('scroll_flow_event_general_validation.out'))
 
-  def test_scroll_jank_cause(self):
-    return DiffTestBlueprint(
-        trace=DataPath('chrome_scroll_without_vsync.pftrace'),
-        query="""
-        SELECT RUN_METRIC('chrome/scroll_jank_cause.sql');
-
-        SELECT
-          COUNT(*) AS total,
-          SUM(jank) AS total_jank,
-          SUM(explained_jank + unexplained_jank) AS sum_explained_and_unexplained,
-          SUM(
-            CASE WHEN explained_jank THEN
-              unexplained_jank
-              ELSE
-                CASE WHEN jank AND NOT unexplained_jank THEN
-                  1
-                  ELSE
-                    0
-                END
-            END
-          ) AS error_rows
-        FROM scroll_jank_cause;
-        """,
-        out=Csv("""
-        "total","total_jank","sum_explained_and_unexplained","error_rows"
-        139,7,7,0
-        """))
-
   def test_scroll_flow_event_queuing_delay(self):
     return DiffTestBlueprint(
         trace=DataPath('chrome_scroll_without_vsync.pftrace'),
@@ -589,76 +493,6 @@
         3,120000000,70000000
         """))
 
-  def test_chrome_scroll_jank_v2_with_sub_cause(self):
-    return DiffTestBlueprint(
-        trace=DataPath('event_latency_with_args.perfetto-trace'),
-        query=Metric('chrome_scroll_jank_v2'),
-        out=TextProto(r"""
-        [perfetto.protos.chrome_scroll_jank_v2] {
-          scroll_processing_ms: 12374.56
-          scroll_jank_processing_ms: 154.217
-          scroll_jank_percentage: 1.2462422906349802
-          num_scroll_janks: 4
-          scroll_jank_causes_and_durations {
-            cause: "SubmitCompositorFrameToPresentationCompositorFrame"
-            sub_cause: "BufferReadyToLatch"
-            duration_ms: 39.44
-          }
-          scroll_jank_causes_and_durations {
-            cause: "SubmitCompositorFrameToPresentationCompositorFrame"
-            sub_cause: "BufferReadyToLatch"
-            duration_ms: 35.485
-          }
-          scroll_jank_causes_and_durations {
-            cause: "SubmitCompositorFrameToPresentationCompositorFrame"
-            sub_cause: "BufferReadyToLatch"
-            duration_ms: 43.838
-          }
-          scroll_jank_causes_and_durations {
-            cause: "SubmitCompositorFrameToPresentationCompositorFrame"
-            sub_cause: "StartDrawToSwapStart"
-            duration_ms: 35.454
-          }
-        }
-        """))
-
-  def test_chrome_scroll_jank_v2_without_sub_cause(self):
-    return DiffTestBlueprint(
-        trace=DataPath('chrome_input_with_frame_view.pftrace'),
-        query=Metric('chrome_scroll_jank_v2'),
-        out=TextProto(r"""
-        [perfetto.protos.chrome_scroll_jank_v2] {
-          scroll_processing_ms: 14434.053
-          scroll_jank_processing_ms: 550.359
-          scroll_jank_percentage: 3.8129207368159173
-          num_scroll_janks: 6
-          scroll_jank_causes_and_durations {
-            cause: "BrowserMainToRendererCompositor"
-            duration_ms: 60.05
-          }
-          scroll_jank_causes_and_durations {
-            cause: "RendererCompositorFinishedToBeginImplFrame"
-            duration_ms: 131.289
-          }
-          scroll_jank_causes_and_durations {
-            cause: "RendererCompositorFinishedToBeginImplFrame"
-            duration_ms: 115.174
-          }
-          scroll_jank_causes_and_durations {
-            cause: "RendererCompositorFinishedToBeginImplFrame"
-            duration_ms: 99.18
-          }
-          scroll_jank_causes_and_durations {
-            cause: "RendererCompositorFinishedToBeginImplFrame"
-            duration_ms: 83.038
-          }
-          scroll_jank_causes_and_durations {
-            cause: "RendererCompositorFinishedToBeginImplFrame"
-            duration_ms: 61.628
-          }
-        }
-        """))
-
   def test_chrome_scroll_jank_v3(self):
     return DiffTestBlueprint(
         trace=DataPath('chrome_input_with_frame_view.pftrace'),
@@ -675,6 +509,7 @@
             scroll_jank_percentage: 1.9047619047619047
             max_delay_since_last_frame: 6.126221896383187
             scroll_jank_causes {
+              cause: "RendererCompositorQueueingDelay"
               delay_since_last_frame: 2.044354838709678
             }
             scroll_jank_causes {
diff --git a/ui/src/common/plugins.ts b/ui/src/common/plugins.ts
index 91f9f16..d9d5b77 100644
--- a/ui/src/common/plugins.ts
+++ b/ui/src/common/plugins.ts
@@ -296,6 +296,12 @@
     });
   }
 
+  // Look up track into for a given track's URI.
+  // Returns |undefined| if no track can be found.
+  resolveTrackInfo(uri: string): PluginTrackInfo|undefined {
+    return this.trackRegistry.get(uri);
+  }
+
   // Create a new plugin track object from its ID.
   // Returns undefined if no such track is registered.
   createTrack(id: string): TrackLike|undefined {
diff --git a/ui/src/frontend/analytics.ts b/ui/src/frontend/analytics.ts
index 1e298ae..2e3fc95 100644
--- a/ui/src/frontend/analytics.ts
+++ b/ui/src/frontend/analytics.ts
@@ -16,10 +16,9 @@
 import {VERSION} from '../gen/perfetto_version';
 
 import {globals} from './globals';
-import {Router} from './router';
 
 type TraceCategories = 'Trace Actions'|'Record Trace'|'User Actions';
-const ANALYTICS_ID = 'UA-137828855-1';
+const ANALYTICS_ID = 'G-BD89KT2P3C';
 const PAGE_TITLE = 'no-page-title';
 
 export function initAnalytics() {
@@ -90,7 +89,7 @@
     script.src = 'https://www.googletagmanager.com/gtag/js?id=' + ANALYTICS_ID;
     script.defer = true;
     document.head.appendChild(script);
-    const route = Router.parseUrl(window.location.href).page || '/';
+    const route = window.location.href;
     console.log(
         `GA initialized. route=${route}`,
         `isInternalUser=${globals.isInternalUser}`);
@@ -100,13 +99,13 @@
     gtagGlobals.gtag('config', ANALYTICS_ID, {
       allow_google_signals: false,
       anonymize_ip: true,
-      page_path: route,
+      page_location: route,
       referrer: document.referrer.split('?')[0],
       send_page_view: false,
       page_title: PAGE_TITLE,
-      dimension1: globals.isInternalUser ? '1' : '0',
-      dimension2: VERSION,
-      dimension3: getCurrentChannel(),
+      perfetto_is_internal_user: globals.isInternalUser ? '1' : '0',
+      perfetto_version: VERSION,
+      perfetto_channel: getCurrentChannel(),
     });
     this.updatePath(route);
   }
diff --git a/ui/src/frontend/app.ts b/ui/src/frontend/app.ts
index b8ac43c..a1a8da7 100644
--- a/ui/src/frontend/app.ts
+++ b/ui/src/frontend/app.ts
@@ -28,6 +28,7 @@
   TimeSpan,
 } from '../base/time';
 import {Actions} from '../common/actions';
+import {pluginManager} from '../common/plugins';
 import {setTimestampFormat, TimestampFormat} from '../common/timestamp_format';
 import {raf} from '../core/raf_scheduler';
 import {Command} from '../public';
@@ -304,6 +305,34 @@
             }
           },
     },
+    {
+      id: 'perfetto.PrintTrackInfoToConsole',
+      name: 'Print track info to console',
+      callback:
+          async () => {
+            const tracks = Array.from(pluginManager.trackRegistry.values());
+            const options = tracks.map(({uri}): PromptOption => {
+              return {key: uri, displayName: uri};
+            });
+
+            // Sort tracks in a natural sort order
+            const collator = new Intl.Collator('en', {
+              numeric: true,
+              sensitivity: 'base',
+            });
+            const sortedOptions = options.sort((a, b) => {
+              return collator.compare(a.displayName, b.displayName);
+            });
+
+            try {
+              const uri = await this.prompt('Choose a track...', sortedOptions);
+              const trackDetails = pluginManager.resolveTrackInfo(uri);
+              console.log(trackDetails);
+            } catch {
+              // Prompt was probably cancelled - do nothing.
+            }
+          },
+    },
   ];
 
   commands() {
diff --git a/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_details_panel.ts b/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_details_panel.ts
index 299efdb..65f03ef 100644
--- a/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_details_panel.ts
+++ b/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_details_panel.ts
@@ -190,7 +190,7 @@
       const queryResult = await this.engine.query(`
         SELECT
           COUNT(*) AS jankyFrames
-        FROM chrome_janky_frame_info_with_delay
+        FROM chrome_frame_info_with_delay
         WHERE delay_since_last_frame >
           (
             SELECT
diff --git a/ui/src/tracks/ftrace/index.ts b/ui/src/tracks/ftrace/index.ts
index 5a576a5..124696e 100644
--- a/ui/src/tracks/ftrace/index.ts
+++ b/ui/src/tracks/ftrace/index.ts
@@ -12,20 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import {Vnode} from 'mithril';
-
 import {duration, Time, time} from '../../base/time';
+import {BasicAsyncTrack} from '../../common/basic_async_track';
 import {colorForString} from '../../common/colorizer';
 import {LONG, NUM, STR} from '../../common/query_result';
-import {
-  TrackAdapter,
-  TrackControllerAdapter,
-  TrackWithControllerAdapter,
-} from '../../common/track_adapter';
 import {LIMIT, TrackData} from '../../common/track_data';
 import {checkerboardExcept} from '../../frontend/checkerboard';
 import {globals} from '../../frontend/globals';
-import {NewTrackArgs} from '../../frontend/track';
 import {
   EngineProxy,
   Plugin,
@@ -44,23 +37,26 @@
   cpu?: number;
 }
 
-export const FTRACE_RAW_TRACK_KIND = 'FtraceRawTrack';
-
 const MARGIN = 2;
 const RECT_HEIGHT = 18;
 const TRACK_HEIGHT = (RECT_HEIGHT) + (2 * MARGIN);
 
-class FtraceRawTrackController extends TrackControllerAdapter<Config, Data> {
-  static readonly kind = FTRACE_RAW_TRACK_KIND;
+class FtraceRawTrack extends BasicAsyncTrack<Data> {
+  constructor(private engine: EngineProxy, private cpu: number) {
+    super();
+  }
+
+  getHeight(): number {
+    return TRACK_HEIGHT;
+  }
 
   async onBoundsChange(start: time, end: time, resolution: duration):
       Promise<Data> {
     const excludeList = Array.from(globals.state.ftraceFilter.excludedNames);
     const excludeListSql = excludeList.map((s) => `'${s}'`).join(',');
-    const cpuFilter =
-        this.config.cpu === undefined ? '' : `and cpu = ${this.config.cpu}`;
+    const cpuFilter = this.cpu === undefined ? '' : `and cpu = ${this.cpu}`;
 
-    const queryRes = await this.query(`
+    const queryRes = await this.engine.query(`
       select
         cast(ts / ${resolution} as integer) * ${resolution} as tsQuant,
         type,
@@ -91,21 +87,6 @@
     }
     return result;
   }
-}
-
-export class FtraceRawTrack extends TrackAdapter<Config, Data> {
-  static readonly kind = FTRACE_RAW_TRACK_KIND;
-  constructor(args: NewTrackArgs) {
-    super(args);
-  }
-
-  static create(args: NewTrackArgs): FtraceRawTrack {
-    return new FtraceRawTrack(args);
-  }
-
-  getHeight(): number {
-    return TRACK_HEIGHT;
-  }
 
   renderCanvas(ctx: CanvasRenderingContext2D): void {
     const {
@@ -113,7 +94,7 @@
       windowSpan,
     } = globals.frontendLocalState;
 
-    const data = this.data();
+    const data = this.data;
 
     if (data === undefined) return;  // Can't possibly draw anything.
 
@@ -152,10 +133,6 @@
       ctx.restore();
     }
   }
-
-  getContextMenu(): Vnode<any, {}>|null {
-    return null;
-  }
 }
 
 class FtraceRawPlugin implements Plugin {
@@ -165,18 +142,12 @@
     const cpus = await this.lookupCpuCores(ctx.engine);
     for (const cpuNum of cpus) {
       const uri = `perfetto.FtraceRaw#cpu${cpuNum}`;
-      const config: Config = {cpu: cpuNum};
 
       ctx.addTrack({
         uri,
         displayName: `Ftrace Track for CPU ${cpuNum}`,
         trackFactory: () => {
-          return new TrackWithControllerAdapter<Config, Data>(
-              ctx.engine,
-              uri,
-              config,
-              FtraceRawTrack,
-              FtraceRawTrackController);
+          return new FtraceRawTrack(ctx.engine, cpuNum);
         },
       });
     }