     delete metadata.author if typeof metadata.author is 'string'
     delete metadata.author if _.isArray metadata.author and metadata.author.length > 0 and typeof metadata.author[0] is 'string'
 
-  metadata.url ?= []
+  metadata.url = catalogued.metadata.url if catalogued?.metadata?.url?
   metadata.url = [metadata.url] if typeof metadata.url is 'string'
-  if catalogued?.metadata?.url?
-    for cu in (if typeof catalogued.metadata.url is 'string' then [catalogued.metadata.url] else catalogued.metadata.url)
-      metadata.url.push(cu) if cu not in metadata.url
-  metadata.url.push(options.url) if options.url? and options.url not in metadata.url
-  metadata.url.push(res.url) if res.url? and res.url not in metadata.url
+  if options.url?
+    metadata.url ?= []
+    metadata.url.push(options.url) if options.url not in metadata.url
+  if res.url
+    metadata.url ?= []
+    metadata.url.push(res.url) if res.url not in metadata.url
   res.permissions ?= API.service.oab.permissions(metadata) if options.permissions and not _.isEmpty(metadata)
   res.test = true if JSON.stringify(metadata).toLowerCase().replace(/'/g,' ').replace(/"/g,' ').indexOf(' test ') isnt -1 #or (options.embedded? and options.embedded.indexOf('openaccessbutton.org') isnt -1)
   res.metadata = metadata

    # 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()


  if metadata.url
    options.url ?= 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'
