drop down
diff --git a/packages/devtools_app/lib/src/screens/app_size/app_size_controller.dart b/packages/devtools_app/lib/src/screens/app_size/app_size_controller.dart
index c7926f2..d27ad71 100644
--- a/packages/devtools_app/lib/src/screens/app_size/app_size_controller.dart
+++ b/packages/devtools_app/lib/src/screens/app_size/app_size_controller.dart
@@ -175,14 +175,49 @@
   }
 
   TreemapNode? get _activeDiffRoot {
-    switch (_activeDiffTreeType.value) {
-      case DiffTreeType.increaseOnly:
-        return _increasedDiffTreeRoot;
-      case DiffTreeType.decreaseOnly:
-        return _decreasedDiffTreeRoot;
-      case DiffTreeType.combined:
-      default:
-        return _combinedDiffTreeRoot;
+    final isDeferred = _isDeferredApp.value;
+    final diffTreeType = _activeDiffTreeType.value;
+
+    if (!isDeferred) {
+      switch (diffTreeType) {
+        case DiffTreeType.increaseOnly:
+          return _increasedDiffTreeRoot;
+        case DiffTreeType.decreaseOnly:
+          return _decreasedDiffTreeRoot;
+        case DiffTreeType.combined:
+        default:
+          return _combinedDiffTreeRoot;
+      }
+    } else {
+      final appUnit = _selectedAppUnit.value;
+      switch (diffTreeType) {
+        case DiffTreeType.increaseOnly:
+          if (appUnit == AppUnit.mainOnly) {
+            return _mainIncreasedDiffTreeRoot;
+          } else if (appUnit == AppUnit.deferredOnly) {
+            return _deferredIncreasedDiffTreeRoot;
+          } else {
+            return _increasedDiffTreeRoot;
+          }
+        case DiffTreeType.decreaseOnly:
+          if (appUnit == AppUnit.mainOnly) {
+            return _mainDecreasedDiffTreeRoot;
+          } else if (appUnit == AppUnit.deferredOnly) {
+            return _deferredDecreasedDiffTreeRoot;
+          } else {
+            return _decreasedDiffTreeRoot;
+          }
+        case DiffTreeType.combined:
+          if (appUnit == AppUnit.mainOnly) {
+            return _mainCombinedDiffTreeRoot;
+          } else if (appUnit == AppUnit.deferredOnly) {
+            return _deferredCombinedDiffTreeRoot;
+          } else {
+            return _combinedDiffTreeRoot;
+          }
+        default:
+          return _combinedDiffTreeRoot;
+      }
     }
   }
 
@@ -190,6 +225,14 @@
   TreemapNode? _decreasedDiffTreeRoot;
   TreemapNode? _combinedDiffTreeRoot;
 
+  TreemapNode? _mainIncreasedDiffTreeRoot;
+  TreemapNode? _mainDecreasedDiffTreeRoot;
+  TreemapNode? _mainCombinedDiffTreeRoot;
+
+  TreemapNode? _deferredIncreasedDiffTreeRoot;
+  TreemapNode? _deferredDecreasedDiffTreeRoot;
+  TreemapNode? _deferredCombinedDiffTreeRoot;
+
   Map<String, dynamic>? get _dataForAppUnit {
     switch (_selectedAppUnit.value) {
       case AppUnit.deferredOnly:
@@ -271,7 +314,7 @@
     if (tabKey == AppSizeScreen.analysisTabKey) {
       _loadApp(_dataForAppUnit!);
     } else {
-      print('selected $appUnit in diff view');
+      changeDiffRoot(_activeDiffRoot);
     }
   }
 
@@ -404,8 +447,8 @@
     await delayForBatchProcessing(micros: 10000);
 
     Map<String, dynamic> diffMap;
-    Map<String, dynamic> mainDiffMap;
-    Map<String, dynamic> deferredDiffMap;
+    Map<String, dynamic>? mainDiffMap;
+    Map<String, dynamic>? deferredDiffMap;
 
     if (oldFile.isAnalyzeSizeFile && newFile.isAnalyzeSizeFile) {
       final oldFileJson = oldFile.data as Map<String, dynamic>;
@@ -427,13 +470,15 @@
           newEntireAppFileJson = _wrapInArtificialRoot(newFileJson);
         }
 
-        final oldMainOnlyFileJson = _extractMainUnit(oldEntireAppFileJson);
-        final newMainOnlyFileJson = _extractMainUnit(newEntireAppFileJson);
+        final oldMainOnlyFileJson =
+            _extractMainUnit(Map.from(oldEntireAppFileJson));
+        final newMainOnlyFileJson =
+            _extractMainUnit(Map.from(newEntireAppFileJson));
 
         final oldDeferredOnlyFileJson =
-            _extractDeferredUnits(oldEntireAppFileJson);
+            _extractDeferredUnits(Map.from(oldEntireAppFileJson));
         final newDeferredOnlyFileJson =
-            _extractDeferredUnits(newEntireAppFileJson);
+            _extractDeferredUnits(Map.from(newEntireAppFileJson));
 
         diffMap = _generateDiffMapFromAnalyzeSizeFiles(
           oldFileJson: oldEntireAppFileJson,
@@ -474,11 +519,26 @@
     diffMap['n'] = isDeferredApp.value ? _entireAppNodeName : _rootNodeName;
 
     // TODO(peterdjlee): Try to move the non-active tree generation to separate isolates.
+    // Entire app or root (for non-deferred):
     final diffTreeMap = _generateDiffTrees(diffMap);
     _combinedDiffTreeRoot = diffTreeMap.combined;
     _increasedDiffTreeRoot = diffTreeMap.increaseOnly;
     _decreasedDiffTreeRoot = diffTreeMap.decreaseOnly;
 
+    if (isDeferredApp.value) {
+      // For main only:
+      final mainDiffTreeMap = _generateDiffTrees(mainDiffMap!);
+      _mainCombinedDiffTreeRoot = mainDiffTreeMap.combined;
+      _mainIncreasedDiffTreeRoot = mainDiffTreeMap.increaseOnly;
+      _mainDecreasedDiffTreeRoot = mainDiffTreeMap.decreaseOnly;
+
+      // For deferred only:
+      final deferredDiffTreeMap = _generateDiffTrees(deferredDiffMap!);
+      _deferredCombinedDiffTreeRoot = deferredDiffTreeMap.combined;
+      _deferredIncreasedDiffTreeRoot = deferredDiffTreeMap.increaseOnly;
+      _deferredDecreasedDiffTreeRoot = deferredDiffTreeMap.decreaseOnly;
+    }
+
     changeDiffRoot(_activeDiffRoot);
 
     _processingNotifier.value = false;