diff --git a/core/registrar/scheme.py b/core/registrar/scheme.py
index ba857f34d1b1edb684a27c593359780d0fd7d747..2e17a4879a7be83f8f699c24a8fb89d0ccd9e665 100644
--- a/core/registrar/scheme.py
+++ b/core/registrar/scheme.py
@@ -102,16 +102,51 @@ class Sentinel2RegistrationScheme(RegistrationScheme):
         )
 
 
+def parse_ring(string):
+    raw_coords = string.split()
+    return [(lon, lat) for lat, lon in pairwise(raw_coords)]
+
+
+def parse_polygons_gsc(elem):
+    def serialize_coord_list(coords):
+        return ','.join(
+            f'{x} {y}' for x, y in coords
+        )
+
+    interior = serialize_coord_list(
+        parse_ring(
+            elem.xpath(
+                "gml:exterior/gml:LinearRing/gml:posList", namespaces=elem.nsmap
+            )[0].text.strip()
+        )
+    )
+
+    exteriors = [
+        f'''({
+            serialize_coord_list(
+                parse_ring(poslist_elem.text.strip())
+            )
+        })'''
+        for poslist_elem in elem.xpath(
+            "gml:interior/gml:LinearRing/gml:posList", namespaces=elem.nsmap
+        )
+    ]
+
+    return f"POLYGON(({interior}){',' if exteriors else ''}{','.join(exteriors)})"
+
 
 class GSCRegistrationScheme(RegistrationScheme):
     GSC_SCHEMA = {
         'identifier': Parameter('//gml:metaDataProperty/gsc:EarthObservationMetaData/eop:identifier/text()'),
         'type': Parameter('//gml:using/eop:EarthObservationEquipment/eop:platform/eop:Platform/eop:shortName/text()'),
         'level': Parameter('//gml:metaDataProperty/gsc:EarthObservationMetaData/eop:parentIdentifier/text()'),
-        'mask': Parameter('//gsc:opt_metadata/gml:metaDataProperty/gsc:EarthObservationMetaData/eop:vendorSpecific/eop:SpecificInformation[eop:localAttribute/text() = "CF_POLY"]/eop:localValue/text()'),
-        'footprint': Parameter('//gsc:opt_metadata/gml:metaDataProperty/gsc:EarthObservationMetaData/eop:vendorSpecific/eop:SpecificInformation[eop:localAttribute/text() = "CF_POLY"]/eop:localValue/text()'),
+        'mask': Parameter('//gsc:opt_metadata/gml:metaDataProperty/gsc:EarthObservationMetaData/eop:vendorSpecific/eop:SpecificInformation[eop:localAttribute/text() = "CF_POLY"]/eop:localValue/text()', True),
+        'footprint': Parameter('(gsc:sar_metadata|gsc:opt_metadata)/gml:target/eop:Footprint/gml:multiExtentOf/gml:MultiSurface/gml:surfaceMembers/gml:Polygon', True, parse_polygons_gsc),
     }
 
+    def __init__(self, level_re: str=r'.*(Level_[0-9]+)$'):
+        self.level_re = level_re
+
     def get_context(self, source: Source, path: str) -> Context:
         gsc_filenames = source.list_files(path, ['GSC*.xml', 'GSC*.XML'])
         metadata_file = gsc_filenames[0]
@@ -123,7 +158,7 @@ class GSCRegistrationScheme(RegistrationScheme):
             metadata['type']: source.list_files(path, ['*.tif', '*.TIF'])
         }
 
-        match = re.match(r'.*(Level_[0-9]+)$', metadata['level'])
+        match = re.match(self.level_re, metadata['level'])
         if match:
             level = match.groups()[0]
         else:
@@ -136,7 +171,7 @@ class GSCRegistrationScheme(RegistrationScheme):
             product_level=level,
             raster_files=tiff_files,
             masks={
-                'validity': metadata['mask']
+                'validity': metadata['mask'][0] if metadata['mask'] else None
             },
             metadata_files=[metadata_file],
             metadata={