diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml
index 09b7f9a090..c548bcb5eb 100644
--- a/dspace-api/pom.xml
+++ b/dspace-api/pom.xml
@@ -734,6 +734,18 @@
com.fasterxml.jackson.core
jackson-databind
+
+
+
+ org.dspace
+ orcid-jaxb-api
+ 2.1.0
+
+
+ org.json
+ json
+ 20180130
+
diff --git a/dspace-api/src/main/java/org/dspace/authority/SolrAuthorityInterface.java b/dspace-api/src/main/java/org/dspace/authority/SolrAuthorityInterface.java
new file mode 100644
index 0000000000..63ad909218
--- /dev/null
+++ b/dspace-api/src/main/java/org/dspace/authority/SolrAuthorityInterface.java
@@ -0,0 +1,20 @@
+/**
+ * The contents of this file are subject to the license and copyright
+ * detailed in the LICENSE and NOTICE files at the root of the source
+ * tree and available online at
+ *
+ * http://www.dspace.org/license/
+ */
+package org.dspace.authority;
+
+import java.util.List;
+
+/**
+ * @author Jonas Van Goolen (jonas at atmire dot com)
+ */
+public interface SolrAuthorityInterface {
+
+ List queryAuthorities(String text, int max);
+
+ AuthorityValue queryAuthorityID(String id);
+}
diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcid.java b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcid.java
deleted file mode 100644
index b5a6d2f0a4..0000000000
--- a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcid.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * The contents of this file are subject to the license and copyright
- * detailed in the LICENSE and NOTICE files at the root of the source
- * tree and available online at
- *
- * http://www.dspace.org/license/
- */
-package org.dspace.authority.orcid;
-
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import org.dspace.authority.AuthorityValue;
-import org.dspace.authority.orcid.model.Bio;
-import org.dspace.authority.orcid.model.Work;
-import org.dspace.authority.orcid.xml.XMLtoBio;
-import org.dspace.authority.orcid.xml.XMLtoWork;
-import org.dspace.authority.rest.RestSource;
-import org.dspace.services.factory.DSpaceServicesFactory;
-import org.w3c.dom.Document;
-
-/**
- * @author Antoine Snyers (antoine at atmire.com)
- * @author Kevin Van de Velde (kevin at atmire dot com)
- * @author Ben Bosman (ben at atmire dot com)
- * @author Mark Diggory (markd at atmire dot com)
- */
-public class Orcid extends RestSource {
-
- /**
- * log4j logger
- */
- private static Logger log = Logger.getLogger(Orcid.class);
-
- private static Orcid orcid;
-
- public static Orcid getOrcid() {
- if (orcid == null) {
- orcid = DSpaceServicesFactory.getInstance().getServiceManager()
- .getServiceByName("OrcidSource", Orcid.class);
- }
- return orcid;
- }
-
- private Orcid(String url) {
- super(url);
- }
-
- public Bio getBio(String id) {
- Document bioDocument = restConnector.get(id + "/orcid-bio");
- XMLtoBio converter = new XMLtoBio();
- Bio bio = converter.convert(bioDocument).get(0);
- bio.setOrcid(id);
- return bio;
- }
-
- public List getWorks(String id) {
- Document document = restConnector.get(id + "/orcid-works");
- XMLtoWork converter = new XMLtoWork();
- return converter.convert(document);
- }
-
- public List queryBio(String name, int start, int rows) {
- Document bioDocument = restConnector
- .get("search/orcid-bio?q=" + URLEncoder.encode("\"" + name + "\"") + "&start=" + start + "&rows=" + rows);
- XMLtoBio converter = new XMLtoBio();
- return converter.convert(bioDocument);
- }
-
- @Override
- public List queryAuthorities(String text, int max) {
- List bios = queryBio(text, 0, max);
- List authorities = new ArrayList();
- for (Bio bio : bios) {
- authorities.add(OrcidAuthorityValue.create(bio));
- }
- return authorities;
- }
-
- @Override
- public AuthorityValue queryAuthorityID(String id) {
- Bio bio = getBio(id);
- return OrcidAuthorityValue.create(bio);
- }
-}
diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/OrcidAuthorityValue.java b/dspace-api/src/main/java/org/dspace/authority/orcid/OrcidAuthorityValue.java
deleted file mode 100644
index f28d81f83e..0000000000
--- a/dspace-api/src/main/java/org/dspace/authority/orcid/OrcidAuthorityValue.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/**
- * The contents of this file are subject to the license and copyright
- * detailed in the LICENSE and NOTICE files at the root of the source
- * tree and available online at
- *
- * http://www.dspace.org/license/
- */
-package org.dspace.authority.orcid;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
-import org.apache.solr.common.SolrDocument;
-import org.apache.solr.common.SolrInputDocument;
-import org.dspace.authority.AuthorityValue;
-import org.dspace.authority.AuthorityValueServiceImpl;
-import org.dspace.authority.PersonAuthorityValue;
-import org.dspace.authority.orcid.model.Bio;
-import org.dspace.authority.orcid.model.BioExternalIdentifier;
-import org.dspace.authority.orcid.model.BioName;
-import org.dspace.authority.orcid.model.BioResearcherUrl;
-
-/**
- * @author Antoine Snyers (antoine at atmire.com)
- * @author Kevin Van de Velde (kevin at atmire dot com)
- * @author Ben Bosman (ben at atmire dot com)
- * @author Mark Diggory (markd at atmire dot com)
- */
-public class OrcidAuthorityValue extends PersonAuthorityValue {
-
- /**
- * log4j logger
- */
- private static Logger log = Logger.getLogger(OrcidAuthorityValue.class);
-
- private String orcid_id;
- private Map> otherMetadata = new HashMap>();
- private boolean update; // used in setValues(Bio bio)
-
-
- /**
- * Creates an instance of OrcidAuthorityValue with only uninitialized fields.
- * This is meant to be filled in with values from an existing record.
- * To create a brand new OrcidAuthorityValue, use create()
- */
- public OrcidAuthorityValue() {
- }
-
- public OrcidAuthorityValue(SolrDocument document) {
- super(document);
- }
-
- public String getOrcid_id() {
- return orcid_id;
- }
-
- public void setOrcid_id(String orcid_id) {
- this.orcid_id = orcid_id;
- }
-
- public Map> getOtherMetadata() {
- return otherMetadata;
- }
-
- public void addOtherMetadata(String label, String data) {
- List strings = otherMetadata.get(label);
- if (strings == null) {
- strings = new ArrayList();
- }
- strings.add(data);
- otherMetadata.put(label, strings);
- }
-
- @Override
- public SolrInputDocument getSolrInputDocument() {
- SolrInputDocument doc = super.getSolrInputDocument();
- if (StringUtils.isNotBlank(getOrcid_id())) {
- doc.addField("orcid_id", getOrcid_id());
- }
-
- for (String t : otherMetadata.keySet()) {
- List data = otherMetadata.get(t);
- for (String data_entry : data) {
- doc.addField("label_" + t, data_entry);
- }
- }
- return doc;
- }
-
- @Override
- public void setValues(SolrDocument document) {
- super.setValues(document);
- this.orcid_id = String.valueOf(document.getFieldValue("orcid_id"));
-
- otherMetadata = new HashMap>();
- for (String fieldName : document.getFieldNames()) {
- String labelPrefix = "label_";
- if (fieldName.startsWith(labelPrefix)) {
- String label = fieldName.substring(labelPrefix.length());
- List list = new ArrayList();
- Collection