diff --git a/lib/src/generator/generator_frontend.dart b/lib/src/generator/generator_frontend.dart
index 1fd974f..e99de66 100644
--- a/lib/src/generator/generator_frontend.dart
+++ b/lib/src/generator/generator_frontend.dart
@@ -146,6 +146,12 @@
             _generatorBackend.generateProperty(
                 writer, packageGraph, lib, extension, property);
           }
+
+          for (var staticField in filterNonDocumented(extension.staticFields)) {
+            indexAccumulator.add(staticField);
+            _generatorBackend.generateProperty(
+                writer, packageGraph, lib, extension, staticField);
+          }
         }
 
         for (var mixin in filterNonDocumented(lib.mixins)) {
diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart
index 9c6512c..ff84265 100644
--- a/lib/src/model/accessor.dart
+++ b/lib/src/model/accessor.dart
@@ -28,12 +28,8 @@
   GetterSetterCombo get definingCombo {
     if (_definingCombo == null) {
       var variable = (element as PropertyAccessorElement).variable;
-      var accessor = isGetter ? variable.getter : variable.setter;
-      var accessorLibrary = Library(accessor.library, packageGraph);
-      var definingAccessor =
-          ModelElement.from(accessor, accessorLibrary, packageGraph)
-              as Accessor;
-      _definingCombo = definingAccessor.enclosingCombo;
+      _definingCombo = ModelElement.fromElement(variable, packageGraph);
+      assert(_definingCombo != null, 'Unable to find defining combo');
     }
     return _definingCombo;
   }
diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart
index 58c57b4..3c1ad76 100644
--- a/lib/src/model/model_element.dart
+++ b/lib/src/model/model_element.dart
@@ -359,12 +359,14 @@
       }
     }
     if (e is PropertyAccessorElement) {
-      // TODO(jcollins-g): why test for ClassElement in enclosingElement?
+      // Accessors can be part of a [Container], or a part of a [Library].
       if (e.enclosingElement is ClassElement ||
+          e.enclosingElement is ExtensionElement ||
           e is MultiplyInheritedExecutableElement) {
         if (enclosingContainer == null) {
           return ContainerAccessor(e, library, packageGraph);
         } else {
+          assert(e.enclosingElement is! ExtensionElement);
           return ContainerAccessor.inherited(
               e, library, packageGraph, enclosingContainer,
               originalMember: originalMember);
diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart
index 9b3eda5..01ee005 100644
--- a/test/end2end/model_test.dart
+++ b/test/end2end/model_test.dart
@@ -1746,6 +1746,7 @@
   group('Extension', () {
     Extension arm, leg, ext, fancyList, uphill;
     Extension documentOnceReexportOne, documentOnceReexportTwo;
+    Extension staticFieldExtension;
     Library reexportOneLib, reexportTwoLib;
     Class apple,
         anotherExtended,
@@ -1784,6 +1785,8 @@
           .firstWhere((e) => e.name == 'SimpleStringExtension')
           .instanceMethods
           .firstWhere((m) => m.name == 'doStuff');
+      staticFieldExtension = exLibrary.extensions
+          .firstWhere((e) => e.name == 'StaticFieldExtension');
       extensions = exLibrary.publicExtensions.toList();
       baseTest = fakeLibrary.classes.firstWhere((e) => e.name == 'BaseTest');
       bigAnotherExtended =
@@ -1798,6 +1801,11 @@
           fakeLibrary.classes.firstWhere((e) => e.name == 'SuperMegaTron');
     });
 
+    test('static fields inside extensions do not crash', () {
+      expect(staticFieldExtension.staticFields.length, equals(1));
+      expect(staticFieldExtension.staticFields.first.name, equals('aStatic'));
+    });
+
     test('basic canonicalization for extensions', () {
       expect(documentOnceReexportOne.isCanonical, isFalse);
       expect(
@@ -1980,11 +1988,11 @@
     });
 
     test('correctly finds all the extensions', () {
-      expect(exLibrary.extensions, hasLength(8));
+      expect(exLibrary.extensions, hasLength(9));
     });
 
     test('correctly finds all the public extensions', () {
-      expect(extensions, hasLength(6));
+      expect(extensions, hasLength(7));
     });
   });
 
diff --git a/testing/test_package/lib/example.dart b/testing/test_package/lib/example.dart
index 1bcc2b4..43151cc 100644
--- a/testing/test_package/lib/example.dart
+++ b/testing/test_package/lib/example.dart
@@ -648,6 +648,10 @@
   void bar() {}
 }
 
+extension StaticFieldExtension on Object {
+  static int aStatic;
+}
+
 /// This class has nothing to do with [_Shhh], [FancyList], or [AnExtension.call],
 /// but should not crash because we referenced them.
 /// We should be able to find [DocumentThisExtensionOnce], too.
