 
   if metadata.url
     options.url ?= metadata.url
-    delete metadata.url
   if metadata.id
     options.id = metadata.id
     delete metadata.id
   options.url = options.url[0] if _.isArray options.url
+
+  for src of sources
+    try _get_formatted_crossref(sources[src]) if src is 'crossref'
+    try _get_formatted_europepmc(sources[src]) if src is 'europepmc'
 
   metadata.doi ?= options.doi.replace('doi:','').replace('doi.org/','').trim() if typeof options.doi is 'string'
   metadata.title ?= options.title.trim() if typeof options.title is 'string'

    # if we have a url or content but no doi or title yet, try scraping the url/content
    if (not _got() or (res.find and not res.url)) and not metadata.doi and not metadata.title and ((options.url and 'scrape' in res.sources) or content)
      res.checked.push 'scrape' if not content? # scrape the page if we have to - this is slow, so we hope not to do this much
      sc = API.service.oab.scrape options.url, content
      if sc?.url?
        options.url ?= sc.url
        delete sc.url
      _get(metadata, sc) if sc?
      _get_formatted_crossref() # try crossref / epmc / reverse if we found useful metadata now
      _get_formatted_europepmc() if 'epmc' not in res.checked # don't bother if we were already able to look, e.g. by pmcid or pmid
      _get_reversed_crossref()

  options.find = false
  return API.service.oab.find(options, metadata, content).metadata

API.service.oab.find = (options={}, metadata={}, content, sources={}) ->
  started = Date.now()
  res = {url: false, checked: []}

