[med-svn] [r-cran-taxize] 01/06: New upstream version 0.9.0

Andreas Tille tille at debian.org
Mon Oct 2 12:34:48 UTC 2017


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository r-cran-taxize.

commit e376bf0ef5a3180b09bc8607d44f01184658dead
Author: Andreas Tille <tille at debian.org>
Date:   Mon Oct 2 14:15:39 2017 +0200

    New upstream version 0.9.0
---
 DESCRIPTION                               |  20 +-
 MD5                                       | 442 +++++++++++++++---------------
 NAMESPACE                                 |  43 ++-
 NEWS.md                                   | 318 ++++++++++++++-------
 R/children.R                              |   4 +-
 R/class2tree.R                            |  74 ++---
 R/classification.R                        | 166 ++++++++---
 R/col_children.R                          |  19 +-
 R/col_downstream.R                        |  66 +++--
 R/col_search.R                            |  18 +-
 R/comm2sci.R                              | 227 ++++++++-------
 R/downstream-utils.R                      |  14 +
 R/downstream.R                            | 123 ++++++---
 R/eol_search.R                            |  31 ++-
 R/eubon.R                                 |   6 +-
 R/eubon_capabilities.R                    |   2 +-
 R/eubon_children.R                        |   4 +-
 R/eubon_hierarchy.R                       |   4 +-
 R/gbif_downstream.R                       |  24 +-
 R/genbank2uid.R                           |  78 ++++--
 R/get-id-details.R                        |  70 +++++
 R/get_boldid.R                            |  84 +++---
 R/get_colid.R                             |  63 +++--
 R/get_eolid.R                             |  17 +-
 R/get_gbifid.R                            |  72 +++--
 R/get_iucn.R                              | 175 ++++++++++++
 R/get_natservid.R                         |  45 ++-
 R/get_nbnid.R                             | 126 ++++++---
 R/get_tolid.R                             |  48 ++--
 R/get_tpsid.R                             |  61 +++--
 R/get_tsn.R                               |  59 ++--
 R/get_uid.R                               | 171 +++++++-----
 R/get_utils.R                             |  50 ++++
 R/get_wiki.R                              | 303 ++++++++++++++++++++
 R/get_wormsid.R                           |  32 ++-
 R/gnr_resolve.R                           | 142 +++++++---
 R/itis_getrecord.R                        |   2 +-
 R/iucn_getname.R                          |   3 +-
 R/iucn_id.R                               |  31 +--
 R/iucn_summary.R                          | 182 +++++++++---
 R/nbn_classification.R                    |  16 +-
 R/nbn_search.R                            |  67 +++--
 R/nbn_synonyms.R                          |  12 +-
 R/ncbi_downstream.R                       |  89 ++++++
 R/ping.R                                  |  27 +-
 R/plantminer.R                            |   4 +-
 R/sci2comm.R                              | 153 +++++++----
 R/scrapenames.r                           |  79 +++---
 R/synonyms.R                              |  57 +++-
 R/tax_agg.R                               |   2 +-
 R/tax_name.R                              |  13 +-
 R/tax_rank.R                              | 154 ++++++-----
 R/taxize-package.R                        |  19 +-
 R/tnrs.R                                  |  32 ++-
 R/tpl_get.r                               |   1 +
 R/upstream.R                              |   2 +-
 R/zzz.R                                   |  58 ++--
 README.md                                 |  97 +++++--
 build/vignette.rds                        | Bin 282 -> 282 bytes
 data/rank_ref.RData                       | Bin 531 -> 470 bytes
 inst/doc/name_cleaning.Rmd                | 105 ++++---
 inst/doc/name_cleaning.html               | 105 ++++---
 inst/doc/taxize_infotable.Rmd             |  34 ++-
 inst/doc/taxize_infotable.html            |  72 ++++-
 inst/doc/taxize_vignette.Rmd              | 389 +++++++++++++++-----------
 inst/doc/taxize_vignette.html             | 392 ++++++++++++++------------
 inst/vign/name_cleaning.md                |  72 +++--
 inst/vign/taxize_infotable.Rmd            |  34 ++-
 inst/vign/taxize_infotable.md             |  34 ++-
 inst/vign/taxize_vignette.md              |  70 ++---
 man/apg.Rd                                |   3 +-
 man/apg_families.Rd                       |   3 +-
 man/apg_lookup.Rd                         |   1 -
 man/apg_orders.Rd                         |   3 +-
 man/bold_search.Rd                        |   1 -
 man/children.Rd                           |  11 +-
 man/class2tree.Rd                         |  58 ++--
 man/classification.Rd                     | 102 ++++---
 man/col_children.Rd                       |  10 +-
 man/col_classification-defunct.Rd         |   1 -
 man/col_downstream.Rd                     |   4 +-
 man/col_search.Rd                         |   1 -
 man/comm2sci.Rd                           |  48 ++--
 man/downstream.Rd                         |  84 +++---
 man/eol_dataobjects.Rd                    |   1 -
 man/eol_hierarchy-defunct.Rd              |   1 -
 man/eol_invasive-defunct.Rd               |   1 -
 man/eol_pages.Rd                          |   1 -
 man/eol_search.Rd                         |  13 +-
 man/eubon.Rd                              |   7 +-
 man/eubon_capabilities.Rd                 |   5 +-
 man/eubon_children.Rd                     |   5 +-
 man/eubon_hierarchy.Rd                    |   5 +-
 man/fungorum.Rd                           |   9 +-
 man/gbif_downstream.Rd                    |   9 +-
 man/gbif_name_usage.Rd                    |   1 -
 man/gbif_parse.Rd                         |   7 +-
 man/genbank2uid.Rd                        |  14 +-
 man/get_boldid.Rd                         |  60 ++--
 man/get_colid.Rd                          |  50 ++--
 man/get_eolid.Rd                          |  51 ++--
 man/get_gbifid.Rd                         |  52 ++--
 man/get_genes-defunct.Rd                  |   1 -
 man/get_genes_avail-defunct.Rd            |   1 -
 man/get_id_details.Rd                     |  78 ++++++
 man/get_ids.Rd                            |  10 +-
 man/get_iucn.Rd                           |  97 +++++++
 man/get_natservid.Rd                      |  50 ++--
 man/get_nbnid.Rd                          |  92 ++++---
 man/get_seqs-defunct.Rd                   |   1 -
 man/get_tolid.Rd                          |  43 ++-
 man/get_tpsid.Rd                          |  50 ++--
 man/get_tsn.Rd                            |  52 ++--
 man/get_ubioid-defunct.Rd                 |  10 +-
 man/get_uid.Rd                            | 135 +++++----
 man/get_wiki.Rd                           | 114 ++++++++
 man/get_wormsid.Rd                        |  45 ++-
 man/getkey.Rd                             |   1 -
 man/gisd_invasive-defunct.Rd              |   1 -
 man/gni_details.Rd                        |   7 +-
 man/gni_parse.Rd                          |   1 -
 man/gni_search.Rd                         |   7 +-
 man/gnr_datasources.Rd                    |   7 +-
 man/gnr_resolve.Rd                        |  81 ++++--
 man/ion.Rd                                |   1 -
 man/iplant_resolve.Rd                     |   1 -
 man/ipni_search.Rd                        |   1 -
 man/itis_acceptname.Rd                    |   1 -
 man/itis_downstream.Rd                    |   1 -
 man/itis_getrecord.Rd                     |   3 +-
 man/itis_hierarchy.Rd                     |   1 -
 man/itis_kingdomnames.Rd                  |   1 -
 man/itis_lsid.Rd                          |   1 -
 man/itis_name-deprecated.Rd               |   1 -
 man/itis_native.Rd                        |   1 -
 man/itis_refs.Rd                          |   1 -
 man/itis_taxrank.Rd                       |   1 -
 man/itis_terms.Rd                         |   1 -
 man/iucn_getname.Rd                       |   4 +-
 man/iucn_id.Rd                            |   9 +-
 man/iucn_status.Rd                        |   1 -
 man/iucn_summary.Rd                       |  36 ++-
 man/lowest_common.Rd                      |   7 +-
 man/names_list.Rd                         |   1 -
 man/nbn_classification.Rd                 |  23 +-
 man/nbn_search.Rd                         |  51 ++--
 man/nbn_synonyms.Rd                       |  13 +-
 man/ncbi_children.Rd                      |   7 +-
 man/ncbi_downstream.Rd                    |  57 ++++
 man/ncbi_get_taxon_summary.Rd             |   1 -
 man/ncbi_getbyid-defunct.Rd               |   1 -
 man/ncbi_getbyname-defunct.Rd             |   1 -
 man/ncbi_search-defunct.Rd                |   1 -
 man/phylomatic_format-defunct.Rd          |   1 -
 man/phylomatic_tree-defunct.Rd            |   1 -
 man/ping.Rd                               |  13 +-
 man/plantGenusNames.Rd                    |   1 -
 man/plantNames.Rd                         |   1 -
 man/plantminer.Rd                         |   5 +-
 man/rank_ref.Rd                           |  17 +-
 man/rankagg.Rd                            |   1 -
 man/resolve.Rd                            |   1 -
 man/sci2comm.Rd                           |  32 ++-
 man/scrapenames.Rd                        |  62 +++--
 man/status_codes.Rd                       |   1 -
 man/synonyms.Rd                           |  24 +-
 man/tax_agg.Rd                            |   5 +-
 man/tax_name.Rd                           |  10 +-
 man/tax_rank.Rd                           |  56 ++--
 man/taxize-defunct.Rd                     |   3 +-
 man/taxize-package.Rd                     |   4 +-
 man/taxize_capwords.Rd                    |   1 -
 man/taxize_cite.Rd                        |   1 -
 man/taxize_ldfast.Rd                      |   1 -
 man/theplantlist.Rd                       |   1 -
 man/tnrs.Rd                               |  26 +-
 man/tnrs_sources.Rd                       |   1 -
 man/tol_resolve.Rd                        |   9 +-
 man/tp_acceptednames-deprecated.Rd        |   1 -
 man/tp_accnames.Rd                        |   1 -
 man/tp_classification-defunct.Rd          |   1 -
 man/tp_dist.Rd                            |   1 -
 man/tp_namedistributions-deprecated.Rd    |   1 -
 man/tp_namereferences-deprecated.Rd       |   1 -
 man/tp_refs.Rd                            |   1 -
 man/tp_search.Rd                          |   1 -
 man/tp_summary.Rd                         |   1 -
 man/tp_synonyms.Rd                        |   1 -
 man/tpl_families.Rd                       |   7 +-
 man/tpl_get.Rd                            |   8 +-
 man/tpl_search-defunct.Rd                 |   1 -
 man/ubio_classification-defunct.Rd        |   1 -
 man/ubio_classification_search-defunct.Rd |   1 -
 man/ubio_id-defunct.Rd                    |   1 -
 man/ubio_ping-defunct.Rd                  |   1 -
 man/ubio_search-defunct.Rd                |   1 -
 man/ubio_synonyms-defunct.Rd              |   1 -
 man/upstream.Rd                           |   7 +-
 man/vascan_search.Rd                      |   7 +-
 tests/testthat/Rplots.pdf                 | Bin 4797 -> 4732 bytes
 tests/testthat/helper-taxize.R            |   1 +
 tests/testthat/test-bold_search.R         |  14 +-
 tests/testthat/test-class2tree.R          |   6 +-
 tests/testthat/test-classification.R      |   3 +-
 tests/testthat/test-comm2sci.R            |  15 +
 tests/testthat/test-downstream.R          |  14 +
 tests/testthat/test-genbank2uid.R         |  89 ++++++
 tests/testthat/test-get_boldid.R          |  32 +++
 tests/testthat/test-get_colid.R           |  33 +++
 tests/testthat/test-get_eolid.R           |  15 +
 tests/testthat/test-get_gbifid.R          |  33 +++
 tests/testthat/test-get_natservid.R       |   6 +
 tests/testthat/test-get_tpsid.R           |  23 ++
 tests/testthat/test-get_tsn.R             |  35 ++-
 tests/testthat/test-get_uid.R             |  33 ++-
 tests/testthat/test-get_wormsid.R         |  13 +-
 tests/testthat/test-itis_getrecord.R      |   3 +-
 tests/testthat/test-itis_lsid.R           |   4 +-
 tests/testthat/test-iucn_summary.R        |  18 +-
 tests/testthat/test-sci2comm.R            |   6 +-
 tests/testthat/test-synonyms.R            |   4 +-
 tests/testthat/test-tax_name.R            |  24 +-
 tests/testthat/test-tax_rank.R            |  45 ++-
 tests/testthat/test-tnrs.R                |  38 ++-
 tests/testthat/test-tp_summary.R          |   2 +-
 vignettes/name_cleaning.Rmd               | 105 ++++---
 vignettes/taxize_infotable.Rmd            |  34 ++-
 vignettes/taxize_vignette.Rmd             | 389 +++++++++++++++-----------
 228 files changed, 5759 insertions(+), 2945 deletions(-)

diff --git a/DESCRIPTION b/DESCRIPTION
index 065ecec..add438c 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,11 +1,11 @@
 Package: taxize
 Title: Taxonomic Information from Around the Web
 Description: Interacts with a suite of web 'APIs' for taxonomic tasks,
-    such as getting database specific taxonomic identifiers, verifying 
-    species names, getting taxonomic hierarchies, fetching downstream and 
-    upstream taxonomic names, getting taxonomic synonyms, converting 
+    such as getting database specific taxonomic identifiers, verifying
+    species names, getting taxonomic hierarchies, fetching downstream and
+    upstream taxonomic names, getting taxonomic synonyms, converting
     scientific to common names and vice versa, and more.
-Version: 0.8.4
+Version: 0.9.0
 License: MIT + file LICENSE
 URL: https://github.com/ropensci/taxize
 BugReports: https://github.com/ropensci/taxize/issues
@@ -26,13 +26,13 @@ VignetteBuilder: knitr
 Depends: R(>= 3.2.1)
 Imports: graphics, methods, stats, utils, httr (>= 1.2.1), xml2 (>=
         1.0.0), jsonlite, reshape2, stringr, plyr, foreach, ape, bold
-        (>= 0.3.5), data.table, rredlist (>= 0.1.0), rotl (>= 3.0.0),
+        (>= 0.3.5), data.table, rredlist (>= 0.3.0), rotl (>= 3.0.0),
         ritis (>= 0.5.0), tibble (>= 1.2), worrms (>= 0.1.0), natserv
-        (>= 0.1.4)
-Suggests: testthat, knitr, vegan, covr
-RoxygenNote: 5.0.1
+        (>= 0.1.4), wikitaxa (>= 0.1.4)
+Suggests: testthat, roxygen2 (>= 6.0.1), knitr, vegan
+RoxygenNote: 6.0.1
 NeedsCompilation: no
-Packaged: 2017-01-18 21:15:35 UTC; sacmac
+Packaged: 2017-09-25 17:04:26 UTC; sacmac
 Author: Scott Chamberlain [aut, cre],
   Eduard Szoecs [aut],
   Zachary Foster [aut],
@@ -44,4 +44,4 @@ Author: Scott Chamberlain [aut, cre],
   Jari Oksanen [ctb]
 Maintainer: Scott Chamberlain <myrmecocystus at gmail.com>
 Repository: CRAN
-Date/Publication: 2017-01-19 11:17:48
+Date/Publication: 2017-09-27 22:18:08 UTC
diff --git a/MD5 b/MD5
index c1fac37..0f2a276 100644
--- a/MD5
+++ b/MD5
@@ -1,48 +1,53 @@
-5d17858e53ebdf200ad18cd128683d74 *DESCRIPTION
+ad3c30c3f49d7a7251dffdaba7cbb753 *DESCRIPTION
 c5af52351472a750055a760a8924ce71 *LICENSE
-6a680bf0f79fed0f692bcb36890ab46a *NAMESPACE
-09056dd21f685e4a4584e233416fda92 *NEWS.md
+26d09532158806d45190fdf3d0c2a1b6 *NAMESPACE
+069d5c53baceeb26990598a455682ea2 *NEWS.md
 7f11465aa3af8b5ab06988e9f332deb3 *R/apg.R
 37930c9da8fe4fc8ee0a14a00d20bb09 *R/apg_lookup.R
 9a346ec0950068852aa014d3a17da18e *R/bold_search.R
-e7e71a4b7010ab618d09cc7bfd2dd621 *R/children.R
-ad8f34e096c17762ee11fe97034d9383 *R/class2tree.R
-d60e0bc15df366d1481e2d7578c95be2 *R/classification.R
-b34b57bd3b146fd8b7b2cb4b8d227536 *R/col_children.R
+bb674a003f41b52ef007b2044be9f244 *R/children.R
+dd22ad2309bf6c93d1e180e2d9b4bdbf *R/class2tree.R
+a8c9d9e9dc08283d1caaa81159f35da7 *R/classification.R
+7c05448a916dda9644b1b5f8d367beaf *R/col_children.R
 195579f9b76048573a11b9929fa07fa2 *R/col_classification.R
-765d6b3966af58ec508e097e29f06a7a *R/col_downstream.R
-d836ed8d8240ab6376116bbd87a839e9 *R/col_search.R
-673e3b33f3cb842df55120ca49fbb5a6 *R/comm2sci.R
-108c2f7537b798939608676f5d14aaca *R/downstream.R
+46444c086ac4f7589d48ca426137ce88 *R/col_downstream.R
+d9968ff7cfb1ec2ebf74251d1098e794 *R/col_search.R
+8b1527ac82f62bd793db27428eee4085 *R/comm2sci.R
+06344945fe46a86b16daf0302fcb55d4 *R/downstream-utils.R
+e6e7af1fb834955675606a5ac5df0c4f *R/downstream.R
 a7ab1473047a827f895980cd4f38b304 *R/eol_dataobjects.R
 199b9484fd1ef5c7880e887b0a7d2937 *R/eol_hierarchy.R
 48cb4fa9ad1f738002f7215ff4d7da63 *R/eol_invasive.R
 9d34eb3f01e10d24e2f200947304abb4 *R/eol_pages.R
-d9cfccf751ff983add8c046b04f3f17c *R/eol_search.R
+8fae80c51f54b1b492efac806c6eba2f *R/eol_search.R
 9662cc2c3e84d28c5f4b8df5f69246b2 *R/eol_utiils.R
-d3f673827c4aacce36188eaed1ed3df1 *R/eubon.R
-d0e0065ba435fe6aa791a4857e8cef44 *R/eubon_capabilities.R
-bc4e9de6969739c97b540cf1f2c2f46e *R/eubon_children.R
-938637f664d442c45b2cccc5b918646a *R/eubon_hierarchy.R
+9956057a6d15991d836d21ddc8358fc4 *R/eubon.R
+b221a6858ed101d5d71b0bbb571f21af *R/eubon_capabilities.R
+1a5d30eba64a2b48fd57b0a69efa88ef *R/eubon_children.R
+bbf5ed47e9f93b1a256f47e4b68928c0 *R/eubon_hierarchy.R
 1819f80f4f9e066a33873ef0d2e0fec2 *R/fungorum.R
-ade61ed07c6e5b01275f053f0d26b682 *R/gbif_downstream.R
+a3d472739a1a129b577f7d63810de21a *R/gbif_downstream.R
 e08636fb1e2f0adab835b633106a6946 *R/gbif_helpers.R
 ed9642d32d86ed158d91cca40844c2a0 *R/gbif_name_usage.R
 b1cd977e49c921fa6f09a6983c163adb *R/gbif_parse.R
-dbd5266e67ac482b2273735d38e4c3d1 *R/genbank2uid.R
-54c1be51f696968d50973f92c5152338 *R/get_boldid.R
-b7fd5f378352154ccdf9a73f9719db8b *R/get_colid.R
-f8869236137c302fac499b5753779951 *R/get_eolid.R
-a82215306f537655e9d347d2af6f430c *R/get_gbifid.R
+a067c65d2c525c9394c01bf3a0bb1447 *R/genbank2uid.R
+bbecb26c6a6e08928b7f237d3363406a *R/get-id-details.R
+4962e17fb05746bfa98177941df657f1 *R/get_boldid.R
+191459bf4ecc61cf00b4d770338c16d6 *R/get_colid.R
+720d1fdb1a1d7138124ebb741c7ea995 *R/get_eolid.R
+61c2969a6d8661ba97c44ae699fa795a *R/get_gbifid.R
 98785ffc3be249faff7120d1a086ddf9 *R/get_ids.R
-8c8c186e0bebfbe511e6027af7594343 *R/get_natservid.R
-16d2ec36702655c26aba519e45dfdfb8 *R/get_nbnid.R
-c7b374ff59b656f5dec8bbd81cdb7635 *R/get_tolid.R
-0452a5b48b0c997d0007e4a8fac10d65 *R/get_tpsid.R
-32c8d6b08531f7d9ed2f6286da64fb7b *R/get_tsn.R
+c03fb18f7ae57a6abea97f5e8d61db06 *R/get_iucn.R
+18465cba3db639dbf2e3a9428a37af37 *R/get_natservid.R
+ec8894ea798ef46899fd249a10d8f15c *R/get_nbnid.R
+1ba84838ed2bb659670accc156a146e8 *R/get_tolid.R
+0162dee69e99dccc48d2d58cb0eef9a5 *R/get_tpsid.R
+0d3bf3bc109d0713f2d0546123e44e29 *R/get_tsn.R
 28387d718ed39bc10dd799f50e0f3ce7 *R/get_ubioid.R
-9c84921af126d52470760df153425caa *R/get_uid.R
-536e8c38090383f1485063b1251a050e *R/get_wormsid.R
+3b18a2f37cc917c301148d0b8b13f0d7 *R/get_uid.R
+26cf8f184153ce26df443567b6ae9270 *R/get_utils.R
+fabbea6ec2ba8add6848e929c5dce93f *R/get_wiki.R
+6989137a349610d5df133c7a0a7a4cae *R/get_wormsid.R
 0e056aaca5d73c4c050ee6ab05210cb7 *R/getkey.R
 795b1bd8ab4b16828818cec853998df1 *R/gisd_isinvasive.R
 e063060ee5b7b87cf8ee9597d94f0783 *R/globals.R
@@ -51,13 +56,13 @@ c7f213cf1c1395925b07590424b51b59 *R/gni_helpers.R
 bf9037d21b09b7299225cc15e8687082 *R/gni_parse.R
 327a0e636e9e0f129fb0379661ef1af1 *R/gni_search.R
 29ee33781020b56b7b3985fc3a4a5718 *R/gnr_datasources.R
-2ab275fbf58a75fc02db2c590fca1273 *R/gnr_resolve.R
+7c2ae186bac1d1f4c1bb25d089c15790 *R/gnr_resolve.R
 fcdbb9038d13d1fa2b705f71fb107750 *R/ion.R
 e72d825cb36b6edcbad41183a6481d95 *R/iplant_resolve.R
 9644fa8fea4acbdb2c9e6b9a3e49f8f3 *R/ipni_search.R
 aaf8562b26ac2d52a5b443fcbd6d0495 *R/itis_acceptname.R
 296458ede35020589b42e41056ba501a *R/itis_downstream.R
-11ec6f2d7d744cb7f1b38c33ee2d4ad8 *R/itis_getrecord.R
+dd8db047f0b6d2d6b6f6f9d73b80262d *R/itis_getrecord.R
 d1a6522cb5ae8a7933c4dad747bf9d35 *R/itis_hierarchy.R
 5d49e4d1e99d2d51b389f774d61a58ea *R/itis_kingdomnames.R
 b8732758c977ef5328a71a7e92ef4ab3 *R/itis_lsid.R
@@ -66,38 +71,39 @@ fed20d5d6a355927c28bcf62e4b984ca *R/itis_name.R
 f33a0c7d889e993fc243760769563ff3 *R/itis_refs.R
 032151f91ebcfa3628f5c6e4cff55422 *R/itis_taxrank.R
 ec16f9665ddd9cb52585bd9bb280fc1d *R/itis_terms.R
-fa10fba5da3ca9dca99eb40083af29ed *R/iucn_getname.R
-d5b8acf62183da77d2e7c8f0285ef385 *R/iucn_id.R
-e2c2dd5db2811594d5849808932dd1d8 *R/iucn_summary.R
+10fd6c65b162c35fbac382ad8a86c35a *R/iucn_getname.R
+2dabd9e43adf0aed9c0893c5e5abf50b *R/iucn_id.R
+66fdc2c50763dd7ef53c0156bff8aecd *R/iucn_summary.R
 312066cc0ed53da2ebd49d29a0488f3f *R/lowest_common.R
 e11e745720445731361002b5dffc4fb4 *R/names_list.r
-42e49bfcba70f31cfdf2faaa9022d6d3 *R/nbn_classification.R
-3e6ae46697f9995e8703f996fd419173 *R/nbn_search.R
-a61ce643cc9b77d959f6b1091c63fc38 *R/nbn_synonyms.R
+0f6f0516e5428a4659bdc0adabf1726b *R/nbn_classification.R
+1e072b8f81e6bbec3c84e645ebc15678 *R/nbn_search.R
+3c604599cf9d5a652c866241c189ab96 *R/nbn_synonyms.R
 597cd6621332dff4cfb334019d653e4c *R/ncbi_children.R
+0df47ac6318659e420c57e57d5189393 *R/ncbi_downstream.R
 a61cd559bfb0bb70d5a8d38db934f5dc *R/ncbi_get_taxon_summary.R
 8b4cc2f1fe4edd8fae50030cf5ee4d01 *R/ncbi_getbyid.R
 70e0e2778d2eebab5e1f5401f8efaaaa *R/ncbi_getbyname.R
 b4dc72c26cff34289d42adb56e1d5b40 *R/ncbi_search.R
 2eea2799b5f058fe31f78f6d52353619 *R/phylomatic_format.R
 8712e9f26257b392aa9a1016da370e70 *R/phylomatic_tree.R
-7c82c78fd707464ba83a27542f63c2df *R/ping.R
-27cee830e357b9945817c10801f1ffa4 *R/plantminer.R
+8c78f8c67eeb6d50599002044df01a7e *R/ping.R
+c8988da5f827bcf2e31b841e6ed3705e *R/plantminer.R
 0abba2f6fd3aed5b6f37f553391233f8 *R/rankagg.R
 57c9d73251a14dab67912a49e6b3eb4e *R/rename.R
 0849a8578d30dcaaddfda9d44f674cd9 *R/resolve.R
-73953abf376c1b33a791d9622e260a11 *R/sci2comm.R
-279c972101f5b28ac2e732cd9e4f8be3 *R/scrapenames.r
+44f1bc06bf8e3f4aed5dd570ea21b357 *R/sci2comm.R
+614e0d532122aa652db8c3caee1f1fd7 *R/scrapenames.r
 d65519a4074cf96ed573547f9f9d294c *R/status_codes.R
-f39dc30f1a88ea358aa03f711cb134b4 *R/synonyms.R
-8fefd568b32f88eb48c9b157b62bc495 *R/tax_agg.R
-7dfaa7cdcd9a155b932f1a9dbf42dc03 *R/tax_name.R
-d97c9fa8cb23939d4df5c06026fda15e *R/tax_rank.R
-0a593b753043f863d17f2466075042fe *R/taxize-package.R
+7d8a9410921c615fd951f9080e53498a *R/synonyms.R
+9a606566e77f0755339bf76a7e09e288 *R/tax_agg.R
+5534e32467109e2095ed818aa2d0b430 *R/tax_name.R
+c7e3e2eb788b6e0f92150b2dfb40a84c *R/tax_rank.R
+5528d8bbfb39a9ddc8a588b13aba95cf *R/taxize-package.R
 91b944860248e52f0dadb75483a4a4f7 *R/taxize_capwords.r
 0e5c1db2e14e0ab89b3d611642f63205 *R/taxize_cite.R
 b0aee22aadbb01b3b359ef8aa2c3fd41 *R/taxize_ldfast.R
-d44d309ef91518833a1bc5b76103594d *R/tnrs.R
+d038400213bc1147ef52c870143e73af *R/tnrs.R
 5cdf8289915d127df5e3e59b4b054ad7 *R/tnrs_sources.r
 29173140ebc0b9fb2d22b4a4968acf4d *R/tol_resolve.R
 1cfd59f7ca0fb53a669f3fa8a9a2c5a7 *R/tp_accnames.R
@@ -108,31 +114,31 @@ b8887daaf18e0cf74034ac38b635d647 *R/tp_refs.R
 68275e8551fc4f0f25f88c5063faec71 *R/tp_summary.R
 3f7c48ae232c337795d6fde57331cba9 *R/tp_synonyms.R
 08cf07e9f7805f932b791667a95c0d05 *R/tpl_families.r
-deac06d29ea901fe3a534f655ce4a9f9 *R/tpl_get.r
+84e1c1fae04a14974ab2a43ef0ec3fa3 *R/tpl_get.r
 acb4faf140e0dfaef9405d42c1c4b999 *R/tpl_search.r
 1a670f04069b229616673cb2876f96bd *R/ubio_classification.R
 13a74db8991d29e356892277ffcd0ed8 *R/ubio_classification_search.R
 f4b5227c3af3bf11ded4364a2ebddb3e *R/ubio_id.R
 8715051dbe12b813ac113e520f1ce926 *R/ubio_search.R
 7260c416f401d0ad7aa1fc68e461d5d6 *R/ubio_synonyms.R
-2ae367faa95d839c35e6965a9a334245 *R/upstream.R
+ba9df64a13acee972ddbeb0489a521bf *R/upstream.R
 3933fc90cfe2a975efa10fac32019bf3 *R/vascan_search.r
-24b45edc66f1fc8e3357cc5a88839422 *R/zzz.R
-144e16e90e8cfe727332b8042da292e4 *README.md
-b32471e81e10605f540d6f67d669ffbf *build/vignette.rds
+1ca1e227652164a60067c785605eb9c6 *R/zzz.R
+4ae55c1f0e4afdc04f073c67b05a954a *README.md
+d5bc173668d72370c20743058084b84e *build/vignette.rds
 be73efb3e7b6a0ab72e5f7067343b598 *data/apg_families.RData
 e4071c6f9f4984f2245762c876072775 *data/apg_orders.RData
 e661723ce7d3b531f38b95efd64c4038 *data/plantGenusNames.RData
 3d9e8a3106a169ab1425561aa603faeb *data/plantNames.RData
-ed88f1c73b3cf066f4b47ef6885fc986 *data/rank_ref.RData
+1c2ca89a273c41a6284ee95bd9fdda23 *data/rank_ref.RData
 f7fd5fcec20070d0ec823b9c6ce2505b *data/theplantlist.RData
 0c688c04a812081338c07f62cf8426d6 *inst/CITATION
-37e053e3f238d73d8bef493e28e12bed *inst/doc/name_cleaning.Rmd
-950c918815e112b4786aaf8ff3974083 *inst/doc/name_cleaning.html
-1fb43c844cff7433b5a1d519c46882e9 *inst/doc/taxize_infotable.Rmd
-8724e5c6f681e6728fcd2107dbd83a50 *inst/doc/taxize_infotable.html
-b21f11939bfda6d29bd69aed63b0f329 *inst/doc/taxize_vignette.Rmd
-f118274772563dc91c69ac106b076596 *inst/doc/taxize_vignette.html
+342627c848411b37647f6436f70649dc *inst/doc/name_cleaning.Rmd
+02fe4781b5ad236cf50cb8241f802f4a *inst/doc/name_cleaning.html
+6325be667e313f94e839aad1d3fe7ee0 *inst/doc/taxize_infotable.Rmd
+a9b49c76655cd4a27fb93ee59c367299 *inst/doc/taxize_infotable.html
+649cc6bb3103d11ec7a05a4fa0d15d6c *inst/doc/taxize_vignette.Rmd
+658233850231a67fd5624ef18c59b9cd *inst/doc/taxize_vignette.html
 a293c4bc7e3041347b0266283706588f *inst/examples/species.txt
 c0858c66ef19889fd5e406618a7032d4 *inst/ignore/aou_notes.R
 ab696e4e4632b5eefc96e906c109c4b5 *inst/ignore/nature_serve.R
@@ -156,148 +162,153 @@ eed8eac7b64ea5c7922915b90ab4d605 *inst/vign/cache/tnrs_c39c1e0c556437f6b37ba3c36
 2acd1a8cc301003745e3698ddc28e071 *inst/vign/cache/tnrs_c39c1e0c556437f6b37ba3c369e8be54.rdb
 f6ad0828c34eb7ea05f9fd61919e2a73 *inst/vign/cache/tnrs_c39c1e0c556437f6b37ba3c369e8be54.rdx
 a156ba276922541829613a200126f3ae *inst/vign/name_cleaning.Rmd
-0255735eb7a4d355b7371fe7c89bb570 *inst/vign/name_cleaning.md
-1fb43c844cff7433b5a1d519c46882e9 *inst/vign/taxize_infotable.Rmd
-1fb43c844cff7433b5a1d519c46882e9 *inst/vign/taxize_infotable.md
+342627c848411b37647f6436f70649dc *inst/vign/name_cleaning.md
+6325be667e313f94e839aad1d3fe7ee0 *inst/vign/taxize_infotable.Rmd
+6325be667e313f94e839aad1d3fe7ee0 *inst/vign/taxize_infotable.md
 c18e3b634c773ad1c7f81209f8e39833 *inst/vign/taxize_vignette.Rmd
-8d6f120d5a91b76b720bdd67fa5fb08d *inst/vign/taxize_vignette.md
-4b6c3e4fe99f65a4772b951c8eddcd29 *man/apg.Rd
-1ec6ff87606c6f917db07a53571b2135 *man/apg_families.Rd
-b70c6aef276e2aea3faa4403c395e3d7 *man/apg_lookup.Rd
-08e0cf8f4eaaeca5d66434c904c9809c *man/apg_orders.Rd
-b4b9a90fa8bb0ac793e14e2c10656020 *man/bold_search.Rd
-c78923bbc80a9d94321827b3d7a653dd *man/children.Rd
-91f81dc398583d569bee004322de169f *man/class2tree.Rd
-0c1790eed0b82f050cd77bee41a9ba85 *man/classification.Rd
-98e6da39f5493c51e72ee98da7995428 *man/col_children.Rd
-11c0dacaf0ff19cf24e3a4b8af7277a1 *man/col_classification-defunct.Rd
-5ae15d4876db03cfd19d7d848895acf3 *man/col_downstream.Rd
-b4631061c017f66b78494a06f7111006 *man/col_search.Rd
-8ee45d0bab9eb400d9ab37ddcf9c0065 *man/comm2sci.Rd
-4ecfe364ac4a47f02d4e54b3b6948cfc *man/downstream.Rd
-17356cbfa99b237f58f6efc566ebd548 *man/eol_dataobjects.Rd
-f7b1f1156693a2cb2e8bc77debd5c1a1 *man/eol_hierarchy-defunct.Rd
-73d77a4c58a74abfb4aa3718eff38f14 *man/eol_invasive-defunct.Rd
-4520a988b630d7d1eec9cf388721ed11 *man/eol_pages.Rd
-d2b3094a58ca267470bfe968d3a68078 *man/eol_search.Rd
-40c86e7b46aeb2a00a096374866292b3 *man/eubon.Rd
-f703d4ca603caa0dfb14efc4b17a8ab8 *man/eubon_capabilities.Rd
-a500c10f5dd486f890de840ee7387e0e *man/eubon_children.Rd
-68fca638da9fdb985a47631e436b3807 *man/eubon_hierarchy.Rd
-1183ebcacbc3f42296b9af677cd17fa8 *man/fungorum.Rd
-3513652959b5722cc3b3b0645bff0e9e *man/gbif_downstream.Rd
-5f84207083901c46b7fe91b95a1a1d9a *man/gbif_name_usage.Rd
-18e7a2ef14c536c64638a61123c536d7 *man/gbif_parse.Rd
-d83ec147e2884401a2c598a1d8143c79 *man/genbank2uid.Rd
-ddb5afa2faa06ec790efdedff8cc485f *man/get_boldid.Rd
-d882dd32b8e572a7ec62a6c4f630b476 *man/get_colid.Rd
-d751151ff700b83a4522a65fcc0b97c2 *man/get_eolid.Rd
-127c41959c6079d71afd3d620d3ff7f3 *man/get_gbifid.Rd
-2fa7f774fe5cb418807822d36f249c75 *man/get_genes-defunct.Rd
-1cc39e66ec705b7c4d53d4c571b0061d *man/get_genes_avail-defunct.Rd
-fe69868e92dc6ec8040fa6f9ec4f94c8 *man/get_ids.Rd
-ec6fccab9d35b97b4d5e50a5922e1d42 *man/get_natservid.Rd
-d2c125d0b9804fb9daf4b88f911f56a2 *man/get_nbnid.Rd
-9fd44ac56ee8d06f95316feda6bf9172 *man/get_seqs-defunct.Rd
-60e22037437c7cbc21422b844763917e *man/get_tolid.Rd
-3b249fefeb20e51639b1216b6765b254 *man/get_tpsid.Rd
-27878dca5312cfab5fcf175cd293dd2c *man/get_tsn.Rd
-16b03e4288755177170d47b9455b82bc *man/get_ubioid-defunct.Rd
-d9f46f537ef3f2f5a3f7facaf42017cb *man/get_uid.Rd
-5e03936ae369a87a927dfd96c2bbdc1f *man/get_wormsid.Rd
-dc4d344eeba0684c77a193d6d65b13b6 *man/getkey.Rd
-60769512ef8fcd322b301420e28482ac *man/gisd_invasive-defunct.Rd
-20e0dbf7d90aa174eb8f0d95fb04d7c9 *man/gni_details.Rd
-529b1195eab9b8634e2fcb9e05f381e3 *man/gni_parse.Rd
-3d75314f96624c2368cc2ee5e09f04c3 *man/gni_search.Rd
-5a5538ce9093cada273a44589ed0d981 *man/gnr_datasources.Rd
-654c8415c3867c12d62d4fc463817954 *man/gnr_resolve.Rd
-776e9f4df9bf6030fcd8d69780db0acc *man/ion.Rd
-d6833698fbf482c37143a5c9825cfc91 *man/iplant_resolve.Rd
-b107e9f2b35e216da723b19b0bbf0b25 *man/ipni_search.Rd
-167dfe440b5315207e6df84432e2af40 *man/itis_acceptname.Rd
-75fec492194bced3d04204dc228ee433 *man/itis_downstream.Rd
-3ffb6c1622c7e7e8bf70d2410bd25e17 *man/itis_getrecord.Rd
-4c5b62044af79c749e262ba4bd8708db *man/itis_hierarchy.Rd
-b766158d06038e129cda0642fc9b50ae *man/itis_kingdomnames.Rd
-07a6bf483c24a55630d12390d5ff2d86 *man/itis_lsid.Rd
-0d5fcfdc9664f9f14de418aeaa28d4a2 *man/itis_name-deprecated.Rd
-4f8958e6290368c757568dcae245127f *man/itis_native.Rd
-20078f149827b1b565597ec1508228ad *man/itis_refs.Rd
-5a0c8441837275e4ab947d690edc1ab7 *man/itis_taxrank.Rd
-fee93d0770c1a42bb195dc58dbe6cf13 *man/itis_terms.Rd
-b2e9ca976ae7d3e6d65d1c68ac8a9314 *man/iucn_getname.Rd
-3d03dd9857805ed61c5b90fb9adc1654 *man/iucn_id.Rd
-06b708117a4dc208086a5472ef806832 *man/iucn_status.Rd
-25e43e390b76038da2eab631a0890465 *man/iucn_summary.Rd
-e6929bbbb7f3ef0a7bae4d28a088d91a *man/lowest_common.Rd
-91b665dff903594c1bf11a2244328d21 *man/names_list.Rd
-1ba27df53046c671a139caf18d68a7e5 *man/nbn_classification.Rd
-acd98b6404b99e965940652cd02e0796 *man/nbn_search.Rd
-05c8f94f08d20aa6aac08bfa15b70c5c *man/nbn_synonyms.Rd
-162efe577bdbdf2a5597dde50962ddd6 *man/ncbi_children.Rd
-3dd036040a5c10fbd7c5c1c5c13e48d8 *man/ncbi_get_taxon_summary.Rd
-c4b5a27d1002e8e33337d2768ad20d19 *man/ncbi_getbyid-defunct.Rd
-05c102a3c80f3fcdbf0a385a39f33678 *man/ncbi_getbyname-defunct.Rd
-1ad0190a4728feb350b11492ec37f6cc *man/ncbi_search-defunct.Rd
-97ad23d44d4f28f0f9dc86ce1ea2bb1b *man/phylomatic_format-defunct.Rd
-70c6748689bc7b840b4f04694efe78a5 *man/phylomatic_tree-defunct.Rd
-11fa7220e2f937be2ab2d1ad7cd7168c *man/ping.Rd
-36b47ca95e284ca670b4a5c5b7227ac1 *man/plantGenusNames.Rd
-a59c7709511a0579955927b966327e47 *man/plantNames.Rd
-63e4b75b9090d42154bcd8832fb99d47 *man/plantminer.Rd
-ad61f3c124886adcb57ee1e428221569 *man/rank_ref.Rd
-15b26beb18cb39dd6d2e892ba1d6e0ec *man/rankagg.Rd
-245522805964bf6dbce4a71c0e57a921 *man/resolve.Rd
-8c69b461f9e1981e569814e3e7074482 *man/sci2comm.Rd
-f4ab308b590bc98d7c9fb41ddda1c5cc *man/scrapenames.Rd
-cf0b09c634eba54e471defe6a6a73ce2 *man/status_codes.Rd
-55b9857c4a221170ee25997908b5bd75 *man/synonyms.Rd
-718e1f8328d5f9525ea7fe51bbdd8cbe *man/tax_agg.Rd
-b0c52608f7aef40e3c47428eef273a13 *man/tax_name.Rd
-9b5c780a29ca0ddda93eedecd8a53055 *man/tax_rank.Rd
-367350c29476141bb13a14ad954cd5a7 *man/taxize-defunct.Rd
-3926ab5a54353ee5cb656ad32107070c *man/taxize-package.Rd
-f83226b0effadbe9784202c6a09c0049 *man/taxize_capwords.Rd
-276ebe891d78b2840c95b4e3d34d6cbc *man/taxize_cite.Rd
-b364669312156c300666866e24c283a4 *man/taxize_ldfast.Rd
-63ac816a643971f616c7c26c395567bc *man/theplantlist.Rd
-3b031844d0378140dc99869a29104f34 *man/tnrs.Rd
-49f517c0e7a5d1e090285682ea52076d *man/tnrs_sources.Rd
-bc8e0e124b717f0d35bbdbe9991d5197 *man/tol_resolve.Rd
-5a29d7916a15088d9c62ae0212526aac *man/tp_acceptednames-deprecated.Rd
-c72bbf14a5cf8dd5baa4f56e5c4010a6 *man/tp_accnames.Rd
-24f1ae87788e15382b79c863f005c6c8 *man/tp_classification-defunct.Rd
-d4606b15ebda663dfc25bb5bfdb40aac *man/tp_dist.Rd
-1dac6309fb606459ecb81bb04c9e64e5 *man/tp_namedistributions-deprecated.Rd
-b5e0cdc82970b4cf5ad9db6b8b4866e6 *man/tp_namereferences-deprecated.Rd
-1ec4b4b1613a3ce6678959b2afddb5fe *man/tp_refs.Rd
-bf6270e252138d1011dd5a8a2fb79aea *man/tp_search.Rd
-3c8f265e4959301f4f25f7cd10ebdf7b *man/tp_summary.Rd
-b88006cab152abc7b0d48a9ce8571f0f *man/tp_synonyms.Rd
-bd72598587861eaeab83e758fc0f54e4 *man/tpl_families.Rd
-09916b42366dff42ffa8bdfbd28ecb2d *man/tpl_get.Rd
-e3018a7c5980813a958916242314ad4e *man/tpl_search-defunct.Rd
-480525ce2f888bfbc6a2bb7127a8bf11 *man/ubio_classification-defunct.Rd
-a0bba809c89bc0f79854088a445281a5 *man/ubio_classification_search-defunct.Rd
-e2b6072915a416134db30f13e8e0f3f9 *man/ubio_id-defunct.Rd
-c9f4a09b4340d1c48b070842ad20c59b *man/ubio_ping-defunct.Rd
-372f8433704574e8a98705f3dff1b45d *man/ubio_search-defunct.Rd
-ac78e75ba0af93909eb7f04912658eed *man/ubio_synonyms-defunct.Rd
-6a9805bfdb7f5c1efc0a6c3644f5323a *man/upstream.Rd
-942b71e089d564593e3aae268cbee565 *man/vascan_search.Rd
+649cc6bb3103d11ec7a05a4fa0d15d6c *inst/vign/taxize_vignette.md
+0cf018beea9931380c7df26b53a3b5d3 *man/apg.Rd
+31a02f7a8d1551892f20800c71d38b82 *man/apg_families.Rd
+a4ca44570c75180fae8cedf16b76555e *man/apg_lookup.Rd
+2c098020b181ef24caa88f457d9b5c32 *man/apg_orders.Rd
+d3a8a6b7886a29eefaced90953c76513 *man/bold_search.Rd
+c6c33ba6ceb9eeed1cc458eeebe27698 *man/children.Rd
+99bdfa0be1472aaae3b7d38e83c8adf9 *man/class2tree.Rd
+5040e33a71929c9aa407a535ab8c187d *man/classification.Rd
+ed07d020993269a0a62d25d69dd583b7 *man/col_children.Rd
+556906ce976874874741f1a8489451fc *man/col_classification-defunct.Rd
+6cc33f82c2a892312fc9749e1df87c7a *man/col_downstream.Rd
+25ee6f774368c330e478a5e4846b0c90 *man/col_search.Rd
+21f7d74a7cd62a6246eb0ddec3bc5263 *man/comm2sci.Rd
+310a5f92ccb5cb5d0c7028849af60373 *man/downstream.Rd
+53ce14379cbbc4ef1f0cad6779dcd213 *man/eol_dataobjects.Rd
+1d9589af774510203a0531d05217363a *man/eol_hierarchy-defunct.Rd
+2ac21d9027245f8c0f87390795b8d302 *man/eol_invasive-defunct.Rd
+8b8e1a61e297098d38216c5ed6e37dad *man/eol_pages.Rd
+a086b1bea48eb7b58b3bfd25b1e704a2 *man/eol_search.Rd
+0e0894523140595b38219781185d47ec *man/eubon.Rd
+5a34077b1191368233d009928b6bbae2 *man/eubon_capabilities.Rd
+51c6f743e415c080a02066c54acc1ebb *man/eubon_children.Rd
+dcbd6ba1325a3b2f3f04546583c4ec4b *man/eubon_hierarchy.Rd
+e060c4fd9cf9c5dac35199352b7077fa *man/fungorum.Rd
+c458fc05084f5bc9dafc620fe098a500 *man/gbif_downstream.Rd
+13fa8b7a38410ff6a47041a694513128 *man/gbif_name_usage.Rd
+5fad68e93ea9b224f55d416b5c1aa382 *man/gbif_parse.Rd
+0a2825e4af20a83596c07f631f760b60 *man/genbank2uid.Rd
+b2226c3eaaf5b9b9d91d5cfa0e9f11ef *man/get_boldid.Rd
+5280ab859023f101bf1c0bded798bea8 *man/get_colid.Rd
+05d1ef8cd666c93d724da3c1c56b3207 *man/get_eolid.Rd
+a910d04cbf2b4a6b0d19d82a3bd96d58 *man/get_gbifid.Rd
+bfc719a1bd689893858eb3d8a8c9ea58 *man/get_genes-defunct.Rd
+e9345d9a45556263ea70d3891355e2fe *man/get_genes_avail-defunct.Rd
+4093c375ed2fcc4517f90a4a7fc4ce17 *man/get_id_details.Rd
+941380a163f36ade66d4d40d682e59e4 *man/get_ids.Rd
+897de5bcd1b6ed19c9284b565f35d47d *man/get_iucn.Rd
+cc79b354b934723ae237f49b38972391 *man/get_natservid.Rd
+786d3364b064979f04907921ef5f9fc9 *man/get_nbnid.Rd
+26883aeef271e7bea205d03966e2c334 *man/get_seqs-defunct.Rd
+27cd86a344f11489128ca2333f27604a *man/get_tolid.Rd
+3c7433a882bedc3826c5586f45da53ab *man/get_tpsid.Rd
+7fdc2e75b8d9340cbad0a8dd33cbe102 *man/get_tsn.Rd
+893dd5a71ead0a52ad52cfa0d5547e20 *man/get_ubioid-defunct.Rd
+5963b71e5d59feb35158deefde751185 *man/get_uid.Rd
+3b2421b55e12f566a59110ef9c8b95f5 *man/get_wiki.Rd
+b9fb69564a1953038cce844254cd497f *man/get_wormsid.Rd
+ffe368a0030062f80113c2c6955c70f7 *man/getkey.Rd
+b6b53725a259bcca461c29c2651d0e4e *man/gisd_invasive-defunct.Rd
+e4ee478dae080fee5f86daf235ca3383 *man/gni_details.Rd
+ff322f059fbcf7da2f8be11a9615dd37 *man/gni_parse.Rd
+da802c4eb9e77c3f80dee0f154c46cf3 *man/gni_search.Rd
+ef795158bedb79647e70f45153aff140 *man/gnr_datasources.Rd
+08d0b6d8e7ebd2dd524b134b071e9c58 *man/gnr_resolve.Rd
+78ef21a2325b403912e790e50c4c5d32 *man/ion.Rd
+87b4e3419520e04d42bdebb0b1eb454b *man/iplant_resolve.Rd
+58aa0e5f259f2e7b0da7ec05d9739975 *man/ipni_search.Rd
+69aa93c4b54a7a9a33c795a159404931 *man/itis_acceptname.Rd
+01e9c144fac92077018aab67786c56a6 *man/itis_downstream.Rd
+b2f850893b76606f9684f21b3fb59bc8 *man/itis_getrecord.Rd
+d4c72fc2a9bad81d1360156bf46a2042 *man/itis_hierarchy.Rd
+ce8ff5ad47311deeaec8be25b8b65fcd *man/itis_kingdomnames.Rd
+08b964dc0adefca1d22a19639de00bdd *man/itis_lsid.Rd
+015946da8bbc186db1da4a50fc2496e8 *man/itis_name-deprecated.Rd
+05b53572d8288b41516196b3e5cf4474 *man/itis_native.Rd
+36f374a5ad7aea956322a92b9cf99e1e *man/itis_refs.Rd
+1b120b46bae153940f965097d6d972d4 *man/itis_taxrank.Rd
+0f7ee243aefdc35689dff4ae861aef94 *man/itis_terms.Rd
+bb703f7fd7a10017e0acc4a27c749565 *man/iucn_getname.Rd
+9e194cb8711a92aec18e3c7f07fa6de1 *man/iucn_id.Rd
+fbd2f01e4d3bd517cebda687dcf62d93 *man/iucn_status.Rd
+226938cdedfdf30a164b9119a8c90ee2 *man/iucn_summary.Rd
+8daa26e237201c9153c7b3cacd1bc01c *man/lowest_common.Rd
+491629cca1c508eded1d06434b1f479f *man/names_list.Rd
+89d1eaf41f89b4f3a947ea58c3d654ca *man/nbn_classification.Rd
+26c7740560e96af8d92a4d2a0cf67428 *man/nbn_search.Rd
+64367b550e4a36597f7b2376338b4261 *man/nbn_synonyms.Rd
+6f21601488226954b87312a347d0c6ff *man/ncbi_children.Rd
+b9877206b3d119341c3c0a006dc2d512 *man/ncbi_downstream.Rd
+fdf2f834f2556f1596c230934166b803 *man/ncbi_get_taxon_summary.Rd
+66b6fda20458c2e71ec46a5abd0474cd *man/ncbi_getbyid-defunct.Rd
+9a30084e2e029edec667034fd6ba910b *man/ncbi_getbyname-defunct.Rd
+c48a56403da77c7be09bdd3d8dc22d30 *man/ncbi_search-defunct.Rd
+70d489a616cb9368c05483c8698290f4 *man/phylomatic_format-defunct.Rd
+85cabba4967b0b36f5893bdb0cf95339 *man/phylomatic_tree-defunct.Rd
+2939eed8fae0373971eaaac59c45fd6c *man/ping.Rd
+63ceaf7439d1c5a01a3002b59736c98e *man/plantGenusNames.Rd
+3caf74659e1c7372175c7903a08fec8b *man/plantNames.Rd
+d07f2339501b5f0435f0495dbbe59ff2 *man/plantminer.Rd
+a76d162b4393d7925be55b45f424849e *man/rank_ref.Rd
+e79e5072fc9c8a7c1eafe59bb2ef49f3 *man/rankagg.Rd
+65943dd1d168c1f2ef872b0755fbdd59 *man/resolve.Rd
+66d12e2d4237b2ca1331316ce63f8ae9 *man/sci2comm.Rd
+1d1b0cc6a4172980036ddc7996474912 *man/scrapenames.Rd
+91a4148dddc1ae8987170058072ee15b *man/status_codes.Rd
+e0da469225863e46b301520189d3ea5d *man/synonyms.Rd
+bb1ebbe77ed358ccc364332b52899d2f *man/tax_agg.Rd
+3c12348e203c3e1643dafc73cb880bed *man/tax_name.Rd
+bd34244436422404ca7c0d4feb4be377 *man/tax_rank.Rd
+6be0cf190c6ae3c5b29d88b6798170a7 *man/taxize-defunct.Rd
+d30ee77c9885b7953ab3d47c238c78a1 *man/taxize-package.Rd
+0e65a74dcd609e7daf56c0c4843f3ad5 *man/taxize_capwords.Rd
+60aa8153900c1086f5c9529cb024402a *man/taxize_cite.Rd
+79a37363a34414e921dffce7091267bd *man/taxize_ldfast.Rd
+df89d65c018acb1c9776a9c5375ec5bb *man/theplantlist.Rd
+cbd73e45f1ceb6aafc8b1e54239c8869 *man/tnrs.Rd
+e1748d0a0c5df6e032b974b1edd1985d *man/tnrs_sources.Rd
+0bcba8705e3c0a64555b2a3e422ef57f *man/tol_resolve.Rd
+a87efb3d1b25f35d5127912eaeb50a7a *man/tp_acceptednames-deprecated.Rd
+81850afaa64f638f8c917057e7c813dd *man/tp_accnames.Rd
+ba702e652fc4ad949e19526893dbfd95 *man/tp_classification-defunct.Rd
+00547b33099a28d9b9bbb5a5cc9a5eb4 *man/tp_dist.Rd
+1f3c1d2e2405fe6a7086f5f8689dea13 *man/tp_namedistributions-deprecated.Rd
+ecfbbfd48014b5fb1445e1ffbae5861d *man/tp_namereferences-deprecated.Rd
+22924ce2b4e3a3a97eeabcb9fff401f7 *man/tp_refs.Rd
+e7b7adcbaed818d75edf0f2748e8a06f *man/tp_search.Rd
+ce570a789247f77d38d72654994f906b *man/tp_summary.Rd
+df55f821c37952fb9624d5f714c4be6a *man/tp_synonyms.Rd
+9584ae54c199421d865d09d3aa1c3347 *man/tpl_families.Rd
+b74d1cba4059b4c323cb26155402869e *man/tpl_get.Rd
+8c0ca844c7b29395664a44a7c48d0c1a *man/tpl_search-defunct.Rd
+7f81130cf82446f8b460b7a9a2f0bafb *man/ubio_classification-defunct.Rd
+bf76d448cde71ad04ca7a20c24a6eddb *man/ubio_classification_search-defunct.Rd
+ba6de5b38936399618cef06376c4306d *man/ubio_id-defunct.Rd
+cf98559aeff03c9a28de7bd05baaf8df *man/ubio_ping-defunct.Rd
+a07b1aa0bf1fe21cee69fe3cd22da4e8 *man/ubio_search-defunct.Rd
+7793a86d59987daa27cbc6642d52f7f3 *man/ubio_synonyms-defunct.Rd
+aff9081e5a5fee2fb31640b8a8c6d7d2 *man/upstream.Rd
+6344287eac81dc6c4c8828af4d2fe96a *man/vascan_search.Rd
 265c6f13798f3db6770e9265dd5c0665 *tests/test-all.R
-d9b257bd0571325b6c12673a7d9b9c27 *tests/testthat/Rplots.pdf
+213f589671405c76198f0f7182c47adf *tests/testthat/Rplots.pdf
+05bde94e06b40bfd1880e4269bd7e2a9 *tests/testthat/helper-taxize.R
 ba5ea9dd2262e033d2eb57666bbf74da *tests/testthat/test-apgscraping.R
-a9f63c501a0d4c591a71ec8a6ed7f6de *tests/testthat/test-bold_search.R
+39f43147b6d26c90572bb3ea06e609ca *tests/testthat/test-bold_search.R
 0da63a8d3e636578855eb9abbdda9241 *tests/testthat/test-children.R
-9c6be0fe8220c6d98d9e262a9debd9bf *tests/testthat/test-class2tree.R
-7bbf65aa37e6aa24aad6777e60c48017 *tests/testthat/test-classification.R
+42ab3a201aef66bdee4e00de1c529dd9 *tests/testthat/test-class2tree.R
+cb4ec44b982b4d88cf9a6192c07474a2 *tests/testthat/test-classification.R
 801883cedcdf4b25b116f4425d88134c *tests/testthat/test-col_children.R
 fbfbacaee7d17d369606e65829189800 *tests/testthat/test-col_downstream.R
 4c23a71c3e3b4eda4c2fd42a2ea21847 *tests/testthat/test-col_search.R
-124de1f5bc386aea73f8e4356ba68ecc *tests/testthat/test-comm2sci.R
-7413a6d55bf524bc7ec3eff86d42411e *tests/testthat/test-downstream.R
+61464b1d48ab5cbeafa3a44c58aa75bc *tests/testthat/test-comm2sci.R
+3889da36337778315eb79d4f6dce9201 *tests/testthat/test-downstream.R
 1499a1f93b84b8dcedf38745db4a25c5 *tests/testthat/test-eol_dataobjects.R
 bdaea607a3e3efa6b49d52a28ab80392 *tests/testthat/test-eol_pages.R
 46d8097e6bfd71f70fa3cdf0ba9c7739 *tests/testthat/test-eol_ping.R
@@ -306,16 +317,17 @@ c5cd01c27db39d72047a07fd98158fbb *tests/testthat/test-eol_search.R
 ee97af136efa0f4a106fc594ec251490 *tests/testthat/test-fungorum.R
 0e51f8862edc5c7af0ea439f8a448021 *tests/testthat/test-gbif_downstream.R
 5ff94fe37bf52908cc07d0f1a91e53dd *tests/testthat/test-gbif_parse.R
-6a60e132502448fa3bcbdfec07017bc7 *tests/testthat/test-get_boldid.R
-ef18bc74a89b12f0151b986b49939192 *tests/testthat/test-get_colid.R
-9a8c804bac2e4b8929f6ec5a955b7ace *tests/testthat/test-get_eolid.R
-6b63e402ba0ddaf011eee739cfd724cc *tests/testthat/test-get_gbifid.R
+a46a34158af92d906ee180fa85ef4760 *tests/testthat/test-genbank2uid.R
+2e3b2b41042524fc2dd6d073ddaff29f *tests/testthat/test-get_boldid.R
+f87b1b4be8cb247a11b22af3f6b01b1b *tests/testthat/test-get_colid.R
+5a96f2d0f6c9ddce5d992e4a2007d7fd *tests/testthat/test-get_eolid.R
+d02c0a74463767807756cc836fa8a177 *tests/testthat/test-get_gbifid.R
 ccf1afd37b6c8899a4754db04eb0c923 *tests/testthat/test-get_ids.R
-f38e4d24bc4ddb88eb60c73f31361a66 *tests/testthat/test-get_natservid.R
-b81de73a8aa7888caca18b45573f5f32 *tests/testthat/test-get_tpsid.R
-19cd7676740ecf2e02965f172154916c *tests/testthat/test-get_tsn.R
-eed9b30d6e916328171ddba01bed0fce *tests/testthat/test-get_uid.R
-f97564d305a7b53e09d05c1a96f24214 *tests/testthat/test-get_wormsid.R
+cc81c4a0a53c8a6506dad169cfcd6538 *tests/testthat/test-get_natservid.R
+4c7a360e68fccc5af31abc8b852d7975 *tests/testthat/test-get_tpsid.R
+e256ba62244213fb6c98ef03071e4c67 *tests/testthat/test-get_tsn.R
+49f57a572a3c74425b3041b3b04d4ca4 *tests/testthat/test-get_uid.R
+efff66bce942b18a6765a8aeb3cee42d *tests/testthat/test-get_wormsid.R
 9bb5cc090f44b6eba1c9927224baac5c *tests/testthat/test-gni_details.R
 6216212133a18781250ca0d92c617ffc *tests/testthat/test-gni_parse.R
 bf936b30c142a00a86ab27c68eff4800 *tests/testthat/test-gni_search.R
@@ -325,10 +337,10 @@ d823a4ffbb5f82ae89365b6c50773152 *tests/testthat/test-gnr_datasources.R
 3bacfc9a4ef8788bd9d21c8311d2d167 *tests/testthat/test-ipni_search.R
 105733019de838bb4fb9b21107c10b0c *tests/testthat/test-itis_acceptname.R
 23e8deec9f69c1bc5aad57d4014f0291 *tests/testthat/test-itis_downstream.R
-11b12295e46602dffc483b5837658684 *tests/testthat/test-itis_getrecord.R
+404d206d8d676507b53ff5d5aff97ecf *tests/testthat/test-itis_getrecord.R
 f72dbbf4aaf1e28e72b5885be81fe73e *tests/testthat/test-itis_hierarchy.R
 832a5605f43d4b62bbb589339f0baeb3 *tests/testthat/test-itis_kingdomnames.R
-a788098db0a1309382683c6afc06f78e *tests/testthat/test-itis_lsid.R
+127c455c67c6767370839e4ff5a9ab4e *tests/testthat/test-itis_lsid.R
 31023e96dd78674f81adc6515608bc87 *tests/testthat/test-itis_native.R
 7b6b04c42b170dd63729beab5840656a *tests/testthat/test-itis_ping.R
 3003bc9c30285161edf69e73f8b0db49 *tests/testthat/test-itis_refs.R
@@ -336,7 +348,7 @@ da61912a2712791bf45dbcf516c948f0 *tests/testthat/test-itis_taxrank.R
 b054f470967e2963cfa79e85e10850f7 *tests/testthat/test-itis_terms.R
 0e47a85a197b26de8f0d87d983c36fc1 *tests/testthat/test-iucn_getname.R
 e4d4bdd0aba054dfd6d1def537d0a9ca *tests/testthat/test-iucn_id.R
-77da15f2d5174aefdd0a3cd6871cb9df *tests/testthat/test-iucn_summary.R
+3a69dcd3821b1f1fddfaedc100984133 *tests/testthat/test-iucn_summary.R
 32b33c1ff6004b6f4e8abf9a49098cad *tests/testthat/test-lowest_common.R
 3f3002b2a19eedf3bca00e657755ac5e *tests/testthat/test-names_list.R
 504b29f839e833355c6720eafae26fcf *tests/testthat/test-ncbi_children.R
@@ -344,21 +356,21 @@ e34aac1ea1dc0ace531e9207ce546b6a *tests/testthat/test-ncbi_get_taxon_summary.R
 ececc0ec2d43992d3ed22f348ae11c92 *tests/testthat/test-ping.R
 95875c4e58c6df99ac6c2c3b8e2f4832 *tests/testthat/test-plantminer.R
 3cce84d61f520e1de43e2458cce384b7 *tests/testthat/test-rankagg.R
-22435d55b931b5836d4bf651d419c58c *tests/testthat/test-sci2comm.R
-c688b322d9d6696bd320e789be2f7afb *tests/testthat/test-synonyms.R
+d6bff37137a2919f8a637a15d2808382 *tests/testthat/test-sci2comm.R
+fbe73dbf015e49afea4d7cbefd623116 *tests/testthat/test-synonyms.R
 541af6911dcc9a0ad6ffc5a01859ee7e *tests/testthat/test-tax_agg.R
-b84366d48909b5aeaf0056e8960210a6 *tests/testthat/test-tax_name.R
-f5bf242bbec9a9552c542d9e5d6d62a0 *tests/testthat/test-tax_rank.R
-333376caf52e9ed25f41391c0d914a96 *tests/testthat/test-tnrs.R
+3b5eb349d67508058d113b4b48c448b1 *tests/testthat/test-tax_name.R
+d36b648c35c072088cebbcf59c12cbe4 *tests/testthat/test-tax_rank.R
+66509497bd986b4136e3afda0019d0d6 *tests/testthat/test-tnrs.R
 9147254a3d55246759a7eb7f4fbcb35c *tests/testthat/test-tnrs_sources.R
 aa881434675d8ba4f4d3b2bd963ff42b *tests/testthat/test-tol_resolve.R
 ceb4c3939fab7a4eeeb8127c005c17a5 *tests/testthat/test-tp_accnames.R
 80047db34d31d1e16d0837ffb4b2694f *tests/testthat/test-tp_dist.R
 b01148a27883a1933a4ff5dc06238279 *tests/testthat/test-tp_refs.R
 62883bace4fed63128ca093ce0cc8547 *tests/testthat/test-tp_search.R
-92ff9e49ed973624e08452dc22e329ca *tests/testthat/test-tp_summary.R
+f74257ba1182b14f533ee5097f3b0f2b *tests/testthat/test-tp_summary.R
 9739b1654944ba59a799687639328546 *tests/testthat/test-tp_synonyms.R
 4d2d5045ad928da3ad9af40c3dc69451 *tests/testthat/test-vascan_search.r
-37e053e3f238d73d8bef493e28e12bed *vignettes/name_cleaning.Rmd
-1fb43c844cff7433b5a1d519c46882e9 *vignettes/taxize_infotable.Rmd
-b21f11939bfda6d29bd69aed63b0f329 *vignettes/taxize_vignette.Rmd
+342627c848411b37647f6436f70649dc *vignettes/name_cleaning.Rmd
+6325be667e313f94e839aad1d3fe7ee0 *vignettes/taxize_infotable.Rmd
+649cc6bb3103d11ec7a05a4fa0d15d6c *vignettes/taxize_vignette.Rmd
diff --git a/NAMESPACE b/NAMESPACE
index 81d8c25..ee89c4f 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -13,6 +13,7 @@ S3method(as.data.frame,boldid)
 S3method(as.data.frame,colid)
 S3method(as.data.frame,eolid)
 S3method(as.data.frame,gbifid)
+S3method(as.data.frame,iucn)
 S3method(as.data.frame,natservid)
 S3method(as.data.frame,nbnid)
 S3method(as.data.frame,tolid)
@@ -20,6 +21,7 @@ S3method(as.data.frame,tpsid)
 S3method(as.data.frame,tsn)
 S3method(as.data.frame,ubioid)
 S3method(as.data.frame,uid)
+S3method(as.data.frame,wiki)
 S3method(as.data.frame,wormsid)
 S3method(as.eolid,character)
 S3method(as.eolid,data.frame)
@@ -31,6 +33,11 @@ S3method(as.gbifid,data.frame)
 S3method(as.gbifid,gbifid)
 S3method(as.gbifid,list)
 S3method(as.gbifid,numeric)
+S3method(as.iucn,character)
+S3method(as.iucn,data.frame)
+S3method(as.iucn,iucn)
+S3method(as.iucn,list)
+S3method(as.iucn,numeric)
 S3method(as.natservid,character)
 S3method(as.natservid,data.frame)
 S3method(as.natservid,list)
@@ -65,17 +72,25 @@ S3method(as.uid,data.frame)
 S3method(as.uid,list)
 S3method(as.uid,numeric)
 S3method(as.uid,uid)
+S3method(as.wiki,character)
+S3method(as.wiki,data.frame)
+S3method(as.wiki,list)
+S3method(as.wiki,numeric)
+S3method(as.wiki,wiki)
 S3method(as.wormsid,character)
 S3method(as.wormsid,data.frame)
 S3method(as.wormsid,list)
 S3method(as.wormsid,numeric)
 S3method(as.wormsid,wormsid)
+S3method(cbind,classification)
+S3method(cbind,classification_ids)
 S3method(children,colid)
 S3method(children,default)
 S3method(children,ids)
 S3method(children,tsn)
 S3method(children,uid)
 S3method(children,wormsid)
+S3method(classification,boldid)
 S3method(classification,colid)
 S3method(classification,default)
 S3method(classification,eolid)
@@ -87,13 +102,22 @@ S3method(classification,tolid)
 S3method(classification,tpsid)
 S3method(classification,tsn)
 S3method(classification,uid)
+S3method(classification,wiki)
 S3method(classification,wormsid)
+S3method(comm2sci,default)
+S3method(comm2sci,tsn)
+S3method(comm2sci,uid)
 S3method(downstream,colid)
 S3method(downstream,default)
 S3method(downstream,gbifid)
 S3method(downstream,ids)
 S3method(downstream,tsn)
-S3method(iucn_status,iucn)
+S3method(downstream,uid)
+S3method(iucn_status,default)
+S3method(iucn_status,iucn_summary)
+S3method(iucn_summary,character)
+S3method(iucn_summary,default)
+S3method(iucn_summary,iucn)
 S3method(lowest_common,colid)
 S3method(lowest_common,default)
 S3method(lowest_common,gbifid)
@@ -103,19 +127,26 @@ S3method(lowest_common,uid)
 S3method(plot,classtree)
 S3method(print,classtree)
 S3method(print,tax_agg)
+S3method(rbind,classification)
+S3method(rbind,classification_ids)
 S3method(sci2comm,default)
+S3method(sci2comm,iucn)
 S3method(sci2comm,tsn)
 S3method(sci2comm,uid)
 S3method(sci2comm,wormsid)
 S3method(synonyms,colid)
 S3method(synonyms,default)
 S3method(synonyms,ids)
+S3method(synonyms,iucn)
 S3method(synonyms,nbnid)
 S3method(synonyms,tpsid)
 S3method(synonyms,tsn)
 S3method(synonyms,wormsid)
 S3method(synonyms_df,default)
 S3method(synonyms_df,synonyms)
+S3method(tax_rank,character)
+S3method(tax_rank,default)
+S3method(tax_rank,numeric)
 S3method(upstream,colid)
 S3method(upstream,default)
 S3method(upstream,ids)
@@ -127,6 +158,7 @@ export(as.boldid)
 export(as.colid)
 export(as.eolid)
 export(as.gbifid)
+export(as.iucn)
 export(as.natservid)
 export(as.nbnid)
 export(as.tolid)
@@ -134,11 +166,10 @@ export(as.tpsid)
 export(as.tsn)
 export(as.ubioid)
 export(as.uid)
+export(as.wiki)
 export(as.wormsid)
 export(bold_ping)
 export(bold_search)
-export(cbind.classification)
-export(cbind.classification_ids)
 export(children)
 export(class2tree)
 export(classification)
@@ -185,6 +216,7 @@ export(get_genes)
 export(get_genes_avail)
 export(get_ids)
 export(get_ids_)
+export(get_iucn)
 export(get_natservid)
 export(get_natservid_)
 export(get_nbnid)
@@ -200,6 +232,8 @@ export(get_ubioid)
 export(get_ubioid_)
 export(get_uid)
 export(get_uid_)
+export(get_wiki)
+export(get_wiki_)
 export(get_wormsid)
 export(get_wormsid_)
 export(getkey)
@@ -237,6 +271,7 @@ export(nbn_ping)
 export(nbn_search)
 export(nbn_synonyms)
 export(ncbi_children)
+export(ncbi_downstream)
 export(ncbi_get_taxon_summary)
 export(ncbi_getbyid)
 export(ncbi_getbyname)
@@ -246,8 +281,6 @@ export(phylomatic_format)
 export(phylomatic_tree)
 export(plantminer)
 export(rankagg)
-export(rbind.classification)
-export(rbind.classification_ids)
 export(resolve)
 export(sci2comm)
 export(scrapenames)
diff --git a/NEWS.md b/NEWS.md
index dfb97dc..7007e71 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,75 +1,207 @@
+taxize 0.9.0
+============
+
+### Changes to `get_*()` functions
+
+* Added separate documentation file for all get* functions 
+describing attributes and various exception behaviors
+* Some `get*()` functions had `NaN` as default `rows` parameter
+value. Those all changed to `NA`
+* Better failure behavior now when non-acceptable `rows` 
+parameter value given
+* Added in all type checks for parameters across `get_*()` functions
+* Changed behavior across all `get_*()` functions to behave the 
+same when `ask = FALSE, rows = 1` and `ask = TRUE, rows = 1` as these
+should result in the same outcome. (#627) thanks @zachary-foster !
+* Fixed direct match behavior so that when there's multiple results 
+from the data provider, but no direct match, that the functions don't 
+give back just `NA` with no inication that there were multiple matches.
+* Please let me know if any of these changes cause problems for your
+code or package.
+
+### NEW FEATURES
+
+* Change `comm2sci()` to S3 setup with methods for `character`, `uid`, 
+and `tsn` (#621)
+* `iucn_status()` now has S3 setup with a single method that only handles
+output from the `iucn_summary()` function.
+
+### MINOR IMPROVEMENTS
+
+* Add required `key` parameter to fxn `iucn_id()` (#633)
+* imrove docs for `sci2comm()`: to indicate how to get non-simplified
+output (which includes what language the common name is from) vs. 
+getting simplified output (#623) thanks @glaroc !
+* Fix to `sci2comm()` to not be case sensitive when looking for matches 
+(#625) thanks @glaroc !
+* Two additional columns now returned with `eol_search()`: `link` and `content`
+* Improve docs in `eol_search()` to describe returned `data.frame`
+* Fix `bold_bing()` to use new base URL for their API
+* Improved description of the dataset `rank_ref`, see `?rank_ref`
+
+### BUG FIXES
+
+* Fix to `downstream()` via fix to `rank_ref` dataset to include
+"infraspecies" and make "unspecified" and "no rank" requivalent.
+Fix to `col_downstream()` to remove properly ranks lower than 
+allowed. (#620) thanks @cdeterman !
+* `iucn_summary`: changed to using `rredlist` package internally.
+`sciname` param changed to `x`. `iucn_summary_id()` now is 
+deprecated in favor of `iucn_summary()`. `iucn_summary()` now has a
+S3 setup, with methods for `character` and `iucn` (#622)
+* Added "cohort" to `rank_ref` dataset as that rank sometimes used 
+at NCBI (from bug reported in `ncbi_downstream()`) (#626)
+* Fix to `sci2comm()`, add `tryCatch()` to internals to catch 
+failed requests for specific pageid's (#624) thanks @glaroc !
+* Fix URL for taxa for NBN taxonomic ids retrieved via 
+`get_nbnid()` (#632)
+
+
+taxize 0.8.9
+============
+
+### BUG FIXES
+
+* Remove `ape::neworder_phylo` object, which is not used anymore in `taxize`  
+(#618) (#619) thanks @ashiklom
+
+
+taxize 0.8.8
+============
+
+### NEW FEATURES
+
+* New function `ncbi_downstream()` and now NCBI is an option in 
+the function `downstream()` (#583) thanks for the push @andzandz11
+* New data source: Wiki*, which includes Wikipedia, Wikispecies, and 
+Wikidata - you can choose which you'd like to search. Uses new package
+`wikitaxa`, with contributions from @ezwelty (#317)
+* `scrapenames()` gains a parameter `return_content`, a boolean, to 
+optionally return the OCR content as a text string with the results. (#614)
+thanks @fgabriel1891
+* New function `get_iucn()` - to get IUCN Red List ids for taxa. In addition,
+new S3 methods `synonyms.iucn` and `sci2comm.iucn` - no other methods could 
+be made to work with IUCN Red List ids as they do no share their taxonomic
+classification data (#578) thanks @diogoprov 
+
+### MINOR IMPROVEMENTS
+
+* `bold` now an option in `classification()` function (#588)
+* fix to NBN to use new base URL (#582) ($597)
+* `genbank2uid()` can give back more than 1 taxon matched to a given
+Genbank accession number. Now the function can return more than one 
+match for each query, e.g., try `genbank2uid(id = "AM420293")` (#602)
+ thanks @sariya
+* had to modify `cbind()` usage to incclude `...` for method 
+consistency (#612)
+* `tax_rank()` used to be able to do only ncbi and itis. Can now do a 
+lot more data sources: ncbi, itis, eol, col, tropicos, gbif, nbn,
+worms, natserv, bold  (#587)
+* Added to `classification()` docs in a section `Lots of results` a 
+note about how to deal with results when there are A LOT of them. (#596)
+thanks @ahhurlbert for raising the issue
+* `tnrs()` now returns the resulting data.frame in the oder of the 
+names passed in by the user (#613) thanks @wpetry
+* Changes to `gnr_resolve()` to now strip out taxonomic names submitted 
+by user that are NA, or zero length strings, or are not of class 
+character (#606)
+* Added description of the columns of the data.frame output in 
+`gnr_resolve()` (#610) thanks @kamapu 
+* Added noted in `tnrs()` docs that the service doesn't provide any
+information about homonyms. (#610) thanks @kamapu 
+* Added `parvorder` to the `taxize` `rank_ref` dataset - used by NCBI - 
+if tax returned with that rank, some functions in `taxize` were failing 
+due to that rank missing in our reference dataset `rank_ref` (#615)
+
+### BUG FIXES
+
+* Fix to `get_colid()` via problem in parsing within `col_search()` (#585)
+* Fix to `gbif_downstream` (and thus fix in `downstream()`): there 
+was two rows with form in our `rank_ref` reference dataset of rank names, 
+causing > 1 result in some cases, then causing `vapply` to fail as it's 
+expecting length 1 result (#599) thanks @andzandz11
+* Fix `genbank2uid()`: was failing when getting more than 1 result back, 
+works now (#603) and fails better now, giving back warnings/error messages
+that are more informative (see also #602) thanks @sariya
+* Fix to `synonyms.tsn()`: in some cases a TSN has > 1 accepted name. We 
+get accepted names first from the TSN, then look for synonyms, and hadn't 
+accounted for > 1 accepted name. Fixed now (#607) thanks @tdjames
+* Fixed bug in `sci2comm()` - was not dealing internally with passing 
+the `simplify` parameter (#616)
+
+
 taxize 0.8.4
 ============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * Added WoRMS integration via the new `worrms` package on CRAN.
-Adds functions `as.wormsid()`, `get_wormsid()`, `get_wormsid_()`, 
-`children.wormsid()`, `classification.wormsid()`, `sci2comm.wormsid()`, 
+Adds functions `as.wormsid()`, `get_wormsid()`, `get_wormsid_()`,
+`children.wormsid()`, `classification.wormsid()`, `sci2comm.wormsid()`,
 `comm2sci.wormsid()`, and `synonyms.wormsid()` (#574) (#579)
 * New functions for NatureServe data, including `as.natservid`,
-`get_natservid`, `get_natservid_`, and `classification.natservid` 
+`get_natservid`, `get_natservid_`, and `classification.natservid`
 (#126)
 
-## BUG FIXES
+### BUG FIXES
 
-* EOL API keys were not passed on to internal functions. fixed now. 
+* EOL API keys were not passed on to internal functions. fixed now.
 thanks @dschlaep ! (#576)
-* Fix in `rankagg()` with respect to `vegan` package to work with 
+* Fix in `rankagg()` with respect to `vegan` package to work with
 older and new version of `vegan` - thank @jarioksa (#580) (#581)
 
 taxize 0.8.0
 ============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * New data source added: Open Tree of Life. New functions for the data source
 added: `get_tolid()`, `get_tolid_()`, and `as.tolid()` (#517)
 * related to above `classification()` gains new method for TOL data
 * related to above `lowest_common()` gains new method for TOL data
-* Now using `ritis` package, an external dependency for ITIS taxonomy 
+* Now using `ritis` package, an external dependency for ITIS taxonomy
 data. Note that a large number of ITIS functions were removed, and are
 now available via the package `ritis`. However, there are still many
 high level functions for working with ITIS data (see functions prefixed
 with `itis_`), and `get_tsn()`, `classification.tsn()`, and similar
 high level functions remain unchanged. (#525)
 * EUBON has a new API (v1.2). We now interact with that new API version.
-In addition, `eubon()` fxn is now `eubon_search()`, although either still 
-work - though `eubon()` will be made defunct in the next version of 
+In addition, `eubon()` fxn is now `eubon_search()`, although either still
+work - though `eubon()` will be made defunct in the next version of
 this package. Additional new functions were added: `eubon_capabilities()`,
 `eubon_children()`, and `eubon_hierarchy()` (#567)
-* `lowest_common()` function gains two new data source options: COL (Catalogue 
+* `lowest_common()` function gains two new data source options: COL (Catalogue
 of Life) and TOL (Tree of Life) (#505)
-* Addded new function `synonyms_df()` as a slim wrapper around 
+* Addded new function `synonyms_df()` as a slim wrapper around
 `data.table::rbindlist()` to make it easy to combine many outputs
-from `synonyms()` for a single data source - there is a lot of heterogeneity 
+from `synonyms()` for a single data source - there is a lot of heterogeneity
 among data sources in how they report synonyms data, so we don't attempt
 to combine data across sources (#533)
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * Change NCBI URLs to `https` from `http` (#571)
 
-## BUG FIXES
+### BUG FIXES
 
-* Fixed bug in `tax_name()` in which when an invalid taxon was searched 
-for then `classification()` returned no data and caused an error. 
+* Fixed bug in `tax_name()` in which when an invalid taxon was searched
+for then `classification()` returned no data and caused an error.
 Fixed now. (#560) thanks @ljvillanueva for reporting it!
-* Fixed bug in `gnr_resolve()` in which order of input names to the function 
+* Fixed bug in `gnr_resolve()` in which order of input names to the function
 was not retained. fixed now. (#561) thanks @bomeara for reporting it!
-* Fixed bug in `gbif_parse()` - data format changed coming back from 
-GBIF - needed to replace `NULL` with `NA` (#568)  thanks @ChrKoenig for 
+* Fixed bug in `gbif_parse()` - data format changed coming back from
+GBIF - needed to replace `NULL` with `NA` (#568)  thanks @ChrKoenig for
 reporting it!
 
 
 taxize 0.7.9
 ============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * New vignette: "Strategies for programmatic name cleaning" (#549)
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * `get_*()` functions now have new attributes to further help the user:
 `multiple_matches` (logical) indicating whether there were multiple
@@ -83,7 +215,7 @@ this could affect your code, make sure to check your existing code (#558)
 * `gnr_resolve()` - stop sorting output data.frame, so order of rows
 in output data.frame now same as user input vector/list (#559)
 
-## BUG FIXES
+### BUG FIXES
 
 * Fixed internal fxn `sub_rows()` inside of most `get_*()` functions
 to not fail when the data.frame rows were less than that requested by
@@ -100,7 +232,7 @@ returned when a preferred data source specified (#557)
 taxize 0.7.8
 ============
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * Fix to `iucn_summary()` (#543) thanks @mcsiple
 * Added message for when too many Ids passed in to `ncbi_get_taxon_summary()`
@@ -108,7 +240,7 @@ suggesting to break up the ids into chunks (#541) thanks @daattali
 * Fix to `itis_acceptname()` to accept multiple names (#534) and now
 gives back same output regardless of whether match found or not (#531)
 
-## BUG FIXES
+### BUG FIXES
 
 * Fix to `tax_name()` for some queries that return no classification data
 via internal call to `classification()` (#542) thanks @daattali
@@ -119,7 +251,7 @@ to make sure user has `vegan` installed (#529)
 taxize 0.7.6
 ============
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * Changed defunct messages in `eol_invasive()` and `gisd_invasive()`
 to point to new location in the [originr](https://github.com/ropenscilabs/originr)
@@ -129,7 +261,7 @@ anymore (#494)
 [rredlist](https://github.com/ropenscilabs/rredlist) package. (Two issues
 dealing with IUCN problems (#475) (#492))
 
-## BUG FIXES
+### BUG FIXES
 
 * Fix to `get_gbifid()` to use new internal code to provide two
 ways to search GBIF taxonomy API, either via `/species/match` or via
@@ -145,7 +277,7 @@ thanks @JoStaerk !
 taxize 0.7.5
 ============
 
-## BUG FIXES
+### BUG FIXES
 
 * Fixed bug in the package dependency `bold`, which fixes
 `taxize::bold_search()`, so no actual changes in `taxize` for
@@ -164,7 +296,7 @@ how to get a key and save it in either `.Renviron` or in
 taxize 0.7.4
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * New function `lowest_common()` for obtaining the lowest common taxon and
 rank for a given taxon name or ID. Methods so far for ITIS, NCBI, and GBIF (#505)
@@ -176,7 +308,7 @@ IUCN IDs as input instead of taxonomic names (#493)
 This provides consistency, which is important, and many functions use ranks
 to determine what to do next, so using a consistent case is good.
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * `iucn_summary()` fixes, long story short: a number of bug fixes, and uses
 the new IUCN API via the newish package `rredlist` when IDs are given as input,
@@ -198,7 +330,7 @@ providers (e.g., `class` vs. `Class`). All rank values are now all lowercase (#5
 * `iucn_id()`, `tpl_families()`, and `tpl_get()` all gain a new parameter `...` to
 pass on curl options to `httr::GET()`
 
-## BUG FIXES
+### BUG FIXES
 
 * Fixes to `get_eolid()`: URI returned now always has the pageid, and goes to the
 right place; API key if passed in now actually used, woopsy (#484)
@@ -221,7 +353,7 @@ was previously no parser for that type. Now there is, and it works (#512)
 taxize 0.7.0
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * Now requires `R >= 3.2.1`. Good idea to update your R installation anyway (#476)
 * New function `ion()` for obtaining data from Index of Organism Names (#345)
@@ -235,7 +367,7 @@ functions allow some Index Fungorum data access (#471)
 GBIF's backbone taxonomy. Also available in `downstream()`, where you can
 request downstream names from GBIF, along with other data sources (#414)
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * Note added in docs for all `db` parameters to warn users that if they
 provide the wrong `db` value for the given taxon ID, they can get data
@@ -249,12 +381,12 @@ data is returned. This is beyond our control, as sometimes IUCN itself gives
 back incorrect data, and sometimes EOL/Global Names (which we use in some of
 the IUCN functions) give back incorrect data. (#468) (#473) (#174) (472) (#475)
 
-## BUG FIXES
+### BUG FIXES
 
 * Fix to `gnr_resolve()` to by default capitalize first name of a name string
 passed to the function. GNR is case sensitive, so case matters (#469)
 
-## DEFUNCT
+### DEFUNCT
 
 * `phylomatic_tree()` and `phylomatic_format()` are defunct. They were deprecated
 in recent versions, but are now gone. See the new package `brranching` for
@@ -263,7 +395,7 @@ Phylomatic data (#479)
 taxize 0.6.6
 ===============
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * `stripauthority` argument in `gnr_resolve()` has been renamed to `canonical`
 to better match what it actually does (#451)
@@ -291,7 +423,7 @@ when names not found.
 * Dropped `openssl` as a package dependency. Not needed anymore because uBio
 dropped.
 
-## BUG FIXES
+### BUG FIXES
 
 * `gnr_resolve()` failed when no canonical form was found.
 * Fixed `gnr_resolve()` when no results found when `best_match_only=TRUE` (#432)
@@ -299,13 +431,13 @@ dropped.
 when no results found, often with subspecific taxa. Helps solve errors reported
 in use of `downstream()`, `itis_downstream()`, and `gethierarchydownfromtsn()` (#459)
 
-## NEW FEATURES
+### NEW FEATURES
 
 * `gnr_resolve()` gains new parameter `with_canonical_ranks` (logical) to choose
 whether infraspecific ranks are returned or not.
 * New function `iucn_id()` to get the IUCN ID for a taxon from it's name. (#431)
 
-## DEFUNCT
+### DEFUNCT
 
 * All functions that interacted with the taxonomy service uBio are now
 defunct. Of course we would deprecate first, then make defunct later, to
@@ -319,7 +451,7 @@ function. (#449)
 taxize 0.6.2
 ===============
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * `rankagg()` doesn't depend on `data.table` anymore (fixes issue with CRAN checks)
 * Replaced `RCurl::base64Decode()` with `openssl::base64_decode()`, needed for
@@ -332,7 +464,7 @@ list to the `query` parameter in `GET()`, but can pass `NULL` (#445)
 * Fixes to all of the `gni_*()` functions, including code tidying, some
 DRYing out, and ability to pass in curl options (#444)
 
-## BUG FIXES
+### BUG FIXES
 
 * Fixed typo in `taxize_cite()`
 * Fixed a bug in `classification()` where numeric IDs as input got
@@ -345,7 +477,7 @@ web services (#435)
 taxize 0.6.0
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * Added a method for Catalogue of Life for the `synonyms` function to get
 name synonyms. (#430)
@@ -372,7 +504,7 @@ information (mostly higher taxonomic data) to help in the interactive decision
 process. (#327)
 * New data source added to `synonyms()` function: Catalogue of Life. (#430)
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * `vegan` package, used in `class2tree()` function, moved from Imports to Suggests. (#392)
 * Improved `taxize_cite()` a lot - get URLs and sometimes citation information
@@ -389,11 +521,11 @@ examples of curl option use.
 often quite slow.
 * General code tidying across the package to make code easier to read.
 
-## BUG FIXES
+### BUG FIXES
 
 * Fixed encoding issues in `tpl_families()` and `tpl_get()`. (#424)
 
-## DEPRECATED AND DEFUNCT
+### DEPRECATED AND DEFUNCT
 
 * The following functions that were deprecated are now defunct (no longer available):
 `ncbi_getbyname()`, `ncbi_getbyid()`, `ncbi_search()`, `eol_invasive()`,
@@ -403,24 +535,24 @@ often quite slow.
 taxize 0.5.2
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * New set of functions to ping each of the APIs used in `taxize`. E.g., `itis_ping()` pings ITIS and returns a logical, indicating if the ITIS API is working or not. You can also do a very basic test to see whether content returned matches what's expected. (#394)
 * New function `status_codes()` to get vector of HTTP status codes. (#394)
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * Removed startup message.
 * Now can pass in curl options to `itis_ping()`, and all `*_ping()` functions.
 
-## BUG FIXES
+### BUG FIXES
 
 * Moved examples that were in `\donttest` into `\dontrun`.
 
 taxize 0.5.0
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * New function `genbank2uid()` to get a NCBI taxonomic id (i.e., a _uid_) from a either a GenBank accession number of GI number. (#375)
 * New function `get_nbnid()` to get a UK National Biodiversity Network taxonomic id (i.e., a _nbnid_). (#332)
@@ -433,7 +565,7 @@ taxize 0.5.0
 * New suite of functions named, for example, `get_tsn_()` (the underscore is the only different from the previous function name). These functions don't do the normal interactive process of prompts that e.g., `get_tsn()` do, but instead returned a list of all ids, or a subset via the `rows` parameter. (#237)
 * New function `ncbi_get_taxon_summary()` to get taxonomic name and rank for 1 or more NCBI uid's. (#348)
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * `assertthat` removed from package imports, replaced with `stopifnot()`, to reduce dependency load. (#387)
 * `eol_hierarchy()` now defunct (no longer available) (#228) (#381)
@@ -444,14 +576,14 @@ taxize 0.5.0
 * `classification()` now by default returns taxonomic identifiers for each of the names. This can be toggled off by the `return_id=FALSE`. (#359) (#360)
 * Simplification of many higher level functions to use `switch()` on the `db` parameter, which helps give better error message when a `db` value is not possible or spelled incorrectly. (#379)
 
-## BUG FIXES
+### BUG FIXES
 
 * Lots of reduction of redundancy in internal functions. (#378)
 
 taxize 0.4.0
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * New data sources added to taxize: BOLD (Biodiversity of Life Database). Three more data sources were added (World Register of Marine Species (WoRMS), Pan-European Species directories Infrastructure (PESI), and Mycobank), but are not available on CRAN. Those three data sources provide data via SOAP web services protocol, which is hard to support in R. Thus, those sources are available on Github. See https://github.com/ropensci/taxize#version-with-soap-data-sources
 * New function `children()`, which is a single interface to various data sources to get immediate children from a given taxonomic name. (#304)
@@ -459,7 +591,7 @@ taxize 0.4.0
 * New function `get_ubioid()` to get a uBio taxon identifier. (#318)
 * New function started (not complete yet) to get suggested citations for the various data sources available in `taxize`: `taxize_cite()`. (#270)
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * Using `jsonlite` instead of `RJSONIO` throughout the `taxize`.
 * `get_ids()` gains new option to search for a uBio ID, in addition to the others, itis, ncbi, eol, col, tropicos, and gbif.
@@ -469,7 +601,7 @@ taxize 0.4.0
 * `synonyms()` gains new data source, can now get synonyms from uBio data source (#319)
 * `vascan_search()` giving back more useful results now.
 
-## BUG FIXES
+### BUG FIXES
 
 * Added error catching for when URI is too long, i.e., when too many names provided (#329) (#330)
 * Various fixes to `tnrs()` function, including more meaningful error messages on failures (#323) (#331)
@@ -481,7 +613,7 @@ taxize 0.4.0
 taxize 0.3.0
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * New function `iplant_resolve()` to do name resolution using the iPlant name resolution service. Note, this is different from http://taxosaurus.org/ that is wrapped in the `tnrs()` function.
 * New function `ipni_search()` to search for names in the International Plant Names Index (IPNI).
@@ -492,7 +624,7 @@ taxize 0.3.0
 * `gnr_resolve()` gains two new parameters `best_match_only` (logical, to return best match only) and `preferred_data_sources` (to return preferred data sources) and `callopts` to pass in curl options.
 * `tnrs()`, `tp_accnames()`, `tp_refs()`, `tp_summary()`, and `tp_synonyms()` gain new parameter `callopts` to pass in curl options.
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * `class2tree()` can now handle NA in classification objects.
 * `classification.eolid()` and `classification.colid()` now return the submitted name along with the classification.
@@ -506,7 +638,7 @@ taxize 0.3.0
 * Most long-named ITIS functions (e.g., `getexpertsfromtsn`, `getgeographicdivisionsfromtsn`) gain parameter `curlopts` to pass in curl options.
 * Added `stringsAsFactors=FALSE` to all `data.frame` creations to eliminate factor variables.
 
-## BUG FIXES
+### BUG FIXES
 
 * `classification.gbifid()` did not return the correct result when taxon not found.
 * Fixed bugs in many functions, see #245, #248, #254, #277.
@@ -515,15 +647,15 @@ taxize 0.3.0
 taxize 0.2.2
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * itis_downstream() and col_downstream() functions accessible now from a single function downstream() (https://github.com/ropensci/taxize/issues/238)
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * Added a extension function classification() for the gbif id class, classification.gbifid() (https://github.com/ropensci/taxize/issues/241)
 
-## BUG FIXES
+### BUG FIXES
 
 * Added some error catching to class2tree function. (https://github.com/ropensci/taxize/issues/240)
 * Fixed problems in cbind.classification() and rbind.classification() where the first column of the ouput was a useless column name, and all column names now lower case for consistency. (https://github.com/ropensci/taxize/issues/243)
@@ -534,18 +666,18 @@ taxize 0.2.2
 taxize 0.2.0
 ===============
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * New dataset: Lookup-table for family, genus, and species names for ThePlantList under dataset name "theplantlist".
 * get_ids() now accepts "gbif" as an option via use of get_gbifid().
 * Changed function itis_phymat_format() to phylomatic_format() - this function gets the typical Phylomatic format name string "family/genus/genus_epithet"
 
-## BUG FIXES
+### BUG FIXES
 
 * Updated gbif_parse() base url to the new one (http://api.gbif.org/v1/parser/name).
 * Fixes to phylomatic_tree().
 
-## NEW FEATURES
+### NEW FEATURES
 
 * New function class2tree() to convert list of classifications to a tree. For example, go from a list of classifications from the function classification() to this function to get a taxonomy tree in ape phylo format.
 * New function get_gbfid() to get a Global Biodiversity Information Facility identifier. This is the ID GBIF uses in their backbone taxonomy.
@@ -554,25 +686,25 @@ taxize 0.2.0
 taxize 0.1.9
 ===============
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * Updated ncbi_search() to retrieve more than a max of 500, slightly changed column headers in output data files, and if didn't before, now accepts a vector/list of taxonomic names instead of just one name.
 
 taxize 0.1.8
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * We attempted to make all ouput column names lowercase, and to increase consistency across column names in outputs from similar functions.
 * New function scrapenames() uses the Global Names Recognition and Discovery service to extract taxonomic names from a web page, pdf, or other document.
 * New function vascan_search() to search the CANADENSYS Vascan names database.
 
-## BUG FIXES
+### BUG FIXES
 
 * Fixed bugs in get_tpsid(), get_eolid() and eol_pages().
 * phylomatic_tree() bugs fixed.
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * classification() methods were simplified. Now classification() is the workhorse for every data-source. col_classification(), eol_hierarchy(), and tp_classification() are now deprecated and will be removed in the next taxize version.
 * classification() gains four new arguments: start, checklist, key, and callopts.
@@ -582,7 +714,7 @@ taxize 0.1.8
 * tax_agg() now accepts a matrix in addition to a data.frame. Thanks to @tpoi
 * tnrs() changes: Using httr instead of RCurl; now forcing splitting up name vector when long. Still issues when using POST requests (getpost="POST") wherein a request sent with 100 names only returns 30 for example. Investigating this now.
 
-## NOTES
+### NOTES
 
 * Function name change: tp_acceptednames() now tp_accnames().
 * Function name change: tp_namedistributions() now tp_dist().
@@ -593,7 +725,7 @@ taxize 0.1.8
 taxize 0.1.5
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * classification() gains extension method classification.ids() to accept output from get_ids() - which attempts to get a taxonomic hierarchy from each of the taxon identifiers with the output from get_ids().
 * synonyms() gains extension method synonyms.ids() to accept output from get_ids() - which attempts to get synonyms from each of the taxon identifiers with the output from get_ids().
@@ -601,7 +733,7 @@ taxize 0.1.5
 taxize 0.1.4
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * Reworked functions that interact with the ITIS API so that lower level functions were grouped together into higher level functions. All the approximately 50 lower level functions are still exported but are not included in the index help file (due to @keywords internal for each fxn) - but can still be used normally, and man files are avaialable at ?functionName.
 * New function itis_ping() to check if the ITIS API service is up, similar to eol_ping() for the EOL API.
@@ -616,7 +748,7 @@ taxize 0.1.4
 * New function comm2sci() to get scientific names from input common (vernacular) names from various data sources.
 * New function get_ids() to get taxonomic identifiers across all sources.
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * itis_taxrank() now outputs a character, not a factor; loses parameter verbose, and gains ..., which passes on further arguments to gettaxonomicranknamefromtsn.
 * tp_synonyms(), tp_summary(), plantminer(), itis_downstream(), gisd_isinvasive(), get_genes_avail(), get_genes(), eol_invasive(), eol_dataobjects(), andn tnrs() gain parameter verbose to optionally suppress messages.
@@ -626,7 +758,7 @@ taxize 0.1.4
 * get_tsn() and get_uid() return infomation about match as attribute.
 * clarified iucn-documentation
 
-## BUG	FIXES
+### BUG FIXES
 
 * Fixed bug in synonyms() so that further arguments can be passed on to get_tsn() to suppress messages.
 * Removed test for ubio_classification_search(), a function that isn't operational yet.
@@ -634,7 +766,7 @@ taxize 0.1.4
 taxize 0.1.1
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * New functions added just like get_uid()/get_tsn() but for EOL, Catalogue of Life, and Tropicos, see get_eolid(), get_colid(), and get_tpsid(), respectively.
 * classification() methods added for EOL, Catalogue of Life, and Tropicos, see functions classification.eolid(), classification.colid(), and classification.tpsid() respectively.
@@ -647,17 +779,17 @@ taxize 0.1.1
 * New function itis_searchcommon() to search for common names across both searchbycommonnamebeginswith, and searchbycommonnameendswith.
 
 
-## BUG FIXES
+### BUG FIXES
 
 * tax_name() and other function broke, because get_tsn() and get_uid() returned wrong value when a taxon was not found. Fixed.
 
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * Added tests for new classification() methods for EOL, COL, and Tropicos.
 * Added tests for new functions tp_search() and tp_classification().
 
-## NOTES
+### NOTES
 
 * Moved tests from inst/tests to tests/testthat according to new preferred location of tests.
 * Updated CITATION in inst/ with our F1000Research paper info.
@@ -667,7 +799,7 @@ taxize 0.1.1
 taxize 0.1.0
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * New function tpl_families() to get data.frame of families from The Plantlist.org site.
 * New function names_list() to get a random vector of species names using the
@@ -676,7 +808,7 @@ taxize 0.1.0
 * Changed API key names to be more consistent, now tropicosApiKey, eolApiKey, ubioApiKey, and pmApiKey - do change these in your .Rprofile if you store them there.
 * Added a startup message.
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 
 * Across most functions, removed dependencies on plyr, using ldfast() instead, for increased speed.
 * Across most functions, changed from using RCurl to using httr.
@@ -690,19 +822,19 @@ taxize 0.1.0
 * tpl_get() updated with fixes/improvements by John Baumgartner - now gets taxa from all groups, whereas only retrieved from Angiosperms before. In addition, csv files from The Plantlist.org are downloaded directly rather than read into R and written out again.
 * tpl_search() now checks for missing data or errors, and stops function with error message.
 
-## BUG FIXES
+### BUG FIXES
 
 * capwords() fxn changed to taxize_capwords() to avoid namespace conflicts with other packages with a similar function.
 * ubio_namebank() was giving back base64 encoded data, now decoded appropriately.
 
-## NOTES
+### NOTES
 
 * Added John Baumgartner as an author.
 
 taxize 0.0.6
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 * tax_name() accepts multiple ranks to query.
 * tax_name() accepts vectors as input.
 * tax_name() has an option to query both, NCBI and ITIS, in one call and return the union of both.
@@ -719,13 +851,13 @@ taxize 0.0.6
 * gnr_resolve() gains new arguments gnr_resolvee_once, with_context, stripauthority, highestscore, and http, and loses returndf (that is, a data.frame is returned by default)
 * gni_search() gains parameter parse_names
 
-## MINOR IMPROVEMENTS
+### MINOR IMPROVEMENTS
 * tnrs() parameter getpost changed from default of 'GET' to 'POST'
 * Across all functions, the url parameter specifying an API endpoint was moved inside of functions (i.e., not available as a parameter in the function call)
 * gnr_datasources() parameter todf=TRUE by default now, returning a data.frame
 * col_classification() minor formatting improvements
 
-## BUG FIXES
+### BUG FIXES
 * iucn_summary() returns no information about population estimates.
 * get_tsn() raised a warning in specific situations.
 * tax_name() did not work for multiple ranks with ITIS.
@@ -735,7 +867,7 @@ taxize 0.0.6
 * fixed errors in searchforanymatch()
 * fixed errors in searchforanymatchedpage()
 
-## NOTES
+### NOTES
 * Removed dependency to NCBI2R
 * Improvements of documentation
 * Citation added
@@ -743,26 +875,26 @@ taxize 0.0.6
 taxize 0.0.5
 ===============
 
-## BUG FIXES
+### BUG FIXES
 * removed tests for now until longer term fix is made so that web APIs that are temporarily down don't cause tests to fail.
 
 taxize 0.0.4
 ===============
 
-## BUG FIXES
+### BUG FIXES
 * added R (>= 2.15.0) so that package tests don't fail on some systems due to paste0()
 * remove test for ubio_namebank() function as it sometimes fails
 
 taxize 0.0.3
 ===============
 
-## BUG FIXES
+### BUG FIXES
 * iucn_summary() does not break when API returns no information.
 * tax_name() returns NA when taxon is not found on API.
 * get_uid() asks for user input when more then one UID is found for a taxon.
 * changed base URL for phylomatic_tree(), and associated parameter changes
 
-## NEW FEATURES
+### NEW FEATURES
 * added check for invasive species status for a set of species from GISD database via gisd_isinvasive().
 * Further development with the EOL-API: eol_dataobjects().
 * added Catalogue of Life: col_classification(), col_children(), and col_downstream().
@@ -770,20 +902,20 @@ taxize 0.0.3
 * new functions to interact with the Phylotastic name resolution service: tnrs_sources() and tnrs()
 * Added unit tests
 
-## DEPRECATED AND DEFUNCT
+### DEPRECATED AND DEFUNCT
 * itis_name() fxn deprecated - use tax_name() instead
 
 
 taxize 0.0.2
 ===============
 
-## BUG FIXES
+### BUG FIXES
 
 * changed paste0 to paste to avoid problems on certain platforms.
 * removed all tests until the next version so that tests will not fail on any platforms.
 * plyr was missing as import for iucn_summary fxn.
 
-## NEW FEATURES
+### NEW FEATURES
 
 * added NEWS file.
 
@@ -791,6 +923,6 @@ taxize 0.0.2
 taxize 0.0.1
 ===============
 
-## NEW FEATURES
+### NEW FEATURES
 
 * released to CRAN
diff --git a/R/children.R b/R/children.R
index 40a7452..e7ed167 100644
--- a/R/children.R
+++ b/R/children.R
@@ -70,8 +70,6 @@
 #' # use curl options
 #' library("httr")
 #' res <- children("Poa", db = 'col', rows=1, config=verbose())
-#' res <- children("Salmo", db = 'itis', config=verbose())
-#' res <- children("Salmo", db = 'ncbi', config=verbose())
 #' }
 
 children <- function(...){
@@ -80,7 +78,7 @@ children <- function(...){
 
 #' @export
 #' @rdname children
-children.default <- function(x, db = NULL, rows = NaN, ...) {
+children.default <- function(x, db = NULL, rows = NA, ...) {
   nstop(db)
   switch(
     db,
diff --git a/R/class2tree.R b/R/class2tree.R
index e668c8c..37a81b1 100644
--- a/R/class2tree.R
+++ b/R/class2tree.R
@@ -1,53 +1,54 @@
 #' Convert list of classifications to a tree.
 #'
 #' This function converts a list of hierarchies for individual species into
-#' a single species by taxonomic level matrix, then calculates a distance matrix
-#' based on taxonomy alone, and outputs either a phylo or dist object. See details
-#' for more information.
+#' a single species by taxonomic level matrix, then calculates a distance
+#' matrix based on taxonomy alone, and outputs either a phylo or dist object.
+#' See details for more information.
 #'
-#' @param input List of classification data.frame's from the function classification().
-#' @param varstep Vary step lengths between successive levels relative to proportional
-#' loss of the number of distinct classes.
-#' @param check	If TRUE, remove all redundant levels which are different for all rows
-#' or constant for all rows and regard each row as a different basal taxon (species).
-#' If FALSE all levels are retained and basal taxa (species) also must be coded as
-#' variables (columns). You will get a warning if species are not coded, but you can
-#' ignore this if that was your intention.
+#' @export
+#' @param input List of classification data.frame's from the function
+#' \code{\link{classification}}
+#' @param varstep Vary step lengths between successive levels relative to
+#' proportional loss of the number of distinct classes.
+#' @param check	If TRUE, remove all redundant levels which are different for
+#' all rows or constant for all rows and regard each row as a different basal
+#' taxon (species). If FALSE all levels are retained and basal taxa (species)
+#' also must be coded as variables (columns). You will get a warning if
+#' species are not coded, but you can ignore this if that was your intention.
 #' @param ... Further arguments passed on to hclust.
 #' @param x Input object to print or plot - output from class2tree function.
 #' @return An object of class "classtree" with slots:
 #' \itemize{
 #'  \item phylo - The resulting object, a phylo object
-#'  \item classification - The classification data.frame, with taxa as rows, and
-#'  different classification levels as columns
+#'  \item classification - The classification data.frame, with taxa as rows,
+#'  and different classification levels as columns
 #'  \item distmat - Distance matrix
 #'  \item names - The names of the tips of the phylogeny
 #' }
 #'
-#' Note that when you execute the resulting object, you only get the phylo object.
-#' You can get to the other 3 slots by calling them directly, like output$names,
-#' etc.
-#' @details See \code{\link[vegan]{taxa2dist}}. Thanks to Jari Oksanen for making
-#' the taxa2dist function and pointing it out, and Clarke & Warwick (1998, 2001),
-#' which taxa2dist was based on.
-#' @export
+#' Note that when you execute the resulting object, you only get the phylo
+#' object. You can get to the other 3 slots by calling them directly, like
+#' output$names, etc.
+#' @details See \code{\link[vegan]{taxa2dist}}. Thanks to Jari Oksanen for
+#' making the taxa2dist function and pointing it out, and Clarke & Warwick
+#' (1998, 2001), which taxa2dist was based on.
 #' @examples \dontrun{
-#' spnames <- c('Klattia flava', 'Trollius sibiricus', 'Arachis paraguariensis',
-#'  'Tanacetum boreale', 'Gentiana yakushimensis','Sesamum schinzianum',
-#'  'Pilea verrucosa','Tibouchina striphnocalyx','Lycium dasystemum',
-#'  'Schoenus centralis','Berkheya echinacea','Androcymbium villosum',
-#'  'Helianthus annuus','Madia elegans','Lupinus albicaulis','Poa annua',
+#' spnames <- c('Quercus robur', 'Iris oratoria', 'Arachis paraguariensis',
+#'  'Helianthus annuus','Madia elegans','Lupinus albicaulis',
 #'  'Pinus lambertiana')
-#' out <- classification(spnames, db='ncbi')
+#' out <- classification(spnames, db='itis')
 #' tr <- class2tree(out)
 #' plot(tr)
 #'
-#' # another example using random sets of names with names_list() fxn
-#' spnames <- names_list('species', 50)
+#' spnames <- c('Klattia flava', 'Trollius sibiricus', 'Arachis paraguariensis',
+#'  'Tanacetum boreale', 'Gentiana yakushimensis','Sesamum schinzianum',
+#'  'Pilea verrucosa','Tibouchina striphnocalyx','Lycium dasystemum',
+#'  'Berkheya echinacea','Androcymbium villosum',
+#'  'Helianthus annuus','Madia elegans','Lupinus albicaulis',
+#'  'Pinus lambertiana')
 #' out <- classification(spnames, db='ncbi')
 #' tr <- class2tree(out)
 #' plot(tr)
-#' plot(tr, no.margin=TRUE)
 #' }
 
 class2tree <- function(input, varstep = TRUE, check = TRUE, ...) {
@@ -59,15 +60,20 @@ class2tree <- function(input, varstep = TRUE, check = TRUE, ...) {
   if (length(input) < 3)
     stop("Your input list of classifications must be 3 or longer.")
   dat <- rbind.fill(lapply(input, class2tree_helper))
-  df <- dat <- dat[ , !apply(dat, 2, function(x) any(is.na(x)))]
+  df <- dat[ , !apply(dat, 2, function(x) any(is.na(x))) ]
+  if (!inherits(df, "data.frame")) {
+    stop("no taxon ranks in common - try different inputs")
+  }
   row.names(df) <- df[,1]
   df <- df[,-1]
-  taxdis <- tryCatch(taxa2dist(df, varstep = varstep, check = check), error = function(e) e)
+  taxdis <- tryCatch(taxa2dist(df, varstep = varstep, check = check),
+                     error = function(e) e)
   # check for incorrect dimensions error
   if (is(taxdis, 'simpleError'))
     stop("Try check=FALSE, but see docs for taxa2dist function in the vegan package for details.")
   out <- as.phylo.hclust(hclust(taxdis, ...))
-  res <- list(phylo = out, classification = dat, distmat = taxdis, names = names(input))
+  res <- list(phylo = out, classification = dat, distmat = taxdis,
+              names = names(input))
   class(res) <- 'classtree'
   return( res )
 }
@@ -76,8 +82,8 @@ class2tree_helper <- function(x){
   x <- x[!x$rank == "no rank", ]
   df <- x[-nrow(x), 'name']
   names(df) <- x[-nrow(x), 'rank']
-  df <- data.frame(t(data.frame(df)))
-  data.frame(tip = x[nrow(x), "name"], df)
+  df <- data.frame(t(data.frame(df)), stringsAsFactors = FALSE)
+  data.frame(tip = x[nrow(x), "name"], df, stringsAsFactors = FALSE)
 }
 
 #' @method plot classtree
diff --git a/R/classification.R b/R/classification.R
index b9f681c..efd6377 100644
--- a/R/classification.R
+++ b/R/classification.R
@@ -5,21 +5,27 @@
 #' to query.
 #' @param db character; database to query. either \code{ncbi}, \code{itis},
 #' \code{eol}, \code{col}, \code{tropicos}, \code{gbif}, \code{nbn},
-#' \code{worms}, or \code{natserv}. Note that each taxonomic data source has
-#' their own identifiers, so that if you provide the wrong \code{db} value
-#' for the identifier you could get a result, but it will likely be wrong (not
-#' what you were expecting).
-#' @param id character; identifiers, returned by \code{\link[taxize]{get_tsn}},
-#' \code{\link[taxize]{get_uid}}, \code{\link[taxize]{get_eolid}},
-#' \code{\link[taxize]{get_colid}}, \code{\link[taxize]{get_tpsid}},
-#' \code{\link[taxize]{get_gbifid}}, \code{\link[taxize]{get_tolid}},
-#' \code{\link[taxize]{get_wormsid}}, \code{\link[taxize]{get_natservid}}
+#' \code{worms}, \code{natserv}, \code{bold}, or \code{wiki}. Note that each
+#' taxonomic data source has, their own identifiers, so that if you provide
+#' the wrong \code{db} value for the identifier you could get a result, but
+#' it will likely be wrong (not what you were expecting).
+#' @param id character; identifiers, returned by \code{\link{get_tsn}},
+#' \code{\link{get_uid}}, \code{\link{get_eolid}},
+#' \code{\link{get_colid}}, \code{\link{get_tpsid}},
+#' \code{\link{get_gbifid}}, \code{\link{get_tolid}},
+#' \code{\link{get_wormsid}}, \code{\link{get_natservid}},
+#' \code{\link{get_wormsid}}, \code{\link{get_wiki}}
 #' @param callopts Curl options passed on to \code{\link[httr]{GET}}
-#' @param ... Other arguments passed to \code{\link[taxize]{get_tsn}},
-#' \code{\link[taxize]{get_uid}}, \code{\link[taxize]{get_eolid}},
-#' \code{\link[taxize]{get_colid}}, \code{\link[taxize]{get_tpsid}},
-#' \code{\link[taxize]{get_gbifid}}, \code{\link[taxize]{get_wormsid}},
-#' or \code{\link[taxize]{get_natservid}}
+#' @param ... For \code{classification}: other arguments passed to
+#' \code{\link{get_tsn}},
+#' \code{\link{get_uid}}, \code{\link{get_eolid}},
+#' \code{\link{get_colid}}, \code{\link{get_tpsid}},
+#' \code{\link{get_gbifid}}, \code{\link{get_wormsid}},
+#' \code{\link{get_natservid}}, \code{\link{get_wormsid}},
+#' \code{\link{get_wiki}}. For \code{rbind.classification} and
+#' \code{cbind.classification}: one or more objects of class
+#' \code{classification}
+#'
 #' @param start The first record to return. If omitted, the results are returned
 #' 		from the first record (start=0). This is useful if the total number of
 #' 		results is larger than the maximum number of results returned by a single
@@ -40,7 +46,7 @@
 #'    every supplied taxa.
 #' @details If IDs are supplied directly (not from the \code{get_*} functions)
 #' you must specify the type of ID. There is a timeout of 1/3 seconds between
-#' querries to NCBI.
+#' queries to NCBI.
 #'
 #' BEWARE: Right now, NBN doesn't return the queried taxon in the
 #' classification. But you can attach it yourself quite easily of course.
@@ -49,7 +55,17 @@
 #' @seealso \code{\link{get_tsn}}, \code{\link{get_uid}},
 #'    \code{\link{get_eolid}}, \code{\link{get_colid}},
 #'    \code{\link{get_tpsid}}, \code{\link{get_gbifid}}
-#'    \code{\link{get_wormsid}}, \code{\link{get_natservid}}
+#'    \code{\link{get_wormsid}}, \code{\link{get_natservid}},
+#'    \code{\link{get_boldid}}, \code{\link{get_wiki}}
+#'
+#' @section Lots of results:
+#' It may happen sometimes that you get more results back from your query
+#' than will show in the data.frame on screen. Our advice is to refine your
+#' query in those cases. On a data source basis we can attempt to help
+#' make it easier to refine queries, whether it be with the data provider
+#' (unlikely to happen), or in the code in this package (more likely) -
+#' let us know if you run into too many results problem and we'll see what
+#' we can do.
 #'
 #' @examples \dontrun{
 #' # Plug in taxon IDs
@@ -62,9 +78,22 @@
 #' classification(c(2704179, 2441176), db = 'gbif')
 #' classification(25509881, db = 'tropicos')
 #' classification("NBNSYS0000004786", db = 'nbn')
+#' classification(as.nbnid("NBNSYS0000004786"), db = 'nbn')
 #' classification(3930798, db = 'tol')
 #' ## works the same if IDs are in class character
 #' classification(c("2704179", "2441176"), db = 'gbif')
+#' classification("Agapostemon", db = "bold")
+#'
+#' # wikispecies
+#' classification("Malus domestica", db = "wiki")
+#' classification("Pinus contorta", db = "wiki")
+#' classification("Pinus contorta", db = "wiki", wiki_site = "commons")
+#' classification("Pinus contorta", db = "wiki", wiki_site = "pedia")
+#' classification("Pinus contorta", db = "wiki", wiki_site = "pedia", wiki = "fr")
+#'
+#' classification(get_wiki("Malus domestica", "commons"))
+#' classification(get_wiki("Malus domestica", "species"))
+#' classification(c("Pinus contorta", "Malus domestica"), db = "wiki")
 #'
 #' # Plug in taxon names
 #' ## in this case, we use get_*() fxns internally to first get taxon IDs
@@ -167,7 +196,7 @@
 #'
 #' @examples \dontrun{
 #' # Fails without db param set
-#' classification(315576)
+#' # classification(315576)
 #' }
 classification <- function(...){
   UseMethod("classification")
@@ -176,7 +205,7 @@ classification <- function(...){
 #' @export
 #' @rdname classification
 classification.default <- function(x, db = NULL, callopts = list(),
-                                   return_id = TRUE, rows = NaN, ...) {
+                                   return_id = TRUE, rows = NA, ...) {
   nstop(db)
   switch(
     db,
@@ -220,6 +249,14 @@ classification.default <- function(x, db = NULL, callopts = list(),
       id <- process_ids(x, db, get_natservid, rows = rows, ...)
       stats::setNames(classification(id, callopts = callopts, return_id = return_id, ...), x)
     },
+    bold = {
+      id <- process_ids(x, db, get_boldid, rows = rows, ...)
+      stats::setNames(classification(id, callopts = callopts, return_id = return_id, ...), x)
+    },
+    wiki = {
+      id <- process_ids(x, db, get_wiki, rows = rows, ...)
+      stats::setNames(classification(id, callopts = callopts, return_id = return_id, ...), x)
+    },
     stop("the provided db value was not recognised", call. = FALSE)
   )
 }
@@ -241,7 +278,9 @@ process_ids <- function(input, db, fxn, ...){
            nbn = as.nbnid,
            tol = as.tolid,
            worms = as.wormsid,
-           natserv = as.natservid)
+           natserv = as.natservid,
+           bold = as.boldid,
+           wiki = as.wiki)
     as_fxn(input, check = FALSE)
   } else {
     eval(fxn)(input, ...)
@@ -250,24 +289,26 @@ process_ids <- function(input, db, fxn, ...){
 
 #' @export
 #' @rdname classification
-classification.tsn <- function(id, callopts = list(), return_id = TRUE, ...) {
-  fun <- function(x, callopts){
+classification.tsn <- function(id, return_id = TRUE, ...) {
+  fun <- function(x) {
     # return NA if NA is supplied
     if (is.na(x)) {
       out <- NA
     } else {
-      out <- ritis::hierarchy_full(x, wt = "json", raw = FALSE, callopts)
+      out <- ritis::hierarchy_full(as.character(x), wt = "json", raw = FALSE)
       if (NROW(out) < 1) return(NA)
+      # make normal data.frame
+      out <- data.frame(out, stringsAsFactors = FALSE)
       # remove overhang
       out <- out[1:which(out$tsn == x), c('taxonname', 'rankname', 'tsn')]
       names(out) <- c('name', 'rank', 'id')
       # Optionally return tsn of lineage
       if (!return_id) out <- out[, c('name', 'rank')]
       out$rank <- tolower(out$rank)
-      return(out)
     }
+    return(out)
   }
-  out <- lapply(id, fun, callopts = callopts)
+  out <- lapply(id, fun)
   names(out) <- id
   structure(out, class = 'classification', db = 'itis')
 }
@@ -451,11 +492,12 @@ classification.nbnid <- function(id, callopts = list(), return_id = TRUE, ...) {
     if (is.na(x)) {
       out <- NA
     } else {
-      out <- suppressWarnings(tryCatch(nbn_classification(id = x, callopts), error = function(e) e))
-      if (is(out, "simpleError")) {
+      out <- suppressWarnings(tryCatch(nbn_classification(id = x, callopts),
+                                       error = function(e) e))
+      if (inherits(out, "simpleError")) {
         NA
       } else {
-        out <- out[ , c('name','rank', 'taxonversionkey')]
+        out <- out[ , c('scientificname', 'rank', 'guid')]
         names(out) <- c('name', 'rank', 'id')
         # Optionally return id of lineage
         if (!return_id) out <- out[, c('name', 'rank')]
@@ -556,10 +598,68 @@ classification.natservid <- function(id, callopts = list(), return_id = TRUE, ..
   structure(out, class = 'classification', db = 'natserv')
 }
 
-# ---------
+#' @export
+#' @rdname classification
+classification.boldid <- function(id, callopts = list(), return_id = TRUE, ...) {
+  fun <- function(x, callopts) {
+    if (is.na(x)) {
+      out <- NA
+    } else {
+      out <- tryCatch(bold_search(id = x, includeTree = TRUE), error = function(e) e)
+      if (inherits(out, "error")) {
+        NA
+      } else {
+        if (is.null(out)) return(NA)
+        tmp <- out[names(out) %in% c('taxid', 'taxon', 'tax_rank')]
+        df <- data.frame(name = tmp$taxon, rank = tmp$tax_rank,
+                          id = tmp$taxid, stringsAsFactors = FALSE)
+        return(df)
+      }
+    }
+  }
+  out <- lapply(id, fun, callopts = callopts)
+  names(out) <- id
+  structure(out, class = 'classification', db = 'bold')
+}
 
 #' @export
 #' @rdname classification
+classification.wiki <- function(id, callopts = list(), return_id = TRUE, ...) {
+  fun <- function(x, wiki_site = "species", wiki = "en", callopts) {
+    if (is.na(x)) {
+      out <- NA
+    } else {
+      fxn <- switch(
+        wiki_site,
+        species = wikitaxa::wt_wikispecies,
+        commons = wikitaxa::wt_wikicommons,
+        pedia = wikitaxa::wt_wikipedia
+      )
+      out <- tryCatch(fxn(x)$classification, error = function(e) e)
+      if (inherits(out, "error")) {
+        NA
+      } else {
+        if (is.null(out) || NROW(out) == 0) return(NA)
+        df <- data.frame(name = out$name, rank = out$rank,
+                         stringsAsFactors = FALSE)
+        return(df)
+      }
+    }
+  }
+  out <- list()
+  for (i in seq_along(id)) {
+    out[[i]] <-
+      fun(id[i], attr(id, "wiki_site"), attr(id, "wiki_lang"))
+  }
+  #out <- lapply(id, fun, callopts = callopts)
+  names(out) <- id
+  structure(out, class = 'classification', db = 'wiki',
+            wiki_site = attr(id, "wiki_site"), wiki = attr(id, "wiki_lang"))
+}
+
+# ---------
+#' @export
+#' @rdname classification
 classification.ids <- function(id, ...) {
   fun <- function(x, ...){
     # return NA if NA is supplied
@@ -575,7 +675,7 @@ classification.ids <- function(id, ...) {
 
 #' @export
 #' @rdname classification
-cbind.classification <- function(x) {
+cbind.classification <- function(...) {
   gethiernames <- function(x) {
     x <- data.frame(x)
     x$name <- as.character(x$name)
@@ -589,8 +689,7 @@ cbind.classification <- function(x) {
       values
     }
   }
-  input <- x
-  #input <- input[sapply(input, class) %in% "data.frame"]
+  input <- x <- c(...)
   input <- input[vapply(x, function(z) inherits(z, "data.frame"), logical(1))]
   tmp <- do.call(rbind.fill, lapply(input, gethiernames))
   tmp$query <- names(x)
@@ -600,10 +699,9 @@ cbind.classification <- function(x) {
 
 #' @export
 #' @rdname classification
-rbind.classification <- function(x) {
-  input <- x
+rbind.classification <- function(...) {
+  input <- x <- c(...)
   db <- attr(input, "db")
-  #x <- input[vapply(x, class, "") %in% "data.frame"]
   x <- input[vapply(x, function(z) inherits(z, "data.frame"), logical(1))]
   for (i in seq_along(x)) {
     x[[i]]$query <- names(x[i])
diff --git a/R/col_children.R b/R/col_children.R
index be31be8..fa2451d 100644
--- a/R/col_children.R
+++ b/R/col_children.R
@@ -28,7 +28,8 @@
 #' # A basic example
 #' col_children(name="Apis")
 #'
-#' # An example where there is no classification, results in data.frame with no rows
+#' # An example where there is no classification, results in data.frame with
+#' # no rows
 #' col_children(id='b2f88f382aa5568f93a97472c6be6516')
 #'
 #' # Use a specific year's checklist
@@ -36,18 +37,22 @@
 #' col_children(name="Apis", checklist=2009)
 #'
 #' # Pass in many names or many id's
-#' out <- col_children(name=c("Buteo","Apis","Accipiter","asdf"), checklist="2012")
+#' out <- col_children(name=c("Buteo","Apis","Accipiter","asdf"),
+#'   checklist = "2012")
 #' out$Apis # get just the output you want
 #' library("plyr")
 #' ldply(out) # or combine to one data.frame
 #'
 #' # or pass many id's
-#' ids <- c('abe977b1d27007a76dd12a5c93a637bf', 'b2f88f382aa5568f93a97472c6be6516')
+#' ids <- c('abe977b1d27007a76dd12a5c93a637bf',
+#'   'b2f88f382aa5568f93a97472c6be6516')
 #' out <- col_children(id = ids, checklist=2012)
 #' library("plyr")
 #' ldply(out) # combine to one data.frame
 #' }
-col_children <- function(name = NULL, id = NULL, format = NULL, start = NULL, checklist = NULL, ...) {
+col_children <- function(name = NULL, id = NULL, format = NULL, start = NULL,
+                         checklist = NULL, ...) {
+
 	if (is.null(id)) {
 		temp <- llply(name, search_col_safe, id = NULL, checklist = checklist,
 		              format = format, start = start, ...)
@@ -61,7 +66,8 @@ col_children <- function(name = NULL, id = NULL, format = NULL, start = NULL, ch
 
 search_col <- function(name, id, checklist, format, start, ...) {
   url <- make_url(checklist)
-  args <- tc(list(name = name, id = id, format = format, response = "full", start = start))
+  args <- tc(list(name = name, id = id, format = format, response = "full",
+                  start = start))
   out <- GET(col_base(), query = argsnull(args), ...)
   stop_for_status(out)
   tt <- xml2::read_xml(con_utf8(out))
@@ -73,6 +79,7 @@ search_col_child_df <- function(x) {
   childtaxa_id <- xml_text(xml_find_all(x, "//child_taxa//id"))
   childtaxa_name <- xml_text(xml_find_all(x, "//child_taxa//name"))
   childtaxa_rank <- xml_text(xml_find_all(x, "//child_taxa//rank"))
-  data.frame(childtaxa_id, childtaxa_name, childtaxa_rank = tolower(childtaxa_rank),
+  data.frame(childtaxa_id, childtaxa_name,
+             childtaxa_rank = tolower(childtaxa_rank),
              stringsAsFactors = FALSE)
 }
diff --git a/R/col_downstream.R b/R/col_downstream.R
index 99e8c1e..02618a0 100644
--- a/R/col_downstream.R
+++ b/R/col_downstream.R
@@ -44,14 +44,16 @@
 #' col_downstream(name="Bryophyta", downto="family", checklist=2009)
 #'
 #' # By id
-#' col_downstream(id='576d098d770a39d09e2bcfa1c0896b26', downto="species", checklist=2012)
+#' col_downstream(id='576d098d770a39d09e2bcfa1c0896b26', downto="species",
+#'   checklist=2012)
 #' }
 
-col_downstream <- function(name = NULL, id = NULL, downto, format = NULL, start = NULL,
-  checklist = NULL, verbose = TRUE, intermediate = FALSE, ...) {
+col_downstream <- function(name = NULL, id = NULL, downto, format = NULL,
+  start = NULL, checklist = NULL, verbose = TRUE, intermediate = FALSE, ...) {
 
   downto <- tolower(downto)
-  poss_ranks <- unique(do.call(c, sapply(rank_ref$ranks, strsplit, split = ",", USE.NAMES = FALSE)))
+  poss_ranks <- unique(do.call(c, sapply(rank_ref$ranks, strsplit, split = ",",
+                                         USE.NAMES = FALSE)))
   downto <- match.arg(downto, choices = poss_ranks)
 
   func <- function(x=NULL, y=NULL, checklist, format, start, ...) {
@@ -78,30 +80,38 @@ col_downstream <- function(name = NULL, id = NULL, downto, format = NULL, start
                           format = format, start = start, ...)
         })
       }
+      # prune if too low
+      tt <- prune_too_low_col(tt, downto)
 
-      # remove
-      if (NROW(tt[tt$childtaxa_rank == downto, ]) > 0) {
-        out[[iter]] <- tt[tt$childtaxa_rank == downto, ]
-      }
-
-      if (NROW(tt[!tt$childtaxa_rank == downto, ]) > 0) {
-        notout <- tt[!tt$childtaxa_rank %in% torank, ]
+      if (NROW(tt) == 0) {
+        out[[iter]] <- data.frame(stringsAsFactors = FALSE)
+        stop_ <- "nodata"
       } else {
-        notout <- data.frame(rankName = downto)
-      }
+        # remove
+        if (NROW(tt[tt$childtaxa_rank == downto, ]) > 0) {
+          out[[iter]] <- tt[tt$childtaxa_rank == downto, ]
+        }
 
-      if (all(notout$childtaxa_rank == downto)) {
-        stop_ <- "fam"
-      } else {
-        if (intermediate) intermed[[iter]] <- notout
-        x <- NULL
-        toget <- as.character(notout$childtaxa_id)
-        stop_ <- "not"
+        if (NROW(tt[!tt$childtaxa_rank == downto, ]) > 0) {
+          notout <- tt[!tt$childtaxa_rank %in% torank, ]
+        } else {
+          notout <- data.frame(rankName = downto)
+        }
+
+        if (all(notout$childtaxa_rank == downto)) {
+          stop_ <- "fam"
+        } else {
+          if (intermediate) intermed[[iter]] <- notout
+          x <- NULL
+          toget <- as.character(notout$childtaxa_id)
+          stop_ <- "not"
+        }
       }
     } # end while loop
 
     if (length(out) == 0) {
-      ret <-  data.frame(childtaxa_id = NA, childtaxa_name = NA, childtaxa_rank = NA)
+      ret <-  data.frame(childtaxa_id = NA, childtaxa_name = NA,
+                         childtaxa_rank = NA)
     } else {
       res <- tc(out)
       ret <- do.call(rbind.fill, res)
@@ -112,14 +122,20 @@ col_downstream <- function(name = NULL, id = NULL, downto, format = NULL, start
   safe_func <- plyr::failwith(NULL, func)
   if (is.null(id)) {
     temp <- setNames(lapply(name, safe_func, y = NULL,
-                            checklist = checklist, format = format, start = start, ...), name)
+                            checklist = checklist, format = format,
+                            start = start, ...), name)
   } else {
     temp <- setNames(lapply(id, function(z) {
-      safe_func(x = NULL, y = id, checklist = checklist, format = format, start = start, ...)
+      safe_func(x = NULL, y = id, checklist = checklist, format = format,
+                start = start, ...)
     }), id)
   }
 
-  nas <- sapply(temp, function(z) NROW(na.omit( if (intermediate) z$target else z )))
-  if (verbose) message(sprintf('These taxa with no data: %s\nTry adjusting input parameters', names(nas[nas == 0])))
+  nas <- sapply(temp, function(z)
+    NROW(na.omit( if (intermediate) z$target else z )))
+  if (verbose)
+    message(
+      sprintf('These taxa with no data: %s\nTry adjusting input parameters',
+              names(nas[nas == 0])))
   return( temp )
 }
diff --git a/R/col_search.R b/R/col_search.R
index 6bc7522..d39e956 100644
--- a/R/col_search.R
+++ b/R/col_search.R
@@ -50,13 +50,17 @@ col_search <- function(name=NULL, id=NULL, start=NULL, checklist=NULL, response=
   response <- match.arg(response, c("terse", "full"))
   func <- function(x, y, ...) {
     url <- make_url(checklist)
-    args <- tc(list(name = x, id = y, start = start, response = response, format = "json"))
+    args <- tc(list(name = x, id = y, start = start, response = response,
+                    format = "json"))
     temp <- GET(url, query = argsnull(args), ...)
-    stop_for_status(temp)
-    tt <- jsonlite::fromJSON(con_utf8(temp), FALSE)
-    switch(response,
-           terse = parse_terse(tt),
-           full = parse_full(tt))
+    if (temp$status_code >= 300) {
+      warning("COL taxon not found", call. = FALSE)
+    } else {
+      tt <- jsonlite::fromJSON(con_utf8(temp), FALSE)
+      switch(response,
+             terse = parse_terse(tt),
+             full = parse_full(tt))
+    }
   }
   safe_func <- plyr::failwith(NULL, func)
   if (is.null(id)) {
@@ -101,7 +105,7 @@ parsecoldata <- function(x){
 }
 
 parse_full <- function(x) {
-  tmp <- x$results
+  tmp <- Filter(length, x$results)
   taxize_ldfast(
     lapply(tmp, function(z) {
       switch(z$name_status,
diff --git a/R/comm2sci.R b/R/comm2sci.R
index de39a23..14c4fa1 100644
--- a/R/comm2sci.R
+++ b/R/comm2sci.R
@@ -1,27 +1,28 @@
 #' Get scientific names from common names.
 #'
+#' @export
 #' @param commnames One or more common names or partial names.
 #' @param db Data source, one of \emph{"eol"} (default), \emph{"itis"},
-#' \emph{"tropicos"}, \emph{"ncbi"}, or \emph{"worms"}. Note that each
-#' taxonomic data source
-#' has their own identifiers, so that if you provide the wrong \code{db}
-#' value for the identifier you could get a result, but it will likely be
-#' wrong (not what you were expecting).
+#' \emph{"tropicos"}, \emph{"ncbi"}, or \emph{"worms"}.
 #' @param itisby Search for common names across entire names (search, default),
 #' at beginning of names (begin), or at end of names (end).
-#' @param simplify (logical) If TRUE, simplify output to a vector of names.
-#' If \code{FALSE}, return variable formats from different sources,
+#' @param simplify (logical) If \code{TRUE}, simplify output to a vector
+#' of names. If \code{FALSE}, return variable formats from different sources,
 #' usually a data.frame.
 #' @param ... Further arguments passed on to internal methods.
-#' @return A vector of names.
-#' @seealso \code{\link[ritis]{search_common}},
-#' \code{\link[taxize]{eol_search}},
-#' \code{\link[taxize]{tp_search}}
-#' @export
+#' @return If \code{simplify=TRUE}, a list of scientific names, with list
+#' labeled by your input names. If \code{simplify=FALSE}, a data.frame with
+#' columns that vary by data source
 #' @seealso \code{\link[taxize]{sci2comm}}
-#' @author Scott Chamberlain (myrmecocystus@@gmail.com)
+#' @details For data sources ITIS and NCBI you can pass in common names
+#' directly, and use \code{\link[taxize]{get_uid}} or
+#' \code{\link[taxize]{get_tsn}} to get ids first, then pass in to this fxn.
+#'
+#' For the other data sources, you can only pass in common names directly.
+#' @author Scott Chamberlain
 #' @examples \dontrun{
 #' comm2sci(commnames='black bear')
+#' comm2sci(commnames='black bear', simplify = FALSE)
 #' comm2sci(commnames='black bear', db='itis')
 #' comm2sci(commnames='annual blue grass', db='tropicos')
 #' comm2sci(commnames=c('annual blue grass','tree of heaven'), db='tropicos')
@@ -29,101 +30,141 @@
 #' comm2sci('blue whale', db = "worms")
 #' comm2sci(c('blue whale', 'dwarf surfclam'), db = "worms")
 #'
-#' # Output easily converts to a data.frame with \code{\link[plyr]{ldply}}
+#' # Output easily converts to a data.frame with plyr::ldply
 #' library(plyr)
 #' ldply(comm2sci(commnames=c('annual blue grass','tree of heaven'),
 #'   db='tropicos'))
 #'
-#' # Use curl options
-#' library("httr")
-#' comm2sci(commnames='black bear', config=verbose())
-#' comm2sci(commnames='black bear', db="itis", config=verbose())
-#' comm2sci(commnames='bear', db="ncbi", config=verbose())
-#' comm2sci(commnames='annual blue grass', db="tropicos", config=verbose())
+#' # ncbi: pass in uid's from get_uid() directly
+#' x <- get_uid("western capercaillie", modifier = "Common Name")
+#' comm2sci(x)
+#' # itis: pass in tsn's from get_tsn() directly
+#' x <- get_tsn(c("Louisiana black bear", "american crow"),
+#'   searchtype = "common")
+#' comm2sci(x)
 #' }
+comm2sci <- function(commnames, db='eol', itisby='search',
+                     simplify=TRUE, ...) {
+  UseMethod("comm2sci")
+}
 
-comm2sci <- function(commnames, db='eol', itisby='search', simplify=TRUE, ...) {
-  # ITIS helper
-  foo <- function(x, by='search', simplify, ...){
-    tmp <- switch(
-      by,
-      search = ritis::search_common(x, ...),
-      begin = ritis::search_common(x, from = "begin", ...),
-      end = ritis::search_common(x, from = "end", ...)
-    )
-    # remove empty tsn slots
-    tsns <- as.character(suppressWarnings(tmp$tsn))
-    tsns <- tsns[!sapply(tsns, nchar, keepNA = FALSE) == 0]
-    # get scientific names
-    tmp <- data.table::setDF(
-      data.table::rbindlist(
-        lapply(tsns, ritis::scientific_name),
-        fill = TRUE, use.names = TRUE
-      )
+#' @export
+comm2sci.default <- function(commnames, db='eol', itisby='search',
+                             simplify=TRUE, ...) {
+  assert(commnames, "character")
+  assert(simplify, "logical")
+  temp <- lapply(commnames, sci_from_comm, db = db, simplify = simplify,
+                 itisby = itisby, ...)
+  stats::setNames(temp, commnames)
+}
+
+sci_from_comm <- function(nn, db, simplify, itisby, ...) {
+  switch(
+    db,
+    eol = c2s_eol(terms = nn, simplify, ...),
+    itis = c2s_itis(nn, itisby, simplify, ...),
+    tropicos = c2s_tp(simplify, commonname = nn, ...),
+    ncbi = {
+      ids <- get_uid(nn, modifier = "Common Name", ...)
+      c2s_ncbi(ids, ...)
+    },
+    worms = c2s_worms(nn, simplify, ...),
+    stop("'db' must be one of 'eol', 'itis', 'tropicos', 'ncbi', 'worms'",
+         call. = FALSE)
+  )
+}
+
+#' @export
+comm2sci.tsn <- function(commnames, db='eol', itisby='search',
+                         simplify=TRUE, ...) {
+  temp <- lapply(commnames, c2s_itis_, simplify = simplify, ...)
+  stats::setNames(temp, commnames)
+}
+
+#' @export
+comm2sci.uid <- function(commnames, db='eol', itisby='search',
+                         simplify=TRUE, ...) {
+  temp <- lapply(commnames, c2s_ncbi, simplify = simplify, ...)
+  stats::setNames(temp, commnames)
+}
+
+# helpers ------------
+c2s_itis <- function(x, by='search', simplify, ...){
+  tmp <- switch(
+    by,
+    search = ritis::search_common(x, ...),
+    begin = ritis::search_common(x, from = "begin", ...),
+    end = ritis::search_common(x, from = "end", ...)
+  )
+  # remove empty tsn slots
+  tsns <- as.character(suppressWarnings(tmp$tsn))
+  tsns <- tsns[!sapply(tsns, nchar, keepNA = FALSE) == 0]
+  # get scientific names
+  tmp <- data.table::setDF(
+    data.table::rbindlist(
+      lapply(tsns, ritis::scientific_name),
+      fill = TRUE, use.names = TRUE
     )
-    if (simplify) {
-      as.character(tmp$combinedname)
-    } else{
-      tmp
-    }
+  )
+  if (simplify) {
+    as.character(tmp$combinedname)
+  } else{
+    tmp
   }
+}
 
-  ncbi2sci <- function(x, simplify, ...){
-    uid <- get_uid(x, ...)
-    if (is.na(uid))
-      return(NA)
-    baseurl <- paste0(ncbi_base(), "/entrez/eutils/efetch.fcgi?db=taxonomy")
-    ID <- paste("ID=", uid, sep = "")
-    searchurl <- paste(baseurl, ID, sep = "&")
-    tt <- GET(searchurl)
-    stop_for_status(tt)
-    res <- con_utf8(tt)
-    ttp <- xml2::read_xml(res)
-    # common name
-    out <- xml_text(xml_find_all(ttp, "//TaxaSet/Taxon/ScientificName"))
-    # NCBI limits requests to three per second
-    Sys.sleep(0.33)
-    return(out)
+c2s_itis_ <- function(x, by='search', simplify, ...){
+  tmp <- data.table::setDF(
+    data.table::rbindlist(
+      lapply(x, ritis::scientific_name),
+      fill = TRUE, use.names = TRUE
+    )
+  )
+  if (simplify) {
+    as.character(tmp$combinedname)
+  } else{
+    tmp
   }
+}
 
-  eol_search_ <- function(simplify, ...){
-    tmp <- eol_search(...)
-    if (simplify) {
-      as.character(tmp$name)
-    } else {
-      tmp
-    }
-  }
+c2s_ncbi <- function(x, simplify, ...) {
+  baseurl <- paste0(ncbi_base(), "/entrez/eutils/efetch.fcgi?db=taxonomy")
+  ID <- paste("ID=", x, sep = "")
+  searchurl <- paste(baseurl, ID, sep = "&")
+  tt <- GET(searchurl)
+  stop_for_status(tt)
+  res <- con_utf8(tt)
+  ttp <- xml2::read_xml(res)
+  # common name
+  out <- xml_text(xml_find_all(ttp, "//TaxaSet/Taxon/ScientificName"))
+  # NCBI limits requests to three per second
+  Sys.sleep(0.33)
+  return(out)
+}
 
-  tp_search_ <- function(simplify, ...){
-    tmp <- tp_search(...)
-    if (simplify) {
-      as.character(tmp$scientificname)
-    } else{
-      tmp
-    }
+c2s_eol <- function(simplify, ...){
+  tmp <- eol_search(...)
+  if (simplify) {
+    as.character(tmp$name)
+  } else {
+    tmp
   }
+}
 
-  worms_s <- function(x, simplify, ...){
-    tmp <- try_df(worrms::wm_records_common(name = x, ...))
-    if (simplify) {
-      as.character(tmp$scientificname)
-    } else{
-      tmp
-    }
+c2s_tp <- function(simplify, ...){
+  tmp <- tp_search(...)
+  if (simplify) {
+    as.character(tmp$scientificname)
+  } else{
+    tmp
   }
+}
 
-  getsci <- function(nn, simplify, ...) {
-    switch(
-      db,
-      eol = eol_search_(terms = nn, simplify, ...),
-      itis = foo(nn, itisby, simplify, ...),
-      tropicos = tp_search_(simplify, commonname = nn, ...),
-      ncbi = ncbi2sci(nn, ...),
-      worms = worms_s(nn, simplify, ...)
-    )
+c2s_worms <- function(x, simplify, ...){
+  tmp <- try_df(worrms::wm_records_common(name = x, ...))
+  if (simplify) {
+    as.character(tmp$scientificname)
+  } else{
+    tmp
   }
-  temp <- lapply(commnames, getsci, simplify = simplify, ...)
-  names(temp) <- commnames
-  temp
 }
diff --git a/R/downstream-utils.R b/R/downstream-utils.R
new file mode 100644
index 0000000..cffb095
--- /dev/null
+++ b/R/downstream-utils.R
@@ -0,0 +1,14 @@
+prune_too_low <- function(x, rank, ignore_no_rank = FALSE) {
+  rank_target_no <- as.numeric(rank_ref[which_rank(rank), "rankid"])
+  rank_nos <- as.numeric(rank_ref[vapply(x$rank, function(z) which_rank(z), 1),
+                                  "rankid"])
+  if (ignore_no_rank) rank_nos[rank_nos %in% c(300, 400)] <- 0
+  x[!rank_nos > rank_target_no, ]
+}
+
+prune_too_low_col <- function(x, rank, ignore_no_rank = FALSE) {
+  rank_target_no <- as.numeric(rank_ref[which_rank(rank), "rankid"])
+  rank_nos <- as.numeric(rank_ref[unlist(sapply(x$childtaxa_rank, function(z) which_rank(z))),
+                                  "rankid"])
+  x[!rank_nos > rank_target_no, ]
+}
diff --git a/R/downstream.R b/R/downstream.R
index 35728d8..2adec19 100644
--- a/R/downstream.R
+++ b/R/downstream.R
@@ -1,38 +1,43 @@
 #' Retrieve the downstream taxa for a given taxon name or ID.
 #'
-#' This function uses a while loop to continually collect children taxa down to the
-#' taxonomic rank that you specify in the \code{downto} parameter. You can get data
-#' from ITIS (itis) or Catalogue of Life (col). There is no method exposed by itis
-#' or col for getting taxa at a specific taxonomic rank, so we do it ourselves inside
-#' the function.
+#' This function uses a while loop to continually collect children taxa down
+#' to the taxonomic rank that you specify in the \code{downto} parameter. You
+#' can get data from ITIS (itis), Catalogue of Life (col), GBIF (gbif), or
+#' NCBI (ncbi). There is no method exposed by these four services for
+#' getting taxa at a specific taxonomic rank, so we do it ourselves here.
 #'
-#' @param x Vector of taxa names (character) or IDs (character or numeric) to query.
-#' @param db character; database to query. One or both of \code{itis}, \code{col}, or
-#' \code{gbif}. Note that each taxonomic data source has their own identifiers, so that if you
-#' provide the wrong \code{db} value for the identifier you could get a result,
-#' but it will likely be wrong (not what you were expecting).
-#' @param downto What taxonomic rank to go down to. One of: 'superkingdom','kingdom',
-#' subkingdom','infrakingdom','phylum','division','subphylum','subdivision','infradivision',
-#' 'superclass','class','subclass','infraclass','superorder','order','suborder',
-#' 'infraorder','superfamily','family','subfamily','tribe','subtribe','genus','subgenus',
-#' 'section','subsection','species','subspecies','variety','form','subvariety','race',
-#' 'stirp','morph','aberration','subform', or 'unspecified'
-#' @param intermediate (logical) If TRUE, return a list of length two with target
-#' taxon rank names, with additional list of data.frame's of intermediate
-#' taxonomic groups. Default: FALSE
-#' @param rows (numeric) Any number from 1 to infinity. If the default NA, all rows are
-#' considered. Note that this parameter is ignored if you pass in a taxonomic id of any of the
-#' acceptable classes: tsn, colid.
-#' @param ... Further args passed on to \code{itis_downstream} or \code{col_downstream}
+#' @export
+#' @param x Vector of taxa names (character) or IDs (character or numeric)
+#' to query.
+#' @param db character; database to query. One or more of \code{itis},
+#' \code{col}, \code{gbif}, or \code{ncbi}. Note that each taxonomic data
+#' source has their own identifiers, so that if you provide the wrong \code{db}
+#' value for the identifier you could get a result, but it will likely be
+#' wrong (not what you were expecting).
+#' @param downto What taxonomic rank to go down to. One of: 'superkingdom',
+#' 'kingdom', 'subkingdom','infrakingdom','phylum','division','subphylum',
+#' 'subdivision','infradivision', 'superclass','class','subclass','infraclass',
+#' 'superorder','order','suborder','infraorder','superfamily','family',
+#' 'subfamily','tribe','subtribe','genus','subgenus','section','subsection',
+#' 'species group','species','subspecies','variety','form','subvariety','race',
+#' 'stirp', 'morph','aberration','subform', 'unspecified', 'no rank'
+#' @param intermediate (logical) If \code{TRUE}, return a list of length two
+#' with target taxon rank names, with additional list of data.frame's of
+#' intermediate taxonomic groups. Default: \code{FALSE}
+#' @param rows (numeric) Any number from 1 to infinity. If the default NA, all
+#' rows are considered. Note that this parameter is ignored if you pass in a
+#' taxonomic id of any of the acceptable classes: tsn, colid.
+#' @param ... Further args passed on to \code{itis_downstream},
+#' \code{col_downstream}, \code{gbif_downstream}, or \code{ncbi_downstream}
 #'
-#' @return A named list of data.frames with the downstream names of every supplied taxa.
-#' You get an NA if there was no match in the database.
+#' @return A named list of data.frames with the downstream names of every
+#' supplied taxa. You get an NA if there was no match in the database.
 #'
-#' @export
 #' @examples \dontrun{
 #' # Plug in taxon IDs
 #' ## col Ids have to be character, as they are alphanumeric IDs
-#' downstream("015be25f6b061ba517f495394b80f108", db = "col", downto = "species")
+#' downstream("015be25f6b061ba517f495394b80f108", db = "col",
+#'   downto = "species")
 #' ## ITIS tsn ids can be numeric or character
 #' downstream("154395", db = "itis", downto = "species")
 #' downstream(154395, db = "itis", downto = "species")
@@ -40,6 +45,7 @@
 #' # Plug in taxon names
 #' downstream("Insecta", db = 'col', downto = 'order')
 #' downstream("Apis", db = 'col', downto = 'species')
+#' downstream("Apis", db = 'ncbi', downto = 'species')
 #' downstream("Apis", db = 'itis', downto = 'species')
 #' downstream(c("Apis","Epeoloides"), db = 'itis', downto = 'species')
 #' downstream(c("Apis","Epeoloides"), db = 'col', downto = 'species')
@@ -50,7 +56,8 @@
 #' id <- get_colid("Apis")
 #' downstream(id, downto = 'species')
 #'
-#' ## Equivalently, plug in the call to get the id via e.g., get_colid into downstream
+#' ## Equivalently, plug in the call to get the id via e.g., get_colid
+#' ## into downstream
 #' identical(downstream(id, downto = 'species'),
 #'          downstream(get_colid("Apis"), downto = 'species'))
 #'
@@ -85,6 +92,8 @@
 #' downstream("Poa", db = 'col', downto="species")
 #' downstream("Poa", db = 'col', downto="species", rows=1)
 #'
+#' downstream("Poa", db = 'ncbi', downto="species")
+#'
 #' # use curl options
 #' res <- downstream("Apis", db = 'col', downto = 'species', config=verbose())
 #' res <- downstream("Apis", db = 'itis', downto = 'species', config=verbose())
@@ -96,24 +105,34 @@ downstream <- function(...){
 
 #' @export
 #' @rdname downstream
-downstream.default <- function(x, db = NULL, downto = NULL, intermediate = FALSE, rows=NaN, ...) {
+downstream.default <- function(x, db = NULL, downto = NULL,
+                               intermediate = FALSE, rows=NA, ...) {
   nstop(downto, "downto")
   nstop(db)
   switch(
     db,
     itis = {
       id <- process_stream_ids(x, db, get_tsn, rows = rows, ...)
-      setNames(downstream(id, downto = tolower(downto), intermediate = intermediate, ...), x)
+      stats::setNames(downstream(id, downto = tolower(downto),
+                                 intermediate = intermediate, ...), x)
     },
     col = {
       id <- process_stream_ids(x, db, get_colid, rows = rows, ...)
-      setNames(downstream(id, downto = tolower(downto), intermediate = intermediate, ...), x)
+      stats::setNames(downstream(id, downto = tolower(downto),
+                                 intermediate = intermediate, ...), x)
     },
     gbif = {
       id <- process_stream_ids(x, db, get_gbifid, rows = rows, ...)
-      setNames(downstream(id, downto = tolower(downto), intermediate = intermediate, ...), x)
+      stats::setNames(downstream(id, downto = tolower(downto),
+                                 intermediate = intermediate, ...), x)
+    },
+    ncbi = {
+      id <- process_stream_ids(x, db, get_uid, rows = rows, ...)
+      stats::setNames(downstream(id, downto = tolower(downto),
+                                 intermediate = intermediate, ...), x)
     },
-    stop("the provided db value was not recognised", call. = FALSE)
+    stop("the provided db value was not recognised/is not supported",
+         call. = FALSE)
   )
 }
 
@@ -129,13 +148,15 @@ process_stream_ids <- function(input, db, fxn, ...){
 
 #' @export
 #' @rdname downstream
-downstream.tsn <- function(x, db = NULL, downto = NULL, intermediate = FALSE, ...) {
+downstream.tsn <- function(x, db = NULL, downto = NULL,
+                           intermediate = FALSE, ...) {
   fun <- function(y, downto, intermediate, ...){
     # return NA if NA is supplied
     if (is.na(y)) {
       NA
     } else {
-		  itis_downstream(tsns = y, downto = downto, intermediate = intermediate, ...)
+		  itis_downstream(tsns = y, downto = downto,
+		                  intermediate = intermediate, ...)
     }
   }
   out <- lapply(x, fun, downto = downto, intermediate = intermediate, ...)
@@ -144,7 +165,8 @@ downstream.tsn <- function(x, db = NULL, downto = NULL, intermediate = FALSE, ..
 
 #' @export
 #' @rdname downstream
-downstream.colid <- function(x, db = NULL, downto = NULL, intermediate = FALSE, ...) {
+downstream.colid <- function(x, db = NULL, downto = NULL,
+                             intermediate = FALSE, ...) {
   fun <- function(y, downto, intermediate, ...){
     # return NA if NA is supplied
     if (is.na(y)) {
@@ -159,13 +181,15 @@ downstream.colid <- function(x, db = NULL, downto = NULL, intermediate = FALSE,
 
 #' @export
 #' @rdname downstream
-downstream.gbifid <- function(x, db = NULL, downto = NULL, intermediate = FALSE, ...) {
+downstream.gbifid <- function(x, db = NULL, downto = NULL,
+                              intermediate = FALSE, ...) {
   fun <- function(y, downto, intermediate, ...){
     # return NA if NA is supplied
     if (is.na(y)) {
       NA
     } else {
-      gbif_downstream(key = y, downto = downto, intermediate = intermediate, ...)
+      gbif_downstream(key = y, downto = downto,
+                      intermediate = intermediate, ...)
     }
   }
   out <- lapply(x, fun, downto = downto, intermediate = intermediate, ...)
@@ -174,7 +198,25 @@ downstream.gbifid <- function(x, db = NULL, downto = NULL, intermediate = FALSE,
 
 #' @export
 #' @rdname downstream
-downstream.ids <- function(x, db = NULL, downto = NULL, intermediate = FALSE, ...) {
+downstream.uid <- function(x, db = NULL, downto = NULL,
+                              intermediate = FALSE, ...) {
+  fun <- function(y, downto, intermediate, ...){
+    # return NA if NA is supplied
+    if (is.na(y)) {
+      NA
+    } else {
+      ncbi_downstream(id = y, downto = downto,
+                      intermediate = intermediate, ...)
+    }
+  }
+  out <- lapply(x, fun, downto = downto, intermediate = intermediate, ...)
+  structure(out, class = 'downstream', db = 'ncbi')
+}
+
+#' @export
+#' @rdname downstream
+downstream.ids <- function(x, db = NULL, downto = NULL,
+                           intermediate = FALSE, ...) {
   fun <- function(y, downto, intermediate, ...){
     # return NA if NA is supplied
     if (is.na(y)) {
@@ -183,7 +225,8 @@ downstream.ids <- function(x, db = NULL, downto = NULL, intermediate = FALSE, ..
       downstream(y, downto = downto, intermediate = intermediate, ...)
     }
   }
-  structure(lapply(x, fun, downto = downto, intermediate = intermediate, ...), class = 'downstream_ids')
+  structure(lapply(x, fun, downto = downto, intermediate = intermediate, ...),
+            class = 'downstream_ids')
 }
 
 simp <- function(x) if (length(x) == 1) x[[1]] else x
diff --git a/R/eol_search.R b/R/eol_search.R
index 5df1d71..fa03fdf 100644
--- a/R/eol_search.R
+++ b/R/eol_search.R
@@ -19,7 +19,17 @@
 #' @param ... Curl options passed on to \code{\link[httr]{GET}}
 #' @details It's possible to return JSON or XML with the EOL API. However,
 #' 		this function only returns JSON for now.
-#' @return A data frame.
+#' @return A data frame with four columns:
+#' \itemize{
+#'  \item pageid: pageid, this is the same as the eolid you can get from
+#'  \code{\link{get_eolid}}
+#'  \item name: taxonomic name, may or may not contain the taxonomic
+#'  authority
+#'  \item link: URL for the taxon in question
+#'  \item content: a string of semi-colon separated names. it's not clear
+#'  to us what these represent exactly, but figured why not give it to users
+#'  in case some may find it useful
+#' }
 #' @examples \dontrun{
 #' eol_search(terms='Homo')
 #' eol_search(terms='Salix')
@@ -31,11 +41,11 @@ eol_search <- function(terms, page=1, exact=NULL, filter_tid=NULL,
 
 	key <- getkey(key, "eolApiKey")
 	query <- gsub("\\s", "+", terms)
-  args <- tc(list(q=query,page=page,exact=exact,
-                  filter_by_taxon_concept_id=filter_tid,
-                  filter_by_hierarchy_entry_id=filter_heid,
-                  filter_by_string=filter_by_string,
-                  cache_ttl=cache_ttl, key = key))
+  args <- tc(list(q = query, page = page, exact = exact,
+                  filter_by_taxon_concept_id = filter_tid,
+                  filter_by_hierarchy_entry_id = filter_heid,
+                  filter_by_string = filter_by_string,
+                  cache_ttl = cache_ttl, key = key))
   tt <- GET(paste0(eol_url("search"), ".json"), query = argsnull(args), ...)
   warn_for_status(tt)
   stopifnot(tt$headers$`content-type`[1] == 'application/json; charset=utf-8')
@@ -43,9 +53,10 @@ eol_search <- function(terms, page=1, exact=NULL, filter_tid=NULL,
   if (res$totalResults == 0 | length(res$results) == 0) {
     data.frame(pageid = NA, name = NA, stringsAsFactors = FALSE)
   } else {
-    tmp <- do.call(rbind.fill,
-                   lapply(res$results, data.frame,
-                          stringsAsFactors=FALSE))[,c('id','title')]
-    setNames(tmp, c("pageid", "name"))
+    tmp <- do.call(
+      "rbind.fill",
+      lapply(res$results, data.frame, stringsAsFactors = FALSE)
+    )
+    stats::setNames(tmp, c("pageid", "name", "link", "content"))
   }
 }
diff --git a/R/eubon.R b/R/eubon.R
index 972aa23..b7a2038 100644
--- a/R/eubon.R
+++ b/R/eubon.R
@@ -10,7 +10,7 @@
 #' obtained from the '/capabilities' service end point. Providers can be
 #' nested, that is a parent provider can have sub providers. If the id of the
 #' parent provider is supplied all subproviders will be queried. The query
-#' can also be restriced to one or more subproviders by using the following
+#' can also be restricted to one or more subproviders by using the following
 #' syntax: parent-id[sub-id-1,sub-id2,...]
 #' @param searchMode (character) Specifies the searchMode. Possible search
 #' modes are: scientificNameExact, scientificNameLike (begins with),
@@ -26,9 +26,9 @@
 #' on may cause a slightly increased response time. Default: \code{FALSE}
 #' @param timeout (numeric) The maximum of milliseconds to wait for responses
 #' from any of the providers. If the timeout is exceeded the service will just
-#' return the resonses that have been received so far. The default timeout is
+#' return the responses that have been received so far. The default timeout is
 #' 0 ms (wait for ever)
-#' @param dedup (character) Allows to deduplicate the resuls by making use of
+#' @param dedup (character) Allows to deduplicate the results by making use of
 #' a deduplication strategy. The deduplication is done by comparing
 #' specific properties of the taxon:
 #' \itemize{
diff --git a/R/eubon_capabilities.R b/R/eubon_capabilities.R
index c3397a1..5d042d3 100644
--- a/R/eubon_capabilities.R
+++ b/R/eubon_capabilities.R
@@ -1,4 +1,4 @@
-#' EUBON capabilites
+#' EUBON capabilities
 #'
 #' @export
 #' @param ... Curl options passed on to \code{\link[httr]{GET}}
diff --git a/R/eubon_children.R b/R/eubon_children.R
index 54a552b..772af74 100644
--- a/R/eubon_children.R
+++ b/R/eubon_children.R
@@ -9,11 +9,11 @@
 #' obtained from the '/capabilities' service end point. Providers can be
 #' nested, that is a parent provider can have sub providers. If the id of the
 #' parent provider is supplied all subproviders will be queried. The query
-#' can also be restriced to one or more subproviders by using the following
+#' can also be restricted to one or more subproviders by using the following
 #' syntax: parent-id[sub-id-1,sub-id2,...]
 #' @param timeout (numeric) The maximum of milliseconds to wait for responses
 #' from any of the providers. If the timeout is exceeded the service will just
-#' return the resonses that have been received so far. The default timeout is
+#' return the responses that have been received so far. The default timeout is
 #' 0 ms (wait for ever)
 #' @param ... Curl options passed on to \code{\link[httr]{GET}}
 #' @references \url{http://cybertaxonomy.eu/eu-bon/utis/1.2/doc.html}
diff --git a/R/eubon_hierarchy.R b/R/eubon_hierarchy.R
index 90fcf5b..6fd7d28 100644
--- a/R/eubon_hierarchy.R
+++ b/R/eubon_hierarchy.R
@@ -9,11 +9,11 @@
 #' obtained from the '/capabilities' service end point. Providers can be
 #' nested, that is a parent provider can have sub providers. If the id of the
 #' parent provider is supplied all subproviders will be queried. The query
-#' can also be restriced to one or more subproviders by using the following
+#' can also be restricted to one or more subproviders by using the following
 #' syntax: parent-id[sub-id-1,sub-id2,...]
 #' @param timeout (numeric) The maximum of milliseconds to wait for responses
 #' from any of the providers. If the timeout is exceeded the service will just
-#' return the resonses that have been received so far. The default timeout is
+#' return the responses that have been received so far. The default timeout is
 #' 0 ms (wait for ever)
 #' @param ... Curl options passed on to \code{\link[httr]{GET}}
 #' @references \url{http://cybertaxonomy.eu/eu-bon/utis/1.2/doc.html}
diff --git a/R/gbif_downstream.R b/R/gbif_downstream.R
index 92456c7..8d3cf87 100644
--- a/R/gbif_downstream.R
+++ b/R/gbif_downstream.R
@@ -5,9 +5,9 @@
 #' @param downto The taxonomic level you want to go down to. See examples below.
 #' 		The taxonomic level IS case sensitive, and you do have to spell it
 #' 		correctly. See \code{data(rank_ref)} for spelling.
-#' @param intermediate (logical) If TRUE, return a list of length two with target
-#'    taxon rank names, with additional list of data.frame's of intermediate
-#'    taxonomic groups. Default: FALSE
+#' @param intermediate (logical) If TRUE, return a list of length two with
+#' target taxon rank names, with additional list of data.frame's of
+#' intermediate taxonomic groups. Default: FALSE
 #' @param ... Further args passed on to \code{\link{gbif_name_usage}}
 #' @return Data.frame of taxonomic information downstream to family from e.g.,
 #' 		Order, Class, etc., or if \code{intermediated=TRUE}, list of length two,
@@ -18,7 +18,7 @@
 #' gbif_downstream(key = 198, downto="genus")
 #' gbif_downstream(key = 198, downto="genus", intermediate=TRUE)
 #'
-#' # get families downstream from the family Strepsiptera (twisted wing parasites)
+#' # families downstream from the family Strepsiptera (twisted wing parasites)
 #' gbif_downstream(key = 1227, "family")
 #' ## here, intermediate leads to the same result as the target
 #' gbif_downstream(key = 1227, "family", intermediate=TRUE)
@@ -39,7 +39,8 @@ gbif_downstream <- function(key, downto, intermediate = FALSE, ...) {
   should_be('intermediate', intermediate, 'logical')
 
   downto <- tolower(downto)
-  poss_ranks <- unique(do.call(c, sapply(rank_ref$ranks, strsplit, split = ",", USE.NAMES = FALSE)))
+  poss_ranks <- unique(do.call(c, sapply(rank_ref$ranks, strsplit, split = ",",
+                                         USE.NAMES = FALSE)))
   downto <- match.arg(downto, choices = poss_ranks)
   torank <- sapply(rank_ref[which_rank(downto), "ranks"],
                    function(x) strsplit(x, ",")[[1]][[1]], USE.NAMES = FALSE)
@@ -51,8 +52,8 @@ gbif_downstream <- function(key, downto, intermediate = FALSE, ...) {
   iter <- 0
   while (stop_ == "not") {
     iter <- iter + 1
-    temp <- ldply(key, function(x) gbif_name_usage_clean(x, ...))
-    tt <- ldply(temp$key, function(x) gbif_name_usage_children(x, ...))
+    temp <- ldply(key, function(x) gbif_name_usage_clean(x))
+    tt <- ldply(temp$key, function(x) gbif_name_usage_children(x))
     tt <- prune_too_low(tt, downto)
 
     if (NROW(tt) == 0) {
@@ -60,7 +61,8 @@ gbif_downstream <- function(key, downto, intermediate = FALSE, ...) {
       stop_ <- "nodata"
     } else {
       if (intermediate) intermed[[iter]] <- tt
-      if (NROW(tt[tt$rank == downto, ]) > 0) out[[iter]] <- tt[tt$rank == downto, ]
+      if (NROW(tt[tt$rank == downto, ]) > 0)
+        out[[iter]] <- tt[tt$rank == downto, ]
       if (NROW(tt[!tt$rank == downto, ]) > 0) {
         notout <- tt[!tt$rank %in% torank, ]
       } else {
@@ -85,12 +87,6 @@ gbif_downstream <- function(key, downto, intermediate = FALSE, ...) {
   }
 }
 
-prune_too_low <- function(x, rank) {
-  rank_target_no <- as.numeric(rank_ref[which_rank(rank), "rankid"])
-  rank_nos <- as.numeric(rank_ref[vapply(x$rank, function(z) which_rank(z), 1), "rankid"])
-  x[!rank_nos > rank_target_no, ]
-}
-
 gbif_name_usage_clean <- function(x, ...) {
   tt <- gbif_name_usage(x, ...)
   tt <- tt[sapply(tt, length) != 0]
diff --git a/R/genbank2uid.R b/R/genbank2uid.R
index a5b4c5d..b1dfac2 100644
--- a/R/genbank2uid.R
+++ b/R/genbank2uid.R
@@ -4,8 +4,15 @@
 #' @param id A GenBank accession alphanumeric string, or a gi numeric string.
 #' @param batch_size The number of queries to submit at a time.
 #' @param ... Curl args passed on to \code{\link[httr]{GET}}
-#' @details See \url{http://www.ncbi.nlm.nih.gov/Sitemap/sequenceIDs.html} for help on why
-#' there are two identifiers, and the difference between them.
+#' @details See \url{http://www.ncbi.nlm.nih.gov/Sitemap/sequenceIDs.html} for
+#' help on why there are two identifiers, and the difference between them.
+#'
+#' Note that if you pass in > 1 item, if one or more of your items is not
+#' found, the entire batch will return \code{NA}'s. To get around this,
+#' set \code{batch_size = 1} - so each is sent separtaely to NCBI.
+#' However, this of course is much slower than the default, which is to send
+#' up to 100 at a time.
+#' @return one or more NCBI taxonomic IDs
 #' @examples \dontrun{
 #' # with accession numbers
 #' genbank2uid(id = 'AJ748748')
@@ -27,35 +34,65 @@
 #' library('httr')
 #' genbank2uid(id = 156446673, config=verbose())
 #' }
-genbank2uid <- function(id, batch_size = 100, ...){
+genbank2uid <- function(id, batch_size = 100, ...) {
+  assert(batch_size, c("integer", "numeric"))
   process_batch <- function(id, ...) {
-    id <- gsub(pattern = "\\.[0-9]+$", "", id) #removes version number of accession ids
-    url2 <- paste0(ncbi_base(), "/entrez/eutils/elink.fcgi?dbfrom=nucleotide&db=taxonomy&id=")
+    #removes version number of accession ids
+    id <- gsub(pattern = "\\.[0-9]+$", "", id)
+    url2 <- paste0(
+      ncbi_base(),
+      "/entrez/eutils/elink.fcgi?dbfrom=nucleotide&db=taxonomy&id=")
     query <- paste0(url2, paste(id, collapse = "&id="))
     res <- GET(query, ...)
     stop_for_status(res)
-    result <- xml_text(xml_find_all(read_xml(con_utf8(res)), "//LinkSetDb//Link[position()=1]//Id"))
-    if (length(result) != length(id)) {
-      result <- rep(as.character(NA), length(id))
+    result <- xml_text(xml_find_all(read_xml(con_utf8(res)),
+                                    "//LinkSetDb//Link//Id"))
+    if (length(result) > length(id)) {
+      url3 <- paste0(
+        ncbi_base(),
+        "/entrez/eutils/esummary.fcgi?db=taxonomy&id=")
+      query <- paste0(url3, paste(result, collapse = ","))
+      res <- GET(query, ...)
+      stop_for_status(res)
+      nn <- xml_find_all(read_xml(con_utf8(res)), "//eSummaryResult//DocSum")
+      result <- lapply(nn, function(z) {
+        list(
+          name = xml_text(xml_find_all(z, "Item[@Name=\"ScientificName\"]")),
+          id = xml_text(xml_find_all(z, "Item[@Name=\"TaxId\"]"))
+        )
+      })
+    }
+    if (length(result) < length(id)) {
+      result <- rep(NA_character_, length(id))
     }
     Sys.sleep(0.34) # NCBI limits requests to three per second
     return(result)
   }
   batches <- split(id, ceiling(seq_along(id) / batch_size))
   result <- lapply(batches, function(x) map_unique(x, process_batch, ...))
-  result <- as.uid(unname(unlist(result)))
-  matched <- rep("found", length(result))
-  matched[is.na(result)] <- "not found"
-  attr(result, "match") <- matched
+
+  if (!is.null(names(result[[1]][[1]]))) {
+    result <- lapply(result[[1]], function(z) {
+      m <- rep("found", length(z$id))
+      m[is.na(z$id)] <- "not found"
+      f <- as.uid(z$id, check = FALSE)
+      attr(f, "match") <- m
+      attr(f, "name") <- z$name
+      f
+    })
+  } else {
+    result <- as.uid(unname(unlist(result)))
+    matched <- rep("found", length(result))
+    matched[is.na(result)] <- "not found"
+    attr(result, "match") <- matched
+  }
 
   if (any(is.na(result))) {
-    warning("An error occured looking up taxon ID(s).")
+    warning("An error occurred looking up taxon ID(s).")
     if (batch_size > 1 && length(id) > 1) {
       warning("NOTE: This function looks up IDs in batches to save time. However, the way that NCBI has implemented the API we use makes it so we cannot tell which IDs failed when a batch failed. Therefore, as few as one ID could be invalid yet still cause the whole batch to be NA. To identify the invalid IDs, set the 'batch_size' option to 1 and rerun the command.")
     }
   }
-
-
   return(result)
 }
 
@@ -64,20 +101,19 @@ is_acc <- function(x){
   is.na(gg)
 }
 
-#===================================================================================================
+#=====================================================================
 # get indexes of a unique set of the input
 unique_mapping <- function(input) {
   unique_input <- unique(input)
   vapply(input, function(x) which(x == unique_input), numeric(1))
 }
 
-
-#===================================================================================================
+#=====================================================================
 # run a function on unique values of a iterable
 map_unique <- function(input, func, ...) {
   input_class <- class(input)
-  unique_input = unique(input)
+  unique_input <- unique(input)
   class(unique_input) <- input_class
-  func(unique_input, ...)[unique_mapping(input)]
+  func(unique_input, ...)
+  # func(unique_input, ...)[unique_mapping(input)]
 }
-
diff --git a/R/get-id-details.R b/R/get-id-details.R
new file mode 100644
index 0000000..8f941fb
--- /dev/null
+++ b/R/get-id-details.R
@@ -0,0 +1,70 @@
+#' @title Details on \code{get_*()} functions
+#' @description Including outputs from \code{get_*()} functions, as well as
+#' their attributes, and all exception behaviors.
+#'
+#' @name get_id_details
+#'
+#' @details This document applies to the following functions:
+#' \itemize{
+#'  \item \code{\link{get_boldid}}
+#'  \item \code{\link{get_colid}}
+#'  \item \code{\link{get_eolid}}
+#'  \item \code{\link{get_gbifid}}
+#'  \item \code{\link{get_ids}}
+#'  \item \code{\link{get_iucn}}
+#'  \item \code{\link{get_natservid}}
+#'  \item \code{\link{get_nbnid}}
+#'  \item \code{\link{get_tolid}}
+#'  \item \code{\link{get_tpsid}}
+#'  \item \code{\link{get_tsn}}
+#'  \item \code{\link{get_ubioid}}
+#'  \item \code{\link{get_uid}}
+#'  \item \code{\link{get_wiki}}
+#'  \item \code{\link{get_wormsid}}
+#' }
+#'
+#' @section attributes:
+#' Each output from \code{get_*()} functions have the following attributes:
+#'
+#' \itemize{
+#'  \item \emph{match} (character) - the reason for NA, either 'not found',
+#'  'found' or if \code{ask = FALSE} then 'NA due to ask=FALSE')
+#'  \item \emph{multiple_matches} (logical) - Whether multiple matches were
+#'  returned by the data source. This can be \code{TRUE}, even if you get 1
+#'  name back because we try to pattern match the name to see if there's any
+#'  direct matches. So sometimes this attribute is \code{TRUE}, as well as
+#'  \code{pattern_match}, which then returns 1 resulting name without user
+#'  prompt.
+#'  \item \emph{pattern_match} (logical) - Whether a pattern match was made.
+#'  If \code{TRUE} then \code{multiple_matches} must be \code{TRUE}, and we
+#'  found a perfect match to your name, ignoring case. If \code{FALSE},
+#'  there wasn't a direct match, and likely you need to pick from many choices
+#'  or further parameters can be used to limit results
+#'  \item \emph{uri} (character) - The URI where more information can be
+#'  read on the taxon - includes the taxonomic identifier in the URL somewhere.
+#'  This may be missing if the value returned is \code{NA}
+#' }
+#'
+#' @section exceptions:
+#' The following are the various ways in which \code{get_*()} functions
+#' behave:
+#'
+#' \itemize{
+#'  \item success - the value returned is a character string or numeric
+#'  \item no matches found - you'll get an NA, refine your search or
+#'  possible the taxon searched for does not exist in the database you're
+#'  using
+#'  \item more than on match and ask = FALSE - if there's more than one
+#'  matching result, and you have set \code{ask = FALSE}, then we can't
+#'  determine the single match to return, so we give back \code{NA}.
+#'  However, in this case we do set the \code{match} attribute to say
+#'  \code{NA due to ask=FALSE & > 1 result} so it's very clear what
+#'  happened - and you can even programatically check this as well
+#'  \item NA due to some other reason - some \code{get_*()} functions
+#'  have additional parameters for filtering taxa. It's possible that even
+#'  though there's results (that is, \code{found} will say \code{TRUE}),
+#'  you can get back an NA. This is most likely if the parameter filters
+#'  taxa after they are returned from the data provider and the value passed
+#'  to the parameter leads to no matches.
+#' }
+NULL
diff --git a/R/get_boldid.R b/R/get_boldid.R
index ee41ad8..ccfbeec 100644
--- a/R/get_boldid.R
+++ b/R/get_boldid.R
@@ -4,10 +4,10 @@
 #' @export
 #' @param searchterm character; A vector of common or scientific names.
 #' @param fuzzy (logical) Whether to use fuzzy search or not (default: FALSE).
-#' @param dataTypes (character) Specifies the datatypes that will be returned. See Details for
-#' options.
-#' @param includeTree (logical) If TRUE (default: FALSE), returns a list containing information
-#' for parent taxa as well as the specified taxon.
+#' @param dataTypes (character) Specifies the datatypes that will be returned.
+#' See \code{\link{bold_search}} for options.
+#' @param includeTree (logical) If TRUE (default: FALSE), returns a list
+#' containing information for parent taxa as well as the specified taxon.
 #' @param ask logical; should get_tsn be run in interactive mode?
 #' If TRUE and more than one TSN is found for teh species, the user is asked for
 #' input. If FALSE NA is returned for multiple matches.
@@ -102,30 +102,28 @@
 #' get_boldid_("Osmia", fuzzy=TRUE, rows=1:5)
 #' get_boldid_("Osmia", fuzzy=TRUE, rows=1)
 #' get_boldid_(c("Osmi","Aga"), fuzzy=TRUE, rows = 1:3)
-#'
-#' # Curl options
-#' library("httr")
-#' get_boldid(searchterm = "Agapostemon", config=verbose())
-#' get_boldid(searchterm = "Agapostemon", config=progress())
-#'
-#' # use curl options
-#' library("httr")
-#' get_boldid("Agapostemon", config=verbose())
-#' bb <- get_boldid("Agapostemon", config=progress())
 #' }
 
-get_boldid <- function(searchterm, fuzzy = FALSE, dataTypes = 'basic', includeTree = FALSE,
-                       ask = TRUE, verbose = TRUE, rows = NA, rank = NULL,
-                       division = NULL, parent = NULL, ...)
-{
-  fun <- function(x, ask, verbose, rows)
-  {
+get_boldid <- function(searchterm, fuzzy = FALSE, dataTypes = 'basic',
+                       includeTree = FALSE, ask = TRUE, verbose = TRUE,
+                       rows = NA, rank = NULL, division = NULL,
+                       parent = NULL, ...) {
+
+  assert(ask, "logical")
+  assert(verbose, "logical")
+  assert(fuzzy, "logical")
+  assert(dataTypes, "character")
+  assert(includeTree, "logical")
+  assert(rank, "character")
+  assert(division, "character")
+  assert(parent, "character")
+
+  fun <- function(x, ask, verbose, rows) {
     direct <- FALSE
     mssg(verbose, "\nRetrieving data for taxon '", x, "'\n")
     bold_df <- bold_search(name = x, fuzzy = fuzzy,
                            dataTypes = dataTypes, includeTree = includeTree, ...)
     mm <- NROW(bold_df) > 1
-    #bold_df <- sub_rows(bold_df, rows)
 
     if (!class(bold_df) == "data.frame") {
       boldid <- NA_character_
@@ -165,31 +163,32 @@ get_boldid <- function(searchterm, fuzzy = FALSE, dataTypes = 'basic', includeTr
               att <- 'not found'
             }
           } else {
+            direct <- FALSE
             boldid <- NA_character_
             att <- 'found'
           }
         }
         # multiple matches
         if (any(
-          nrow(bold_df) > 1 & is.na(boldid) |
-          nrow(bold_df) > 1 & att == "found" & length(boldid) > 1
+          nrow(bold_df) > 1 && is.na(boldid) |
+          nrow(bold_df) > 1 && att == "found" && length(boldid) > 1
         )) {
-          if (ask) {
-            names(bold_df)[grep('^taxon$', names(bold_df))] <- "target"
+          names(bold_df)[grep('^taxon$', names(bold_df))] <- "target"
 
-            if (!is.null(division) || !is.null(parent) || !is.null(rank)) {
-              bold_df <- filt(bold_df, "division", division)
-              bold_df <- filt(bold_df, "parent", parent)
-              bold_df <- filt(bold_df, "rank", rank)
-            }
+          if (!is.null(division) || !is.null(parent) || !is.null(rank)) {
+            bold_df <- filt(bold_df, "division", division)
+            bold_df <- filt(bold_df, "parent", parent)
+            bold_df <- filt(bold_df, "rank", rank)
+          }
 
-            bold_df <- sub_rows(bold_df, rows)
-            boldid <- id <- bold_df$taxid
-            if (length(id) == 1) {
-              direct <- TRUE
-              att <- "found"
-            }
+          bold_df <- sub_rows(bold_df, rows)
+          boldid <- id <- bold_df$taxid
+          if (length(id) == 1) {
+            direct <- TRUE
+            att <- "found"
+          }
 
+          if (ask) {
             # user prompt
             bold_df <- bold_df[order(bold_df$target), ]
             rownames(bold_df) <- 1:nrow(bold_df)
@@ -215,8 +214,17 @@ get_boldid <- function(searchterm, fuzzy = FALSE, dataTypes = 'basic', includeTr
               }
             }
           } else {
-            boldid <- NA_character_
-            att <- "NA due to ask=FALSE"
+            if (length(boldid) == 1) {
+              att <- "found"
+            } else {
+              warning(
+                sprintf("More than one boldid found for taxon '%s'; refine query or set ask=TRUE",
+                        x),
+                call. = FALSE
+              )
+              boldid <- NA_character_
+              att <- 'NA due to ask=FALSE & > 1 result'
+            }
           }
         }
       }
diff --git a/R/get_colid.R b/R/get_colid.R
index b0a8ece..7f3df0c 100644
--- a/R/get_colid.R
+++ b/R/get_colid.R
@@ -111,20 +111,28 @@ get_colid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA,
                       kingdom = NULL, phylum = NULL, class = NULL, order = NULL,
                       family = NULL, rank = NULL, ...){
 
+  assert(ask, "logical")
+  assert(verbose, "logical")
+  assert(kingdom, "character")
+  assert(phylum, "character")
+  assert(class, "character")
+  assert(order, "character")
+  assert(family, "character")
+  assert(rank, "character")
+
   fun <- function(sciname, ask, verbose, rows, ...) {
     direct <- FALSE
     mssg(verbose, "\nRetrieving data for taxon '", sciname, "'\n")
     df <- col_search(name = sciname, response = "full", ...)[[1]]
     df <- df[, names(df) %in% c("name","rank","id","name_status","kingdom","family","acc_name")]
     mm <- NROW(df) > 1
-    #df <- sub_rows(df, rows)
 
     rank_taken <- NA
     if (NROW(df) == 0) {
       id <- NA_character_
       att <- "not found"
     } else {
-      df <- setNames(df, tolower(names(df)))
+      df <- stats::setNames(df, tolower(names(df)))
       df <- rename(df, c("id" = "colid"))
       colnames(df)[which(colnames(df) == 'id')] <- 'colid'
       id <- df$colid
@@ -140,28 +148,28 @@ get_colid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA,
     }
     # more than one found -> user input
     if (length(id) > 1) {
-      if (ask) {
-        rownames(df) <- 1:nrow(df)
+      rownames(df) <- 1:nrow(df)
 
-        if (!is.null(kingdom) || !is.null(phylum) || !is.null(class) ||
-            !is.null(order) || !is.null(family) || !is.null(rank)) {
-          df <- filt(df, "kingdom", kingdom)
-          df <- filt(df, "phylum", phylum)
-          df <- filt(df, "class", class)
-          df <- filt(df, "order", order)
-          df <- filt(df, "family", family)
-          df <- filt(df, "rank", rank)
-        }
+      if (!is.null(kingdom) || !is.null(phylum) || !is.null(class) ||
+          !is.null(order) || !is.null(family) || !is.null(rank)) {
+        df <- filt(df, "kingdom", kingdom)
+        df <- filt(df, "phylum", phylum)
+        df <- filt(df, "class", class)
+        df <- filt(df, "order", order)
+        df <- filt(df, "family", family)
+        df <- filt(df, "rank", rank)
+      }
 
-        df <- sub_rows(df, rows)
-        id <- df$colid
-        if (length(id) == 1) {
-          rank_taken <- as.character(df$rank)
-          direct <- TRUE
-          att <- "found"
-        }
+      df <- sub_rows(df, rows)
+      id <- df$colid
+      if (length(id) == 1) {
+        rank_taken <- as.character(df$rank)
+        direct <- TRUE
+        att <- "found"
+      }
 
-        if (length(id) > 1) {
+      if (length(id) > 1) {
+        if (ask) {
           # prompt
           rownames(df) <- 1:nrow(df)
           message("\n\n")
@@ -185,10 +193,17 @@ get_colid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA,
             att <- "not found"
             mssg(verbose, "\nReturned 'NA'!\n\n")
           }
+        } else {
+          if (length(id) != 1) {
+            warning(
+              sprintf("More than one id found for taxon '%s'; refine query or set ask=TRUE",
+                      sciname),
+              call. = FALSE
+            )
+            id <- NA_character_
+            att <- 'NA due to ask=FALSE & > 1 result'
+          }
         }
-      } else{
-        id <- NA_character_
-        att <- "NA due to ask=FALSE"
       }
     }
     list(id = id, rank = rank_taken, att = att, multiple = mm, direct = direct)
diff --git a/R/get_eolid.R b/R/get_eolid.R
index 23cb2b4..97ed9d4 100644
--- a/R/get_eolid.R
+++ b/R/get_eolid.R
@@ -93,6 +93,8 @@
 get_eolid <- function(sciname, ask = TRUE, verbose = TRUE, key = NULL,
                       rows = NA, ...){
 
+  assert(ask, "logical")
+  assert(verbose, "logical")
   fun <- function(sciname, ask, verbose, rows, ...) {
     direct <- FALSE
     mssg(verbose, "\nRetrieving data for taxon '", sciname, "'\n")
@@ -186,10 +188,17 @@ get_eolid <- function(sciname, ask = TRUE, verbose = TRUE, key = NULL,
           att <- 'not found'
           mssg(verbose, "\nReturned 'NA'!\n\n")
         }
-      } else{
-        id <- NA_character_
-        page_id <- NA_character_
-        att <- "NA due to ask=FALSE"
+      } else {
+        if (length(id) != 1) {
+          warning(
+            sprintf("More than one eolid found for taxon '%s'; refine query or set ask=TRUE",
+                    sciname),
+            call. = FALSE
+          )
+          id <- NA_character_
+          page_id <- NA_character_
+          att <- 'NA due to ask=FALSE & > 1 result'
+        }
       }
     }
     list(id = as.character(id), page_id = page_id, source = datasource,
diff --git a/R/get_gbifid.R b/R/get_gbifid.R
index f31bfe9..04fca67 100644
--- a/R/get_gbifid.R
+++ b/R/get_gbifid.R
@@ -122,6 +122,15 @@ get_gbifid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA,
                        phylum = NULL, class = NULL, order = NULL,
                        family = NULL, rank = NULL, method = "backbone", ...) {
 
+  assert(ask, "logical")
+  assert(verbose, "logical")
+  assert(phylum, "character")
+  assert(class, "character")
+  assert(order, "character")
+  assert(family, "character")
+  assert(rank, "character")
+  assert(method, "character")
+
   fun <- function(sciname, ask, verbose, rows, ...) {
     direct <- FALSE
     mssg(verbose, "\nRetrieving data for taxon '", sciname, "'\n")
@@ -131,7 +140,6 @@ get_gbifid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA,
       lookup = gbif_name_lookup(sciname, ...)
     )
     mm <- NROW(df) > 1
-    #df <- sub_rows(df, rows)
 
     if (is.null(df)) df <- data.frame(NULL)
 
@@ -160,35 +168,37 @@ get_gbifid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA,
         id <- as.character(matchtmp)
         direct <- TRUE
       } else {
-        if (ask) {
-          if (!is.null(phylum) || !is.null(class) || !is.null(order) ||
-              !is.null(family) || !is.null(rank)) {
-            df <- filt(df, "phylum", phylum)
-            df <- filt(df, "class", class)
-            df <- filt(df, "order", order)
-            df <- filt(df, "family", family)
-            df <- filt(df, "rank", rank)
-          }
+        if (!is.null(phylum) || !is.null(class) || !is.null(order) ||
+            !is.null(family) || !is.null(rank)) {
+          df <- filt(df, "phylum", phylum)
+          df <- filt(df, "class", class)
+          df <- filt(df, "order", order)
+          df <- filt(df, "family", family)
+          df <- filt(df, "rank", rank)
+        }
 
-          df <- sub_rows(df, rows)
-          if (NROW(df) == 0) {
-            id <- NA_character_
-            att <- "not found"
-          } else {
-            id <- df$gbifid
-            if (length(id) == 1) {
-              rank_taken <- as.character(df$rank)
-              att <- "found"
-            }
+        df <- sub_rows(df, rows)
+        if (NROW(df) == 0) {
+          id <- NA_character_
+          att <- "not found"
+        } else {
+          id <- df$gbifid
+          if (length(id) == 1) {
+            rank_taken <- as.character(df$rank)
+            att <- "found"
           }
+        }
 
-          if (length(id) > 1) {
+        if (length(id) > 1) {
+          if (ask) {
             # limit to subset of columns for ease of use
-            df <- df[, switch(method, backbone = gbif_cols_show_backbone, lookup = gbif_cols_show_lookup)]
+            df <- df[, switch(method,
+                              backbone = gbif_cols_show_backbone,
+                              lookup = gbif_cols_show_lookup)]
 
             # prompt
             message("\n\n")
-            message("\nMore than one eolid found for taxon '", sciname, "'!\n
+            message("\nMore than one GBIF ID found for taxon '", sciname, "'!\n
             Enter rownumber of taxon (other inputs will return 'NA'):\n")
             rownames(df) <- 1:nrow(df)
             print(df)
@@ -200,7 +210,8 @@ get_gbifid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA,
             }
             if (take %in% seq_len(nrow(df))) {
               take <- as.numeric(take)
-              message("Input accepted, took gbifid '", as.character(df$gbifid[take]), "'.\n")
+              message("Input accepted, took gbifid '",
+                      as.character(df$gbifid[take]), "'.\n")
               id <- as.character(df$gbifid[take])
               att <- "found"
             } else {
@@ -208,10 +219,17 @@ get_gbifid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA,
               att <- "not found"
               mssg(verbose, "\nReturned 'NA'!\n\n")
             }
+          } else {
+            if (length(id) != 1) {
+              warning(
+                sprintf("More than one GBIF ID found for taxon '%s'; refine query or set ask=TRUE",
+                        sciname),
+                call. = FALSE
+              )
+              id <- NA_character_
+              att <- 'NA due to ask=FALSE & > 1 result'
+            }
           }
-        } else {
-          id <- NA_character_
-          att <- "NA due to ask=FALSE"
         }
       }
     }
diff --git a/R/get_iucn.R b/R/get_iucn.R
new file mode 100644
index 0000000..aa39e01
--- /dev/null
+++ b/R/get_iucn.R
@@ -0,0 +1,175 @@
+#' Get a IUCN Redlist taxon
+#'
+#' @export
+#' @param x (character) A vector of common or scientific names
+#' @param verbose logical; should progress be printed?
+#' @param key (character) required. you IUCN Redlist API key. See
+#' \code{\link[rredlist]{rredlist-package}} for help on authenticating with
+#' IUCN Redlist
+#' @param check (logical) Check if ID matches any existing on the DB, only
+#' used in \code{\link{as.iucn}}
+#' @param ... Ignored
+#'
+#' @return A vector of taxonomic identifiers as an S3 class.
+#'
+#' Comes with the following attributes:
+#' \itemize{
+#'  \item \emph{match} (character) - the reason for NA, either 'not found',
+#'  'found' or if \code{ask = FALSE} then 'NA due to ask=FALSE')
+#'  \item \emph{name} (character) - the taxonomic name, which is needed in
+#'  \code{\link{synonyms}} and \code{\link{sci2comm}} methods since they
+#'  internally use \pkg{rredlist} functions which require the taxonomic name,
+#'  and not the taxonomic identifier
+#'  \item \emph{uri} (character) - The URI where more information can be
+#'  read on the taxon - includes the taxonomic identifier in the URL somewhere
+#' }
+#'
+#' \emph{multiple_matches} and \emph{pattern_match} do not apply here as in
+#' other \code{get_*} methods since there is no IUCN Redlist search,
+#' so you either get a match or you do not get a match.
+#'
+#' @details There is no underscore method, because there's no real
+#' search for IUCN, that is, where you search for a string, and get back
+#' a bunch of results due to fuzzy matching. If that exists in the future
+#' we'll add an underscore method here.
+#'
+#' IUCN ids only work with \code{\link{synonyms}} and \code{\link{sci2comm}}
+#' methods.
+#'
+#' @family taxonomic-ids
+#'
+#' @examples \dontrun{
+#' get_iucn(x = "Branta canadensis")
+#' get_iucn(x = "Branta bernicla")
+#' get_iucn(x = "Panthera uncia")
+#'
+#' # as coercion
+#' as.iucn(22732)
+#' as.iucn("22732")
+#' (res <- as.iucn(c(22679946, 22732, 22679935)))
+#' data.frame(res)
+#' as.iucn(data.frame(res))
+#' }
+get_iucn <- function(x, verbose = TRUE, key = NULL, ...) {
+
+  assert(x, "character")
+  assert(verbose, "logical")
+
+  fun <- function(x, verbose, key, ...) {
+    direct <- FALSE
+    mssg(verbose, "\nRetrieving data for taxon '", x, "'\n")
+    df <- rredlist::rl_search(x, key = key, ...)
+
+    if (!inherits(df$result, "data.frame") || NROW(df$result) == 0) {
+      id <- NA_character_
+      att <- "not found"
+    } else {
+      df <- df$result[, c("taxonid", "scientific_name", "kingdom",
+                   "phylum", "order", "family", "genus", "authority")]
+
+      # should return NA if species not found
+      if (NROW(df) == 0) {
+        mssg(verbose, tx_msg_not_found)
+        id <- NA_character_
+        att <- 'not found'
+      }
+
+      # check for direct match
+      direct <- match(tolower(df$scientific_name), tolower(x))
+
+      if (!all(is.na(direct))) {
+        id <- df$taxonid[!is.na(direct)]
+        direct <- TRUE
+        att <- 'found'
+      } else {
+        direct <- FALSE
+        id <- df$taxonid
+        att <- 'found'
+      }
+      # multiple matches not possible because no real search
+    }
+
+    data.frame(
+      id = id,
+      name = x,
+      att = att,
+      stringsAsFactors = FALSE)
+  }
+  outd <- ldply(x, fun, verbose = verbose, key = key, ...)
+  out <- outd$id
+  attr(out, 'match') <- outd$att
+  attr(out, 'name') <- outd$name
+  if ( !all(is.na(out)) ) {
+    attr(out, 'uri') <- sprintf("http://www.iucnredlist.org/details/%s/0", out)
+  }
+  class(out) <- "iucn"
+  return(out)
+}
+
+#' @export
+#' @rdname get_iucn
+as.iucn <- function(x, check = TRUE, key = NULL) {
+  UseMethod("as.iucn")
+}
+
+#' @export
+#' @rdname get_iucn
+as.iucn.iucn <- function(x, check = TRUE, key = NULL) x
+
+#' @export
+#' @rdname get_iucn
+as.iucn.character <- function(x, check = TRUE, key = NULL) {
+  if (length(x) == 1) {
+    make_iucn(x, check, key = key)
+  } else {
+    collapse(x, make_iucn, "iucn", check = check, key = key)
+  }
+}
+
+#' @export
+#' @rdname get_iucn
+as.iucn.list <- function(x, check = TRUE, key = NULL) {
+  if (length(x) == 1) {
+    make_iucn(x, check)
+  } else {
+    collapse(x, make_iucn, "iucn", check = check)
+  }
+}
+
+#' @export
+#' @rdname get_iucn
+as.iucn.numeric <- function(x, check=TRUE, key = NULL) {
+  as.iucn(as.character(x), check, key = key)
+}
+
+#' @export
+#' @rdname get_iucn
+as.iucn.data.frame <- function(x, check=TRUE, key = NULL) {
+  structure(x$ids, class = "iucn", match = x$match,
+            name = x$name, uri = x$uri)
+}
+
+#' @export
+#' @rdname get_iucn
+as.data.frame.iucn <- function(x, ...){
+  data.frame(ids = unclass(x),
+             class = "iucn",
+             name = attr(x, "name"),
+             match = attr(x, "match"),
+             uri = attr(x, "uri"),
+             stringsAsFactors = FALSE)
+}
+
+make_iucn <- function(x, check = TRUE, key = NULL) {
+  url <- 'http://www.iucnredlist.org/details/%s/0'
+  make_iucn_generic(x, uu = url, clz = "iucn", check, key)
+}
+
+check_iucn <- function(x) {
+  tt <- httr::GET(sprintf("http://www.iucnredlist.org/details/%s/0", x))
+  tt$status_code == 200
+}
+
+check_iucn_getname <- function(x, key = NULL) {
+  rredlist::rl_search(id = as.numeric(x), key = key)
+}
diff --git a/R/get_natservid.R b/R/get_natservid.R
index 1a768ce..6a85829 100644
--- a/R/get_natservid.R
+++ b/R/get_natservid.R
@@ -39,7 +39,7 @@
 #' }
 #'
 #' See \code{\link{Startup}} for information on how to create/find your
-#' .Rrofile and .Renviron files
+#' .Rprofile and .Renviron files
 #'
 #' @examples \dontrun{
 #' (x <- get_natservid("Helianthus annuus"))
@@ -90,14 +90,14 @@
 #' get_natservid_("Ruby*", rows=1:3)
 #' }
 get_natservid <- function(query, searchtype = "scientific", ask = TRUE,
-                          verbose = TRUE, rows = NaN, key = NULL, ...) {
+                          verbose = TRUE, rows = NA, key = NULL, ...) {
 
+  assert(ask, "logical")
   assert(searchtype, "character")
   assert(ask, "logical")
   assert(verbose, "logical")
-  assert(rows, c("numeric", "integer"))
 
-  fun <- function(x, searchtype, ask, verbose, key, ...) {
+  fun <- function(x, searchtype, ask, verbose, key, rows, ...) {
     direct <- FALSE
     mssg(verbose, "\nRetrieving data for taxon '", x, "'\n")
 
@@ -136,21 +136,28 @@ get_natservid <- function(query, searchtype = "scientific", ask = TRUE,
         names(nsdf)[grep(searchtype, names(nsdf))] <- "target"
         direct <- match(tolower(nsdf$target), tolower(x))
 
-        if (!all(is.na(direct))) {
-          nsid <- nsdf$id[!is.na(direct)]
-          direct <- TRUE
-          att <- 'found'
+        if (length(direct) == 1) {
+          if (!all(is.na(direct))) {
+            nsid <- nsdf$id[!is.na(direct)]
+            direct <- TRUE
+            att <- 'found'
+          } else {
+            direct <- FALSE
+            nsid <- NA_character_
+            att <- 'not found'
+          }
         } else {
           direct <- FALSE
           nsid <- NA_character_
-          att <- 'not found'
+          att <- 'NA due to ask=FALSE & no direct match found'
+          warning("> 1 result; no direct match found", call. = FALSE)
         }
       }
 
       # multiple matches
       if (any(
-        nrow(nsdf) > 1 && is.na(nsid) |
-        nrow(nsdf) > 1 && att == "found" & length(nsid) > 1
+        nrow(nsdf) > 1 && is.na(nsid) ||
+        nrow(nsdf) > 1 && att == "found" && length(nsid) > 1
       )) {
         if (ask) {
           names(nsdf)[grep(searchtype, names(nsdf))] <- "target"
@@ -181,8 +188,15 @@ get_natservid <- function(query, searchtype = "scientific", ask = TRUE,
             att <- 'not found'
           }
         } else {
-          nsid <- NA_character_
-          att <- "NA due to ask=FALSE"
+          if (length(nsid) != 1) {
+            warning(
+              sprintf("More than one NatureServe ID found for taxon '%s'; refine query or set ask=TRUE",
+                      x),
+              call. = FALSE
+            )
+            nsid <- NA_character_
+            att <- 'NA due to ask=FALSE & > 1 result'
+          }
         }
       }
 
@@ -196,7 +210,8 @@ get_natservid <- function(query, searchtype = "scientific", ask = TRUE,
       stringsAsFactors = FALSE)
   }
   query <- as.character(query)
-  outd <- ldply(query, fun, searchtype, ask, verbose, key, ...)
+  outd <- ldply(query, fun, searchtype = searchtype, ask = ask,
+                verbose = verbose, key = key, rows = rows, ...)
   out <- outd$nsid
   attr(out, 'match') <- outd$att
   attr(out, 'multiple_matches') <- outd$multiple
@@ -258,7 +273,7 @@ check_natservid <- function(x){
 
 #' @export
 #' @rdname get_natservid
-get_natservid_ <- function(query, verbose = TRUE, rows = NaN, key = NULL, ...) {
+get_natservid_ <- function(query, verbose = TRUE, rows = NA, key = NULL, ...) {
   stats::setNames(
     lapply(query, get_natservid_help, verbose = verbose, rows = rows,
            key = key, ...),
diff --git a/R/get_nbnid.R b/R/get_nbnid.R
index 4ed3bcc..76e96a8 100644
--- a/R/get_nbnid.R
+++ b/R/get_nbnid.R
@@ -7,22 +7,28 @@
 #' input. If FALSE NA is returned for multiple matches.
 #' @param verbose logical; If TRUE the actual taxon queried is printed on the
 #' console.
-#' @param rec_only (logical) If \code{TRUE} ids of recommended names are returned (i.e.
-#' synonyms are removed). Defaults to \code{FALSE}. Remember, the id of a synonym is a
-#' taxa with 'recommended' name status.
-#' @param rank (character) If given, we attempt to limit the results to those taxa with the
-#' matching rank.
-#' @param rows numeric; Any number from 1 to infinity. If the default NA, all rows are considered.
-#' Note that this function still only gives back a nbnid class object with one to many identifiers.
-#' See \code{\link[taxize]{get_nbnid_}} to get back all, or a subset, of the raw data that you are
-#' presented during the ask process.
+#' @param rec_only (logical) If \code{TRUE} ids of recommended names are
+#' returned (i.e. synonyms are removed). Defaults to \code{FALSE}. Remember,
+#' the id of a synonym is a taxa with 'recommended' name status.
+#' @param rank (character) If given, we attempt to limit the results to those
+#' taxa with the matching rank.
+#' @param rows numeric; Any number from 1 to infinity. If the default NA, all
+#' rows are considered. Note that this function still only gives back a nbnid
+#' class object with one to many identifiers. See
+#' \code{\link[taxize]{get_nbnid_}} to get back all, or a subset, of the raw
+#' data that you are presented during the ask process.
 #' @param ... Further args passed on to \code{nbn_search}
 #' @param x Input to \code{\link{as.nbnid}}
-#' @param check logical; Check if ID matches any existing on the DB, only used in
-#' \code{\link{as.nbnid}}
+#' @param check logical; Check if ID matches any existing on the DB, only
+#' used in \code{\link{as.nbnid}}
 #' @template getreturn
 #'
+#' @references <https://api.nbnatlas.org/>
+#' @return an object of class nbnid, a light wrapper around a character
+#' string that is the taxonomic ID - includes attributes with relavant
+#' metadata
 #' @family taxonomic-ids
+#' @family nbn
 #' @seealso \code{\link[taxize]{classification}}
 #'
 #' @author Scott Chamberlain, \email{myrmecocystus@@gmail.com}
@@ -52,13 +58,17 @@
 #' as.nbnid(get_nbnid("Zootoca vivipara")) # already a nbnid, returns the same
 #' as.nbnid(get_nbnid(c("Zootoca vivipara","Pinus contorta"))) # same
 #' as.nbnid('NHMSYS0001706186') # character
-#' as.nbnid(c("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867")) # character vector, length > 1
-#' as.nbnid(list("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867")) # list
+#' # character vector, length > 1
+#' as.nbnid(c("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867"))
+#' # list
+#' as.nbnid(list("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867"))
 #' ## dont check, much faster
 #' as.nbnid('NHMSYS0001706186', check=FALSE)
-#' as.nbnid(list("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867"), check=FALSE)
+#' as.nbnid(list("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867"),
+#'   check=FALSE)
 #'
-#' (out <- as.nbnid(c("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867")))
+#' (out <- as.nbnid(c("NHMSYS0001706186","NHMSYS0000494848",
+#'   "NBNSYS0000010867")))
 #' data.frame(out)
 #' as.nbnid( data.frame(out) )
 #'
@@ -74,25 +84,33 @@
 #' bb <- get_nbnid("Quercus douglasii", config=progress())
 #' }
 
-get_nbnid <- function(name, ask = TRUE, verbose = TRUE, rec_only = FALSE, rank = NULL, rows = NA, ...){
+get_nbnid <- function(name, ask = TRUE, verbose = TRUE, rec_only = FALSE,
+                      rank = NULL, rows = NA, ...){
+
+  assert(ask, "logical")
+  assert(rec_only, "logical")
+  assert(rank, "character")
+  assert(verbose, "logical")
+
   fun <- function(name, ask, verbose, rows) {
     direct <- FALSE
     mssg(verbose, "\nRetrieving data for taxon '", name, "'\n")
-    df <- nbn_search(q = name, all = TRUE, ...)$data
-    if (is.null(df)) df <- data.frame(NULL)
+    df <- nbn_search(q = name, rows = 500, ...)$data
+    if (is.null(df) || length(df) == 0) df <- data.frame(NULL)
     mm <- NROW(df) > 1
-    # df <- sub_rows(df, rows)
 
     rank_taken <- NA
-    if (nrow(df) == 0) {
-      mssg(verbose, "Not found. Consider checking the spelling or alternate classification")
+    if (NROW(df) == 0) {
+      mssg(
+        verbose,
+        "Not found. Consider checking the spelling or alternate classification")
       id <- NA_character_
       att <- 'not found'
     } else {
-      if (rec_only) df <- df[ df$namestatus == 'Recommended', ]
+      if (rec_only) df <- df[ df$taxonomicStatus == 'accepted', ]
       if (!is.null(rank)) df <- df[ tolower(df$rank) == tolower(rank), ]
       df <- sub_rows(df, rows)
-      df <- df[,c('ptaxonversionkey','searchmatchtitle','rank','namestatus')]
+      df <- df[,c('guid', 'scientificName', 'rank', 'taxonomicStatus')]
       names(df)[1] <- 'nbnid'
       id <- df$nbnid
       rank_taken <- as.character(df$rank)
@@ -101,17 +119,19 @@ get_nbnid <- function(name, ask = TRUE, verbose = TRUE, rec_only = FALSE, rank =
 
     # not found on NBN
     if (length(id) == 0) {
-      mssg(verbose, "Not found. Consider checking the spelling or alternate classification")
+      mssg(
+        verbose,
+        "Not found. Consider checking the spelling or alternate classification")
       id <- NA_character_
       att <- 'not found'
     }
     # more than one found -> user input
     if (length(id) > 1) {
       if (ask) {
-        rownames(df) <- 1:nrow(df)
+        rownames(df) <- seq_len(NROW(df))
         # prompt
         message("\n\n")
-        message("\nMore than one nbnid found for taxon '", name, "'!\n
+        message("\nMore than one NBN ID found for taxon '", name, "'!\n
             Enter rownumber of taxon (other inputs will return 'NA'):\n")
         print(df)
         take <- scan(n = 1, quiet = TRUE, what = 'raw')
@@ -122,7 +142,8 @@ get_nbnid <- function(name, ask = TRUE, verbose = TRUE, rec_only = FALSE, rank =
         }
         if (take %in% seq_len(nrow(df))) {
           take <- as.numeric(take)
-          message("Input accepted, took nbnid '", as.character(df$nbnid[take]), "'.\n")
+          message("Input accepted, took nbnid '",
+                  as.character(df$nbnid[take]), "'.\n")
           id <- as.character(df$nbnid[take])
           rank_taken <- as.character(df$rank[take])
           att <- 'found'
@@ -132,8 +153,15 @@ get_nbnid <- function(name, ask = TRUE, verbose = TRUE, rec_only = FALSE, rank =
           mssg(verbose, "\nReturned 'NA'!\n\n")
         }
       } else{
-        id <- NA_character_
-        att <- 'NA due to ask=FALSE'
+        if (length(id) != 1) {
+          warning(
+            sprintf("More than one NBN ID found for taxon '%s'; refine query or set ask=TRUE",
+                    name),
+            call. = FALSE
+          )
+          id <- NA_character_
+          att <- 'NA due to ask=FALSE & > 1 result'
+        }
       }
     }
     list(id = id, rank = rank_taken, att = att, multiple = mm, direct = direct)
@@ -148,7 +176,7 @@ get_nbnid <- function(name, ask = TRUE, verbose = TRUE, rec_only = FALSE, rank =
   if ( !all(is.na(ids)) ) {
     urls <- sapply(out, function(z){
       if (!is.na(z[['id']]))
-        sprintf('https://data.nbn.org.uk/Taxa/%s', z[['id']])
+        sprintf('https://species.nbnatlas.org/species/%s', z[['id']])
       else
         NA
     })
@@ -167,23 +195,35 @@ as.nbnid.nbnid <- function(x, check=TRUE) x
 
 #' @export
 #' @rdname get_nbnid
-as.nbnid.character <- function(x, check=TRUE) if(length(x) == 1) make_nbnid(x, check) else collapse(x, make_nbnid, "nbnid", check=check)
+as.nbnid.character <- function(x, check=TRUE) {
+  if (length(x) == 1) {
+    make_nbnid(x, check)
+  } else {
+    collapse(x, make_nbnid, "nbnid", check = check)
+  }
+}
 
 #' @export
 #' @rdname get_nbnid
-as.nbnid.list <- function(x, check=TRUE) if(length(x) == 1) make_nbnid(x, check) else collapse(x, make_nbnid, "nbnid", check=check)
+as.nbnid.list <- function(x, check=TRUE) {
+  if (length(x) == 1) {
+    make_nbnid(x, check)
+  } else {
+    collapse(x, make_nbnid, "nbnid", check = check)
+  }
+}
 
 #' @export
 #' @rdname get_nbnid
 as.nbnid.data.frame <- function(x, check=TRUE) {
-  structure(x$ids, class="nbnid", match=x$match,
+  structure(x$ids, class = "nbnid", match = x$match,
             multiple_matches = x$multiple_matches,
-            pattern_match = x$pattern_match, uri=x$uri)
+            pattern_match = x$pattern_match, uri = x$uri)
 }
 
 #' @export
 #' @rdname get_nbnid
-as.data.frame.nbnid <- function(x, ...){
+as.data.frame.nbnid <- function(x, ...) {
   data.frame(ids = as.character(unclass(x)),
              class = "nbnid",
              match = attr(x, "match"),
@@ -193,18 +233,22 @@ as.data.frame.nbnid <- function(x, ...){
              stringsAsFactors = FALSE)
 }
 
-make_nbnid <- function(x, check=TRUE) make_generic(x, 'https://data.nbn.org.uk/Taxa/%s', "nbnid", check)
+make_nbnid <- function(x, check=TRUE) {
+  make_generic(x, 'https://species.nbnatlas.org/species/%s', "nbnid", check)
+}
 
 check_nbnid <- function(x){
-  url <- "https://data.nbn.org.uk/api/taxa/"
+  url <- "https://species-ws.nbnatlas.org/species/"
   res <- GET(paste0(url, x))
   if ( res$status_code == 200 ) TRUE else FALSE
 }
 
 #' @export
 #' @rdname get_nbnid
-get_nbnid_ <- function(name, verbose = TRUE, rec_only = FALSE, rank = NULL, rows = NA, ...){
-  setNames(lapply(name, get_nbnid_help, verbose = verbose, rec_only = rec_only, rank = rank, rows = rows, ...), name)
+get_nbnid_ <- function(name, verbose = TRUE, rec_only = FALSE, rank = NULL,
+                       rows = NA, ...) {
+  stats::setNames(lapply(name, get_nbnid_help, verbose = verbose,
+                  rec_only = rec_only, rank = rank, rows = rows, ...), name)
 }
 
 get_nbnid_help <- function(name, verbose, rec_only, rank, rows, ...){
@@ -215,9 +259,9 @@ get_nbnid_help <- function(name, verbose, rec_only, rank, rows, ...){
   if (NROW(df) == 0) {
     NULL
   } else {
-    if (rec_only) df <- df[ df$nameStatus == 'Recommended', ]
+    if (rec_only) df <- df[ df$taxonomicStatus == 'accepted', ]
     if (!is.null(rank)) df <- df[ df$rank == rank, ]
-    df <- df[,c('ptaxonversionkey', 'searchmatchtitle', 'rank', 'namestatus')]
+    df <- df[,c('guid', 'scientificName', 'rank', 'taxonomicStatus')]
     if (NROW(df) == 0) NULL else sub_rows(df, rows)
   }
 }
diff --git a/R/get_tolid.R b/R/get_tolid.R
index 4e5f318..696a750 100644
--- a/R/get_tolid.R
+++ b/R/get_tolid.R
@@ -68,7 +68,11 @@
 #' }
 
 get_tolid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA, ...) {
-  fun <- function(x, ask, verbose, ...) {
+
+  assert(ask, "logical")
+  assert(verbose, "logical")
+
+  fun <- function(x, ask, verbose, rows, ...) {
     mssg(verbose, "\nRetrieving data for taxon '", x, "'\n")
 
     tol_df <- tryCatch(tol_resolve(x, ...), error = function(e) e)
@@ -101,23 +105,23 @@ get_tolid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA, ...) {
           id <- as.character(matchtmp)
           direct <- TRUE
         } else {
-          if (ask) {
-            tol_df <- sub_rows(tol_df, rows)
-            if (NROW(tol_df) == 0) {
-              id <- NA_character_
-              att <- "not found"
-            } else {
-              id <- tol_df$ott_id
-              if (length(id) == 1) {
-                rank_taken <- tol_df$rank
-                att <- "found"
-              }
+          tol_df <- sub_rows(tol_df, rows)
+          if (NROW(tol_df) == 0) {
+            id <- NA_character_
+            att <- "not found"
+          } else {
+            id <- tol_df$ott_id
+            if (length(id) == 1) {
+              rank_taken <- tol_df$rank
+              att <- "found"
             }
+          }
 
-            if (length(id) > 1) {
+          if (length(id) > 1) {
+            if (ask) {
               # prompt
               message("\n\n")
-              message("\nMore than one tol ID found for taxon '", x, "'!\n
+              message("\nMore than one ToL ID found for taxon '", x, "'!\n
                       Enter rownumber of taxon (other inputs will return 'NA'):\n")
               rownames(tol_df) <- 1:nrow(tol_df)
               print(tol_df)
@@ -138,9 +142,17 @@ get_tolid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA, ...) {
                 mssg(verbose, "\nReturned 'NA'!\n\n")
               }
             }
-          } else {
-            id <- NA_character_
-            att <- "NA due to ask=FALSE"
+            else {
+              if (length(id) != 1) {
+                warning(
+                  sprintf("More than one ToL ID found for taxon '%s'; refine query or set ask=TRUE",
+                          x),
+                  call. = FALSE
+                )
+                id <- NA_character_
+                att <- 'NA due to ask=FALSE & > 1 result'
+              }
+            }
           }
         }
       }
@@ -154,7 +166,7 @@ get_tolid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA, ...) {
       stringsAsFactors = FALSE)
   }
   sciname <- as.character(sciname)
-  outd <- ldply(sciname, fun, ask, verbose, ...)
+  outd <- ldply(sciname, fun, ask, verbose, rows, ...)
   out <- outd$tol
   attr(out, 'match') <- outd$att
   attr(out, 'multiple_matches') <- outd$multiple
diff --git a/R/get_tpsid.R b/R/get_tpsid.R
index 6ceddf1..8bbf9aa 100644
--- a/R/get_tpsid.R
+++ b/R/get_tpsid.R
@@ -111,6 +111,12 @@
 
 get_tpsid <- function(sciname, ask = TRUE, verbose = TRUE, key = NULL, rows = NA,
                       family = NULL, rank = NULL, ...){
+
+  assert(ask, "logical")
+  assert(verbose, "logical")
+  assert(family, "character")
+  assert(rank, "character")
+
   fun <- function(sciname, ask, verbose, rows, ...) {
     direct <- FALSE
     mssg(verbose, "\nRetrieving data for taxon '", sciname, "'\n")
@@ -138,7 +144,6 @@ get_tpsid <- function(sciname, ask = TRUE, verbose = TRUE, key = NULL, rows = NA
     }
     # more than one found on tropicos -> user input
     if (length(id) > 1) {
-      if (ask) {
 
         if (!is.null(family) || !is.null(rank)) {
           df <- filt(df, "family", family)
@@ -154,34 +159,42 @@ get_tpsid <- function(sciname, ask = TRUE, verbose = TRUE, key = NULL, rows = NA
         }
 
         if (length(id) > 1) {
-          # prompt
-          rownames(df) <- 1:nrow(df)
-          message("\n\n")
-          message("\nMore than one tpsid found for taxon '", sciname, "'!\n
+          if (ask) {
+            # prompt
+            rownames(df) <- 1:nrow(df)
+            message("\n\n")
+            message("\nMore than one tpsid found for taxon '", sciname, "'!\n
           Enter rownumber of taxon (other inputs will return 'NA'):\n")
-          rownames(df) <- 1:nrow(df)
-          print(df)
-          take <- scan(n = 1, quiet = TRUE, what = 'raw')
+            rownames(df) <- 1:nrow(df)
+            print(df)
+            take <- scan(n = 1, quiet = TRUE, what = 'raw')
 
-          if (length(take) == 0) {
-            take <- 'notake'
-            att <- 'nothing chosen'
-          }
-          if (take %in% seq_len(nrow(df))) {
-            take <- as.numeric(take)
-            message("Input accepted, took tpsid '", as.character(df$tpsid[take]), "'.\n")
-            id <- as.character(df$tpsid[take])
-            att <- 'found'
+            if (length(take) == 0) {
+              take <- 'notake'
+              att <- 'nothing chosen'
+            }
+            if (take %in% seq_len(nrow(df))) {
+              take <- as.numeric(take)
+              message("Input accepted, took tpsid '", as.character(df$tpsid[take]), "'.\n")
+              id <- as.character(df$tpsid[take])
+              att <- 'found'
+            } else {
+              id <- NA_character_
+              mssg(verbose, "\nReturned 'NA'!\n\n")
+              att <- 'not found'
+            }
           } else {
-            id <- NA_character_
-            mssg(verbose, "\nReturned 'NA'!\n\n")
-            att <- 'not found'
+            if (length(id) != 1) {
+              warning(
+                sprintf("More than one tpsid found for taxon '%s'; refine query or set ask=TRUE",
+                        sciname),
+                call. = FALSE
+              )
+              id <- NA_character_
+              att <- 'NA due to ask=FALSE & > 1 result'
+            }
           }
         }
-      } else{
-        id <- NA_character_
-        att <- 'NA due to ask=FALSE'
-      }
     }
     list(id = as.character(id), att = att, multiple = mm, direct = direct)
   }
diff --git a/R/get_tsn.R b/R/get_tsn.R
index 6351cfe..be9d677 100644
--- a/R/get_tsn.R
+++ b/R/get_tsn.R
@@ -25,8 +25,8 @@
 #' @seealso \code{\link[taxize]{classification}}
 #'
 #' @examples \dontrun{
-#' get_tsn(searchterm = "Quercus douglasii")
-#' get_tsn(searchterm = "Chironomus riparius")
+#' get_tsn("Quercus douglasii")
+#' get_tsn("Chironomus riparius")
 #' get_tsn(c("Chironomus riparius","Quercus douglasii"))
 #' splist <- c("annona cherimola", 'annona muricata', "quercus robur",
 #' 		"shorea robusta", "pandanus patina", "oryza sativa", "durio zibethinus")
@@ -67,25 +67,23 @@
 #' get_tsn_("Arni", rows=1)
 #' get_tsn_("Arni", rows=1:2)
 #' get_tsn_(c("asdfadfasd","Pinus contorta"), rows=1:5)
-#'
-#' # use curl options
-#' library("httr")
-#' get_tsn("Quercus douglasii", config=verbose())
-#' bb <- get_tsn("Quercus douglasii", config=progress())
 #' }
 
-get_tsn <- function(searchterm, searchtype = "scientific", accepted = FALSE, ask = TRUE,
-  verbose = TRUE, rows = NA, ...)
-{
-  fun <- function(x, searchtype, ask, verbose, ...)
-  {
+get_tsn <- function(searchterm, searchtype = "scientific", accepted = FALSE,
+                    ask = TRUE, verbose = TRUE, rows = NA, ...) {
+
+  assert(ask, "logical")
+  assert(verbose, "logical")
+  assert(searchtype, "character")
+  assert(accepted, "logical")
+
+  fun <- function(x, searchtype, ask, verbose, rows, ...) {
     direct <- FALSE
     mssg(verbose, "\nRetrieving data for taxon '", x, "'\n")
 
     searchtype <- match.arg(searchtype, c("scientific", "common"))
     tsn_df <- ritis::terms(x, what = searchtype, ...)
     mm <- NROW(tsn_df) > 1
-    # tsn_df <- sub_rows(tsn_df, rows)
 
     if (!inherits(tsn_df, "tbl_df") || NROW(tsn_df) == 0) {
       tsn <- NA_character_
@@ -119,31 +117,39 @@ get_tsn <- function(searchterm, searchtype = "scientific", accepted = FALSE, ask
 
       # check for direct match
       if (nrow(tsn_df) > 1) {
+        tsn_df <- data.frame(tsn_df, stringsAsFactors = FALSE)
 
         names(tsn_df)[grep(searchtype, names(tsn_df))] <- "target"
         direct <- match(tolower(tsn_df$target), tolower(x))
 
-        if (!all(is.na(direct))) {
-          tsn <- tsn_df$tsn[!is.na(direct)]
-          direct <- TRUE
-          att <- 'found'
+        if (length(direct) == 1) {
+          if (!all(is.na(direct))) {
+            tsn <- tsn_df$tsn[!is.na(direct)]
+            direct <- TRUE
+            att <- 'found'
+          } else {
+            direct <- FALSE
+            tsn <- NA_character_
+            att <- 'not found'
+          }
         } else {
           direct <- FALSE
           tsn <- NA_character_
-          att <- 'not found'
+          att <- 'NA due to ask=FALSE & no direct match found'
+          warning("> 1 result; no direct match found", call. = FALSE)
         }
       }
 
       # multiple matches
       if (any(
         nrow(tsn_df) > 1 && is.na(tsn) |
-        nrow(tsn_df) > 1 && att == "found" & length(tsn) > 1
+        nrow(tsn_df) > 1 && att == "found" && length(tsn) > 1
       )) {
         if (ask) {
           names(tsn_df)[grep(searchtype, names(tsn_df))] <- "target"
           # user prompt
           tsn_df <- tsn_df[order(tsn_df$target), ]
-          #rownames(tsn_df) <- 1:NROW(tsn_df)
+          rownames(tsn_df) <- NULL
 
           # prompt
           message("\n\n")
@@ -167,8 +173,15 @@ get_tsn <- function(searchterm, searchtype = "scientific", accepted = FALSE, ask
             att <- 'not found'
           }
         } else {
-          tsn <- NA_character_
-          att <- "NA due to ask=FALSE"
+          if (length(tsn) != 1) {
+            warning(
+              sprintf("More than one tsn found for taxon '%s'; refine query or set ask=TRUE",
+                      x),
+              call. = FALSE
+            )
+            tsn <- NA_character_
+            att <- 'NA due to ask=FALSE & > 1 result'
+          }
         }
       }
 
@@ -182,7 +195,7 @@ get_tsn <- function(searchterm, searchtype = "scientific", accepted = FALSE, ask
       stringsAsFactors = FALSE)
   }
   searchterm <- as.character(searchterm)
-  outd <- ldply(searchterm, fun, searchtype, ask, verbose, ...)
+  outd <- ldply(searchterm, fun, searchtype, ask, verbose, rows, ...)
   out <- outd$tsn
   attr(out, 'match') <- outd$att
   attr(out, 'multiple_matches') <- outd$multiple
diff --git a/R/get_uid.R b/R/get_uid.R
index 813856c..3cf8b52 100644
--- a/R/get_uid.R
+++ b/R/get_uid.R
@@ -4,54 +4,57 @@
 #'
 #' @export
 #' @param sciname character; scientific name.
-#' @param ask logical; should get_uid be run in interactive mode?
-#' If TRUE and more than one TSN is found for the species, the user is asked for
-#' input. If FALSE NA is returned for multiple matches.
-#' @param verbose logical; If TRUE the actual taxon queried is printed on the console.
-#' @param rows numeric; Any number from 1 to infinity. If the default NA, all rows are considered.
-#' Note that this function still only gives back a uid class object with one to many identifiers.
-#' See \code{\link[taxize]{get_uid_}} to get back all, or a subset, of the raw data that you are
-#' presented during the ask process.
-#' @param modifier (character) A modifier to the \code{sciname} given. Options include:
-#' Organism, Scientific Name, Common Name, All Names, Division, Filter, Lineage, GC,
-#' MGC, Name Tokens, Next Level, PGC, Properties, Rank, Subtree, Synonym, Text Word.
-#' These are not checked, so make sure they are entered correctly, as is.
-#' @param rank_query (character) A taxonomic rank name to modify the query sent to NCBI.
-#' See \code{\link{rank_ref}} for possible options. Though note
-#' that some data sources use atypical ranks, so inspect the data itself for options.
-#' Optional. See \code{Querying} below.
-#' @param division_filter (character) A division (aka phylum) name to filter data after
-#' retrieved from NCBI. Optional. See \code{Filtering} below.
+#' @param ask logical; should get_uid be run in interactive mode? If TRUE and
+#'   more than one TSN is found for the species, the user is asked for input. If
+#'   FALSE NA is returned for multiple matches.
+#' @param verbose logical; If TRUE the actual taxon queried is printed on the
+#'   console.
+#' @param rows numeric; Any number from 1 to infinity. If the default NA, all
+#'   rows are considered. Note that this function still only gives back a uid
+#'   class object with one to many identifiers. See
+#'   \code{\link[taxize]{get_uid_}} to get back all, or a subset, of the raw
+#'   data that you are presented during the ask process.
+#' @param modifier (character) A modifier to the \code{sciname} given. Options
+#'   include: Organism, Scientific Name, Common Name, All Names, Division,
+#'   Filter, Lineage, GC, MGC, Name Tokens, Next Level, PGC, Properties, Rank,
+#'   Subtree, Synonym, Text Word. These are not checked, so make sure they are
+#'   entered correctly, as is.
+#' @param rank_query (character) A taxonomic rank name to modify the query sent
+#'   to NCBI. See \code{\link{rank_ref}} for possible options. Though note that
+#'   some data sources use atypical ranks, so inspect the data itself for
+#'   options. Optional. See \code{Querying} below.
+#' @param division_filter (character) A division (aka phylum) name to filter
+#'   data after retrieved from NCBI. Optional. See \code{Filtering} below.
 #' @param rank_filter (character) A taxonomic rank name to filter data after
-#' retrieved from NCBI. See \code{\link{rank_ref}} for possible options. Though note
-#' that some data sources use atypical ranks, so inspect the data itself for options.
-#' Optional. See \code{Filtering} below.
+#'   retrieved from NCBI. See \code{\link{rank_ref}} for possible options.
+#'   Though note that some data sources use atypical ranks, so inspect the data
+#'   itself for options. Optional. See \code{Filtering} below.
 #' @param x Input to \code{\link{as.uid}}
 #' @param ... Ignored
-#' @param check logical; Check if ID matches any existing on the DB, only used in
-#' \code{\link{as.uid}}
+#' @param check logical; Check if ID matches any existing on the DB, only used
+#'   in \code{\link{as.uid}}
 #' @template getreturn
 #'
-#' @section Querying:
-#' The parameter \code{rank_query} is used in the search sent to NCBI, whereas
-#' \code{rank_filter} filters data after it comes back. The parameter
-#' \code{modifier} adds modifiers to the name. For example, \code{modifier="Organism"}
-#' adds that to the name, giving e.g., \code{Helianthus[Organism]}.
+#' @section Querying: The parameter \code{rank_query} is used in the search sent
+#'   to NCBI, whereas \code{rank_filter} filters data after it comes back. The
+#'   parameter \code{modifier} adds modifiers to the name. For example,
+#'   \code{modifier="Organism"} adds that to the name, giving e.g.,
+#'   \code{Helianthus[Organism]}.
 #'
-#' @section Filtering:
-#' The parameters \code{division_filter} and \code{rank_filter} are not used in
-#' the search to the data provider, but are used in filtering the data down to a
-#' subset that is closer to the target you want. For all these parameters, you can
-#' use regex strings since we use \code{\link{grep}} internally to match.
-#' Filtering narrows down to the set that matches your query, and removes the rest.
+#' @section Filtering: The parameters \code{division_filter} and
+#'   \code{rank_filter} are not used in the search to the data provider, but are
+#'   used in filtering the data down to a subset that is closer to the target
+#'   you want. For all these parameters, you can use regex strings since we use
+#'   \code{\link{grep}} internally to match. Filtering narrows down to the set
+#'   that matches your query, and removes the rest.
 #'
-#' @section Beware:
-#' NCBI does funny things sometimes. E.g., if you search on Fringella morel, a slight
-#' misspelling of the genus name, and a non-existent epithet, NCBI gives back a morel
-#' fungal species. In addition, NCBI doesn't really do fuzzy searching very well, so if
-#' there is a slight mis-spelling in your names, you likely won't get what you are
-#' expecting. The lesson: clean your names before using this function. Other data
-#' sources are better about fuzzy matching.
+#' @section Beware: NCBI does funny things sometimes. E.g., if you search on
+#'   Fringella morel, a slight misspelling of the genus name, and a non-existent
+#'   epithet, NCBI gives back a morel fungal species. In addition, NCBI doesn't
+#'   really do fuzzy searching very well, so if there is a slight mis-spelling
+#'   in your names, you likely won't get what you are expecting. The lesson:
+#'   clean your names before using this function. Other data sources are better
+#'   about fuzzy matching.
 #'
 #' @family taxonomic-ids
 #' @seealso \code{\link[taxize]{classification}}
@@ -141,8 +144,16 @@
 #' bb <- get_uid("Quercus douglasii", config=progress())
 #' }
 
-get_uid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA, modifier = NULL,
-                    rank_query = NULL, division_filter = NULL, rank_filter = NULL, ...) {
+get_uid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA,
+                    modifier = NULL, rank_query = NULL,
+                    division_filter = NULL, rank_filter = NULL, ...) {
+
+  assert(ask, "logical")
+  assert(verbose, "logical")
+  assert(modifier, "character")
+  assert(rank_query, "character")
+  assert(division_filter, "character")
+  assert(rank_filter, "character")
 
   fun <- function(sciname, ask, verbose, rows, ...) {
     direct <- FALSE
@@ -164,43 +175,56 @@ get_uid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA, modifier = N
     if (length(uid) == 0) { # if taxon name is not found
       uid <- NA_character_
     } else {
-      #uid <- sub_vector(uid, rows)
       att <- 'found'
     }
+
     # not found on ncbi
     if (length(uid) == 0 || is.na(uid)) {
       mssg(verbose, "Not found. Consider checking the spelling or alternate classification")
       uid <- NA_character_
-      att <- 'not found'
+      att <- 'NA due to not found'
     }
     # more than one found on ncbi -> user input
     if (length(uid) > 1) {
-      if (ask) {
-        baseurl <- paste0(ncbi_base(), "/entrez/eutils/esummary.fcgi?db=taxonomy")
-        ID <- paste("ID=", paste(uid, collapse = ","), sep = "")
-        url <- paste(baseurl, ID, sep = "&")
-        errors_to_catch <- c("Could not resolve host: eutils.ncbi.nlm.nih.gov")
-        tt <- repeat_until_it_works(catch = errors_to_catch, url = url, ...)
-        ttp <- xml2::read_xml(tt)
-        df <- parse_ncbi(ttp)
-        rownames(df) <- 1:nrow(df)
+      baseurl <- paste0(ncbi_base(),
+                        "/entrez/eutils/esummary.fcgi?db=taxonomy")
+      ID <- paste("ID=", paste(uid, collapse = ","), sep = "")
+      url <- paste(baseurl, ID, sep = "&")
+      errors_to_catch <- c("Could not resolve host: eutils.ncbi.nlm.nih.gov")
+      tt <- repeat_until_it_works(catch = errors_to_catch, url = url, ...)
+      ttp <- xml2::read_xml(tt)
+      df <- parse_ncbi(ttp)
+      rownames(df) <- 1:nrow(df)
 
-        if (!is.null(division_filter) || !is.null(rank_filter)) {
-          df <- filt(df, "division", division_filter)
-          df <- filt(df, "rank", rank_filter)
-        }
+      if (!is.null(division_filter) || !is.null(rank_filter)) {
+        df <- filt(df, "division", division_filter)
+        df <- filt(df, "rank", rank_filter)
+      }
 
-        df <- sub_rows(df, rows)
-        uid <- df$uid
-        if (length(uid) == 1) {
-          direct <- TRUE
-          att <- "found"
-        }
-        if (length(uid) == 0) {
-          uid <- NA_character_
-        }
+      df <- sub_rows(df, rows)
+      uid <- df$uid
+      if (length(uid) == 1) {
+        direct <- TRUE
+        att <- "found"
+      }
+      if (length(uid) == 0) {
+        uid <- NA_character_
+      }
 
-        if (length(uid) > 1) {
+      if (length(uid) > 1) {
+        if (!ask) {
+          if (length(uid) == 1) {
+            att <- "found"
+          } else {
+            warning(
+              sprintf("More than one UID found for taxon '%s'; refine query or set ask=TRUE",
+                      sciname),
+              call. = FALSE
+            )
+            uid <- NA_character_
+            att <- 'NA due to ask=FALSE & > 1 result'
+          }
+        } else {
           # prompt
           rownames(df) <- 1:nrow(df)
           message("\n\n")
@@ -215,21 +239,20 @@ get_uid <- function(sciname, ask = TRUE, verbose = TRUE, rows = NA, modifier = N
           }
           if (take %in% seq_len(nrow(df))) {
             take <- as.numeric(take)
-            message("Input accepted, took UID '", as.character(df$uid[take]), "'.\n")
+            message("Input accepted, took UID '",
+                    as.character(df$uid[take]), "'.\n")
             uid <- as.character(df$uid[take])
             att <- 'found'
           } else {
             uid <- NA_character_
-            att <- 'not found'
+            att <- 'NA due to user input out of range'
             mssg(verbose, "\nReturned 'NA'!\n\n")
           }
         }
-      } else {
-        uid <- NA_character_
-        att <- 'NA due to ask=FALSE'
       }
     }
-    return(data.frame(uid, att, multiple = mm, direct = direct, stringsAsFactors = FALSE))
+    return(data.frame(uid, att, multiple = mm, direct = direct,
+                      stringsAsFactors = FALSE))
   }
   sciname <- as.character(sciname)
   outd <- ldply(sciname, fun, ask, verbose, rows, ...)
diff --git a/R/get_utils.R b/R/get_utils.R
new file mode 100644
index 0000000..93fa880
--- /dev/null
+++ b/R/get_utils.R
@@ -0,0 +1,50 @@
+make_generic <- function(x, uu, clz, check = TRUE) {
+  if (check) {
+    if ( evalfxn(clz)(x) ) {
+      toid(x, uu, clz)
+    } else {
+      structure(
+        NA, class = clz, match = "not found",
+        multiple_matches = FALSE, pattern_match = FALSE, uri = NA
+      )
+    }
+  } else {
+    toid(x, uu, clz)
+  }
+}
+
+make_iucn_generic <- function(x, uu, clz, check = TRUE, key = NULL) {
+  if (check) {
+    res <- check_iucn_getname(x, key = key)
+    if (length(res$result) != 0) {
+      toid(res$result$taxonid, uu, clz, name = res$result$scientific_name)
+    } else {
+      structure(
+        NA, class = clz, match = "not found",
+        multiple_matches = NA, pattern_match = NA, uri = NA,
+        name = NA
+      )
+    }
+  } else {
+    toid(x, uu, clz)
+  }
+}
+
+make_wiki_generic <- function(x, uu, clz, check = TRUE) {
+  if (check) {
+    if ( evalfxn(clz)(sprintf(uu, x)) ) {
+      toid(x, uu, clz)
+    } else {
+      structure(
+        NA, class = clz, match = "not found",
+        multiple_matches = FALSE, pattern_match = FALSE, uri = NA
+      )
+    }
+  } else {
+    toid(x, uu, clz)
+  }
+}
+
+# messages
+tx_msg_not_found <-
+  "Not found. Consider checking the spelling or alternate classification"
diff --git a/R/get_wiki.R b/R/get_wiki.R
new file mode 100644
index 0000000..6056217
--- /dev/null
+++ b/R/get_wiki.R
@@ -0,0 +1,303 @@
+#' Get the page name for a Wiki taxon
+#'
+#' @export
+#' @param x (character) A vector of common or scientific names.
+#' @param wiki_site (character) Wiki site. One of species (default), pedia,
+#' commons
+#' @param wiki (character) language. Default: en
+#' @param ask logical; should get_wiki be run in interactive mode?
+#' If \code{TRUE} and more than one wiki is found for the species, the user is
+#' asked for input. If \code{FALSE} NA is returned for multiple matches.
+#' @param verbose logical; should progress be printed?
+#' @param rows numeric; Any number from 1 to infinity. If the default NA, all
+#' rows are considered. Note that this function still only gives back a wiki
+#' class object with one to many identifiers. See
+#' \code{\link[taxize]{get_wiki_}} to get back all, or a subset, of the
+#' raw data that you are presented during the ask process.
+#' @param limit (integer) number of records to return
+#' @param ... Ignored
+#' @param check logical; Check if ID matches any existing on the DB, only
+#' used in \code{\link{as.wiki}}
+#' @template getreturn
+#'
+#' @details For \code{type = pedia}, we use the english language site by
+#' default. Set the \code{language} parameter for a different language site.
+#'
+#' @family taxonomic-ids
+#' @seealso \code{\link[taxize]{classification}}
+#'
+#' @examples \dontrun{
+#' get_wiki(x = "Quercus douglasii")
+#' get_wiki(x = "Quercu")
+#' get_wiki(x = "Quercu", "pedia")
+#' get_wiki(x = "Quercu", "commons")
+#'
+#' # diff. wikis with wikipedia
+#' get_wiki("Malus domestica", "pedia")
+#' get_wiki("Malus domestica", "pedia", "fr")
+#'
+#' # as coercion
+#' as.wiki("Malus_domestica")
+#' as.wiki("Malus_domestica", wiki_site = "commons")
+#' as.wiki("Malus_domestica", wiki_site = "pedia")
+#' as.wiki("Malus_domestica", wiki_site = "pedia", wiki = "fr")
+#' as.wiki("Malus_domestica", wiki_site = "pedia", wiki = "da")
+#' }
+
+get_wiki <- function(x, wiki_site = "species", wiki = "en", ask = TRUE,
+                     verbose = TRUE, limit = 100, rows = NA, ...) {
+
+  assert(ask, "logical")
+  assert(x, "character")
+  assert(wiki_site, "character")
+  assert(wiki, "character")
+  assert(verbose, "logical")
+
+  fun <- function(x, wiki_site, wiki, ask, verbose, limit, rows, ...) {
+    direct <- FALSE
+    mssg(verbose, "\nRetrieving data for taxon '", x, "'\n")
+    df <- switch(
+      wiki_site,
+      species = wikitaxa::wt_wikispecies_search(query = x, limit = limit, ...),
+      pedia = wikitaxa::wt_wikipedia_search(query = x, wiki = wiki,
+                                            limit = limit, ...),
+      commons = wikitaxa::wt_wikicommons_search(query = x, limit = limit, ...)
+    )$query$search
+    mm <- NROW(df) > 1
+
+    if (!inherits(df, "tbl_df") || NROW(df) == 0) {
+      id <- NA_character_
+      att <- "not found"
+    } else {
+      df <- df[, c("title", "size", "wordcount")]
+      df <- sub_rows(df, rows)
+
+      # should return NA if spec not found
+      if (NROW(df) == 0) {
+        mssg(verbose, tx_msg_not_found)
+        id <- NA_character_
+        att <- 'not found'
+      }
+
+      df$title <- gsub("\\s", "_", df$title)
+
+      # take the one wiki from data.frame
+      if (NROW(df) == 1) {
+        id <- df$title
+        att <- 'found'
+      }
+
+      # check for direct match
+      if (NROW(df) > 1) {
+        df <- data.frame(df, stringsAsFactors = FALSE)
+
+        direct <- match(tolower(df$title), gsub("\\s", "_", tolower(x)))
+
+        if (length(direct) == 1) {
+          if (!all(is.na(direct))) {
+            id <- df$title[!is.na(direct)]
+            direct <- TRUE
+            att <- 'found'
+          } else {
+            direct <- FALSE
+            id <- NA_character_
+            att <- 'not found'
+          }
+        } else {
+          direct <- FALSE
+          id <- NA_character_
+          att <- 'NA due to ask=FALSE & no direct match found'
+          warning("> 1 result; no direct match found", call. = FALSE)
+        }
+      }
+
+      # multiple matches
+      if (any(
+        NROW(df) > 1 && is.na(id) |
+        NROW(df) > 1 && att == "found" && length(id) > 1
+      )) {
+        if (ask) {
+          # user prompt
+          df <- df[order(df$title), ]
+          rownames(df) <- NULL
+
+          # prompt
+          message("\n\n")
+          print(df)
+          message("\nMore than one wiki ID found for taxon '", x, "'!\n
+                  Enter rownumber of taxon (other inputs will return 'NA'):\n")
+          take <- scan(n = 1, quiet = TRUE, what = 'raw')
+
+          if (length(take) == 0) {
+            take <- 'notake'
+            att <- 'nothing chosen'
+          }
+          if (take %in% seq_len(nrow(df))) {
+            take <- as.numeric(take)
+            message("Input accepted, took taxon '",
+                    as.character(df$title[take]), "'.\n")
+            id <-  df$title[take]
+            att <- 'found'
+          } else {
+            id <- NA_character_
+            mssg(verbose, "\nReturned 'NA'!\n\n")
+            att <- 'not found'
+          }
+        } else {
+          if (length(id) != 1) {
+            warning(
+              sprintf("More than one wiki ID found for taxon '%s'; refine query or set ask=TRUE",
+                      x),
+              call. = FALSE
+            )
+            id <- NA_character_
+            att <- 'NA due to ask=FALSE & > 1 result'
+          }
+        }
+      }
+
+    }
+
+    data.frame(
+      id = id,
+      att = att,
+      multiple = mm,
+      direct = direct,
+      stringsAsFactors = FALSE)
+  }
+  outd <- ldply(x, fun, wiki_site, wiki, ask, verbose, limit, rows, ...)
+  out <- outd$id
+  attr(out, 'match') <- outd$att
+  attr(out, 'multiple_matches') <- outd$multiple
+  attr(out, 'pattern_match') <- outd$direct
+  attr(out, 'wiki_site') <- wiki_site
+  attr(out, 'wiki_lang') <- wiki
+  if ( !all(is.na(out)) ) {
+    zz <- gsub("\\s", "_", na.omit(out))
+    base_url <- switch(
+      wiki_site,
+      species = 'https://species.wikimedia.org/wiki/',
+      pedia = sprintf('https://%s.wikipedia.org/wiki/', wiki),
+      commons = 'https://commons.wikimedia.org/wiki/'
+    )
+    attr(out, 'uri') <- paste0(base_url, zz)
+  }
+  class(out) <- "wiki"
+  return(out)
+}
+
+#' @export
+#' @rdname get_wiki
+as.wiki <- function(x, check=TRUE, wiki_site = "species", wiki = "en") {
+  UseMethod("as.wiki")
+}
+
+#' @export
+#' @rdname get_wiki
+as.wiki.wiki <- function(x, check=TRUE, wiki_site = "species",
+                         wiki = "en") x
+
+#' @export
+#' @rdname get_wiki
+as.wiki.character <- function(x, check=TRUE, wiki_site = "species",
+                              wiki = "en") {
+  if (length(x) == 1) {
+    make_wiki(x, check, wiki_site, wiki)
+  } else {
+    collapse(x, make_wiki, "wiki", check = check)
+  }
+}
+
+#' @export
+#' @rdname get_wiki
+as.wiki.list <- function(x, check=TRUE, wiki_site = "species",
+                         wiki = "en") {
+  if (length(x) == 1) {
+    make_wiki(x, check)
+  } else {
+    collapse(x, make_wiki, "wiki", check = check)
+  }
+}
+
+#' @export
+#' @rdname get_wiki
+as.wiki.numeric <- function(x, check=TRUE, wiki_site = "species",
+                            wiki = "en") {
+  as.wiki(as.character(x), check)
+}
+
+#' @export
+#' @rdname get_wiki
+as.wiki.data.frame <- function(x, check=TRUE, wiki_site = "species",
+                               wiki = "en") {
+
+  structure(x$ids, class = "wiki", match = x$match,
+            multiple_matches = x$multiple_matches,
+            pattern_match = x$pattern_match,
+            wiki_site = x$wiki_site,
+            wiki_lang = x$wiki_lang, uri = x$uri)
+}
+
+#' @export
+#' @rdname get_wiki
+as.data.frame.wiki <- function(x, ...){
+  data.frame(ids = unclass(x),
+             class = "wiki",
+             match = attr(x, "match"),
+             multiple_matches = attr(x, "multiple_matches"),
+             pattern_match = attr(x, "pattern_match"),
+             wiki_site = attr(x, 'wiki_site'),
+             wiki_lang = attr(x, 'wiki_lang'),
+             uri = attr(x, "uri"),
+             stringsAsFactors = FALSE)
+}
+
+make_wiki <- function(x, check = TRUE, wiki_site, wiki) {
+  url <- switch(
+    wiki_site,
+    species = 'https://species.wikimedia.org/wiki/%s',
+    pedia = paste0(sprintf('https://%s.wikipedia.org/wiki', wiki), "/%s"),
+    commons = 'https://commons.wikimedia.org/wiki/%s'
+  )
+  make_wiki_generic(x, url, "wiki", check)
+}
+
+check_wiki <- function(x) {
+  tt <- wikitaxa::wt_wiki_page(x)
+  identical(tt$status_code, 200)
+}
+
+#' @export
+#' @rdname get_wiki
+get_wiki_ <- function(x, verbose = TRUE, wiki_site = "species",
+                      wiki = "en", limit = 100, rows = NA, ...) {
+  stats::setNames(
+    lapply(x, get_wiki_help, verbose = verbose, wiki_site = wiki_site,
+           wiki = wiki, limit = limit, rows = rows, ...),
+    x
+  )
+}
+
+get_wiki_help <- function(x, verbose, wiki_site = "species", wiki = "en",
+                          limit = 100, rows, ...) {
+
+  mssg(verbose, "\nRetrieving data for taxon '", x, "'\n")
+  assert(x, "character")
+  assert(wiki_site, "character")
+  assert(wiki, "character")
+
+  df <- switch(
+    wiki_site,
+    species = wikitaxa::wt_wikispecies_search(query = x, limit = limit, ...),
+    pedia = wikitaxa::wt_wikipedia_search(query = x, wiki = wiki,
+                                          limit = limit, ...),
+    commons = wikitaxa::wt_wikicommons_search(query = x, limit = limit, ...)
+  )$query$search
+
+  if (!inherits(df, "tbl_df") || NROW(df) == 0) {
+    NULL
+  } else {
+    df <- df[, c("title", "size", "wordcount")]
+    sub_rows(df, rows)
+  }
+}
diff --git a/R/get_wormsid.R b/R/get_wormsid.R
index 8e7305e..a1500df 100644
--- a/R/get_wormsid.R
+++ b/R/get_wormsid.R
@@ -87,13 +87,12 @@
 #' # get_wormsid_(c("asdfadfasd","Plat"), rows=1:5)
 #' }
 get_wormsid <- function(query, searchtype = "scientific", accepted = FALSE,
-                      ask = TRUE, verbose = TRUE, rows = NaN, ...) {
+                      ask = TRUE, verbose = TRUE, rows = NA, ...) {
 
   assert(searchtype, "character")
   assert(accepted, "logical")
   assert(ask, "logical")
   assert(verbose, "logical")
-  assert(rows, c("numeric", "integer"))
 
   fun <- function(x, searchtype, ask, verbose, ...) {
     direct <- FALSE
@@ -144,15 +143,23 @@ get_wormsid <- function(query, searchtype = "scientific", accepted = FALSE,
         names(wmdf)[grep("scientificname", names(wmdf))] <- "target"
         direct <- match(tolower(wmdf$target), tolower(x))
 
-        if (!all(is.na(direct))) {
-          wmid <- wmdf$id[!is.na(direct)]
-          direct <- TRUE
-          att <- 'found'
+        if (length(direct) == 1) {
+          if (!all(is.na(direct))) {
+            wmid <- wmdf$id[!is.na(direct)]
+            direct <- TRUE
+            att <- 'found'
+          } else {
+            direct <- FALSE
+            wmid <- NA_character_
+            att <- 'not found'
+          }
         } else {
           direct <- FALSE
           wmid <- NA_character_
-          att <- 'not found'
+          att <- 'NA due to ask=FALSE & no direct match found'
+          warning("> 1 result; no direct match found", call. = FALSE)
         }
+
       }
 
       # multiple matches
@@ -188,8 +195,15 @@ get_wormsid <- function(query, searchtype = "scientific", accepted = FALSE,
             att <- 'not found'
           }
         } else {
-          wmid <- NA_character_
-          att <- "NA due to ask=FALSE"
+          if (length(wmid) != 1) {
+            warning(
+              sprintf("More than one WORMS ID found for taxon '%s'; refine query or set ask=TRUE",
+                      x),
+              call. = FALSE
+            )
+            wmid <- NA_character_
+            att <- 'NA due to ask=FALSE & > 1 result'
+          }
         }
       }
 
diff --git a/R/gnr_resolve.R b/R/gnr_resolve.R
index 470dd87..9fba86e 100644
--- a/R/gnr_resolve.R
+++ b/R/gnr_resolve.R
@@ -1,7 +1,6 @@
 #' Resolve names using Global Names Resolver.
 #'
-#' Uses the Global Names Index, see \url{http://gni.globalnames.org/}.
-#'
+#' @export
 #' @param names character; taxonomic names to be resolved. Doesn't work for
 #' vernacular/common names.
 #' @param data_source_ids character; IDs to specify what data source
@@ -19,31 +18,66 @@
 #'    (without tax. authorities and abbreviations).
 #' @param highestscore logical; Return those names with the highest score for
 #'    each searched name? Defunct
-#' @param best_match_only (logical) If \code{TRUE}, best match only returned. Default:
-#' \code{FALSE}
-#' @param preferred_data_sources (character) A vector of one or more data source IDs.
-#' @param with_canonical_ranks (logical) Returns names with infraspecific ranks, if present.
-#'    If \code{TRUE}, we force \code{canonical=TRUE}, otherwise this parameter would
-#'    have no effect. Default: \code{FALSE}
+#' @param best_match_only (logical) If \code{TRUE}, best match only returned.
+#' Default: \code{FALSE}
+#' @param preferred_data_sources (character) A vector of one or more data
+#' source IDs.
+#' @param with_canonical_ranks (logical) Returns names with infraspecific
+#' ranks, if present. If \code{TRUE}, we force \code{canonical=TRUE}, otherwise
+#' this parameter would have no effect. Default: \code{FALSE}
 #' @param http The HTTP method to use, one of "get" or "post". Default: "get".
-#'    Use \code{http="post"} with large queries. Queries with > 300 records use "post"
-#'    automatically because "get" would fail
+#' Use \code{http="post"} with large queries. Queries with > 300 records
+#' use "post" automatically because "get" would fail
 #' @param ... Curl options passed on to \code{\link[httr]{GET}}
 #' @param cap_first (logical) For each name, fix so that the first name part is
-#' capitalized, while others are not. This web service is sensitive to capitalization, so
-#' you'll get different results depending on capitalization. First name capitalized is
-#' likely what you'll want and is the default. If \code{FALSE}, names are not modified.
-#' Default: \code{TRUE}
-#' @param fields (character) One of mimimal (default) or all. Minimal gives back just four
-#' fields, whereas all gives all fields back.
+#' capitalized, while others are not. This web service is sensitive to
+#' capitalization, so you'll get different results depending on capitalization.
+#' First name capitalized is likely what you'll want and is the default.
+#' If \code{FALSE}, names are not modified. Default: \code{TRUE}
+#' @param fields (character) One of minimal (default) or all. Minimal gives
+#' back just four fields, whereas all gives all fields back.
 #'
 #' @author Scott Chamberlain \email{myrmecocystus@@gmail.com}
-#' @return A data.frame with one attribute \code{not_known}: a character vector of
-#' taxa unknown to the Global Names Index. Acccess like \code{attr(output, "not_known")},
-#' or \code{attributes(output)$not_known}
-#' @seealso \code{\link[taxize]{gnr_datasources}}
-#' @export
+#' @return A data.frame with one attribute \code{not_known}: a character
+#' vector of taxa unknown to the Global Names Index. Access like
+#' \code{attr(output, "not_known")}, or \code{attributes(output)$not_known}.
+#' Columns of the output data.frame:
+#' \itemize{
+#'  \item user_supplied_name (character) - the name you passed in to the
+#'  \code{names} parameter, unchanged.
+#'  \item submitted_name (character) - the actual name submitted to the GNR
+#'  service
+#'  \item data_source_id (integer/numeric) - data source ID
+#'  \item data_source_title (character) - data source name
+#'  \item gni_uuid (character) - Global Names Index UUID (aka identifier)
+#'  \item matched_name (character) - the matched name in the GNR service
+#'  \item matched_name2 (character) - returned if \code{canonical=TRUE}, in
+#'  which case \emph{matched_name} is not returned
+#'  \item classification_path (character) - names of the taxonomic
+#'  classification tree, with names separated by pipes (\code{|})
+#'  \item classification_path_ranks (character) - ranks of the taxonomic
+#'  classification tree, with names separated by pipes (\code{|})
+#'  \item classification_path_ids (character) - identifiers of the taxonomic
+#'  classification tree, with names separated by pipes (\code{|})
+#'  \item taxon_id (character) - taxon identifier
+#'  \item edit_distance (integer/numeric) - edit distance
+#'  \item imported_at (character) - date imported
+#'  \item match_type (integer/numeric) - match type
+#'  \item match_value (character) - description of match type
+#'  \item prescore (character) - pre score
+#'  \item score (numeric) - score
+#'  \item local_id (character) - local identifier
+#'  \item url (character) - URL for taxon
+#'  \item global_id (character) - global identifier
+#'  \item current_taxon_id (character) - current taxon id
+#'  \item current_name_string (character) - current name string
+#' }
+#' Note that names (i.e. rows) are dropped that are NA, are zero length
+#' strings, are not character vectors, or are not found by the API.
+#' @seealso \code{\link[taxize]{gnr_datasources}} \code{\link{tnrs}}
 #' @keywords resolve names taxonomy
+#' @references \url{http://gnrd.globalnames.org/api}
+#' \url{http://gnrd.globalnames.org/}
 #' @examples \dontrun{
 #' gnr_resolve(names = c("Helianthus annuus", "Homo sapiens"))
 #' gnr_resolve(names = c("Asteraceae", "Plantae"))
@@ -78,14 +112,18 @@
 #' }
 
 gnr_resolve <- function(names, data_source_ids = NULL, resolve_once = FALSE,
-  with_context = FALSE, canonical = FALSE, highestscore = TRUE, best_match_only = FALSE,
-  preferred_data_sources = NULL, with_canonical_ranks = FALSE, http = "get",
-  cap_first = TRUE, fields = "minimal", ...) {
+  with_context = FALSE, canonical = FALSE, highestscore = TRUE,
+  best_match_only = FALSE, preferred_data_sources = NULL,
+  with_canonical_ranks = FALSE, http = "get", cap_first = TRUE,
+  fields = "minimal", ...) {
 
   fields <- match.arg(fields, c("minimal", "all"))
   http <- match.arg(http, c("get", "post"))
   num = NULL
   url <- "http://resolver.globalnames.org/name_resolvers.json"
+  # clean out zero length strings
+  names <- Filter(function(x) nzchar(x) && !is.na(x) && is.character(x), names)
+  # store original names supplied by user
   orig_names <- names
   if (cap_first) names <- taxize_capwords(names, onlyfirst = TRUE)
   names2 <- paste0(names, collapse = "|")
@@ -93,7 +131,8 @@ gnr_resolve <- function(names, data_source_ids = NULL, resolve_once = FALSE,
 
   data_source_ids <- paste0(data_source_ids, collapse = "|")
   preferred_data_sources <- paste0(preferred_data_sources, collapse = "|")
-  if (nchar(preferred_data_sources, keepNA = FALSE) == 0) preferred_data_sources <- NULL
+  if (nchar(preferred_data_sources, keepNA = FALSE) == 0)
+    preferred_data_sources <- NULL
   if (with_canonical_ranks) canonical <- TRUE
 
   args <- tc(list(names = names2, data_source_ids = data_source_ids,
@@ -114,10 +153,13 @@ gnr_resolve <- function(names, data_source_ids = NULL, resolve_once = FALSE,
     datbits <- list()
     for (i in seq_along(nms)) {
       tt <- data.frame(num = 1:length(nms[[i]]), names = nms[[i]])
-      tt <- data.frame(ddply(tt, .(num), summarise, paste0(num, "|", names))[,2])
+      tt <- data.frame(ddply(tt, .(num), summarise,
+                             paste0(num, "|", names))[,2])
       file <- tempfile(fileext = ".txt")
-      write.table(tt, file = file, row.names = FALSE, col.names = FALSE, quote = FALSE)
-      ss <- POST(url, query = args, body = list(file = upload_file(path = file)), ...)
+      write.table(tt, file = file, row.names = FALSE,
+                  col.names = FALSE, quote = FALSE)
+      ss <- POST(url, query = args,
+                 body = list(file = upload_file(path = file)), ...)
       warn_for_status(ss)
       ss <- con_utf8(ss)
       datbits[[i]] <- jsonlite::fromJSON(ss, FALSE)$data
@@ -134,7 +176,8 @@ gnr_resolve <- function(names, data_source_ids = NULL, resolve_once = FALSE,
       if (!is.null(unlist(y$results))) {
         res <- lapply(y$results, function(x) {
           take_fields <- switch(fields,
-            minimal = c("name_string", "data_source_title","score", "canonical_form"),
+            minimal = c("name_string", "data_source_title","score",
+                        "canonical_form"),
             all = names(x)
           )
           take <- x[take_fields]
@@ -153,17 +196,22 @@ gnr_resolve <- function(names, data_source_ids = NULL, resolve_once = FALSE,
 
   # check for empty data object
   drill <- tryCatch(data_[[1]], error = function(e) e)
-  to_rename <- c("original_name", "supplied_name_string", "name_string", "canonical_form")
+  to_rename <- c("original_name", "supplied_name_string", "name_string",
+                 "canonical_form")
   if (inherits(drill, "simpleError")) {
     out <- data.frame(NULL)
   } else {
     if (is.null(preferred_data_sources)) {
-      data_2 <- ldply(data_, function(x) data.frame(x[[1]], ldply( if (length(x[[2]]) == 0) {
-        list(data.frame(name_string = "", data_source_title = "", score = NaN, canonical_form = ""))
+      data_2 <- ldply(data_, function(x)
+        data.frame(x[[1]], ldply( if (length(x[[2]]) == 0) {
+        list(data.frame(name_string = "", data_source_title = "", score = NaN,
+                        canonical_form = ""))
       } else {
         x[[2]]
       }), stringsAsFactors = FALSE))
-      names(data_2)[names(data_2) %in% to_rename] <- c("user_supplied_name", "submitted_name", "matched_name", "matched_name2")
+      names(data_2)[names(data_2) %in% to_rename] <-
+        c("user_supplied_name", "submitted_name",
+          "matched_name", "matched_name2")
       data_2$matched_name <- as.character(data_2$matched_name)
       data_2$data_source_title <- as.character(data_2$data_source_title)
       data_2$matched_name2 <- as.character(data_2$matched_name2)
@@ -180,30 +228,40 @@ gnr_resolve <- function(names, data_source_ids = NULL, resolve_once = FALSE,
         lapply(dat, function(y) {
           if (!is.null(unlist(y$preferred_results))) {
             res <- lapply(y$preferred_results, function(x) {
-              data.frame(x[c("name_string", "data_source_title", "score", "canonical_form")], stringsAsFactors = FALSE)
+              data.frame(x[c("name_string", "data_source_title", "score",
+                             "canonical_form")], stringsAsFactors = FALSE)
             })
           } else {
             res <- NULL
           }
           list(y[c("original_name", "supplied_name_string")], res)
         })
-      data_2_preferred <- ldply(data_preferred, function(x) data.frame(x[[1]], ldply(if (length(x[[2]]) == 0) {
-        list(data.frame(name_string = "", data_source_title = "", score = NaN, canonical_form = ""))
+      data_2_preferred <- ldply(data_preferred, function(x)
+        data.frame(x[[1]], ldply(if (length(x[[2]]) == 0) {
+        list(data.frame(name_string = "", data_source_title = "", score = NaN,
+                        canonical_form = ""))
       } else {
         x[[2]]
       }), stringsAsFactors = FALSE))
       if (NROW(data_2_preferred) == 0) {
         out <- data_2_preferred
       } else {
-        names(data_2_preferred)[names(data_2_preferred) %in% to_rename] <- c("user_supplied_name", "submitted_name", "matched_name", "matched_name2")
-        data_2_preferred$matched_name <- as.character(data_2_preferred$matched_name)
-        data_2_preferred$data_source_title <- as.character(data_2_preferred$data_source_title)
-        data_2_preferred$matched_name2 <- as.character(data_2_preferred$matched_name2)
+        names(data_2_preferred)[names(data_2_preferred) %in% to_rename] <-
+          c("user_supplied_name", "submitted_name",
+            "matched_name", "matched_name2")
+        data_2_preferred$matched_name <-
+          as.character(data_2_preferred$matched_name)
+        data_2_preferred$data_source_title <-
+          as.character(data_2_preferred$data_source_title)
+        data_2_preferred$matched_name2 <-
+          as.character(data_2_preferred$matched_name2)
 
         if (canonical) {
-          out <- data_2_preferred[ , !names(data_2_preferred) %in% "matched_name"]
+          out <-
+            data_2_preferred[ , !names(data_2_preferred) %in% "matched_name"]
         } else {
-          out <- data_2_preferred[ , !names(data_2_preferred) %in% "matched_name2"]
+          out <-
+            data_2_preferred[ , !names(data_2_preferred) %in% "matched_name2"]
         }
       }
     }
diff --git a/R/itis_getrecord.R b/R/itis_getrecord.R
index db6feff..91be13f 100644
--- a/R/itis_getrecord.R
+++ b/R/itis_getrecord.R
@@ -12,7 +12,7 @@
 #' itis_getrecord(c(202385,70340))
 #'
 #' # by lsid
-#' itis_getrecord("urn:lsid:itis.gov:itis_tsn:180543", "lsid")
+#' itis_getrecord("urn:lsid:itis.gov:itis_tsn:202385", "lsid")
 #' }
 
 itis_getrecord <- function(values, by="tsn", ...) {
diff --git a/R/iucn_getname.R b/R/iucn_getname.R
index 980b0af..fa2cca7 100644
--- a/R/iucn_getname.R
+++ b/R/iucn_getname.R
@@ -14,13 +14,12 @@
 #' @examples \dontrun{
 #' iucn_getname(name = "Cyanistes caeruleus")
 #' iucn_getname(name = "Panthera uncia")
-#' iucn_getname(name = "Abies")
 #'
 #' # not found in global names
 #' # iucn_getname(name = "Abronia pinsapo")
 #'
 #' # not found in IUCN search
-#' # iucn_getname(name = "Acacia allenii")
+#' iucn_getname(name = "Acacia allenii")
 #' }
 iucn_getname <- function(name, verbose = TRUE, ...) {
   mssg(verbose, "searching Global Names ...")
diff --git a/R/iucn_id.R b/R/iucn_id.R
index 6e508b2..176c6da 100644
--- a/R/iucn_id.R
+++ b/R/iucn_id.R
@@ -3,7 +3,10 @@
 #' @export
 #' @param sciname character; Scientific name. Should be cleand and in the
 #' format \emph{<Genus> <Species>}. One or more.
-#' @param ... Curl options passed on to \code{\link[httr]{GET}}
+#' @param key (character) required. you IUCN Redlist API key. See
+#' \code{\link[rredlist]{rredlist-package}} for help on authenticating with
+#' IUCN Redlist
+#' @param ... Curl options passed on to \code{crul::HttpClient}
 #' @return A named list (names are input taxa names) of one or more IUCN IDs.
 #' Taxa that aren't found are silently dropped.
 #' @author Scott Chamberlain, \email{myrmecocystus@@gmail.com}
@@ -22,16 +25,16 @@
 #' # a name not found
 #' iucn_id("Foo bar")
 #' }
-iucn_id <- function(sciname, ...) {
+iucn_id <- function(sciname, key = NULL, ...) {
   out <- list()
   for (i in seq_along(sciname)) {
-    out[[i]] <- get_iucn_id(sciname[[i]], ...)
+    out[[i]] <- get_iucn_id(sciname[[i]], key = key, ...)
   }
   unlist(out)
 }
 
-get_iucn_id <- function(z, ...) {
-  tmp <- rredlist::rl_search(z, ...)
+get_iucn_id <- function(z, key = NULL, ...) {
+  tmp <- rredlist::rl_search(z, key = key, ...)
   if (NROW(tmp$result) == 0) {
     NA
   } else if (NROW(tmp$result) > 1) {
@@ -46,21 +49,3 @@ get_iucn_id <- function(z, ...) {
   }
 }
 
-# get_iucn_id <- function(z) {
-#   x <- gsub(" ", "-", tolower(z))
-#   url <- paste("http://api.iucnredlist.org/go/", x, sep = "")
-#   e <- tryCatch(suppressWarnings(readLines(url)), error = function(e) e)
-#   if (is(e, "error")) {
-#     warning(paste0(z, " - not found"), call. = FALSE)
-#     return(NA)
-#   } else {
-#     id <- grep("http://www.iucnredlist.org/apps/redlist/details/", e, value = TRUE)
-#     as.numeric(gsub(".*/", "", id))
-#   }
-# }
-
-## usage based on using gnr_resolve, maybe bring back when correct IUCN IDs given
-# iucn_id <- function(sciname) {
-#   res <- gnr_resolve(sciname, data_source_ids = 163, fields = "all")
-#   as.list(setNames(res$local_id, res$submitted_name))
-# }
diff --git a/R/iucn_summary.R b/R/iucn_summary.R
index 6d6a2aa..17ac0ae 100755
--- a/R/iucn_summary.R
+++ b/R/iucn_summary.R
@@ -2,7 +2,8 @@
 #'
 #' @description Get a summary from the IUCN Red List (\url{http://www.iucnredlist.org/}).
 #'
-#' @param sciname character; Scientific name. Should be cleaned and in the
+#' @export
+#' @param x character; Scientific name. Should be cleaned and in the
 #' format \emph{<Genus> <Species>}.
 #' @param silent logical; Make errors silent or not (when species not found).
 #' @param parallel logical; Search in parallel to speed up search. You have to
@@ -35,6 +36,18 @@
 #' We will fix these as soon as possible. In the meantime, just make sure that
 #' the data you get back is correct.
 #'
+#' \code{iucn_summary} has a default method that errors when anything's
+#' passed in that's not \code{character} or \code{iucn} class - a
+#' \code{iucn_summary.character} method for when you pass in taxon names -
+#' and a \code{iucn_summary.iucn} method so you can pass in iucn class objects
+#' as output from \code{\link{get_iucn}} or \code{\link{as.iucn}}. If you
+#' already have IUCN IDs, coerce them to \code{iucn} class via
+#' \code{as.iucn(..., check = FALSE)}
+#'
+#' @author Eduard Szoecs, \email{eduardszoecs@@gmail.com}
+#' @author Philippe Marchand, \email{marchand.philippe@@gmail.com}
+#' @author Scott Chamberlain, \email{myrmecocystus@@gmail.com}
+#'
 #' @section Redlist Authentication:
 #' \code{iucn_summary} uses the new Redlist API for searching for a IUCN ID, so we
 #' use the \code{\link[rredlist]{rl_search}} function internally. This function
@@ -55,7 +68,7 @@
 #' ia <- iucn_summary(c("Panthera uncia", "Lynx lynx", "aaa"))
 #'
 #' ## get detailed distribution
-#' iac <- iucn_summary("Ara chloropterus", distr_detail = TRUE)
+#' iac <- iucn_summary(x="Ara chloropterus", distr_detail = TRUE)
 #' iac[[1]]$distr
 #'
 #'
@@ -67,6 +80,11 @@
 #' ia[['Lynx lynx']]$history
 #' ia[['Panthera uncia']]$distr
 #' ia[[2]]$trend
+#' ## the outputs aren't quite identical, but we're working on it
+#' identical(
+#'   iucn_summary_id(c(22732, 12519)),
+#'   iucn_summary(as.iucn(c(22732, 12519)))
+#' )
 #'
 #' # using parallel, e.g., with doMC package, register cores first
 #' # library(doMC)
@@ -74,13 +92,39 @@
 #' # nms <- c("Panthera uncia", "Lynx lynx", "Ara chloropterus", "Lutra lutra")
 #' # (res <- iucn_summary(nms, parallel = TRUE))
 #' }
+iucn_summary <- function(x, parallel = FALSE, distr_detail = FALSE,
+                         key = NULL, ...) {
+  UseMethod("iucn_summary")
+}
+
 #' @export
-#' @author Eduard Szoecs, \email{eduardszoecs@@gmail.com}
-#' @author Philippe Marchand, \email{marchand.philippe@@gmail.com}
-#' @author Scott Chamberlain, \email{myrmecocystus@@gmail.com}
-iucn_summary <- function(sciname, silent = TRUE, parallel = FALSE,
-                         distr_detail = FALSE, key = NULL, ...) {
-  get_iucn_summary(sciname, silent, parallel, distr_detail, by_id = FALSE, key = key, ...)
+iucn_summary.default <- function(x, parallel = FALSE, distr_detail = FALSE,
+                                 key = NULL, ...) {
+  stop("no 'iucn_summary' method for ", class(x), call. = FALSE)
+}
+
+#' @export
+iucn_summary.character <- function(x, parallel = FALSE, distr_detail = FALSE,
+                                   key = NULL, ...) {
+  xid <- get_iucn(x)
+  if (any(is.na(xid))) {
+    nas <- x[is.na(xid)]
+    warning("taxa '", paste0(nas, collapse = ", ") ,
+            "' not found!\n Returning NAs!")
+    if (all(is.na(xid))) {
+      return(list(status = NA, history = NA, distr = NA, trend = NA))
+    }
+  }
+  xid <- as.numeric(xid)
+  res <- get_iucn_summary2(xid, parallel, distr_detail, key = key, ...)
+  structure(stats::setNames(res, x), class = "iucn_summary")
+}
+
+#' @export
+iucn_summary.iucn <- function(x, parallel = FALSE, distr_detail = FALSE,
+                              key = NULL, ...) {
+  res <- get_iucn_summary2(x, parallel, distr_detail, key = key, ...)
+  structure(stats::setNames(res, x), class = "iucn_summary")
 }
 
 #' @param species_id an IUCN ID
@@ -88,44 +132,49 @@ iucn_summary <- function(sciname, silent = TRUE, parallel = FALSE,
 #' @rdname iucn_summary
 iucn_summary_id <- function(species_id, silent = TRUE, parallel = FALSE,
                             distr_detail = FALSE, ...) {
-    get_iucn_summary(species_id, silent, parallel, distr_detail, by_id = TRUE, ...)
+  .Deprecated(msg = gsub("\\s\\s|\n", "", "this function will be deprecated in
+      the next version. use iucn_summary()"))
+  res <- get_iucn_summary(species_id, silent, parallel, distr_detail,
+                          by_id = TRUE, ...)
+  structure(stats::setNames(res, species_id), class = "iucn_summary")
 }
 
 
+## helpers --------
 get_iucn_summary <- function(query, silent, parallel, distr_detail, by_id, key = NULL, ...) {
 
   fun <- function(query) {
 
     if (!by_id) {
-        #to deal with subspecies
-        sciname_q <- strsplit(query, " ")
-        spec <- tolower(paste(sciname_q[[1]][1], sciname_q[[1]][2]))
-        res <- tryCatch(rredlist::rl_search(spec, key = key), error = function(e) e)
-        if (inherits(res, "error")) {
-          stop(res$message, " - see ?iucn_summary and http://apiv3.iucnredlist.org/api/v3/token", call. = FALSE)
-        }
-        if (!inherits(res, "try-error") && NROW(res$result) > 0) {
-            df <- unique(res$result)
-            #check if there are several matches
-            scinamelist <- df$scientific_name
-            species_id <- df$taxonid[which(tolower(scinamelist) == tolower(query))]
-        }
+      #to deal with subspecies
+      sciname_q <- strsplit(query, " ")
+      spec <- tolower(paste(sciname_q[[1]][1], sciname_q[[1]][2]))
+      res <- tryCatch(rredlist::rl_search(spec, key = key), error = function(e) e)
+      if (inherits(res, "error")) {
+        stop(res$message, " - see ?iucn_summary and http://apiv3.iucnredlist.org/api/v3/token", call. = FALSE)
+      }
+      if (!inherits(res, "try-error") && NROW(res$result) > 0) {
+        df <- unique(res$result)
+        #check if there are several matches
+        scinamelist <- df$scientific_name
+        species_id <- df$taxonid[which(tolower(scinamelist) == tolower(query))]
+      }
     } else {
-        species_id <- query
+      species_id <- query
     }
     if (!exists('species_id')) {
-        warning("Species '", query , "' not found!\n Returning NA!")
-        out <- list(status = NA,
-                    history = NA,
-                    distr = NA,
-                    trend = NA)
+      warning("Species '", query , "' not found!\n Returning NA!")
+      out <- list(status = NA,
+                  history = NA,
+                  distr = NA,
+                  trend = NA)
     } else {
       url <- paste("http://api.iucnredlist.org/details/", species_id, "/0", sep = "")
       e <- try(h <- xml2::read_html(url), silent = silent)
       if (!inherits(e, "try-error")) {
         # scientific name
         if (by_id) {
-            sciname <- xml2::xml_text(xml2::xml_find_all(h, '//h1[@id = "scientific_name"]'))
+          sciname <- xml2::xml_text(xml2::xml_find_all(h, '//h1[@id = "scientific_name"]'))
         }
 
         # status
@@ -142,9 +191,9 @@ get_iucn_summary <- function(query, silent, parallel, distr_detail, by_id, key =
           distr <- sub("^\n", "", distr)  # remove leading newline
           distr <- strsplit(distr, "\n")
           if (distr_detail) {
-              names(distr) <- xml2::xml_text(xml2::xml_find_all(h, '//ul[@class="country_distribution"]//div[@class="distribution_type"]'))
+            names(distr) <- xml2::xml_text(xml2::xml_find_all(h, '//ul[@class="country_distribution"]//div[@class="distribution_type"]'))
           } else {
-              distr <- unlist(distr)
+            distr <- unlist(distr)
           }
         }
 
@@ -171,27 +220,75 @@ get_iucn_summary <- function(query, silent, parallel, distr_detail, by_id, key =
   if (parallel) {
     out <- llply(query, fun, .parallel = TRUE)
   } else {
-    out <- llply(query, fun)
+    out <- lapply(query, fun)
   }
 
   if (by_id) {
-      names(out) <- llply(out, `[[`, "sciname")
-      out <- llply(out, function(x) {x$sciname <- NULL; x})
+    names(out) <- llply(out, `[[`, "sciname")
+    out <- llply(out, function(x) {x$sciname <- NULL; x})
   } else {
-      names(out) <- query
+    names(out) <- query
   }
-  class(out) <- "iucn"
   return(out)
 }
 
+try_red <- function(fun, x) {
+  tryCatch(fun(id = x), error = function(e) e)
+}
+
+null_res <- list(status = NA, history = NA, distr = NA, trend = NA)
+
+get_iucn_summary2 <- function(query, parallel, distr_detail, key = NULL, ...) {
+  fun <- function(z) {
+    if (is.na(z)) return(null_res)
+    res <- try_red(rredlist::rl_search, z)
+    if (!inherits(res, "error")) {
+      # history
+      history <- try_red(rredlist::rl_history, z)
+      if (NROW(history$result) == 0 || inherits(history, "error")) {
+        history <- NA
+      } else {
+        history <- history$result
+      }
+
+      # distribution
+      distr <- try_red(rredlist::rl_occ_country, z)
+      if (NROW(distr$result) == 0 || inherits(distr, "error")) {
+        distr <- NA
+      } else {
+        distr <- distr$result
+        if (distr_detail) {
+          distr <- split(distr, distr$distribution_code)
+        } else {
+          distr <- distr$country
+        }
+      }
+
+      # trend - NOT SURE HOW TO GET IT
+      # build output
+      out <- list(status = res$result$category,
+                  history = history, distr = distr, trend = NA)
+    } else {
+      warning("taxon ID '", z , "' not found!\n Returning NA!", call. = FALSE)
+      out <- null_res
+    }
+    return(out)
+  }
+
+  if (parallel) {
+    llply(query, fun, .parallel = TRUE)
+  } else {
+    lapply(query, fun)
+  }
+}
 
 #' Extractor functions for \code{iucn}-class.
 #'
+#' @export
 #' @param x an \code{iucn}-object as returned by \code{iucn_summary}
 #' @param ... Currently not used
 #' @return A character vector with the status.
 #' @seealso \code{\link[taxize]{iucn_summary}}
-#' @export
 #' @examples \dontrun{
 #' ia <- iucn_summary(c("Panthera uncia", "Lynx lynx"))
 #' iucn_status(ia)}
@@ -199,17 +296,12 @@ iucn_status <- function(x, ...){
   UseMethod("iucn_status")
 }
 
-#' @method iucn_status default
+#' @export
 iucn_status.default <- function(x, ...) {
-  stop("No default method for status defined!\n
-       Did you mean iucn_status.iucn?\n", .call = FALSE)
+  stop("no method for 'iucn_status' for ", class(x), call. = FALSE)
 }
 
-#' @method iucn_status iucn
-#' @param x an \code{iucn} object as returned by
-#' \code{\link[taxize]{iucn_summary}}.
 #' @export
-#' @rdname iucn_summary
-iucn_status.iucn <- function(x, ...) {
+iucn_status.iucn_summary <- function(x, ...) {
   unlist(lapply(x, function(x) x$status))
 }
diff --git a/R/nbn_classification.R b/R/nbn_classification.R
index 4f7eb1d..040192f 100644
--- a/R/nbn_classification.R
+++ b/R/nbn_classification.R
@@ -1,23 +1,25 @@
-#' Search UK National Biodiversity Network database for taxonomic classification
+#' Search UK National Biodiversity Network database for
+#' taxonomic classification
 #'
 #' @export
-#' @param id (character) An NBN idientifier.
+#' @param id (character) An NBN identifier.
 #' @param ... Further args passed on to \code{\link[httr]{GET}}.
-#'
+#' @return A data.frame
+#' @family nbn
 #' @author Scott Chamberlain, \email{myrmecocystus@@gmail.com}
-#'
+#' @references <https://api.nbnatlas.org/>
 #' @examples \dontrun{
-#' nbn_classification(id="NHMSYS0000502940")
+#' nbn_classification(id="NHMSYS0000376773")
 #'
 #' # get id first, then pass to this fxn
-#' id <- get_nbnid("blue tit", rec_only = TRUE, rank = "Species")
+#' id <- get_nbnid("Zootoca vivipara", rec_only = TRUE, rank = "Species")
 #' nbn_classification(id)
 #'
 #' library('httr')
 #' nbn_classification(id="NHMSYS0000502940", config=verbose())
 #' }
 nbn_classification <- function(id, ...) {
-  url <- sprintf("https://data.nbn.org.uk/api/taxa/%s/taxonomy", id)
+  url <- file.path(nbn_base(), "classification", id)
   nbn_GET_2(url, ...)
 }
 
diff --git a/R/nbn_search.R b/R/nbn_search.R
index 81ba25a..f0a6856 100644
--- a/R/nbn_search.R
+++ b/R/nbn_search.R
@@ -1,55 +1,54 @@
-#' Search UK National Biodiversity Network database
+#' Search UK National Biodiversity Network
 #'
 #' @export
 #' @param q (character) The query terms(s)
-#' @param prefered (logical) Restrict search to preferred or any
-#' @param order (character) The order in which we should sort the results. Default: asc
-#' @param sort (character) Sort the results or not.
-#' @param start (integer/numeric) The page that the user wants to start displaying the results at.
-#' Default: 0
-#' @param rows (integer/numeric) The number of rows to show in each page of search results.
-#' Default: 25
-#' @param taxonOutputGroupKey (character) Vector of taxon output groups.
-#' @param all (logical) Get all results, overrides rows parameter if TRUE. Default: FALSE
+#' @param fq (character) Filters to be applied to the original query. These
+#' are additional params of the form fq=INDEXEDFIELD:VALUE e.g.
+#' fq=rank:kingdom. See <https://species-ws.nbnatlas.org/indexFields> for all
+#' the fields that are queryable.
+#' @param rows (integer) Number of records to return
+#' @param start (integer) Record offset, to enable paging
+#' @param sort (character) The indexed field to sort by
+#' @param order (character) Supports "asc" or "desc"
+#' @param facets (list) Comma separated list of the fields to create facets
+#' on e.g. facets=basis_of_record.
 #' @param ... Further args passed on to \code{\link[httr]{GET}}.
-#'
+#' @family nbn
+#' @return a list with slots for metadata (`meta`) with list of response
+#' attributes, and data (`data``) with a data.frame of results
 #' @author Scott Chamberlain, \email{myrmecocystus@@gmail.com}
+#' @references <https://api.nbnatlas.org/>
 #'
 #' @examples \dontrun{
-#' nbn_search(q = "blackbird")
+#' x <- nbn_search(q = "Vulpes")
+#' x$meta$totalRecords
+#' x$meta$pageSize
+#' x$meta$urlParameters
+#' x$meta$queryTitle
+#' head(x$data)
+#'
 #' nbn_search(q = "blackbird", start = 4)
-#' nbn_search(q = "blackbird", all = TRUE)
-#' nbn_search(q = "blackbird", taxonOutputGroupKey = "NHMSYS0000080039")
 #'
 #' # debug curl stuff
 #' library('httr')
 #' nbn_search(q = "blackbird", config = verbose())
 #' }
-nbn_search <- function(q, prefered = FALSE, order = 'asc', sort = NULL, start = 0,
-  rows = 25, taxonOutputGroupKey = NULL, all = FALSE, ...) {
+nbn_search <- function(q, fq = NULL, order = NULL, sort = NULL, start = 0,
+                       rows = 25, facets = NULL, ...) {
 
-  url <- "https://data.nbn.org.uk/api/search/taxa"
-  args <- tc(list(q = q, prefered = prefered, order = order, sort = sort, start = start,
-                              rows = rows, taxonOutputGroupKey = taxonOutputGroupKey))
-  if (all) {
-    args$rows <- 0
-    num <- nbn_GET(url, args)$meta$numFound
-    args$rows <- num
-    nbn_GET(url, args, ...)
-  } else {
-    nbn_GET(url, args, ...)
-  }
+  args <- tc(list(
+    q = q, fq = fq, pageSize = rows, startIndex = start, sort = sort,
+    dir = order, facets = facets
+  ))
+  nbn_GET(file.path(nbn_base(), "search"), args, ...)
 }
 
 nbn_GET <- function(url, args, ...){
   res <- GET(url, query = argsnull(args), ...)
   stop_for_status(res)
   tt <- con_utf8(res)
-  json <- jsonlite::fromJSON(tt, FALSE)
-  dat <- do.call(rbind.fill, lapply(json$results, data.frame, stringsAsFactors = FALSE))
-  if (!is.null(dat)) {
-    dat <- nmslwr(dat)
-    dat$rank <- tolower(dat$rank)
-  }
-  list(meta = data.frame(json$header, stringsAsFactors = FALSE), data = dat)
+  json <- jsonlite::fromJSON(tt)$searchResults
+  list(meta = pop(json, "results"), data = json$results)
 }
+
+nbn_base <- function() "https://species-ws.nbnatlas.org"
diff --git a/R/nbn_synonyms.R b/R/nbn_synonyms.R
index 6fdc3bc..0c9b1c8 100644
--- a/R/nbn_synonyms.R
+++ b/R/nbn_synonyms.R
@@ -4,15 +4,17 @@
 #' @param id the taxon identifier code
 #' @param ... Further args passed on to \code{\link[httr]{GET}}
 #' @return A data.frame
+#' @family nbn
+#' @references <https://api.nbnatlas.org/>
 #' @examples \dontrun{
-#' nbn_synonyms(id = 'NHMSYS0000502940')
 #' nbn_synonyms(id = 'NHMSYS0001501147')
 #' nbn_synonyms(id = 'NHMSYS0000456036')
+#'
+#' # none
+#' nbn_synonyms(id = 'NHMSYS0000502940')
 #' }
-
 nbn_synonyms <- function(id, ...) {
-  url <- sprintf("https://data.nbn.org.uk/api/taxa/%s/synonyms", id)
+  url <- file.path(nbn_base(), "species", id)
   df <- nbn_GET_2(url, ...)
-  df$rank <- tolower(df$rank)
-  df
+  df$synonyms
 }
diff --git a/R/ncbi_downstream.R b/R/ncbi_downstream.R
new file mode 100644
index 0000000..e1054ce
--- /dev/null
+++ b/R/ncbi_downstream.R
@@ -0,0 +1,89 @@
+#' Retrieve all taxa names downstream in hierarchy for NCBI
+#'
+#' @export
+#' @param id (numeric/integer) An NCBI taxonomic identifier
+#' @param downto The taxonomic level you want to go down to. See examples below.
+#' 		The taxonomic level IS case sensitive, and you do have to spell it
+#' 		correctly. See \code{data(rank_ref)} for spelling.
+#' @param intermediate (logical) If \code{TRUE}, return a list of length two
+#' with target taxon rank names, with additional list of data.frame's of
+#' intermediate taxonomic groups. Default: \code{FALSE}
+#' @param ... Further args passed on to \code{\link{ncbi_children}}
+#' @return Data.frame of taxonomic information downstream to family from e.g.,
+#' 		Order, Class, etc., or if \code{intermediate=TRUE}, list of length two,
+#'   	with target taxon rank names, and intermediate names.
+#' @author Scott Chamberlain \email{myrmecocystus@@gmail.com}
+#' @section No Rank:
+#' A sticky point with NCBI is that they can have designation for taxonomic
+#' rank of "No Rank". So we have no way of programatically knowing what to
+#' do with that taxon. Of course one can manually look at a name and perhaps
+#' know what it is, or look it up on the web - but we can't do anything
+#' programatically. So, no rank things will sometimes be missing.
+#' @examples \dontrun{
+#' ## genus Apis
+#' ncbi_downstream(id = 7459, downto="species")
+#'
+#' ## get intermediate taxa as a separate object
+#' ncbi_downstream(id = 7459, downto="species", intermediate = TRUE)
+#'
+#' ## Lepidoptera
+#' ncbi_downstream(id = 7088, downto="superfamily")
+#'
+#' ## families in the ferns (Moniliformopses)
+#' (id <- get_uid("Moniliformopses"))
+#' ncbi_downstream(id = id, downto = "order")
+#' }
+ncbi_downstream <- function(id, downto, intermediate = FALSE, ...) {
+
+  should_be('intermediate', intermediate, 'logical')
+
+  downto <- tolower(downto)
+  poss_ranks <- unique(do.call(c, sapply(rank_ref$ranks, strsplit, split = ",",
+                                         USE.NAMES = FALSE)))
+  downto <- match.arg(downto, choices = poss_ranks)
+  torank <- sapply(rank_ref[which_rank(downto), "ranks"],
+                   function(x) strsplit(x, ",")[[1]][[1]], USE.NAMES = FALSE)
+
+  stop_ <- "not"
+  notout <- data.frame(rank = "", stringsAsFactors = FALSE)
+  out <- list()
+  if (intermediate) intermed <- list()
+  iter <- 0
+  while (stop_ == "not") {
+    iter <- iter + 1
+    tt <- dt2df(lapply(id, function(x) ncbi_children(id = x)[[1]]))
+    tt$.id <- NULL
+    tt <- rename(tt, c('childtaxa_rank' = 'rank'))
+    tt <- prune_too_low(tt, downto, ignore_no_rank = TRUE)
+
+    if (NROW(tt) == 0) {
+      out[[iter]] <- data.frame(stringsAsFactors = FALSE)
+      stop_ <- "nodata"
+    } else {
+      if (intermediate) intermed[[iter]] <- tt
+      if (NROW(tt[tt$rank == downto, ]) > 0) {
+        out[[iter]] <- tt[tt$rank == downto, ]
+      }
+      if (NROW(tt[!tt$rank == downto, ]) > 0) {
+        notout <- tt[!tt$rank %in% torank, ]
+      } else {
+        notout <- data.frame(rank = downto, stringsAsFactors = FALSE)
+      }
+
+      if (all(notout$rank == downto)) {
+        stop_ <- "fam"
+      } else {
+        id <- notout$childtaxa_id
+        stop_ <- "not"
+      }
+    }
+    if (intermediate) intermed[[iter]] <- intermed[[iter]]
+  } # end while loop
+
+  tmp <- ldply(out)
+  if (intermediate) {
+    list(target = tmp, intermediate = intermed)
+  } else {
+    tmp
+  }
+}
diff --git a/R/ping.R b/R/ping.R
index 56c8fed..7e0e6d7 100644
--- a/R/ping.R
+++ b/R/ping.R
@@ -109,11 +109,15 @@ tropicos_ping <- function(what = "status", ...) {
 #' @export
 #' @rdname ping
 nbn_ping <- function(what = "status", ...) {
-  res <- GET("https://data.nbn.org.uk/api/search/taxa?=blackbird", ...)
-  switch(matchwhat(what),
-         status = match_status(res),
-         code = match_code(res, what),
-         content = jsonlite::fromJSON(con_utf8(res))$header$rows == 25)
+  res <- GET("https://species-ws.nbnatlas.org/species/NHMSYS0000502940", ...)
+  switch(
+    matchwhat(what),
+    status = match_status(res),
+    code = match_code(res, what),
+    content = {
+      jsonlite::fromJSON(con_utf8(res))$taxonConcept$guid == 'NHMSYS0000502940'
+    }
+  )
 }
 
 #' @export
@@ -129,11 +133,14 @@ gbif_ping <- function(what = "status", ...) {
 #' @export
 #' @rdname ping
 bold_ping <- function(what = "status", ...) {
-  res <- GET("http://www.boldsystems.org/index.php/API_Tax/TaxonData?taxId=88899&dataTypes=basic&includeTree=FALSE", ...)
-  switch(matchwhat(what),
-         status = match_status(res),
-         code = match_code(res, what),
-         content = grepl("88899", jsonlite::fromJSON(con_utf8(res))[[1]]$taxid, ignore.case = TRUE))
+  res <- GET("http://v4.boldsystems.org/index.php/API_Tax/TaxonData?taxId=88899&dataTypes=basic&includeTree=FALSE", ...)
+  switch(
+    matchwhat(what),
+    status = match_status(res),
+    code = match_code(res, what),
+    content = grepl("88899", jsonlite::fromJSON(con_utf8(res))$taxid,
+                    ignore.case = TRUE)
+  )
 }
 
 #' @export
diff --git a/R/plantminer.R b/R/plantminer.R
index 3be4832..05b67a1 100644
--- a/R/plantminer.R
+++ b/R/plantminer.R
@@ -3,14 +3,14 @@
 #' @export
 #' @param plants (character) Vector of plant species names. Required.
 #' @param from (character) One of tpl (for theplantlist.com data), or
-#'    flora (for Brazilian Flora Checklist). Required. Deafult: \code{tpl}
+#'    flora (for Brazilian Flora Checklist). Required. Default: \code{tpl}
 #' @param key (character) Your api key for the plantminer.com site.  Go to
 #' 		http://www.plantminer.com/ to get your api key.  Two options for
 #' 		inputting your key.  1) You can input it manually within the function as
 #' 		the second argument, or 2) you can put the key in your .Rprofile file,
 #' 		which will then be loaded when you start R. See
 #' 		http://bit.ly/135eG0b for help on how to put api keys in your .Rprofile file.
-#' @param verbose (logical) Verbose or not. Deafult: \code{TRUE}
+#' @param verbose (logical) Verbose or not. Default: \code{TRUE}
 #' @return data.frame of results.
 #' @examples \dontrun{
 #' # A single taxon
diff --git a/R/sci2comm.R b/R/sci2comm.R
index f60920f..7394ab0 100644
--- a/R/sci2comm.R
+++ b/R/sci2comm.R
@@ -3,13 +3,14 @@
 #' @export
 #' @param scinames character; One or more scientific names or partial names.
 #' @param db character; Data source, one of \emph{"eol"} (default),
-#' \emph{"itis"} \emph{"ncbi"}, \emph{"worms"}. Note that each taxonomic data
-#' source has their own identifiers,  so that if you provide the wrong
-#' \code{db} value for the identifier you could get a result, but it will
-#' likely be wrong (not what you were expecting).
+#' \emph{"itis"} \emph{"ncbi"}, \emph{"worms"}, or \emph{"iucn"}. Note that
+#' each taxonomic data source has their own identifiers,  so that if you
+#' provide the wrong \code{db} value for the identifier you could get a
+#' result, but it will likely be wrong (not what you were expecting).
 #' @param simplify (logical) If TRUE, simplify output to a vector of names.
 #' If FALSE, return variable formats from different sources, usually a
-#' data.frame. Only applies to eol and itis.
+#' data.frame. Only applies to eol and itis. Specify \code{FALSE} to obtain
+#' the language of each vernacular in the output for eol and itis.
 #' @param ... Further arguments passed on to functions
 #' \code{\link[taxize]{get_uid}}, \code{\link[taxize]{get_tsn}}.
 #' @param id character; identifiers, as returned by
@@ -23,6 +24,10 @@
 #' session by running \code{options(eolApiKey = "<your eol api key>")} in
 #' the console.
 #'
+#' Note that IUCN also requires an API key. See
+#' \code{\link[rredlist]{rredlist-package}} for help on authentiating with
+#' IUCN Redlist
+#'
 #' @return List of character vectors, named by input taxon name, or taxon ID
 #'
 #' @seealso \code{\link[taxize]{comm2sci}}
@@ -36,19 +41,20 @@
 #' sci2comm(scinames='Puma concolor', db='ncbi')
 #' sci2comm('Gadus morhua', db='worms')
 #' sci2comm('Pomatomus saltatrix', db='worms')
+#' sci2comm('Loxodonta africana', db='iucn')
 #'
 #' # Passing id in, works for sources: itis and ncbi, not eol
 #' sci2comm(get_tsn('Helianthus annuus'))
 #' sci2comm(get_uid('Helianthus annuus'))
 #' sci2comm(get_wormsid('Gadus morhua'))
+#' sci2comm(get_iucn('Loxodonta africana'))
 #'
 #' # Don't simplify returned
 #' sci2comm(get_tsn('Helianthus annuus'), simplify=FALSE)
+#' sci2comm(get_iucn('Loxodonta africana'), simplify=FALSE)
 #'
 #' # Use curl options
 #' library("httr")
-#' sci2comm(scinames='Helianthus annuus', config=verbose())
-#' sci2comm('Helianthus annuus', db="itis", config=verbose())
 #' sci2comm('Helianthus annuus', db="ncbi", config=verbose())
 #' }
 #' @rdname sci2comm
@@ -60,47 +66,8 @@ sci2comm <- function(...){
 #' @export
 #' @rdname sci2comm
 sci2comm.default <- function(scinames, db='eol', simplify=TRUE, ...) {
-  itis2comm <- function(x, simplify=TRUE, ...){
-    tsn <- get_tsn(x, ...)
-    itis_foo(tsn, simplify, ...)
-  }
-
-  eol2comm <- function(x, ...){
-    tmp <- eol_search(terms = x, ...)
-    pageids <- tmp[grep(x, tmp$name), "pageid"]
-    dfs <- tc(lapply(pageids, function(x)
-      eol_pages(taxonconceptID = x, common_names = TRUE, ...)$vernac))
-    tt <- ldply(dfs[sapply(dfs, class) == "data.frame"])
-    if (simplify) {
-      ss <- as.character(tt$vernacularname)
-      ss[ !is.na(ss) ]
-    } else{
-      tt
-    }
-  }
-
-  ncbi2comm <- function(x, ...){
-    uid <- get_uid(x, ...)
-    ncbi_foo(uid, ...)
-  }
-
-  worms2comm <- function(x, ...){
-    id <- get_wormsid(x, ...)
-    worms_foo(id, ...)
-  }
-
-  getsci <- function(nn, simplify, ...){
-    switch(
-      db,
-      eol = eol2comm(nn, simplify, ...),
-      itis = itis2comm(nn, simplify, ...),
-      ncbi = ncbi2comm(nn, ...),
-      worms = worms2comm(nn, ...)
-    )
-  }
-  temp <- lapply(scinames, getsci, simplify, ...)
-  names(temp) <- scinames
-  temp
+  temp <- lapply(scinames, getsci, db = db, simplify = simplify, ...)
+  stats::setNames(temp, scinames)
 }
 
 #' @export
@@ -127,6 +94,74 @@ sci2comm.wormsid <- function(id, simplify=TRUE, ...) {
   return(out)
 }
 
+#' @export
+#' @rdname sci2comm
+sci2comm.iucn <- function(id, simplify=TRUE, ...) {
+  #out <- lapply(id, function(x) iucn_foo(x, simplify, ...))
+  out <- vector("list", length(id))
+  for (i in seq_along(id)) {
+    out[[i]] <- iucn_foo(attr(id, "name")[i], simplify, ...)
+  }
+  names(out) <- id
+  return(out)
+}
+
+
+
+itis2comm <- function(x, simplify, ...){
+  tsn <- get_tsn(x, ...)
+  itis_foo(tsn, simplify = simplify, ...)
+}
+
+eol2comm <- function(x, simplify, ...){
+  tmp <- eol_search(terms = x, ...)
+  pageids <- tmp[grep(x, tmp$name, ignore.case = TRUE), "pageid"]
+  dfs <- tc(
+    lapply(pageids, function(x) {
+      tmp <- tryCatch(
+        eol_pages(taxonconceptID = x, common_names = TRUE, ...),
+        error = function(e) e
+      )
+      if (inherits(tmp, "error")) NULL else tmp$vernac
+    })
+  )
+  tt <- ldply(dfs[sapply(dfs, class) == "data.frame"])
+  tt <- tt[!duplicated(tt), ]
+  if (simplify) {
+    ss <- as.character(tt$vernacularname)
+    ss[ !is.na(ss) ]
+  } else{
+    tt
+  }
+}
+
+ncbi2comm <- function(x, ...){
+  uid <- get_uid(x, ...)
+  ncbi_foo(uid, ...)
+}
+
+worms2comm <- function(x, simplify, ...){
+  id <- get_wormsid(x, ...)
+  worms_foo(id, simplify = simplify, ...)
+}
+
+iucn2comm <- function(x, simplify, ...){
+  id <- get_iucn(x, ...)
+  iucn_foo(attr(id, "name"), simplify = simplify, ...)
+}
+
+getsci <- function(nn, db, simplify, ...){
+  switch(
+    db,
+    eol = eol2comm(nn, simplify, ...),
+    itis = itis2comm(nn, simplify, ...),
+    ncbi = ncbi2comm(nn, ...),
+    worms = worms2comm(nn, simplify, ...),
+    iucn = iucn2comm(nn, simplify, ...)
+  )
+}
+
+
 itis_foo <- function(x, simplify=TRUE, ...){
   # if tsn is not found
   if (is.na(x)) {
@@ -178,3 +213,25 @@ worms_foo <- function(x, simplify=TRUE, ...){
     out
   }
 }
+
+iucn_foo <- function(x, simplify=TRUE, ...){
+  # if id is not found
+  if (is.na(x)) {
+    out <- NA
+  } else {
+    out <- rredlist::rl_common_names(name = x, ...)
+    # if common name is not found
+    if (NROW(out$result) == 0) {
+      out <- NA
+    }
+  }
+  if (simplify) {
+    if (!inherits(out$result, "data.frame")) {
+      out$result
+    } else {
+      as.character(out$result$taxonname)
+    }
+  } else{
+    out$result
+  }
+}
diff --git a/R/scrapenames.r b/R/scrapenames.r
index e2f6df6..8869faf 100644
--- a/R/scrapenames.r
+++ b/R/scrapenames.r
@@ -3,41 +3,44 @@
 #' @description Uses the Global Names Recognition and Discovery service, see
 #' \url{http://gnrd.globalnames.org/}.
 #'
-#' Note: this function somestimes gives data back and sometimes not. The API that this
-#' function is extremely buggy.
+#' Note: this function sometimes gives data back and sometimes not. The API
+#' that this function is extremely buggy.
 #'
 #' @export
 #' @param url An encoded URL for a web page, PDF, Microsoft Office document, or
-#'    image file, see examples
-#' @param file When using multipart/form-data as the content-type, a file may be sent.
-#'    This should be a path to your file on your machine.
+#' image file, see examples
+#' @param file When using multipart/form-data as the content-type, a file may
+#' be sent. This should be a path to your file on your machine.
 #' @param text Type: string. Text content; best used with a POST request, see
-#'    examples
+#' examples
 #' @param engine (optional) (integer) Default: 0. Either 1 for TaxonFinder,
-#'    2 for NetiNeti, or 0 for both. If absent, both engines are used.
-#' @param unique (optional) (logical) If \code{TRUE} (default), response has unique
-#'    names without offsets.
-#' @param verbatim (optional) Type: boolean, If \code{TRUE} (default to \code{FALSE}),
-#'    response excludes verbatim strings.
-#' @param detect_language (optional) Type: boolean, When \code{TRUE} (default), NetiNeti
-#'    is not used if the language of incoming text is determined not to be English. When
-#'    \code{FALSE}, NetiNeti will be used if requested.
-#' @param all_data_sources (optional) Type: boolean. Resolve found names against all available
-#'    Data Sources.
-#' @param data_source_ids (optional) Type: string. Pipe separated list of data source ids to
-#'    resolve found names against. See list of Data Sources
-#'    \url{http://resolver.globalnames.org/data_sources}.
+#' 2 for NetiNeti, or 0 for both. If absent, both engines are used.
+#' @param unique (optional) (logical) If \code{TRUE} (default), response has
+#' unique names without offsets.
+#' @param verbatim (optional) Type: boolean, If \code{TRUE} (default to
+#' \code{FALSE}), response excludes verbatim strings.
+#' @param detect_language (optional) Type: boolean, When \code{TRUE} (default),
+#' NetiNeti is not used if the language of incoming text is determined not to
+#' be English. When \code{FALSE}, NetiNeti will be used if requested.
+#' @param all_data_sources (optional) Type: boolean. Resolve found names
+#' against all available Data Sources.
+#' @param data_source_ids (optional) Type: string. Pipe separated list of
+#' data source ids to resolve found names against. See list of Data Sources
+#' \url{http://resolver.globalnames.org/data_sources}.
+#' @param return_content (logical) return OCR'ed text. returns text
+#' string in \code{x$meta$content} slot. Default: \code{FALSE}
 #' @param ... Further args passed to \code{\link[httr]{GET}}
 #' @author Scott Chamberlain {myrmecocystus@@gmail.com}
-#' @return A list of length two, first is metadata, second is the data as a data.frame.
+#' @return A list of length two, first is metadata, second is the data as a
+#' data.frame.
 #' @details One of url, file, or text must be specified - and only one of them.
 #' @examples \dontrun{
 #' # Get data from a website using its URL
-#' scrapenames(url = 'http://en.wikipedia.org/wiki/Araneae')
-#' scrapenames(url = 'http://en.wikipedia.org/wiki/Animalia')
-#' scrapenames(url = 'http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0095068')
-#' scrapenames(url = 'http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0080498')
-#' scrapenames(url = 'http://ucjeps.berkeley.edu/cgi-bin/get_JM_treatment.pl?CARYOPHYLLACEAE')
+#' scrapenames('http://en.wikipedia.org/wiki/Araneae')
+#' scrapenames('http://en.wikipedia.org/wiki/Animalia')
+#' scrapenames('http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0095068')
+#' scrapenames('http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0080498')
+#' scrapenames('http://ucjeps.berkeley.edu/cgi-bin/get_JM_treatment.pl?CARYOPHYLLACEAE')
 #'
 #' # Scrape names from a pdf at a URL
 #' url <- 'http://www.plosone.org/article/fetchObject.action?uri=
@@ -45,8 +48,10 @@
 #' scrapenames(url = sub('\n', '', url))
 #'
 #' # With arguments
-#' scrapenames(url = 'http://www.mapress.com/zootaxa/2012/f/z03372p265f.pdf', unique=TRUE)
-#' scrapenames(url = 'http://en.wikipedia.org/wiki/Araneae', data_source_ids=c(1, 169))
+#' scrapenames(url = 'http://www.mapress.com/zootaxa/2012/f/z03372p265f.pdf',
+#'   unique=TRUE)
+#' scrapenames(url = 'http://en.wikipedia.org/wiki/Araneae',
+#'   data_source_ids=c(1, 169))
 #'
 #' # Get data from a file
 #' speciesfile <- system.file("examples", "species.txt", package = "taxize")
@@ -60,14 +65,19 @@
 #' # Get data from text string
 #' scrapenames(text='A spider named Pardosa moesta Banks, 1892')
 #'
+#' # return OCR content
+#' scrapenames(url='http://www.mapress.com/zootaxa/2012/f/z03372p265f.pdf',
+#'   return_content = TRUE)
+#'
 #' # use curl options
 #' library("httr")
-#' scrapenames(text='A spider named Pardosa moesta Banks, 1892', config = verbose())
+#' scrapenames(text='A spider named Pardosa moesta Banks, 1892')
 #' }
 
 scrapenames <- function(url = NULL, file = NULL, text = NULL, engine = NULL,
-  unique = NULL, verbatim = NULL, detect_language = NULL, all_data_sources = NULL,
-  data_source_ids = NULL, ...) {
+  unique = NULL, verbatim = NULL, detect_language = NULL,
+  all_data_sources = NULL, data_source_ids = NULL,
+  return_content = FALSE, ...) {
 
   method <- tc(list(url = url, file = file, text = text))
   if (length(method) > 1) {
@@ -75,11 +85,13 @@ scrapenames <- function(url = NULL, file = NULL, text = NULL, engine = NULL,
   }
 
   base <- "http://gnrd.globalnames.org/name_finder.json"
-  if (!is.null(data_source_ids)) data_source_ids <- paste0(data_source_ids, collapse = "|")
+  if (!is.null(data_source_ids))
+    data_source_ids <- paste0(data_source_ids, collapse = "|")
   args <- tc(list(url = url, text = text, engine = engine, unique = unique,
                   verbatim = verbatim, detect_language = detect_language,
                   all_data_sources = all_data_sources,
-                  data_source_ids = data_source_ids))
+                  data_source_ids = data_source_ids,
+                  return_content = as_l(return_content)))
   if (names(method) == 'url') {
     tt <- GET(base, query = args, ...)
     warn_for_status(tt)
@@ -87,7 +99,8 @@ scrapenames <- function(url = NULL, file = NULL, text = NULL, engine = NULL,
     token_url <- out$token_url
   } else {
     if (names(method) == "text") {
-      tt <- POST(base, body = list(text = text), encode = "form", dontfollow(), ...)
+      tt <- POST(base, body = list(text = text), encode = "form",
+                 dontfollow(), ...)
     } else {
       tt <- POST(base, query = argsnull(args), encode = "multipart",
                  body = list(file = upload_file(file)), dontfollow(), ...)
diff --git a/R/synonyms.R b/R/synonyms.R
index 1318e7c..c43740f 100644
--- a/R/synonyms.R
+++ b/R/synonyms.R
@@ -25,9 +25,13 @@
 #' toggle whether only accepted names are used \code{accepted = TRUE}, or if
 #' all are used \code{accepted = FALSE}. The default is \code{accepted = FALSE}
 #'
+#' Note that IUCN requires an API key. See
+#' \code{\link[rredlist]{rredlist-package}} for help on authentiating with
+#' IUCN Redlist
+#'
 #' @seealso \code{\link[taxize]{get_tsn}}, \code{\link[taxize]{get_tpsid}},
 #' \code{\link[taxize]{get_nbnid}}, \code{\link[taxize]{get_colid}},
-#' \code{\link[taxize]{get_wormsid}}
+#' \code{\link[taxize]{get_wormsid}}, \code{\link[taxize]{get_iucn}}
 #'
 #' @export
 #' @examples \dontrun{
@@ -35,8 +39,9 @@
 #' synonyms(183327, db="itis")
 #' synonyms("25509881", db="tropicos")
 #' synonyms("NBNSYS0000004629", db='nbn')
-#' synonyms("87e986b0873f648711900866fa8abde7", db='col')
+#' # synonyms("87e986b0873f648711900866fa8abde7", db='col') # FIXME
 #' synonyms(105706, db='worms')
+#' synonyms(12392, db='iucn')
 #'
 #' # Plug in taxon names directly
 #' synonyms("Pinus contorta", db="itis")
@@ -63,6 +68,7 @@
 #' synonyms(get_tpsid("Poa annua"))
 #' synonyms(get_nbnid("Carcharodon carcharias"))
 #' synonyms(get_colid("Ornithodoros lagophilus"))
+#' synonyms(get_iucn('Loxodonta africana'))
 #'
 #' # Pass many ids from class "ids"
 #' out <- get_ids(names="Poa annua", db = c('itis','tropicos'))
@@ -105,7 +111,7 @@ synonyms <- function(...) {
 
 #' @export
 #' @rdname synonyms
-synonyms.default <- function(x, db = NULL, rows = NaN, ...) {
+synonyms.default <- function(x, db = NULL, rows = NA, ...) {
   nstop(db)
   switch(
     db,
@@ -134,6 +140,11 @@ synonyms.default <- function(x, db = NULL, rows = NaN, ...) {
       structure(stats::setNames(synonyms(id, ...), x),
                 class = "synonyms", db = "worms")
     },
+    iucn = {
+      id <- process_syn_ids(x, db, get_iucn, ...)
+      structure(stats::setNames(synonyms(id, ...), x),
+                class = "synonyms", db = "iucn")
+    },
     stop("the provided db value was not recognised", call. = FALSE)
   )
 }
@@ -147,8 +158,10 @@ process_syn_ids <- function(input, db, fxn, ...){
                      tropicos = as.tpsid,
                      nbn = as.nbnid,
                      col = as.colid,
-                     worms = as.wormsid)
-    as_fxn(input, check = FALSE)
+                     worms = as.wormsid,
+                     iucn = as.iucn)
+    if (db == "iucn") return(as_fxn(input, check = TRUE))
+    return(as_fxn(input, check = FALSE))
   } else {
     eval(fxn)(input, ...)
   }
@@ -160,24 +173,26 @@ synonyms.tsn <- function(id, ...) {
   fun <- function(x){
     if (is.na(x)) { NA } else {
       is_acc <- rit_acc_name(x, ...)
-      if (!is.na(is_acc$acceptedName)) {
-        x <- is_acc$acceptedTsn
-        accdf <- setNames(
+      if (all(!is.na(is_acc$acceptedName))) {
+        accdf <- stats::setNames(
           data.frame(x[1], is_acc, stringsAsFactors = FALSE),
-          c("sub_tsn", "acc_name", "acc_tsn", "author")
+          c("sub_tsn", "acc_name", "acc_tsn", "acc_author")
         )
-        message("Accepted name is '", is_acc$acceptedName, "'")
-        message("Using tsn ", is_acc$acceptedTsn, "\n")
+        x <- is_acc$acceptedTsn
+        message("Accepted name(s) is/are '",
+                paste0(is_acc$acceptedName, collapse = "/"), "'")
+        message("Using tsn(s) ", paste0(is_acc$acceptedTsn, collapse = "/"),
+                "\n")
       } else {
         accdf <- data.frame(sub_tsn = x[1], acc_tsn = x[1],
                             stringsAsFactors = FALSE)
       }
-      out <- ritis::synonym_names(x, ...)
+      out <- do.call("rbind", lapply(x, ritis::synonym_names, ...))
       if (NROW(out) == 0) {
         out <- data.frame(syn_name = "nomatch", syn_tsn = x[1],
                           stringsAsFactors = FALSE)
       } else {
-        out <- setNames(out, c('author', 'syn_name', 'syn_tsn'))
+        out <- stats::setNames(out, c('syn_author', 'syn_name', 'syn_tsn'))
       }
       if (as.character(out[1,1]) == 'nomatch') {
         out <- data.frame(message = "no syns found", stringsAsFactors = FALSE)
@@ -271,6 +286,22 @@ synonyms.wormsid <- function(id, ...) {
   stats::setNames(lapply(id, fun), id)
 }
 
+#' @export
+#' @rdname synonyms
+synonyms.iucn <- function(id, ...) {
+  out <- vector(mode = "list", length = length(id))
+  for (i in seq_along(id)) {
+    if (is.na(id[[i]])) {
+      out[[i]] <- NA
+    } else {
+      out[[i]] <- rredlist::rl_synonyms(attr(id, "name")[i], ...)$result
+    }
+  }
+  stats::setNames(out, id)
+}
+
+
+
 
 
 
diff --git a/R/tax_agg.R b/R/tax_agg.R
index 230551e..c11101a 100644
--- a/R/tax_agg.R
+++ b/R/tax_agg.R
@@ -8,7 +8,7 @@
 #' their own identifiers, so that if you provide the wrong \code{db} value
 #' for the identifier you could get a result, but it will likely be wrong (not
 #' what you were expecting).
-#' @param verbose (loigical) If FALSE (Default) suppresss messages
+#' @param verbose (logical) If FALSE (Default) suppress messages
 #' @param ... Other arguments passed to \code{\link[taxize]{get_tsn}} or \code{\link[taxize]{get_uid}}.
 #'
 #' @details \code{tax_agg} aggregates (sum) taxa to a specific taxonomic level.
diff --git a/R/tax_name.R b/R/tax_name.R
index c84346f..6f705bf 100644
--- a/R/tax_name.R
+++ b/R/tax_name.R
@@ -9,8 +9,8 @@
 #'  both.
 #' @param pref (character) If db = 'both', sets the preference for the union.
 #' Either 'ncbi' (default) or 'itis'. Currently not implemented.
-#' @param verbose (logical) If \code{TRUE} the actual taxon queried is printed on the
-#' console.
+#' @param verbose (logical) If \code{TRUE} the actual taxon queried is printed
+#' on the console.
 #' @param ... Other arguments passed to \code{\link{get_tsn}} or
 #' \code{\link{get_uid}}.
 #'
@@ -19,7 +19,7 @@
 #'
 #' @note While \code{\link{tax_rank}} returns the actual rank of a
 #' taxon, \code{\link{tax_name}} searches and returns any specified rank
-#' higher in taxonmy.
+#' higher in taxonomy.
 #'
 #' @seealso \code{\link{classification}}
 #'
@@ -27,7 +27,8 @@
 #' # A case where itis and ncbi use the same names
 #' tax_name(query = "Helianthus annuus", get = "family", db = "itis")
 #' tax_name(query = "Helianthus annuus", get = "family", db = "ncbi")
-#' tax_name(query = "Helianthus annuus", get = c("genus","family","order"), db = "ncbi")
+#' tax_name(query = "Helianthus annuus", get = c("genus","family","order"),
+#'   db = "ncbi")
 #'
 #' # Case where itis and ncbi use different names
 #' tax_name(query = "Helianthus annuus", get = "kingdom", db = "itis")
@@ -44,7 +45,9 @@
 #' "kingdom"), db="both")
 #' }
 
-tax_name <- function(query, get, db = "itis", pref = 'ncbi', verbose = TRUE, ...) {
+tax_name <- function(query, get, db = "itis", pref = 'ncbi', verbose = TRUE,
+                     ...) {
+
   if (missing(get)) stop("you must supply a 'get' value", call. = FALSE)
   db <- match.arg(db, c('itis', 'ncbi', 'both'))
   if (db == 'both' & !pref %in% c('ncbi', 'itis')) {
diff --git a/R/tax_rank.R b/R/tax_rank.R
index 641c47b..fc13e00 100644
--- a/R/tax_rank.R
+++ b/R/tax_rank.R
@@ -1,91 +1,97 @@
 #' Get rank for a given taxonomic name.
 #'
 #' @export
-#' @param query character; Vector of taxonomic names to query.
-#' @param db character; The database to search from: 'tis', 'ncbi' or 'both'.
-#'  If 'both' both NCBI and ITIS will be queried. Result will be the union of
-#'  both. Note that each taxonomic data source has their own identifiers, so
-#'  that if you provide the wrong \code{db} value for the identifier you could
-#'  get a result, but it will likely be wrong (not what you were expecting).
-#' @param pref If db = 'both', sets the preference for the union. Either 'ncbi'
-#' or 'itis'.
-#' @param verbose logical; If TRUE the actual taxon queried is printed on the
-#' console.
-#' @param ... Other arguments passed to \code{\link[taxize]{get_tsn}} or \code{\link[taxize]{get_uid}}.
-#'
+#' @param x (character) Vector of one or more taxon names (character) or
+#' IDs (character or numeric) to query. Or objects returned from
+#' \code{get_*()} functions like \code{\link{get_tsn}}
+#' @param db (character) database to query. either \code{ncbi}, \code{itis},
+#' \code{eol}, \code{col}, \code{tropicos}, \code{gbif}, \code{nbn},
+#' \code{worms}, \code{natserv}, \code{bold}. Note that each taxonomic data
+#' source has their own identifiers, so that if you provide the wrong
+#' \code{db} value for the identifier you may get a result, but it will
+#' likely be wrong (not what you were expecting).
+#' @param ... Additional arguments to \code{\link{classification}}
+#' @return A named list of character vectors with ranks (all lower-cased)
 #' @note While \code{\link[taxize]{tax_name}} returns the name of a specified
-#' rank,
-#' \code{\link[taxize]{tax_rank}} returns the actual rank of the taxon.
-#'
-#' @return A data.frame with one column for every queried taxon.
-#'
+#' rank, \code{\link[taxize]{tax_rank}} returns the actual rank of the taxon.
 #' @seealso \code{\link[taxize]{classification}}, \code{\link[taxize]{tax_name}}
-#'
 #' @examples \dontrun{
-#' tax_rank(query = "Helianthus annuus", db = "itis")
-#' tax_rank(query = "Helianthus annuus", db = "ncbi")
-#' tax_rank(query = "Helianthus", db = "itis")
+#' tax_rank(x = "Helianthus annuus", db = "itis")
+#' tax_rank(get_tsn("Helianthus annuus"))
+#' tax_rank(c("Helianthus", "Pinus", "Poa"), db = "itis")
+#'
+#' tax_rank(get_boldid("Helianthus annuus"))
+#' tax_rank("421377", db = "bold")
+#' tax_rank(421377, db = "bold")
+#'
+#' tax_rank(c("Plantae", "Helianthus annuus",
+#'   "Puma", "Homo sapiens"), db = 'itis')
+#' tax_rank(c("Helianthus annuus", "Quercus", "Fabaceae"), db = 'tropicos')
 #'
-#' # query both
-#' tax_rank(query=c("Helianthus annuus", 'Puma'), db="both")
+#' tax_rank(names_list("species"), db = 'gbif')
+#' tax_rank(names_list("family"), db = 'gbif')
 #'
-#' # An alternative way would be to use classification() and sapply over
-#' # the list
-#' x <- 'Baetis'
-#' classi <- classification(get_uid(x))
-#' sapply(classi, function(x) x[nrow(x), 'rank'])
+#' tax_rank(c("Platanista gangetica", "Lichenopora neapolitana"),
+#'   db = "worms")
 #' }
+tax_rank <- function(x, db = NULL, ...) {
+  UseMethod("tax_rank")
+}
 
-tax_rank <- function(query = NULL, db = "itis", pref = 'ncbi', verbose = TRUE, ...) {
-  if(is.null(query))
-    stop('Need to specify query!\n')
-  if(!db %in% c('itis', 'ncbi', 'both'))
-    stop("db must be one of 'itis', 'ncbi' or 'both'!\n")
-  if(db == 'both' & !pref %in% c('ncbi', 'itis'))
-    stop("if db=both, pref must be either 'itis' or 'ncbi'!\n")
+#' @export
+tax_rank.default <- function(x, db = NULL, ...) {
+  stop("no 'tax_rank' method for ", class(x), call. = FALSE)
+}
 
-  fun <- function(query, get, db, verbose, ...){
-    # ITIS
-    if(db == "itis" | db == 'both'){
-      tsn <- get_tsn(query, searchtype = "scientific", verbose = verbose, ...)
-      if(is.na(tsn)) {
-        if(verbose)
-          message("No TSN found for species '", query, "'!\n")
-        out_tsn <- NA
-      } else {
-        tt <- classification(tsn, verbose=verbose, ...)[[1]]
-        out_tsn <- tt[nrow(tt), 'rank']
-        if(length(out_tsn) == 0)
-          out_tsn <- NA
-      }
-    }
+#' @export
+tax_rank.default <- function(x, db = NULL, ...) {
+  stats::setNames(tax_rank_(x, ...), x)
+}
+
+#' @export
+tax_rank.character <- function(x, db = NULL, ...) {
+  nstop(db)
+  stopifnot(length(db) == 1)
+  switch(
+    db,
+    bold = stats::setNames(tax_rank_(process_ids(x, db, get_boldid), ...), x),
+    col = stats::setNames(tax_rank_(process_ids(x, db, get_colid), ...), x),
+    eol = stats::setNames(tax_rank_(process_ids(x, db, get_eolid), ...), x),
+    gbif = stats::setNames(tax_rank_(process_ids(x, db, get_gbifid), ...), x),
+    natserv = stats::setNames(tax_rank_(process_ids(x, db, get_natservid),
+                                         ...), x),
+    nbn = stats::setNames(tax_rank_(process_ids(x, db, get_nbnid), ...), x),
+    tol = stats::setNames(tax_rank_(process_ids(x, db, get_tolid), ...), x),
+    tropicos = stats::setNames(tax_rank_(process_ids(x, db, get_tpsid), ...),
+                               x),
+    itis = stats::setNames(tax_rank_(process_ids(x, db, get_tsn), ...), x),
+    ncbi = stats::setNames(tax_rank_(process_ids(x, db, get_uid), ...), x),
+    worms = stats::setNames(tax_rank_(process_ids(x, db, get_wormsid), ...),
+                            x),
+    stop("the provided db value was not recognised", call. = FALSE)
+  )
+}
 
-    # NCBI
-    if(db == "ncbi" | db == 'both')	{
-      uid <- get_uid(query, verbose = verbose, ...)
-      if(is.na(uid)){
-        if(verbose)
-          message("No UID found for species '", query, "'!\n")
-        out_uid <- NA
+#' @export
+tax_rank.numeric <- function(x, db = NULL, ...) {
+  tax_rank(as.character(x), db, ...)
+}
+
+# ---------
+tax_rank_ <- function(id, ...) {
+  fun <- function(x, clz, ...) {
+    res <- classification(x, db = clz, ...)
+    if (is.na(res)) {
+      NA_character_
+    } else {
+      if (NROW(res[[1]]) > 0) {
+        tt <- res[[1]]
+        out <- tt[nrow(tt), 'rank'][[1]]
+        if (length(out) == 0) NA_character_ else tolower(out)
       } else {
-        hierarchy <- classification(uid, ...)[[1]]
-        out_uid <- hierarchy[nrow(hierarchy), 'rank']
-        if(length(out_uid) == 0)
-          out_uid <- NA
+        NA_character_
       }
     }
-
-    # combine
-    if(db == 'both') {
-      out <- ifelse(is.na(out_uid), out_tsn, out_uid)
-    }
-    if(db == 'ncbi')
-      out <- out_uid
-    if(db == 'itis')
-      out <- out_tsn
-    return(tolower(out))
   }
-  out <- ldply(query, fun, get, db, verbose, ...)
-  names(out) <- 'rank'
-  return(out)
+  lapply(id, fun, clz = dbswap(class(id)), ...)
 }
diff --git a/R/taxize-package.R b/R/taxize-package.R
index d91126c..230c0d9 100644
--- a/R/taxize-package.R
+++ b/R/taxize-package.R
@@ -83,6 +83,21 @@ NULL
 
 #' Lookup-table for IDs of taxonomic ranks
 #'
+#' data.frame of 36 rows, with 2 columns:
+#' \itemize{
+#'  \item rankid - a numeric rank id, consecutive
+#'  \item ranks - a comma separated vector of names that are considered
+#'  equal to one another within the row
+#' }
+#'
+#' We use this data.frame to do data sorting/filtering based on the ordering
+#' of ranks.
+#'
+#' Please let us know if there is a rank that occurs from one of the data
+#' sources \pkg{taxize} that we don't have in \code{rank_ref} dataset.
+#'
+#' Also let us know if you disagree with the ordering of ranks.
+#'
 #' @name rank_ref
 #' @docType data
 #' @keywords data
@@ -118,7 +133,7 @@ NULL
 #' \describe{
 #'   \item{original}{original data record from APG website}
 #'   \item{this}{Order name}
-#'   \item{that}{Replacment order name}
+#'   \item{that}{Replacement order name}
 #'   \item{order}{Order name}
 #' }
 #' @source \url{http://www.mobot.org/MOBOT/research/APweb/}
@@ -138,7 +153,7 @@ NULL
 #' \describe{
 #'   \item{original}{original data record from APG website}
 #'   \item{this}{Order name}
-#'   \item{that}{Replacment order name}
+#'   \item{that}{Replacement order name}
 #' }
 #' @source \url{http://www.mobot.org/MOBOT/research/APweb/}
 #' @name apg_orders
diff --git a/R/tnrs.R b/R/tnrs.R
index 4e63b7b..af4d2e7 100644
--- a/R/tnrs.R
+++ b/R/tnrs.R
@@ -17,16 +17,31 @@
 #'    IMPORTANT!!!!! ->
 #'        POST is the only option for this parameter if you want to
 #'        use source or code parameters.
-#' @param sleep Numer of seconds by which to pause between calls. Defaults to 0
+#' @param sleep Number of seconds by which to pause between calls. Defaults to 0
 #' 		seconds. Use when doing many calls in a for loop ar lapply type call.
 #' @param splitby Number by which to split species list for querying the TNRS.
 #' @param verbose Verbosity or not (default \code{TRUE})
 #' @param ... Curl options to pass in \code{\link[httr]{GET}} or
 #' \code{\link[httr]{POST}}
 #'
-#' @return data.frame of results from TNRS plus the name submitted.
+#' @return data.frame of results from TNRS plus the name submitted, with
+#' rows in order of user supplied names, though those with no matches are
+#' dropped
 #' @details If there is no match in the Taxosaurus database, nothing is
-#'    returned, so you will not get anything back for non-matches.
+#' returned, so you will not get anything back for non-matches.
+#'
+#' TNRS doesn't provide any advice about the occurrence of homonyms when
+#' queries have no indication of a taxonomic name's authority. So if there
+#' is any chance of a homonym, you probably want to send the authority as
+#' well, or use \code{\link{gnr_resolve}}. For example,
+#' \code{tnrs(query="Jussiaea linearis", source="iPlant_TNRS")} gives result of
+#' \emph{Jussiaea linearis (Willd.) Oliv. ex Kuntze}, but there is a
+#' homonym. If you do
+#' \code{tnrs(query="Jussiaea linearis Hochst.", source="iPlant_TNRS")} you
+#' get a direct match for that name. So, beware that there's no indication
+#' of homonyms.
+#' @references \url{http://taxosaurus.org/}
+#' @seealso \code{\link{gnr_resolve}}
 #' @examples \dontrun{
 #' mynames <- c("Helianthus annuus", "Poa annua", "Mimulus bicolor")
 #' tnrs(query = mynames, source = "iPlant_TNRS")
@@ -67,7 +82,6 @@ tnrs <- function(query = NA, source = NULL, code = NULL, getpost = "POST",
     if (getpost == "get") {
       if (!any(is.na(x))) {
         query2 <- paste(str_replace_all(x, ' ', '+'), collapse = '%0A')
-        #args <- tc(list(query = query2))
         args <- tc(list(query = query2, source = source, code = code))
         out <- GET(url, query = args, ...)
         error_handle(out)
@@ -78,7 +92,6 @@ tnrs <- function(query = NA, source = NULL, code = NULL, getpost = "POST",
     } else {
       loc <- tempfile(fileext = ".txt")
       write.table(data.frame(x), file = loc, col.names = FALSE, row.names = FALSE)
-      #args <- tc(list(file = upload_file(loc), source = source, code = code))
       args <- tc(list(source = source, code = code))
       body <- tc(list(file = upload_file(loc)))
       out <- POST(url, query = args, body = body, config(followlocation = 0), ...)
@@ -120,16 +133,19 @@ tnrs <- function(query = NA, source = NULL, code = NULL, getpost = "POST",
 
   if (length(query) < 1 || is.na(query)) stop("Please supply at least one name", call. = FALSE)
 
-  if (getpost == "get" && length(query) > 75 | length(query) > 30 && getpost == "post") {
+  if (getpost == "get" && length(query) > 75 |
+      length(query) > 30 && getpost == "post") {
     species_split <- slice(query, by = splitby)
 
     out <- lapply(species_split, function(x) mainfunc(x, ...))
     tmp <- data.frame(rbindlist(out), stringsAsFactors = FALSE)
-    setNames(tmp, tolower(names(tmp)))
   } else {
     tmp <- mainfunc(query, ...)
-    setNames(tmp, tolower(names(tmp)))
   }
+  tmp <- tmp[match(query, tmp$submittedName), ]
+  tmp <- na.omit(tmp)
+  row.names(tmp) <- NULL
+  stats::setNames(tmp, tolower(names(tmp)))
 }
 
 # Function to parse results
diff --git a/R/tpl_get.r b/R/tpl_get.r
index 4a443ed..d23a2f4 100644
--- a/R/tpl_get.r
+++ b/R/tpl_get.r
@@ -17,6 +17,7 @@
 #' # Get a few families
 #' dir <- file.path(tempdir(), "abc")
 #' tpl_get(dir, family = c("Platanaceae","Winteraceae"))
+#' readLines(file.path(dir, "Platanaceae.csv"), n = 5)
 #'
 #' # You can now get Gymnosperms as well
 #' dir1 <- file.path(tempdir(), "def")
diff --git a/R/upstream.R b/R/upstream.R
index c246ada..56b3916 100644
--- a/R/upstream.R
+++ b/R/upstream.R
@@ -59,7 +59,7 @@ upstream <- function(...) {
 
 #' @export
 #' @rdname upstream
-upstream.default <- function(x, db = NULL, upto = NULL, rows = NaN, ...){
+upstream.default <- function(x, db = NULL, upto = NULL, rows = NA, ...){
   nstop(upto, "upto")
   nstop(db)
   switch(
diff --git a/R/zzz.R b/R/zzz.R
index 033f27c..957ea40 100644
--- a/R/zzz.R
+++ b/R/zzz.R
@@ -12,10 +12,11 @@ pluck <- function(x, name, type) {
   }
 }
 
-collapse <- function(x, fxn, class, match=TRUE, ...){
+collapse <- function(x, fxn, class, match=TRUE, ...) {
   tmp <- lapply(x, fxn, ...)
   if (match) {
     structure(sapply(tmp, unclass), class = class,
+              name = unlist(sapply(tmp, attr, which = "name")),
               match = sapply(tmp, attr, which = "match"),
               multiple_matches = sapply(tmp, attr, which = "multiple_matches"),
               pattern_match = sapply(tmp, attr, which = "pattern_match"),
@@ -26,23 +27,12 @@ collapse <- function(x, fxn, class, match=TRUE, ...){
   }
 }
 
-make_generic <- function(x, uu, clz, check=TRUE){
-  if (check) {
-    if ( evalfxn(clz)(x) ) {
-      toid(x, uu, clz)
-    } else {
-      structure(NA, class = clz, match = "not found", multiple_matches = FALSE, pattern_match = FALSE, uri = NA)
-    }
-  } else {
-    toid(x, uu, clz)
-  }
-}
-
 evalfxn <- function(x) eval(parse(text = paste0("check", "_", x)))
 
-toid <- function(x, url, class){
+toid <- function(x, url, class, ...) {
   uri <- sprintf(url, x)
-  structure(x, class = class, match = "found", multiple_matches = FALSE, pattern_match = FALSE, uri = uri)
+  structure(x, class = class, match = "found", multiple_matches = FALSE,
+            pattern_match = FALSE, uri = uri, ...)
 }
 
 add_uri <- function(ids, url, z = NULL){
@@ -56,12 +46,21 @@ add_uri <- function(ids, url, z = NULL){
 }
 
 check_rows <- function(x){
-  stopifnot(is.numeric(x) || any(is.na(x)))
-  x
+  if (!is.numeric(x) && !any(is.na(x))) {
+    stop("'rows' must be numeric or NA", call. = FALSE)
+  }
+  if (is.numeric(x)) {
+    if (length(x) == 1) {
+      if (x < 1) {
+        stop("'rows' value must be an integer 1 or greater",
+             call. = FALSE)
+      }
+    }
+  }
 }
 
 sub_rows <- function(x, rows){
-  rows <- check_rows(rows)
+  check_rows(rows)
   if ( any(is.na(rows)) ) {
     x
   } else {
@@ -185,3 +184,26 @@ assert <- function(x, y) {
     }
   }
 }
+
+dt2df <- function(x) {
+  (data.table::setDF(
+    data.table::rbindlist(x, use.names = TRUE, fill = TRUE, idcol = TRUE)))
+}
+
+dbswap <- function(x) {
+  switch(
+    x,
+    boldid = "bold",
+    colid = "col",
+    eolid = "eol",
+    gbifid = "gbif",
+    natservid = "natserv",
+    nbnid = "nbn",
+    tolid = "tol",
+    tpsid = "tropicos",
+    tsn = "itis",
+    uid = "ncbi",
+    wormsid = "worms",
+    stop("'db' not recognized", call. = FALSE)
+  )
+}
diff --git a/README.md b/README.md
index 5adb487..f469bbe 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ The `taxize` tutorial is can be found at <https://ropensci.org/tutorials/taxize.
 
 The functions in the package that hit a specific API have a prefix and suffix separated by an underscore. They follow the format of `service_whatitdoes`.  For example, `gnr_resolve` uses the Global Names Resolver API to resolve species names.  General functions in the package that don't hit a specific API don't have two words separated by an underscore, e.g., `classification`.
 
-You need API keys for Encyclopedia of Life (EOL), and Tropicos.
+You need API keys for Encyclopedia of Life (EOL), Tropicos, IUCN, and NatureServe.
 
 ## SOAP
 
@@ -77,7 +77,7 @@ Note that a few data sources require SOAP web services, which are difficult to s
 	<td style="text-align:left;">IUCN Red List</td>
 	<td style="text-align:left;"><code>iucn</code></td>
 	<td style="text-align:left;"><a href="https://www.assembla.com/spaces/sis/wiki/Red_List_API?version=3">link</a></td>
-	<td style="text-align:left;">none</td>
+	<td style="text-align:left;"><a href="http://apiv3.iucnredlist.org/api/v3/token">link</a></td>
 </tr>
 <tr>
 	<td style="text-align:left;">Tropicos</td>
@@ -163,6 +163,12 @@ Note that a few data sources require SOAP web services, which are difficult to s
 	<td style="text-align:left;"><a href="https://services.natureserve.org/BrowseServices/getSpeciesData/getSpeciesListREST.jsp">link</a></td>
 	<td style="text-align:left;"><a href="https://services.natureserve.org/developer/index.jsp">link</a></td>
 </tr>
+<tr>
+	<td style="text-align:left;">Wikipedia</td>
+	<td style="text-align:left;"><code>wiki</code></td>
+	<td style="text-align:left;"><a href="https://www.mediawiki.org/wiki/API:Main_page">link</a></td>
+	<td style="text-align:left;">none</td>
+</tr>
 </tbody>
 </table>
 
@@ -288,8 +294,8 @@ Get all species in the genus _Apis_
 
 
 ```r
-downstream("Apis", db = 'itis', downto = 'Species', verbose = FALSE)
-#> $Apis
+downstream(as.tsn(154395), db = 'itis', downto = 'species', verbose = FALSE)
+#> $`154395`
 #>      tsn parentname parenttsn          taxonname rankid rankname
 #> 1 154396       Apis    154395     Apis mellifera    220  species
 #> 2 763550       Apis    154395 Apis andreniformis    220  species
@@ -312,6 +318,36 @@ Get all genera up from the species _Pinus contorta_ (this includes the genus of
 
 ```r
 upstream("Pinus contorta", db = 'itis', upto = 'Genus', verbose=FALSE)
+#>      tsn                        target
+#> 1 183327                Pinus contorta
+#> 2 183332 Pinus contorta ssp. bolanderi
+#> 3 822698  Pinus contorta ssp. contorta
+#> 4 183329 Pinus contorta ssp. latifolia
+#> 5 183330 Pinus contorta ssp. murrayana
+#> 6 529672 Pinus contorta var. bolanderi
+#> 7 183328  Pinus contorta var. contorta
+#> 8 529673 Pinus contorta var. latifolia
+#> 9 529674 Pinus contorta var. murrayana
+#>                                                        commonNames
+#> 1               scrub pine,shore pine,tamarack pine,lodgepole pine
+#> 2                                            Bolander's beach pine
+#> 3                                                               NA
+#> 4                         black pine,Rocky Mountain lodgepole pine
+#> 5                              tamarack pine,Sierra lodgepole pine
+#> 6                                              Bolander beach pine
+#> 7                  coast pine,lodgepole pine,beach pine,shore pine
+#> 8 tall lodgepole pine,lodgepole pine,Rocky Mountain lodgepole pine
+#> 9      Murray's lodgepole pine,Sierra lodgepole pine,tamarack pine
+#>      nameUsage
+#> 1     accepted
+#> 2 not accepted
+#> 3 not accepted
+#> 4 not accepted
+#> 5 not accepted
+#> 6     accepted
+#> 7     accepted
+#> 8     accepted
+#> 9     accepted
 #> $`Pinus contorta`
 #>      tsn parentname parenttsn   taxonname rankid rankname
 #> 1  18031   Pinaceae     18030       Abies    180    genus
@@ -335,12 +371,15 @@ upstream("Pinus contorta", db = 'itis', upto = 'Genus', verbose=FALSE)
 
 ```r
 synonyms("Acer drummondii", db="itis")
+#>      tsn             target commonNames    nameUsage
+#> 1 183671    Acer drummondii          NA not accepted
+#> 2 183672 Rufacer drummondii          NA not accepted
 #> $`Acer drummondii`
 #>   sub_tsn                    acc_name acc_tsn
-#> 1  526853 Acer rubrum var. drummondii  526853
-#> 2  526853 Acer rubrum var. drummondii  526853
-#> 3  526853 Acer rubrum var. drummondii  526853
-#>                          author                            author
+#> 1  183671 Acer rubrum var. drummondii  526853
+#> 2  183671 Acer rubrum var. drummondii  526853
+#> 3  183671 Acer rubrum var. drummondii  526853
+#>                      acc_author                        syn_author
 #> 1 (Hook. & Arn. ex Nutt.) Sarg. (Hook. & Arn. ex Nutt.) E. Murray
 #> 2 (Hook. & Arn. ex Nutt.) Sarg.             Hook. & Arn. ex Nutt.
 #> 3 (Hook. & Arn. ex Nutt.) Sarg.     (Hook. & Arn. ex Nutt.) Small
@@ -422,16 +461,16 @@ Furthermore, you can just back all ids if that's your jam with the `get_*_()` fu
 get_ids_(c("Chironomus riparius", "Pinus contorta"), db = 'nbn', rows=1:3)
 #> $nbn
 #> $nbn$`Chironomus riparius`
-#>   ptaxonversionkey    searchmatchtitle    rank  namestatus
-#> 1 NBNSYS0000027573 Chironomus riparius species Recommended
-#> 2 NHMSYS0001718042   Elaphrus riparius species Recommended
-#> 3 NBNSYS0000023345   Paederus riparius species Recommended
+#>               guid             scientificName    rank taxonomicStatus
+#> 1 NBNSYS0000027573        Chironomus riparius species        accepted
+#> 2 NHMSYS0000864966 Damaeus (Damaeus) riparius species        accepted
+#> 3 NHMSYS0021059238      Rhizoclonium riparium species        accepted
 #> 
 #> $nbn$`Pinus contorta`
-#>   ptaxonversionkey               searchmatchtitle       rank  namestatus
-#> 1 NHMSYS0000494848   Pinus contorta var. contorta    variety Recommended
-#> 2 NBNSYS0000004786                 Pinus contorta    species Recommended
-#> 3 NHMSYS0000494848 Pinus contorta subsp. contorta subspecies Recommended
+#>               guid                scientificName    rank taxonomicStatus
+#> 1 NBNSYS0000004786                Pinus contorta species        accepted
+#> 2 NHMSYS0000494858 Pinus contorta var. murrayana variety        accepted
+#> 3 NHMSYS0000494848  Pinus contorta var. contorta variety        accepted
 #> 
 #> 
 #> attr(,"class")
@@ -443,6 +482,22 @@ get_ids_(c("Chironomus riparius", "Pinus contorta"), db = 'nbn', rows=1:3)
 
 ```r
 sci2comm('Helianthus annuus', db = 'itis')
+#>      tsn                              target
+#> 1  36616                   Helianthus annuus
+#> 2 525928      Helianthus annuus ssp. jaegeri
+#> 3 525929 Helianthus annuus ssp. lenticularis
+#> 4 525930      Helianthus annuus ssp. texanus
+#> 5 536095 Helianthus annuus var. lenticularis
+#> 6 536096  Helianthus annuus var. macrocarpus
+#> 7 536097      Helianthus annuus var. texanus
+#>                                                  commonNames    nameUsage
+#> 1 annual sunflower,sunflower,wild sunflower,common sunflower     accepted
+#> 2                                                         NA not accepted
+#> 3                                                         NA not accepted
+#> 4                                                         NA not accepted
+#> 5                                                         NA not accepted
+#> 6                                                         NA not accepted
+#> 7                                                         NA not accepted
 #> $`Helianthus annuus`
 #> [1] "common sunflower" "sunflower"        "wild sunflower"  
 #> [4] "annual sunflower"
@@ -454,10 +509,10 @@ sci2comm('Helianthus annuus', db = 'itis')
 ```r
 comm2sci("black bear", db = "itis")
 #> $`black bear`
-#> [1] "Ursus thibetanus"            "Ursus thibetanus"           
-#> [3] "Ursus americanus luteolus"   "Ursus americanus"           
-#> [5] "Ursus americanus"            "Ursus americanus americanus"
-#> [7] "Chiropotes satanas"
+#> [1] "Chiropotes satanas"          "Ursus thibetanus"           
+#> [3] "Ursus thibetanus"            "Ursus americanus luteolus"  
+#> [5] "Ursus americanus"            "Ursus americanus"           
+#> [7] "Ursus americanus americanus"
 ```
 
 ## Lowest common rank among taxa
@@ -562,6 +617,4 @@ Check out our [milestones](https://github.com/ropensci/taxize/milestones) to see
 * Please note that this project is released with a [Contributor Code of Conduct](CONDUCT.md).
 By participating in this project you agree to abide by its terms.
 
-[![ropensci](https://ropensci.org/public_images/github_footer.png)](https://ropensci.org)
-
 [tut]: https://ropensci.org/tutorials/taxize.html
diff --git a/build/vignette.rds b/build/vignette.rds
index 505317b..216798c 100644
Binary files a/build/vignette.rds and b/build/vignette.rds differ
diff --git a/data/rank_ref.RData b/data/rank_ref.RData
index e689537..c5c41bf 100644
Binary files a/data/rank_ref.RData and b/data/rank_ref.RData differ
diff --git a/inst/doc/name_cleaning.Rmd b/inst/doc/name_cleaning.Rmd
index cc02af6..a8c5536 100644
--- a/inst/doc/name_cleaning.Rmd
+++ b/inst/doc/name_cleaning.Rmd
@@ -104,12 +104,15 @@ has a sister method with and trailing underscore, e.g., `get_tsn()` and `get_tsn
 ```r
 get_tsn_(searchterm = "Quercus b")
 #> $`Quercus b`
-#>       tsn         scientificname             commonnames nameusage
-#> 2   19300        Quercus bicolor         swamp white oak  accepted
-#> 7  195166      Quercus boyntonii Boynton's sand post oak  accepted
-#> 8  195168       Quercus buckleyi               Texas oak  accepted
-#> 9  506533        Quercus brantii             Brant's oak  accepted
-#> 10 507263 Quercus berberidifolia               scrub oak  accepted
+#> # A tibble: 5 x 4
+#>      tsn         scientificName                           commonNames
+#>    <chr>                  <chr>                                 <chr>
+#> 1  19300        Quercus bicolor     swamp white oak,ch<ea>ne bicolore
+#> 2 195166      Quercus boyntonii Boynton's sand post oak,Boynton's oak
+#> 3 195168       Quercus buckleyi               Texas oak,Buckley's oak
+#> 4 506533        Quercus brantii                           Brant's oak
+#> 5 507263 Quercus berberidifolia                             scrub oak
+#> # ... with 1 more variables: nameUsage <chr>
 ```
 
 The result is a single data.frame for each taxon queried, which can be
@@ -122,17 +125,21 @@ number of a range of numbers:
 ```r
 get_tsn_(searchterm = "Quercus b", rows = 1)
 #> $`Quercus b`
-#>     tsn  scientificname     commonnames nameusage
-#> 2 19300 Quercus bicolor swamp white oak  accepted
+#> # A tibble: 1 x 4
+#>     tsn  scientificName                       commonNames nameUsage
+#>   <chr>           <chr>                             <chr>     <chr>
+#> 1 19300 Quercus bicolor swamp white oak,ch<ea>ne bicolore  accepted
 ```
 
 
 ```r
 get_tsn_(searchterm = "Quercus b", rows = 1:2)
 #> $`Quercus b`
-#>      tsn    scientificname             commonnames nameusage
-#> 2  19300   Quercus bicolor         swamp white oak  accepted
-#> 7 195166 Quercus boyntonii Boynton's sand post oak  accepted
+#> # A tibble: 2 x 4
+#>      tsn    scientificName                           commonNames nameUsage
+#>    <chr>             <chr>                                 <chr>     <chr>
+#> 1  19300   Quercus bicolor     swamp white oak,ch<ea>ne bicolore  accepted
+#> 2 195166 Quercus boyntonii Boynton's sand post oak,Boynton's oak  accepted
 ```
 
 ## as.* methods
@@ -220,28 +227,60 @@ in a programmatic workflow straight away.
 ```r
 spp <- names_list(rank = "species", size = 10)
 gnr_resolve(names = spp, preferred_data_sources = 11)
-#>         user_supplied_name          submitted_name
-#> 1        Shorea beccariana       Shorea beccariana
-#> 2           Draba ramulosa          Draba ramulosa
-#> 3      Cyrtandra phoenicea     Cyrtandra phoenicea
-#> 4      Pulicaria pomeliana     Pulicaria pomeliana
-#> 5   Helichrysum gymnocomum  Helichrysum gymnocomum
-#> 6         Campium costatum        Campium costatum
-#> 7  Pseudosedum condensatum Pseudosedum condensatum
-#> 8      Grammitis mollipila     Grammitis mollipila
-#> 9      Dioscorea cruzensis     Dioscorea cruzensis
-#> 10         Cereus coracare         Cereus coracare
-#>                          matched_name      data_source_title score
-#> 1             Shorea beccariana Burck GBIF Backbone Taxonomy 0.988
-#> 2              Draba ramulosa Rollins GBIF Backbone Taxonomy 0.988
-#> 3     Cyrtandra phoenicea C.B. Clarke GBIF Backbone Taxonomy 0.988
-#> 4   Pulicaria pomeliana Faure & Maire GBIF Backbone Taxonomy 0.988
-#> 5          Helichrysum gymnocomum DC. GBIF Backbone Taxonomy 0.988
-#> 6             Campium costatum Copel. GBIF Backbone Taxonomy 0.988
-#> 7     Pseudosedum condensatum Boriss. GBIF Backbone Taxonomy 0.988
-#> 8  Grammitis mollipila (Baker) Copel. GBIF Backbone Taxonomy 0.988
-#> 9         Dioscorea cruzensis R.Knuth GBIF Backbone Taxonomy 0.988
-#> 10                                                             NaN
+#>          user_supplied_name           submitted_name
+#> 1     Helichrysum candollei    Helichrysum candollei
+#> 2          Haworthia retusa         Haworthia retusa
+#> 3          Crypsinus bakeri         Crypsinus bakeri
+#> 4  Mangifera philippinensis Mangifera philippinensis
+#> 5    Selaginella atirrensis   Selaginella atirrensis
+#> 6   Hymenostomum sullivanii  Hymenostomum sullivanii
+#> 7   Hymenostomum sullivanii  Hymenostomum sullivanii
+#> 8         Cytisus urumoffii        Cytisus urumoffii
+#> 9         Cytisus urumoffii        Cytisus urumoffii
+#> 10        Cytisus urumoffii        Cytisus urumoffii
+#> 11        Baptisia uniflora        Baptisia uniflora
+#> 12        Baptisia uniflora        Baptisia uniflora
+#> 13        Baptisia uniflora        Baptisia uniflora
+#> 14        Baptisia uniflora        Baptisia uniflora
+#> 15     Nephelium xerocarpum     Nephelium xerocarpum
+#> 16  Baccharis gnaphalioides  Baccharis gnaphalioides
+#> 17  Baccharis gnaphalioides  Baccharis gnaphalioides
+#>                                             matched_name
+#> 1  Helichrysum candollei (Bojer ex DC.) R.Vig. & Humbert
+#> 2                            Haworthia retusa (L.) Duval
+#> 3                        Crypsinus bakeri (Luerss.) Tag.
+#> 4                      Mangifera philippinensis Mukherji
+#> 5                         Selaginella atirrensis Hieron.
+#> 6      Hymenostomum sullivanii C. Müller ex Geheeb, 1897
+#> 7                      Hymenostomum sullivanii C. Müller
+#> 8                     Cytisus urumoffii Davidov ex Stoj.
+#> 9                Cytisus urumoffii Davidoff ex Stoyanoff
+#> 10                            Cytisus urumoffii Davidoff
+#> 11                               Baptisia uniflora Hook.
+#> 12                      Baptisia uniflora (Michx.) Nutt.
+#> 13                        Baptisia uniflora (Michx.) Sm.
+#> 14                             Baptisia uniflora Spreng.
+#> 15                   Nephelium xerocarpum (Bl.) Cambess.
+#> 16                       Baccharis gnaphalioides Spreng.
+#> 17                           Baccharis gnaphalioides DC.
+#>         data_source_title score
+#> 1  GBIF Backbone Taxonomy 0.988
+#> 2  GBIF Backbone Taxonomy 0.988
+#> 3  GBIF Backbone Taxonomy 0.988
+#> 4  GBIF Backbone Taxonomy 0.988
+#> 5  GBIF Backbone Taxonomy 0.988
+#> 6  GBIF Backbone Taxonomy 0.988
+#> 7  GBIF Backbone Taxonomy 0.988
+#> 8  GBIF Backbone Taxonomy 0.988
+#> 9  GBIF Backbone Taxonomy 0.988
+#> 10 GBIF Backbone Taxonomy 0.988
+#> 11 GBIF Backbone Taxonomy 0.988
+#> 12 GBIF Backbone Taxonomy 0.988
+#> 13 GBIF Backbone Taxonomy 0.988
+#> 14 GBIF Backbone Taxonomy 0.988
+#> 15 GBIF Backbone Taxonomy 0.988
+#> 16 GBIF Backbone Taxonomy 0.988
+#> 17 GBIF Backbone Taxonomy 0.988
 ```
 
 ## Other functions
diff --git a/inst/doc/name_cleaning.html b/inst/doc/name_cleaning.html
index 4477a45..8c97a38 100644
--- a/inst/doc/name_cleaning.html
+++ b/inst/doc/name_cleaning.html
@@ -294,12 +294,15 @@ has a sister method with and trailing underscore, e.g., <code>get_tsn()</code> a
 
 <pre><code class="r">get_tsn_(searchterm = "Quercus b")
 #> $`Quercus b`
-#>       tsn         scientificname             commonnames nameusage
-#> 2   19300        Quercus bicolor         swamp white oak  accepted
-#> 7  195166      Quercus boyntonii Boynton's sand post oak  accepted
-#> 8  195168       Quercus buckleyi               Texas oak  accepted
-#> 9  506533        Quercus brantii             Brant's oak  accepted
-#> 10 507263 Quercus berberidifolia               scrub oak  accepted
+#> # A tibble: 5 x 4
+#>      tsn         scientificName                           commonNames
+#>    <chr>                  <chr>                                 <chr>
+#> 1  19300        Quercus bicolor     swamp white oak,ch<ea>ne bicolore
+#> 2 195166      Quercus boyntonii Boynton's sand post oak,Boynton's oak
+#> 3 195168       Quercus buckleyi               Texas oak,Buckley's oak
+#> 4 506533        Quercus brantii                           Brant's oak
+#> 5 507263 Quercus berberidifolia                             scrub oak
+#> # ... with 1 more variables: nameUsage <chr>
 </code></pre>
 
 <p>The result is a single data.frame for each taxon queried, which can be
@@ -310,15 +313,19 @@ number of a range of numbers:</p>
 
 <pre><code class="r">get_tsn_(searchterm = "Quercus b", rows = 1)
 #> $`Quercus b`
-#>     tsn  scientificname     commonnames nameusage
-#> 2 19300 Quercus bicolor swamp white oak  accepted
+#> # A tibble: 1 x 4
+#>     tsn  scientificName                       commonNames nameUsage
+#>   <chr>           <chr>                             <chr>     <chr>
+#> 1 19300 Quercus bicolor swamp white oak,ch<ea>ne bicolore  accepted
 </code></pre>
 
 <pre><code class="r">get_tsn_(searchterm = "Quercus b", rows = 1:2)
 #> $`Quercus b`
-#>      tsn    scientificname             commonnames nameusage
-#> 2  19300   Quercus bicolor         swamp white oak  accepted
-#> 7 195166 Quercus boyntonii Boynton's sand post oak  accepted
+#> # A tibble: 2 x 4
+#>      tsn    scientificName                           commonNames nameUsage
+#>    <chr>             <chr>                                 <chr>     <chr>
+#> 1  19300   Quercus bicolor     swamp white oak,ch<ea>ne bicolore  accepted
+#> 2 195166 Quercus boyntonii Boynton's sand post oak,Boynton's oak  accepted
 </code></pre>
 
 <h2>as.* methods</h2>
@@ -398,28 +405,60 @@ in a programmatic workflow straight away.</p>
 
 <pre><code class="r">spp <- names_list(rank = "species", size = 10)
 gnr_resolve(names = spp, preferred_data_sources = 11)
-#>         user_supplied_name          submitted_name
-#> 1        Shorea beccariana       Shorea beccariana
-#> 2           Draba ramulosa          Draba ramulosa
-#> 3      Cyrtandra phoenicea     Cyrtandra phoenicea
-#> 4      Pulicaria pomeliana     Pulicaria pomeliana
-#> 5   Helichrysum gymnocomum  Helichrysum gymnocomum
-#> 6         Campium costatum        Campium costatum
-#> 7  Pseudosedum condensatum Pseudosedum condensatum
-#> 8      Grammitis mollipila     Grammitis mollipila
-#> 9      Dioscorea cruzensis     Dioscorea cruzensis
-#> 10         Cereus coracare         Cereus coracare
-#>                          matched_name      data_source_title score
-#> 1             Shorea beccariana Burck GBIF Backbone Taxonomy 0.988
-#> 2              Draba ramulosa Rollins GBIF Backbone Taxonomy 0.988
-#> 3     Cyrtandra phoenicea C.B. Clarke GBIF Backbone Taxonomy 0.988
-#> 4   Pulicaria pomeliana Faure & Maire GBIF Backbone Taxonomy 0.988
-#> 5          Helichrysum gymnocomum DC. GBIF Backbone Taxonomy 0.988
-#> 6             Campium costatum Copel. GBIF Backbone Taxonomy 0.988
-#> 7     Pseudosedum condensatum Boriss. GBIF Backbone Taxonomy 0.988
-#> 8  Grammitis mollipila (Baker) Copel. GBIF Backbone Taxonomy 0.988
-#> 9         Dioscorea cruzensis R.Knuth GBIF Backbone Taxonomy 0.988
-#> 10                                                             NaN
+#>          user_supplied_name           submitted_name
+#> 1     Helichrysum candollei    Helichrysum candollei
+#> 2          Haworthia retusa         Haworthia retusa
+#> 3          Crypsinus bakeri         Crypsinus bakeri
+#> 4  Mangifera philippinensis Mangifera philippinensis
+#> 5    Selaginella atirrensis   Selaginella atirrensis
+#> 6   Hymenostomum sullivanii  Hymenostomum sullivanii
+#> 7   Hymenostomum sullivanii  Hymenostomum sullivanii
+#> 8         Cytisus urumoffii        Cytisus urumoffii
+#> 9         Cytisus urumoffii        Cytisus urumoffii
+#> 10        Cytisus urumoffii        Cytisus urumoffii
+#> 11        Baptisia uniflora        Baptisia uniflora
+#> 12        Baptisia uniflora        Baptisia uniflora
+#> 13        Baptisia uniflora        Baptisia uniflora
+#> 14        Baptisia uniflora        Baptisia uniflora
+#> 15     Nephelium xerocarpum     Nephelium xerocarpum
+#> 16  Baccharis gnaphalioides  Baccharis gnaphalioides
+#> 17  Baccharis gnaphalioides  Baccharis gnaphalioides
+#>                                             matched_name
+#> 1  Helichrysum candollei (Bojer ex DC.) R.Vig. & Humbert
+#> 2                            Haworthia retusa (L.) Duval
+#> 3                        Crypsinus bakeri (Luerss.) Tag.
+#> 4                      Mangifera philippinensis Mukherji
+#> 5                         Selaginella atirrensis Hieron.
+#> 6      Hymenostomum sullivanii C. Müller ex Geheeb, 1897
+#> 7                      Hymenostomum sullivanii C. Müller
+#> 8                     Cytisus urumoffii Davidov ex Stoj.
+#> 9                Cytisus urumoffii Davidoff ex Stoyanoff
+#> 10                            Cytisus urumoffii Davidoff
+#> 11                               Baptisia uniflora Hook.
+#> 12                      Baptisia uniflora (Michx.) Nutt.
+#> 13                        Baptisia uniflora (Michx.) Sm.
+#> 14                             Baptisia uniflora Spreng.
+#> 15                   Nephelium xerocarpum (Bl.) Cambess.
+#> 16                       Baccharis gnaphalioides Spreng.
+#> 17                           Baccharis gnaphalioides DC.
+#>         data_source_title score
+#> 1  GBIF Backbone Taxonomy 0.988
+#> 2  GBIF Backbone Taxonomy 0.988
+#> 3  GBIF Backbone Taxonomy 0.988
+#> 4  GBIF Backbone Taxonomy 0.988
+#> 5  GBIF Backbone Taxonomy 0.988
+#> 6  GBIF Backbone Taxonomy 0.988
+#> 7  GBIF Backbone Taxonomy 0.988
+#> 8  GBIF Backbone Taxonomy 0.988
+#> 9  GBIF Backbone Taxonomy 0.988
+#> 10 GBIF Backbone Taxonomy 0.988
+#> 11 GBIF Backbone Taxonomy 0.988
+#> 12 GBIF Backbone Taxonomy 0.988
+#> 13 GBIF Backbone Taxonomy 0.988
+#> 14 GBIF Backbone Taxonomy 0.988
+#> 15 GBIF Backbone Taxonomy 0.988
+#> 16 GBIF Backbone Taxonomy 0.988
+#> 17 GBIF Backbone Taxonomy 0.988
 </code></pre>
 
 <h2>Other functions</h2>
diff --git a/inst/doc/taxize_infotable.Rmd b/inst/doc/taxize_infotable.Rmd
index d3ba233..eb3bfdc 100644
--- a/inst/doc/taxize_infotable.Rmd
+++ b/inst/doc/taxize_infotable.Rmd
@@ -9,15 +9,24 @@ Some key functions in taxize, what they do, and their data sources.
 
 Function name | What it does | Source |
 ----------- | ----------- | ----------- |
-children | Get direct children | COL, NCBI, ITIS |
-classification | Upstream classification | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
-comm2sci | Get scientific from common names | EOL, NCBI, ITIS, Tropicos |
-downstream | Downstream taxa to specified rank | COL, ITIS, GBIF |
-get_ids | Get taxonomic identifiers | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
-resolve | Resolve names using any resolver | GNR, TNRS, iPlant |
-sci2comm | Get common from scientific names | EOL, NCBI, ITIS |
-synonyms | Retrieve synonyms given input names/identifiers | COL, NCBI, ITIS, Tropicos |
-upstream | Retrieve upstream taxa given names/identifiers | COL, ITIS |
+`children` | Get direct children | COL, NCBI, ITIS |
+`classification` | Upstream classification | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
+`comm2sci` | Get scientific from common names | EOL, NCBI, ITIS, Tropicos |
+`downstream` | Downstream taxa to specified rank | COL, ITIS, GBIF |
+`get_ids` | Get taxonomic identifiers | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
+`resolve` | Resolve names using many resolvers | GNR, TNRS, iPlant |
+`gnr_resolve` | Resolve names using Global Names Resolver | GNR |
+`tnrs` | Phylotastic Taxonomic Name Resolution Service | NCBI, iPlant, MSW3 |
+`tol_resolve` | Resolve names using any resolver | TOL |
+`iplant_resolve` | iPlant name resolution| iPlant |
+`sci2comm` | Get common from scientific names | EOL, NCBI, ITIS |
+`synonyms` | Retrieve synonyms given input names/identifiers | COL, NCBI, ITIS, Tropicos |
+`upstream` | Retrieve upstream taxa given names/identifiers | COL, ITIS |
+`lowest_common` | Retrieve the lowest common taxon and rank for a given taxon name or ID | COL, ITIS, GBIF, TOL, NCBI |
+`genbank2uid` | Get NCBI taxonomy UID from GenBankID | NCBI |
+`tax_name` | Get taxonomic names for a given rank | NCBI, ITIS |
+`tax_rank` | Get rank for a given taxonomic name | BOLD, COL, EOL, GBIF, NATSERV, NBN, TOL, TROPICOS, ITIS, NCBI, WORMS |
+`tpl_get` | Get The Plant List csv files | TPL |
 
 ### Acronyms
 
@@ -30,3 +39,10 @@ upstream | Retrieve upstream taxa given names/identifiers | COL, ITIS |
 * iPlant: iPlant Name Resolution Service
 * GNR: Global Names Resolver
 * TNRS: Taxonomic Name Resolution Service
+* TOL: Open Tree of Life
+* MSW3: Mammal Species of the World, 3rd Edition
+* TPL: The Plant List
+* BOLD: Barcode of Life
+* NATSERV: Natureserve
+* TROPICOS: Tropicos plant database
+* WORMS: World Register of Marine Species
diff --git a/inst/doc/taxize_infotable.html b/inst/doc/taxize_infotable.html
index 01eed5a..24478d1 100644
--- a/inst/doc/taxize_infotable.html
+++ b/inst/doc/taxize_infotable.html
@@ -179,50 +179,95 @@ hr {
 </tr>
 </thead><tbody>
 <tr>
-<td>children</td>
+<td><code>children</code></td>
 <td>Get direct children</td>
 <td>COL, NCBI, ITIS</td>
 </tr>
 <tr>
-<td>classification</td>
+<td><code>classification</code></td>
 <td>Upstream classification</td>
 <td>COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN</td>
 </tr>
 <tr>
-<td>comm2sci</td>
+<td><code>comm2sci</code></td>
 <td>Get scientific from common names</td>
 <td>EOL, NCBI, ITIS, Tropicos</td>
 </tr>
 <tr>
-<td>downstream</td>
+<td><code>downstream</code></td>
 <td>Downstream taxa to specified rank</td>
 <td>COL, ITIS, GBIF</td>
 </tr>
 <tr>
-<td>get_ids</td>
+<td><code>get_ids</code></td>
 <td>Get taxonomic identifiers</td>
 <td>COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN</td>
 </tr>
 <tr>
-<td>resolve</td>
-<td>Resolve names using any resolver</td>
+<td><code>resolve</code></td>
+<td>Resolve names using many resolvers</td>
 <td>GNR, TNRS, iPlant</td>
 </tr>
 <tr>
-<td>sci2comm</td>
+<td><code>gnr_resolve</code></td>
+<td>Resolve names using Global Names Resolver</td>
+<td>GNR</td>
+</tr>
+<tr>
+<td><code>tnrs</code></td>
+<td>Phylotastic Taxonomic Name Resolution Service</td>
+<td>NCBI, iPlant, MSW3</td>
+</tr>
+<tr>
+<td><code>tol_resolve</code></td>
+<td>Resolve names using any resolver</td>
+<td>TOL</td>
+</tr>
+<tr>
+<td><code>iplant_resolve</code></td>
+<td>iPlant name resolution</td>
+<td>iPlant</td>
+</tr>
+<tr>
+<td><code>sci2comm</code></td>
 <td>Get common from scientific names</td>
 <td>EOL, NCBI, ITIS</td>
 </tr>
 <tr>
-<td>synonyms</td>
+<td><code>synonyms</code></td>
 <td>Retrieve synonyms given input names/identifiers</td>
 <td>COL, NCBI, ITIS, Tropicos</td>
 </tr>
 <tr>
-<td>upstream</td>
+<td><code>upstream</code></td>
 <td>Retrieve upstream taxa given names/identifiers</td>
 <td>COL, ITIS</td>
 </tr>
+<tr>
+<td><code>lowest_common</code></td>
+<td>Retrieve the lowest common taxon and rank for a given taxon name or ID</td>
+<td>COL, ITIS, GBIF, TOL, NCBI</td>
+</tr>
+<tr>
+<td><code>genbank2uid</code></td>
+<td>Get NCBI taxonomy UID from GenBankID</td>
+<td>NCBI</td>
+</tr>
+<tr>
+<td><code>tax_name</code></td>
+<td>Get taxonomic names for a given rank</td>
+<td>NCBI, ITIS</td>
+</tr>
+<tr>
+<td><code>tax_rank</code></td>
+<td>Get rank for a given taxonomic name</td>
+<td>BOLD, COL, EOL, GBIF, NATSERV, NBN, TOL, TROPICOS, ITIS, NCBI, WORMS</td>
+</tr>
+<tr>
+<td><code>tpl_get</code></td>
+<td>Get The Plant List csv files</td>
+<td>TPL</td>
+</tr>
 </tbody></table>
 
 <h3>Acronyms</h3>
@@ -237,6 +282,13 @@ hr {
 <li>iPlant: iPlant Name Resolution Service</li>
 <li>GNR: Global Names Resolver</li>
 <li>TNRS: Taxonomic Name Resolution Service</li>
+<li>TOL: Open Tree of Life</li>
+<li>MSW3: Mammal Species of the World, 3rd Edition</li>
+<li>TPL: The Plant List</li>
+<li>BOLD: Barcode of Life</li>
+<li>NATSERV: Natureserve</li>
+<li>TROPICOS: Tropicos plant database</li>
+<li>WORMS: World Register of Marine Species</li>
 </ul>
 
 </body>
diff --git a/inst/doc/taxize_vignette.Rmd b/inst/doc/taxize_vignette.Rmd
index ee3930c..cdfb38d 100644
--- a/inst/doc/taxize_vignette.Rmd
+++ b/inst/doc/taxize_vignette.Rmd
@@ -42,16 +42,16 @@ head(temp)
 #> 1   Helianthos annus Helianthos annus     Helianthus annus
 #> 2   Helianthos annus Helianthos annus  Helianthus annus L.
 #> 3   Helianthos annus Helianthos annus     Helianthus annus
-#> 4   Helianthos annus Helianthos annus Helianthus annuus L.
+#> 4   Helianthos annus Helianthos annus     Helianthus annus
 #> 5   Helianthos annus Helianthos annus Helianthus annuus L.
-#> 6   Helianthos annus Helianthos annus    Helianthus annuus
-#>   data_source_title score
-#> 1               EOL  0.75
-#> 2               EOL  0.75
-#> 3     uBio NameBank  0.75
-#> 4 Catalogue of Life  0.75
-#> 5              ITIS  0.75
-#> 6              NCBI  0.75
+#> 6   Helianthos annus Helianthos annus Helianthus annuus L.
+#>                      data_source_title score
+#> 1                                  EOL  0.75
+#> 2                                  EOL  0.75
+#> 3                        uBio NameBank  0.75
+#> 4 Open Tree of Life Reference Taxonomy  0.75
+#> 5                    Catalogue of Life  0.75
+#> 6                                 ITIS  0.75
 ```
 
 The correct spellings are *Helianthus annuus* and *Homo sapiens*. Another approach uses the Taxonomic Name Resolution Service via the Taxosaurus API developed by iPLant and the Phylotastic organization. In this example, we provide a list of species names, some of which are misspelled, and we'll call the API with the *tnrs* function.
@@ -91,6 +91,10 @@ mynames <- c("Helianthus annuus ssp. jaegeri", "Helianthus annuus ssp. lenticula
 [1] "525928" "525929" "525930"
 attr(,"match")
 [1] "found" "found" "found"
+attr(,"multiple_matches")
+[1] FALSE FALSE FALSE
+attr(,"pattern_match")
+[1] FALSE FALSE FALSE
 attr(,"uri")
 [1] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=525928"
 [2] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=525929"
@@ -105,16 +109,16 @@ lapply(tsn, itis_acceptname)
 
 ```
 [[1]]
-  submittedtsn      acceptedname acceptedtsn
-1       525928 Helianthus annuus       36616
+  submittedtsn      acceptedname acceptedtsn author
+1       525928 Helianthus annuus       36616     L.
 
 [[2]]
-  submittedtsn      acceptedname acceptedtsn
-1       525929 Helianthus annuus       36616
+  submittedtsn      acceptedname acceptedtsn author
+1       525929 Helianthus annuus       36616     L.
 
 [[3]]
-  submittedtsn      acceptedname acceptedtsn
-1       525930 Helianthus annuus       36616
+  submittedtsn      acceptedname acceptedtsn author
+1       525930 Helianthus annuus       36616     L.
 ```
 
 ## Retrieve higher taxonomic names
@@ -208,8 +212,12 @@ get_uid(sciname = "Pinus")
 #> [1] "uid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
-#> [1] "http://www.ncbi.nlm.nih.gov/taxonomy/139271"
+#> [1] "https://www.ncbi.nlm.nih.gov/taxonomy/139271"
 ```
 
 In another example, you can pass in a long character vector of taxonomic names (although this one is rather short for demo purposes):
@@ -224,6 +232,10 @@ get_tsn(searchterm = splist, searchtype = "scientific")
 #> [1] "506198" "18098"  "19405" 
 #> attr(,"match")
 #> [1] "found" "found" "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE FALSE  TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE  TRUE
 #> attr(,"uri")
 #> [1] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=506198"
 #> [2] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=18098" 
@@ -249,14 +261,18 @@ get_nbnid(c("Zootoca vivipara","Pinus contorta"), rows = 1)
 ```
 
 ```
-#> [1] "NHMSYS0001706186" "NHMSYS0000494848"
+#> [1] "NHMSYS0001706186" "NBNSYS0000004786"
 #> attr(,"class")
 #> [1] "nbnid"
 #> attr(,"match")
 #> [1] "found" "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE
 #> attr(,"uri")
 #> [1] "https://data.nbn.org.uk/Taxa/NHMSYS0001706186"
-#> [2] "https://data.nbn.org.uk/Taxa/NHMSYS0000494848"
+#> [2] "https://data.nbn.org.uk/Taxa/NBNSYS0000004786"
 ```
 
 Or you can select a range of rows
@@ -267,29 +283,37 @@ get_nbnid(c("Zootoca vivipara","Pinus contorta"), rows = 1:3)
 ```
 
 ```
-#>              nbnid                  searchmatchtitle       rank
-#> 1 NHMSYS0001706186                  Zootoca vivipara    Species
-#> 2 NHMSYS0020784960 Zootoca vivipara subsp. pannonica Subspecies
-#> 3 NHMSYS0001706185                           Zootoca      Genus
-#>    namestatus
-#> 1 Recommended
-#> 2 Recommended
-#> 3 Recommended
-#>              nbnid               searchmatchtitle       rank  namestatus
-#> 1 NHMSYS0000494848   Pinus contorta var. contorta    Variety Recommended
-#> 2 NBNSYS0000004786                 Pinus contorta    Species Recommended
-#> 3 NHMSYS0000494848 Pinus contorta subsp. contorta Subspecies Recommended
+#>              nbnid                    scientificName       rank
+#> 1 NHMSYS0001706186                  Zootoca vivipara    species
+#> 2 NHMSYS0020784960 Zootoca vivipara subsp. pannonica subspecies
+#> 3 NHMSYS0000461615                 Bistorta vivipara    species
+#>   taxonomicStatus
+#> 1        accepted
+#> 2        accepted
+#> 3         synonym
+#>              nbnid                  scientificName       rank
+#> 1 NBNSYS0000004786                  Pinus contorta    species
+#> 2 NHMSYS0000494848  Pinus contorta subsp. contorta subspecies
+#> 3 NHMSYS0000494858 Pinus contorta subsp. murreyana subspecies
+#>   taxonomicStatus
+#> 1        accepted
+#> 2         synonym
+#> 3         synonym
 ```
 
 ```
-#> [1] "NHMSYS0001706186" "NHMSYS0000494848"
+#> [1] "NHMSYS0001706186" "NBNSYS0000004786"
 #> attr(,"class")
 #> [1] "nbnid"
 #> attr(,"match")
 #> [1] "found" "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE
 #> attr(,"uri")
 #> [1] "https://data.nbn.org.uk/Taxa/NHMSYS0001706186"
-#> [2] "https://data.nbn.org.uk/Taxa/NHMSYS0000494848"
+#> [2] "https://data.nbn.org.uk/Taxa/NBNSYS0000004786"
 ```
 
 In addition, in case you don't want to do interactive name selection in the case where there are a lot of names, you can get all data back with functions of the form, e.g., `get_tsn_()`, and likewise for other data sources. For example:
@@ -301,7 +325,7 @@ NROW(out$`Poa annua`)
 ```
 
 ```
-#> [1] 147
+#> [1] 25
 ```
 
 That's a lot of data, so we can get only certain rows back
@@ -313,17 +337,17 @@ get_nbnid_("Poa annua", rows = 1:10)
 
 ```
 #> $`Poa annua`
-#>    ptaxonversionkey searchmatchtitle    rank   namestatus
-#> 1  NBNSYS0000002544        Poa annua Species  Recommended
-#> 2  NHMSYS0000461798              Poa   Genus  Recommended
-#> 3  NHMSYS0000461804         Poa laxa Species      Synonym
-#> 4  NHMSYS0021060390           Poales   Order  Recommended
-#> 5  NHMSYS0000458512       Poa pilosa Species      Synonym
-#> 6  NBNSYS0000002547       Poa alpina Species  Recommended
-#> 7  NHMSYS0000461804        Poa minor Species      Synonym
-#> 8  NBNSYS0000002545       Poa exilis Species Undetermined
-#> 9  NHMSYS0000456981       Poa rigida Species      Synonym
-#> 10 NBNSYS0000002551       Poa caesia Species      Synonym
+#>                guid    scientificName    rank taxonomicStatus
+#> 1  NBNSYS0000002544         Poa annua species        accepted
+#> 2  NBNSYS0000002739      Adonis annua species         synonym
+#> 3  NBNSYS0200001901      Bellis annua species        accepted
+#> 4  NHMSYS0000456951 Carrichtera annua species         synonym
+#> 5  NBNSYS0200003392  Triumfetta annua species        accepted
+#> 6  NBNSYS0000002918     Lunaria annua species        accepted
+#> 7  NBNSYS0200002555       Lonas annua species        accepted
+#> 8  NBNSYS0000033325   Artemisia annua species        accepted
+#> 9  NHMSYS0000456951 Carrichtera annua species        accepted
+#> 10 NHMSYS0000461806     Poa imbecilla species         synonym
 ```
 
 ## Coerce numerics/alphanumerics to taxon IDs
@@ -338,11 +362,22 @@ as.gbifid(get_gbifid("Poa annua")) # already a uid, returns the same
 ```
 
 ```
+#>    gbifid             scientificname    rank   status matchtype
+#> 1 2704179               Poa annua L. species ACCEPTED     EXACT
+#> 2 8422205 Poa annua Cham. & Schltdl. species  SYNONYM     EXACT
+#> 3 7730008           Poa annua Steud. species DOUBTFUL     EXACT
+```
+
+```
 #> [1] "2704179"
 #> attr(,"class")
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 ```
@@ -357,6 +392,10 @@ as.gbifid(2704179) # numeric
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 ```
@@ -371,6 +410,10 @@ as.gbifid("2704179") # character
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 ```
@@ -385,6 +428,10 @@ as.gbifid(list("2704179","2435099","3171445")) # list, either numeric or charact
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found" "found" "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE FALSE FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 #> [2] "http://www.gbif.org/species/2435099"
@@ -400,7 +447,7 @@ system.time( replicate(3, as.gbifid(c("2704179","2435099","3171445"), check=TRUE
 
 ```
 #>    user  system elapsed 
-#>   0.088   0.008   3.697
+#>   0.072   0.002   1.656
 ```
 
 ```r
@@ -409,7 +456,7 @@ system.time( replicate(3, as.gbifid(c("2704179","2435099","3171445"), check=FALS
 
 ```
 #>    user  system elapsed 
-#>       0       0       0
+#>   0.002   0.000   0.002
 ```
 
 ## What taxa are downstream of my taxon of interest?
@@ -423,56 +470,56 @@ downstream("Apis", downto = "Species", db = "col")
 
 ```
 #>                     name    rank                            colid
-#> 1                   Apis   Genus 015be25f6b061ba517f495394b80f108
-#> 2      Actinomadura apis Species 1182a102a18b40aa19385bf5f1f53367
-#> 3    Anisocentropus apis Species 8891d18874dde14e44df52e931c44206
-#> 4     Apis andreniformis Species 7a4a38c5095963949d6d6ec917d471de
-#> 5            Apis cerana Species 39610a4ceff7e5244e334a3fbc5e47e5
-#> 6           Apis dorsata Species e1d4cbf3872c6c310b7a1c17ddd00ebc
-#> 7            Apis florea Species 92dca82a063fedd1da94b3f3972d7b22
-#> 8     Apis koschevnikovi Species 4bbc06b9dfbde0b72c619810b564c6e6
-#> 9         Apis mellifera Species 67cbbcf92cd60748759e58e802d98518
-#> 10      Apis nigrocincta Species 213668a26ba6d2aad9575218f10d422f
-#> 11      Ascosphaera apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 12          Candida apis Species 3219a9635d3438e8b76a645cecf87287
-#> 13        Eristalis apis Species 16d7c8023308d38f6bb831ed5fa82002
-#> 14           Hister apis Species d2d7483acf488b5ed932f49b0aa51d19
-#> 15        Ifephylus apis Species 9b4d00e009b58bbfc003b51bd3d0c6f0
-#> 16  Impatiens nidus-apis Species 6aecf448e6aa0cb46387066db94426d1
-#> 17      Kirkaldykra apis Species 70a68f13454abd937aabf56746f4a6ad
-#> 18          Mallota apis Species 10c3c3921d2ea9f9425ef9fd41914520
-#> 19 Melanosella mors-apis Species 4ac238f1597847dbc7998d97b8d45a0e
-#> 20         Microdon apis Species 9be92242562eb923e711dc24b7bbab9a
-#> 21           Nosema apis Species 5b2838dfd0ec15844fc6f659f7580322
-#> 22       Scutirodes apis Species 164ab3ac910547bc945cdbb994be1ee5
-#> 23      Spiroplasma apis Species 789f91571ce55de4df9821f2d05efab0
-#> 24   Trichomonascus apis Species 17dc4d840323e2c5b87e67a952f6dff3
-#> 25       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 26       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 27       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 28       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 29         Apis aestuans Species a517bc572c3c2697fe3bbfabc46a1493
-#> 30           Apis alpina Species f2781627115e4212ddab5979cdd425d2
-#> 31         Apis bicornis Species e67e82d00faae69da173bb31f9914056
-#> 32        Apis canescens Species d6b8850db971d65d6079e3a22f35e10e
-#> 33         Apis clypeata Species 706060924801130f6c3abf454087c100
-#> 34      Apis cunicularia Species ebc3c5166ce2cabf419c4c6dc332cf3b
-#> 35          Apis etrusca Species 6d27fd39a1d8b10050ba4e331987f3c9
-#> 36          Apis globosa Species 254c8e847ca4ff128bba57fe94deb98d
-#> 37        Apis hispanica Species e8d2057a3efeb2cfdaebe27ea8191cd5
-#> 38         Apis hypnorum Species dfb743f54f50b9b9dbee378473542821
-#> 39      Apis ichneumonea Species 13c35287e20ab9373fa445dbc44981ea
-#> 40        Apis lapidaria Species f8da5667af3562ebc0f6a83e1ec408f0
-#> 41         Apis muscorum Species 5bbfe59da5ce7fe59eb9ca3a7a45916c
-#> 42         Apis mystacea Species fba8e4752a7fa5939a7eae293ba633ec
-#> 43         Apis obsoleta Species da42bcb6cc0267903fb175f8a215aecb
-#> 44         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 45         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 46             Apis rufa Species e67e82d00faae69da173bb31f9914056
-#> 47          Apis signata Species 551f101ad3b9bc17b24575585b2500c1
-#> 48       Apis smaragdula Species 4bc5c886b061e17e9aecb537a04c616d
-#> 49        Apis spinulosa Species 56e7e9f854c9ed31ea6d0a06567607d0
-#> 50      Apis subterranea Species 3d2adff364a87bf7dd30524aa8071807
+#> 1                   Apis   genus 015be25f6b061ba517f495394b80f108
+#> 2      Actinomadura apis species 1182a102a18b40aa19385bf5f1f53367
+#> 3    Anisocentropus apis species 8891d18874dde14e44df52e931c44206
+#> 4     Apis andreniformis species 7a4a38c5095963949d6d6ec917d471de
+#> 5            Apis cerana species 39610a4ceff7e5244e334a3fbc5e47e5
+#> 6           Apis dorsata species e1d4cbf3872c6c310b7a1c17ddd00ebc
+#> 7            Apis florea species 92dca82a063fedd1da94b3f3972d7b22
+#> 8     Apis koschevnikovi species 4bbc06b9dfbde0b72c619810b564c6e6
+#> 9         Apis mellifera species 67cbbcf92cd60748759e58e802d98518
+#> 10      Apis nigrocincta species 213668a26ba6d2aad9575218f10d422f
+#> 11      Ascosphaera apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 12          Candida apis species 3219a9635d3438e8b76a645cecf87287
+#> 13        Eristalis apis species 16d7c8023308d38f6bb831ed5fa82002
+#> 14           Hister apis species d2d7483acf488b5ed932f49b0aa51d19
+#> 15        Ifephylus apis species 9b4d00e009b58bbfc003b51bd3d0c6f0
+#> 16  Impatiens nidus-apis species 6aecf448e6aa0cb46387066db94426d1
+#> 17      Kirkaldykra apis species 70a68f13454abd937aabf56746f4a6ad
+#> 18          Mallota apis species 10c3c3921d2ea9f9425ef9fd41914520
+#> 19 Melanosella mors-apis species 4ac238f1597847dbc7998d97b8d45a0e
+#> 20         Microdon apis species 9be92242562eb923e711dc24b7bbab9a
+#> 21           Nosema apis species 5b2838dfd0ec15844fc6f659f7580322
+#> 22       Scutirodes apis species 164ab3ac910547bc945cdbb994be1ee5
+#> 23      Spiroplasma apis species 789f91571ce55de4df9821f2d05efab0
+#> 24   Trichomonascus apis species 17dc4d840323e2c5b87e67a952f6dff3
+#> 25       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 26       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 27       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 28       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 29         Apis aestuans species a517bc572c3c2697fe3bbfabc46a1493
+#> 30           Apis alpina species f2781627115e4212ddab5979cdd425d2
+#> 31         Apis bicornis species e67e82d00faae69da173bb31f9914056
+#> 32        Apis canescens species d6b8850db971d65d6079e3a22f35e10e
+#> 33         Apis clypeata species 706060924801130f6c3abf454087c100
+#> 34      Apis cunicularia species ebc3c5166ce2cabf419c4c6dc332cf3b
+#> 35          Apis etrusca species 6d27fd39a1d8b10050ba4e331987f3c9
+#> 36          Apis globosa species 254c8e847ca4ff128bba57fe94deb98d
+#> 37        Apis hispanica species e8d2057a3efeb2cfdaebe27ea8191cd5
+#> 38         Apis hypnorum species dfb743f54f50b9b9dbee378473542821
+#> 39      Apis ichneumonea species 13c35287e20ab9373fa445dbc44981ea
+#> 40        Apis lapidaria species f8da5667af3562ebc0f6a83e1ec408f0
+#> 41         Apis muscorum species 5bbfe59da5ce7fe59eb9ca3a7a45916c
+#> 42         Apis mystacea species fba8e4752a7fa5939a7eae293ba633ec
+#> 43         Apis obsoleta species da42bcb6cc0267903fb175f8a215aecb
+#> 44         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 45         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 46             Apis rufa species e67e82d00faae69da173bb31f9914056
+#> 47          Apis signata species 551f101ad3b9bc17b24575585b2500c1
+#> 48       Apis smaragdula species 4bc5c886b061e17e9aecb537a04c616d
+#> 49        Apis spinulosa species 56e7e9f854c9ed31ea6d0a06567607d0
+#> 50      Apis subterranea species 3d2adff364a87bf7dd30524aa8071807
 #>          name_status  kingdom              family              acc_name
 #> 1      accepted name Animalia              Apidae                  <NA>
 #> 2      accepted name Bacteria Thermomonosporaceae                  <NA>
@@ -529,13 +576,13 @@ downstream("Apis", downto = "Species", db = "col")
 ```
 #> $Apis
 #>                       childtaxa_id     childtaxa_name childtaxa_rank
-#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        Species
-#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        Species
-#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        Species
-#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        Species
-#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        Species
-#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        Species
-#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        Species
+#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        species
+#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        species
+#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        species
+#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        species
+#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        species
+#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        species
+#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        species
 #> 
 #> attr(,"class")
 #> [1] "downstream"
@@ -553,13 +600,13 @@ downstream("Apis", downto = "Species", db = "itis")
 ```
 #> $Apis
 #>      tsn parentname parenttsn          taxonname rankid rankname
-#> 1 154396       Apis    154395     Apis mellifera    220  Species
-#> 2 763550       Apis    154395 Apis andreniformis    220  Species
-#> 3 763551       Apis    154395        Apis cerana    220  Species
-#> 4 763552       Apis    154395       Apis dorsata    220  Species
-#> 5 763553       Apis    154395        Apis florea    220  Species
-#> 6 763554       Apis    154395 Apis koschevnikovi    220  Species
-#> 7 763555       Apis    154395   Apis nigrocincta    220  Species
+#> 1 154396       Apis    154395     Apis mellifera    220  species
+#> 2 763550       Apis    154395 Apis andreniformis    220  species
+#> 3 763551       Apis    154395        Apis cerana    220  species
+#> 4 763552       Apis    154395       Apis dorsata    220  species
+#> 5 763553       Apis    154395        Apis florea    220  species
+#> 6 763554       Apis    154395 Apis koschevnikovi    220  species
+#> 7 763555       Apis    154395   Apis nigrocincta    220  species
 #> 
 #> attr(,"class")
 #> [1] "downstream"
@@ -578,56 +625,56 @@ children(get_colid("Apis"))
 
 ```
 #>                     name    rank                            colid
-#> 1                   Apis   Genus 015be25f6b061ba517f495394b80f108
-#> 2      Actinomadura apis Species 1182a102a18b40aa19385bf5f1f53367
-#> 3    Anisocentropus apis Species 8891d18874dde14e44df52e931c44206
-#> 4     Apis andreniformis Species 7a4a38c5095963949d6d6ec917d471de
-#> 5            Apis cerana Species 39610a4ceff7e5244e334a3fbc5e47e5
-#> 6           Apis dorsata Species e1d4cbf3872c6c310b7a1c17ddd00ebc
-#> 7            Apis florea Species 92dca82a063fedd1da94b3f3972d7b22
-#> 8     Apis koschevnikovi Species 4bbc06b9dfbde0b72c619810b564c6e6
-#> 9         Apis mellifera Species 67cbbcf92cd60748759e58e802d98518
-#> 10      Apis nigrocincta Species 213668a26ba6d2aad9575218f10d422f
-#> 11      Ascosphaera apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 12          Candida apis Species 3219a9635d3438e8b76a645cecf87287
-#> 13        Eristalis apis Species 16d7c8023308d38f6bb831ed5fa82002
-#> 14           Hister apis Species d2d7483acf488b5ed932f49b0aa51d19
-#> 15        Ifephylus apis Species 9b4d00e009b58bbfc003b51bd3d0c6f0
-#> 16  Impatiens nidus-apis Species 6aecf448e6aa0cb46387066db94426d1
-#> 17      Kirkaldykra apis Species 70a68f13454abd937aabf56746f4a6ad
-#> 18          Mallota apis Species 10c3c3921d2ea9f9425ef9fd41914520
-#> 19 Melanosella mors-apis Species 4ac238f1597847dbc7998d97b8d45a0e
-#> 20         Microdon apis Species 9be92242562eb923e711dc24b7bbab9a
-#> 21           Nosema apis Species 5b2838dfd0ec15844fc6f659f7580322
-#> 22       Scutirodes apis Species 164ab3ac910547bc945cdbb994be1ee5
-#> 23      Spiroplasma apis Species 789f91571ce55de4df9821f2d05efab0
-#> 24   Trichomonascus apis Species 17dc4d840323e2c5b87e67a952f6dff3
-#> 25       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 26       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 27       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 28       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 29         Apis aestuans Species a517bc572c3c2697fe3bbfabc46a1493
-#> 30           Apis alpina Species f2781627115e4212ddab5979cdd425d2
-#> 31         Apis bicornis Species e67e82d00faae69da173bb31f9914056
-#> 32        Apis canescens Species d6b8850db971d65d6079e3a22f35e10e
-#> 33         Apis clypeata Species 706060924801130f6c3abf454087c100
-#> 34      Apis cunicularia Species ebc3c5166ce2cabf419c4c6dc332cf3b
-#> 35          Apis etrusca Species 6d27fd39a1d8b10050ba4e331987f3c9
-#> 36          Apis globosa Species 254c8e847ca4ff128bba57fe94deb98d
-#> 37        Apis hispanica Species e8d2057a3efeb2cfdaebe27ea8191cd5
-#> 38         Apis hypnorum Species dfb743f54f50b9b9dbee378473542821
-#> 39      Apis ichneumonea Species 13c35287e20ab9373fa445dbc44981ea
-#> 40        Apis lapidaria Species f8da5667af3562ebc0f6a83e1ec408f0
-#> 41         Apis muscorum Species 5bbfe59da5ce7fe59eb9ca3a7a45916c
-#> 42         Apis mystacea Species fba8e4752a7fa5939a7eae293ba633ec
-#> 43         Apis obsoleta Species da42bcb6cc0267903fb175f8a215aecb
-#> 44         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 45         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 46             Apis rufa Species e67e82d00faae69da173bb31f9914056
-#> 47          Apis signata Species 551f101ad3b9bc17b24575585b2500c1
-#> 48       Apis smaragdula Species 4bc5c886b061e17e9aecb537a04c616d
-#> 49        Apis spinulosa Species 56e7e9f854c9ed31ea6d0a06567607d0
-#> 50      Apis subterranea Species 3d2adff364a87bf7dd30524aa8071807
+#> 1                   Apis   genus 015be25f6b061ba517f495394b80f108
+#> 2      Actinomadura apis species 1182a102a18b40aa19385bf5f1f53367
+#> 3    Anisocentropus apis species 8891d18874dde14e44df52e931c44206
+#> 4     Apis andreniformis species 7a4a38c5095963949d6d6ec917d471de
+#> 5            Apis cerana species 39610a4ceff7e5244e334a3fbc5e47e5
+#> 6           Apis dorsata species e1d4cbf3872c6c310b7a1c17ddd00ebc
+#> 7            Apis florea species 92dca82a063fedd1da94b3f3972d7b22
+#> 8     Apis koschevnikovi species 4bbc06b9dfbde0b72c619810b564c6e6
+#> 9         Apis mellifera species 67cbbcf92cd60748759e58e802d98518
+#> 10      Apis nigrocincta species 213668a26ba6d2aad9575218f10d422f
+#> 11      Ascosphaera apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 12          Candida apis species 3219a9635d3438e8b76a645cecf87287
+#> 13        Eristalis apis species 16d7c8023308d38f6bb831ed5fa82002
+#> 14           Hister apis species d2d7483acf488b5ed932f49b0aa51d19
+#> 15        Ifephylus apis species 9b4d00e009b58bbfc003b51bd3d0c6f0
+#> 16  Impatiens nidus-apis species 6aecf448e6aa0cb46387066db94426d1
+#> 17      Kirkaldykra apis species 70a68f13454abd937aabf56746f4a6ad
+#> 18          Mallota apis species 10c3c3921d2ea9f9425ef9fd41914520
+#> 19 Melanosella mors-apis species 4ac238f1597847dbc7998d97b8d45a0e
+#> 20         Microdon apis species 9be92242562eb923e711dc24b7bbab9a
+#> 21           Nosema apis species 5b2838dfd0ec15844fc6f659f7580322
+#> 22       Scutirodes apis species 164ab3ac910547bc945cdbb994be1ee5
+#> 23      Spiroplasma apis species 789f91571ce55de4df9821f2d05efab0
+#> 24   Trichomonascus apis species 17dc4d840323e2c5b87e67a952f6dff3
+#> 25       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 26       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 27       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 28       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 29         Apis aestuans species a517bc572c3c2697fe3bbfabc46a1493
+#> 30           Apis alpina species f2781627115e4212ddab5979cdd425d2
+#> 31         Apis bicornis species e67e82d00faae69da173bb31f9914056
+#> 32        Apis canescens species d6b8850db971d65d6079e3a22f35e10e
+#> 33         Apis clypeata species 706060924801130f6c3abf454087c100
+#> 34      Apis cunicularia species ebc3c5166ce2cabf419c4c6dc332cf3b
+#> 35          Apis etrusca species 6d27fd39a1d8b10050ba4e331987f3c9
+#> 36          Apis globosa species 254c8e847ca4ff128bba57fe94deb98d
+#> 37        Apis hispanica species e8d2057a3efeb2cfdaebe27ea8191cd5
+#> 38         Apis hypnorum species dfb743f54f50b9b9dbee378473542821
+#> 39      Apis ichneumonea species 13c35287e20ab9373fa445dbc44981ea
+#> 40        Apis lapidaria species f8da5667af3562ebc0f6a83e1ec408f0
+#> 41         Apis muscorum species 5bbfe59da5ce7fe59eb9ca3a7a45916c
+#> 42         Apis mystacea species fba8e4752a7fa5939a7eae293ba633ec
+#> 43         Apis obsoleta species da42bcb6cc0267903fb175f8a215aecb
+#> 44         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 45         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 46             Apis rufa species e67e82d00faae69da173bb31f9914056
+#> 47          Apis signata species 551f101ad3b9bc17b24575585b2500c1
+#> 48       Apis smaragdula species 4bc5c886b061e17e9aecb537a04c616d
+#> 49        Apis spinulosa species 56e7e9f854c9ed31ea6d0a06567607d0
+#> 50      Apis subterranea species 3d2adff364a87bf7dd30524aa8071807
 #>          name_status  kingdom              family              acc_name
 #> 1      accepted name Animalia              Apidae                  <NA>
 #> 2      accepted name Bacteria Thermomonosporaceae                  <NA>
@@ -684,13 +731,13 @@ children(get_colid("Apis"))
 ```
 #> $`015be25f6b061ba517f495394b80f108`
 #>                       childtaxa_id     childtaxa_name childtaxa_rank
-#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        Species
-#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        Species
-#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        Species
-#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        Species
-#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        Species
-#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        Species
-#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        Species
+#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        species
+#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        species
+#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        species
+#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        species
+#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        species
+#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        species
+#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        species
 #> 
 #> attr(,"class")
 #> [1] "children"
@@ -741,6 +788,10 @@ genbank2uid(id = 'AJ748748')
 #> [1] "uid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.ncbi.nlm.nih.gov/taxonomy/282199"
 ```
@@ -758,6 +809,10 @@ genbank2uid(id = 62689767)
 #> [1] "uid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.ncbi.nlm.nih.gov/taxonomy/282199"
 ```
diff --git a/inst/doc/taxize_vignette.html b/inst/doc/taxize_vignette.html
index e88da8e..93a1faf 100644
--- a/inst/doc/taxize_vignette.html
+++ b/inst/doc/taxize_vignette.html
@@ -235,16 +235,16 @@ head(temp)
 #> 1   Helianthos annus Helianthos annus     Helianthus annus
 #> 2   Helianthos annus Helianthos annus  Helianthus annus L.
 #> 3   Helianthos annus Helianthos annus     Helianthus annus
-#> 4   Helianthos annus Helianthos annus Helianthus annuus L.
+#> 4   Helianthos annus Helianthos annus     Helianthus annus
 #> 5   Helianthos annus Helianthos annus Helianthus annuus L.
-#> 6   Helianthos annus Helianthos annus    Helianthus annuus
-#>   data_source_title score
-#> 1               EOL  0.75
-#> 2               EOL  0.75
-#> 3     uBio NameBank  0.75
-#> 4 Catalogue of Life  0.75
-#> 5              ITIS  0.75
-#> 6              NCBI  0.75
+#> 6   Helianthos annus Helianthos annus Helianthus annuus L.
+#>                      data_source_title score
+#> 1                                  EOL  0.75
+#> 2                                  EOL  0.75
+#> 3                        uBio NameBank  0.75
+#> 4 Open Tree of Life Reference Taxonomy  0.75
+#> 5                    Catalogue of Life  0.75
+#> 6                                 ITIS  0.75
 </code></pre>
 
 <p>The correct spellings are <em>Helianthus annuus</em> and <em>Homo sapiens</em>. Another approach uses the Taxonomic Name Resolution Service via the Taxosaurus API developed by iPLant and the Phylotastic organization. In this example, we provide a list of species names, some of which are misspelled, and we'll call the API with the <em>tnrs</em> function.</p>
@@ -278,6 +278,10 @@ tnrs(query = mynames, source = "iPlant_TNRS")[ , -c(5:7)]
 <pre><code>[1] "525928" "525929" "525930"
 attr(,"match")
 [1] "found" "found" "found"
+attr(,"multiple_matches")
+[1] FALSE FALSE FALSE
+attr(,"pattern_match")
+[1] FALSE FALSE FALSE
 attr(,"uri")
 [1] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=525928"
 [2] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=525929"
@@ -290,16 +294,16 @@ attr(,"class")
 </code></pre>
 
 <pre><code>[[1]]
-  submittedtsn      acceptedname acceptedtsn
-1       525928 Helianthus annuus       36616
+  submittedtsn      acceptedname acceptedtsn author
+1       525928 Helianthus annuus       36616     L.
 
 [[2]]
-  submittedtsn      acceptedname acceptedtsn
-1       525929 Helianthus annuus       36616
+  submittedtsn      acceptedname acceptedtsn author
+1       525929 Helianthus annuus       36616     L.
 
 [[3]]
-  submittedtsn      acceptedname acceptedtsn
-1       525930 Helianthus annuus       36616
+  submittedtsn      acceptedname acceptedtsn author
+1       525930 Helianthus annuus       36616     L.
 </code></pre>
 
 <h2>Retrieve higher taxonomic names</h2>
@@ -383,8 +387,12 @@ classification(specieslist, db = 'itis')
 #> [1] "uid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
-#> [1] "http://www.ncbi.nlm.nih.gov/taxonomy/139271"
+#> [1] "https://www.ncbi.nlm.nih.gov/taxonomy/139271"
 </code></pre>
 
 <p>In another example, you can pass in a long character vector of taxonomic names (although this one is rather short for demo purposes):</p>
@@ -396,6 +404,10 @@ get_tsn(searchterm = splist, searchtype = "scientific")
 <pre><code>#> [1] "506198" "18098"  "19405" 
 #> attr(,"match")
 #> [1] "found" "found" "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE FALSE  TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE  TRUE
 #> attr(,"uri")
 #> [1] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=506198"
 #> [2] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=18098" 
@@ -420,14 +432,18 @@ get_tsn(searchterm = splist, searchtype = "scientific")
 <pre><code class="r">get_nbnid(c("Zootoca vivipara","Pinus contorta"), rows = 1)
 </code></pre>
 
-<pre><code>#> [1] "NHMSYS0001706186" "NHMSYS0000494848"
+<pre><code>#> [1] "NHMSYS0001706186" "NBNSYS0000004786"
 #> attr(,"class")
 #> [1] "nbnid"
 #> attr(,"match")
 #> [1] "found" "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE
 #> attr(,"uri")
 #> [1] "https://data.nbn.org.uk/Taxa/NHMSYS0001706186"
-#> [2] "https://data.nbn.org.uk/Taxa/NHMSYS0000494848"
+#> [2] "https://data.nbn.org.uk/Taxa/NBNSYS0000004786"
 </code></pre>
 
 <p>Or you can select a range of rows</p>
@@ -435,28 +451,36 @@ get_tsn(searchterm = splist, searchtype = "scientific")
 <pre><code class="r">get_nbnid(c("Zootoca vivipara","Pinus contorta"), rows = 1:3)
 </code></pre>
 
-<pre><code>#>              nbnid                  searchmatchtitle       rank
-#> 1 NHMSYS0001706186                  Zootoca vivipara    Species
-#> 2 NHMSYS0020784960 Zootoca vivipara subsp. pannonica Subspecies
-#> 3 NHMSYS0001706185                           Zootoca      Genus
-#>    namestatus
-#> 1 Recommended
-#> 2 Recommended
-#> 3 Recommended
-#>              nbnid               searchmatchtitle       rank  namestatus
-#> 1 NHMSYS0000494848   Pinus contorta var. contorta    Variety Recommended
-#> 2 NBNSYS0000004786                 Pinus contorta    Species Recommended
-#> 3 NHMSYS0000494848 Pinus contorta subsp. contorta Subspecies Recommended
-</code></pre>
-
-<pre><code>#> [1] "NHMSYS0001706186" "NHMSYS0000494848"
+<pre><code>#>              nbnid                    scientificName       rank
+#> 1 NHMSYS0001706186                  Zootoca vivipara    species
+#> 2 NHMSYS0020784960 Zootoca vivipara subsp. pannonica subspecies
+#> 3 NHMSYS0000461615                 Bistorta vivipara    species
+#>   taxonomicStatus
+#> 1        accepted
+#> 2        accepted
+#> 3         synonym
+#>              nbnid                  scientificName       rank
+#> 1 NBNSYS0000004786                  Pinus contorta    species
+#> 2 NHMSYS0000494848  Pinus contorta subsp. contorta subspecies
+#> 3 NHMSYS0000494858 Pinus contorta subsp. murreyana subspecies
+#>   taxonomicStatus
+#> 1        accepted
+#> 2         synonym
+#> 3         synonym
+</code></pre>
+
+<pre><code>#> [1] "NHMSYS0001706186" "NBNSYS0000004786"
 #> attr(,"class")
 #> [1] "nbnid"
 #> attr(,"match")
 #> [1] "found" "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE
 #> attr(,"uri")
 #> [1] "https://data.nbn.org.uk/Taxa/NHMSYS0001706186"
-#> [2] "https://data.nbn.org.uk/Taxa/NHMSYS0000494848"
+#> [2] "https://data.nbn.org.uk/Taxa/NBNSYS0000004786"
 </code></pre>
 
 <p>In addition, in case you don't want to do interactive name selection in the case where there are a lot of names, you can get all data back with functions of the form, e.g., <code>get_tsn_()</code>, and likewise for other data sources. For example:</p>
@@ -465,7 +489,7 @@ get_tsn(searchterm = splist, searchtype = "scientific")
 NROW(out$`Poa annua`)
 </code></pre>
 
-<pre><code>#> [1] 147
+<pre><code>#> [1] 25
 </code></pre>
 
 <p>That's a lot of data, so we can get only certain rows back</p>
@@ -474,17 +498,17 @@ NROW(out$`Poa annua`)
 </code></pre>
 
 <pre><code>#> $`Poa annua`
-#>    ptaxonversionkey searchmatchtitle    rank   namestatus
-#> 1  NBNSYS0000002544        Poa annua Species  Recommended
-#> 2  NHMSYS0000461798              Poa   Genus  Recommended
-#> 3  NHMSYS0000461804         Poa laxa Species      Synonym
-#> 4  NHMSYS0021060390           Poales   Order  Recommended
-#> 5  NHMSYS0000458512       Poa pilosa Species      Synonym
-#> 6  NBNSYS0000002547       Poa alpina Species  Recommended
-#> 7  NHMSYS0000461804        Poa minor Species      Synonym
-#> 8  NBNSYS0000002545       Poa exilis Species Undetermined
-#> 9  NHMSYS0000456981       Poa rigida Species      Synonym
-#> 10 NBNSYS0000002551       Poa caesia Species      Synonym
+#>                guid    scientificName    rank taxonomicStatus
+#> 1  NBNSYS0000002544         Poa annua species        accepted
+#> 2  NBNSYS0000002739      Adonis annua species         synonym
+#> 3  NBNSYS0200001901      Bellis annua species        accepted
+#> 4  NHMSYS0000456951 Carrichtera annua species         synonym
+#> 5  NBNSYS0200003392  Triumfetta annua species        accepted
+#> 6  NBNSYS0000002918     Lunaria annua species        accepted
+#> 7  NBNSYS0200002555       Lonas annua species        accepted
+#> 8  NBNSYS0000033325   Artemisia annua species        accepted
+#> 9  NHMSYS0000456951 Carrichtera annua species        accepted
+#> 10 NHMSYS0000461806     Poa imbecilla species         synonym
 </code></pre>
 
 <h2>Coerce numerics/alphanumerics to taxon IDs</h2>
@@ -496,11 +520,21 @@ NROW(out$`Poa annua`)
 <pre><code class="r">as.gbifid(get_gbifid("Poa annua")) # already a uid, returns the same
 </code></pre>
 
+<pre><code>#>    gbifid             scientificname    rank   status matchtype
+#> 1 2704179               Poa annua L. species ACCEPTED     EXACT
+#> 2 8422205 Poa annua Cham. & Schltdl. species  SYNONYM     EXACT
+#> 3 7730008           Poa annua Steud. species DOUBTFUL     EXACT
+</code></pre>
+
 <pre><code>#> [1] "2704179"
 #> attr(,"class")
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 </code></pre>
@@ -513,6 +547,10 @@ NROW(out$`Poa annua`)
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 </code></pre>
@@ -525,6 +563,10 @@ NROW(out$`Poa annua`)
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 </code></pre>
@@ -537,6 +579,10 @@ NROW(out$`Poa annua`)
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found" "found" "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE FALSE FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 #> [2] "http://www.gbif.org/species/2435099"
@@ -549,14 +595,14 @@ NROW(out$`Poa annua`)
 </code></pre>
 
 <pre><code>#>    user  system elapsed 
-#>   0.088   0.008   3.697
+#>   0.072   0.002   1.656
 </code></pre>
 
 <pre><code class="r">system.time( replicate(3, as.gbifid(c("2704179","2435099","3171445"), check=FALSE)) )
 </code></pre>
 
 <pre><code>#>    user  system elapsed 
-#>       0       0       0
+#>   0.002   0.000   0.002
 </code></pre>
 
 <h2>What taxa are downstream of my taxon of interest?</h2>
@@ -567,56 +613,56 @@ NROW(out$`Poa annua`)
 </code></pre>
 
 <pre><code>#>                     name    rank                            colid
-#> 1                   Apis   Genus 015be25f6b061ba517f495394b80f108
-#> 2      Actinomadura apis Species 1182a102a18b40aa19385bf5f1f53367
-#> 3    Anisocentropus apis Species 8891d18874dde14e44df52e931c44206
-#> 4     Apis andreniformis Species 7a4a38c5095963949d6d6ec917d471de
-#> 5            Apis cerana Species 39610a4ceff7e5244e334a3fbc5e47e5
-#> 6           Apis dorsata Species e1d4cbf3872c6c310b7a1c17ddd00ebc
-#> 7            Apis florea Species 92dca82a063fedd1da94b3f3972d7b22
-#> 8     Apis koschevnikovi Species 4bbc06b9dfbde0b72c619810b564c6e6
-#> 9         Apis mellifera Species 67cbbcf92cd60748759e58e802d98518
-#> 10      Apis nigrocincta Species 213668a26ba6d2aad9575218f10d422f
-#> 11      Ascosphaera apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 12          Candida apis Species 3219a9635d3438e8b76a645cecf87287
-#> 13        Eristalis apis Species 16d7c8023308d38f6bb831ed5fa82002
-#> 14           Hister apis Species d2d7483acf488b5ed932f49b0aa51d19
-#> 15        Ifephylus apis Species 9b4d00e009b58bbfc003b51bd3d0c6f0
-#> 16  Impatiens nidus-apis Species 6aecf448e6aa0cb46387066db94426d1
-#> 17      Kirkaldykra apis Species 70a68f13454abd937aabf56746f4a6ad
-#> 18          Mallota apis Species 10c3c3921d2ea9f9425ef9fd41914520
-#> 19 Melanosella mors-apis Species 4ac238f1597847dbc7998d97b8d45a0e
-#> 20         Microdon apis Species 9be92242562eb923e711dc24b7bbab9a
-#> 21           Nosema apis Species 5b2838dfd0ec15844fc6f659f7580322
-#> 22       Scutirodes apis Species 164ab3ac910547bc945cdbb994be1ee5
-#> 23      Spiroplasma apis Species 789f91571ce55de4df9821f2d05efab0
-#> 24   Trichomonascus apis Species 17dc4d840323e2c5b87e67a952f6dff3
-#> 25       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 26       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 27       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 28       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 29         Apis aestuans Species a517bc572c3c2697fe3bbfabc46a1493
-#> 30           Apis alpina Species f2781627115e4212ddab5979cdd425d2
-#> 31         Apis bicornis Species e67e82d00faae69da173bb31f9914056
-#> 32        Apis canescens Species d6b8850db971d65d6079e3a22f35e10e
-#> 33         Apis clypeata Species 706060924801130f6c3abf454087c100
-#> 34      Apis cunicularia Species ebc3c5166ce2cabf419c4c6dc332cf3b
-#> 35          Apis etrusca Species 6d27fd39a1d8b10050ba4e331987f3c9
-#> 36          Apis globosa Species 254c8e847ca4ff128bba57fe94deb98d
-#> 37        Apis hispanica Species e8d2057a3efeb2cfdaebe27ea8191cd5
-#> 38         Apis hypnorum Species dfb743f54f50b9b9dbee378473542821
-#> 39      Apis ichneumonea Species 13c35287e20ab9373fa445dbc44981ea
-#> 40        Apis lapidaria Species f8da5667af3562ebc0f6a83e1ec408f0
-#> 41         Apis muscorum Species 5bbfe59da5ce7fe59eb9ca3a7a45916c
-#> 42         Apis mystacea Species fba8e4752a7fa5939a7eae293ba633ec
-#> 43         Apis obsoleta Species da42bcb6cc0267903fb175f8a215aecb
-#> 44         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 45         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 46             Apis rufa Species e67e82d00faae69da173bb31f9914056
-#> 47          Apis signata Species 551f101ad3b9bc17b24575585b2500c1
-#> 48       Apis smaragdula Species 4bc5c886b061e17e9aecb537a04c616d
-#> 49        Apis spinulosa Species 56e7e9f854c9ed31ea6d0a06567607d0
-#> 50      Apis subterranea Species 3d2adff364a87bf7dd30524aa8071807
+#> 1                   Apis   genus 015be25f6b061ba517f495394b80f108
+#> 2      Actinomadura apis species 1182a102a18b40aa19385bf5f1f53367
+#> 3    Anisocentropus apis species 8891d18874dde14e44df52e931c44206
+#> 4     Apis andreniformis species 7a4a38c5095963949d6d6ec917d471de
+#> 5            Apis cerana species 39610a4ceff7e5244e334a3fbc5e47e5
+#> 6           Apis dorsata species e1d4cbf3872c6c310b7a1c17ddd00ebc
+#> 7            Apis florea species 92dca82a063fedd1da94b3f3972d7b22
+#> 8     Apis koschevnikovi species 4bbc06b9dfbde0b72c619810b564c6e6
+#> 9         Apis mellifera species 67cbbcf92cd60748759e58e802d98518
+#> 10      Apis nigrocincta species 213668a26ba6d2aad9575218f10d422f
+#> 11      Ascosphaera apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 12          Candida apis species 3219a9635d3438e8b76a645cecf87287
+#> 13        Eristalis apis species 16d7c8023308d38f6bb831ed5fa82002
+#> 14           Hister apis species d2d7483acf488b5ed932f49b0aa51d19
+#> 15        Ifephylus apis species 9b4d00e009b58bbfc003b51bd3d0c6f0
+#> 16  Impatiens nidus-apis species 6aecf448e6aa0cb46387066db94426d1
+#> 17      Kirkaldykra apis species 70a68f13454abd937aabf56746f4a6ad
+#> 18          Mallota apis species 10c3c3921d2ea9f9425ef9fd41914520
+#> 19 Melanosella mors-apis species 4ac238f1597847dbc7998d97b8d45a0e
+#> 20         Microdon apis species 9be92242562eb923e711dc24b7bbab9a
+#> 21           Nosema apis species 5b2838dfd0ec15844fc6f659f7580322
+#> 22       Scutirodes apis species 164ab3ac910547bc945cdbb994be1ee5
+#> 23      Spiroplasma apis species 789f91571ce55de4df9821f2d05efab0
+#> 24   Trichomonascus apis species 17dc4d840323e2c5b87e67a952f6dff3
+#> 25       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 26       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 27       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 28       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 29         Apis aestuans species a517bc572c3c2697fe3bbfabc46a1493
+#> 30           Apis alpina species f2781627115e4212ddab5979cdd425d2
+#> 31         Apis bicornis species e67e82d00faae69da173bb31f9914056
+#> 32        Apis canescens species d6b8850db971d65d6079e3a22f35e10e
+#> 33         Apis clypeata species 706060924801130f6c3abf454087c100
+#> 34      Apis cunicularia species ebc3c5166ce2cabf419c4c6dc332cf3b
+#> 35          Apis etrusca species 6d27fd39a1d8b10050ba4e331987f3c9
+#> 36          Apis globosa species 254c8e847ca4ff128bba57fe94deb98d
+#> 37        Apis hispanica species e8d2057a3efeb2cfdaebe27ea8191cd5
+#> 38         Apis hypnorum species dfb743f54f50b9b9dbee378473542821
+#> 39      Apis ichneumonea species 13c35287e20ab9373fa445dbc44981ea
+#> 40        Apis lapidaria species f8da5667af3562ebc0f6a83e1ec408f0
+#> 41         Apis muscorum species 5bbfe59da5ce7fe59eb9ca3a7a45916c
+#> 42         Apis mystacea species fba8e4752a7fa5939a7eae293ba633ec
+#> 43         Apis obsoleta species da42bcb6cc0267903fb175f8a215aecb
+#> 44         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 45         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 46             Apis rufa species e67e82d00faae69da173bb31f9914056
+#> 47          Apis signata species 551f101ad3b9bc17b24575585b2500c1
+#> 48       Apis smaragdula species 4bc5c886b061e17e9aecb537a04c616d
+#> 49        Apis spinulosa species 56e7e9f854c9ed31ea6d0a06567607d0
+#> 50      Apis subterranea species 3d2adff364a87bf7dd30524aa8071807
 #>          name_status  kingdom              family              acc_name
 #> 1      accepted name Animalia              Apidae                  <NA>
 #> 2      accepted name Bacteria Thermomonosporaceae                  <NA>
@@ -672,13 +718,13 @@ NROW(out$`Poa annua`)
 
 <pre><code>#> $Apis
 #>                       childtaxa_id     childtaxa_name childtaxa_rank
-#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        Species
-#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        Species
-#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        Species
-#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        Species
-#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        Species
-#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        Species
-#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        Species
+#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        species
+#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        species
+#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        species
+#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        species
+#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        species
+#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        species
+#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        species
 #> 
 #> attr(,"class")
 #> [1] "downstream"
@@ -693,13 +739,13 @@ NROW(out$`Poa annua`)
 
 <pre><code>#> $Apis
 #>      tsn parentname parenttsn          taxonname rankid rankname
-#> 1 154396       Apis    154395     Apis mellifera    220  Species
-#> 2 763550       Apis    154395 Apis andreniformis    220  Species
-#> 3 763551       Apis    154395        Apis cerana    220  Species
-#> 4 763552       Apis    154395       Apis dorsata    220  Species
-#> 5 763553       Apis    154395        Apis florea    220  Species
-#> 6 763554       Apis    154395 Apis koschevnikovi    220  Species
-#> 7 763555       Apis    154395   Apis nigrocincta    220  Species
+#> 1 154396       Apis    154395     Apis mellifera    220  species
+#> 2 763550       Apis    154395 Apis andreniformis    220  species
+#> 3 763551       Apis    154395        Apis cerana    220  species
+#> 4 763552       Apis    154395       Apis dorsata    220  species
+#> 5 763553       Apis    154395        Apis florea    220  species
+#> 6 763554       Apis    154395 Apis koschevnikovi    220  species
+#> 7 763555       Apis    154395   Apis nigrocincta    220  species
 #> 
 #> attr(,"class")
 #> [1] "downstream"
@@ -715,56 +761,56 @@ NROW(out$`Poa annua`)
 </code></pre>
 
 <pre><code>#>                     name    rank                            colid
-#> 1                   Apis   Genus 015be25f6b061ba517f495394b80f108
-#> 2      Actinomadura apis Species 1182a102a18b40aa19385bf5f1f53367
-#> 3    Anisocentropus apis Species 8891d18874dde14e44df52e931c44206
-#> 4     Apis andreniformis Species 7a4a38c5095963949d6d6ec917d471de
-#> 5            Apis cerana Species 39610a4ceff7e5244e334a3fbc5e47e5
-#> 6           Apis dorsata Species e1d4cbf3872c6c310b7a1c17ddd00ebc
-#> 7            Apis florea Species 92dca82a063fedd1da94b3f3972d7b22
-#> 8     Apis koschevnikovi Species 4bbc06b9dfbde0b72c619810b564c6e6
-#> 9         Apis mellifera Species 67cbbcf92cd60748759e58e802d98518
-#> 10      Apis nigrocincta Species 213668a26ba6d2aad9575218f10d422f
-#> 11      Ascosphaera apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 12          Candida apis Species 3219a9635d3438e8b76a645cecf87287
-#> 13        Eristalis apis Species 16d7c8023308d38f6bb831ed5fa82002
-#> 14           Hister apis Species d2d7483acf488b5ed932f49b0aa51d19
-#> 15        Ifephylus apis Species 9b4d00e009b58bbfc003b51bd3d0c6f0
-#> 16  Impatiens nidus-apis Species 6aecf448e6aa0cb46387066db94426d1
-#> 17      Kirkaldykra apis Species 70a68f13454abd937aabf56746f4a6ad
-#> 18          Mallota apis Species 10c3c3921d2ea9f9425ef9fd41914520
-#> 19 Melanosella mors-apis Species 4ac238f1597847dbc7998d97b8d45a0e
-#> 20         Microdon apis Species 9be92242562eb923e711dc24b7bbab9a
-#> 21           Nosema apis Species 5b2838dfd0ec15844fc6f659f7580322
-#> 22       Scutirodes apis Species 164ab3ac910547bc945cdbb994be1ee5
-#> 23      Spiroplasma apis Species 789f91571ce55de4df9821f2d05efab0
-#> 24   Trichomonascus apis Species 17dc4d840323e2c5b87e67a952f6dff3
-#> 25       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 26       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 27       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 28       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 29         Apis aestuans Species a517bc572c3c2697fe3bbfabc46a1493
-#> 30           Apis alpina Species f2781627115e4212ddab5979cdd425d2
-#> 31         Apis bicornis Species e67e82d00faae69da173bb31f9914056
-#> 32        Apis canescens Species d6b8850db971d65d6079e3a22f35e10e
-#> 33         Apis clypeata Species 706060924801130f6c3abf454087c100
-#> 34      Apis cunicularia Species ebc3c5166ce2cabf419c4c6dc332cf3b
-#> 35          Apis etrusca Species 6d27fd39a1d8b10050ba4e331987f3c9
-#> 36          Apis globosa Species 254c8e847ca4ff128bba57fe94deb98d
-#> 37        Apis hispanica Species e8d2057a3efeb2cfdaebe27ea8191cd5
-#> 38         Apis hypnorum Species dfb743f54f50b9b9dbee378473542821
-#> 39      Apis ichneumonea Species 13c35287e20ab9373fa445dbc44981ea
-#> 40        Apis lapidaria Species f8da5667af3562ebc0f6a83e1ec408f0
-#> 41         Apis muscorum Species 5bbfe59da5ce7fe59eb9ca3a7a45916c
-#> 42         Apis mystacea Species fba8e4752a7fa5939a7eae293ba633ec
-#> 43         Apis obsoleta Species da42bcb6cc0267903fb175f8a215aecb
-#> 44         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 45         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 46             Apis rufa Species e67e82d00faae69da173bb31f9914056
-#> 47          Apis signata Species 551f101ad3b9bc17b24575585b2500c1
-#> 48       Apis smaragdula Species 4bc5c886b061e17e9aecb537a04c616d
-#> 49        Apis spinulosa Species 56e7e9f854c9ed31ea6d0a06567607d0
-#> 50      Apis subterranea Species 3d2adff364a87bf7dd30524aa8071807
+#> 1                   Apis   genus 015be25f6b061ba517f495394b80f108
+#> 2      Actinomadura apis species 1182a102a18b40aa19385bf5f1f53367
+#> 3    Anisocentropus apis species 8891d18874dde14e44df52e931c44206
+#> 4     Apis andreniformis species 7a4a38c5095963949d6d6ec917d471de
+#> 5            Apis cerana species 39610a4ceff7e5244e334a3fbc5e47e5
+#> 6           Apis dorsata species e1d4cbf3872c6c310b7a1c17ddd00ebc
+#> 7            Apis florea species 92dca82a063fedd1da94b3f3972d7b22
+#> 8     Apis koschevnikovi species 4bbc06b9dfbde0b72c619810b564c6e6
+#> 9         Apis mellifera species 67cbbcf92cd60748759e58e802d98518
+#> 10      Apis nigrocincta species 213668a26ba6d2aad9575218f10d422f
+#> 11      Ascosphaera apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 12          Candida apis species 3219a9635d3438e8b76a645cecf87287
+#> 13        Eristalis apis species 16d7c8023308d38f6bb831ed5fa82002
+#> 14           Hister apis species d2d7483acf488b5ed932f49b0aa51d19
+#> 15        Ifephylus apis species 9b4d00e009b58bbfc003b51bd3d0c6f0
+#> 16  Impatiens nidus-apis species 6aecf448e6aa0cb46387066db94426d1
+#> 17      Kirkaldykra apis species 70a68f13454abd937aabf56746f4a6ad
+#> 18          Mallota apis species 10c3c3921d2ea9f9425ef9fd41914520
+#> 19 Melanosella mors-apis species 4ac238f1597847dbc7998d97b8d45a0e
+#> 20         Microdon apis species 9be92242562eb923e711dc24b7bbab9a
+#> 21           Nosema apis species 5b2838dfd0ec15844fc6f659f7580322
+#> 22       Scutirodes apis species 164ab3ac910547bc945cdbb994be1ee5
+#> 23      Spiroplasma apis species 789f91571ce55de4df9821f2d05efab0
+#> 24   Trichomonascus apis species 17dc4d840323e2c5b87e67a952f6dff3
+#> 25       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 26       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 27       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 28       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 29         Apis aestuans species a517bc572c3c2697fe3bbfabc46a1493
+#> 30           Apis alpina species f2781627115e4212ddab5979cdd425d2
+#> 31         Apis bicornis species e67e82d00faae69da173bb31f9914056
+#> 32        Apis canescens species d6b8850db971d65d6079e3a22f35e10e
+#> 33         Apis clypeata species 706060924801130f6c3abf454087c100
+#> 34      Apis cunicularia species ebc3c5166ce2cabf419c4c6dc332cf3b
+#> 35          Apis etrusca species 6d27fd39a1d8b10050ba4e331987f3c9
+#> 36          Apis globosa species 254c8e847ca4ff128bba57fe94deb98d
+#> 37        Apis hispanica species e8d2057a3efeb2cfdaebe27ea8191cd5
+#> 38         Apis hypnorum species dfb743f54f50b9b9dbee378473542821
+#> 39      Apis ichneumonea species 13c35287e20ab9373fa445dbc44981ea
+#> 40        Apis lapidaria species f8da5667af3562ebc0f6a83e1ec408f0
+#> 41         Apis muscorum species 5bbfe59da5ce7fe59eb9ca3a7a45916c
+#> 42         Apis mystacea species fba8e4752a7fa5939a7eae293ba633ec
+#> 43         Apis obsoleta species da42bcb6cc0267903fb175f8a215aecb
+#> 44         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 45         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 46             Apis rufa species e67e82d00faae69da173bb31f9914056
+#> 47          Apis signata species 551f101ad3b9bc17b24575585b2500c1
+#> 48       Apis smaragdula species 4bc5c886b061e17e9aecb537a04c616d
+#> 49        Apis spinulosa species 56e7e9f854c9ed31ea6d0a06567607d0
+#> 50      Apis subterranea species 3d2adff364a87bf7dd30524aa8071807
 #>          name_status  kingdom              family              acc_name
 #> 1      accepted name Animalia              Apidae                  <NA>
 #> 2      accepted name Bacteria Thermomonosporaceae                  <NA>
@@ -820,13 +866,13 @@ NROW(out$`Poa annua`)
 
 <pre><code>#> $`015be25f6b061ba517f495394b80f108`
 #>                       childtaxa_id     childtaxa_name childtaxa_rank
-#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        Species
-#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        Species
-#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        Species
-#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        Species
-#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        Species
-#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        Species
-#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        Species
+#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        species
+#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        species
+#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        species
+#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        species
+#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        species
+#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        species
+#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        species
 #> 
 #> attr(,"class")
 #> [1] "children"
@@ -871,6 +917,10 @@ NROW(out$`Poa annua`)
 #> [1] "uid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.ncbi.nlm.nih.gov/taxonomy/282199"
 </code></pre>
@@ -885,6 +935,10 @@ NROW(out$`Poa annua`)
 #> [1] "uid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.ncbi.nlm.nih.gov/taxonomy/282199"
 </code></pre>
diff --git a/inst/vign/name_cleaning.md b/inst/vign/name_cleaning.md
index ce19bae..a8c5536 100644
--- a/inst/vign/name_cleaning.md
+++ b/inst/vign/name_cleaning.md
@@ -104,7 +104,7 @@ has a sister method with and trailing underscore, e.g., `get_tsn()` and `get_tsn
 ```r
 get_tsn_(searchterm = "Quercus b")
 #> $`Quercus b`
-#> # A tibble: 5 × 4
+#> # A tibble: 5 x 4
 #>      tsn         scientificName                           commonNames
 #>    <chr>                  <chr>                                 <chr>
 #> 1  19300        Quercus bicolor     swamp white oak,ch<ea>ne bicolore
@@ -125,7 +125,7 @@ number of a range of numbers:
 ```r
 get_tsn_(searchterm = "Quercus b", rows = 1)
 #> $`Quercus b`
-#> # A tibble: 1 × 4
+#> # A tibble: 1 x 4
 #>     tsn  scientificName                       commonNames nameUsage
 #>   <chr>           <chr>                             <chr>     <chr>
 #> 1 19300 Quercus bicolor swamp white oak,ch<ea>ne bicolore  accepted
@@ -135,7 +135,7 @@ get_tsn_(searchterm = "Quercus b", rows = 1)
 ```r
 get_tsn_(searchterm = "Quercus b", rows = 1:2)
 #> $`Quercus b`
-#> # A tibble: 2 × 4
+#> # A tibble: 2 x 4
 #>      tsn    scientificName                           commonNames nameUsage
 #>    <chr>             <chr>                                 <chr>     <chr>
 #> 1  19300   Quercus bicolor     swamp white oak,ch<ea>ne bicolore  accepted
@@ -227,30 +227,42 @@ in a programmatic workflow straight away.
 ```r
 spp <- names_list(rank = "species", size = 10)
 gnr_resolve(names = spp, preferred_data_sources = 11)
-#>               user_supplied_name                submitted_name
-#> 1             Eucalyptus oreades            Eucalyptus oreades
-#> 2          Alloispermum insuetum         Alloispermum insuetum
-#> 3                   Thymus rudis                  Thymus rudis
-#> 4                   Thymus rudis                  Thymus rudis
-#> 5      Trichosanthes dafangensis     Trichosanthes dafangensis
-#> 6  Ectropothecium subhaplocladum Ectropothecium subhaplocladum
-#> 7           Persoonia mitchellii          Persoonia mitchellii
-#> 8                Gilia propinqua               Gilia propinqua
-#> 9            Aberemoa furfuracea           Aberemoa furfuracea
-#> 10           Myrcia australasiae           Myrcia australasiae
-#> 11                Lotus borbasii                Lotus borbasii
-#>                                                    matched_name
-#> 1                                   Eucalyptus oreades R. Baker
-#> 2  Alloispermum insuetum C.F.Fernández, Urbatsch & G.A.Sullivan
-#> 3                                          Thymus rudis A.Kern.
-#> 4                              Thymus rudis A.Kern. ex Mazzetti
-#> 5                   Trichosanthes dafangensis N.G. Ye & S.J. Li
-#> 6                 Ectropothecium subhaplocladum Brotherus, 1928
-#> 7                                  Persoonia mitchellii Meissn.
-#> 8                             Gilia propinqua (Suksd.) St. John
-#> 9                      Aberemoa furfuracea (A. St.-Hil.) Baill.
-#> 10                                 Myrcia australasiae F.Muell.
-#> 11                                       Lotus borbasii Ujhelyi
+#>          user_supplied_name           submitted_name
+#> 1     Helichrysum candollei    Helichrysum candollei
+#> 2          Haworthia retusa         Haworthia retusa
+#> 3          Crypsinus bakeri         Crypsinus bakeri
+#> 4  Mangifera philippinensis Mangifera philippinensis
+#> 5    Selaginella atirrensis   Selaginella atirrensis
+#> 6   Hymenostomum sullivanii  Hymenostomum sullivanii
+#> 7   Hymenostomum sullivanii  Hymenostomum sullivanii
+#> 8         Cytisus urumoffii        Cytisus urumoffii
+#> 9         Cytisus urumoffii        Cytisus urumoffii
+#> 10        Cytisus urumoffii        Cytisus urumoffii
+#> 11        Baptisia uniflora        Baptisia uniflora
+#> 12        Baptisia uniflora        Baptisia uniflora
+#> 13        Baptisia uniflora        Baptisia uniflora
+#> 14        Baptisia uniflora        Baptisia uniflora
+#> 15     Nephelium xerocarpum     Nephelium xerocarpum
+#> 16  Baccharis gnaphalioides  Baccharis gnaphalioides
+#> 17  Baccharis gnaphalioides  Baccharis gnaphalioides
+#>                                             matched_name
+#> 1  Helichrysum candollei (Bojer ex DC.) R.Vig. & Humbert
+#> 2                            Haworthia retusa (L.) Duval
+#> 3                        Crypsinus bakeri (Luerss.) Tag.
+#> 4                      Mangifera philippinensis Mukherji
+#> 5                         Selaginella atirrensis Hieron.
+#> 6      Hymenostomum sullivanii C. Müller ex Geheeb, 1897
+#> 7                      Hymenostomum sullivanii C. Müller
+#> 8                     Cytisus urumoffii Davidov ex Stoj.
+#> 9                Cytisus urumoffii Davidoff ex Stoyanoff
+#> 10                            Cytisus urumoffii Davidoff
+#> 11                               Baptisia uniflora Hook.
+#> 12                      Baptisia uniflora (Michx.) Nutt.
+#> 13                        Baptisia uniflora (Michx.) Sm.
+#> 14                             Baptisia uniflora Spreng.
+#> 15                   Nephelium xerocarpum (Bl.) Cambess.
+#> 16                       Baccharis gnaphalioides Spreng.
+#> 17                           Baccharis gnaphalioides DC.
 #>         data_source_title score
 #> 1  GBIF Backbone Taxonomy 0.988
 #> 2  GBIF Backbone Taxonomy 0.988
@@ -263,6 +275,12 @@ gnr_resolve(names = spp, preferred_data_sources = 11)
 #> 9  GBIF Backbone Taxonomy 0.988
 #> 10 GBIF Backbone Taxonomy 0.988
 #> 11 GBIF Backbone Taxonomy 0.988
+#> 12 GBIF Backbone Taxonomy 0.988
+#> 13 GBIF Backbone Taxonomy 0.988
+#> 14 GBIF Backbone Taxonomy 0.988
+#> 15 GBIF Backbone Taxonomy 0.988
+#> 16 GBIF Backbone Taxonomy 0.988
+#> 17 GBIF Backbone Taxonomy 0.988
 ```
 
 ## Other functions
diff --git a/inst/vign/taxize_infotable.Rmd b/inst/vign/taxize_infotable.Rmd
index d3ba233..eb3bfdc 100644
--- a/inst/vign/taxize_infotable.Rmd
+++ b/inst/vign/taxize_infotable.Rmd
@@ -9,15 +9,24 @@ Some key functions in taxize, what they do, and their data sources.
 
 Function name | What it does | Source |
 ----------- | ----------- | ----------- |
-children | Get direct children | COL, NCBI, ITIS |
-classification | Upstream classification | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
-comm2sci | Get scientific from common names | EOL, NCBI, ITIS, Tropicos |
-downstream | Downstream taxa to specified rank | COL, ITIS, GBIF |
-get_ids | Get taxonomic identifiers | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
-resolve | Resolve names using any resolver | GNR, TNRS, iPlant |
-sci2comm | Get common from scientific names | EOL, NCBI, ITIS |
-synonyms | Retrieve synonyms given input names/identifiers | COL, NCBI, ITIS, Tropicos |
-upstream | Retrieve upstream taxa given names/identifiers | COL, ITIS |
+`children` | Get direct children | COL, NCBI, ITIS |
+`classification` | Upstream classification | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
+`comm2sci` | Get scientific from common names | EOL, NCBI, ITIS, Tropicos |
+`downstream` | Downstream taxa to specified rank | COL, ITIS, GBIF |
+`get_ids` | Get taxonomic identifiers | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
+`resolve` | Resolve names using many resolvers | GNR, TNRS, iPlant |
+`gnr_resolve` | Resolve names using Global Names Resolver | GNR |
+`tnrs` | Phylotastic Taxonomic Name Resolution Service | NCBI, iPlant, MSW3 |
+`tol_resolve` | Resolve names using any resolver | TOL |
+`iplant_resolve` | iPlant name resolution| iPlant |
+`sci2comm` | Get common from scientific names | EOL, NCBI, ITIS |
+`synonyms` | Retrieve synonyms given input names/identifiers | COL, NCBI, ITIS, Tropicos |
+`upstream` | Retrieve upstream taxa given names/identifiers | COL, ITIS |
+`lowest_common` | Retrieve the lowest common taxon and rank for a given taxon name or ID | COL, ITIS, GBIF, TOL, NCBI |
+`genbank2uid` | Get NCBI taxonomy UID from GenBankID | NCBI |
+`tax_name` | Get taxonomic names for a given rank | NCBI, ITIS |
+`tax_rank` | Get rank for a given taxonomic name | BOLD, COL, EOL, GBIF, NATSERV, NBN, TOL, TROPICOS, ITIS, NCBI, WORMS |
+`tpl_get` | Get The Plant List csv files | TPL |
 
 ### Acronyms
 
@@ -30,3 +39,10 @@ upstream | Retrieve upstream taxa given names/identifiers | COL, ITIS |
 * iPlant: iPlant Name Resolution Service
 * GNR: Global Names Resolver
 * TNRS: Taxonomic Name Resolution Service
+* TOL: Open Tree of Life
+* MSW3: Mammal Species of the World, 3rd Edition
+* TPL: The Plant List
+* BOLD: Barcode of Life
+* NATSERV: Natureserve
+* TROPICOS: Tropicos plant database
+* WORMS: World Register of Marine Species
diff --git a/inst/vign/taxize_infotable.md b/inst/vign/taxize_infotable.md
index d3ba233..eb3bfdc 100644
--- a/inst/vign/taxize_infotable.md
+++ b/inst/vign/taxize_infotable.md
@@ -9,15 +9,24 @@ Some key functions in taxize, what they do, and their data sources.
 
 Function name | What it does | Source |
 ----------- | ----------- | ----------- |
-children | Get direct children | COL, NCBI, ITIS |
-classification | Upstream classification | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
-comm2sci | Get scientific from common names | EOL, NCBI, ITIS, Tropicos |
-downstream | Downstream taxa to specified rank | COL, ITIS, GBIF |
-get_ids | Get taxonomic identifiers | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
-resolve | Resolve names using any resolver | GNR, TNRS, iPlant |
-sci2comm | Get common from scientific names | EOL, NCBI, ITIS |
-synonyms | Retrieve synonyms given input names/identifiers | COL, NCBI, ITIS, Tropicos |
-upstream | Retrieve upstream taxa given names/identifiers | COL, ITIS |
+`children` | Get direct children | COL, NCBI, ITIS |
+`classification` | Upstream classification | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
+`comm2sci` | Get scientific from common names | EOL, NCBI, ITIS, Tropicos |
+`downstream` | Downstream taxa to specified rank | COL, ITIS, GBIF |
+`get_ids` | Get taxonomic identifiers | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
+`resolve` | Resolve names using many resolvers | GNR, TNRS, iPlant |
+`gnr_resolve` | Resolve names using Global Names Resolver | GNR |
+`tnrs` | Phylotastic Taxonomic Name Resolution Service | NCBI, iPlant, MSW3 |
+`tol_resolve` | Resolve names using any resolver | TOL |
+`iplant_resolve` | iPlant name resolution| iPlant |
+`sci2comm` | Get common from scientific names | EOL, NCBI, ITIS |
+`synonyms` | Retrieve synonyms given input names/identifiers | COL, NCBI, ITIS, Tropicos |
+`upstream` | Retrieve upstream taxa given names/identifiers | COL, ITIS |
+`lowest_common` | Retrieve the lowest common taxon and rank for a given taxon name or ID | COL, ITIS, GBIF, TOL, NCBI |
+`genbank2uid` | Get NCBI taxonomy UID from GenBankID | NCBI |
+`tax_name` | Get taxonomic names for a given rank | NCBI, ITIS |
+`tax_rank` | Get rank for a given taxonomic name | BOLD, COL, EOL, GBIF, NATSERV, NBN, TOL, TROPICOS, ITIS, NCBI, WORMS |
+`tpl_get` | Get The Plant List csv files | TPL |
 
 ### Acronyms
 
@@ -30,3 +39,10 @@ upstream | Retrieve upstream taxa given names/identifiers | COL, ITIS |
 * iPlant: iPlant Name Resolution Service
 * GNR: Global Names Resolver
 * TNRS: Taxonomic Name Resolution Service
+* TOL: Open Tree of Life
+* MSW3: Mammal Species of the World, 3rd Edition
+* TPL: The Plant List
+* BOLD: Barcode of Life
+* NATSERV: Natureserve
+* TROPICOS: Tropicos plant database
+* WORMS: World Register of Marine Species
diff --git a/inst/vign/taxize_vignette.md b/inst/vign/taxize_vignette.md
index 91f34e1..cdfb38d 100644
--- a/inst/vign/taxize_vignette.md
+++ b/inst/vign/taxize_vignette.md
@@ -135,9 +135,7 @@ classification(specieslist, db = 'itis')
 
 ```
 #> $`Abies procera`
-#> # A tibble: 12 × 3
 #>               name          rank     id
-#>              <chr>         <chr>  <chr>
 #> 1          Plantae       kingdom 202422
 #> 2    Viridiplantae    subkingdom 954898
 #> 3     Streptophyta  infrakingdom 846494
@@ -152,9 +150,7 @@ classification(specieslist, db = 'itis')
 #> 12   Abies procera       species 181835
 #> 
 #> $`Pinus contorta`
-#> # A tibble: 12 × 3
 #>               name          rank     id
-#>              <chr>         <chr>  <chr>
 #> 1          Plantae       kingdom 202422
 #> 2    Viridiplantae    subkingdom 954898
 #> 3     Streptophyta  infrakingdom 846494
@@ -265,7 +261,7 @@ get_nbnid(c("Zootoca vivipara","Pinus contorta"), rows = 1)
 ```
 
 ```
-#> [1] "NHMSYS0001706186" "NHMSYS0000494848"
+#> [1] "NHMSYS0001706186" "NBNSYS0000004786"
 #> attr(,"class")
 #> [1] "nbnid"
 #> attr(,"match")
@@ -276,7 +272,7 @@ get_nbnid(c("Zootoca vivipara","Pinus contorta"), rows = 1)
 #> [1] FALSE FALSE
 #> attr(,"uri")
 #> [1] "https://data.nbn.org.uk/Taxa/NHMSYS0001706186"
-#> [2] "https://data.nbn.org.uk/Taxa/NHMSYS0000494848"
+#> [2] "https://data.nbn.org.uk/Taxa/NBNSYS0000004786"
 ```
 
 Or you can select a range of rows
@@ -287,22 +283,26 @@ get_nbnid(c("Zootoca vivipara","Pinus contorta"), rows = 1:3)
 ```
 
 ```
-#>              nbnid                  searchmatchtitle       rank
+#>              nbnid                    scientificName       rank
 #> 1 NHMSYS0001706186                  Zootoca vivipara    species
 #> 2 NHMSYS0020784960 Zootoca vivipara subsp. pannonica subspecies
-#> 3 NHMSYS0001706185                           Zootoca      genus
-#>    namestatus
-#> 1 Recommended
-#> 2 Recommended
-#> 3 Recommended
-#>              nbnid               searchmatchtitle       rank  namestatus
-#> 1 NHMSYS0000494848   Pinus contorta var. contorta    variety Recommended
-#> 2 NBNSYS0000004786                 Pinus contorta    species Recommended
-#> 3 NHMSYS0000494848 Pinus contorta subsp. contorta subspecies Recommended
-```
-
-```
-#> [1] "NHMSYS0001706186" "NHMSYS0000494848"
+#> 3 NHMSYS0000461615                 Bistorta vivipara    species
+#>   taxonomicStatus
+#> 1        accepted
+#> 2        accepted
+#> 3         synonym
+#>              nbnid                  scientificName       rank
+#> 1 NBNSYS0000004786                  Pinus contorta    species
+#> 2 NHMSYS0000494848  Pinus contorta subsp. contorta subspecies
+#> 3 NHMSYS0000494858 Pinus contorta subsp. murreyana subspecies
+#>   taxonomicStatus
+#> 1        accepted
+#> 2         synonym
+#> 3         synonym
+```
+
+```
+#> [1] "NHMSYS0001706186" "NBNSYS0000004786"
 #> attr(,"class")
 #> [1] "nbnid"
 #> attr(,"match")
@@ -313,7 +313,7 @@ get_nbnid(c("Zootoca vivipara","Pinus contorta"), rows = 1:3)
 #> [1] FALSE FALSE
 #> attr(,"uri")
 #> [1] "https://data.nbn.org.uk/Taxa/NHMSYS0001706186"
-#> [2] "https://data.nbn.org.uk/Taxa/NHMSYS0000494848"
+#> [2] "https://data.nbn.org.uk/Taxa/NBNSYS0000004786"
 ```
 
 In addition, in case you don't want to do interactive name selection in the case where there are a lot of names, you can get all data back with functions of the form, e.g., `get_tsn_()`, and likewise for other data sources. For example:
@@ -325,7 +325,7 @@ NROW(out$`Poa annua`)
 ```
 
 ```
-#> [1] 152
+#> [1] 25
 ```
 
 That's a lot of data, so we can get only certain rows back
@@ -337,17 +337,17 @@ get_nbnid_("Poa annua", rows = 1:10)
 
 ```
 #> $`Poa annua`
-#>    ptaxonversionkey searchmatchtitle    rank   namestatus
-#> 1  NBNSYS0000002544        Poa annua species  Recommended
-#> 2  NHMSYS0000461798              Poa   genus  Recommended
-#> 3  NHMSYS0000461804         Poa laxa species      Synonym
-#> 4  NHMSYS0021060390           Poales   order  Recommended
-#> 5  NBNSYS0000002551       Poa glauca species  Recommended
-#> 6  NBNSYS0000002547       Poa alpina species  Recommended
-#> 7  NHMSYS0000456981       Poa rigida species      Synonym
-#> 8  NBNSYS0000002551       Poa caesia species      Synonym
-#> 9  NBNSYS0000002545       Poa exilis species Undetermined
-#> 10 NHMSYS0000461804        Poa minor species      Synonym
+#>                guid    scientificName    rank taxonomicStatus
+#> 1  NBNSYS0000002544         Poa annua species        accepted
+#> 2  NBNSYS0000002739      Adonis annua species         synonym
+#> 3  NBNSYS0200001901      Bellis annua species        accepted
+#> 4  NHMSYS0000456951 Carrichtera annua species         synonym
+#> 5  NBNSYS0200003392  Triumfetta annua species        accepted
+#> 6  NBNSYS0000002918     Lunaria annua species        accepted
+#> 7  NBNSYS0200002555       Lonas annua species        accepted
+#> 8  NBNSYS0000033325   Artemisia annua species        accepted
+#> 9  NHMSYS0000456951 Carrichtera annua species        accepted
+#> 10 NHMSYS0000461806     Poa imbecilla species         synonym
 ```
 
 ## Coerce numerics/alphanumerics to taxon IDs
@@ -447,7 +447,7 @@ system.time( replicate(3, as.gbifid(c("2704179","2435099","3171445"), check=TRUE
 
 ```
 #>    user  system elapsed 
-#>   0.072   0.002   1.703
+#>   0.072   0.002   1.656
 ```
 
 ```r
@@ -456,7 +456,7 @@ system.time( replicate(3, as.gbifid(c("2704179","2435099","3171445"), check=FALS
 
 ```
 #>    user  system elapsed 
-#>   0.001   0.000   0.001
+#>   0.002   0.000   0.002
 ```
 
 ## What taxa are downstream of my taxon of interest?
diff --git a/man/apg.Rd b/man/apg.Rd
index b1c41fb..c6b1aef 100644
--- a/man/apg.Rd
+++ b/man/apg.Rd
@@ -2,8 +2,8 @@
 % Please edit documentation in R/apg.R
 \name{apg}
 \alias{apg}
-\alias{apgFamilies}
 \alias{apgOrders}
+\alias{apgFamilies}
 \title{Get APG names}
 \usage{
 apgOrders(...)
@@ -26,4 +26,3 @@ head(apgFamilies())
 \references{
 \url{http://www.mobot.org/MOBOT/research/APweb/}
 }
-
diff --git a/man/apg_families.Rd b/man/apg_families.Rd
index 58d6b09..b0645ec 100644
--- a/man/apg_families.Rd
+++ b/man/apg_families.Rd
@@ -8,7 +8,7 @@
 \describe{
   \item{original}{original data record from APG website}
   \item{this}{Order name}
-  \item{that}{Replacment order name}
+  \item{that}{Replacement order name}
   \item{order}{Order name}
 }}
 \source{
@@ -22,4 +22,3 @@ Website system of flowering plant classification.
 This dataset is from Version 13, incorporated on 2015-04-29.
 }
 \keyword{data}
-
diff --git a/man/apg_lookup.Rd b/man/apg_lookup.Rd
index f9d63f2..38a4c0c 100644
--- a/man/apg_lookup.Rd
+++ b/man/apg_lookup.Rd
@@ -34,4 +34,3 @@ apg_lookup(taxa = "Poaceae", rank = "family")
 # Name not found
 apg_lookup(taxa = "Asteraceae", rank = "family")
 }
-
diff --git a/man/apg_orders.Rd b/man/apg_orders.Rd
index 4ddff2c..ed8c4f8 100644
--- a/man/apg_orders.Rd
+++ b/man/apg_orders.Rd
@@ -8,7 +8,7 @@
 \describe{
   \item{original}{original data record from APG website}
   \item{this}{Order name}
-  \item{that}{Replacment order name}
+  \item{that}{Replacement order name}
 }}
 \source{
 \url{http://www.mobot.org/MOBOT/research/APweb/}
@@ -21,4 +21,3 @@ Website system of flowering plant classification.
 This dataset is from Version 13, incorporated on 2015-04-29.
 }
 \keyword{data}
-
diff --git a/man/bold_search.Rd b/man/bold_search.Rd
index 3047db1..5177463 100644
--- a/man/bold_search.Rd
+++ b/man/bold_search.Rd
@@ -81,4 +81,3 @@ bold_search(id=88899, includeTree=TRUE)
 \references{
 \url{http://www.boldsystems.org/index.php/resources/api}
 }
-
diff --git a/man/children.Rd b/man/children.Rd
index 12c356d..c062a48 100644
--- a/man/children.Rd
+++ b/man/children.Rd
@@ -2,17 +2,17 @@
 % Please edit documentation in R/children.R
 \name{children}
 \alias{children}
-\alias{children.colid}
 \alias{children.default}
-\alias{children.ids}
 \alias{children.tsn}
-\alias{children.uid}
+\alias{children.colid}
 \alias{children.wormsid}
+\alias{children.ids}
+\alias{children.uid}
 \title{Retrieve immediate children taxa for a given taxon name or ID.}
 \usage{
 children(...)
 
-\method{children}{default}(x, db = NULL, rows = NaN, ...)
+\method{children}{default}(x, db = NULL, rows = NA, ...)
 
 \method{children}{tsn}(x, db = NULL, ...)
 
@@ -100,8 +100,5 @@ children("Poa", db = 'col', rows=1)
 # use curl options
 library("httr")
 res <- children("Poa", db = 'col', rows=1, config=verbose())
-res <- children("Salmo", db = 'itis', config=verbose())
-res <- children("Salmo", db = 'ncbi', config=verbose())
 }
 }
-
diff --git a/man/class2tree.Rd b/man/class2tree.Rd
index a83269e..5c09d9a 100644
--- a/man/class2tree.Rd
+++ b/man/class2tree.Rd
@@ -13,16 +13,17 @@ class2tree(input, varstep = TRUE, check = TRUE, ...)
 \method{print}{classtree}(x, ...)
 }
 \arguments{
-\item{input}{List of classification data.frame's from the function classification().}
+\item{input}{List of classification data.frame's from the function
+\code{\link{classification}}}
 
-\item{varstep}{Vary step lengths between successive levels relative to proportional
-loss of the number of distinct classes.}
+\item{varstep}{Vary step lengths between successive levels relative to
+proportional loss of the number of distinct classes.}
 
-\item{check}{If TRUE, remove all redundant levels which are different for all rows
-or constant for all rows and regard each row as a different basal taxon (species).
-If FALSE all levels are retained and basal taxa (species) also must be coded as
-variables (columns). You will get a warning if species are not coded, but you can
-ignore this if that was your intention.}
+\item{check}{If TRUE, remove all redundant levels which are different for
+all rows or constant for all rows and regard each row as a different basal
+taxon (species). If FALSE all levels are retained and basal taxa (species)
+also must be coded as variables (columns). You will get a warning if
+species are not coded, but you can ignore this if that was your intention.}
 
 \item{...}{Further arguments passed on to hclust.}
 
@@ -32,45 +33,44 @@ ignore this if that was your intention.}
 An object of class "classtree" with slots:
 \itemize{
  \item phylo - The resulting object, a phylo object
- \item classification - The classification data.frame, with taxa as rows, and
- different classification levels as columns
+ \item classification - The classification data.frame, with taxa as rows,
+ and different classification levels as columns
  \item distmat - Distance matrix
  \item names - The names of the tips of the phylogeny
 }
 
-Note that when you execute the resulting object, you only get the phylo object.
-You can get to the other 3 slots by calling them directly, like output$names,
-etc.
+Note that when you execute the resulting object, you only get the phylo
+object. You can get to the other 3 slots by calling them directly, like
+output$names, etc.
 }
 \description{
 This function converts a list of hierarchies for individual species into
-a single species by taxonomic level matrix, then calculates a distance matrix
-based on taxonomy alone, and outputs either a phylo or dist object. See details
-for more information.
+a single species by taxonomic level matrix, then calculates a distance
+matrix based on taxonomy alone, and outputs either a phylo or dist object.
+See details for more information.
 }
 \details{
-See \code{\link[vegan]{taxa2dist}}. Thanks to Jari Oksanen for making
-the taxa2dist function and pointing it out, and Clarke & Warwick (1998, 2001),
-which taxa2dist was based on.
+See \code{\link[vegan]{taxa2dist}}. Thanks to Jari Oksanen for
+making the taxa2dist function and pointing it out, and Clarke & Warwick
+(1998, 2001), which taxa2dist was based on.
 }
 \examples{
 \dontrun{
-spnames <- c('Klattia flava', 'Trollius sibiricus', 'Arachis paraguariensis',
- 'Tanacetum boreale', 'Gentiana yakushimensis','Sesamum schinzianum',
- 'Pilea verrucosa','Tibouchina striphnocalyx','Lycium dasystemum',
- 'Schoenus centralis','Berkheya echinacea','Androcymbium villosum',
- 'Helianthus annuus','Madia elegans','Lupinus albicaulis','Poa annua',
+spnames <- c('Quercus robur', 'Iris oratoria', 'Arachis paraguariensis',
+ 'Helianthus annuus','Madia elegans','Lupinus albicaulis',
  'Pinus lambertiana')
-out <- classification(spnames, db='ncbi')
+out <- classification(spnames, db='itis')
 tr <- class2tree(out)
 plot(tr)
 
-# another example using random sets of names with names_list() fxn
-spnames <- names_list('species', 50)
+spnames <- c('Klattia flava', 'Trollius sibiricus', 'Arachis paraguariensis',
+ 'Tanacetum boreale', 'Gentiana yakushimensis','Sesamum schinzianum',
+ 'Pilea verrucosa','Tibouchina striphnocalyx','Lycium dasystemum',
+ 'Berkheya echinacea','Androcymbium villosum',
+ 'Helianthus annuus','Madia elegans','Lupinus albicaulis',
+ 'Pinus lambertiana')
 out <- classification(spnames, db='ncbi')
 tr <- class2tree(out)
 plot(tr)
-plot(tr, no.margin=TRUE)
 }
 }
-
diff --git a/man/classification.Rd b/man/classification.Rd
index 947d683..f86d7f3 100644
--- a/man/classification.Rd
+++ b/man/classification.Rd
@@ -1,31 +1,33 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/classification.R
 \name{classification}
-\alias{cbind.classification}
-\alias{cbind.classification_ids}
 \alias{classification}
-\alias{classification.colid}
 \alias{classification.default}
+\alias{classification.tsn}
+\alias{classification.uid}
 \alias{classification.eolid}
+\alias{classification.colid}
+\alias{classification.tpsid}
 \alias{classification.gbifid}
-\alias{classification.ids}
-\alias{classification.natservid}
 \alias{classification.nbnid}
 \alias{classification.tolid}
-\alias{classification.tpsid}
-\alias{classification.tsn}
-\alias{classification.uid}
 \alias{classification.wormsid}
+\alias{classification.natservid}
+\alias{classification.boldid}
+\alias{classification.wiki}
+\alias{classification.ids}
+\alias{cbind.classification}
 \alias{rbind.classification}
+\alias{cbind.classification_ids}
 \alias{rbind.classification_ids}
 \title{Retrieve the taxonomic hierarchy for a given taxon ID.}
 \usage{
 classification(...)
 
 \method{classification}{default}(x, db = NULL, callopts = list(),
-  return_id = TRUE, rows = NaN, ...)
+  return_id = TRUE, rows = NA, ...)
 
-\method{classification}{tsn}(id, callopts = list(), return_id = TRUE, ...)
+\method{classification}{tsn}(id, return_id = TRUE, ...)
 
 \method{classification}{uid}(id, callopts = list(), return_id = TRUE, ...)
 
@@ -51,32 +53,41 @@ classification(...)
 \method{classification}{natservid}(id, callopts = list(), return_id = TRUE,
   ...)
 
+\method{classification}{boldid}(id, callopts = list(), return_id = TRUE,
+  ...)
+
+\method{classification}{wiki}(id, callopts = list(), return_id = TRUE, ...)
+
 \method{classification}{ids}(id, ...)
 
-cbind.classification(x)
+\method{cbind}{classification}(...)
 
-rbind.classification(x)
+\method{rbind}{classification}(...)
 
-cbind.classification_ids(...)
+\method{cbind}{classification_ids}(...)
 
-rbind.classification_ids(...)
+\method{rbind}{classification_ids}(...)
 }
 \arguments{
-\item{...}{Other arguments passed to \code{\link[taxize]{get_tsn}},
-\code{\link[taxize]{get_uid}}, \code{\link[taxize]{get_eolid}},
-\code{\link[taxize]{get_colid}}, \code{\link[taxize]{get_tpsid}},
-\code{\link[taxize]{get_gbifid}}, \code{\link[taxize]{get_wormsid}},
-or \code{\link[taxize]{get_natservid}}}
+\item{...}{For \code{classification}: other arguments passed to
+\code{\link{get_tsn}},
+\code{\link{get_uid}}, \code{\link{get_eolid}},
+\code{\link{get_colid}}, \code{\link{get_tpsid}},
+\code{\link{get_gbifid}}, \code{\link{get_wormsid}},
+\code{\link{get_natservid}}, \code{\link{get_wormsid}},
+\code{\link{get_wiki}}. For \code{rbind.classification} and
+\code{cbind.classification}: one or more objects of class
+\code{classification}}
 
 \item{x}{Vector of taxa names (character) or IDs (character or numeric)
 to query.}
 
 \item{db}{character; database to query. either \code{ncbi}, \code{itis},
 \code{eol}, \code{col}, \code{tropicos}, \code{gbif}, \code{nbn},
-\code{worms}, or \code{natserv}. Note that each taxonomic data source has
-their own identifiers, so that if you provide the wrong \code{db} value
-for the identifier you could get a result, but it will likely be wrong (not
-what you were expecting).}
+\code{worms}, \code{natserv}, \code{bold}, or \code{wiki}. Note that each
+taxonomic data source has, their own identifiers, so that if you provide
+the wrong \code{db} value for the identifier you could get a result, but
+it will likely be wrong (not what you were expecting).}
 
 \item{callopts}{Curl options passed on to \code{\link[httr]{GET}}}
 
@@ -89,11 +100,12 @@ classification data.}
 all rows are considered. Note that this parameter is ignored if you pass
 in a taxonomic id instead of a name of class character.}
 
-\item{id}{character; identifiers, returned by \code{\link[taxize]{get_tsn}},
-\code{\link[taxize]{get_uid}}, \code{\link[taxize]{get_eolid}},
-\code{\link[taxize]{get_colid}}, \code{\link[taxize]{get_tpsid}},
-\code{\link[taxize]{get_gbifid}}, \code{\link[taxize]{get_tolid}},
-\code{\link[taxize]{get_wormsid}}, \code{\link[taxize]{get_natservid}}}
+\item{id}{character; identifiers, returned by \code{\link{get_tsn}},
+\code{\link{get_uid}}, \code{\link{get_eolid}},
+\code{\link{get_colid}}, \code{\link{get_tpsid}},
+\code{\link{get_gbifid}}, \code{\link{get_tolid}},
+\code{\link{get_wormsid}}, \code{\link{get_natservid}},
+\code{\link{get_wormsid}}, \code{\link{get_wiki}}}
 
 \item{key}{Your API key; loads from .Rprofile.}
 
@@ -116,12 +128,23 @@ Retrieve the taxonomic hierarchy for a given taxon ID.
 \details{
 If IDs are supplied directly (not from the \code{get_*} functions)
 you must specify the type of ID. There is a timeout of 1/3 seconds between
-querries to NCBI.
+queries to NCBI.
 
 BEWARE: Right now, NBN doesn't return the queried taxon in the
 classification. But you can attach it yourself quite easily of course.
 This behavior is different from the other data sources.
 }
+\section{Lots of results}{
+
+It may happen sometimes that you get more results back from your query
+than will show in the data.frame on screen. Our advice is to refine your
+query in those cases. On a data source basis we can attempt to help
+make it easier to refine queries, whether it be with the data provider
+(unlikely to happen), or in the code in this package (more likely) -
+let us know if you run into too many results problem and we'll see what
+we can do.
+}
+
 \examples{
 \dontrun{
 # Plug in taxon IDs
@@ -134,9 +157,22 @@ classification("ELEMENT_GLOBAL.2.134717", db = 'natserv')
 classification(c(2704179, 2441176), db = 'gbif')
 classification(25509881, db = 'tropicos')
 classification("NBNSYS0000004786", db = 'nbn')
+classification(as.nbnid("NBNSYS0000004786"), db = 'nbn')
 classification(3930798, db = 'tol')
 ## works the same if IDs are in class character
 classification(c("2704179", "2441176"), db = 'gbif')
+classification("Agapostemon", db = "bold")
+
+# wikispecies
+classification("Malus domestica", db = "wiki")
+classification("Pinus contorta", db = "wiki")
+classification("Pinus contorta", db = "wiki", wiki_site = "commons")
+classification("Pinus contorta", db = "wiki", wiki_site = "pedia")
+classification("Pinus contorta", db = "wiki", wiki_site = "pedia", wiki = "fr")
+
+classification(get_wiki("Malus domestica", "commons"))
+classification(get_wiki("Malus domestica", "species"))
+classification(c("Pinus contorta", "Malus domestica"), db = "wiki")
 
 # Plug in taxon names
 ## in this case, we use get_*() fxns internally to first get taxon IDs
@@ -237,11 +273,15 @@ classification('Poa annua', db = 'tropicos', rows=1)
 classification('Poa annua', db = 'tropicos', rows=6)
 }
 
+\dontrun{
+# Fails without db param set
+# classification(315576)
+}
 }
 \seealso{
 \code{\link{get_tsn}}, \code{\link{get_uid}},
    \code{\link{get_eolid}}, \code{\link{get_colid}},
    \code{\link{get_tpsid}}, \code{\link{get_gbifid}}
-   \code{\link{get_wormsid}}, \code{\link{get_natservid}}
+   \code{\link{get_wormsid}}, \code{\link{get_natservid}},
+   \code{\link{get_boldid}}, \code{\link{get_wiki}}
 }
-
diff --git a/man/col_children.Rd b/man/col_children.Rd
index 415cc58..6277907 100644
--- a/man/col_children.Rd
+++ b/man/col_children.Rd
@@ -49,7 +49,8 @@ You must provide one of name or id. The other parameters (format
 # A basic example
 col_children(name="Apis")
 
-# An example where there is no classification, results in data.frame with no rows
+# An example where there is no classification, results in data.frame with
+# no rows
 col_children(id='b2f88f382aa5568f93a97472c6be6516')
 
 # Use a specific year's checklist
@@ -57,16 +58,17 @@ col_children(name="Apis", checklist=2012)
 col_children(name="Apis", checklist=2009)
 
 # Pass in many names or many id's
-out <- col_children(name=c("Buteo","Apis","Accipiter","asdf"), checklist="2012")
+out <- col_children(name=c("Buteo","Apis","Accipiter","asdf"),
+  checklist = "2012")
 out$Apis # get just the output you want
 library("plyr")
 ldply(out) # or combine to one data.frame
 
 # or pass many id's
-ids <- c('abe977b1d27007a76dd12a5c93a637bf', 'b2f88f382aa5568f93a97472c6be6516')
+ids <- c('abe977b1d27007a76dd12a5c93a637bf',
+  'b2f88f382aa5568f93a97472c6be6516')
 out <- col_children(id = ids, checklist=2012)
 library("plyr")
 ldply(out) # combine to one data.frame
 }
 }
-
diff --git a/man/col_classification-defunct.Rd b/man/col_classification-defunct.Rd
index a039878..d7557d6 100644
--- a/man/col_classification-defunct.Rd
+++ b/man/col_classification-defunct.Rd
@@ -10,4 +10,3 @@ col_classification(...)
 THIS FUNCTION IS DEFUNCT.
 }
 \keyword{internal}
-
diff --git a/man/col_downstream.Rd b/man/col_downstream.Rd
index 2ae3f52..6570c5c 100644
--- a/man/col_downstream.Rd
+++ b/man/col_downstream.Rd
@@ -69,7 +69,7 @@ col_downstream(name=c("Plantae", "Animalia"), downto="class")
 col_downstream(name="Bryophyta", downto="family", checklist=2009)
 
 # By id
-col_downstream(id='576d098d770a39d09e2bcfa1c0896b26', downto="species", checklist=2012)
+col_downstream(id='576d098d770a39d09e2bcfa1c0896b26', downto="species",
+  checklist=2012)
 }
 }
-
diff --git a/man/col_search.Rd b/man/col_search.Rd
index a1e3dd7..44df881 100644
--- a/man/col_search.Rd
+++ b/man/col_search.Rd
@@ -69,4 +69,3 @@ col_search(id = "f726bdaa5924cabf8581f99889de51fc", response = "full")
 \references{
 \url{http://webservice.catalogueoflife.org/}
 }
-
diff --git a/man/comm2sci.Rd b/man/comm2sci.Rd
index 464f9ca..d33fc74 100644
--- a/man/comm2sci.Rd
+++ b/man/comm2sci.Rd
@@ -10,30 +10,36 @@ comm2sci(commnames, db = "eol", itisby = "search", simplify = TRUE, ...)
 \item{commnames}{One or more common names or partial names.}
 
 \item{db}{Data source, one of \emph{"eol"} (default), \emph{"itis"},
-\emph{"tropicos"}, \emph{"ncbi"}, or \emph{"worms"}. Note that each
-taxonomic data source
-has their own identifiers, so that if you provide the wrong \code{db}
-value for the identifier you could get a result, but it will likely be
-wrong (not what you were expecting).}
+\emph{"tropicos"}, \emph{"ncbi"}, or \emph{"worms"}.}
 
 \item{itisby}{Search for common names across entire names (search, default),
 at beginning of names (begin), or at end of names (end).}
 
-\item{simplify}{(logical) If TRUE, simplify output to a vector of names.
-If \code{FALSE}, return variable formats from different sources,
+\item{simplify}{(logical) If \code{TRUE}, simplify output to a vector
+of names. If \code{FALSE}, return variable formats from different sources,
 usually a data.frame.}
 
 \item{...}{Further arguments passed on to internal methods.}
 }
 \value{
-A vector of names.
+If \code{simplify=TRUE}, a list of scientific names, with list
+labeled by your input names. If \code{simplify=FALSE}, a data.frame with
+columns that vary by data source
 }
 \description{
 Get scientific names from common names.
 }
+\details{
+For data sources ITIS and NCBI you can pass in common names
+directly, and use \code{\link[taxize]{get_uid}} or
+\code{\link[taxize]{get_tsn}} to get ids first, then pass in to this fxn.
+
+For the other data sources, you can only pass in common names directly.
+}
 \examples{
 \dontrun{
 comm2sci(commnames='black bear')
+comm2sci(commnames='black bear', simplify = FALSE)
 comm2sci(commnames='black bear', db='itis')
 comm2sci(commnames='annual blue grass', db='tropicos')
 comm2sci(commnames=c('annual blue grass','tree of heaven'), db='tropicos')
@@ -41,27 +47,23 @@ comm2sci(commnames=c('black bear', 'roe deer'))
 comm2sci('blue whale', db = "worms")
 comm2sci(c('blue whale', 'dwarf surfclam'), db = "worms")
 
-# Output easily converts to a data.frame with \\code{\\link[plyr]{ldply}}
+# Output easily converts to a data.frame with plyr::ldply
 library(plyr)
 ldply(comm2sci(commnames=c('annual blue grass','tree of heaven'),
   db='tropicos'))
 
-# Use curl options
-library("httr")
-comm2sci(commnames='black bear', config=verbose())
-comm2sci(commnames='black bear', db="itis", config=verbose())
-comm2sci(commnames='bear', db="ncbi", config=verbose())
-comm2sci(commnames='annual blue grass', db="tropicos", config=verbose())
+# ncbi: pass in uid's from get_uid() directly
+x <- get_uid("western capercaillie", modifier = "Common Name")
+comm2sci(x)
+# itis: pass in tsn's from get_tsn() directly
+x <- get_tsn(c("Louisiana black bear", "american crow"),
+  searchtype = "common")
+comm2sci(x)
 }
 }
-\author{
-Scott Chamberlain (myrmecocystus at gmail.com)
-}
 \seealso{
-\code{\link[ritis]{search_common}},
-\code{\link[taxize]{eol_search}},
-\code{\link[taxize]{tp_search}}
-
 \code{\link[taxize]{sci2comm}}
 }
-
+\author{
+Scott Chamberlain
+}
diff --git a/man/downstream.Rd b/man/downstream.Rd
index 678fab8..e71cbba 100644
--- a/man/downstream.Rd
+++ b/man/downstream.Rd
@@ -2,17 +2,18 @@
 % Please edit documentation in R/downstream.R
 \name{downstream}
 \alias{downstream}
-\alias{downstream.colid}
 \alias{downstream.default}
+\alias{downstream.tsn}
+\alias{downstream.colid}
 \alias{downstream.gbifid}
+\alias{downstream.uid}
 \alias{downstream.ids}
-\alias{downstream.tsn}
 \title{Retrieve the downstream taxa for a given taxon name or ID.}
 \usage{
 downstream(...)
 
 \method{downstream}{default}(x, db = NULL, downto = NULL,
-  intermediate = FALSE, rows = NaN, ...)
+  intermediate = FALSE, rows = NA, ...)
 
 \method{downstream}{tsn}(x, db = NULL, downto = NULL,
   intermediate = FALSE, ...)
@@ -23,50 +24,58 @@ downstream(...)
 \method{downstream}{gbifid}(x, db = NULL, downto = NULL,
   intermediate = FALSE, ...)
 
+\method{downstream}{uid}(x, db = NULL, downto = NULL,
+  intermediate = FALSE, ...)
+
 \method{downstream}{ids}(x, db = NULL, downto = NULL,
   intermediate = FALSE, ...)
 }
 \arguments{
-\item{...}{Further args passed on to \code{itis_downstream} or \code{col_downstream}}
-
-\item{x}{Vector of taxa names (character) or IDs (character or numeric) to query.}
-
-\item{db}{character; database to query. One or both of \code{itis}, \code{col}, or
-\code{gbif}. Note that each taxonomic data source has their own identifiers, so that if you
-provide the wrong \code{db} value for the identifier you could get a result,
-but it will likely be wrong (not what you were expecting).}
-
-\item{downto}{What taxonomic rank to go down to. One of: 'superkingdom','kingdom',
-subkingdom','infrakingdom','phylum','division','subphylum','subdivision','infradivision',
-'superclass','class','subclass','infraclass','superorder','order','suborder',
-'infraorder','superfamily','family','subfamily','tribe','subtribe','genus','subgenus',
-'section','subsection','species','subspecies','variety','form','subvariety','race',
-'stirp','morph','aberration','subform', or 'unspecified'}
-
-\item{intermediate}{(logical) If TRUE, return a list of length two with target
-taxon rank names, with additional list of data.frame's of intermediate
-taxonomic groups. Default: FALSE}
-
-\item{rows}{(numeric) Any number from 1 to infinity. If the default NA, all rows are
-considered. Note that this parameter is ignored if you pass in a taxonomic id of any of the
-acceptable classes: tsn, colid.}
+\item{...}{Further args passed on to \code{itis_downstream},
+\code{col_downstream}, \code{gbif_downstream}, or \code{ncbi_downstream}}
+
+\item{x}{Vector of taxa names (character) or IDs (character or numeric)
+to query.}
+
+\item{db}{character; database to query. One or more of \code{itis},
+\code{col}, \code{gbif}, or \code{ncbi}. Note that each taxonomic data
+source has their own identifiers, so that if you provide the wrong \code{db}
+value for the identifier you could get a result, but it will likely be
+wrong (not what you were expecting).}
+
+\item{downto}{What taxonomic rank to go down to. One of: 'superkingdom',
+'kingdom', 'subkingdom','infrakingdom','phylum','division','subphylum',
+'subdivision','infradivision', 'superclass','class','subclass','infraclass',
+'superorder','order','suborder','infraorder','superfamily','family',
+'subfamily','tribe','subtribe','genus','subgenus','section','subsection',
+'species group','species','subspecies','variety','form','subvariety','race',
+'stirp', 'morph','aberration','subform', 'unspecified', 'no rank'}
+
+\item{intermediate}{(logical) If \code{TRUE}, return a list of length two
+with target taxon rank names, with additional list of data.frame's of
+intermediate taxonomic groups. Default: \code{FALSE}}
+
+\item{rows}{(numeric) Any number from 1 to infinity. If the default NA, all
+rows are considered. Note that this parameter is ignored if you pass in a
+taxonomic id of any of the acceptable classes: tsn, colid.}
 }
 \value{
-A named list of data.frames with the downstream names of every supplied taxa.
-You get an NA if there was no match in the database.
+A named list of data.frames with the downstream names of every
+supplied taxa. You get an NA if there was no match in the database.
 }
 \description{
-This function uses a while loop to continually collect children taxa down to the
-taxonomic rank that you specify in the \code{downto} parameter. You can get data
-from ITIS (itis) or Catalogue of Life (col). There is no method exposed by itis
-or col for getting taxa at a specific taxonomic rank, so we do it ourselves inside
-the function.
+This function uses a while loop to continually collect children taxa down
+to the taxonomic rank that you specify in the \code{downto} parameter. You
+can get data from ITIS (itis), Catalogue of Life (col), GBIF (gbif), or
+NCBI (ncbi). There is no method exposed by these four services for
+getting taxa at a specific taxonomic rank, so we do it ourselves here.
 }
 \examples{
 \dontrun{
 # Plug in taxon IDs
 ## col Ids have to be character, as they are alphanumeric IDs
-downstream("015be25f6b061ba517f495394b80f108", db = "col", downto = "species")
+downstream("015be25f6b061ba517f495394b80f108", db = "col",
+  downto = "species")
 ## ITIS tsn ids can be numeric or character
 downstream("154395", db = "itis", downto = "species")
 downstream(154395, db = "itis", downto = "species")
@@ -74,6 +83,7 @@ downstream(154395, db = "itis", downto = "species")
 # Plug in taxon names
 downstream("Insecta", db = 'col', downto = 'order')
 downstream("Apis", db = 'col', downto = 'species')
+downstream("Apis", db = 'ncbi', downto = 'species')
 downstream("Apis", db = 'itis', downto = 'species')
 downstream(c("Apis","Epeoloides"), db = 'itis', downto = 'species')
 downstream(c("Apis","Epeoloides"), db = 'col', downto = 'species')
@@ -84,7 +94,8 @@ downstream(get_gbifid("Ursus"), db = 'gbif', downto = 'species')
 id <- get_colid("Apis")
 downstream(id, downto = 'species')
 
-## Equivalently, plug in the call to get the id via e.g., get_colid into downstream
+## Equivalently, plug in the call to get the id via e.g., get_colid
+## into downstream
 identical(downstream(id, downto = 'species'),
          downstream(get_colid("Apis"), downto = 'species'))
 
@@ -119,10 +130,11 @@ downstream(get_colid("Animalia"), downto="class", intermediate=TRUE)
 downstream("Poa", db = 'col', downto="species")
 downstream("Poa", db = 'col', downto="species", rows=1)
 
+downstream("Poa", db = 'ncbi', downto="species")
+
 # use curl options
 res <- downstream("Apis", db = 'col', downto = 'species', config=verbose())
 res <- downstream("Apis", db = 'itis', downto = 'species', config=verbose())
 res <- downstream("Ursus", db = 'gbif', downto = 'species', config=verbose())
 }
 }
-
diff --git a/man/eol_dataobjects.Rd b/man/eol_dataobjects.Rd
index 9047b72..86fabde 100644
--- a/man/eol_dataobjects.Rd
+++ b/man/eol_dataobjects.Rd
@@ -42,4 +42,3 @@ library("httr")
 eol_dataobjects(id = "21929584", config = verbose())
 }
 }
-
diff --git a/man/eol_hierarchy-defunct.Rd b/man/eol_hierarchy-defunct.Rd
index c5d7901..6c89044 100644
--- a/man/eol_hierarchy-defunct.Rd
+++ b/man/eol_hierarchy-defunct.Rd
@@ -10,4 +10,3 @@ eol_hierarchy(...)
 THIS FUNCTION IS DEFUNCT.
 }
 \keyword{internal}
-
diff --git a/man/eol_invasive-defunct.Rd b/man/eol_invasive-defunct.Rd
index 0e59d15..fe84054 100644
--- a/man/eol_invasive-defunct.Rd
+++ b/man/eol_invasive-defunct.Rd
@@ -10,4 +10,3 @@ eol_invasive(...)
 THIS FUNCTION IS DEFUNCT.
 }
 \keyword{internal}
-
diff --git a/man/eol_pages.Rd b/man/eol_pages.Rd
index 612a373..dc614f7 100644
--- a/man/eol_pages.Rd
+++ b/man/eol_pages.Rd
@@ -80,4 +80,3 @@ It's possible to return JSON or XML with the EOL API. However,
 eol_pages(taxonconceptID=pageid)$scinames
 }
 }
-
diff --git a/man/eol_search.Rd b/man/eol_search.Rd
index a27b9de..22eaaa3 100644
--- a/man/eol_search.Rd
+++ b/man/eol_search.Rd
@@ -35,7 +35,17 @@ to filter search results}
 \item{...}{Curl options passed on to \code{\link[httr]{GET}}}
 }
 \value{
-A data frame.
+A data frame with four columns:
+\itemize{
+ \item pageid: pageid, this is the same as the eolid you can get from
+ \code{\link{get_eolid}}
+ \item name: taxonomic name, may or may not contain the taxonomic
+ authority
+ \item link: URL for the taxon in question
+ \item content: a string of semi-colon separated names. it's not clear
+ to us what these represent exactly, but figured why not give it to users
+ in case some may find it useful
+}
 }
 \description{
 Search for terms in EOL database.
@@ -51,4 +61,3 @@ eol_search(terms='Salix')
 eol_search(terms='Ursus americanus luteolus')
 }
 }
-
diff --git a/man/eubon.Rd b/man/eubon.Rd
index d13c2eb..552b286 100644
--- a/man/eubon.Rd
+++ b/man/eubon.Rd
@@ -24,7 +24,7 @@ this parameter is not set. A list of all available provider ids can be
 obtained from the '/capabilities' service end point. Providers can be
 nested, that is a parent provider can have sub providers. If the id of the
 parent provider is supplied all subproviders will be queried. The query
-can also be restriced to one or more subproviders by using the following
+can also be restricted to one or more subproviders by using the following
 syntax: parent-id[sub-id-1,sub-id2,...]}
 
 \item{searchMode}{(character) Specifies the searchMode. Possible search
@@ -44,10 +44,10 @@ on may cause a slightly increased response time. Default: \code{FALSE}}
 
 \item{timeout}{(numeric) The maximum of milliseconds to wait for responses
 from any of the providers. If the timeout is exceeded the service will just
-return the resonses that have been received so far. The default timeout is
+return the responses that have been received so far. The default timeout is
 0 ms (wait for ever)}
 
-\item{dedup}{(character) Allows to deduplicate the resuls by making use of
+\item{dedup}{(character) Allows to deduplicate the results by making use of
 a deduplication strategy. The deduplication is done by comparing
 specific properties of the taxon:
 \itemize{
@@ -86,4 +86,3 @@ Other eubon-methods: \code{\link{eubon_capabilities}},
   \code{\link{eubon_children}},
   \code{\link{eubon_hierarchy}}
 }
-
diff --git a/man/eubon_capabilities.Rd b/man/eubon_capabilities.Rd
index c9368a4..adc7d5b 100644
--- a/man/eubon_capabilities.Rd
+++ b/man/eubon_capabilities.Rd
@@ -2,7 +2,7 @@
 % Please edit documentation in R/eubon_capabilities.R
 \name{eubon_capabilities}
 \alias{eubon_capabilities}
-\title{EUBON capabilites}
+\title{EUBON capabilities}
 \usage{
 eubon_capabilities(...)
 }
@@ -10,7 +10,7 @@ eubon_capabilities(...)
 \item{...}{Curl options passed on to \code{\link[httr]{GET}}}
 }
 \description{
-EUBON capabilites
+EUBON capabilities
 }
 \examples{
 \dontrun{
@@ -24,4 +24,3 @@ eubon_capabilities()
 Other eubon-methods: \code{\link{eubon_children}},
   \code{\link{eubon_hierarchy}}, \code{\link{eubon}}
 }
-
diff --git a/man/eubon_children.Rd b/man/eubon_children.Rd
index 69af3bf..362c704 100644
--- a/man/eubon_children.Rd
+++ b/man/eubon_children.Rd
@@ -16,12 +16,12 @@ this parameter is not set. A list of all available provider ids can be
 obtained from the '/capabilities' service end point. Providers can be
 nested, that is a parent provider can have sub providers. If the id of the
 parent provider is supplied all subproviders will be queried. The query
-can also be restriced to one or more subproviders by using the following
+can also be restricted to one or more subproviders by using the following
 syntax: parent-id[sub-id-1,sub-id2,...]}
 
 \item{timeout}{(numeric) The maximum of milliseconds to wait for responses
 from any of the providers. If the timeout is exceeded the service will just
-return the resonses that have been received so far. The default timeout is
+return the responses that have been received so far. The default timeout is
 0 ms (wait for ever)}
 
 \item{...}{Curl options passed on to \code{\link[httr]{GET}}}
@@ -46,4 +46,3 @@ head(x)
 Other eubon-methods: \code{\link{eubon_capabilities}},
   \code{\link{eubon_hierarchy}}, \code{\link{eubon}}
 }
-
diff --git a/man/eubon_hierarchy.Rd b/man/eubon_hierarchy.Rd
index 2e931ec..bbb6980 100644
--- a/man/eubon_hierarchy.Rd
+++ b/man/eubon_hierarchy.Rd
@@ -16,12 +16,12 @@ this parameter is not set. A list of all available provider ids can be
 obtained from the '/capabilities' service end point. Providers can be
 nested, that is a parent provider can have sub providers. If the id of the
 parent provider is supplied all subproviders will be queried. The query
-can also be restriced to one or more subproviders by using the following
+can also be restricted to one or more subproviders by using the following
 syntax: parent-id[sub-id-1,sub-id2,...]}
 
 \item{timeout}{(numeric) The maximum of milliseconds to wait for responses
 from any of the providers. If the timeout is exceeded the service will just
-return the resonses that have been received so far. The default timeout is
+return the responses that have been received so far. The default timeout is
 0 ms (wait for ever)}
 
 \item{...}{Curl options passed on to \code{\link[httr]{GET}}}
@@ -42,4 +42,3 @@ eubon_hierarchy(id = "urn:lsid:marinespecies.org:taxname:274350", 'worms')
 Other eubon-methods: \code{\link{eubon_capabilities}},
   \code{\link{eubon_children}}, \code{\link{eubon}}
 }
-
diff --git a/man/fungorum.Rd b/man/fungorum.Rd
index aabf8de..faeef6b 100644
--- a/man/fungorum.Rd
+++ b/man/fungorum.Rd
@@ -1,14 +1,14 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/fungorum.R
 \name{fungorum}
-\alias{fg_all_updated_names}
+\alias{fungorum}
+\alias{fg_name_search}
 \alias{fg_author_search}
-\alias{fg_deprecated_names}
 \alias{fg_epithet_search}
 \alias{fg_name_by_key}
 \alias{fg_name_full_by_lsid}
-\alias{fg_name_search}
-\alias{fungorum}
+\alias{fg_all_updated_names}
+\alias{fg_deprecated_names}
 \title{Index Fungorum}
 \usage{
 fg_name_search(q, anywhere = TRUE, limit = 10, ...)
@@ -76,4 +76,3 @@ fg_author_search(q = "Fayod", limit = 2)
 \url{http://www.indexfungorum.org/}, API docs:
 \url{http://www.indexfungorum.org/ixfwebservice/fungus.asmx}
 }
-
diff --git a/man/gbif_downstream.Rd b/man/gbif_downstream.Rd
index 700afec..ebb3b07 100644
--- a/man/gbif_downstream.Rd
+++ b/man/gbif_downstream.Rd
@@ -13,9 +13,9 @@ gbif_downstream(key, downto, intermediate = FALSE, ...)
 The taxonomic level IS case sensitive, and you do have to spell it
 correctly. See \code{data(rank_ref)} for spelling.}
 
-\item{intermediate}{(logical) If TRUE, return a list of length two with target
-taxon rank names, with additional list of data.frame's of intermediate
-taxonomic groups. Default: FALSE}
+\item{intermediate}{(logical) If TRUE, return a list of length two with
+target taxon rank names, with additional list of data.frame's of
+intermediate taxonomic groups. Default: FALSE}
 
 \item{...}{Further args passed on to \code{\link{gbif_name_usage}}}
 }
@@ -33,7 +33,7 @@ Retrieve all taxa names downstream in hierarchy for GBIF
 gbif_downstream(key = 198, downto="genus")
 gbif_downstream(key = 198, downto="genus", intermediate=TRUE)
 
-# get families downstream from the family Strepsiptera (twisted wing parasites)
+# families downstream from the family Strepsiptera (twisted wing parasites)
 gbif_downstream(key = 1227, "family")
 ## here, intermediate leads to the same result as the target
 gbif_downstream(key = 1227, "family", intermediate=TRUE)
@@ -52,4 +52,3 @@ gbif_downstream(key = 7799978, downto="species", intermediate=TRUE)
 \author{
 Scott Chamberlain \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/gbif_name_usage.Rd b/man/gbif_name_usage.Rd
index ed7c9a0..a9634e4 100644
--- a/man/gbif_name_usage.Rd
+++ b/man/gbif_name_usage.Rd
@@ -52,4 +52,3 @@ import rgbif and thus require GDAL binary installation.
 \references{
 \url{http://www.gbif.org/developer/summary}
 }
-
diff --git a/man/gbif_parse.Rd b/man/gbif_parse.Rd
index 1a2cc87..2742532 100644
--- a/man/gbif_parse.Rd
+++ b/man/gbif_parse.Rd
@@ -27,13 +27,12 @@ gbif_parse(c('Arrhenatherum elatius var. elatius',
              'Vanessa atalanta (Linnaeus, 1758)'))
 }
 }
-\author{
-John Baumgartner (johnbb at student.unimelb.edu.au)
-}
 \references{
 \url{http://tools.gbif.org/nameparser/api.do}
 }
 \seealso{
 \code{\link{gni_parse}}
 }
-
+\author{
+John Baumgartner (johnbb at student.unimelb.edu.au)
+}
diff --git a/man/genbank2uid.Rd b/man/genbank2uid.Rd
index e06b645..6a4fe3e 100644
--- a/man/genbank2uid.Rd
+++ b/man/genbank2uid.Rd
@@ -13,12 +13,21 @@ genbank2uid(id, batch_size = 100, ...)
 
 \item{...}{Curl args passed on to \code{\link[httr]{GET}}}
 }
+\value{
+one or more NCBI taxonomic IDs
+}
 \description{
 Get NCBI taxonomy UID from GenBankID
 }
 \details{
-See \url{http://www.ncbi.nlm.nih.gov/Sitemap/sequenceIDs.html} for help on why
-there are two identifiers, and the difference between them.
+See \url{http://www.ncbi.nlm.nih.gov/Sitemap/sequenceIDs.html} for
+help on why there are two identifiers, and the difference between them.
+
+Note that if you pass in > 1 item, if one or more of your items is not
+found, the entire batch will return \code{NA}'s. To get around this,
+set \code{batch_size = 1} - so each is sent separtaely to NCBI.
+However, this of course is much slower than the default, which is to send
+up to 100 at a time.
 }
 \examples{
 \dontrun{
@@ -43,4 +52,3 @@ library('httr')
 genbank2uid(id = 156446673, config=verbose())
 }
 }
-
diff --git a/man/get_boldid.Rd b/man/get_boldid.Rd
index e42b217..4a5b05a 100644
--- a/man/get_boldid.Rd
+++ b/man/get_boldid.Rd
@@ -1,14 +1,14 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_boldid.R
 \name{get_boldid}
+\alias{get_boldid}
 \alias{as.boldid}
 \alias{as.boldid.boldid}
 \alias{as.boldid.character}
-\alias{as.boldid.data.frame}
 \alias{as.boldid.list}
 \alias{as.boldid.numeric}
+\alias{as.boldid.data.frame}
 \alias{as.data.frame.boldid}
-\alias{get_boldid}
 \alias{get_boldid_}
 \title{Get the BOLD (Barcode of Life) code for a search term.}
 \usage{
@@ -38,11 +38,11 @@ get_boldid_(searchterm, verbose = TRUE, fuzzy = FALSE,
 
 \item{fuzzy}{(logical) Whether to use fuzzy search or not (default: FALSE).}
 
-\item{dataTypes}{(character) Specifies the datatypes that will be returned. See Details for
-options.}
+\item{dataTypes}{(character) Specifies the datatypes that will be returned.
+See \code{\link{bold_search}} for options.}
 
-\item{includeTree}{(logical) If TRUE (default: FALSE), returns a list containing information
-for parent taxa as well as the specified taxon.}
+\item{includeTree}{(logical) If TRUE (default: FALSE), returns a list
+containing information for parent taxa as well as the specified taxon.}
 
 \item{ask}{logical; should get_tsn be run in interactive mode?
 If TRUE and more than one TSN is found for teh species, the user is asked for
@@ -74,25 +74,14 @@ taxon). Optional. See \code{Filtering} below.}
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
 }
 \description{
 Get the BOLD (Barcode of Life) code for a search term.
@@ -105,6 +94,7 @@ subset that is closer to the target you want.  For all these parameters,
 you can use regex strings since we use \code{\link{grep}} internally to match.
 Filtering narrows down to the set that matches your query, and removes the rest.
 }
+
 \examples{
 \dontrun{
 get_boldid(searchterm = "Agapostemon")
@@ -169,16 +159,6 @@ as.boldid( data.frame(out) )
 get_boldid_("Osmia", fuzzy=TRUE, rows=1:5)
 get_boldid_("Osmia", fuzzy=TRUE, rows=1)
 get_boldid_(c("Osmi","Aga"), fuzzy=TRUE, rows = 1:3)
-
-# Curl options
-library("httr")
-get_boldid(searchterm = "Agapostemon", config=verbose())
-get_boldid(searchterm = "Agapostemon", config=progress())
-
-# use curl options
-library("httr")
-get_boldid("Agapostemon", config=verbose())
-bb <- get_boldid("Agapostemon", config=progress())
 }
 }
 \seealso{
@@ -186,9 +166,9 @@ bb <- get_boldid("Agapostemon", config=progress())
 
 Other taxonomic-ids: \code{\link{get_colid}},
   \code{\link{get_eolid}}, \code{\link{get_gbifid}},
-  \code{\link{get_ids}}, \code{\link{get_natservid}},
-  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
-  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
-  \code{\link{get_uid}}, \code{\link{get_wormsid}}
+  \code{\link{get_ids}}, \code{\link{get_iucn}},
+  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
+  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
+  \code{\link{get_tsn}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
 }
-
diff --git a/man/get_colid.Rd b/man/get_colid.Rd
index ab4f016..0b5eb34 100644
--- a/man/get_colid.Rd
+++ b/man/get_colid.Rd
@@ -1,13 +1,13 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_colid.R
 \name{get_colid}
+\alias{get_colid}
 \alias{as.colid}
-\alias{as.colid.character}
 \alias{as.colid.colid}
-\alias{as.colid.data.frame}
+\alias{as.colid.character}
 \alias{as.colid.list}
+\alias{as.colid.data.frame}
 \alias{as.data.frame.colid}
-\alias{get_colid}
 \alias{get_colid_}
 \title{Get the Catalogue of Life ID from taxonomic names.}
 \usage{
@@ -69,25 +69,14 @@ data itself for options. Optional. See \code{Filtering} below.}
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
 }
 \description{
 Get the Catalogue of Life ID from taxonomic names.
@@ -100,6 +89,7 @@ the data down to a subset that is closer to the target you want. For all these p
 you can use regex strings since we use \code{\link{grep}} internally to match.
 Filtering narrows down to the set that matches your query, and removes the rest.
 }
+
 \examples{
 \dontrun{
 get_colid(sciname='Poa annua')
@@ -169,17 +159,17 @@ get_colid("Quercus douglasii", config=verbose())
 bb <- get_colid("Quercus douglasii", config=progress())
 }
 }
-\author{
-Scott Chamberlain, \email{myrmecocystus at gmail.com}
-}
 \seealso{
 \code{\link[taxize]{classification}}
 
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_eolid}}, \code{\link{get_gbifid}},
-  \code{\link{get_ids}}, \code{\link{get_natservid}},
-  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
-  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
-  \code{\link{get_uid}}, \code{\link{get_wormsid}}
+  \code{\link{get_ids}}, \code{\link{get_iucn}},
+  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
+  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
+  \code{\link{get_tsn}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
+}
+\author{
+Scott Chamberlain, \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/get_eolid.Rd b/man/get_eolid.Rd
index e82748e..d1e8dd6 100644
--- a/man/get_eolid.Rd
+++ b/man/get_eolid.Rd
@@ -1,14 +1,14 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_eolid.R
 \name{get_eolid}
-\alias{as.data.frame.eolid}
+\alias{get_eolid}
 \alias{as.eolid}
-\alias{as.eolid.character}
-\alias{as.eolid.data.frame}
 \alias{as.eolid.eolid}
+\alias{as.eolid.character}
 \alias{as.eolid.list}
 \alias{as.eolid.numeric}
-\alias{get_eolid}
+\alias{as.eolid.data.frame}
+\alias{as.data.frame.eolid}
 \alias{get_eolid_}
 \title{Get the EOL ID from Encyclopedia of Life from taxonomic names.}
 \usage{
@@ -59,25 +59,14 @@ used in \code{\link{as.eolid}}}
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
 }
 \description{
 Note that EOL doesn't expose an API endpoint for directly querying for EOL
@@ -147,17 +136,17 @@ get_eolid_("Poa annua", rows=1:2)
 get_eolid_(c("asdfadfasd", "Pinus contorta"))
 }
 }
-\author{
-Scott Chamberlain, \email{myrmecocystus at gmail.com}
-}
 \seealso{
 \code{\link[taxize]{classification}}
 
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_colid}}, \code{\link{get_gbifid}},
-  \code{\link{get_ids}}, \code{\link{get_natservid}},
-  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
-  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
-  \code{\link{get_uid}}, \code{\link{get_wormsid}}
+  \code{\link{get_ids}}, \code{\link{get_iucn}},
+  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
+  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
+  \code{\link{get_tsn}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
+}
+\author{
+Scott Chamberlain, \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/get_gbifid.Rd b/man/get_gbifid.Rd
index f838416..f28b0ec 100644
--- a/man/get_gbifid.Rd
+++ b/man/get_gbifid.Rd
@@ -1,14 +1,14 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_gbifid.R
 \name{get_gbifid}
-\alias{as.data.frame.gbifid}
+\alias{get_gbifid}
 \alias{as.gbifid}
-\alias{as.gbifid.character}
-\alias{as.gbifid.data.frame}
 \alias{as.gbifid.gbifid}
+\alias{as.gbifid.character}
 \alias{as.gbifid.list}
 \alias{as.gbifid.numeric}
-\alias{get_gbifid}
+\alias{as.gbifid.data.frame}
+\alias{as.data.frame.gbifid}
 \alias{get_gbifid_}
 \title{Get the GBIF backbone taxon ID from taxonomic names.}
 \usage{
@@ -70,25 +70,14 @@ data itself for options. Optional. See \code{Filtering} below.}
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
 }
 \description{
 Get the GBIF backbone taxon ID from taxonomic names.
@@ -116,6 +105,7 @@ to a subset that is closer to the target you want.  For all these parameters,
 you can use regex strings since we use \code{\link{grep}} internally to match.
 Filtering narrows down to the set that matches your query, and removes the rest.
 }
+
 \examples{
 \dontrun{
 get_gbifid(sciname='Poa annua')
@@ -186,17 +176,17 @@ get_gbifid("Quercus douglasii", config=verbose())
 bb <- get_gbifid("Quercus douglasii", config=progress())
 }
 }
-\author{
-Scott Chamberlain, \email{myrmecocystus at gmail.com}
-}
 \seealso{
 \code{\link[taxize]{classification}}
 
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_colid}}, \code{\link{get_eolid}},
-  \code{\link{get_ids}}, \code{\link{get_natservid}},
-  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
-  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
-  \code{\link{get_uid}}, \code{\link{get_wormsid}}
+  \code{\link{get_ids}}, \code{\link{get_iucn}},
+  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
+  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
+  \code{\link{get_tsn}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
+}
+\author{
+Scott Chamberlain, \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/get_genes-defunct.Rd b/man/get_genes-defunct.Rd
index c9c48d8..5919fdf 100644
--- a/man/get_genes-defunct.Rd
+++ b/man/get_genes-defunct.Rd
@@ -10,4 +10,3 @@ get_genes(...)
 THIS FUNCTION IS DEFUNCT.
 }
 \keyword{internal}
-
diff --git a/man/get_genes_avail-defunct.Rd b/man/get_genes_avail-defunct.Rd
index c83dfec..6e5ea09 100644
--- a/man/get_genes_avail-defunct.Rd
+++ b/man/get_genes_avail-defunct.Rd
@@ -10,4 +10,3 @@ get_genes_avail(...)
 THIS FUNCTION IS DEFUNCT.
 }
 \keyword{internal}
-
diff --git a/man/get_id_details.Rd b/man/get_id_details.Rd
new file mode 100644
index 0000000..dc2ae4a
--- /dev/null
+++ b/man/get_id_details.Rd
@@ -0,0 +1,78 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/get-id-details.R
+\name{get_id_details}
+\alias{get_id_details}
+\title{Details on \code{get_*()} functions}
+\description{
+Including outputs from \code{get_*()} functions, as well as
+their attributes, and all exception behaviors.
+}
+\details{
+This document applies to the following functions:
+\itemize{
+ \item \code{\link{get_boldid}}
+ \item \code{\link{get_colid}}
+ \item \code{\link{get_eolid}}
+ \item \code{\link{get_gbifid}}
+ \item \code{\link{get_ids}}
+ \item \code{\link{get_iucn}}
+ \item \code{\link{get_natservid}}
+ \item \code{\link{get_nbnid}}
+ \item \code{\link{get_tolid}}
+ \item \code{\link{get_tpsid}}
+ \item \code{\link{get_tsn}}
+ \item \code{\link{get_ubioid}}
+ \item \code{\link{get_uid}}
+ \item \code{\link{get_wiki}}
+ \item \code{\link{get_wormsid}}
+}
+}
+\section{attributes}{
+
+Each output from \code{get_*()} functions have the following attributes:
+
+\itemize{
+ \item \emph{match} (character) - the reason for NA, either 'not found',
+ 'found' or if \code{ask = FALSE} then 'NA due to ask=FALSE')
+ \item \emph{multiple_matches} (logical) - Whether multiple matches were
+ returned by the data source. This can be \code{TRUE}, even if you get 1
+ name back because we try to pattern match the name to see if there's any
+ direct matches. So sometimes this attribute is \code{TRUE}, as well as
+ \code{pattern_match}, which then returns 1 resulting name without user
+ prompt.
+ \item \emph{pattern_match} (logical) - Whether a pattern match was made.
+ If \code{TRUE} then \code{multiple_matches} must be \code{TRUE}, and we
+ found a perfect match to your name, ignoring case. If \code{FALSE},
+ there wasn't a direct match, and likely you need to pick from many choices
+ or further parameters can be used to limit results
+ \item \emph{uri} (character) - The URI where more information can be
+ read on the taxon - includes the taxonomic identifier in the URL somewhere.
+ This may be missing if the value returned is \code{NA}
+}
+}
+
+\section{exceptions}{
+
+The following are the various ways in which \code{get_*()} functions
+behave:
+
+\itemize{
+ \item success - the value returned is a character string or numeric
+ \item no matches found - you'll get an NA, refine your search or
+ possible the taxon searched for does not exist in the database you're
+ using
+ \item more than on match and ask = FALSE - if there's more than one
+ matching result, and you have set \code{ask = FALSE}, then we can't
+ determine the single match to return, so we give back \code{NA}.
+ However, in this case we do set the \code{match} attribute to say
+ \code{NA due to ask=FALSE & > 1 result} so it's very clear what
+ happened - and you can even programatically check this as well
+ \item NA due to some other reason - some \code{get_*()} functions
+ have additional parameters for filtering taxa. It's possible that even
+ though there's results (that is, \code{found} will say \code{TRUE}),
+ you can get back an NA. This is most likely if the parameter filters
+ taxa after they are returned from the data provider and the value passed
+ to the parameter leads to no matches.
+}
+}
+
diff --git a/man/get_ids.Rd b/man/get_ids.Rd
index 48a69ac..3cc80f6 100644
--- a/man/get_ids.Rd
+++ b/man/get_ids.Rd
@@ -85,9 +85,9 @@ bb <- get_ids("Pinus contorta", db = c('nbn','gbif'), config=progress())
 
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_colid}}, \code{\link{get_eolid}},
-  \code{\link{get_gbifid}}, \code{\link{get_natservid}},
-  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
-  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
-  \code{\link{get_uid}}, \code{\link{get_wormsid}}
+  \code{\link{get_gbifid}}, \code{\link{get_iucn}},
+  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
+  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
+  \code{\link{get_tsn}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
 }
-
diff --git a/man/get_iucn.Rd b/man/get_iucn.Rd
new file mode 100644
index 0000000..4a4a93d
--- /dev/null
+++ b/man/get_iucn.Rd
@@ -0,0 +1,97 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/get_iucn.R
+\name{get_iucn}
+\alias{get_iucn}
+\alias{as.iucn}
+\alias{as.iucn.iucn}
+\alias{as.iucn.character}
+\alias{as.iucn.list}
+\alias{as.iucn.numeric}
+\alias{as.iucn.data.frame}
+\alias{as.data.frame.iucn}
+\title{Get a IUCN Redlist taxon}
+\usage{
+get_iucn(x, verbose = TRUE, key = NULL, ...)
+
+as.iucn(x, check = TRUE, key = NULL)
+
+\method{as.iucn}{iucn}(x, check = TRUE, key = NULL)
+
+\method{as.iucn}{character}(x, check = TRUE, key = NULL)
+
+\method{as.iucn}{list}(x, check = TRUE, key = NULL)
+
+\method{as.iucn}{numeric}(x, check = TRUE, key = NULL)
+
+\method{as.iucn}{data.frame}(x, check = TRUE, key = NULL)
+
+\method{as.data.frame}{iucn}(x, ...)
+}
+\arguments{
+\item{x}{(character) A vector of common or scientific names}
+
+\item{verbose}{logical; should progress be printed?}
+
+\item{key}{(character) required. you IUCN Redlist API key. See
+\code{\link[rredlist]{rredlist-package}} for help on authenticating with
+IUCN Redlist}
+
+\item{...}{Ignored}
+
+\item{check}{(logical) Check if ID matches any existing on the DB, only
+used in \code{\link{as.iucn}}}
+}
+\value{
+A vector of taxonomic identifiers as an S3 class.
+
+Comes with the following attributes:
+\itemize{
+ \item \emph{match} (character) - the reason for NA, either 'not found',
+ 'found' or if \code{ask = FALSE} then 'NA due to ask=FALSE')
+ \item \emph{name} (character) - the taxonomic name, which is needed in
+ \code{\link{synonyms}} and \code{\link{sci2comm}} methods since they
+ internally use \pkg{rredlist} functions which require the taxonomic name,
+ and not the taxonomic identifier
+ \item \emph{uri} (character) - The URI where more information can be
+ read on the taxon - includes the taxonomic identifier in the URL somewhere
+}
+
+\emph{multiple_matches} and \emph{pattern_match} do not apply here as in
+other \code{get_*} methods since there is no IUCN Redlist search,
+so you either get a match or you do not get a match.
+}
+\description{
+Get a IUCN Redlist taxon
+}
+\details{
+There is no underscore method, because there's no real
+search for IUCN, that is, where you search for a string, and get back
+a bunch of results due to fuzzy matching. If that exists in the future
+we'll add an underscore method here.
+
+IUCN ids only work with \code{\link{synonyms}} and \code{\link{sci2comm}}
+methods.
+}
+\examples{
+\dontrun{
+get_iucn(x = "Branta canadensis")
+get_iucn(x = "Branta bernicla")
+get_iucn(x = "Panthera uncia")
+
+# as coercion
+as.iucn(22732)
+as.iucn("22732")
+(res <- as.iucn(c(22679946, 22732, 22679935)))
+data.frame(res)
+as.iucn(data.frame(res))
+}
+}
+\seealso{
+Other taxonomic-ids: \code{\link{get_boldid}},
+  \code{\link{get_colid}}, \code{\link{get_eolid}},
+  \code{\link{get_gbifid}}, \code{\link{get_ids}},
+  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
+  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
+  \code{\link{get_tsn}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
+}
diff --git a/man/get_natservid.Rd b/man/get_natservid.Rd
index 3958d6e..8f98aa4 100644
--- a/man/get_natservid.Rd
+++ b/man/get_natservid.Rd
@@ -1,19 +1,19 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_natservid.R
 \name{get_natservid}
-\alias{as.data.frame.natservid}
+\alias{get_natservid}
 \alias{as.natservid}
+\alias{as.natservid.natservid}
 \alias{as.natservid.character}
-\alias{as.natservid.data.frame}
 \alias{as.natservid.list}
-\alias{as.natservid.natservid}
 \alias{as.natservid.numeric}
-\alias{get_natservid}
+\alias{as.natservid.data.frame}
+\alias{as.data.frame.natservid}
 \alias{get_natservid_}
 \title{Get NatureServe taxonomic ID for a taxon name}
 \usage{
 get_natservid(query, searchtype = "scientific", ask = TRUE,
-  verbose = TRUE, rows = NaN, key = NULL, ...)
+  verbose = TRUE, rows = NA, key = NULL, ...)
 
 as.natservid(x, check = TRUE)
 
@@ -29,7 +29,7 @@ as.natservid(x, check = TRUE)
 
 \method{as.data.frame}{natservid}(x, ...)
 
-get_natservid_(query, verbose = TRUE, rows = NaN, key = NULL, ...)
+get_natservid_(query, verbose = TRUE, rows = NA, key = NULL, ...)
 }
 \arguments{
 \item{query}{character; A vector of common or scientific names.}
@@ -63,25 +63,14 @@ used in \code{\link{as.natservid}}}
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
 }
 \description{
 Get NatureServe taxonomic ID for a taxon name
@@ -100,8 +89,9 @@ You can pass your token in as an argument or store it one of two places:
 }
 
 See \code{\link{Startup}} for information on how to create/find your
-.Rrofile and .Renviron files
+.Rprofile and .Renviron files
 }
+
 \examples{
 \dontrun{
 (x <- get_natservid("Helianthus annuus"))
@@ -158,8 +148,8 @@ get_natservid_("Ruby*", rows=1:3)
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_colid}}, \code{\link{get_eolid}},
   \code{\link{get_gbifid}}, \code{\link{get_ids}},
-  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
-  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
-  \code{\link{get_uid}}, \code{\link{get_wormsid}}
+  \code{\link{get_iucn}}, \code{\link{get_nbnid}},
+  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
+  \code{\link{get_tsn}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
 }
-
diff --git a/man/get_nbnid.Rd b/man/get_nbnid.Rd
index 89a83e9..649d2ee 100644
--- a/man/get_nbnid.Rd
+++ b/man/get_nbnid.Rd
@@ -1,13 +1,13 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_nbnid.R
 \name{get_nbnid}
-\alias{as.data.frame.nbnid}
+\alias{get_nbnid}
 \alias{as.nbnid}
+\alias{as.nbnid.nbnid}
 \alias{as.nbnid.character}
-\alias{as.nbnid.data.frame}
 \alias{as.nbnid.list}
-\alias{as.nbnid.nbnid}
-\alias{get_nbnid}
+\alias{as.nbnid.data.frame}
+\alias{as.data.frame.nbnid}
 \alias{get_nbnid_}
 \title{Get the UK National Biodiversity Network ID from taxonomic names.}
 \usage{
@@ -39,46 +39,40 @@ input. If FALSE NA is returned for multiple matches.}
 \item{verbose}{logical; If TRUE the actual taxon queried is printed on the
 console.}
 
-\item{rec_only}{(logical) If \code{TRUE} ids of recommended names are returned (i.e.
-synonyms are removed). Defaults to \code{FALSE}. Remember, the id of a synonym is a
-taxa with 'recommended' name status.}
+\item{rec_only}{(logical) If \code{TRUE} ids of recommended names are
+returned (i.e. synonyms are removed). Defaults to \code{FALSE}. Remember,
+the id of a synonym is a taxa with 'recommended' name status.}
 
-\item{rank}{(character) If given, we attempt to limit the results to those taxa with the
-matching rank.}
+\item{rank}{(character) If given, we attempt to limit the results to those
+taxa with the matching rank.}
 
-\item{rows}{numeric; Any number from 1 to infinity. If the default NA, all rows are considered.
-Note that this function still only gives back a nbnid class object with one to many identifiers.
-See \code{\link[taxize]{get_nbnid_}} to get back all, or a subset, of the raw data that you are
-presented during the ask process.}
+\item{rows}{numeric; Any number from 1 to infinity. If the default NA, all
+rows are considered. Note that this function still only gives back a nbnid
+class object with one to many identifiers. See
+\code{\link[taxize]{get_nbnid_}} to get back all, or a subset, of the raw
+data that you are presented during the ask process.}
 
 \item{...}{Further args passed on to \code{nbn_search}}
 
 \item{x}{Input to \code{\link{as.nbnid}}}
 
-\item{check}{logical; Check if ID matches any existing on the DB, only used in
-\code{\link{as.nbnid}}}
+\item{check}{logical; Check if ID matches any existing on the DB, only
+used in \code{\link{as.nbnid}}}
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
+
+an object of class nbnid, a light wrapper around a character
+string that is the taxonomic ID - includes attributes with relavant
+metadata
 }
 \description{
 Get the UK National Biodiversity Network ID from taxonomic names.
@@ -109,13 +103,17 @@ get_nbnid(c("Zootoca vivipara","Chironomus riparius", "uaudnadndj"))
 as.nbnid(get_nbnid("Zootoca vivipara")) # already a nbnid, returns the same
 as.nbnid(get_nbnid(c("Zootoca vivipara","Pinus contorta"))) # same
 as.nbnid('NHMSYS0001706186') # character
-as.nbnid(c("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867")) # character vector, length > 1
-as.nbnid(list("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867")) # list
+# character vector, length > 1
+as.nbnid(c("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867"))
+# list
+as.nbnid(list("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867"))
 ## dont check, much faster
 as.nbnid('NHMSYS0001706186', check=FALSE)
-as.nbnid(list("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867"), check=FALSE)
+as.nbnid(list("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867"),
+  check=FALSE)
 
-(out <- as.nbnid(c("NHMSYS0001706186","NHMSYS0000494848","NBNSYS0000010867")))
+(out <- as.nbnid(c("NHMSYS0001706186","NHMSYS0000494848",
+  "NBNSYS0000010867")))
 data.frame(out)
 as.nbnid( data.frame(out) )
 
@@ -131,8 +129,8 @@ get_nbnid("Quercus douglasii", config=verbose())
 bb <- get_nbnid("Quercus douglasii", config=progress())
 }
 }
-\author{
-Scott Chamberlain, \email{myrmecocystus at gmail.com}
+\references{
+<https://api.nbnatlas.org/>
 }
 \seealso{
 \code{\link[taxize]{classification}}
@@ -140,8 +138,14 @@ Scott Chamberlain, \email{myrmecocystus at gmail.com}
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_colid}}, \code{\link{get_eolid}},
   \code{\link{get_gbifid}}, \code{\link{get_ids}},
-  \code{\link{get_natservid}}, \code{\link{get_tolid}},
-  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
-  \code{\link{get_uid}}, \code{\link{get_wormsid}}
-}
+  \code{\link{get_iucn}}, \code{\link{get_natservid}},
+  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
+  \code{\link{get_tsn}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
 
+Other nbn: \code{\link{nbn_classification}},
+  \code{\link{nbn_search}}, \code{\link{nbn_synonyms}}
+}
+\author{
+Scott Chamberlain, \email{myrmecocystus at gmail.com}
+}
diff --git a/man/get_seqs-defunct.Rd b/man/get_seqs-defunct.Rd
index e222da0..1cc64fa 100644
--- a/man/get_seqs-defunct.Rd
+++ b/man/get_seqs-defunct.Rd
@@ -10,4 +10,3 @@ get_seqs(...)
 THIS FUNCTION IS DEFUNCT.
 }
 \keyword{internal}
-
diff --git a/man/get_tolid.Rd b/man/get_tolid.Rd
index 787084a..cde5f41 100644
--- a/man/get_tolid.Rd
+++ b/man/get_tolid.Rd
@@ -1,14 +1,14 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_tolid.R
 \name{get_tolid}
-\alias{as.data.frame.tolid}
+\alias{get_tolid}
 \alias{as.tolid}
+\alias{as.tolid.tolid}
 \alias{as.tolid.character}
-\alias{as.tolid.data.frame}
 \alias{as.tolid.list}
 \alias{as.tolid.numeric}
-\alias{as.tolid.tolid}
-\alias{get_tolid}
+\alias{as.tolid.data.frame}
+\alias{as.data.frame.tolid}
 \alias{get_tolid_}
 \title{Get the OTT id for a search term}
 \usage{
@@ -55,25 +55,14 @@ used in
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
 }
 \description{
 Retrieve the Open Tree of Life Taxonomy (OTT) id of a taxon from
@@ -128,8 +117,8 @@ get_tolid_(c("asdfadfasd","Pinus contorta"))
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_colid}}, \code{\link{get_eolid}},
   \code{\link{get_gbifid}}, \code{\link{get_ids}},
-  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
-  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
-  \code{\link{get_uid}}, \code{\link{get_wormsid}}
+  \code{\link{get_iucn}}, \code{\link{get_natservid}},
+  \code{\link{get_nbnid}}, \code{\link{get_tpsid}},
+  \code{\link{get_tsn}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
 }
-
diff --git a/man/get_tpsid.Rd b/man/get_tpsid.Rd
index 5f64d7e..acfffc6 100644
--- a/man/get_tpsid.Rd
+++ b/man/get_tpsid.Rd
@@ -1,14 +1,14 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_tpsid.R
 \name{get_tpsid}
-\alias{as.data.frame.tpsid}
+\alias{get_tpsid}
 \alias{as.tpsid}
+\alias{as.tpsid.tpsid}
 \alias{as.tpsid.character}
-\alias{as.tpsid.data.frame}
 \alias{as.tpsid.list}
 \alias{as.tpsid.numeric}
-\alias{as.tpsid.tpsid}
-\alias{get_tpsid}
+\alias{as.tpsid.data.frame}
+\alias{as.data.frame.tpsid}
 \alias{get_tpsid_}
 \title{Get the NameID codes from Tropicos for taxonomic names.}
 \usage{
@@ -62,25 +62,14 @@ data itself for options. Optional. See \code{Filtering} below.}
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
 }
 \description{
 Get the NameID codes from Tropicos for taxonomic names.
@@ -93,6 +82,7 @@ target you want.  For all these parameters,
 you can use regex strings since we use \code{\link{grep}} internally to match.
 Filtering narrows down to the set that matches your query, and removes the rest.
 }
+
 \examples{
 \dontrun{
 get_tpsid(sciname='Poa annua')
@@ -170,17 +160,17 @@ get_tpsid("Quercus douglasii", config=verbose())
 bb <- get_tpsid("Quercus douglasii", config=progress())
 }
 }
-\author{
-Scott Chamberlain, \email{myrmecocystus at gmail.com}
-}
 \seealso{
 \code{\link[taxize]{classification}}
 
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_colid}}, \code{\link{get_eolid}},
   \code{\link{get_gbifid}}, \code{\link{get_ids}},
-  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
-  \code{\link{get_tolid}}, \code{\link{get_tsn}},
-  \code{\link{get_uid}}, \code{\link{get_wormsid}}
+  \code{\link{get_iucn}}, \code{\link{get_natservid}},
+  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
+  \code{\link{get_tsn}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
+}
+\author{
+Scott Chamberlain, \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/get_tsn.Rd b/man/get_tsn.Rd
index 97e9cf0..bd9c2cb 100644
--- a/man/get_tsn.Rd
+++ b/man/get_tsn.Rd
@@ -1,14 +1,14 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_tsn.R
 \name{get_tsn}
-\alias{as.data.frame.tsn}
+\alias{get_tsn}
 \alias{as.tsn}
+\alias{as.tsn.tsn}
 \alias{as.tsn.character}
-\alias{as.tsn.data.frame}
 \alias{as.tsn.list}
 \alias{as.tsn.numeric}
-\alias{as.tsn.tsn}
-\alias{get_tsn}
+\alias{as.tsn.data.frame}
+\alias{as.data.frame.tsn}
 \alias{get_tsn_}
 \title{Get the TSN code for a search term.}
 \usage{
@@ -60,33 +60,22 @@ presented during the ask process.}
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
 }
 \description{
 Retrieve the taxonomic serial numbers (TSN) of a taxon from ITIS.
 }
 \examples{
 \dontrun{
-get_tsn(searchterm = "Quercus douglasii")
-get_tsn(searchterm = "Chironomus riparius")
+get_tsn("Quercus douglasii")
+get_tsn("Chironomus riparius")
 get_tsn(c("Chironomus riparius","Quercus douglasii"))
 splist <- c("annona cherimola", 'annona muricata', "quercus robur",
 		"shorea robusta", "pandanus patina", "oryza sativa", "durio zibethinus")
@@ -127,11 +116,6 @@ get_tsn_("Arni")
 get_tsn_("Arni", rows=1)
 get_tsn_("Arni", rows=1:2)
 get_tsn_(c("asdfadfasd","Pinus contorta"), rows=1:5)
-
-# use curl options
-library("httr")
-get_tsn("Quercus douglasii", config=verbose())
-bb <- get_tsn("Quercus douglasii", config=progress())
 }
 }
 \seealso{
@@ -140,8 +124,8 @@ bb <- get_tsn("Quercus douglasii", config=progress())
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_colid}}, \code{\link{get_eolid}},
   \code{\link{get_gbifid}}, \code{\link{get_ids}},
-  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
-  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
-  \code{\link{get_uid}}, \code{\link{get_wormsid}}
+  \code{\link{get_iucn}}, \code{\link{get_natservid}},
+  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
+  \code{\link{get_tpsid}}, \code{\link{get_uid}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
 }
-
diff --git a/man/get_ubioid-defunct.Rd b/man/get_ubioid-defunct.Rd
index 9b7c79b..53b9a17 100644
--- a/man/get_ubioid-defunct.Rd
+++ b/man/get_ubioid-defunct.Rd
@@ -1,14 +1,14 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_ubioid.R
 \name{get_ubioid}
-\alias{as.data.frame.ubioid}
+\alias{get_ubioid}
 \alias{as.ubioid}
+\alias{as.ubioid.ubioid}
 \alias{as.ubioid.character}
-\alias{as.ubioid.data.frame}
 \alias{as.ubioid.list}
 \alias{as.ubioid.numeric}
-\alias{as.ubioid.ubioid}
-\alias{get_ubioid}
+\alias{as.ubioid.data.frame}
+\alias{as.data.frame.ubioid}
 \alias{get_ubioid_}
 \title{Get the uBio id for a search term}
 \usage{
@@ -78,7 +78,7 @@ target you want.  For all these parameters,
 you can use regex strings since we use \code{\link{grep}} internally to match.
 Filtering narrows down to the set that matches your query, and removes the rest.
 }
+
 \seealso{
 \code{\link[taxize]{get_uid}}, \code{\link[taxize]{ubio_search}}
 }
-
diff --git a/man/get_uid.Rd b/man/get_uid.Rd
index b306b82..8078229 100644
--- a/man/get_uid.Rd
+++ b/man/get_uid.Rd
@@ -1,14 +1,14 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_uid.R
 \name{get_uid}
-\alias{as.data.frame.uid}
+\alias{get_uid}
 \alias{as.uid}
+\alias{as.uid.uid}
 \alias{as.uid.character}
-\alias{as.uid.data.frame}
 \alias{as.uid.list}
 \alias{as.uid.numeric}
-\alias{as.uid.uid}
-\alias{get_uid}
+\alias{as.uid.data.frame}
+\alias{as.data.frame.uid}
 \alias{get_uid_}
 \title{Get the UID codes from NCBI for taxonomic names.}
 \usage{
@@ -34,93 +34,86 @@ get_uid_(sciname, verbose = TRUE, rows = NA)
 \arguments{
 \item{sciname}{character; scientific name.}
 
-\item{ask}{logical; should get_uid be run in interactive mode?
-If TRUE and more than one TSN is found for the species, the user is asked for
-input. If FALSE NA is returned for multiple matches.}
+\item{ask}{logical; should get_uid be run in interactive mode? If TRUE and
+more than one TSN is found for the species, the user is asked for input. If
+FALSE NA is returned for multiple matches.}
 
-\item{verbose}{logical; If TRUE the actual taxon queried is printed on the console.}
+\item{verbose}{logical; If TRUE the actual taxon queried is printed on the
+console.}
 
-\item{rows}{numeric; Any number from 1 to infinity. If the default NA, all rows are considered.
-Note that this function still only gives back a uid class object with one to many identifiers.
-See \code{\link[taxize]{get_uid_}} to get back all, or a subset, of the raw data that you are
-presented during the ask process.}
+\item{rows}{numeric; Any number from 1 to infinity. If the default NA, all
+rows are considered. Note that this function still only gives back a uid
+class object with one to many identifiers. See
+\code{\link[taxize]{get_uid_}} to get back all, or a subset, of the raw
+data that you are presented during the ask process.}
 
-\item{modifier}{(character) A modifier to the \code{sciname} given. Options include:
-Organism, Scientific Name, Common Name, All Names, Division, Filter, Lineage, GC,
-MGC, Name Tokens, Next Level, PGC, Properties, Rank, Subtree, Synonym, Text Word.
-These are not checked, so make sure they are entered correctly, as is.}
+\item{modifier}{(character) A modifier to the \code{sciname} given. Options
+include: Organism, Scientific Name, Common Name, All Names, Division,
+Filter, Lineage, GC, MGC, Name Tokens, Next Level, PGC, Properties, Rank,
+Subtree, Synonym, Text Word. These are not checked, so make sure they are
+entered correctly, as is.}
 
-\item{rank_query}{(character) A taxonomic rank name to modify the query sent to NCBI.
-See \code{\link{rank_ref}} for possible options. Though note
-that some data sources use atypical ranks, so inspect the data itself for options.
-Optional. See \code{Querying} below.}
+\item{rank_query}{(character) A taxonomic rank name to modify the query sent
+to NCBI. See \code{\link{rank_ref}} for possible options. Though note that
+some data sources use atypical ranks, so inspect the data itself for
+options. Optional. See \code{Querying} below.}
 
-\item{division_filter}{(character) A division (aka phylum) name to filter data after
-retrieved from NCBI. Optional. See \code{Filtering} below.}
+\item{division_filter}{(character) A division (aka phylum) name to filter
+data after retrieved from NCBI. Optional. See \code{Filtering} below.}
 
 \item{rank_filter}{(character) A taxonomic rank name to filter data after
-retrieved from NCBI. See \code{\link{rank_ref}} for possible options. Though note
-that some data sources use atypical ranks, so inspect the data itself for options.
-Optional. See \code{Filtering} below.}
+retrieved from NCBI. See \code{\link{rank_ref}} for possible options.
+Though note that some data sources use atypical ranks, so inspect the data
+itself for options. Optional. See \code{Filtering} below.}
 
 \item{...}{Ignored}
 
 \item{x}{Input to \code{\link{as.uid}}}
 
-\item{check}{logical; Check if ID matches any existing on the DB, only used in
-\code{\link{as.uid}}}
+\item{check}{logical; Check if ID matches any existing on the DB, only used
+in \code{\link{as.uid}}}
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
 }
 \description{
 Retrieve the Unique Identifier (UID) of a taxon from NCBI taxonomy browser.
 }
 \section{Querying}{
-
-The parameter \code{rank_query} is used in the search sent to NCBI, whereas
-\code{rank_filter} filters data after it comes back. The parameter
-\code{modifier} adds modifiers to the name. For example, \code{modifier="Organism"}
-adds that to the name, giving e.g., \code{Helianthus[Organism]}.
+ The parameter \code{rank_query} is used in the search sent
+  to NCBI, whereas \code{rank_filter} filters data after it comes back. The
+  parameter \code{modifier} adds modifiers to the name. For example,
+  \code{modifier="Organism"} adds that to the name, giving e.g.,
+  \code{Helianthus[Organism]}.
 }
 
 \section{Filtering}{
-
-The parameters \code{division_filter} and \code{rank_filter} are not used in
-the search to the data provider, but are used in filtering the data down to a
-subset that is closer to the target you want. For all these parameters, you can
-use regex strings since we use \code{\link{grep}} internally to match.
-Filtering narrows down to the set that matches your query, and removes the rest.
+ The parameters \code{division_filter} and
+  \code{rank_filter} are not used in the search to the data provider, but are
+  used in filtering the data down to a subset that is closer to the target
+  you want. For all these parameters, you can use regex strings since we use
+  \code{\link{grep}} internally to match. Filtering narrows down to the set
+  that matches your query, and removes the rest.
 }
 
 \section{Beware}{
-
-NCBI does funny things sometimes. E.g., if you search on Fringella morel, a slight
-misspelling of the genus name, and a non-existent epithet, NCBI gives back a morel
-fungal species. In addition, NCBI doesn't really do fuzzy searching very well, so if
-there is a slight mis-spelling in your names, you likely won't get what you are
-expecting. The lesson: clean your names before using this function. Other data
-sources are better about fuzzy matching.
+ NCBI does funny things sometimes. E.g., if you search on
+  Fringella morel, a slight misspelling of the genus name, and a non-existent
+  epithet, NCBI gives back a morel fungal species. In addition, NCBI doesn't
+  really do fuzzy searching very well, so if there is a slight mis-spelling
+  in your names, you likely won't get what you are expecting. The lesson:
+  clean your names before using this function. Other data sources are better
+  about fuzzy matching.
 }
+
 \examples{
 \dontrun{
 get_uid(c("Chironomus riparius", "Chaetopteryx"))
@@ -205,17 +198,17 @@ get_uid("Quercus douglasii", config=verbose())
 bb <- get_uid("Quercus douglasii", config=progress())
 }
 }
-\author{
-Eduard Szoecs, \email{eduardszoecs at gmail.com}
-}
 \seealso{
 \code{\link[taxize]{classification}}
 
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_colid}}, \code{\link{get_eolid}},
   \code{\link{get_gbifid}}, \code{\link{get_ids}},
-  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
-  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
-  \code{\link{get_tsn}}, \code{\link{get_wormsid}}
+  \code{\link{get_iucn}}, \code{\link{get_natservid}},
+  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
+  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
+  \code{\link{get_wiki}}, \code{\link{get_wormsid}}
+}
+\author{
+Eduard Szoecs, \email{eduardszoecs at gmail.com}
 }
-
diff --git a/man/get_wiki.Rd b/man/get_wiki.Rd
new file mode 100644
index 0000000..b7e6bae
--- /dev/null
+++ b/man/get_wiki.Rd
@@ -0,0 +1,114 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/get_wiki.R
+\name{get_wiki}
+\alias{get_wiki}
+\alias{as.wiki}
+\alias{as.wiki.wiki}
+\alias{as.wiki.character}
+\alias{as.wiki.list}
+\alias{as.wiki.numeric}
+\alias{as.wiki.data.frame}
+\alias{as.data.frame.wiki}
+\alias{get_wiki_}
+\title{Get the page name for a Wiki taxon}
+\usage{
+get_wiki(x, wiki_site = "species", wiki = "en", ask = TRUE,
+  verbose = TRUE, limit = 100, rows = NA, ...)
+
+as.wiki(x, check = TRUE, wiki_site = "species", wiki = "en")
+
+\method{as.wiki}{wiki}(x, check = TRUE, wiki_site = "species",
+  wiki = "en")
+
+\method{as.wiki}{character}(x, check = TRUE, wiki_site = "species",
+  wiki = "en")
+
+\method{as.wiki}{list}(x, check = TRUE, wiki_site = "species",
+  wiki = "en")
+
+\method{as.wiki}{numeric}(x, check = TRUE, wiki_site = "species",
+  wiki = "en")
+
+\method{as.wiki}{data.frame}(x, check = TRUE, wiki_site = "species",
+  wiki = "en")
+
+\method{as.data.frame}{wiki}(x, ...)
+
+get_wiki_(x, verbose = TRUE, wiki_site = "species", wiki = "en",
+  limit = 100, rows = NA, ...)
+}
+\arguments{
+\item{x}{(character) A vector of common or scientific names.}
+
+\item{wiki_site}{(character) Wiki site. One of species (default), pedia,
+commons}
+
+\item{wiki}{(character) language. Default: en}
+
+\item{ask}{logical; should get_wiki be run in interactive mode?
+If \code{TRUE} and more than one wiki is found for the species, the user is
+asked for input. If \code{FALSE} NA is returned for multiple matches.}
+
+\item{verbose}{logical; should progress be printed?}
+
+\item{limit}{(integer) number of records to return}
+
+\item{rows}{numeric; Any number from 1 to infinity. If the default NA, all
+rows are considered. Note that this function still only gives back a wiki
+class object with one to many identifiers. See
+\code{\link[taxize]{get_wiki_}} to get back all, or a subset, of the
+raw data that you are presented during the ask process.}
+
+\item{...}{Ignored}
+
+\item{check}{logical; Check if ID matches any existing on the DB, only
+used in \code{\link{as.wiki}}}
+}
+\value{
+A vector of taxonomic identifiers as an S3 class.
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
+}
+\description{
+Get the page name for a Wiki taxon
+}
+\details{
+For \code{type = pedia}, we use the english language site by
+default. Set the \code{language} parameter for a different language site.
+}
+\examples{
+\dontrun{
+get_wiki(x = "Quercus douglasii")
+get_wiki(x = "Quercu")
+get_wiki(x = "Quercu", "pedia")
+get_wiki(x = "Quercu", "commons")
+
+# diff. wikis with wikipedia
+get_wiki("Malus domestica", "pedia")
+get_wiki("Malus domestica", "pedia", "fr")
+
+# as coercion
+as.wiki("Malus_domestica")
+as.wiki("Malus_domestica", wiki_site = "commons")
+as.wiki("Malus_domestica", wiki_site = "pedia")
+as.wiki("Malus_domestica", wiki_site = "pedia", wiki = "fr")
+as.wiki("Malus_domestica", wiki_site = "pedia", wiki = "da")
+}
+}
+\seealso{
+\code{\link[taxize]{classification}}
+
+Other taxonomic-ids: \code{\link{get_boldid}},
+  \code{\link{get_colid}}, \code{\link{get_eolid}},
+  \code{\link{get_gbifid}}, \code{\link{get_ids}},
+  \code{\link{get_iucn}}, \code{\link{get_natservid}},
+  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
+  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
+  \code{\link{get_uid}}, \code{\link{get_wormsid}}
+}
diff --git a/man/get_wormsid.Rd b/man/get_wormsid.Rd
index e0f2cbb..210cc50 100644
--- a/man/get_wormsid.Rd
+++ b/man/get_wormsid.Rd
@@ -1,19 +1,19 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/get_wormsid.R
 \name{get_wormsid}
-\alias{as.data.frame.wormsid}
+\alias{get_wormsid}
 \alias{as.wormsid}
+\alias{as.wormsid.wormsid}
 \alias{as.wormsid.character}
-\alias{as.wormsid.data.frame}
 \alias{as.wormsid.list}
 \alias{as.wormsid.numeric}
-\alias{as.wormsid.wormsid}
-\alias{get_wormsid}
+\alias{as.wormsid.data.frame}
+\alias{as.data.frame.wormsid}
 \alias{get_wormsid_}
 \title{Get Worms ID for a taxon name}
 \usage{
 get_wormsid(query, searchtype = "scientific", accepted = FALSE,
-  ask = TRUE, verbose = TRUE, rows = NaN, ...)
+  ask = TRUE, verbose = TRUE, rows = NA, ...)
 
 as.wormsid(x, check = TRUE)
 
@@ -64,25 +64,14 @@ used in \code{\link{as.wormsid}}}
 }
 \value{
 A vector of taxonomic identifiers as an S3 class.
-If a taxon is not found an \code{NA} is given. If more than one identifier is found the
-function asks for user input if \code{ask = TRUE}, otherwise returns \code{NA}.
-If \code{ask=FALSE} and \code{rows} does not equal \code{NA}, then a data.frame is
-given back, but not of the uid class, which you can't pass on to other functions
-as you normally can.
-
-Comes with the following attributes:
-\itemize{
- \item \emph{match} (character) - the reason for NA, either 'not found', 'found' or
- if \code{ask = FALSE} then 'NA due to ask=FALSE')
- \item \emph{multiple_matches} (logical) - Whether multiple matches were returned by
- the data source. This can be \code{TRUE}, even if you get 1 name back because we try
- to pattern match the name to see if there's any direct matches. So sometimes
- this attribute is \code{TRUE}, as well as \code{pattern_match}, which then returns 1
- resulting name without user prompt.
- \item \emph{pattern_match} (logical) - Whether a pattern match was made. If \code{TRUE}
- then \code{multiple_matches} must be \code{TRUE}, and we found a perfect match to your
- name, ignoring case. If \code{FALSE}
-}
+If a taxon is not found an \code{NA} is given. If more than one identifier
+is found the function asks for user input if \code{ask = TRUE}, otherwise
+returns \code{NA}. If \code{ask=FALSE} and \code{rows} does not equal
+\code{NA}, then a data.frame is given back, but not of the uid class, which
+you can't pass on to other functions as you normally can.
+
+See \code{\link{get_id_details}} for further details including
+attributes and exceptions
 }
 \description{
 Retrieve Worms ID of a taxon from World Register of Marine
@@ -153,8 +142,8 @@ get_wormsid_("Plat", rows=1:75)
 Other taxonomic-ids: \code{\link{get_boldid}},
   \code{\link{get_colid}}, \code{\link{get_eolid}},
   \code{\link{get_gbifid}}, \code{\link{get_ids}},
-  \code{\link{get_natservid}}, \code{\link{get_nbnid}},
-  \code{\link{get_tolid}}, \code{\link{get_tpsid}},
-  \code{\link{get_tsn}}, \code{\link{get_uid}}
+  \code{\link{get_iucn}}, \code{\link{get_natservid}},
+  \code{\link{get_nbnid}}, \code{\link{get_tolid}},
+  \code{\link{get_tpsid}}, \code{\link{get_tsn}},
+  \code{\link{get_uid}}, \code{\link{get_wiki}}
 }
-
diff --git a/man/getkey.Rd b/man/getkey.Rd
index 27407d1..08c0b10 100644
--- a/man/getkey.Rd
+++ b/man/getkey.Rd
@@ -22,4 +22,3 @@ getkey(service="eol")
 }
 }
 \keyword{internal}
-
diff --git a/man/gisd_invasive-defunct.Rd b/man/gisd_invasive-defunct.Rd
index 34753a4..7a4e739 100644
--- a/man/gisd_invasive-defunct.Rd
+++ b/man/gisd_invasive-defunct.Rd
@@ -10,4 +10,3 @@ gisd_isinvasive(...)
 THIS FUNCTION IS DEFUNCT.
 }
 \keyword{internal}
-
diff --git a/man/gni_details.Rd b/man/gni_details.Rd
index db0da59..011ff62 100644
--- a/man/gni_details.Rd
+++ b/man/gni_details.Rd
@@ -31,13 +31,12 @@ library("httr")
 gni_details(id = 17802847, config = verbose())
 }
 }
-\author{
-Scott Chamberlain {myrmecocystus at gmail.com}
-}
 \seealso{
 \code{\link{gnr_datasources}}, \code{\link{gni_search}}.
 }
+\author{
+Scott Chamberlain {myrmecocystus at gmail.com}
+}
 \keyword{globalnamesindex}
 \keyword{names}
 \keyword{taxonomy}
-
diff --git a/man/gni_parse.Rd b/man/gni_parse.Rd
index 36b4fad..2d5e7ae 100644
--- a/man/gni_parse.Rd
+++ b/man/gni_parse.Rd
@@ -36,4 +36,3 @@ gni_parse("Cyanistes caeruleus", config = verbose())
 \seealso{
 \code{\link{gbif_parse}}
 }
-
diff --git a/man/gni_search.Rd b/man/gni_search.Rd
index 6cbfbbf..ba09397 100644
--- a/man/gni_search.Rd
+++ b/man/gni_search.Rd
@@ -61,16 +61,15 @@ library("httr")
 gni_search(search_term = "ani*", config = verbose())
 }
 }
-\author{
-Scott Chamberlain {myrmecocystus at gmail.com}
-}
 \references{
 \url{http://gni.globalnames.org/}, \url{https://github.com/dimus/gni/wiki/api}
 }
 \seealso{
 \code{\link{gnr_datasources}}, \code{\link{gni_search}}.
 }
+\author{
+Scott Chamberlain {myrmecocystus at gmail.com}
+}
 \keyword{globalnamesindex}
 \keyword{names}
 \keyword{taxonomy}
-
diff --git a/man/gnr_datasources.Rd b/man/gnr_datasources.Rd
index a0289f5..008f3d9 100644
--- a/man/gnr_datasources.Rd
+++ b/man/gnr_datasources.Rd
@@ -33,13 +33,12 @@ out[agrep("zoo", out$title, ignore.case = TRUE), ]
 gnr_datasources(FALSE)
 }
 }
-\author{
-Scott Chamberlain {myrmecocystus at gmail.com}
-}
 \seealso{
 \code{\link[taxize]{gnr_resolve}}
 }
+\author{
+Scott Chamberlain {myrmecocystus at gmail.com}
+}
 \keyword{names}
 \keyword{resolve}
 \keyword{taxonomy}
-
diff --git a/man/gnr_resolve.Rd b/man/gnr_resolve.Rd
index 21c9231..2b0ba94 100644
--- a/man/gnr_resolve.Rd
+++ b/man/gnr_resolve.Rd
@@ -34,37 +34,71 @@ taxonomic authorities. If \code{TRUE}, returns canocial names
 \item{highestscore}{logical; Return those names with the highest score for
 each searched name? Defunct}
 
-\item{best_match_only}{(logical) If \code{TRUE}, best match only returned. Default:
-\code{FALSE}}
+\item{best_match_only}{(logical) If \code{TRUE}, best match only returned.
+Default: \code{FALSE}}
 
-\item{preferred_data_sources}{(character) A vector of one or more data source IDs.}
+\item{preferred_data_sources}{(character) A vector of one or more data
+source IDs.}
 
-\item{with_canonical_ranks}{(logical) Returns names with infraspecific ranks, if present.
-If \code{TRUE}, we force \code{canonical=TRUE}, otherwise this parameter would
-have no effect. Default: \code{FALSE}}
+\item{with_canonical_ranks}{(logical) Returns names with infraspecific
+ranks, if present. If \code{TRUE}, we force \code{canonical=TRUE}, otherwise
+this parameter would have no effect. Default: \code{FALSE}}
 
 \item{http}{The HTTP method to use, one of "get" or "post". Default: "get".
-Use \code{http="post"} with large queries. Queries with > 300 records use "post"
-automatically because "get" would fail}
+Use \code{http="post"} with large queries. Queries with > 300 records
+use "post" automatically because "get" would fail}
 
 \item{cap_first}{(logical) For each name, fix so that the first name part is
-capitalized, while others are not. This web service is sensitive to capitalization, so
-you'll get different results depending on capitalization. First name capitalized is
-likely what you'll want and is the default. If \code{FALSE}, names are not modified.
-Default: \code{TRUE}}
+capitalized, while others are not. This web service is sensitive to
+capitalization, so you'll get different results depending on capitalization.
+First name capitalized is likely what you'll want and is the default.
+If \code{FALSE}, names are not modified. Default: \code{TRUE}}
 
-\item{fields}{(character) One of mimimal (default) or all. Minimal gives back just four
-fields, whereas all gives all fields back.}
+\item{fields}{(character) One of minimal (default) or all. Minimal gives
+back just four fields, whereas all gives all fields back.}
 
 \item{...}{Curl options passed on to \code{\link[httr]{GET}}}
 }
 \value{
-A data.frame with one attribute \code{not_known}: a character vector of
-taxa unknown to the Global Names Index. Acccess like \code{attr(output, "not_known")},
-or \code{attributes(output)$not_known}
+A data.frame with one attribute \code{not_known}: a character
+vector of taxa unknown to the Global Names Index. Access like
+\code{attr(output, "not_known")}, or \code{attributes(output)$not_known}.
+Columns of the output data.frame:
+\itemize{
+ \item user_supplied_name (character) - the name you passed in to the
+ \code{names} parameter, unchanged.
+ \item submitted_name (character) - the actual name submitted to the GNR
+ service
+ \item data_source_id (integer/numeric) - data source ID
+ \item data_source_title (character) - data source name
+ \item gni_uuid (character) - Global Names Index UUID (aka identifier)
+ \item matched_name (character) - the matched name in the GNR service
+ \item matched_name2 (character) - returned if \code{canonical=TRUE}, in
+ which case \emph{matched_name} is not returned
+ \item classification_path (character) - names of the taxonomic
+ classification tree, with names separated by pipes (\code{|})
+ \item classification_path_ranks (character) - ranks of the taxonomic
+ classification tree, with names separated by pipes (\code{|})
+ \item classification_path_ids (character) - identifiers of the taxonomic
+ classification tree, with names separated by pipes (\code{|})
+ \item taxon_id (character) - taxon identifier
+ \item edit_distance (integer/numeric) - edit distance
+ \item imported_at (character) - date imported
+ \item match_type (integer/numeric) - match type
+ \item match_value (character) - description of match type
+ \item prescore (character) - pre score
+ \item score (numeric) - score
+ \item local_id (character) - local identifier
+ \item url (character) - URL for taxon
+ \item global_id (character) - global identifier
+ \item current_taxon_id (character) - current taxon id
+ \item current_name_string (character) - current name string
+}
+Note that names (i.e. rows) are dropped that are NA, are zero length
+strings, are not character vectors, or are not found by the API.
 }
 \description{
-Uses the Global Names Index, see \url{http://gni.globalnames.org/}.
+Resolve names using Global Names Resolver.
 }
 \examples{
 \dontrun{
@@ -100,13 +134,16 @@ gnr_resolve("Scorzonera hispanica L. subsp. asphodeloides Wallr.",
    with_canonical_ranks = TRUE)
 }
 }
-\author{
-Scott Chamberlain \email{myrmecocystus at gmail.com}
+\references{
+\url{http://gnrd.globalnames.org/api}
+\url{http://gnrd.globalnames.org/}
 }
 \seealso{
-\code{\link[taxize]{gnr_datasources}}
+\code{\link[taxize]{gnr_datasources}} \code{\link{tnrs}}
+}
+\author{
+Scott Chamberlain \email{myrmecocystus at gmail.com}
 }
 \keyword{names}
 \keyword{resolve}
 \keyword{taxonomy}
-
diff --git a/man/ion.Rd b/man/ion.Rd
index 1c1cc05..55682d0 100644
--- a/man/ion.Rd
+++ b/man/ion.Rd
@@ -28,4 +28,3 @@ ion(1280626) # puma concolor
 \references{
 http://www.organismnames.com
 }
-
diff --git a/man/iplant_resolve.Rd b/man/iplant_resolve.Rd
index 79acc59..4933094 100644
--- a/man/iplant_resolve.Rd
+++ b/man/iplant_resolve.Rd
@@ -30,4 +30,3 @@ library("httr")
 iplant_resolve("Helianthusss", config=verbose())
 }
 }
-
diff --git a/man/ipni_search.Rd b/man/ipni_search.Rd
index 3887d58..94fd1e0 100644
--- a/man/ipni_search.Rd
+++ b/man/ipni_search.Rd
@@ -100,4 +100,3 @@ head(ipni_search(genus='Ceanothus', output='extended'))
 \references{
 http://www.ipni.org/link_to_ipni.html
 }
-
diff --git a/man/itis_acceptname.Rd b/man/itis_acceptname.Rd
index e57d61e..05baa47 100644
--- a/man/itis_acceptname.Rd
+++ b/man/itis_acceptname.Rd
@@ -52,4 +52,3 @@ ids <- c(18161, 18162, 47527, 47546, 47622, 46200)
 itis_acceptname(searchtsn = ids)
 }
 }
-
diff --git a/man/itis_downstream.Rd b/man/itis_downstream.Rd
index 9906de7..b24fe40 100644
--- a/man/itis_downstream.Rd
+++ b/man/itis_downstream.Rd
@@ -54,4 +54,3 @@ itis_downstream(tsns = 154394, downto="tribe", intermediate=TRUE)
 \author{
 Scott Chamberlain \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/itis_getrecord.Rd b/man/itis_getrecord.Rd
index 8bf48cb..6bf6d7a 100644
--- a/man/itis_getrecord.Rd
+++ b/man/itis_getrecord.Rd
@@ -27,7 +27,6 @@ itis_getrecord(202385)
 itis_getrecord(c(202385,70340))
 
 # by lsid
-itis_getrecord("urn:lsid:itis.gov:itis_tsn:180543", "lsid")
+itis_getrecord("urn:lsid:itis.gov:itis_tsn:202385", "lsid")
 }
 }
-
diff --git a/man/itis_hierarchy.Rd b/man/itis_hierarchy.Rd
index 0d63a44..95d8eaf 100644
--- a/man/itis_hierarchy.Rd
+++ b/man/itis_hierarchy.Rd
@@ -41,4 +41,3 @@ itis_hierarchy(tsn=c(180543,41074,36616))
 \seealso{
 \code{\link{itis_downstream}}
 }
-
diff --git a/man/itis_kingdomnames.Rd b/man/itis_kingdomnames.Rd
index 882012c..df21d15 100644
--- a/man/itis_kingdomnames.Rd
+++ b/man/itis_kingdomnames.Rd
@@ -20,4 +20,3 @@ itis_kingdomnames(202385)
 itis_kingdomnames(tsn=c(202385,183833,180543))
 }
 }
-
diff --git a/man/itis_lsid.Rd b/man/itis_lsid.Rd
index 4418510..73bab3c 100644
--- a/man/itis_lsid.Rd
+++ b/man/itis_lsid.Rd
@@ -33,4 +33,3 @@ itis_lsid("urn:lsid:itis.gov:itis_tsn:180543", "fullrecord")
 itis_lsid(202385)
 }
 }
-
diff --git a/man/itis_name-deprecated.Rd b/man/itis_name-deprecated.Rd
index 7641fea..b878e9c 100644
--- a/man/itis_name-deprecated.Rd
+++ b/man/itis_name-deprecated.Rd
@@ -22,4 +22,3 @@ Get taxonomic names for a given taxonomic name query.
 itis_name(query="Helianthus annuus", get="family")
 }
 }
-
diff --git a/man/itis_native.Rd b/man/itis_native.Rd
index bd9358b..caacfb0 100644
--- a/man/itis_native.Rd
+++ b/man/itis_native.Rd
@@ -32,4 +32,3 @@ itis_native(tsn=180543)
 itis_native(tsn=c(180543,41074,36616))
 }
 }
-
diff --git a/man/itis_refs.Rd b/man/itis_refs.Rd
index d802904..878936b 100644
--- a/man/itis_refs.Rd
+++ b/man/itis_refs.Rd
@@ -20,4 +20,3 @@ itis_refs(202385)
 itis_refs(c(202385, 70340))
 }
 }
-
diff --git a/man/itis_taxrank.Rd b/man/itis_taxrank.Rd
index 01619a8..469ebae 100644
--- a/man/itis_taxrank.Rd
+++ b/man/itis_taxrank.Rd
@@ -36,4 +36,3 @@ itis_taxrank(query=202385)
 itis_taxrank(query=c(202385,183833,180543))
 }
 }
-
diff --git a/man/itis_terms.Rd b/man/itis_terms.Rd
index 4d25ce2..3967b8a 100644
--- a/man/itis_terms.Rd
+++ b/man/itis_terms.Rd
@@ -29,4 +29,3 @@ itis_terms(query='tarweed', "common")
 itis_terms(query='Poa annua', "scientific")
 }
 }
-
diff --git a/man/iucn_getname.Rd b/man/iucn_getname.Rd
index b5afde3..775db6a 100644
--- a/man/iucn_getname.Rd
+++ b/man/iucn_getname.Rd
@@ -30,16 +30,14 @@ make sure that the data you get back is correct.
 \dontrun{
 iucn_getname(name = "Cyanistes caeruleus")
 iucn_getname(name = "Panthera uncia")
-iucn_getname(name = "Abies")
 
 # not found in global names
 # iucn_getname(name = "Abronia pinsapo")
 
 # not found in IUCN search
-# iucn_getname(name = "Acacia allenii")
+iucn_getname(name = "Acacia allenii")
 }
 }
 \seealso{
 \code{\link{iucn_summary}} \code{\link{iucn_status}}
 }
-
diff --git a/man/iucn_id.Rd b/man/iucn_id.Rd
index 3777f7a..1c81e76 100644
--- a/man/iucn_id.Rd
+++ b/man/iucn_id.Rd
@@ -4,13 +4,17 @@
 \alias{iucn_id}
 \title{Get an ID for a IUCN listed taxon}
 \usage{
-iucn_id(sciname, ...)
+iucn_id(sciname, key = NULL, ...)
 }
 \arguments{
 \item{sciname}{character; Scientific name. Should be cleand and in the
 format \emph{<Genus> <Species>}. One or more.}
 
-\item{...}{Curl options passed on to \code{\link[httr]{GET}}}
+\item{key}{(character) required. you IUCN Redlist API key. See
+\code{\link[rredlist]{rredlist-package}} for help on authenticating with
+IUCN Redlist}
+
+\item{...}{Curl options passed on to \code{crul::HttpClient}}
 }
 \value{
 A named list (names are input taxa names) of one or more IUCN IDs.
@@ -39,4 +43,3 @@ iucn_id("Foo bar")
 \author{
 Scott Chamberlain, \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/iucn_status.Rd b/man/iucn_status.Rd
index a02d451..aa23780 100644
--- a/man/iucn_status.Rd
+++ b/man/iucn_status.Rd
@@ -25,4 +25,3 @@ iucn_status(ia)}
 \seealso{
 \code{\link[taxize]{iucn_summary}}
 }
-
diff --git a/man/iucn_summary.Rd b/man/iucn_summary.Rd
index cade7df..16dbcab 100755
--- a/man/iucn_summary.Rd
+++ b/man/iucn_summary.Rd
@@ -1,25 +1,19 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/iucn_summary.R
 \name{iucn_summary}
-\alias{iucn_status.iucn}
 \alias{iucn_summary}
 \alias{iucn_summary_id}
 \title{Get a summary from the IUCN Red List}
 \usage{
-iucn_summary(sciname, silent = TRUE, parallel = FALSE,
-  distr_detail = FALSE, key = NULL, ...)
+iucn_summary(x, parallel = FALSE, distr_detail = FALSE, key = NULL, ...)
 
 iucn_summary_id(species_id, silent = TRUE, parallel = FALSE,
   distr_detail = FALSE, ...)
-
-\method{iucn_status}{iucn}(x, ...)
 }
 \arguments{
-\item{sciname}{character; Scientific name. Should be cleaned and in the
+\item{x}{character; Scientific name. Should be cleaned and in the
 format \emph{<Genus> <Species>}.}
 
-\item{silent}{logical; Make errors silent or not (when species not found).}
-
 \item{parallel}{logical; Search in parallel to speed up search. You have to
 register a parallel backend if \code{TRUE}. See e.g., doMC, doSNOW, etc.}
 
@@ -35,8 +29,7 @@ Required for \code{iucn_summary} but not needed for \code{iucn_summary_id}. Defa
 
 \item{species_id}{an IUCN ID}
 
-\item{x}{an \code{iucn} object as returned by
-\code{\link[taxize]{iucn_summary}}.}
+\item{silent}{logical; Make errors silent or not (when species not found).}
 }
 \value{
 A list (for every species one entry) of lists with the following
@@ -55,6 +48,14 @@ We do our best to get you the correct data quickly, but sometimes IUCN gives
 back the wrong data, and sometimes Global Names gives back the wrong data.
 We will fix these as soon as possible. In the meantime, just make sure that
 the data you get back is correct.
+
+\code{iucn_summary} has a default method that errors when anything's
+passed in that's not \code{character} or \code{iucn} class - a
+\code{iucn_summary.character} method for when you pass in taxon names -
+and a \code{iucn_summary.iucn} method so you can pass in iucn class objects
+as output from \code{\link{get_iucn}} or \code{\link{as.iucn}}. If you
+already have IUCN IDs, coerce them to \code{iucn} class via
+\code{as.iucn(..., check = FALSE)}
 }
 \note{
 Not all entries (history, distr, trend) are available for every species
@@ -73,6 +74,7 @@ and pass it to the \code{key} parameter, or store in your \code{.Renviron} file
 the key in the function call but rather store it in one of those two files.
 This key will also set you up to use the \pkg{rredlist} package.
 }
+
 \examples{
 \dontrun{
 # if you send a taxon name, an IUCN API key is required
@@ -84,7 +86,7 @@ ia <- iucn_summary(c("Panthera uncia", "Lynx lynx"))
 ia <- iucn_summary(c("Panthera uncia", "Lynx lynx", "aaa"))
 
 ## get detailed distribution
-iac <- iucn_summary("Ara chloropterus", distr_detail = TRUE)
+iac <- iucn_summary(x="Ara chloropterus", distr_detail = TRUE)
 iac[[1]]$distr
 
 
@@ -96,6 +98,11 @@ iucn_status(ia)
 ia[['Lynx lynx']]$history
 ia[['Panthera uncia']]$distr
 ia[[2]]$trend
+## the outputs aren't quite identical, but we're working on it
+identical(
+  iucn_summary_id(c(22732, 12519)),
+  iucn_summary(as.iucn(c(22732, 12519)))
+)
 
 # using parallel, e.g., with doMC package, register cores first
 # library(doMC)
@@ -104,6 +111,9 @@ ia[[2]]$trend
 # (res <- iucn_summary(nms, parallel = TRUE))
 }
 }
+\seealso{
+\code{\link[taxize]{iucn_status}}
+}
 \author{
 Eduard Szoecs, \email{eduardszoecs at gmail.com}
 
@@ -111,7 +121,3 @@ Philippe Marchand, \email{marchand.philippe at gmail.com}
 
 Scott Chamberlain, \email{myrmecocystus at gmail.com}
 }
-\seealso{
-\code{\link[taxize]{iucn_status}}
-}
-
diff --git a/man/lowest_common.Rd b/man/lowest_common.Rd
index 1f1c18a..8552545 100644
--- a/man/lowest_common.Rd
+++ b/man/lowest_common.Rd
@@ -2,12 +2,12 @@
 % Please edit documentation in R/lowest_common.R
 \name{lowest_common}
 \alias{lowest_common}
-\alias{lowest_common.colid}
 \alias{lowest_common.default}
+\alias{lowest_common.uid}
+\alias{lowest_common.tsn}
 \alias{lowest_common.gbifid}
+\alias{lowest_common.colid}
 \alias{lowest_common.tolid}
-\alias{lowest_common.tsn}
-\alias{lowest_common.uid}
 \title{Retrieve the lowest common taxon and rank for a given taxon name or ID}
 \usage{
 lowest_common(...)
@@ -143,4 +143,3 @@ lowest_common(x = nms, db = "gbif")
 Jimmy O'Donnell \email{jodonnellbio at gmail.com}
 Scott Chamberlain \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/names_list.Rd b/man/names_list.Rd
index 2d0239a..8273aa0 100644
--- a/man/names_list.Rd
+++ b/man/names_list.Rd
@@ -34,4 +34,3 @@ names_list('genus', 500)
 \author{
 Scott Chamberlain \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/nbn_classification.Rd b/man/nbn_classification.Rd
index 74dce5f..a2f3551 100644
--- a/man/nbn_classification.Rd
+++ b/man/nbn_classification.Rd
@@ -2,31 +2,42 @@
 % Please edit documentation in R/nbn_classification.R
 \name{nbn_classification}
 \alias{nbn_classification}
-\title{Search UK National Biodiversity Network database for taxonomic classification}
+\title{Search UK National Biodiversity Network database for
+taxonomic classification}
 \usage{
 nbn_classification(id, ...)
 }
 \arguments{
-\item{id}{(character) An NBN idientifier.}
+\item{id}{(character) An NBN identifier.}
 
 \item{...}{Further args passed on to \code{\link[httr]{GET}}.}
 }
+\value{
+A data.frame
+}
 \description{
-Search UK National Biodiversity Network database for taxonomic classification
+Search UK National Biodiversity Network database for
+taxonomic classification
 }
 \examples{
 \dontrun{
-nbn_classification(id="NHMSYS0000502940")
+nbn_classification(id="NHMSYS0000376773")
 
 # get id first, then pass to this fxn
-id <- get_nbnid("blue tit", rec_only = TRUE, rank = "Species")
+id <- get_nbnid("Zootoca vivipara", rec_only = TRUE, rank = "Species")
 nbn_classification(id)
 
 library('httr')
 nbn_classification(id="NHMSYS0000502940", config=verbose())
 }
 }
+\references{
+<https://api.nbnatlas.org/>
+}
+\seealso{
+Other nbn: \code{\link{get_nbnid}},
+  \code{\link{nbn_search}}, \code{\link{nbn_synonyms}}
+}
 \author{
 Scott Chamberlain, \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/nbn_search.Rd b/man/nbn_search.Rd
index df59e2d..8a72838 100644
--- a/man/nbn_search.Rd
+++ b/man/nbn_search.Rd
@@ -2,48 +2,63 @@
 % Please edit documentation in R/nbn_search.R
 \name{nbn_search}
 \alias{nbn_search}
-\title{Search UK National Biodiversity Network database}
+\title{Search UK National Biodiversity Network}
 \usage{
-nbn_search(q, prefered = FALSE, order = "asc", sort = NULL, start = 0,
-  rows = 25, taxonOutputGroupKey = NULL, all = FALSE, ...)
+nbn_search(q, fq = NULL, order = NULL, sort = NULL, start = 0,
+  rows = 25, facets = NULL, ...)
 }
 \arguments{
 \item{q}{(character) The query terms(s)}
 
-\item{prefered}{(logical) Restrict search to preferred or any}
+\item{fq}{(character) Filters to be applied to the original query. These
+are additional params of the form fq=INDEXEDFIELD:VALUE e.g.
+fq=rank:kingdom. See <https://species-ws.nbnatlas.org/indexFields> for all
+the fields that are queryable.}
 
-\item{order}{(character) The order in which we should sort the results. Default: asc}
+\item{order}{(character) Supports "asc" or "desc"}
 
-\item{sort}{(character) Sort the results or not.}
+\item{sort}{(character) The indexed field to sort by}
 
-\item{start}{(integer/numeric) The page that the user wants to start displaying the results at.
-Default: 0}
+\item{start}{(integer) Record offset, to enable paging}
 
-\item{rows}{(integer/numeric) The number of rows to show in each page of search results.
-Default: 25}
+\item{rows}{(integer) Number of records to return}
 
-\item{taxonOutputGroupKey}{(character) Vector of taxon output groups.}
-
-\item{all}{(logical) Get all results, overrides rows parameter if TRUE. Default: FALSE}
+\item{facets}{(list) Comma separated list of the fields to create facets
+on e.g. facets=basis_of_record.}
 
 \item{...}{Further args passed on to \code{\link[httr]{GET}}.}
 }
+\value{
+a list with slots for metadata (`meta`) with list of response
+attributes, and data (`data``) with a data.frame of results
+}
 \description{
-Search UK National Biodiversity Network database
+Search UK National Biodiversity Network
 }
 \examples{
 \dontrun{
-nbn_search(q = "blackbird")
+x <- nbn_search(q = "Vulpes")
+x$meta$totalRecords
+x$meta$pageSize
+x$meta$urlParameters
+x$meta$queryTitle
+head(x$data)
+
 nbn_search(q = "blackbird", start = 4)
-nbn_search(q = "blackbird", all = TRUE)
-nbn_search(q = "blackbird", taxonOutputGroupKey = "NHMSYS0000080039")
 
 # debug curl stuff
 library('httr')
 nbn_search(q = "blackbird", config = verbose())
 }
 }
+\references{
+<https://api.nbnatlas.org/>
+}
+\seealso{
+Other nbn: \code{\link{get_nbnid}},
+  \code{\link{nbn_classification}},
+  \code{\link{nbn_synonyms}}
+}
 \author{
 Scott Chamberlain, \email{myrmecocystus at gmail.com}
 }
-
diff --git a/man/nbn_synonyms.Rd b/man/nbn_synonyms.Rd
index bcacdcd..96572ca 100644
--- a/man/nbn_synonyms.Rd
+++ b/man/nbn_synonyms.Rd
@@ -19,9 +19,18 @@ Return all synonyms for a taxon name with a given id from NBN
 }
 \examples{
 \dontrun{
-nbn_synonyms(id = 'NHMSYS0000502940')
 nbn_synonyms(id = 'NHMSYS0001501147')
 nbn_synonyms(id = 'NHMSYS0000456036')
+
+# none
+nbn_synonyms(id = 'NHMSYS0000502940')
 }
 }
-
+\references{
+<https://api.nbnatlas.org/>
+}
+\seealso{
+Other nbn: \code{\link{get_nbnid}},
+  \code{\link{nbn_classification}},
+  \code{\link{nbn_search}}
+}
diff --git a/man/ncbi_children.Rd b/man/ncbi_children.Rd
index 6ed8fc9..4983555 100644
--- a/man/ncbi_children.Rd
+++ b/man/ncbi_children.Rd
@@ -60,10 +60,9 @@ library("httr")
 ncbi_children(name="Satyrium", ancestor="Eumaeini", config=verbose())
 }
 }
-\author{
-Zachary Foster \email{zacharyfoster1989 at gmail.com}
-}
 \seealso{
 \code{\link{ncbi_get_taxon_summary}}, \code{\link[taxize]{children}}
 }
-
+\author{
+Zachary Foster \email{zacharyfoster1989 at gmail.com}
+}
diff --git a/man/ncbi_downstream.Rd b/man/ncbi_downstream.Rd
new file mode 100644
index 0000000..f488f5c
--- /dev/null
+++ b/man/ncbi_downstream.Rd
@@ -0,0 +1,57 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/ncbi_downstream.R
+\name{ncbi_downstream}
+\alias{ncbi_downstream}
+\title{Retrieve all taxa names downstream in hierarchy for NCBI}
+\usage{
+ncbi_downstream(id, downto, intermediate = FALSE, ...)
+}
+\arguments{
+\item{id}{(numeric/integer) An NCBI taxonomic identifier}
+
+\item{downto}{The taxonomic level you want to go down to. See examples below.
+The taxonomic level IS case sensitive, and you do have to spell it
+correctly. See \code{data(rank_ref)} for spelling.}
+
+\item{intermediate}{(logical) If \code{TRUE}, return a list of length two
+with target taxon rank names, with additional list of data.frame's of
+intermediate taxonomic groups. Default: \code{FALSE}}
+
+\item{...}{Further args passed on to \code{\link{ncbi_children}}}
+}
+\value{
+Data.frame of taxonomic information downstream to family from e.g.,
+		Order, Class, etc., or if \code{intermediate=TRUE}, list of length two,
+  	with target taxon rank names, and intermediate names.
+}
+\description{
+Retrieve all taxa names downstream in hierarchy for NCBI
+}
+\section{No Rank}{
+
+A sticky point with NCBI is that they can have designation for taxonomic
+rank of "No Rank". So we have no way of programatically knowing what to
+do with that taxon. Of course one can manually look at a name and perhaps
+know what it is, or look it up on the web - but we can't do anything
+programatically. So, no rank things will sometimes be missing.
+}
+
+\examples{
+\dontrun{
+## genus Apis
+ncbi_downstream(id = 7459, downto="species")
+
+## get intermediate taxa as a separate object
+ncbi_downstream(id = 7459, downto="species", intermediate = TRUE)
+
+## Lepidoptera
+ncbi_downstream(id = 7088, downto="superfamily")
+
+## families in the ferns (Moniliformopses)
+(id <- get_uid("Moniliformopses"))
+ncbi_downstream(id = id, downto = "order")
+}
+}
+\author{
+Scott Chamberlain \email{myrmecocystus at gmail.com}
+}
diff --git a/man/ncbi_get_taxon_summary.Rd b/man/ncbi_get_taxon_summary.Rd
index c2ac6e2..f6fdee0 100644
--- a/man/ncbi_get_taxon_summary.Rd
+++ b/man/ncbi_get_taxon_summary.Rd
@@ -41,4 +41,3 @@ ncbi_get_taxon_summary(c(1430660, 4751), config = verbose())
 \author{
 Zachary Foster \email{zacharyfoster1989 at Sgmail.com}
 }
-
diff --git a/man/ncbi_getbyid-defunct.Rd b/man/ncbi_getbyid-defunct.Rd
index 9e2a57e..446c54b 100644
--- a/man/ncbi_getbyid-defunct.Rd
+++ b/man/ncbi_getbyid-defunct.Rd
@@ -13,4 +13,3 @@ THIS FUNCTION IS DEFUNCT.
 Scott Chamberlain \email{myrmecocystus at gmail.com}
 }
 \keyword{internal}
-
diff --git a/man/ncbi_getbyname-defunct.Rd b/man/ncbi_getbyname-defunct.Rd
index 103d261..db2f582 100644
--- a/man/ncbi_getbyname-defunct.Rd
+++ b/man/ncbi_getbyname-defunct.Rd
@@ -13,4 +13,3 @@ THIS FUNCTION IS DEFUNCT.
 Scott Chamberlain \email{myrmecocystus at gmail.com}
 }
 \keyword{internal}
-
diff --git a/man/ncbi_search-defunct.Rd b/man/ncbi_search-defunct.Rd
index cb60fdd..d6ca6fd 100644
--- a/man/ncbi_search-defunct.Rd
+++ b/man/ncbi_search-defunct.Rd
@@ -10,4 +10,3 @@ ncbi_search(...)
 THIS FUNCTION IS DEFUNCT.
 }
 \keyword{internal}
-
diff --git a/man/phylomatic_format-defunct.Rd b/man/phylomatic_format-defunct.Rd
index 7bdc1f9..4792964 100644
--- a/man/phylomatic_format-defunct.Rd
+++ b/man/phylomatic_format-defunct.Rd
@@ -13,4 +13,3 @@ phylomatic_format(...)
 \description{
 THIS FUNCTION IS DEFUNCT.
 }
-
diff --git a/man/phylomatic_tree-defunct.Rd b/man/phylomatic_tree-defunct.Rd
index 706d6c9..d995ece 100644
--- a/man/phylomatic_tree-defunct.Rd
+++ b/man/phylomatic_tree-defunct.Rd
@@ -12,4 +12,3 @@ phylomatic_tree(...)
 \description{
 THIS FUNCTION IS DEFUNCT.
 }
-
diff --git a/man/ping.Rd b/man/ping.Rd
index 1efb867..8ace59d 100644
--- a/man/ping.Rd
+++ b/man/ping.Rd
@@ -1,18 +1,18 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/ping.R
 \name{ping}
-\alias{bold_ping}
+\alias{ping}
 \alias{col_ping}
 \alias{eol_ping}
-\alias{fg_ping}
-\alias{gbif_ping}
-\alias{ipni_ping}
 \alias{itis_ping}
-\alias{nbn_ping}
 \alias{ncbi_ping}
-\alias{ping}
 \alias{tropicos_ping}
+\alias{nbn_ping}
+\alias{gbif_ping}
+\alias{bold_ping}
+\alias{ipni_ping}
 \alias{vascan_ping}
+\alias{fg_ping}
 \title{Ping an API used in taxize to see if it's working.}
 \usage{
 col_ping(what = "status", ...)
@@ -91,4 +91,3 @@ vascan_ping(config=verbose())
 eol_ping(500, config=verbose())
 }
 }
-
diff --git a/man/plantGenusNames.Rd b/man/plantGenusNames.Rd
index aafb682..e6ad2aa 100644
--- a/man/plantGenusNames.Rd
+++ b/man/plantGenusNames.Rd
@@ -14,4 +14,3 @@ randomly chosen subset of genera names for the purpose of having some
 names to play with for examples in this package.
 }
 \keyword{data}
-
diff --git a/man/plantNames.Rd b/man/plantNames.Rd
index c591fc3..41be2e4 100644
--- a/man/plantNames.Rd
+++ b/man/plantNames.Rd
@@ -15,4 +15,3 @@ for the purpose of having some names to play with for examples in
 this package.
 }
 \keyword{data}
-
diff --git a/man/plantminer.Rd b/man/plantminer.Rd
index 16dd578..9819004 100644
--- a/man/plantminer.Rd
+++ b/man/plantminer.Rd
@@ -10,7 +10,7 @@ plantminer(plants, from = "tpl", key = NULL, verbose = TRUE)
 \item{plants}{(character) Vector of plant species names. Required.}
 
 \item{from}{(character) One of tpl (for theplantlist.com data), or
-flora (for Brazilian Flora Checklist). Required. Deafult: \code{tpl}}
+flora (for Brazilian Flora Checklist). Required. Default: \code{tpl}}
 
 \item{key}{(character) Your api key for the plantminer.com site.  Go to
 http://www.plantminer.com/ to get your api key.  Two options for
@@ -19,7 +19,7 @@ the second argument, or 2) you can put the key in your .Rprofile file,
 which will then be loaded when you start R. See
 http://bit.ly/135eG0b for help on how to put api keys in your .Rprofile file.}
 
-\item{verbose}{(logical) Verbose or not. Deafult: \code{TRUE}}
+\item{verbose}{(logical) Verbose or not. Default: \code{TRUE}}
 }
 \value{
 data.frame of results.
@@ -42,4 +42,3 @@ plantminer(plants)
 plantminer("Ocotea pulchella", from = "flora")
 }
 }
-
diff --git a/man/rank_ref.Rd b/man/rank_ref.Rd
index 4f0c28c..a4283a8 100644
--- a/man/rank_ref.Rd
+++ b/man/rank_ref.Rd
@@ -5,7 +5,20 @@
 \alias{rank_ref}
 \title{Lookup-table for IDs of taxonomic ranks}
 \description{
-Lookup-table for IDs of taxonomic ranks
+data.frame of 36 rows, with 2 columns:
+\itemize{
+ \item rankid - a numeric rank id, consecutive
+ \item ranks - a comma separated vector of names that are considered
+ equal to one another within the row
 }
-\keyword{data}
+}
+\details{
+We use this data.frame to do data sorting/filtering based on the ordering
+of ranks.
+
+Please let us know if there is a rank that occurs from one of the data
+sources \pkg{taxize} that we don't have in \code{rank_ref} dataset.
 
+Also let us know if you disagree with the ordering of ranks.
+}
+\keyword{data}
diff --git a/man/rankagg.Rd b/man/rankagg.Rd
index 80b47ca..ad905aa 100644
--- a/man/rankagg.Rd
+++ b/man/rankagg.Rd
@@ -31,4 +31,3 @@ rankagg(data=dat, "abundance", rank="Genus", fxn="mean")
 rankagg(data=dat, "abundance", rank="Subclass")
 rankagg(data=dat, "abundance", rank="Subclass", fxn="sd")
 }
-
diff --git a/man/resolve.Rd b/man/resolve.Rd
index d5d36f9..b24f5c3 100644
--- a/man/resolve.Rd
+++ b/man/resolve.Rd
@@ -57,4 +57,3 @@ resolve(query="Qercuss", db = "iplant", config=verbose())
 res <- resolve(query=c("Helianthus annuus", "Homo sapiens"), config=progress())
 }
 }
-
diff --git a/man/sci2comm.Rd b/man/sci2comm.Rd
index ea39ae6..0b1a4ce 100644
--- a/man/sci2comm.Rd
+++ b/man/sci2comm.Rd
@@ -3,9 +3,10 @@
 \name{sci2comm}
 \alias{sci2comm}
 \alias{sci2comm.default}
-\alias{sci2comm.tsn}
 \alias{sci2comm.uid}
+\alias{sci2comm.tsn}
 \alias{sci2comm.wormsid}
+\alias{sci2comm.iucn}
 \title{Get common names from scientific names.}
 \usage{
 sci2comm(...)
@@ -17,6 +18,8 @@ sci2comm(...)
 \method{sci2comm}{tsn}(id, simplify = TRUE, ...)
 
 \method{sci2comm}{wormsid}(id, simplify = TRUE, ...)
+
+\method{sci2comm}{iucn}(id, simplify = TRUE, ...)
 }
 \arguments{
 \item{...}{Further arguments passed on to functions
@@ -25,14 +28,15 @@ sci2comm(...)
 \item{scinames}{character; One or more scientific names or partial names.}
 
 \item{db}{character; Data source, one of \emph{"eol"} (default),
-\emph{"itis"} \emph{"ncbi"}, \emph{"worms"}. Note that each taxonomic data
-source has their own identifiers,  so that if you provide the wrong
-\code{db} value for the identifier you could get a result, but it will
-likely be wrong (not what you were expecting).}
+\emph{"itis"} \emph{"ncbi"}, \emph{"worms"}, or \emph{"iucn"}. Note that
+each taxonomic data source has their own identifiers,  so that if you
+provide the wrong \code{db} value for the identifier you could get a
+result, but it will likely be wrong (not what you were expecting).}
 
 \item{simplify}{(logical) If TRUE, simplify output to a vector of names.
 If FALSE, return variable formats from different sources, usually a
-data.frame. Only applies to eol and itis.}
+data.frame. Only applies to eol and itis. Specify \code{FALSE} to obtain
+the language of each vernacular in the output for eol and itis.}
 
 \item{id}{character; identifiers, as returned by
 \code{\link[taxize]{get_tsn}}, \code{\link[taxize]{get_uid}}.}
@@ -51,6 +55,10 @@ also store your EOL API key in your .Rprofile file as
 \code{options(eolApiKey = "<your eol api key>")}, or just for the current
 session by running \code{options(eolApiKey = "<your eol api key>")} in
 the console.
+
+Note that IUCN also requires an API key. See
+\code{\link[rredlist]{rredlist-package}} for help on authentiating with
+IUCN Redlist
 }
 \examples{
 \dontrun{
@@ -60,26 +68,26 @@ sci2comm(scinames=c('Helianthus annuus', 'Poa annua'))
 sci2comm(scinames='Puma concolor', db='ncbi')
 sci2comm('Gadus morhua', db='worms')
 sci2comm('Pomatomus saltatrix', db='worms')
+sci2comm('Loxodonta africana', db='iucn')
 
 # Passing id in, works for sources: itis and ncbi, not eol
 sci2comm(get_tsn('Helianthus annuus'))
 sci2comm(get_uid('Helianthus annuus'))
 sci2comm(get_wormsid('Gadus morhua'))
+sci2comm(get_iucn('Loxodonta africana'))
 
 # Don't simplify returned
 sci2comm(get_tsn('Helianthus annuus'), simplify=FALSE)
+sci2comm(get_iucn('Loxodonta africana'), simplify=FALSE)
 
 # Use curl options
 library("httr")
-sci2comm(scinames='Helianthus annuus', config=verbose())
-sci2comm('Helianthus annuus', db="itis", config=verbose())
 sci2comm('Helianthus annuus', db="ncbi", config=verbose())
 }
 }
-\author{
-Scott Chamberlain (myrmecocystus at gmail.com)
-}
 \seealso{
 \code{\link[taxize]{comm2sci}}
 }
-
+\author{
+Scott Chamberlain (myrmecocystus at gmail.com)
+}
diff --git a/man/scrapenames.Rd b/man/scrapenames.Rd
index c884e14..2ed6618 100644
--- a/man/scrapenames.Rd
+++ b/man/scrapenames.Rd
@@ -6,14 +6,15 @@
 \usage{
 scrapenames(url = NULL, file = NULL, text = NULL, engine = NULL,
   unique = NULL, verbatim = NULL, detect_language = NULL,
-  all_data_sources = NULL, data_source_ids = NULL, ...)
+  all_data_sources = NULL, data_source_ids = NULL, return_content = FALSE,
+  ...)
 }
 \arguments{
 \item{url}{An encoded URL for a web page, PDF, Microsoft Office document, or
 image file, see examples}
 
-\item{file}{When using multipart/form-data as the content-type, a file may be sent.
-This should be a path to your file on your machine.}
+\item{file}{When using multipart/form-data as the content-type, a file may
+be sent. This should be a path to your file on your machine.}
 
 \item{text}{Type: string. Text content; best used with a POST request, see
 examples}
@@ -21,34 +22,38 @@ examples}
 \item{engine}{(optional) (integer) Default: 0. Either 1 for TaxonFinder,
 2 for NetiNeti, or 0 for both. If absent, both engines are used.}
 
-\item{unique}{(optional) (logical) If \code{TRUE} (default), response has unique
-names without offsets.}
+\item{unique}{(optional) (logical) If \code{TRUE} (default), response has
+unique names without offsets.}
 
-\item{verbatim}{(optional) Type: boolean, If \code{TRUE} (default to \code{FALSE}),
-response excludes verbatim strings.}
+\item{verbatim}{(optional) Type: boolean, If \code{TRUE} (default to
+\code{FALSE}), response excludes verbatim strings.}
 
-\item{detect_language}{(optional) Type: boolean, When \code{TRUE} (default), NetiNeti
-is not used if the language of incoming text is determined not to be English. When
-\code{FALSE}, NetiNeti will be used if requested.}
+\item{detect_language}{(optional) Type: boolean, When \code{TRUE} (default),
+NetiNeti is not used if the language of incoming text is determined not to
+be English. When \code{FALSE}, NetiNeti will be used if requested.}
 
-\item{all_data_sources}{(optional) Type: boolean. Resolve found names against all available
-Data Sources.}
+\item{all_data_sources}{(optional) Type: boolean. Resolve found names
+against all available Data Sources.}
 
-\item{data_source_ids}{(optional) Type: string. Pipe separated list of data source ids to
-resolve found names against. See list of Data Sources
+\item{data_source_ids}{(optional) Type: string. Pipe separated list of
+data source ids to resolve found names against. See list of Data Sources
 \url{http://resolver.globalnames.org/data_sources}.}
 
+\item{return_content}{(logical) return OCR'ed text. returns text
+string in \code{x$meta$content} slot. Default: \code{FALSE}}
+
 \item{...}{Further args passed to \code{\link[httr]{GET}}}
 }
 \value{
-A list of length two, first is metadata, second is the data as a data.frame.
+A list of length two, first is metadata, second is the data as a
+data.frame.
 }
 \description{
 Uses the Global Names Recognition and Discovery service, see
 \url{http://gnrd.globalnames.org/}.
 
-Note: this function somestimes gives data back and sometimes not. The API that this
-function is extremely buggy.
+Note: this function sometimes gives data back and sometimes not. The API
+that this function is extremely buggy.
 }
 \details{
 One of url, file, or text must be specified - and only one of them.
@@ -56,11 +61,11 @@ One of url, file, or text must be specified - and only one of them.
 \examples{
 \dontrun{
 # Get data from a website using its URL
-scrapenames(url = 'http://en.wikipedia.org/wiki/Araneae')
-scrapenames(url = 'http://en.wikipedia.org/wiki/Animalia')
-scrapenames(url = 'http://www.plosone.org/article/info\%3Adoi\%2F10.1371\%2Fjournal.pone.0095068')
-scrapenames(url = 'http://www.plosone.org/article/info\%3Adoi\%2F10.1371\%2Fjournal.pone.0080498')
-scrapenames(url = 'http://ucjeps.berkeley.edu/cgi-bin/get_JM_treatment.pl?CARYOPHYLLACEAE')
+scrapenames('http://en.wikipedia.org/wiki/Araneae')
+scrapenames('http://en.wikipedia.org/wiki/Animalia')
+scrapenames('http://www.plosone.org/article/info\%3Adoi\%2F10.1371\%2Fjournal.pone.0095068')
+scrapenames('http://www.plosone.org/article/info\%3Adoi\%2F10.1371\%2Fjournal.pone.0080498')
+scrapenames('http://ucjeps.berkeley.edu/cgi-bin/get_JM_treatment.pl?CARYOPHYLLACEAE')
 
 # Scrape names from a pdf at a URL
 url <- 'http://www.plosone.org/article/fetchObject.action?uri=
@@ -68,8 +73,10 @@ info\%3Adoi\%2F10.1371\%2Fjournal.pone.0058268&representation=PDF'
 scrapenames(url = sub('\\n', '', url))
 
 # With arguments
-scrapenames(url = 'http://www.mapress.com/zootaxa/2012/f/z03372p265f.pdf', unique=TRUE)
-scrapenames(url = 'http://en.wikipedia.org/wiki/Araneae', data_source_ids=c(1, 169))
+scrapenames(url = 'http://www.mapress.com/zootaxa/2012/f/z03372p265f.pdf',
+  unique=TRUE)
+scrapenames(url = 'http://en.wikipedia.org/wiki/Araneae',
+  data_source_ids=c(1, 169))
 
 # Get data from a file
 speciesfile <- system.file("examples", "species.txt", package = "taxize")
@@ -83,12 +90,15 @@ scrapenames(file = file)
 # Get data from text string
 scrapenames(text='A spider named Pardosa moesta Banks, 1892')
 
+# return OCR content
+scrapenames(url='http://www.mapress.com/zootaxa/2012/f/z03372p265f.pdf',
+  return_content = TRUE)
+
 # use curl options
 library("httr")
-scrapenames(text='A spider named Pardosa moesta Banks, 1892', config = verbose())
+scrapenames(text='A spider named Pardosa moesta Banks, 1892')
 }
 }
 \author{
 Scott Chamberlain {myrmecocystus at gmail.com}
 }
-
diff --git a/man/status_codes.Rd b/man/status_codes.Rd
index 1d3fbf4..4ef46e5 100644
--- a/man/status_codes.Rd
+++ b/man/status_codes.Rd
@@ -15,4 +15,3 @@ status_codes()
 \seealso{
 \code{\link{ping}}
 }
-
diff --git a/man/synonyms.Rd b/man/synonyms.Rd
index ecb7b0b..384c156 100644
--- a/man/synonyms.Rd
+++ b/man/synonyms.Rd
@@ -2,20 +2,21 @@
 % Please edit documentation in R/synonyms.R
 \name{synonyms}
 \alias{synonyms}
-\alias{synonyms.colid}
 \alias{synonyms.default}
-\alias{synonyms.ids}
-\alias{synonyms.nbnid}
-\alias{synonyms.tpsid}
 \alias{synonyms.tsn}
+\alias{synonyms.colid}
+\alias{synonyms.tpsid}
+\alias{synonyms.nbnid}
 \alias{synonyms.wormsid}
+\alias{synonyms.iucn}
+\alias{synonyms.ids}
 \alias{synonyms_df}
 \title{Retrieve synonyms from various sources given input taxonomic
 names or identifiers}
 \usage{
 synonyms(...)
 
-\method{synonyms}{default}(x, db = NULL, rows = NaN, ...)
+\method{synonyms}{default}(x, db = NULL, rows = NA, ...)
 
 \method{synonyms}{tsn}(id, ...)
 
@@ -27,6 +28,8 @@ synonyms(...)
 
 \method{synonyms}{wormsid}(id, ...)
 
+\method{synonyms}{iucn}(id, ...)
+
 \method{synonyms}{ids}(id, ...)
 
 synonyms_df(x)
@@ -66,6 +69,10 @@ you must specify the type of ID.
 For \code{db = "itis"} you can pass in a parameter \code{accepted} to
 toggle whether only accepted names are used \code{accepted = TRUE}, or if
 all are used \code{accepted = FALSE}. The default is \code{accepted = FALSE}
+
+Note that IUCN requires an API key. See
+\code{\link[rredlist]{rredlist-package}} for help on authentiating with
+IUCN Redlist
 }
 \examples{
 \dontrun{
@@ -73,8 +80,9 @@ all are used \code{accepted = FALSE}. The default is \code{accepted = FALSE}
 synonyms(183327, db="itis")
 synonyms("25509881", db="tropicos")
 synonyms("NBNSYS0000004629", db='nbn')
-synonyms("87e986b0873f648711900866fa8abde7", db='col')
+# synonyms("87e986b0873f648711900866fa8abde7", db='col') # FIXME
 synonyms(105706, db='worms')
+synonyms(12392, db='iucn')
 
 # Plug in taxon names directly
 synonyms("Pinus contorta", db="itis")
@@ -101,6 +109,7 @@ synonyms(get_tsn("Poa annua"))
 synonyms(get_tpsid("Poa annua"))
 synonyms(get_nbnid("Carcharodon carcharias"))
 synonyms(get_colid("Ornithodoros lagophilus"))
+synonyms(get_iucn('Loxodonta africana'))
 
 # Pass many ids from class "ids"
 out <- get_ids(names="Poa annua", db = c('itis','tropicos'))
@@ -140,6 +149,5 @@ synonyms_df(x)
 \seealso{
 \code{\link[taxize]{get_tsn}}, \code{\link[taxize]{get_tpsid}},
 \code{\link[taxize]{get_nbnid}}, \code{\link[taxize]{get_colid}},
-\code{\link[taxize]{get_wormsid}}
+\code{\link[taxize]{get_wormsid}}, \code{\link[taxize]{get_iucn}}
 }
-
diff --git a/man/tax_agg.Rd b/man/tax_agg.Rd
index 8f58c45..918be7a 100644
--- a/man/tax_agg.Rd
+++ b/man/tax_agg.Rd
@@ -1,8 +1,8 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/tax_agg.R
 \name{tax_agg}
-\alias{print.tax_agg}
 \alias{tax_agg}
+\alias{print.tax_agg}
 \title{Aggregate species data to given taxonomic rank}
 \usage{
 tax_agg(x, rank, db = "ncbi", verbose = FALSE, ...)
@@ -20,7 +20,7 @@ their own identifiers, so that if you provide the wrong \code{db} value
 for the identifier you could get a result, but it will likely be wrong (not
 what you were expecting).}
 
-\item{verbose}{(loigical) If FALSE (Default) suppresss messages}
+\item{verbose}{(logical) If FALSE (Default) suppress messages}
 
 \item{...}{Other arguments passed to \code{\link[taxize]{get_tsn}} or \code{\link[taxize]{get_uid}}.}
 }
@@ -83,4 +83,3 @@ tax_agg(mat, rank = 'family', db='itis')
 \seealso{
 \code{\link[taxize]{tax_name}}
 }
-
diff --git a/man/tax_name.Rd b/man/tax_name.Rd
index 2b0b1c9..ace13cc 100644
--- a/man/tax_name.Rd
+++ b/man/tax_name.Rd
@@ -19,8 +19,8 @@ both.}
 \item{pref}{(character) If db = 'both', sets the preference for the union.
 Either 'ncbi' (default) or 'itis'. Currently not implemented.}
 
-\item{verbose}{(logical) If \code{TRUE} the actual taxon queried is printed on the
-console.}
+\item{verbose}{(logical) If \code{TRUE} the actual taxon queried is printed
+on the console.}
 
 \item{...}{Other arguments passed to \code{\link{get_tsn}} or
 \code{\link{get_uid}}.}
@@ -35,14 +35,15 @@ Get taxonomic names for a given rank
 \note{
 While \code{\link{tax_rank}} returns the actual rank of a
 taxon, \code{\link{tax_name}} searches and returns any specified rank
-higher in taxonmy.
+higher in taxonomy.
 }
 \examples{
 \dontrun{
 # A case where itis and ncbi use the same names
 tax_name(query = "Helianthus annuus", get = "family", db = "itis")
 tax_name(query = "Helianthus annuus", get = "family", db = "ncbi")
-tax_name(query = "Helianthus annuus", get = c("genus","family","order"), db = "ncbi")
+tax_name(query = "Helianthus annuus", get = c("genus","family","order"),
+  db = "ncbi")
 
 # Case where itis and ncbi use different names
 tax_name(query = "Helianthus annuus", get = "kingdom", db = "itis")
@@ -62,4 +63,3 @@ tax_name(query=c("Helianthus annuus", 'Baetis rhodani'), get=c("genus",
 \seealso{
 \code{\link{classification}}
 }
-
diff --git a/man/tax_rank.Rd b/man/tax_rank.Rd
index 58caf7b..26540c5 100644
--- a/man/tax_rank.Rd
+++ b/man/tax_rank.Rd
@@ -4,53 +4,53 @@
 \alias{tax_rank}
 \title{Get rank for a given taxonomic name.}
 \usage{
-tax_rank(query = NULL, db = "itis", pref = "ncbi", verbose = TRUE, ...)
+tax_rank(x, db = NULL, ...)
 }
 \arguments{
-\item{query}{character; Vector of taxonomic names to query.}
+\item{x}{(character) Vector of one or more taxon names (character) or
+IDs (character or numeric) to query. Or objects returned from
+\code{get_*()} functions like \code{\link{get_tsn}}}
 
-\item{db}{character; The database to search from: 'tis', 'ncbi' or 'both'.
-If 'both' both NCBI and ITIS will be queried. Result will be the union of
-both. Note that each taxonomic data source has their own identifiers, so
-that if you provide the wrong \code{db} value for the identifier you could
-get a result, but it will likely be wrong (not what you were expecting).}
+\item{db}{(character) database to query. either \code{ncbi}, \code{itis},
+\code{eol}, \code{col}, \code{tropicos}, \code{gbif}, \code{nbn},
+\code{worms}, \code{natserv}, \code{bold}. Note that each taxonomic data
+source has their own identifiers, so that if you provide the wrong
+\code{db} value for the identifier you may get a result, but it will
+likely be wrong (not what you were expecting).}
 
-\item{pref}{If db = 'both', sets the preference for the union. Either 'ncbi'
-or 'itis'.}
-
-\item{verbose}{logical; If TRUE the actual taxon queried is printed on the
-console.}
-
-\item{...}{Other arguments passed to \code{\link[taxize]{get_tsn}} or \code{\link[taxize]{get_uid}}.}
+\item{...}{Additional arguments to \code{\link{classification}}}
 }
 \value{
-A data.frame with one column for every queried taxon.
+A named list of character vectors with ranks (all lower-cased)
 }
 \description{
 Get rank for a given taxonomic name.
 }
 \note{
 While \code{\link[taxize]{tax_name}} returns the name of a specified
-rank,
-\code{\link[taxize]{tax_rank}} returns the actual rank of the taxon.
+rank, \code{\link[taxize]{tax_rank}} returns the actual rank of the taxon.
 }
 \examples{
 \dontrun{
-tax_rank(query = "Helianthus annuus", db = "itis")
-tax_rank(query = "Helianthus annuus", db = "ncbi")
-tax_rank(query = "Helianthus", db = "itis")
+tax_rank(x = "Helianthus annuus", db = "itis")
+tax_rank(get_tsn("Helianthus annuus"))
+tax_rank(c("Helianthus", "Pinus", "Poa"), db = "itis")
+
+tax_rank(get_boldid("Helianthus annuus"))
+tax_rank("421377", db = "bold")
+tax_rank(421377, db = "bold")
 
-# query both
-tax_rank(query=c("Helianthus annuus", 'Puma'), db="both")
+tax_rank(c("Plantae", "Helianthus annuus",
+  "Puma", "Homo sapiens"), db = 'itis')
+tax_rank(c("Helianthus annuus", "Quercus", "Fabaceae"), db = 'tropicos')
 
-# An alternative way would be to use classification() and sapply over
-# the list
-x <- 'Baetis'
-classi <- classification(get_uid(x))
-sapply(classi, function(x) x[nrow(x), 'rank'])
+tax_rank(names_list("species"), db = 'gbif')
+tax_rank(names_list("family"), db = 'gbif')
+
+tax_rank(c("Platanista gangetica", "Lichenopora neapolitana"),
+  db = "worms")
 }
 }
 \seealso{
 \code{\link[taxize]{classification}}, \code{\link[taxize]{tax_name}}
 }
-
diff --git a/man/taxize-defunct.Rd b/man/taxize-defunct.Rd
index 93e6e65..1c71f31 100644
--- a/man/taxize-defunct.Rd
+++ b/man/taxize-defunct.Rd
@@ -1,8 +1,8 @@
 % Generated by roxygen2: do not edit by hand
 % Please edit documentation in R/taxize-package.R
 \name{taxize-defunct}
-\alias{defunct}
 \alias{taxize-defunct}
+\alias{defunct}
 \title{Defunct functions in taxize}
 \description{
 The following functions are now defunct (no longer available):
@@ -42,4 +42,3 @@ The following functions are now defunct (no longer available):
  \code{phylomatic_names} in the package \pkg{brranching}
 }
 }
-
diff --git a/man/taxize-package.Rd b/man/taxize-package.Rd
index 3eaa0b8..8771438 100644
--- a/man/taxize-package.Rd
+++ b/man/taxize-package.Rd
@@ -2,8 +2,8 @@
 % Please edit documentation in R/taxize-package.R
 \docType{package}
 \name{taxize-package}
-\alias{taxize}
 \alias{taxize-package}
+\alias{taxize}
 \title{Taxonomic Information from Around the Web}
 \description{
 This package interacts with a suite of web 'APIs'
@@ -61,6 +61,7 @@ If the source above has a \code{TRUE} in the \code{SOAP?} column, it is not avai
 in this package. They are available from a different package called \strong{taxizesoap}.
 See the GitHub repo for how to install \url{https://github.com/ropensci/taxizesoap}
 }
+
 \author{
 Scott Chamberlain \email{myrmecocystus at gmail.com}
 
@@ -79,4 +80,3 @@ John Baumgartner \email{johnbb at student.unimelb.edu.au}
 James O'Donnell \email{jodonnellbio at gmail.com}
 }
 \keyword{package}
-
diff --git a/man/taxize_capwords.Rd b/man/taxize_capwords.Rd
index 2a69632..1a7c176 100644
--- a/man/taxize_capwords.Rd
+++ b/man/taxize_capwords.Rd
@@ -22,4 +22,3 @@ Capitalize the first letter of a character string.
 taxize_capwords(c("using AIC for model selection"))
 taxize_capwords(c("using AIC for model selection"), strict=TRUE)
 }
-
diff --git a/man/taxize_cite.Rd b/man/taxize_cite.Rd
index a887dc5..8fdb699 100644
--- a/man/taxize_cite.Rd
+++ b/man/taxize_cite.Rd
@@ -36,4 +36,3 @@ taxize_cite(fxn='taxize')
 # Get license information
 taxize_cite(fxn='taxize', "license")
 }
-
diff --git a/man/taxize_ldfast.Rd b/man/taxize_ldfast.Rd
index c0bd805..6187003 100644
--- a/man/taxize_ldfast.Rd
+++ b/man/taxize_ldfast.Rd
@@ -15,4 +15,3 @@ taxize_ldfast(x, convertvec = FALSE)
 Replacement function for ldply that should be faster in all cases.
 }
 \keyword{internal}
-
diff --git a/man/theplantlist.Rd b/man/theplantlist.Rd
index 21db80b..5fb8a45 100644
--- a/man/theplantlist.Rd
+++ b/man/theplantlist.Rd
@@ -20,4 +20,3 @@ version 1.1 of their data. This data is used in the function
 accepted species names in Theplantlist.
 }
 \keyword{data}
-
diff --git a/man/tnrs.Rd b/man/tnrs.Rd
index 6810a84..b514395 100644
--- a/man/tnrs.Rd
+++ b/man/tnrs.Rd
@@ -24,7 +24,7 @@ IMPORTANT!!!!! ->
     POST is the only option for this parameter if you want to
     use source or code parameters.}
 
-\item{sleep}{Numer of seconds by which to pause between calls. Defaults to 0
+\item{sleep}{Number of seconds by which to pause between calls. Defaults to 0
 seconds. Use when doing many calls in a for loop ar lapply type call.}
 
 \item{splitby}{Number by which to split species list for querying the TNRS.}
@@ -35,7 +35,9 @@ seconds. Use when doing many calls in a for loop ar lapply type call.}
 \code{\link[httr]{POST}}}
 }
 \value{
-data.frame of results from TNRS plus the name submitted.
+data.frame of results from TNRS plus the name submitted, with
+rows in order of user supplied names, though those with no matches are
+dropped
 }
 \description{
 Match taxonomic names using the Taxonomic Name Resolution
@@ -44,7 +46,18 @@ accepted or not.
 }
 \details{
 If there is no match in the Taxosaurus database, nothing is
-   returned, so you will not get anything back for non-matches.
+returned, so you will not get anything back for non-matches.
+
+TNRS doesn't provide any advice about the occurrence of homonyms when
+queries have no indication of a taxonomic name's authority. So if there
+is any chance of a homonym, you probably want to send the authority as
+well, or use \code{\link{gnr_resolve}}. For example,
+\code{tnrs(query="Jussiaea linearis", source="iPlant_TNRS")} gives result of
+\emph{Jussiaea linearis (Willd.) Oliv. ex Kuntze}, but there is a
+homonym. If you do
+\code{tnrs(query="Jussiaea linearis Hochst.", source="iPlant_TNRS")} you
+get a direct match for that name. So, beware that there's no indication
+of homonyms.
 }
 \examples{
 \dontrun{
@@ -73,4 +86,9 @@ mynames <- c("Helianthus annuus", "Poa annua", "Mimulus bicolor")
 tnrs(query = mynames, source = "iPlant_TNRS", config = verbose())
 }
 }
-
+\references{
+\url{http://taxosaurus.org/}
+}
+\seealso{
+\code{\link{gnr_resolve}}
+}
diff --git a/man/tnrs_sources.Rd b/man/tnrs_sources.Rd
index c988da9..b6127a6 100644
--- a/man/tnrs_sources.Rd
+++ b/man/tnrs_sources.Rd
@@ -27,4 +27,3 @@ tnrs_sources()
 tnrs_sources(source="NCBI")
 }
 }
-
diff --git a/man/tol_resolve.Rd b/man/tol_resolve.Rd
index f576327..52408ab 100644
--- a/man/tol_resolve.Rd
+++ b/man/tol_resolve.Rd
@@ -54,17 +54,16 @@ turducken_spp <- c("Meleagris gallopavo", "Anas platyrhynchos",
 tol_resolve(turducken_spp, context_name="Animals")
 }
 }
-\author{
-Francois Michonneau \email{francois.michonneau at gmail.com}
-Scott Chamberlain \email{myrmecocystus at gmail.com}
-}
 \references{
 \url{https://github.com/OpenTreeOfLife/germinator/wiki/TNRS-API-v3#match_names}
 }
 \seealso{
 \code{\link{gnr_resolve}}, \code{\link{tnrs}}
 }
+\author{
+Francois Michonneau \email{francois.michonneau at gmail.com}
+Scott Chamberlain \email{myrmecocystus at gmail.com}
+}
 \keyword{names}
 \keyword{resolve}
 \keyword{taxonomy}
-
diff --git a/man/tp_acceptednames-deprecated.Rd b/man/tp_acceptednames-deprecated.Rd
index 9058feb..bca9129 100644
--- a/man/tp_acceptednames-deprecated.Rd
+++ b/man/tp_acceptednames-deprecated.Rd
@@ -19,4 +19,3 @@ tp_acceptednames(id, format = "json", output = "df", key = NULL)
 Function name changed to tp_accnames.
 }
 \keyword{internal}
-
diff --git a/man/tp_accnames.Rd b/man/tp_accnames.Rd
index c99edf6..ce91d9e 100644
--- a/man/tp_accnames.Rd
+++ b/man/tp_accnames.Rd
@@ -28,4 +28,3 @@ tp_accnames(id = 25538750)
 tp_accnames(id = 25509881)
 }
 }
-
diff --git a/man/tp_classification-defunct.Rd b/man/tp_classification-defunct.Rd
index 38719e5..a325708 100644
--- a/man/tp_classification-defunct.Rd
+++ b/man/tp_classification-defunct.Rd
@@ -10,4 +10,3 @@ tp_classification(...)
 THIS FUNCTION IS DEFUNCT.
 }
 \keyword{internal}
-
diff --git a/man/tp_dist.Rd b/man/tp_dist.Rd
index 17af233..18aa59f 100644
--- a/man/tp_dist.Rd
+++ b/man/tp_dist.Rd
@@ -33,4 +33,3 @@ head(out[['reference']])
 \references{
 \url{http://services.tropicos.org/help?method=GetNameDistributionsXml}
 }
-
diff --git a/man/tp_namedistributions-deprecated.Rd b/man/tp_namedistributions-deprecated.Rd
index c10f160..4098656 100644
--- a/man/tp_namedistributions-deprecated.Rd
+++ b/man/tp_namedistributions-deprecated.Rd
@@ -18,4 +18,3 @@ key in this arg.}
 Function name changed to tp_dist.
 }
 \keyword{internal}
-
diff --git a/man/tp_namereferences-deprecated.Rd b/man/tp_namereferences-deprecated.Rd
index a412994..0341d27 100644
--- a/man/tp_namereferences-deprecated.Rd
+++ b/man/tp_namereferences-deprecated.Rd
@@ -22,4 +22,3 @@ tp_namereferences(id, format = "json", output = "df", key = NULL,
 Function name changed to tp_refs.
 }
 \keyword{internal}
-
diff --git a/man/tp_refs.Rd b/man/tp_refs.Rd
index 86a07cf..e1ea289 100644
--- a/man/tp_refs.Rd
+++ b/man/tp_refs.Rd
@@ -24,4 +24,3 @@ Return all reference records for for a taxon name with a given id.
 tp_refs(id = 25509881)
 }
 }
-
diff --git a/man/tp_search.Rd b/man/tp_search.Rd
index 6aa9240..eb9c171 100644
--- a/man/tp_search.Rd
+++ b/man/tp_search.Rd
@@ -55,4 +55,3 @@ tp_search(name = 'Poa annua annua')
 \references{
 \url{http://services.tropicos.org/help?method=SearchNameXml}
 }
-
diff --git a/man/tp_summary.Rd b/man/tp_summary.Rd
index ec54d9a..d0cef6b 100644
--- a/man/tp_summary.Rd
+++ b/man/tp_summary.Rd
@@ -26,4 +26,3 @@ tp_summary(id = 2700851)
 tp_summary(id = 24900183)
 }
 }
-
diff --git a/man/tp_synonyms.Rd b/man/tp_synonyms.Rd
index 4f164ef..f2d8a87 100644
--- a/man/tp_synonyms.Rd
+++ b/man/tp_synonyms.Rd
@@ -24,4 +24,3 @@ Return all synonyms for a taxon name with a given id.
 tp_synonyms(id = 25509881)
 }
 }
-
diff --git a/man/tpl_families.Rd b/man/tpl_families.Rd
index 45b1dfc..0d93398 100644
--- a/man/tpl_families.Rd
+++ b/man/tpl_families.Rd
@@ -26,10 +26,9 @@ Requires an internet connection in order to connect to www.theplantlist.org.
 head( tpl_families() )
 }
 }
-\author{
-John Baumgartner (johnbb at student.unimelb.edu.au)
-}
 \seealso{
 \code{\link{tpl_get}}
 }
-
+\author{
+John Baumgartner (johnbb at student.unimelb.edu.au)
+}
diff --git a/man/tpl_get.Rd b/man/tpl_get.Rd
index f9b8b58..bafe69a 100644
--- a/man/tpl_get.Rd
+++ b/man/tpl_get.Rd
@@ -31,6 +31,7 @@ as needed.
 # Get a few families
 dir <- file.path(tempdir(), "abc")
 tpl_get(dir, family = c("Platanaceae","Winteraceae"))
+readLines(file.path(dir, "Platanaceae.csv"), n = 5)
 
 # You can now get Gymnosperms as well
 dir1 <- file.path(tempdir(), "def")
@@ -46,13 +47,12 @@ tpl_get(dir2, family = "Echinodiaceae")
 ## tpl_get("dir3)
 }
 }
-\author{
-John Baumgartner (johnbb at student.unimelb.edu.au)
-}
 \references{
 The Plant List http://www.theplantlist.org
 }
 \seealso{
 \code{\link{tpl_families}}
 }
-
+\author{
+John Baumgartner (johnbb at student.unimelb.edu.au)
+}
diff --git a/man/tpl_search-defunct.Rd b/man/tpl_search-defunct.Rd
index b87ffa9..f3f09d2 100644
--- a/man/tpl_search-defunct.Rd
+++ b/man/tpl_search-defunct.Rd
@@ -9,4 +9,3 @@ tpl_search()
 \description{
 THIS FUNCTION IS DEFUNCT.
 }
-
diff --git a/man/ubio_classification-defunct.Rd b/man/ubio_classification-defunct.Rd
index ca094c4..dcc4b3b 100644
--- a/man/ubio_classification-defunct.Rd
+++ b/man/ubio_classification-defunct.Rd
@@ -12,4 +12,3 @@ ubio_classification(...)
 \description{
 THIS FUNCTION IS DEFUNCT.
 }
-
diff --git a/man/ubio_classification_search-defunct.Rd b/man/ubio_classification_search-defunct.Rd
index ad9252b..f59bc2d 100644
--- a/man/ubio_classification_search-defunct.Rd
+++ b/man/ubio_classification_search-defunct.Rd
@@ -13,4 +13,3 @@ ubio_classification_search(...)
 \description{
 THIS FUNCTION IS DEFUNCT.
 }
-
diff --git a/man/ubio_id-defunct.Rd b/man/ubio_id-defunct.Rd
index 924caa5..9e815eb 100644
--- a/man/ubio_id-defunct.Rd
+++ b/man/ubio_id-defunct.Rd
@@ -12,4 +12,3 @@ ubio_id(...)
 \description{
 THIS FUNCTION IS DEFUNCT.
 }
-
diff --git a/man/ubio_ping-defunct.Rd b/man/ubio_ping-defunct.Rd
index 2b63385..5087c23 100644
--- a/man/ubio_ping-defunct.Rd
+++ b/man/ubio_ping-defunct.Rd
@@ -9,4 +9,3 @@ ubio_ping()
 \description{
 uBio ping
 }
-
diff --git a/man/ubio_search-defunct.Rd b/man/ubio_search-defunct.Rd
index 50099e1..2a0dec2 100644
--- a/man/ubio_search-defunct.Rd
+++ b/man/ubio_search-defunct.Rd
@@ -12,4 +12,3 @@ ubio_search(...)
 \description{
 THIS FUNCTION IS DEFUNCT.
 }
-
diff --git a/man/ubio_synonyms-defunct.Rd b/man/ubio_synonyms-defunct.Rd
index 5165284..b55f3a8 100644
--- a/man/ubio_synonyms-defunct.Rd
+++ b/man/ubio_synonyms-defunct.Rd
@@ -12,4 +12,3 @@ ubio_synonyms(...)
 \description{
 THIS FUNCTION IS DEFUNCT.
 }
-
diff --git a/man/upstream.Rd b/man/upstream.Rd
index 1cd3f71..c8cf98c 100644
--- a/man/upstream.Rd
+++ b/man/upstream.Rd
@@ -2,15 +2,15 @@
 % Please edit documentation in R/upstream.R
 \name{upstream}
 \alias{upstream}
-\alias{upstream.colid}
 \alias{upstream.default}
-\alias{upstream.ids}
 \alias{upstream.tsn}
+\alias{upstream.colid}
+\alias{upstream.ids}
 \title{Retrieve the upstream taxa for a given taxon name or ID.}
 \usage{
 upstream(...)
 
-\method{upstream}{default}(x, db = NULL, upto = NULL, rows = NaN, ...)
+\method{upstream}{default}(x, db = NULL, upto = NULL, rows = NA, ...)
 
 \method{upstream}{tsn}(x, db = NULL, upto = NULL, ...)
 
@@ -79,4 +79,3 @@ upstream('Poa annua', db = 'col', upto = 'genus', rows=1)
 res <- upstream('Poa annua', db = 'col', upto = 'genus', config=verbose())
 }
 }
-
diff --git a/man/vascan_search.Rd b/man/vascan_search.Rd
index 416a70d..dc75179 100644
--- a/man/vascan_search.Rd
+++ b/man/vascan_search.Rd
@@ -52,12 +52,11 @@ library("httr")
 vascan_search(q = "Helianthus annuus", config = verbose())
 }
 }
-\author{
-Scott Chamberlain {myrmecocystus at gmail.com}
-}
 \references{
 API docs http://data.canadensys.net/vascan/api
 }
+\author{
+Scott Chamberlain {myrmecocystus at gmail.com}
+}
 \keyword{names}
 \keyword{taxonomy}
-
diff --git a/tests/testthat/Rplots.pdf b/tests/testthat/Rplots.pdf
index 062b17a..27d43ff 100644
Binary files a/tests/testthat/Rplots.pdf and b/tests/testthat/Rplots.pdf differ
diff --git a/tests/testthat/helper-taxize.R b/tests/testthat/helper-taxize.R
new file mode 100644
index 0000000..69a9af9
--- /dev/null
+++ b/tests/testthat/helper-taxize.R
@@ -0,0 +1 @@
+sw <- function(x) suppressWarnings(x)
diff --git a/tests/testthat/test-bold_search.R b/tests/testthat/test-bold_search.R
index 450786f..a80f27d 100644
--- a/tests/testthat/test-bold_search.R
+++ b/tests/testthat/test-bold_search.R
@@ -9,16 +9,16 @@ test_that("col_search returns the correct value, dimensions, and classes", {
   c <- bold_search(name=c("Apis","Puma concolor"))
   d <- bold_search(id=88899)
 
-	expect_equal(names(a)[1], "input")
+	expect_equal(names(a)[1], "taxid")
 	expect_that(a$taxon, equals("Apis"))
 
-  expect_that(dim(a), equals(c(1,8)))
-  expect_that(dim(b)[2], equals(8))
-  expect_that(dim(c), equals(c(2,8)))
-  expect_that(dim(d), equals(c(1,7)))
+  expect_equal(NROW(a), 1)
+  expect_gt(NROW(b), 10)
+  expect_gt(NROW(c), 1)
+  expect_equal(NROW(d), 1)
 
-	expect_that(a, is_a("data.frame"))
-	expect_that(b, is_a("data.frame"))
+	expect_is(a, "data.frame")
+	expect_is(b, "data.frame")
 
 	expect_that(a$tax_rank, is_a("character"))
 	expect_that(d$parentname, is_a("character"))
diff --git a/tests/testthat/test-class2tree.R b/tests/testthat/test-class2tree.R
index 16f45fa..7bc9bbb 100644
--- a/tests/testthat/test-class2tree.R
+++ b/tests/testthat/test-class2tree.R
@@ -4,14 +4,14 @@ context("class2tree")
 spnames <- c('Klattia flava', 'Trollius sibiricus', 'Arachis paraguariensis',
  'Tanacetum boreale', 'Gentiana yakushimensis','Sesamum schinzianum',
  'Pilea verrucosa','Tibouchina striphnocalyx','Lycium dasystemum',
- 'Schoenus centralis','Berkheya echinacea','Androcymbium villosum',
- 'Helianthus annuus','Madia elegans','Lupinus albicaulis','Poa annua',
+ 'Berkheya echinacea','Androcymbium villosum',
+ 'Helianthus annuus','Madia elegans','Lupinus albicaulis',
  'Pinus lambertiana')
 
 test_that("class2tree returns the correct value and class", {
   skip_on_cran()
 
-  out <- classification(spnames, db='ncbi', verbose=FALSE)
+  out <- classification(spnames, db = 'ncbi', verbose = FALSE)
   out <- out[!is.na(out)]
   tr <- class2tree(out)
 
diff --git a/tests/testthat/test-classification.R b/tests/testthat/test-classification.R
index 4165688..73c2556 100644
--- a/tests/testthat/test-classification.R
+++ b/tests/testthat/test-classification.R
@@ -47,7 +47,8 @@ test_that("classification returns the correct values and classes", {
                               verbose=FALSE)
   names(clas_ncbi) <- NULL
 
-  clas_itis <- classification(c("Chironomus riparius", "aaa vva"), db = 'itis', verbose=FALSE)
+  clas_itis <- classification(c("Chironomus riparius", "aaa vva"), db = 'itis',
+                              verbose=FALSE)
   names(clas_itis) <- NULL
 
 	expect_that(clas_ncbi[[2]], equals(NA))
diff --git a/tests/testthat/test-comm2sci.R b/tests/testthat/test-comm2sci.R
index 3e148a5..aed7876 100644
--- a/tests/testthat/test-comm2sci.R
+++ b/tests/testthat/test-comm2sci.R
@@ -25,3 +25,18 @@ test_that("comm2sci returns the correct values and classes", {
   expect_that(uu[[1]], is_a("character"))
   expect_is(suppressMessages(comm2sci(commnames='black bear', db='itis', simplify = FALSE))[[1]], "data.frame")
 })
+
+test_that("comm2sci fails well", {
+  expect_error(comm2sci(5), "commnames must be of class character")
+  expect_error(comm2sci(list()), "commnames must be of class character")
+  expect_error(comm2sci(mtcars), "commnames must be of class character")
+
+  expect_error(comm2sci("bear", db = "adsf"),
+               "'db' must be one of 'eol', 'itis', 'tropicos', 'ncbi', 'worms'")
+
+  expect_error(comm2sci("bear", simplify = "Asdf"),
+               "simplify must be of class logical")
+
+  # no results if itisby is not a valid value, doesn't error though
+  expect_equal(length(comm2sci('bear', db='itis', itisby = "asdff")[[1]]), 0)
+})
diff --git a/tests/testthat/test-downstream.R b/tests/testthat/test-downstream.R
index 7e4e0d2..8141efb 100644
--- a/tests/testthat/test-downstream.R
+++ b/tests/testthat/test-downstream.R
@@ -58,6 +58,20 @@ test_that("downstream - Use the rows parameter", {
   expect_is(aa[[1]]$childtaxa_id, "character")
 })
 
+
+test_that("downstream - Works with COL which previously failed
+          due to lack of infraspecies value in rank_ref dataset", {
+  skip_on_cran()
+
+  x <- as.colid("d324f3777e98688584cf8b68d0f06e5f", FALSE)
+  aa <- downstream(x, db = 'col', downto = "suborder", verbose = FALSE)
+
+  expect_is(aa, "downstream")
+  expect_is(aa[[1]], "data.frame")
+  expect_equal(NROW(aa[[1]]), 0)
+})
+
+
 test_that("downstream fails well", {
   skip_on_cran()
 
diff --git a/tests/testthat/test-genbank2uid.R b/tests/testthat/test-genbank2uid.R
new file mode 100644
index 0000000..a12e6c7
--- /dev/null
+++ b/tests/testthat/test-genbank2uid.R
@@ -0,0 +1,89 @@
+context("genbank2uid")
+
+test_that("genbank2uid - with accession numbers", {
+  skip_on_cran()
+
+  aa <- genbank2uid(id = 'AJ748748')
+  bb <- genbank2uid(c('X78312','KM495596'))
+
+  expect_is(aa, "uid")
+  expect_is(unclass(aa), "character")
+  expect_is(attr(aa, "match"), "character")
+  expect_false(attr(aa, "multiple_matches"))
+  expect_false(attr(aa, "pattern_match"))
+  expect_is(attr(aa, "uri"), "character")
+  expect_match(attr(aa, "uri"), "http")
+
+  expect_is(bb, "uid")
+  expect_is(unclass(bb), "character")
+  expect_is(attr(bb, "match"), "character")
+  expect_equal(attr(bb, "multiple_matches"), c(FALSE, FALSE))
+  expect_equal(attr(bb, "pattern_match"), c(FALSE, FALSE))
+  expect_is(attr(bb, "uri"), "character")
+  expect_match(attr(bb, "uri"), "http")
+})
+
+test_that("genbank2uid - with gi numbers", {
+  skip_on_cran()
+
+  aa <- genbank2uid(id = 62689767)
+  bb <- genbank2uid(c(62689767,156446673))
+
+  expect_is(aa, "uid")
+  expect_is(unclass(aa), "character")
+  expect_is(attr(aa, "match"), "character")
+  expect_false(attr(aa, "multiple_matches"))
+  expect_false(attr(aa, "pattern_match"))
+  expect_is(attr(aa, "uri"), "character")
+  expect_match(attr(aa, "uri"), "http")
+
+  expect_is(bb, "uid")
+  expect_is(unclass(bb), "character")
+  expect_is(attr(bb, "match"), "character")
+  expect_equal(attr(bb, "multiple_matches"), c(FALSE, FALSE))
+  expect_equal(attr(bb, "pattern_match"), c(FALSE, FALSE))
+  expect_is(attr(bb, "uri"), "character")
+  expect_match(attr(bb, "uri"), "http")
+})
+
+test_that("genbank2uid - where ID has more than one taxon associated", {
+  skip_on_cran()
+
+  aa <- genbank2uid(id = "AM420293")
+
+  expect_is(aa, "list")
+  expect_is(aa[[1]], "uid")
+  expect_is(aa[[2]], "uid")
+  expect_is(aa[[3]], "uid")
+  expect_match(attr(aa[[1]], "name"), "Saccharopolyspora")
+  expect_match(attr(aa[[2]], "name"), "Saccharopolyspora")
+  expect_match(attr(aa[[3]], "name"), "Saccharopolyspora")
+})
+
+test_that("genbank2uid - fails well", {
+  skip_on_cran()
+
+  # one Id not found
+  expect_warning(genbank2uid(id = "gwa2_scaffold_1731_16S_1"),
+                 "An error occurred looking up taxon ID\\(s\\)\\.")
+  aa <- suppressWarnings(genbank2uid(id = "gwa2_scaffold_1731_16S_1"))
+  expect_is(aa, "uid")
+  expect_true(is.na(unclass(aa)))
+
+  # many Ids not found
+  expect_warning(genbank2uid(id = c("gwa2_scaffold_1731_16S_1", "asdfadfs")),
+                 "An error occurred looking up taxon ID\\(s\\)\\.")
+  expect_warning(genbank2uid(id = c("gwa2_scaffold_1731_16S_1", "asdfadfs")),
+                 "set the 'batch_size' option to 1")
+  aa <- suppressWarnings(genbank2uid(id = c("gwa2_scaffold_1731_16S_1",
+                                            "asdfadfs")))
+  expect_is(aa, "uid")
+  expect_true(all(is.na(unclass(aa))))
+
+  # id not given
+  expect_error(genbank2uid(), "argument \"id\" is missing")
+
+  # id not given
+  expect_error(genbank2uid("Asdfdf", batch_size = "Asdf"),
+               "batch_size must be of class integer, numeric")
+})
diff --git a/tests/testthat/test-get_boldid.R b/tests/testthat/test-get_boldid.R
index fd6d882..fe4648f 100644
--- a/tests/testthat/test-get_boldid.R
+++ b/tests/testthat/test-get_boldid.R
@@ -22,3 +22,35 @@ test_that("get_boldid accepts ask-argument", {
   expect_that(is.na(get_boldid('adsf asdf asdf', ask=FALSE, verbose=FALSE)[[1]]),
               is_true())
 })
+
+test_that("get_boldid fails as expected", {
+  skip_on_cran()
+
+  expect_error(get_boldid(), "argument \"searchterm\" is missing")
+  expect_error(get_boldid("Satyrium", ask = 4, verbose = FALSE),
+               "ask must be of class logical")
+  expect_error(
+    get_boldid("Osmi", fuzzy=4, verbose = FALSE),
+    "fuzzy must be of class logical")
+  expect_error(
+    get_boldid("Osmi", dataTypes = 4, verbose = FALSE),
+    "dataTypes must be of class character")
+  expect_error(
+    get_boldid("Osmi", includeTree = 4, verbose = FALSE),
+    "includeTree must be of class logical")
+  expect_error(
+    get_boldid("Osmi", rank = 4, verbose = FALSE),
+    "rank must be of class character")
+  expect_error(
+    get_boldid("Osmi", division = 4, verbose = FALSE),
+    "division must be of class character")
+  expect_error(
+    get_boldid("Osmi", parent = 4, verbose = FALSE),
+    "parent must be of class character")
+
+  # rows param
+  expect_error(get_boldid("Achlya", rows = "foobar", verbose = FALSE),
+               "'rows' must be numeric or NA")
+  expect_error(get_boldid("Achlya", rows = 0, verbose = FALSE),
+               "'rows' value must be an integer 1 or greater")
+})
diff --git a/tests/testthat/test-get_colid.R b/tests/testthat/test-get_colid.R
index d56bcbc..770a99c 100644
--- a/tests/testthat/test-get_colid.R
+++ b/tests/testthat/test-get_colid.R
@@ -21,3 +21,36 @@ test_that("get_colid accepts ask-argument", {
   expect_that(is.na(get_colid(sciname='adsf asdf asdf', ask=FALSE, verbose=FALSE)[[1]]),
               is_true())
 })
+
+
+test_that("get_colid fails as expected", {
+  skip_on_cran()
+
+  expect_error(get_colid(), "argument \"sciname\" is missing")
+  expect_error(get_colid('Poa annua', ask = 4, verbose = FALSE),
+               "ask must be of class logical")
+  expect_error(
+    get_colid("Satyrium", kingdom = 234, verbose = FALSE),
+    "kingdom must be of class character")
+  expect_error(
+    get_colid("Satyrium", phylum = 234, verbose = FALSE),
+    "phylum must be of class character")
+  expect_error(
+    get_colid("Satyrium", class = 234, verbose = FALSE),
+    "class must be of class character")
+  expect_error(
+    get_colid("Satyrium", order = 234, verbose = FALSE),
+    "order must be of class character")
+  expect_error(
+    get_colid("Satyrium", family = 234, verbose = FALSE),
+    "family must be of class character")
+  expect_error(
+    get_colid("Satyrium", rank = 234, verbose = FALSE),
+    "rank must be of class character")
+
+  # rows param
+  expect_error(get_colid("Satyrium", rows = "foobar", verbose = FALSE),
+               "'rows' must be numeric or NA")
+  expect_error(get_colid("Satyrium", rows = 0, verbose = FALSE),
+               "'rows' value must be an integer 1 or greater")
+})
diff --git a/tests/testthat/test-get_eolid.R b/tests/testthat/test-get_eolid.R
index bdd1790..b007ba5 100644
--- a/tests/testthat/test-get_eolid.R
+++ b/tests/testthat/test-get_eolid.R
@@ -21,3 +21,18 @@ test_that("get_eolid accepts ask-argument", {
   expect_that(is.na(get_eolid(sciname='adsf asdf asdf', ask=FALSE, verbose=FALSE)[[1]]),
               is_true())
 })
+
+test_that("get_eolid fails as expected", {
+  skip_on_cran()
+
+  expect_error(get_eolid(), "argument \"sciname\" is missing")
+  expect_error(get_eolid("Poa annua", ask = 4, verbose = FALSE),
+               "ask must be of class logical")
+
+  # rows param
+  expect_error(get_eolid("Poa annua", rows = "foobar", verbose = FALSE),
+               "'rows' must be numeric or NA")
+  expect_error(get_eolid("Poa annua", rows = 0, verbose = FALSE),
+               "'rows' value must be an integer 1 or greater")
+})
+
diff --git a/tests/testthat/test-get_gbifid.R b/tests/testthat/test-get_gbifid.R
index fc74d39..ff18905 100644
--- a/tests/testthat/test-get_gbifid.R
+++ b/tests/testthat/test-get_gbifid.R
@@ -64,3 +64,36 @@ test_that("works regardless of character or numeric GGBIF ID given back", {
   expect_is(bb, "gbifid")
   expect_is(bb[[1]], "character")
 })
+
+test_that("get_gbifid fails as expected", {
+  skip_on_cran()
+
+  expect_error(get_gbifid(), "argument \"sciname\" is missing")
+  expect_error(get_gbifid('Poa annua', ask = 4, verbose = FALSE),
+               "ask must be of class logical")
+  expect_error(
+    get_gbifid("Satyrium", phylum = TRUE, verbose = FALSE),
+    "phylum must be of class character")
+  expect_error(
+    get_gbifid("Satyrium", class = TRUE, verbose = FALSE),
+    "class must be of class character")
+  expect_error(
+    get_gbifid("Satyrium", order = TRUE, verbose = FALSE),
+    "order must be of class character")
+  expect_error(
+    get_gbifid("Satyrium", family = TRUE, verbose = FALSE),
+    "family must be of class character")
+  expect_error(
+    get_gbifid("Satyrium", rank = TRUE, verbose = FALSE),
+    "rank must be of class character")
+  expect_error(
+    get_gbifid("Satyrium", method = 55, verbose = FALSE),
+    "method must be of class character")
+
+  # rows param
+  expect_error(get_gbifid("Satyrium", rows = "foobar", verbose = FALSE),
+               "'rows' must be numeric or NA")
+  expect_error(get_gbifid("Satyrium", rows = 0, verbose = FALSE),
+               "'rows' value must be an integer 1 or greater")
+})
+
diff --git a/tests/testthat/test-get_natservid.R b/tests/testthat/test-get_natservid.R
index e00928d..355d7f2 100644
--- a/tests/testthat/test-get_natservid.R
+++ b/tests/testthat/test-get_natservid.R
@@ -31,4 +31,10 @@ test_that("get_natservid fails well", {
                "'searchtype' must be one of")
   expect_error(get_natservid("clam", ask = 4),
                "ask must be of class logical")
+
+  # rows param
+  expect_error(get_natservid('Ruby*', 'common', rows = "foobar", verbose = FALSE),
+               "'rows' must be numeric or NA")
+  expect_error(get_natservid('Ruby*', 'common', rows = 0, verbose = FALSE),
+               "'rows' value must be an integer 1 or greater")
 })
diff --git a/tests/testthat/test-get_tpsid.R b/tests/testthat/test-get_tpsid.R
index 3687b98..ba33e53 100644
--- a/tests/testthat/test-get_tpsid.R
+++ b/tests/testthat/test-get_tpsid.R
@@ -47,3 +47,26 @@ test_that("get_tpsid behaves correctly on subspecific inputs", {
 
   expect_warning(get_tpsid('Poa annua foo bar annua'), NA)
 })
+
+test_that("get_tpsid fails as expected", {
+  skip_on_cran()
+
+  expect_error(get_tpsid(), "argument \"sciname\" is missing")
+  expect_error(get_tpsid('Poa annua', ask = 4, verbose = FALSE),
+               "ask must be of class logical")
+
+  expect_error(
+    get_tpsid("Poa annua", family = TRUE, verbose = FALSE),
+    "family must be of class character")
+  expect_error(
+    get_tpsid("Poa annua", rank = TRUE, verbose = FALSE),
+    "rank must be of class character")
+
+  # rows param
+  expect_error(get_tpsid("Poa annua", rows = "foobar", verbose = FALSE),
+               "'rows' must be numeric or NA")
+  expect_error(get_tpsid("Poa annua", rows = 0, verbose = FALSE),
+               "'rows' value must be an integer 1 or greater")
+})
+
+
diff --git a/tests/testthat/test-get_tsn.R b/tests/testthat/test-get_tsn.R
index 3fa7cb3..46fdbe4 100644
--- a/tests/testthat/test-get_tsn.R
+++ b/tests/testthat/test-get_tsn.R
@@ -10,14 +10,43 @@ test_that("get_tsn returns the correct value", {
 test_that("get_tsn returns the correct class", {
   skip_on_cran()
 
-	expect_that(get_tsn(c("Chironomus riparius", "Chaetopteryx"), verbose=FALSE), is_a("tsn"))
+	expect_is(get_tsn("Chironomus riparius", verbose=FALSE), "tsn")
 })
 
 test_that("get_tsn accepts ask and verbose arguments", {
   skip_on_cran()
 
   expect_message(get_tsn('Dugesia', verbose=TRUE))
-  expect_message(get_tsn('Dugesia', verbose=FALSE), NA)
+  #expect_message(get_tsn('Dugesia', verbose=FALSE), NA)
 
-  expect_that(all(is.na(get_tsn('black bear', searchtype="common", ask=FALSE, verbose=FALSE))), is_true())
+  expect_that(all(is.na(suppressWarnings(get_tsn('black bear', searchtype="common",
+                                ask=FALSE, verbose=FALSE)))), is_true())
+})
+
+test_that("get_tsn fails as expected", {
+  skip_on_cran()
+
+  expect_error(get_tsn(), "argument \"searchterm\" is missing")
+  expect_error(get_tsn("Arni", ask = 4, verbose = FALSE),
+               "ask must be of class logical")
+  expect_error(
+    get_tsn(searchterm="black bear", searchtype=5,
+            verbose = FALSE),
+    "searchtype must be of class character")
+  expect_error(
+    get_tsn("Arni", accepted = 34,
+            verbose = FALSE),
+    "accepted must be of class logical")
+
+  # searchtype values
+  expect_error(
+    get_tsn(searchterm="black bear", searchtype="asdfadf",
+            verbose = FALSE),
+    "'arg' should be one of")
+
+  # rows param
+  expect_error(get_tsn("Achlya", rows = "foobar", verbose = FALSE),
+               "'rows' must be numeric or NA")
+  expect_error(get_tsn("Achlya", rows = 0, verbose = FALSE),
+               "'rows' value must be an integer 1 or greater")
 })
diff --git a/tests/testthat/test-get_uid.R b/tests/testthat/test-get_uid.R
index c4a925e..4f856b4 100644
--- a/tests/testthat/test-get_uid.R
+++ b/tests/testthat/test-get_uid.R
@@ -18,7 +18,8 @@ test_that("get_uid returns the correct class", {
 test_that("get_uid accepts ask-argument", {
   skip_on_cran()
 
-  expect_that(is.na(get_uid('Dugesia', ask = FALSE, verbose=FALSE)),
+  expect_that(is.na(
+    suppressWarnings(get_uid('Dugesia', ask = FALSE, verbose=FALSE))),
               is_true())
 })
 
@@ -65,3 +66,33 @@ test_that("get_uid filtering works", {
   expect_equal(rf1[[1]], "3337")
   expect_equal(rf2[[1]], "139271")
 })
+
+test_that("get_uid fails as expected", {
+  skip_on_cran()
+
+  expect_error(get_uid(), "argument \"sciname\" is missing")
+  expect_error(get_uid("Satyrium", ask = 4, verbose = FALSE),
+               "ask must be of class logical")
+  expect_error(
+    get_uid(sciname = "Aratinga acuticauda", modifier = 5,
+            verbose = FALSE),
+               "modifier must be of class character")
+  expect_error(
+    get_uid(sciname = "Pinus", rank_query = TRUE,
+            verbose = FALSE),
+    "rank_query must be of class character")
+  expect_error(
+    get_uid(sciname = "Echinacea", division_filter = 4,
+            verbose = FALSE),
+    "division_filter must be of class character")
+  expect_error(
+    get_uid(sciname = "Pinus", rank_filter = 34,
+            verbose = FALSE),
+    "rank_filter must be of class character")
+
+  # rows param
+  expect_error(get_uid("Achlya", rows = "foobar", verbose = FALSE),
+               "'rows' must be numeric or NA")
+  expect_error(get_uid("Achlya", rows = 0, verbose = FALSE),
+               "'rows' value must be an integer 1 or greater")
+})
diff --git a/tests/testthat/test-get_wormsid.R b/tests/testthat/test-get_wormsid.R
index d27af13..f9e4852 100644
--- a/tests/testthat/test-get_wormsid.R
+++ b/tests/testthat/test-get_wormsid.R
@@ -3,20 +3,22 @@ context("get_wormsid")
 test_that("get_wormsid returns the correct value", {
   skip_on_cran()
 
-  expect_true(is.na(get_wormsid(c('Gadus morhua', "howdy"), verbose=FALSE)[2]))
+  expect_true(is.na(sw(get_wormsid(c('Gadus morhua', "howdy"), verbose=FALSE))[2]))
 })
 
 test_that("get_wormsid returns the correct class", {
   skip_on_cran()
 
-  expect_is(get_wormsid(c("Platanista gangetica", "Lichenopora neapolitana"), verbose=FALSE),
+  expect_is(
+    sw(get_wormsid(c("Platanista gangetica", "Lichenopora neapolitana"),
+                   verbose=FALSE)),
             "wormsid")
 })
 
 test_that("get_wormsid accepts ask-argument", {
   skip_on_cran()
 
-  expect_is(get_wormsid('Platanista gangetica', ask = FALSE, verbose=FALSE),
+  expect_is(sw(get_wormsid('Platanista gangetica', ask = FALSE, verbose=FALSE)),
               "wormsid")
   expect_true(is.na(get_wormsid('asdasf', ask = FALSE, verbose=FALSE)))
 })
@@ -25,12 +27,9 @@ test_that("get_wormsid query modifiers work", {
   skip_on_cran()
 
   ### w/ modifiers to the name
-  mod1 <- get_wormsid('Platanista gangetica', verbose=FALSE)
-  mod2 <- get_wormsid('asiatic clam', "common", verbose=FALSE)
+  mod2 <- sw(get_wormsid('asiatic clam', "common", verbose=FALSE))
 
-  expect_is(mod1, "wormsid")
   expect_is(mod2, "wormsid")
-  expect_equal(mod1[1], "254967")
   expect_equal(mod2[1], "181580")
 })
 
diff --git a/tests/testthat/test-itis_getrecord.R b/tests/testthat/test-itis_getrecord.R
index 91ec0d3..291c01e 100644
--- a/tests/testthat/test-itis_getrecord.R
+++ b/tests/testthat/test-itis_getrecord.R
@@ -6,7 +6,8 @@ test_that("itis_getrecord returns the correct class", {
 
   one <- itis_getrecord(202385, verbose=FALSE)
   two <- itis_getrecord(c(202385,70340), verbose=FALSE)
-  three <- itis_getrecord("urn:lsid:itis.gov:itis_tsn:180543", "lsid", verbose=FALSE)
+  three <- itis_getrecord("urn:lsid:itis.gov:itis_tsn:202385", "lsid",
+                          verbose=FALSE)
 
   expect_that(one, is_a("list"))
   expect_that(two, is_a("list"))
diff --git a/tests/testthat/test-itis_lsid.R b/tests/testthat/test-itis_lsid.R
index c1238d4..cddaf54 100644
--- a/tests/testthat/test-itis_lsid.R
+++ b/tests/testthat/test-itis_lsid.R
@@ -7,12 +7,12 @@ test_that("itis_lsid returns the correct value", {
 
   one <- itis_lsid("urn:lsid:itis.gov:itis_tsn:180543")
   two <- itis_lsid("urn:lsid:itis.gov:itis_tsn:180543", "record")
-  three <- itis_lsid("urn:lsid:itis.gov:itis_tsn:180543", "fullrecord")
+  three <- itis_lsid("urn:lsid:itis.gov:itis_tsn:202385", "fullrecord")
   four <- itis_lsid(202385)
 
   expect_equal(one, "180543")
   expect_match(as.character(two[1, "genuspart"]), "Ursus")
-  expect_match(three$acceptedNameList$tsn, "180543")
+  expect_match(three$acceptedNameList$tsn, "202385")
   expect_null(four)
 
   expect_is(one, "character")
diff --git a/tests/testthat/test-iucn_summary.R b/tests/testthat/test-iucn_summary.R
index a1dbf41..6fb564e 100755
--- a/tests/testthat/test-iucn_summary.R
+++ b/tests/testthat/test-iucn_summary.R
@@ -5,15 +5,15 @@ test_that("iucn_summary returns the correct value", {
   skip_on_cran()
 
   temp <- iucn_summary(c("Panthera uncia", "Lynx lynx"))
-  temp2 <- iucn_summary_id(c(22732, 12519))
+  temp2 <- suppressWarnings(iucn_summary_id(c(22732, 12519)))
 
   expect_that(length(temp[[1]]), equals(4))
 
-  expect_that(temp, is_a("iucn"))
+  expect_is(temp, "iucn_summary")
 
-  expect_identical(temp, temp2)
+  #expect_equal(temp, temp2)
 
-  expect_that(length(iucn_status(temp)), equals(2))
+  expect_equal(length(iucn_status(temp)), 2)
 })
 
 test_that("iucn_summary gives expected result for lots of names", {
@@ -47,17 +47,17 @@ test_that("iucn_summary gives expected result for lots of names", {
 test_that("iucn_summary_id with distr_detail produces correct output", {
   skip_on_cran()
 
-  ii <- iucn_summary_id(22685566, distr_detail = TRUE)
-  expect_equal(names(ii$`Ara chloropterus`$distr), c("Native", "Introduced"))
-  expect_equal(vapply(ii$`Ara chloropterus`$distr, length, 0),
+  ii <- suppressWarnings(iucn_summary_id(22685566, distr_detail = TRUE))
+  expect_equal(names(ii$`22685566`$distr), c("Native", "Introduced"))
+  expect_equal(vapply(ii$`22685566`$distr, length, 0),
                c(Native = 12, Introduced = 1))
 })
 
 test_that("iucn_summary and iucn_summary_id fail well", {
   skip_on_cran()
 
-  expect_warning(iucn_summary(""), "not found")
-  expect_equal(suppressWarnings(iucn_summary(""))[[1]]$status, NA)
+  expect_error(iucn_summary(""), "Not Found")
+  #expect_equal(suppressWarnings(iucn_summary(""))[[1]]$status, NA)
   expect_warning(iucn_summary("Abies"), "not found")
   expect_warning(iucn_summary_id(0), "not found")
   expect_equal(suppressWarnings(iucn_summary_id(0))[[1]]$status, NA)
diff --git a/tests/testthat/test-sci2comm.R b/tests/testthat/test-sci2comm.R
index 92fcfa5..64a03bc 100644
--- a/tests/testthat/test-sci2comm.R
+++ b/tests/testthat/test-sci2comm.R
@@ -6,8 +6,10 @@ test_that("sci2comm returns the correct value", {
   skip_on_cran()
 
   tt <- sci2comm(scinames = 'Helianthus annuus', db = 'ncbi', verbose = FALSE)
-  uu <- sci2comm(scinames = 'Helianthus annuus', db = 'itis', verbose = FALSE)
-  zz <- sci2comm(scinames = 'Pomatomus saltatrix', db = 'worms', verbose = FALSE)
+  uu <- sw(sci2comm(scinames = 'Helianthus annuus', db = 'itis', rows = 1,
+                    verbose = FALSE))
+  zz <- sci2comm(scinames = 'Pomatomus saltatrix', db = 'worms',
+                 verbose = FALSE)
 
   expect_that(names(tt), equals('Helianthus annuus'))
   expect_that(names(uu), equals('Helianthus annuus'))
diff --git a/tests/testthat/test-synonyms.R b/tests/testthat/test-synonyms.R
index 01538ae..9dbba31 100644
--- a/tests/testthat/test-synonyms.R
+++ b/tests/testthat/test-synonyms.R
@@ -5,7 +5,7 @@ context("synonyms")
 test_that("synonyms returns the correct value", {
   skip_on_cran()
 
-  tt <- synonyms("Poa annua", db = "itis")
+  tt <- sw(synonyms("Poa annua", db = "itis", rows = 1, verbose = FALSE))
 
 	expect_match(names(tt), "Poa annua")
 	expect_match(tt[[1]][1, "syn_name"], "Poa annua var. aquatica")
@@ -14,7 +14,7 @@ test_that("synonyms returns the correct value", {
 	expect_equal(attr(tt, "db"), "itis")
 	expect_is(tt[[1]], "data.frame")
 
-	expect_equal(dim(tt[[1]]), c(11, 5))
+	expect_gt(NROW(tt[[1]]), 1)
 })
 
 test_that("synonyms works with worms data", {
diff --git a/tests/testthat/test-tax_name.R b/tests/testthat/test-tax_name.R
index b99f379..29cf35e 100644
--- a/tests/testthat/test-tax_name.R
+++ b/tests/testthat/test-tax_name.R
@@ -10,8 +10,8 @@ test_that("tax_name returns the correct class", {
                         get = c("genus", "kingdom"), db = "ncbi", verbose=FALSE)
   tmp_na2 <- tax_name(query=c("Helianthus annuus", 'xxxx'),
                       get=c("family", "order"), db="ncbi", verbose=FALSE)
-  tmp_na3 <- tax_name(query = c("Helianthus annuus", 'xxxx'),
-                      get = c("family", "order"), db="itis",verbose=FALSE)
+  tmp_na3 <- sw(tax_name(query = c("Helianthus annuus", 'xxxx'),
+                      get = c("family", "order"), db="itis",verbose=FALSE))
 
 	expect_is(tmp_ncbi, "data.frame")
 	expect_is(tmp_na2, "data.frame")
@@ -31,24 +31,30 @@ test_that("tax_name returns the correct class", {
 test_that("tax_name accepts ask-argument", {
   skip_on_cran()
 
-  expect_that(is.na(tax_name(query = "Dugesia", get = "family", db = "ncbi",
-                             ask = FALSE, verbose = FALSE)$family), is_true())
+  expect_that(is.na(sw(tax_name(query = "Dugesia", get = "family", db = "ncbi",
+                             ask = FALSE, verbose = FALSE))$family), is_true())
 })
 
 test_that("taxon with no data returned from classification() works", {
-  aa <- suppressWarnings(tax_name("Galagoides demidovii", get = "species", verbose = FALSE))
+  skip_on_cran()
+
+  aa <- sw(tax_name("Galagoides demidovii", get = "species",
+                                  rows = 1, verbose = FALSE))
   expect_is(aa, "data.frame")
   expect_true(is.na(aa$species))
-  expect_warning(tax_name("Galagoides demidovii", get = "species", verbose = FALSE),
-                 "no hierarchy data found in ITIS")
+  expect_warning(
+    tax_name("Galagoides demidovii", get = "species", rows = 1,
+             verbose = FALSE),
+    "no hierarchy data found in ITIS"
+  )
 
-  bb <- suppressWarnings(tax_name("Asterias helianthus", get = "species", verbose = FALSE))
+  bb <- sw(tax_name("Asterias helianthus", get = "species", verbose = FALSE))
   expect_is(bb, "data.frame")
   expect_true(is.na(bb$species))
   expect_warning(tax_name("Asterias helianthus", get = "species", verbose = FALSE),
                  "no hierarchy data found in ITIS")
 
-  cc <- suppressWarnings(tax_name("Stellonia helianthus", get = "species", verbose = FALSE))
+  cc <- sw(tax_name("Stellonia helianthus", get = "species", verbose = FALSE))
   expect_is(cc, "data.frame")
   expect_true(is.na(cc$species))
   expect_warning(tax_name("Stellonia helianthus", get = "species", verbose = FALSE),
diff --git a/tests/testthat/test-tax_rank.R b/tests/testthat/test-tax_rank.R
index bd11983..cf918ef 100644
--- a/tests/testthat/test-tax_rank.R
+++ b/tests/testthat/test-tax_rank.R
@@ -1,22 +1,41 @@
-# tests for tax_name fxn in taxize
 context("tax_rank")
 
-
 test_that("tax_rank returns the correct class", {
   skip_on_cran()
 
-  A <- tax_rank(query = c("Helianthus annuus", "Baetis"), db = "ncbi", verbose=FALSE)
-  B <- tax_rank(query = "Helianthus", db = "itis", verbose=FALSE)
-  C <- tax_rank(query = c("Helianthus annuus", "xxxxxx"), db = "ncbi", verbose=FALSE)
+  A <- suppressMessages(tax_rank(c("Helianthus annuus", "Baetis"), db = "ncbi",
+                                 verbose=FALSE))
+  B <- suppressMessages(tax_rank("Helianthus", db = "itis", verbose=FALSE))
+  C <- suppressMessages(tax_rank(c("Helianthus annuus", "xxxxxx"), db = "ncbi",
+                                 verbose=FALSE))
+
+  expect_is(A, "list")
+  expect_is(B, "list")
+  expect_is(C, "list")
+  expect_equal(names(C), c("Helianthus annuus", "xxxxxx"))
+
+  expect_equal(A$`Helianthus annuus`, "species")
+  expect_true(is.na(C$xxxxxx))
+
+  expect_equal(length(A), 2)
+  expect_equal(length(C), 2)
+})
+
+test_that("works with get_*() input", {
+  aa <- suppressMessages(tax_rank(get_boldid("Helianthus annuus")))
 
-  expect_that(A, is_a("data.frame"))
-  expect_that(B, is_a("data.frame"))
-  expect_that(C, is_a("data.frame"))
-  expect_equal(names(C), 'rank')
+  expect_is(aa, "list")
+  expect_equal(names(aa), "421377")
+  expect_equal(aa$`421377`, "genus")
+})
 
-  expect_equal(A$rank[1], "species")
-  expect_true(is.na(C$rank[2]))
+test_that("tax_rank fails well", {
+  skip_on_cran()
 
-  expect_that(nrow(A), equals(2))
-  expect_that(nrow(C), equals(2))
+  expect_error(tax_rank(), "argument \"x\" is missing")
+  expect_error(tax_rank("aadfd"), "Must specify db!")
+  expect_error(tax_rank("Asdfadsf", db = "asdfd"),
+               "the provided db value was not recognised")
+  expect_error(tax_rank(NA, db = "itis"),
+               "'db' not recognized")
 })
diff --git a/tests/testthat/test-tnrs.R b/tests/testthat/test-tnrs.R
index 5686e34..60343f3 100644
--- a/tests/testthat/test-tnrs.R
+++ b/tests/testthat/test-tnrs.R
@@ -2,13 +2,31 @@
 context("tnrs")
 
 
-# test_that("tnrs returns the correct value", {
-#   skip_on_cran()
-#
-#   mynames <- c("Panthera tigris", "Eutamias minimus")
-#   out <- tnrs(query = mynames, verbose = FALSE)
-#
-#   expect_that(ncol(out), equals(7))
-#
-#   expect_that(out, is_a("data.frame"))
-# })
+test_that("tnrs works", {
+  skip_on_cran()
+
+  mynames <- c("Panthera tigris", "Eutamias minimus")
+  out <- tnrs(query = mynames, verbose = FALSE)
+
+  expect_that(ncol(out), equals(7))
+
+  expect_that(out, is_a("data.frame"))
+})
+
+
+test_that("tnrs returns user supplied order and row.names NULLed", {
+  skip_on_cran()
+
+  xxx <- c("Abies concolor", "Abies lasiocarpa",
+           "Acer sp.", "Acer campestre",
+           "Artemisia borealis", "Artemisia cana",
+           "Brassica napus", "Brassica oleracea")
+  out <- tnrs(xxx, source = "iPlant_TNRS", verbose = FALSE)
+
+  expect_equal(NCOL(out), 7)
+  expect_equal(NROW(out), 8)
+  expect_is(out, "data.frame")
+
+  # row.names are sequential
+  expect_equal(as.numeric(row.names(out)), 1:8)
+})
diff --git a/tests/testthat/test-tp_summary.R b/tests/testthat/test-tp_summary.R
index a99f1e0..19f9023 100644
--- a/tests/testthat/test-tp_summary.R
+++ b/tests/testthat/test-tp_summary.R
@@ -10,5 +10,5 @@ test_that("tp_summary returns the correct value", {
   expect_match(names(dat)[[1]], ".id")
 
 	expect_is(dat, "data.frame")
-	expect_equal(NCOL(dat), 22)
+	expect_gt(NCOL(dat), 10)
 })
diff --git a/vignettes/name_cleaning.Rmd b/vignettes/name_cleaning.Rmd
index cc02af6..a8c5536 100644
--- a/vignettes/name_cleaning.Rmd
+++ b/vignettes/name_cleaning.Rmd
@@ -104,12 +104,15 @@ has a sister method with and trailing underscore, e.g., `get_tsn()` and `get_tsn
 ```r
 get_tsn_(searchterm = "Quercus b")
 #> $`Quercus b`
-#>       tsn         scientificname             commonnames nameusage
-#> 2   19300        Quercus bicolor         swamp white oak  accepted
-#> 7  195166      Quercus boyntonii Boynton's sand post oak  accepted
-#> 8  195168       Quercus buckleyi               Texas oak  accepted
-#> 9  506533        Quercus brantii             Brant's oak  accepted
-#> 10 507263 Quercus berberidifolia               scrub oak  accepted
+#> # A tibble: 5 x 4
+#>      tsn         scientificName                           commonNames
+#>    <chr>                  <chr>                                 <chr>
+#> 1  19300        Quercus bicolor     swamp white oak,ch<ea>ne bicolore
+#> 2 195166      Quercus boyntonii Boynton's sand post oak,Boynton's oak
+#> 3 195168       Quercus buckleyi               Texas oak,Buckley's oak
+#> 4 506533        Quercus brantii                           Brant's oak
+#> 5 507263 Quercus berberidifolia                             scrub oak
+#> # ... with 1 more variables: nameUsage <chr>
 ```
 
 The result is a single data.frame for each taxon queried, which can be
@@ -122,17 +125,21 @@ number of a range of numbers:
 ```r
 get_tsn_(searchterm = "Quercus b", rows = 1)
 #> $`Quercus b`
-#>     tsn  scientificname     commonnames nameusage
-#> 2 19300 Quercus bicolor swamp white oak  accepted
+#> # A tibble: 1 x 4
+#>     tsn  scientificName                       commonNames nameUsage
+#>   <chr>           <chr>                             <chr>     <chr>
+#> 1 19300 Quercus bicolor swamp white oak,ch<ea>ne bicolore  accepted
 ```
 
 
 ```r
 get_tsn_(searchterm = "Quercus b", rows = 1:2)
 #> $`Quercus b`
-#>      tsn    scientificname             commonnames nameusage
-#> 2  19300   Quercus bicolor         swamp white oak  accepted
-#> 7 195166 Quercus boyntonii Boynton's sand post oak  accepted
+#> # A tibble: 2 x 4
+#>      tsn    scientificName                           commonNames nameUsage
+#>    <chr>             <chr>                                 <chr>     <chr>
+#> 1  19300   Quercus bicolor     swamp white oak,ch<ea>ne bicolore  accepted
+#> 2 195166 Quercus boyntonii Boynton's sand post oak,Boynton's oak  accepted
 ```
 
 ## as.* methods
@@ -220,28 +227,60 @@ in a programmatic workflow straight away.
 ```r
 spp <- names_list(rank = "species", size = 10)
 gnr_resolve(names = spp, preferred_data_sources = 11)
-#>         user_supplied_name          submitted_name
-#> 1        Shorea beccariana       Shorea beccariana
-#> 2           Draba ramulosa          Draba ramulosa
-#> 3      Cyrtandra phoenicea     Cyrtandra phoenicea
-#> 4      Pulicaria pomeliana     Pulicaria pomeliana
-#> 5   Helichrysum gymnocomum  Helichrysum gymnocomum
-#> 6         Campium costatum        Campium costatum
-#> 7  Pseudosedum condensatum Pseudosedum condensatum
-#> 8      Grammitis mollipila     Grammitis mollipila
-#> 9      Dioscorea cruzensis     Dioscorea cruzensis
-#> 10         Cereus coracare         Cereus coracare
-#>                          matched_name      data_source_title score
-#> 1             Shorea beccariana Burck GBIF Backbone Taxonomy 0.988
-#> 2              Draba ramulosa Rollins GBIF Backbone Taxonomy 0.988
-#> 3     Cyrtandra phoenicea C.B. Clarke GBIF Backbone Taxonomy 0.988
-#> 4   Pulicaria pomeliana Faure & Maire GBIF Backbone Taxonomy 0.988
-#> 5          Helichrysum gymnocomum DC. GBIF Backbone Taxonomy 0.988
-#> 6             Campium costatum Copel. GBIF Backbone Taxonomy 0.988
-#> 7     Pseudosedum condensatum Boriss. GBIF Backbone Taxonomy 0.988
-#> 8  Grammitis mollipila (Baker) Copel. GBIF Backbone Taxonomy 0.988
-#> 9         Dioscorea cruzensis R.Knuth GBIF Backbone Taxonomy 0.988
-#> 10                                                             NaN
+#>          user_supplied_name           submitted_name
+#> 1     Helichrysum candollei    Helichrysum candollei
+#> 2          Haworthia retusa         Haworthia retusa
+#> 3          Crypsinus bakeri         Crypsinus bakeri
+#> 4  Mangifera philippinensis Mangifera philippinensis
+#> 5    Selaginella atirrensis   Selaginella atirrensis
+#> 6   Hymenostomum sullivanii  Hymenostomum sullivanii
+#> 7   Hymenostomum sullivanii  Hymenostomum sullivanii
+#> 8         Cytisus urumoffii        Cytisus urumoffii
+#> 9         Cytisus urumoffii        Cytisus urumoffii
+#> 10        Cytisus urumoffii        Cytisus urumoffii
+#> 11        Baptisia uniflora        Baptisia uniflora
+#> 12        Baptisia uniflora        Baptisia uniflora
+#> 13        Baptisia uniflora        Baptisia uniflora
+#> 14        Baptisia uniflora        Baptisia uniflora
+#> 15     Nephelium xerocarpum     Nephelium xerocarpum
+#> 16  Baccharis gnaphalioides  Baccharis gnaphalioides
+#> 17  Baccharis gnaphalioides  Baccharis gnaphalioides
+#>                                             matched_name
+#> 1  Helichrysum candollei (Bojer ex DC.) R.Vig. & Humbert
+#> 2                            Haworthia retusa (L.) Duval
+#> 3                        Crypsinus bakeri (Luerss.) Tag.
+#> 4                      Mangifera philippinensis Mukherji
+#> 5                         Selaginella atirrensis Hieron.
+#> 6      Hymenostomum sullivanii C. Müller ex Geheeb, 1897
+#> 7                      Hymenostomum sullivanii C. Müller
+#> 8                     Cytisus urumoffii Davidov ex Stoj.
+#> 9                Cytisus urumoffii Davidoff ex Stoyanoff
+#> 10                            Cytisus urumoffii Davidoff
+#> 11                               Baptisia uniflora Hook.
+#> 12                      Baptisia uniflora (Michx.) Nutt.
+#> 13                        Baptisia uniflora (Michx.) Sm.
+#> 14                             Baptisia uniflora Spreng.
+#> 15                   Nephelium xerocarpum (Bl.) Cambess.
+#> 16                       Baccharis gnaphalioides Spreng.
+#> 17                           Baccharis gnaphalioides DC.
+#>         data_source_title score
+#> 1  GBIF Backbone Taxonomy 0.988
+#> 2  GBIF Backbone Taxonomy 0.988
+#> 3  GBIF Backbone Taxonomy 0.988
+#> 4  GBIF Backbone Taxonomy 0.988
+#> 5  GBIF Backbone Taxonomy 0.988
+#> 6  GBIF Backbone Taxonomy 0.988
+#> 7  GBIF Backbone Taxonomy 0.988
+#> 8  GBIF Backbone Taxonomy 0.988
+#> 9  GBIF Backbone Taxonomy 0.988
+#> 10 GBIF Backbone Taxonomy 0.988
+#> 11 GBIF Backbone Taxonomy 0.988
+#> 12 GBIF Backbone Taxonomy 0.988
+#> 13 GBIF Backbone Taxonomy 0.988
+#> 14 GBIF Backbone Taxonomy 0.988
+#> 15 GBIF Backbone Taxonomy 0.988
+#> 16 GBIF Backbone Taxonomy 0.988
+#> 17 GBIF Backbone Taxonomy 0.988
 ```
 
 ## Other functions
diff --git a/vignettes/taxize_infotable.Rmd b/vignettes/taxize_infotable.Rmd
index d3ba233..eb3bfdc 100644
--- a/vignettes/taxize_infotable.Rmd
+++ b/vignettes/taxize_infotable.Rmd
@@ -9,15 +9,24 @@ Some key functions in taxize, what they do, and their data sources.
 
 Function name | What it does | Source |
 ----------- | ----------- | ----------- |
-children | Get direct children | COL, NCBI, ITIS |
-classification | Upstream classification | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
-comm2sci | Get scientific from common names | EOL, NCBI, ITIS, Tropicos |
-downstream | Downstream taxa to specified rank | COL, ITIS, GBIF |
-get_ids | Get taxonomic identifiers | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
-resolve | Resolve names using any resolver | GNR, TNRS, iPlant |
-sci2comm | Get common from scientific names | EOL, NCBI, ITIS |
-synonyms | Retrieve synonyms given input names/identifiers | COL, NCBI, ITIS, Tropicos |
-upstream | Retrieve upstream taxa given names/identifiers | COL, ITIS |
+`children` | Get direct children | COL, NCBI, ITIS |
+`classification` | Upstream classification | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
+`comm2sci` | Get scientific from common names | EOL, NCBI, ITIS, Tropicos |
+`downstream` | Downstream taxa to specified rank | COL, ITIS, GBIF |
+`get_ids` | Get taxonomic identifiers | COL, NCBI, ITIS, Tropicos, EOL, GBIF, NBN |
+`resolve` | Resolve names using many resolvers | GNR, TNRS, iPlant |
+`gnr_resolve` | Resolve names using Global Names Resolver | GNR |
+`tnrs` | Phylotastic Taxonomic Name Resolution Service | NCBI, iPlant, MSW3 |
+`tol_resolve` | Resolve names using any resolver | TOL |
+`iplant_resolve` | iPlant name resolution| iPlant |
+`sci2comm` | Get common from scientific names | EOL, NCBI, ITIS |
+`synonyms` | Retrieve synonyms given input names/identifiers | COL, NCBI, ITIS, Tropicos |
+`upstream` | Retrieve upstream taxa given names/identifiers | COL, ITIS |
+`lowest_common` | Retrieve the lowest common taxon and rank for a given taxon name or ID | COL, ITIS, GBIF, TOL, NCBI |
+`genbank2uid` | Get NCBI taxonomy UID from GenBankID | NCBI |
+`tax_name` | Get taxonomic names for a given rank | NCBI, ITIS |
+`tax_rank` | Get rank for a given taxonomic name | BOLD, COL, EOL, GBIF, NATSERV, NBN, TOL, TROPICOS, ITIS, NCBI, WORMS |
+`tpl_get` | Get The Plant List csv files | TPL |
 
 ### Acronyms
 
@@ -30,3 +39,10 @@ upstream | Retrieve upstream taxa given names/identifiers | COL, ITIS |
 * iPlant: iPlant Name Resolution Service
 * GNR: Global Names Resolver
 * TNRS: Taxonomic Name Resolution Service
+* TOL: Open Tree of Life
+* MSW3: Mammal Species of the World, 3rd Edition
+* TPL: The Plant List
+* BOLD: Barcode of Life
+* NATSERV: Natureserve
+* TROPICOS: Tropicos plant database
+* WORMS: World Register of Marine Species
diff --git a/vignettes/taxize_vignette.Rmd b/vignettes/taxize_vignette.Rmd
index ee3930c..cdfb38d 100644
--- a/vignettes/taxize_vignette.Rmd
+++ b/vignettes/taxize_vignette.Rmd
@@ -42,16 +42,16 @@ head(temp)
 #> 1   Helianthos annus Helianthos annus     Helianthus annus
 #> 2   Helianthos annus Helianthos annus  Helianthus annus L.
 #> 3   Helianthos annus Helianthos annus     Helianthus annus
-#> 4   Helianthos annus Helianthos annus Helianthus annuus L.
+#> 4   Helianthos annus Helianthos annus     Helianthus annus
 #> 5   Helianthos annus Helianthos annus Helianthus annuus L.
-#> 6   Helianthos annus Helianthos annus    Helianthus annuus
-#>   data_source_title score
-#> 1               EOL  0.75
-#> 2               EOL  0.75
-#> 3     uBio NameBank  0.75
-#> 4 Catalogue of Life  0.75
-#> 5              ITIS  0.75
-#> 6              NCBI  0.75
+#> 6   Helianthos annus Helianthos annus Helianthus annuus L.
+#>                      data_source_title score
+#> 1                                  EOL  0.75
+#> 2                                  EOL  0.75
+#> 3                        uBio NameBank  0.75
+#> 4 Open Tree of Life Reference Taxonomy  0.75
+#> 5                    Catalogue of Life  0.75
+#> 6                                 ITIS  0.75
 ```
 
 The correct spellings are *Helianthus annuus* and *Homo sapiens*. Another approach uses the Taxonomic Name Resolution Service via the Taxosaurus API developed by iPLant and the Phylotastic organization. In this example, we provide a list of species names, some of which are misspelled, and we'll call the API with the *tnrs* function.
@@ -91,6 +91,10 @@ mynames <- c("Helianthus annuus ssp. jaegeri", "Helianthus annuus ssp. lenticula
 [1] "525928" "525929" "525930"
 attr(,"match")
 [1] "found" "found" "found"
+attr(,"multiple_matches")
+[1] FALSE FALSE FALSE
+attr(,"pattern_match")
+[1] FALSE FALSE FALSE
 attr(,"uri")
 [1] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=525928"
 [2] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=525929"
@@ -105,16 +109,16 @@ lapply(tsn, itis_acceptname)
 
 ```
 [[1]]
-  submittedtsn      acceptedname acceptedtsn
-1       525928 Helianthus annuus       36616
+  submittedtsn      acceptedname acceptedtsn author
+1       525928 Helianthus annuus       36616     L.
 
 [[2]]
-  submittedtsn      acceptedname acceptedtsn
-1       525929 Helianthus annuus       36616
+  submittedtsn      acceptedname acceptedtsn author
+1       525929 Helianthus annuus       36616     L.
 
 [[3]]
-  submittedtsn      acceptedname acceptedtsn
-1       525930 Helianthus annuus       36616
+  submittedtsn      acceptedname acceptedtsn author
+1       525930 Helianthus annuus       36616     L.
 ```
 
 ## Retrieve higher taxonomic names
@@ -208,8 +212,12 @@ get_uid(sciname = "Pinus")
 #> [1] "uid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
-#> [1] "http://www.ncbi.nlm.nih.gov/taxonomy/139271"
+#> [1] "https://www.ncbi.nlm.nih.gov/taxonomy/139271"
 ```
 
 In another example, you can pass in a long character vector of taxonomic names (although this one is rather short for demo purposes):
@@ -224,6 +232,10 @@ get_tsn(searchterm = splist, searchtype = "scientific")
 #> [1] "506198" "18098"  "19405" 
 #> attr(,"match")
 #> [1] "found" "found" "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE FALSE  TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE  TRUE
 #> attr(,"uri")
 #> [1] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=506198"
 #> [2] "http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=18098" 
@@ -249,14 +261,18 @@ get_nbnid(c("Zootoca vivipara","Pinus contorta"), rows = 1)
 ```
 
 ```
-#> [1] "NHMSYS0001706186" "NHMSYS0000494848"
+#> [1] "NHMSYS0001706186" "NBNSYS0000004786"
 #> attr(,"class")
 #> [1] "nbnid"
 #> attr(,"match")
 #> [1] "found" "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE
 #> attr(,"uri")
 #> [1] "https://data.nbn.org.uk/Taxa/NHMSYS0001706186"
-#> [2] "https://data.nbn.org.uk/Taxa/NHMSYS0000494848"
+#> [2] "https://data.nbn.org.uk/Taxa/NBNSYS0000004786"
 ```
 
 Or you can select a range of rows
@@ -267,29 +283,37 @@ get_nbnid(c("Zootoca vivipara","Pinus contorta"), rows = 1:3)
 ```
 
 ```
-#>              nbnid                  searchmatchtitle       rank
-#> 1 NHMSYS0001706186                  Zootoca vivipara    Species
-#> 2 NHMSYS0020784960 Zootoca vivipara subsp. pannonica Subspecies
-#> 3 NHMSYS0001706185                           Zootoca      Genus
-#>    namestatus
-#> 1 Recommended
-#> 2 Recommended
-#> 3 Recommended
-#>              nbnid               searchmatchtitle       rank  namestatus
-#> 1 NHMSYS0000494848   Pinus contorta var. contorta    Variety Recommended
-#> 2 NBNSYS0000004786                 Pinus contorta    Species Recommended
-#> 3 NHMSYS0000494848 Pinus contorta subsp. contorta Subspecies Recommended
+#>              nbnid                    scientificName       rank
+#> 1 NHMSYS0001706186                  Zootoca vivipara    species
+#> 2 NHMSYS0020784960 Zootoca vivipara subsp. pannonica subspecies
+#> 3 NHMSYS0000461615                 Bistorta vivipara    species
+#>   taxonomicStatus
+#> 1        accepted
+#> 2        accepted
+#> 3         synonym
+#>              nbnid                  scientificName       rank
+#> 1 NBNSYS0000004786                  Pinus contorta    species
+#> 2 NHMSYS0000494848  Pinus contorta subsp. contorta subspecies
+#> 3 NHMSYS0000494858 Pinus contorta subsp. murreyana subspecies
+#>   taxonomicStatus
+#> 1        accepted
+#> 2         synonym
+#> 3         synonym
 ```
 
 ```
-#> [1] "NHMSYS0001706186" "NHMSYS0000494848"
+#> [1] "NHMSYS0001706186" "NBNSYS0000004786"
 #> attr(,"class")
 #> [1] "nbnid"
 #> attr(,"match")
 #> [1] "found" "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE
 #> attr(,"uri")
 #> [1] "https://data.nbn.org.uk/Taxa/NHMSYS0001706186"
-#> [2] "https://data.nbn.org.uk/Taxa/NHMSYS0000494848"
+#> [2] "https://data.nbn.org.uk/Taxa/NBNSYS0000004786"
 ```
 
 In addition, in case you don't want to do interactive name selection in the case where there are a lot of names, you can get all data back with functions of the form, e.g., `get_tsn_()`, and likewise for other data sources. For example:
@@ -301,7 +325,7 @@ NROW(out$`Poa annua`)
 ```
 
 ```
-#> [1] 147
+#> [1] 25
 ```
 
 That's a lot of data, so we can get only certain rows back
@@ -313,17 +337,17 @@ get_nbnid_("Poa annua", rows = 1:10)
 
 ```
 #> $`Poa annua`
-#>    ptaxonversionkey searchmatchtitle    rank   namestatus
-#> 1  NBNSYS0000002544        Poa annua Species  Recommended
-#> 2  NHMSYS0000461798              Poa   Genus  Recommended
-#> 3  NHMSYS0000461804         Poa laxa Species      Synonym
-#> 4  NHMSYS0021060390           Poales   Order  Recommended
-#> 5  NHMSYS0000458512       Poa pilosa Species      Synonym
-#> 6  NBNSYS0000002547       Poa alpina Species  Recommended
-#> 7  NHMSYS0000461804        Poa minor Species      Synonym
-#> 8  NBNSYS0000002545       Poa exilis Species Undetermined
-#> 9  NHMSYS0000456981       Poa rigida Species      Synonym
-#> 10 NBNSYS0000002551       Poa caesia Species      Synonym
+#>                guid    scientificName    rank taxonomicStatus
+#> 1  NBNSYS0000002544         Poa annua species        accepted
+#> 2  NBNSYS0000002739      Adonis annua species         synonym
+#> 3  NBNSYS0200001901      Bellis annua species        accepted
+#> 4  NHMSYS0000456951 Carrichtera annua species         synonym
+#> 5  NBNSYS0200003392  Triumfetta annua species        accepted
+#> 6  NBNSYS0000002918     Lunaria annua species        accepted
+#> 7  NBNSYS0200002555       Lonas annua species        accepted
+#> 8  NBNSYS0000033325   Artemisia annua species        accepted
+#> 9  NHMSYS0000456951 Carrichtera annua species        accepted
+#> 10 NHMSYS0000461806     Poa imbecilla species         synonym
 ```
 
 ## Coerce numerics/alphanumerics to taxon IDs
@@ -338,11 +362,22 @@ as.gbifid(get_gbifid("Poa annua")) # already a uid, returns the same
 ```
 
 ```
+#>    gbifid             scientificname    rank   status matchtype
+#> 1 2704179               Poa annua L. species ACCEPTED     EXACT
+#> 2 8422205 Poa annua Cham. & Schltdl. species  SYNONYM     EXACT
+#> 3 7730008           Poa annua Steud. species DOUBTFUL     EXACT
+```
+
+```
 #> [1] "2704179"
 #> attr(,"class")
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] TRUE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 ```
@@ -357,6 +392,10 @@ as.gbifid(2704179) # numeric
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 ```
@@ -371,6 +410,10 @@ as.gbifid("2704179") # character
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 ```
@@ -385,6 +428,10 @@ as.gbifid(list("2704179","2435099","3171445")) # list, either numeric or charact
 #> [1] "gbifid"
 #> attr(,"match")
 #> [1] "found" "found" "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE FALSE FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE FALSE FALSE
 #> attr(,"uri")
 #> [1] "http://www.gbif.org/species/2704179"
 #> [2] "http://www.gbif.org/species/2435099"
@@ -400,7 +447,7 @@ system.time( replicate(3, as.gbifid(c("2704179","2435099","3171445"), check=TRUE
 
 ```
 #>    user  system elapsed 
-#>   0.088   0.008   3.697
+#>   0.072   0.002   1.656
 ```
 
 ```r
@@ -409,7 +456,7 @@ system.time( replicate(3, as.gbifid(c("2704179","2435099","3171445"), check=FALS
 
 ```
 #>    user  system elapsed 
-#>       0       0       0
+#>   0.002   0.000   0.002
 ```
 
 ## What taxa are downstream of my taxon of interest?
@@ -423,56 +470,56 @@ downstream("Apis", downto = "Species", db = "col")
 
 ```
 #>                     name    rank                            colid
-#> 1                   Apis   Genus 015be25f6b061ba517f495394b80f108
-#> 2      Actinomadura apis Species 1182a102a18b40aa19385bf5f1f53367
-#> 3    Anisocentropus apis Species 8891d18874dde14e44df52e931c44206
-#> 4     Apis andreniformis Species 7a4a38c5095963949d6d6ec917d471de
-#> 5            Apis cerana Species 39610a4ceff7e5244e334a3fbc5e47e5
-#> 6           Apis dorsata Species e1d4cbf3872c6c310b7a1c17ddd00ebc
-#> 7            Apis florea Species 92dca82a063fedd1da94b3f3972d7b22
-#> 8     Apis koschevnikovi Species 4bbc06b9dfbde0b72c619810b564c6e6
-#> 9         Apis mellifera Species 67cbbcf92cd60748759e58e802d98518
-#> 10      Apis nigrocincta Species 213668a26ba6d2aad9575218f10d422f
-#> 11      Ascosphaera apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 12          Candida apis Species 3219a9635d3438e8b76a645cecf87287
-#> 13        Eristalis apis Species 16d7c8023308d38f6bb831ed5fa82002
-#> 14           Hister apis Species d2d7483acf488b5ed932f49b0aa51d19
-#> 15        Ifephylus apis Species 9b4d00e009b58bbfc003b51bd3d0c6f0
-#> 16  Impatiens nidus-apis Species 6aecf448e6aa0cb46387066db94426d1
-#> 17      Kirkaldykra apis Species 70a68f13454abd937aabf56746f4a6ad
-#> 18          Mallota apis Species 10c3c3921d2ea9f9425ef9fd41914520
-#> 19 Melanosella mors-apis Species 4ac238f1597847dbc7998d97b8d45a0e
-#> 20         Microdon apis Species 9be92242562eb923e711dc24b7bbab9a
-#> 21           Nosema apis Species 5b2838dfd0ec15844fc6f659f7580322
-#> 22       Scutirodes apis Species 164ab3ac910547bc945cdbb994be1ee5
-#> 23      Spiroplasma apis Species 789f91571ce55de4df9821f2d05efab0
-#> 24   Trichomonascus apis Species 17dc4d840323e2c5b87e67a952f6dff3
-#> 25       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 26       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 27       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 28       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 29         Apis aestuans Species a517bc572c3c2697fe3bbfabc46a1493
-#> 30           Apis alpina Species f2781627115e4212ddab5979cdd425d2
-#> 31         Apis bicornis Species e67e82d00faae69da173bb31f9914056
-#> 32        Apis canescens Species d6b8850db971d65d6079e3a22f35e10e
-#> 33         Apis clypeata Species 706060924801130f6c3abf454087c100
-#> 34      Apis cunicularia Species ebc3c5166ce2cabf419c4c6dc332cf3b
-#> 35          Apis etrusca Species 6d27fd39a1d8b10050ba4e331987f3c9
-#> 36          Apis globosa Species 254c8e847ca4ff128bba57fe94deb98d
-#> 37        Apis hispanica Species e8d2057a3efeb2cfdaebe27ea8191cd5
-#> 38         Apis hypnorum Species dfb743f54f50b9b9dbee378473542821
-#> 39      Apis ichneumonea Species 13c35287e20ab9373fa445dbc44981ea
-#> 40        Apis lapidaria Species f8da5667af3562ebc0f6a83e1ec408f0
-#> 41         Apis muscorum Species 5bbfe59da5ce7fe59eb9ca3a7a45916c
-#> 42         Apis mystacea Species fba8e4752a7fa5939a7eae293ba633ec
-#> 43         Apis obsoleta Species da42bcb6cc0267903fb175f8a215aecb
-#> 44         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 45         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 46             Apis rufa Species e67e82d00faae69da173bb31f9914056
-#> 47          Apis signata Species 551f101ad3b9bc17b24575585b2500c1
-#> 48       Apis smaragdula Species 4bc5c886b061e17e9aecb537a04c616d
-#> 49        Apis spinulosa Species 56e7e9f854c9ed31ea6d0a06567607d0
-#> 50      Apis subterranea Species 3d2adff364a87bf7dd30524aa8071807
+#> 1                   Apis   genus 015be25f6b061ba517f495394b80f108
+#> 2      Actinomadura apis species 1182a102a18b40aa19385bf5f1f53367
+#> 3    Anisocentropus apis species 8891d18874dde14e44df52e931c44206
+#> 4     Apis andreniformis species 7a4a38c5095963949d6d6ec917d471de
+#> 5            Apis cerana species 39610a4ceff7e5244e334a3fbc5e47e5
+#> 6           Apis dorsata species e1d4cbf3872c6c310b7a1c17ddd00ebc
+#> 7            Apis florea species 92dca82a063fedd1da94b3f3972d7b22
+#> 8     Apis koschevnikovi species 4bbc06b9dfbde0b72c619810b564c6e6
+#> 9         Apis mellifera species 67cbbcf92cd60748759e58e802d98518
+#> 10      Apis nigrocincta species 213668a26ba6d2aad9575218f10d422f
+#> 11      Ascosphaera apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 12          Candida apis species 3219a9635d3438e8b76a645cecf87287
+#> 13        Eristalis apis species 16d7c8023308d38f6bb831ed5fa82002
+#> 14           Hister apis species d2d7483acf488b5ed932f49b0aa51d19
+#> 15        Ifephylus apis species 9b4d00e009b58bbfc003b51bd3d0c6f0
+#> 16  Impatiens nidus-apis species 6aecf448e6aa0cb46387066db94426d1
+#> 17      Kirkaldykra apis species 70a68f13454abd937aabf56746f4a6ad
+#> 18          Mallota apis species 10c3c3921d2ea9f9425ef9fd41914520
+#> 19 Melanosella mors-apis species 4ac238f1597847dbc7998d97b8d45a0e
+#> 20         Microdon apis species 9be92242562eb923e711dc24b7bbab9a
+#> 21           Nosema apis species 5b2838dfd0ec15844fc6f659f7580322
+#> 22       Scutirodes apis species 164ab3ac910547bc945cdbb994be1ee5
+#> 23      Spiroplasma apis species 789f91571ce55de4df9821f2d05efab0
+#> 24   Trichomonascus apis species 17dc4d840323e2c5b87e67a952f6dff3
+#> 25       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 26       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 27       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 28       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 29         Apis aestuans species a517bc572c3c2697fe3bbfabc46a1493
+#> 30           Apis alpina species f2781627115e4212ddab5979cdd425d2
+#> 31         Apis bicornis species e67e82d00faae69da173bb31f9914056
+#> 32        Apis canescens species d6b8850db971d65d6079e3a22f35e10e
+#> 33         Apis clypeata species 706060924801130f6c3abf454087c100
+#> 34      Apis cunicularia species ebc3c5166ce2cabf419c4c6dc332cf3b
+#> 35          Apis etrusca species 6d27fd39a1d8b10050ba4e331987f3c9
+#> 36          Apis globosa species 254c8e847ca4ff128bba57fe94deb98d
+#> 37        Apis hispanica species e8d2057a3efeb2cfdaebe27ea8191cd5
+#> 38         Apis hypnorum species dfb743f54f50b9b9dbee378473542821
+#> 39      Apis ichneumonea species 13c35287e20ab9373fa445dbc44981ea
+#> 40        Apis lapidaria species f8da5667af3562ebc0f6a83e1ec408f0
+#> 41         Apis muscorum species 5bbfe59da5ce7fe59eb9ca3a7a45916c
+#> 42         Apis mystacea species fba8e4752a7fa5939a7eae293ba633ec
+#> 43         Apis obsoleta species da42bcb6cc0267903fb175f8a215aecb
+#> 44         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 45         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 46             Apis rufa species e67e82d00faae69da173bb31f9914056
+#> 47          Apis signata species 551f101ad3b9bc17b24575585b2500c1
+#> 48       Apis smaragdula species 4bc5c886b061e17e9aecb537a04c616d
+#> 49        Apis spinulosa species 56e7e9f854c9ed31ea6d0a06567607d0
+#> 50      Apis subterranea species 3d2adff364a87bf7dd30524aa8071807
 #>          name_status  kingdom              family              acc_name
 #> 1      accepted name Animalia              Apidae                  <NA>
 #> 2      accepted name Bacteria Thermomonosporaceae                  <NA>
@@ -529,13 +576,13 @@ downstream("Apis", downto = "Species", db = "col")
 ```
 #> $Apis
 #>                       childtaxa_id     childtaxa_name childtaxa_rank
-#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        Species
-#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        Species
-#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        Species
-#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        Species
-#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        Species
-#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        Species
-#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        Species
+#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        species
+#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        species
+#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        species
+#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        species
+#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        species
+#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        species
+#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        species
 #> 
 #> attr(,"class")
 #> [1] "downstream"
@@ -553,13 +600,13 @@ downstream("Apis", downto = "Species", db = "itis")
 ```
 #> $Apis
 #>      tsn parentname parenttsn          taxonname rankid rankname
-#> 1 154396       Apis    154395     Apis mellifera    220  Species
-#> 2 763550       Apis    154395 Apis andreniformis    220  Species
-#> 3 763551       Apis    154395        Apis cerana    220  Species
-#> 4 763552       Apis    154395       Apis dorsata    220  Species
-#> 5 763553       Apis    154395        Apis florea    220  Species
-#> 6 763554       Apis    154395 Apis koschevnikovi    220  Species
-#> 7 763555       Apis    154395   Apis nigrocincta    220  Species
+#> 1 154396       Apis    154395     Apis mellifera    220  species
+#> 2 763550       Apis    154395 Apis andreniformis    220  species
+#> 3 763551       Apis    154395        Apis cerana    220  species
+#> 4 763552       Apis    154395       Apis dorsata    220  species
+#> 5 763553       Apis    154395        Apis florea    220  species
+#> 6 763554       Apis    154395 Apis koschevnikovi    220  species
+#> 7 763555       Apis    154395   Apis nigrocincta    220  species
 #> 
 #> attr(,"class")
 #> [1] "downstream"
@@ -578,56 +625,56 @@ children(get_colid("Apis"))
 
 ```
 #>                     name    rank                            colid
-#> 1                   Apis   Genus 015be25f6b061ba517f495394b80f108
-#> 2      Actinomadura apis Species 1182a102a18b40aa19385bf5f1f53367
-#> 3    Anisocentropus apis Species 8891d18874dde14e44df52e931c44206
-#> 4     Apis andreniformis Species 7a4a38c5095963949d6d6ec917d471de
-#> 5            Apis cerana Species 39610a4ceff7e5244e334a3fbc5e47e5
-#> 6           Apis dorsata Species e1d4cbf3872c6c310b7a1c17ddd00ebc
-#> 7            Apis florea Species 92dca82a063fedd1da94b3f3972d7b22
-#> 8     Apis koschevnikovi Species 4bbc06b9dfbde0b72c619810b564c6e6
-#> 9         Apis mellifera Species 67cbbcf92cd60748759e58e802d98518
-#> 10      Apis nigrocincta Species 213668a26ba6d2aad9575218f10d422f
-#> 11      Ascosphaera apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 12          Candida apis Species 3219a9635d3438e8b76a645cecf87287
-#> 13        Eristalis apis Species 16d7c8023308d38f6bb831ed5fa82002
-#> 14           Hister apis Species d2d7483acf488b5ed932f49b0aa51d19
-#> 15        Ifephylus apis Species 9b4d00e009b58bbfc003b51bd3d0c6f0
-#> 16  Impatiens nidus-apis Species 6aecf448e6aa0cb46387066db94426d1
-#> 17      Kirkaldykra apis Species 70a68f13454abd937aabf56746f4a6ad
-#> 18          Mallota apis Species 10c3c3921d2ea9f9425ef9fd41914520
-#> 19 Melanosella mors-apis Species 4ac238f1597847dbc7998d97b8d45a0e
-#> 20         Microdon apis Species 9be92242562eb923e711dc24b7bbab9a
-#> 21           Nosema apis Species 5b2838dfd0ec15844fc6f659f7580322
-#> 22       Scutirodes apis Species 164ab3ac910547bc945cdbb994be1ee5
-#> 23      Spiroplasma apis Species 789f91571ce55de4df9821f2d05efab0
-#> 24   Trichomonascus apis Species 17dc4d840323e2c5b87e67a952f6dff3
-#> 25       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 26       Pericystis apis Species 088549f2fb602367e84d5ffdb8c1d4fc
-#> 27       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 28       Torulopsis apis Species 3219a9635d3438e8b76a645cecf87287
-#> 29         Apis aestuans Species a517bc572c3c2697fe3bbfabc46a1493
-#> 30           Apis alpina Species f2781627115e4212ddab5979cdd425d2
-#> 31         Apis bicornis Species e67e82d00faae69da173bb31f9914056
-#> 32        Apis canescens Species d6b8850db971d65d6079e3a22f35e10e
-#> 33         Apis clypeata Species 706060924801130f6c3abf454087c100
-#> 34      Apis cunicularia Species ebc3c5166ce2cabf419c4c6dc332cf3b
-#> 35          Apis etrusca Species 6d27fd39a1d8b10050ba4e331987f3c9
-#> 36          Apis globosa Species 254c8e847ca4ff128bba57fe94deb98d
-#> 37        Apis hispanica Species e8d2057a3efeb2cfdaebe27ea8191cd5
-#> 38         Apis hypnorum Species dfb743f54f50b9b9dbee378473542821
-#> 39      Apis ichneumonea Species 13c35287e20ab9373fa445dbc44981ea
-#> 40        Apis lapidaria Species f8da5667af3562ebc0f6a83e1ec408f0
-#> 41         Apis muscorum Species 5bbfe59da5ce7fe59eb9ca3a7a45916c
-#> 42         Apis mystacea Species fba8e4752a7fa5939a7eae293ba633ec
-#> 43         Apis obsoleta Species da42bcb6cc0267903fb175f8a215aecb
-#> 44         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 45         Apis rostrata Species e155a4277b66d1114182cafd875afbe3
-#> 46             Apis rufa Species e67e82d00faae69da173bb31f9914056
-#> 47          Apis signata Species 551f101ad3b9bc17b24575585b2500c1
-#> 48       Apis smaragdula Species 4bc5c886b061e17e9aecb537a04c616d
-#> 49        Apis spinulosa Species 56e7e9f854c9ed31ea6d0a06567607d0
-#> 50      Apis subterranea Species 3d2adff364a87bf7dd30524aa8071807
+#> 1                   Apis   genus 015be25f6b061ba517f495394b80f108
+#> 2      Actinomadura apis species 1182a102a18b40aa19385bf5f1f53367
+#> 3    Anisocentropus apis species 8891d18874dde14e44df52e931c44206
+#> 4     Apis andreniformis species 7a4a38c5095963949d6d6ec917d471de
+#> 5            Apis cerana species 39610a4ceff7e5244e334a3fbc5e47e5
+#> 6           Apis dorsata species e1d4cbf3872c6c310b7a1c17ddd00ebc
+#> 7            Apis florea species 92dca82a063fedd1da94b3f3972d7b22
+#> 8     Apis koschevnikovi species 4bbc06b9dfbde0b72c619810b564c6e6
+#> 9         Apis mellifera species 67cbbcf92cd60748759e58e802d98518
+#> 10      Apis nigrocincta species 213668a26ba6d2aad9575218f10d422f
+#> 11      Ascosphaera apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 12          Candida apis species 3219a9635d3438e8b76a645cecf87287
+#> 13        Eristalis apis species 16d7c8023308d38f6bb831ed5fa82002
+#> 14           Hister apis species d2d7483acf488b5ed932f49b0aa51d19
+#> 15        Ifephylus apis species 9b4d00e009b58bbfc003b51bd3d0c6f0
+#> 16  Impatiens nidus-apis species 6aecf448e6aa0cb46387066db94426d1
+#> 17      Kirkaldykra apis species 70a68f13454abd937aabf56746f4a6ad
+#> 18          Mallota apis species 10c3c3921d2ea9f9425ef9fd41914520
+#> 19 Melanosella mors-apis species 4ac238f1597847dbc7998d97b8d45a0e
+#> 20         Microdon apis species 9be92242562eb923e711dc24b7bbab9a
+#> 21           Nosema apis species 5b2838dfd0ec15844fc6f659f7580322
+#> 22       Scutirodes apis species 164ab3ac910547bc945cdbb994be1ee5
+#> 23      Spiroplasma apis species 789f91571ce55de4df9821f2d05efab0
+#> 24   Trichomonascus apis species 17dc4d840323e2c5b87e67a952f6dff3
+#> 25       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 26       Pericystis apis species 088549f2fb602367e84d5ffdb8c1d4fc
+#> 27       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 28       Torulopsis apis species 3219a9635d3438e8b76a645cecf87287
+#> 29         Apis aestuans species a517bc572c3c2697fe3bbfabc46a1493
+#> 30           Apis alpina species f2781627115e4212ddab5979cdd425d2
+#> 31         Apis bicornis species e67e82d00faae69da173bb31f9914056
+#> 32        Apis canescens species d6b8850db971d65d6079e3a22f35e10e
+#> 33         Apis clypeata species 706060924801130f6c3abf454087c100
+#> 34      Apis cunicularia species ebc3c5166ce2cabf419c4c6dc332cf3b
+#> 35          Apis etrusca species 6d27fd39a1d8b10050ba4e331987f3c9
+#> 36          Apis globosa species 254c8e847ca4ff128bba57fe94deb98d
+#> 37        Apis hispanica species e8d2057a3efeb2cfdaebe27ea8191cd5
+#> 38         Apis hypnorum species dfb743f54f50b9b9dbee378473542821
+#> 39      Apis ichneumonea species 13c35287e20ab9373fa445dbc44981ea
+#> 40        Apis lapidaria species f8da5667af3562ebc0f6a83e1ec408f0
+#> 41         Apis muscorum species 5bbfe59da5ce7fe59eb9ca3a7a45916c
+#> 42         Apis mystacea species fba8e4752a7fa5939a7eae293ba633ec
+#> 43         Apis obsoleta species da42bcb6cc0267903fb175f8a215aecb
+#> 44         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 45         Apis rostrata species e155a4277b66d1114182cafd875afbe3
+#> 46             Apis rufa species e67e82d00faae69da173bb31f9914056
+#> 47          Apis signata species 551f101ad3b9bc17b24575585b2500c1
+#> 48       Apis smaragdula species 4bc5c886b061e17e9aecb537a04c616d
+#> 49        Apis spinulosa species 56e7e9f854c9ed31ea6d0a06567607d0
+#> 50      Apis subterranea species 3d2adff364a87bf7dd30524aa8071807
 #>          name_status  kingdom              family              acc_name
 #> 1      accepted name Animalia              Apidae                  <NA>
 #> 2      accepted name Bacteria Thermomonosporaceae                  <NA>
@@ -684,13 +731,13 @@ children(get_colid("Apis"))
 ```
 #> $`015be25f6b061ba517f495394b80f108`
 #>                       childtaxa_id     childtaxa_name childtaxa_rank
-#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        Species
-#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        Species
-#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        Species
-#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        Species
-#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        Species
-#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        Species
-#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        Species
+#> 1 7a4a38c5095963949d6d6ec917d471de Apis andreniformis        species
+#> 2 39610a4ceff7e5244e334a3fbc5e47e5        Apis cerana        species
+#> 3 e1d4cbf3872c6c310b7a1c17ddd00ebc       Apis dorsata        species
+#> 4 92dca82a063fedd1da94b3f3972d7b22        Apis florea        species
+#> 5 4bbc06b9dfbde0b72c619810b564c6e6 Apis koschevnikovi        species
+#> 6 67cbbcf92cd60748759e58e802d98518     Apis mellifera        species
+#> 7 213668a26ba6d2aad9575218f10d422f   Apis nigrocincta        species
 #> 
 #> attr(,"class")
 #> [1] "children"
@@ -741,6 +788,10 @@ genbank2uid(id = 'AJ748748')
 #> [1] "uid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.ncbi.nlm.nih.gov/taxonomy/282199"
 ```
@@ -758,6 +809,10 @@ genbank2uid(id = 62689767)
 #> [1] "uid"
 #> attr(,"match")
 #> [1] "found"
+#> attr(,"multiple_matches")
+#> [1] FALSE
+#> attr(,"pattern_match")
+#> [1] FALSE
 #> attr(,"uri")
 #> [1] "http://www.ncbi.nlm.nih.gov/taxonomy/282199"
 ```

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/r-cran-taxize.git



More information about the debian-med-commit mailing list