diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index a37b2ac..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,40 +0,0 @@
-FROM google/dart:2.12.2
-
-# We install unzip and remove the apt-index again to keep the
-# docker image diff small.
-RUN apt-get update && \
-  apt-get install -y unzip && \
-  rm -rf /var/lib/apt/lists/*
-
-WORKDIR /app
-RUN groupadd --system dart && \
-  useradd --no-log-init --system --home /home/dart --create-home -g dart dart
-RUN chown dart:dart /app
-
-# Switch to a new, non-root user to use the flutter tool.
-# The Flutter tool won't perform its actions when run as root.
-USER dart
-
-COPY --chown=dart:dart tool/dart_run.sh /dart_runtime/
-COPY --chown=dart:dart pubspec.* /app/
-RUN pub get
-COPY --chown=dart:dart . /app
-RUN pub get --offline
-
-ENV PATH="/home/dart/.pub-cache/bin:${PATH}"
-
-# Set the Flutter SDK up for web compilation.
-RUN dart pub run grinder setup-flutter-sdk
-
-# Build the dill file
-RUN dart pub run grinder build-storage-artifacts validate-storage-artifacts
-
-EXPOSE 8080
-
-# Clear out any arguments the base images might have set and ensure we start
-# the Dart app using custom script enabling debug modes.
-CMD []
-
-ENTRYPOINT ["/dart_runtime/dart_run.sh", \
-  "--port", "8080", \
-  "--proxy-target", "https://v1.api.dartpad.dev/"]
diff --git a/app.yaml b/app.yaml
deleted file mode 100644
index bfa5820..0000000
--- a/app.yaml
+++ /dev/null
@@ -1,44 +0,0 @@
-runtime: custom
-env: flex
-
-resources:
-  cpu: 1
-  memory_gb: 4
-  disk_size_gb: 50
-
-automatic_scaling:
-  min_num_instances: 2
-  max_num_instances: 40
-  cool_down_period_sec: 60
-  cpu_utilization:
-    target_utilization: 0.6
-
-env_variables:
-  REDIS_SERVER_URI: 'redis://10.0.0.4:6379'
-
-network:
-  name: vpc-dart-services
-
-service: default
-
-skip_files:
-- ^\.git/.*$
-
-# Health checks, for detail please see:
-# https://cloud.google.com/appengine/docs/flexible/custom-runtimes/configuring-your-app-with-app-yaml#updated_health_checks
-
-# liveness_check:
-#   path: "/liveness_check"
-#   check_interval_sec: 30
-#   timeout_sec: 5
-#   failure_threshold: 2
-#   success_threshold: 2
-#   initial_delay_sec: 600
-
-# readiness_check:
-#   path: "/readiness_check"
-#   check_interval_sec: 5
-#   timeout_sec: 4
-#   failure_threshold: 2
-#   success_threshold: 2
-#   app_start_timeout_sec: 300
diff --git a/bin/server.dart b/bin/server.dart
deleted file mode 100644
index 49bc5ab..0000000
--- a/bin/server.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// To meet GAE needs this file must be called 'server.dart'.
-
-library appengine.services.bin;
-
-import 'dart:async';
-
-import 'package:dart_services/services_gae.dart' as server;
-import 'package:dart_services/src/sdk_manager.dart';
-
-Future<void> main(List<String> args) async {
-  // Ensure the Dart SDK is downloaded (if already up-to-date, no work is
-  // performed).
-  await SdkManager.sdk.init();
-
-  server.main(args);
-}
diff --git a/lib/services_gae.dart b/lib/services_gae.dart
deleted file mode 100644
index 577efe0..0000000
--- a/lib/services_gae.dart
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library services_gae;
-
-import 'dart:io' as io;
-import 'dart:math';
-
-import 'package:appengine/appengine.dart' as ae;
-import 'package:args/args.dart';
-import 'package:logging/logging.dart';
-import 'package:shelf/shelf_io.dart' as shelf_io;
-
-import 'src/common_server_api.dart';
-import 'src/common_server_impl.dart';
-import 'src/sdk_manager.dart';
-import 'src/server_cache.dart';
-
-const String _API_PREFIX = '/api/dartservices/';
-const String _livenessCheck = '/liveness_check';
-const String _readinessCheck = '/readiness_check';
-
-// Serve content for 1.5 hours, +- 30 minutes.
-final DateTime _serveUntil = DateTime.now()
-    .add(Duration(hours: 1))
-    .add(Duration(minutes: Random().nextInt(60)));
-
-final Logger _logger = Logger('gae_server');
-
-void main(List<String> args) {
-  final parser = ArgParser()
-    ..addOption('proxy-target',
-        help: 'URL base to proxy compilation requests to')
-    ..addOption('port',
-        abbr: 'p', defaultsTo: '8080', help: 'Port to attach to');
-  final results = parser.parse(args);
-
-  final gaePort = int.tryParse(results['port'] as String ?? '') ?? 8080;
-
-  if (SdkManager.sdk.sdkPath == null) {
-    throw 'No Dart SDK is available; set the DART_SDK env var.';
-  }
-
-  // Log to stdout/stderr.  AppEngine's logging package is disabled in 0.6.0
-  // and AppEngine copies stdout/stderr to the dashboards.
-  _logger.onRecord.listen((LogRecord rec) {
-    final out = ('${rec.level.name}: ${rec.time}: ${rec.message}\n');
-    if (rec.level > Level.INFO) {
-      io.stderr.write(out);
-    } else {
-      io.stdout.write(out);
-    }
-  });
-  log.info('''Initializing dart-services:
-    --port: $gaePort
-    --proxy-target: ${results['proxy-target']}
-    sdkPath: ${SdkManager.sdk?.sdkPath}
-    \$REDIS_SERVER_URI: ${io.Platform.environment['REDIS_SERVER_URI']}
-    \$GAE_VERSION: ${io.Platform.environment['GAE_VERSION']}
-  ''');
-
-  final server = GaeServer(io.Platform.environment['REDIS_SERVER_URI'],
-      results['proxy-target'].toString());
-  server.start(gaePort);
-}
-
-class GaeServer {
-  final String redisServerUri;
-
-  CommonServerImpl commonServerImpl;
-  CommonServerApi commonServerApi;
-  bool proxying = false;
-
-  GaeServer(this.redisServerUri, String proxyTarget) {
-    hierarchicalLoggingEnabled = true;
-    recordStackTraceAtLevel = Level.SEVERE;
-
-    _logger.level = Level.ALL;
-
-    if (proxyTarget != null && proxyTarget.isNotEmpty) {
-      commonServerImpl = CommonServerImplProxy(proxyTarget);
-      proxying = true;
-    } else {
-      commonServerImpl = CommonServerImpl(
-        GaeServerContainer(),
-        redisServerUri == null
-            ? InMemoryCache()
-            : RedisCache(
-                redisServerUri,
-                io.Platform.environment['GAE_VERSION'],
-              ),
-      );
-    }
-    commonServerApi = CommonServerApi(commonServerImpl);
-  }
-
-  Future<dynamic> start([int gaePort = 8080]) async {
-    await commonServerImpl.init();
-    return ae.runAppEngine(requestHandler, port: gaePort);
-  }
-
-  Future<void> requestHandler(io.HttpRequest request) async {
-    request.response.headers
-      ..add('Access-Control-Allow-Origin', '*')
-      ..add('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
-      ..add('Access-Control-Allow-Headers',
-          'Origin, X-Requested-With, Content-Type, Accept');
-
-    if (request.method == 'OPTIONS') {
-      await _processOptionsRequest(request);
-    } else if (request.uri.path == _readinessCheck) {
-      await _processReadinessRequest(request);
-    } else if (request.uri.path == _livenessCheck) {
-      await _processLivenessRequest(request);
-    } else if (request.uri.path.startsWith(_API_PREFIX)) {
-      await shelf_io.handleRequest(request, commonServerApi.router);
-    } else {
-      await _processDefaultRequest(request);
-    }
-  }
-
-  Future<void> _processOptionsRequest(io.HttpRequest request) async {
-    final statusCode = io.HttpStatus.ok;
-    request.response.statusCode = statusCode;
-    await request.response.close();
-  }
-
-  Future<void> _processReadinessRequest(io.HttpRequest request) async {
-    _logger.info('Processing readiness check');
-    if (proxying) {
-      request.response.statusCode = io.HttpStatus.ok;
-    } else if (!commonServerImpl.isRestarting &&
-        DateTime.now().isBefore(_serveUntil)) {
-      request.response.statusCode = io.HttpStatus.ok;
-    } else {
-      request.response.statusCode = io.HttpStatus.serviceUnavailable;
-      _logger.severe('CommonServer not running - failing readiness check.');
-    }
-
-    await request.response.close();
-  }
-
-  Future<void> _processLivenessRequest(io.HttpRequest request) async {
-    _logger.info('Processing liveness check');
-    if (proxying) {
-      request.response.statusCode = io.HttpStatus.ok;
-    } else if (!commonServerImpl.isHealthy ||
-        DateTime.now().isAfter(_serveUntil)) {
-      _logger.severe('CommonServer is no longer healthy.'
-          ' Intentionally failing health check.');
-      request.response.statusCode = io.HttpStatus.serviceUnavailable;
-    } else {
-      try {
-        final tempDir = await io.Directory.systemTemp.createTemp('healthz');
-        try {
-          final file = io.File('${tempDir.path}/livecheck.txt');
-          await file.writeAsString('testing123\n' * 1000, flush: true);
-          final stat = await file.stat();
-          if (stat.size > 10000) {
-            _logger.info('CommonServer healthy and file system working.'
-                ' Passing health check.');
-            request.response.statusCode = io.HttpStatus.ok;
-          } else {
-            _logger.severe('CommonServer healthy, but filesystem is not.'
-                ' Intentionally failing health check.');
-            request.response.statusCode = io.HttpStatus.serviceUnavailable;
-          }
-        } finally {
-          await tempDir.delete(recursive: true);
-        }
-      } catch (e) {
-        _logger.severe('CommonServer healthy, but failed to create temporary'
-            ' file: $e');
-        request.response.statusCode = io.HttpStatus.serviceUnavailable;
-      }
-    }
-
-    await request.response.close();
-  }
-
-  Future<void> _processDefaultRequest(io.HttpRequest request) async {
-    request.response.statusCode = io.HttpStatus.notFound;
-    await request.response.close();
-  }
-}
-
-class GaeServerContainer implements ServerContainer {
-  @override
-  String get version => io.Platform.version;
-}
diff --git a/pubspec.lock b/pubspec.lock
index 65deb24..e667b2d 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -1,13 +1,6 @@
 # Generated by pub
 # See https://dart.dev/tools/pub/glossary#lockfile
 packages:
-  _discoveryapis_commons:
-    dependency: transitive
-    description:
-      name: _discoveryapis_commons
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "0.2.1"
   _fe_analyzer_shared:
     dependency: transitive
     description:
@@ -29,13 +22,6 @@
       url: "https://pub.dartlang.org"
     source: hosted
     version: "0.41.2"
-  appengine:
-    dependency: "direct main"
-    description:
-      name: appengine
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "0.12.0"
   args:
     dependency: "direct main"
     description:
@@ -218,13 +204,6 @@
       url: "https://pub.dartlang.org"
     source: hosted
     version: "0.10.11"
-  gcloud:
-    dependency: transitive
-    description:
-      name: gcloud
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "0.7.3"
   glob:
     dependency: transitive
     description:
@@ -232,20 +211,6 @@
       url: "https://pub.dartlang.org"
     source: hosted
     version: "2.0.1"
-  googleapis:
-    dependency: transitive
-    description:
-      name: googleapis
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "0.56.1"
-  googleapis_auth:
-    dependency: transitive
-    description:
-      name: googleapis_auth
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "0.2.12+1"
   graphs:
     dependency: transitive
     description:
@@ -260,13 +225,6 @@
       url: "https://pub.dartlang.org"
     source: hosted
     version: "0.9.0"
-  grpc:
-    dependency: transitive
-    description:
-      name: grpc
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "2.8.0"
   http:
     dependency: "direct main"
     description:
@@ -274,13 +232,6 @@
       url: "https://pub.dartlang.org"
     source: hosted
     version: "0.12.2"
-  http2:
-    dependency: transitive
-    description:
-      name: http2
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "1.0.1"
   http_methods:
     dependency: transitive
     description:
@@ -302,13 +253,6 @@
       url: "https://pub.dartlang.org"
     source: hosted
     version: "3.1.4"
-  http_server:
-    dependency: transitive
-    description:
-      name: http_server
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "0.9.8+3"
   io:
     dependency: transitive
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 450b715..80d041b 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -8,7 +8,6 @@
 dependencies:
   analysis_server_lib: ^0.1.4
   analyzer: ^0.41.2
-  appengine: ^0.12.0
   args: ^2.0.0
   bazel_worker: ^0.1.23
   crypto: ^2.0.0
diff --git a/tool/grind.dart b/tool/grind.dart
index 8bca75a..0a28b09 100644
--- a/tool/grind.dart
+++ b/tool/grind.dart
@@ -57,20 +57,23 @@
   ]);
 }
 
-final _dockerVersionMatcher = RegExp(r'^FROM google/dart-runtime:(.*)$');
+const _dartImageName = 'google/dart';
+final _dockerVersionMatcher = RegExp('^FROM $_dartImageName:(.*)\$');
+const _dockerFileName = 'cloud_run.Dockerfile';
 
 @Task('Update the docker and SDK versions')
 void updateDockerVersion() {
   final platformVersion = Platform.version.split(' ').first;
-  final dockerImageLines = File('Dockerfile').readAsLinesSync().map((String s) {
+  final dockerFile = File(_dockerFileName);
+  final dockerImageLines = dockerFile.readAsLinesSync().map((String s) {
     if (s.contains(_dockerVersionMatcher)) {
-      return 'FROM google/dart-runtime:$platformVersion';
+      return 'FROM $_dartImageName:$platformVersion';
     }
     return s;
   }).toList();
   dockerImageLines.add('');
 
-  File('Dockerfile').writeAsStringSync(dockerImageLines.join('\n'));
+  dockerFile.writeAsStringSync(dockerImageLines.join('\n'));
 }
 
 final List<String> compilationArtifacts = [
@@ -303,7 +306,7 @@
 @Depends(sdkInit, updateDockerVersion, generateProtos, analyze, test, fuzz,
     validateStorageArtifacts)
 void deploy() {
-  log('Run: gcloud app deploy --project=dart-services --no-promote');
+  log('Deploy via Google Cloud Console');
 }
 
 @Task()
