diff --git a/.github/workflows/firestore_tests.yml b/.github/workflows/firestore_tests.yml
new file mode 100644
index 00000000..273b3e2b
--- /dev/null
+++ b/.github/workflows/firestore_tests.yml
@@ -0,0 +1,199 @@
+name: Run unit/integration/testlab
+
+on:
+  workflow_dispatch:
+  pull_request:
+    types: [opened, reopened, synchronize]
+    paths:
+    - "firestore/**"
+  push:
+    paths-ignore:
+    - "**.md"
+
+jobs:
+  unit_tests:
+    runs-on: ubuntu-latest
+    timeout-minutes: 5
+    steps:
+    - name: "checkout"
+      uses: actions/checkout@v2
+    - name: "install flutter"
+      uses: subosito/flutter-action@v2
+    - name: "Run widget tests"
+      working-directory: firestore
+      run: flutter test
+  test_lab:
+      runs-on: ubuntu-latest
+      timeout-minutes: 30
+      steps:
+      - uses: actions/checkout@v3
+      # FIXME need to build the app here
+      - name: "Test lab run"
+        id: ftl_test # removed - here
+        uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+        with:
+          credentials_json: ${{ secrets.TEST_LAB }} # FIXME test this
+          test_type: "robo" # FIXME instrumentation better
+          testapp_dir: firestore/testapp
+          test_devices: model=redfin,version=30
+      - run: echo '${{ steps.ftl_test.outputs.test_summary }}'
+
+
+# firebase-ios-sdk .github/workflows/dynamiclinks.yml 
+# See also .github/workflows/crashlytics.yml
+    #       env:
+    #   plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
+    #   signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
+    # runs-on: macos-12
+    # steps:
+    # - uses: actions/checkout@v3
+    # - uses: ruby/setup-ruby@v1
+    # - name: Setup quickstart
+    #   run: scripts/setup_quickstart.sh DynamicLinks
+    # - name: Install Secret GoogleService-Info.plist
+    #   run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-dynamiclinks.plist.gpg \
+    #       quickstart-ios/dynamiclinks/GoogleService-Info.plist "$plist_secret"
+    # - name: Update Environment Variable For DynamicLinks
+    #   run: |
+    #     sed -i '' 's#DYNAMIC_LINK_DOMAIN#https://qpf6m.app.goo.gl#' quickstart-ios/dynamiclinks/DynamicLinksExample/DynamicLinksExample.entitlements
+    #     sed -i '' 's#YOUR_DOMAIN_URI_PREFIX";#https://qpf6m.app.goo.gl";#' quickstart-ios/dynamiclinks/DynamicLinksExample/ViewController.m
+    #     sed -i '' 's#YOUR_DOMAIN_URI_PREFIX";#https://qpf6m.app.goo.gl";#' quickstart-ios/dynamiclinks/DynamicLinksExampleSwift/ViewController.swift
+    # # - name: Build objc quickstart
+    # #   run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_ftl.sh DynamicLinks)
+    # - name: Build swift quickstart
+    #   if: ${{ always() }}
+    #   run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_ftl.sh DynamicLinks swift)
+    # - id: ftl_test
+    #   uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+    #   with:
+    #     credentials_json: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_CREDENTIALS }}
+    #     testapp_dir: quickstart-ios/build-for-testing
+    #     test_type: "xctest"
+
+
+    # firebase-cpp-sdk
+    #   test_android:
+    # name: test-android-${{ matrix.build_os }}-${{ matrix.android_device }}-${{ matrix.test_type }}
+    # needs: [check_and_prepare, build_android]
+    # runs-on: macos-12
+    # if: contains(needs.check_and_prepare.outputs.matrix_platform, 'Android') && needs.check_and_prepare.outputs.apis != '' && !cancelled()
+    # strategy:
+    #   fail-fast: false
+    #   matrix:
+    #     build_os: ${{ fromJson(needs.check_and_prepare.outputs.matrix_os) }}
+    #     android_device: ${{ fromJson(needs.check_and_prepare.outputs.android_device) }}
+    #     test_type: ["gameloop"]
+    #     exclude:
+    #       -  android_device: "android_target"
+    #          test_type: "uitest"
+    #       -  android_device: "android_latest"
+    #          test_type: "uitest"
+    # steps:
+    #   - uses: actions/checkout@v3
+    #     with:
+    #       ref: ${{needs.check_and_prepare.outputs.github_ref}}
+    #   - name: Download Android integration tests artifact
+    #     uses: actions/download-artifact@v3
+    #     with:
+    #       path: testapps/testapps-android-${{ matrix.build_os }}
+    #       name: testapps-android-${{ matrix.build_os }}
+    #   - name: Setup python
+    #     uses: actions/setup-python@v4
+    #     with:
+    #       python-version: ${{ env.pythonVersion }}
+    #   - name: Install prerequisites for testing
+    #     uses: nick-invision/retry@v2
+    #     with:
+    #       shell: bash
+    #       timeout_minutes: 5
+    #       max_attempts: 3
+    #       command: scripts/gha/install_test_workflow_prereqs.sh -p Android -t true
+    #   - name: Get Device Info
+    #     id: device-info
+    #     run: |
+    #       echo "device_type=$( python scripts/gha/print_matrix_configuration.py -k ${{ matrix.android_device }} -get_device_type)" >> $GITHUB_OUTPUT
+    #       echo "device=$( python scripts/gha/print_matrix_configuration.py -k ${{ matrix.android_device }} -get_ftl_device)" >> $GITHUB_OUTPUT
+    #   - name: Setup java 8 for test_simulator.py
+    #     uses: actions/setup-java@v3
+    #     with:
+    #       distribution: 'temurin'
+    #       java-version: '8'
+    #   - name: Run Android integration tests on Emulator locally
+    #     timeout-minutes: 150
+    #     if: steps.device-info.outputs.device_type == 'virtual'
+    #     run: |
+    #       python scripts/gha/test_simulator.py --testapp_dir testapps \
+    #         --test_type "${{ matrix.test_type }}" \
+    #         --android_device "${{ matrix.android_device }}" \
+    #         --logfile_name "android-${{ matrix.build_os }}-${{ matrix.android_device }}-${{ matrix.test_type }}" \
+    #         --ci
+    #   - id: ftl_test
+    #     if: steps.device-info.outputs.device_type == 'ftl'
+    #     uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+    #     timeout-minutes: 90
+    #     with:
+    #       credentials_json: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_CREDENTIALS }}
+    #       testapp_dir: testapps
+    #       test_type: "game-loop"
+    #       test_devices: ${{ steps.device-info.outputs.device }}
+    #       max_attempts: 3
+    #       validator: ${GITHUB_WORKSPACE}/scripts/gha/integration_testing/ftl_gha_validator.py
+    #   - name: Read FTL Test Result
+    #     if: ${{ steps.device-info.outputs.device_type == 'ftl' && !cancelled() }}
+    #     shell: bash
+    #     run: |
+    #       python scripts/gha/read_ftl_test_result.py --test_result '${{ steps.ftl_test.outputs.test_summary }}' \
+    #         --output_path testapps/test-results-android-${{ matrix.build_os }}-${{ matrix.android_device }}-${{ matrix.test_type }}.log
+    #   - name: Prepare results summary artifact
+    #     if: ${{ !cancelled() }}
+    #     shell: bash
+    #     run: |
+    #       # If testapps do not exist, then it's a build error not test error. 
+    #       if [ -d "testapps/testapps-android-${{ matrix.build_os }}" ] && [ ! -f "testapps/test-results-android-${{ matrix.build_os }}-${{ matrix.android_device }}-${{ matrix.test_type }}.log.json" ]; then
+    #         mkdir -p testapps && echo "__SUMMARY_MISSING__" > "testapps/test-results-android-${{ matrix.build_os }}-${{ matrix.android_device }}-${{ matrix.test_type }}.log.json"
+    #       fi
+    #   - name: Upload Android test results artifact
+    #     if: ${{ !cancelled() }}
+    #     uses: actions/upload-artifact@v3
+    #     with:
+    #       name: log-artifact
+    #       path: testapps/test-results-android-${{ matrix.build_os }}-${{ matrix.android_device }}-${{ matrix.test_type }}*
+    #       retention-days: ${{ env.artifactRetentionDays }}
+    #   - name: Upload Android test video artifact
+    #     if: ${{ steps.device-info.outputs.device_type == 'virtual' && !cancelled() }}
+    #     uses: actions/upload-artifact@v3
+    #     with:
+    #       name: mobile-simulator-test-video-artifact
+    #       path: testapps/video-*-android-${{ matrix.build_os }}-${{ matrix.android_device }}-${{ matrix.test_type }}.mp4
+    #       retention-days: ${{ env.artifactRetentionDays }}
+    #   - name: Upload Android test logcat artifact
+    #     if: ${{ steps.device-info.outputs.device_type == 'virtual' && !cancelled() }}
+    #     uses: actions/upload-artifact@v3
+    #     with:
+    #       name: mobile-simulator-test-logcat-artifact
+    #       path: testapps/logcat-*-android-${{ matrix.build_os }}-${{ matrix.android_device }}-${{ matrix.test_type }}.txt
+    #       retention-days: ${{ env.artifactRetentionDays }}
+    #   - name: Download log artifacts
+    #     if: ${{ needs.check_and_prepare.outputs.pr_number && failure() && !cancelled() }}
+    #     uses: actions/download-artifact@v3
+    #     with:
+    #       path: test_results
+    #       name: log-artifact
+    #   - name: Update PR label and comment
+    #     if: ${{ needs.check_and_prepare.outputs.pr_number && failure() && !cancelled() }}
+    #     shell: bash
+    #     run: |
+    #       python scripts/gha/it_workflow.py --stage progress \
+    #         --token ${{github.token}} \
+    #         --issue_number ${{needs.check_and_prepare.outputs.pr_number}}\
+    #         --actor ${{github.actor}} \
+    #         --commit ${{needs.check_and_prepare.outputs.github_ref}} \
+    #         --run_id ${{github.run_id}}
+    #   - name: Summarize test results
+    #     if: ${{ !cancelled() }}
+    #     shell: bash
+    #     run: |
+    #       cat "testapps/test-results-android-${{ matrix.build_os }}-${{ matrix.android_device }}-${{ matrix.test_type }}.log"
+    #       if [[ "${{ job.status }}" != "success" ]]; then
+    #         exit 1
+    #       fi
\ No newline at end of file
diff --git a/firestore/README.md b/firestore/README.md
index 6edf0fd0..a4772ac3 100644
--- a/firestore/README.md
+++ b/firestore/README.md
@@ -48,6 +48,11 @@ service cloud.firestore {
   **Add Some** from the overflow menu to add some
   new entries.
 
+### Run the App Web
+
+In order to display images without a CORS exception, use the --web-renderer html flag:
+`flutter run -d chrome --web-renderer html`
+
 ### Result
 
 <img src="./assets/home.png" height="534" width="300"/>
diff --git a/firestore/android/app/build.gradle b/firestore/android/app/build.gradle
index 7715865e..ded18ffb 100644
--- a/firestore/android/app/build.gradle
+++ b/firestore/android/app/build.gradle
@@ -22,6 +22,9 @@ if (flutterVersionName == null) {
 }
 
 apply plugin: 'com.android.application'
+// START: FlutterFire Configuration
+apply plugin: 'com.google.gms.google-services'
+// END: FlutterFire Configuration
 apply plugin: 'kotlin-android'
 apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
 
diff --git a/firestore/android/app/google-services.json b/firestore/android/app/google-services.json
new file mode 100644
index 00000000..0b7783c5
--- /dev/null
+++ b/firestore/android/app/google-services.json
@@ -0,0 +1,46 @@
+{
+  "project_info": {
+    "project_number": "905001072058",
+    "project_id": "ctflutterquickstart",
+    "storage_bucket": "ctflutterquickstart.appspot.com"
+  },
+  "client": [
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:905001072058:android:6b4d615e68771837801983",
+        "android_client_info": {
+          "package_name": "com.example.firestore"
+        }
+      },
+      "oauth_client": [
+        {
+          "client_id": "905001072058-o40uoh0mn4staje7e49gudg3rl8b1723.apps.googleusercontent.com",
+          "client_type": 3
+        }
+      ],
+      "api_key": [
+        {
+          "current_key": "AIzaSyBeYHWDZI-VYzraflj-GJ9Yj-5vKdqd1uE"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": [
+            {
+              "client_id": "905001072058-o40uoh0mn4staje7e49gudg3rl8b1723.apps.googleusercontent.com",
+              "client_type": 3
+            },
+            {
+              "client_id": "905001072058-58k5uvhubqhj8loen93npuv833qqnte5.apps.googleusercontent.com",
+              "client_type": 2,
+              "ios_info": {
+                "bundle_id": "com.example.firestore"
+              }
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/firestore/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java b/firestore/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java
new file mode 100644
index 00000000..752fc185
--- /dev/null
+++ b/firestore/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java
@@ -0,0 +1,25 @@
+// Generated file.
+//
+// If you wish to remove Flutter's multidex support, delete this entire file.
+//
+// Modifications to this file should be done in a copy under a different name
+// as this file may be regenerated.
+
+package io.flutter.app;
+
+import android.app.Application;
+import android.content.Context;
+import androidx.annotation.CallSuper;
+import androidx.multidex.MultiDex;
+
+/**
+ * Extension of {@link android.app.Application}, adding multidex support.
+ */
+public class FlutterMultiDexApplication extends Application {
+  @Override
+  @CallSuper
+  protected void attachBaseContext(Context base) {
+    super.attachBaseContext(base);
+    MultiDex.install(this);
+  }
+}
diff --git a/firestore/android/build.gradle b/firestore/android/build.gradle
index 4256f917..56cce25e 100644
--- a/firestore/android/build.gradle
+++ b/firestore/android/build.gradle
@@ -6,7 +6,10 @@ buildscript {
     }
 
     dependencies {
-        classpath 'com.android.tools.build:gradle:4.1.0'
+        classpath 'com.android.tools.build:gradle:7.4.1'
+        // START: FlutterFire Configuration
+        classpath 'com.google.gms:google-services:4.3.14'
+        // END: FlutterFire Configuration
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
     }
 }
@@ -26,6 +29,6 @@ subprojects {
     project.evaluationDependsOn(':app')
 }
 
-task clean(type: Delete) {
+tasks.register("clean", Delete) {
     delete rootProject.buildDir
 }
diff --git a/firestore/android/gradle/wrapper/gradle-wrapper.properties b/firestore/android/gradle/wrapper/gradle-wrapper.properties
index bc6a58af..6b665338 100644
--- a/firestore/android/gradle/wrapper/gradle-wrapper.properties
+++ b/firestore/android/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
diff --git a/firestore/lib/firebase_options.dart b/firestore/lib/firebase_options.dart
index 42cd91ad..10e649c9 100644
--- a/firestore/lib/firebase_options.dart
+++ b/firestore/lib/firebase_options.dart
@@ -35,21 +35,20 @@ class DefaultFirebaseOptions {
   }
 
   static const FirebaseOptions web = FirebaseOptions(
-    apiKey: 'AIzaSyAfj_GOB5yKD6lPaVS9hSskKITPuquzpZQ',
-    appId: '1:993083111617:web:380d3567efd5f99a67bc40',
-    messagingSenderId: '993083111617',
-    projectId: 'friendlyeats-flutter-68d79',
-    authDomain: 'friendlyeats-flutter-68d79.firebaseapp.com',
-    storageBucket: 'friendlyeats-flutter-68d79.appspot.com',
-    measurementId: 'G-FSYS2SH1N4',
+    apiKey: 'AIzaSyC8VCwBMvvfKAqnXC5vxBvgEmEISz1N5XA',
+    appId: '1:905001072058:web:e25193a00a843ca7801983',
+    messagingSenderId: '905001072058',
+    projectId: 'ctflutterquickstart',
+    authDomain: 'ctflutterquickstart.firebaseapp.com',
+    storageBucket: 'ctflutterquickstart.appspot.com',
   );
 
   static const FirebaseOptions android = FirebaseOptions(
-    apiKey: 'AIzaSyAiC9yhzOEeMcP6dIuKEZCfOdknTzNtYGM',
-    appId: '1:993083111617:android:a1aded9943e3dd0367bc40',
-    messagingSenderId: '993083111617',
-    projectId: 'friendlyeats-flutter-68d79',
-    storageBucket: 'friendlyeats-flutter-68d79.appspot.com',
+    apiKey: 'AIzaSyBeYHWDZI-VYzraflj-GJ9Yj-5vKdqd1uE',
+    appId: '1:905001072058:android:6b4d615e68771837801983',
+    messagingSenderId: '905001072058',
+    projectId: 'ctflutterquickstart',
+    storageBucket: 'ctflutterquickstart.appspot.com',
   );
 
   static const FirebaseOptions ios = FirebaseOptions(
@@ -58,7 +57,8 @@ class DefaultFirebaseOptions {
     messagingSenderId: '993083111617',
     projectId: 'friendlyeats-flutter-68d79',
     storageBucket: 'friendlyeats-flutter-68d79.appspot.com',
-    iosClientId: '993083111617-a9q0thbihk8tl0487gfem1hm1ahaieab.apps.googleusercontent.com',
+    iosClientId:
+        '993083111617-a9q0thbihk8tl0487gfem1hm1ahaieab.apps.googleusercontent.com',
     iosBundleId: 'friendlyeats.example.app',
   );
 
@@ -68,7 +68,8 @@ class DefaultFirebaseOptions {
     messagingSenderId: '993083111617',
     projectId: 'friendlyeats-flutter-68d79',
     storageBucket: 'friendlyeats-flutter-68d79.appspot.com',
-    iosClientId: '993083111617-lh0dmnumalopnegi244kmfm2o0brl7dg.apps.googleusercontent.com',
+    iosClientId:
+        '993083111617-lh0dmnumalopnegi244kmfm2o0brl7dg.apps.googleusercontent.com',
     iosBundleId: 'friendlyears.example.app',
   );
 }
diff --git a/firestore/lib/src/data/restaurant_provider.dart b/firestore/lib/src/data/restaurant_provider.dart
index 9fc0f8d0..ad7ac3b3 100644
--- a/firestore/lib/src/data/restaurant_provider.dart
+++ b/firestore/lib/src/data/restaurant_provider.dart
@@ -18,7 +18,7 @@ import 'dart:async';
 
 import 'package:cloud_firestore/cloud_firestore.dart';
 
-import '../model/filter.dart';
+import '../model/filter.dart' as modelFilter;
 import '../model/restaurant.dart';
 import '../model/review.dart';
 
@@ -29,7 +29,7 @@ abstract class RestaurantProvider {
       {required String restaurantId, required Review review});
   void addRestaurantsBatch(List<Restaurant> restaurants);
   void loadAllRestaurants();
-  void loadFilteredRestaurants(Filter filter);
+  void loadFilteredRestaurants(modelFilter.Filter filter);
   Future<Restaurant> getRestaurantById(String restaurantId);
   void dispose();
 }
@@ -116,7 +116,7 @@ class FirestoreRestaurantProvider implements RestaurantProvider {
   }
 
   @override
-  void loadFilteredRestaurants(Filter filter) {
+  void loadFilteredRestaurants(modelFilter.Filter filter) {
     Query collection = FirebaseFirestore.instance.collection('restaurants');
     if (filter.category != null) {
       collection = collection.where('category', isEqualTo: filter.category);
diff --git a/firestore/pubspec.lock b/firestore/pubspec.lock
index ed78b8f5..c47480e9 100644
--- a/firestore/pubspec.lock
+++ b/firestore/pubspec.lock
@@ -5,10 +5,10 @@ packages:
     dependency: transitive
     description:
       name: _flutterfire_internals
-      sha256: "2f428053492f92303e42c9afa8e3a78ad1886760e7b594e2b5a6b6ee47376360"
+      sha256: "1a5e13736d59235ce0139621b4bbe29bc89839e202409081bc667eb3cd20674c"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.2"
+    version: "1.3.5"
   async:
     dependency: transitive
     description:
@@ -45,26 +45,26 @@ packages:
     dependency: "direct main"
     description:
       name: cloud_firestore
-      sha256: "9194bf1845ee073bea64ec94e72c9dcf5d15f755e96496d8ccfee9def38b666f"
+      sha256: "0ff0baec167e308df192398dbd81ec13c1799635885c6aa6ed9ab8b5ed61f52c"
       url: "https://pub.dev"
     source: hosted
-    version: "3.5.1"
+    version: "4.9.1"
   cloud_firestore_platform_interface:
     dependency: transitive
     description:
       name: cloud_firestore_platform_interface
-      sha256: d023142c18c28b2610c23c196e829c96976569cc2aa2f8e45328ae8a64c428d1
+      sha256: "5749b81aea93afdce220e02d34369162010d210011054ac494b2c38c4e9ebeb7"
       url: "https://pub.dev"
     source: hosted
-    version: "5.7.7"
+    version: "5.16.0"
   cloud_firestore_web:
     dependency: transitive
     description:
       name: cloud_firestore_web
-      sha256: "3d7d4fa8c1dc5a1f7cb33985ae0ab9924d33d76d4959fe26aed84b7d282887e3"
+      sha256: fef99ad0599e983092adb1bb01f14a596dba601a7a8efaaffd7b2721d64e2c51
       url: "https://pub.dev"
     source: hosted
-    version: "2.8.10"
+    version: "3.7.0"
   collection:
     dependency: transitive
     description:
@@ -93,34 +93,34 @@ packages:
     dependency: "direct main"
     description:
       name: firebase_auth
-      sha256: ca3034d35d6ca894487ec80aa1162a135fef7c5d0abef8154789cbeea3a6deaf
+      sha256: "6d9be853426ab686d68076b8007ac29b2c31e7d549444a45b5c3fe1abc249fb0"
       url: "https://pub.dev"
     source: hosted
-    version: "3.11.2"
+    version: "4.9.0"
   firebase_auth_platform_interface:
     dependency: transitive
     description:
       name: firebase_auth_platform_interface
-      sha256: ab20ecbc411726e139250a49fa03fe1ae0105fd990c5330b2a148ec08dfb140b
+      sha256: "2946cfdc17f925fa9771dd0ba3ce9dd2d019100a8685d0557c161f7786ea9b14"
       url: "https://pub.dev"
     source: hosted
-    version: "6.10.1"
+    version: "6.18.0"
   firebase_auth_web:
     dependency: transitive
     description:
       name: firebase_auth_web
-      sha256: bbe4f4fffcc378ca05c3d8ff33853be86dd27d0fafc85a953acaf5190531b6f9
+      sha256: d8972d754702a3f4881184706b8056e2837d0dae91613a43b988c960b8e0d988
       url: "https://pub.dev"
     source: hosted
-    version: "4.6.1"
+    version: "5.8.0"
   firebase_core:
     dependency: "direct main"
     description:
       name: firebase_core
-      sha256: "4f1d7c13a909e82ff026679c9b8493cdeb35a9c76bc46c42bf9e2240c9e57e80"
+      sha256: c78132175edda4bc532a71e01a32964e4b4fcf53de7853a422d96dac3725f389
       url: "https://pub.dev"
     source: hosted
-    version: "1.24.0"
+    version: "2.15.1"
   firebase_core_platform_interface:
     dependency: transitive
     description:
@@ -133,10 +133,10 @@ packages:
     dependency: transitive
     description:
       name: firebase_core_web
-      sha256: "839f1b48032a61962792cea1225fae030d4f27163867f181d6d2072dd40acbee"
+      sha256: "4cf4d2161530332ddc3c562f19823fb897ff37a9a774090d28df99f47370e973"
       url: "https://pub.dev"
     source: hosted
-    version: "1.7.3"
+    version: "2.7.0"
   flutter:
     dependency: "direct main"
     description: flutter
@@ -160,14 +160,6 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "4.0.2"
-  intl:
-    dependency: transitive
-    description:
-      name: intl
-      sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91"
-      url: "https://pub.dev"
-    source: hosted
-    version: "0.17.0"
   js:
     dependency: transitive
     description:
diff --git a/firestore/pubspec.yaml b/firestore/pubspec.yaml
index 89f32d45..59290665 100644
--- a/firestore/pubspec.yaml
+++ b/firestore/pubspec.yaml
@@ -11,9 +11,9 @@ dependencies:
   flutter:
     sdk: flutter
   cupertino_icons: ^1.0.2
-  firebase_core: ^1.15.0
-  firebase_auth: ^3.3.15
-  cloud_firestore: ^3.1.13
+  firebase_core: ^2.15.1
+  firebase_auth: ^4.9.0
+  cloud_firestore: ^4.9.1
 
 dev_dependencies:
   pedantic: ^1.9.0
diff --git a/firestore/test/widget_test.dart b/firestore/test/widget_test.dart
index e69de29b..0056c6c6 100644
--- a/firestore/test/widget_test.dart
+++ b/firestore/test/widget_test.dart
@@ -0,0 +1,8 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+void main() {
+  testWidgets('Test fails', (WidgetTester tester) async {
+    // autopass
+  });
+}
diff --git a/firestore/testapp/app-release.apk b/firestore/testapp/app-release.apk
new file mode 100644
index 00000000..0d01121d
Binary files /dev/null and b/firestore/testapp/app-release.apk differ
diff --git a/firestore/windows/flutter/generated_plugin_registrant.cc b/firestore/windows/flutter/generated_plugin_registrant.cc
index 8b6d4680..1a82e7d0 100644
--- a/firestore/windows/flutter/generated_plugin_registrant.cc
+++ b/firestore/windows/flutter/generated_plugin_registrant.cc
@@ -6,6 +6,9 @@
 
 #include "generated_plugin_registrant.h"
 
+#include <firebase_core/firebase_core_plugin_c_api.h>
 
 void RegisterPlugins(flutter::PluginRegistry* registry) {
+  FirebaseCorePluginCApiRegisterWithRegistrar(
+      registry->GetRegistrarForPlugin("FirebaseCorePluginCApi"));
 }
diff --git a/firestore/windows/flutter/generated_plugins.cmake b/firestore/windows/flutter/generated_plugins.cmake
index b93c4c30..fa8a39ba 100644
--- a/firestore/windows/flutter/generated_plugins.cmake
+++ b/firestore/windows/flutter/generated_plugins.cmake
@@ -3,6 +3,7 @@
 #
 
 list(APPEND FLUTTER_PLUGIN_LIST
+  firebase_core
 )
 
 list(APPEND FLUTTER_FFI_PLUGIN_LIST