public static async Task <Osm> Fetch(string scopeName, Func <Feature, bool> filter = null)
        {
            TagTree.Reload();

            Log = Log ?? Static.LogFactory.CreateLogger(typeof(References));
            Log.LogInformation("Fetching Reference material from Maine E911 API");

            // Fetch GIS
            var stateGis = await FileSerializer.ReadJsonCacheOrSource(
                scopeName + "/ReferenceRaw.GeoJson", () => GeoJsonAPISource.FetchMunicipality(scopeName));

            var gisFeatures = stateGis.Features.Where(f => filter == null || filter(f)).ToArray();

            if (IsFeatureSchemaOld(gisFeatures[0]))
            {
                gisFeatures = gisFeatures.Select(UpdateFeatureSchema).ToArray();
            }
            Log.LogInformation("Validating Reference material");
            Validate(gisFeatures);

            // Fetch the list of objectIDs with known errors to omit.
            var blacklist = Static.Municipalities[scopeName].BlackList.ToHashSet();

            Log.LogInformation("Translating Reference material");
            // Convert
            var nodes = gisFeatures
                        .Where(f => !blacklist.Contains((long)f.Properties[KEYS.OBJECTID]))
                        .Select(Convert)
                        .Where(n => n.Tags.ContainsKey("addr:housenumber"))
                        .ToArray();

            if (!nodes.Any())
            {
                return(null);
            }
            nodes = HandleStacks(nodes);
            HandleBlackTags(nodes, Static.Municipalities[scopeName].BlackTags);

            foreach (var node in nodes.Where(n => n.Tags.ContainsKey("addr:unit")))
            {
                var newUnit = RemoveTokens(ReplaceTokens(node.Tags["addr:unit"], UNITs), Tags.UnitOmmisionable);
                if (newUnit == "")
                {
                    node.Tags.RemoveKey("addr:unit");
                }
                else
                {
                    node.Tags["addr:unit"] = newUnit;
                }
            }

            var filtered = new Osm()
            {
                Nodes = nodes, Version = .6, Bounds = nodes.AsBounds()
            };

            return(filtered);
        }