diff --git a/server/auth-orcid/fetchUserDetails.js b/server/auth-orcid/fetchUserDetails.js
index bb88a45dac458b2b0b500bf71a52f9d13f962159..cfce4282d7cadedce9409b9c5a21af4ff179ba17 100644
--- a/server/auth-orcid/fetchUserDetails.js
+++ b/server/auth-orcid/fetchUserDetails.js
@@ -1,15 +1,19 @@
 const superagent = require('superagent')
 const _ = require('lodash')
 const logger = require('@pubsweet/logger')
+const { Identity } = require('@pubsweet/models')
 
-const apiRoot = 'https://api.sandbox.orcid.org/v2.1'
+const apiRoot =
+  process.env.NODE_ENV === 'production'
+    ? 'https://pub.orcid.org/v3.0'
+    : 'https://pub.sandbox.orcid.org/v3.0'
 
 // request data from orcid API
-const request = (user, endpoint) =>
+const request = (identity, endpoint) =>
   superagent
-    .get(`${apiRoot}/${user.orcid}/${endpoint}`)
+    .get(`${apiRoot}/${identity.identifier}/${endpoint}`)
     .set('Accept', 'application/json')
-    .set('Authorization', `Bearer ${user.oauth.accessToken}`)
+    .set('Authorization', `Bearer ${identity.oauth.accessToken}`)
 
 // convert API date object into Date
 const toDate = date => {
@@ -22,10 +26,15 @@ const toDate = date => {
 }
 
 module.exports = async user => {
+  const identity = await Identity.query().findOne({
+    userId: user.id,
+    type: 'orcid',
+  })
+
   logger.debug('processing response from orcid api')
   const [personResponse, employmentsResponse] = await Promise.all([
-    request(user, 'person'),
-    request(user, 'employments'),
+    request(identity, 'person'),
+    request(identity, 'employments'),
   ])
 
   const firstName = _.get(personResponse, 'body.name.given-names.value')
@@ -33,16 +42,18 @@ module.exports = async user => {
   const email = _.get(personResponse, 'body.emails.email[0].email')
 
   const employments = _.get(employmentsResponse, 'body.employment-summary')
-  const institution = employments.length
-    ? // sort by most recently ended
-      employments
-        .sort((a, b) => toDate(a['end-date']) - toDate(b['end-date']))
-        .pop().organization.name
-    : null
+
+  const institution =
+    employments && employments.length
+      ? // sort by most recently ended
+        employments
+          .sort((a, b) => toDate(a['end-date']) - toDate(b['end-date']))
+          .pop().organization.name
+      : null
 
   logger.debug(`fetchUserDetails returning:
     first: ${firstName},
-    last: ${lastName}
+    last: ${lastName},
     email: ${email},
     institution: ${institution}`)
   return {
diff --git a/server/auth-orcid/orcid.js b/server/auth-orcid/orcid.js
index ae2889d044f3cd457bbbce40f35b3278c2f6832a..d0ef6cb5d2e49ae10bd076a9af84ac2489b02a6c 100644
--- a/server/auth-orcid/orcid.js
+++ b/server/auth-orcid/orcid.js
@@ -2,7 +2,7 @@ const passport = require('passport')
 const OrcidStrategy = require('passport-orcid')
 const config = require('config')
 const authentication = require('pubsweet-server/src/authentication')
-
+const fetchUserDetails = require('./fetchUserDetails')
 const CALLBACK_URL = '/auth/orcid/callback'
 
 module.exports = app => {
@@ -46,6 +46,13 @@ module.exports = app => {
                 isDefault: true,
               },
             }).saveGraph()
+
+            // Do another request to the ORCID API for aff/name
+            const userDetails = await fetchUserDetails(user)
+
+            user.defaultIdentity.name = `${userDetails.firstName} ${userDetails.lastName}`
+            user.defaultIdentity.aff = userDetails.institution
+            user.saveGraph()
           }
         } catch (err) {
           done(err)
diff --git a/server/model-user/src/graphql.js b/server/model-user/src/graphql.js
index d9d312acb879ecd39fcc2bddbb8c3383e07da89d..ae71cd4aa39a3e09c548967a13de9a9239d6d357 100644
--- a/server/model-user/src/graphql.js
+++ b/server/model-user/src/graphql.js
@@ -203,14 +203,8 @@ const typeDefs = `
     online: Boolean
   }
 
-  type Name {
-    surname: String
-    givenNames: String
-    title: String
-  }
-
   interface Identity {
-    name: Name
+    name: String
     aff: String # JATS <aff>
     email: String # JATS <aff>
     type: String
@@ -220,14 +214,14 @@ const typeDefs = `
 
   # local identity (not from ORCID, etc.)
   type LocalIdentity implements Identity {
-    name: Name
+    name: String
     email: String
     aff: String
     type: String
   }
 
   type ExternalIdentity implements Identity {
-    name: Name
+    name: String
     identifier: String
     email: String
     aff: String
@@ -263,6 +257,16 @@ const typeDefs = `
     username: String!
     password: String!
   }
+
+  # Common types
+  scalar DateTime
+
+  interface Object {
+    id: ID!
+    created: DateTime!
+    updated: DateTime
+  }
+
 `
 
 module.exports = { resolvers, typeDefs }
diff --git a/server/model-user/src/migrations/1592915682-change-identities-constraint.sql b/server/model-user/src/migrations/1592915682-change-identities-constraint.sql
new file mode 100644
index 0000000000000000000000000000000000000000..29ad1b5ed0cb3a24800788b949766efec0213b77
--- /dev/null
+++ b/server/model-user/src/migrations/1592915682-change-identities-constraint.sql
@@ -0,0 +1,6 @@
+alter table identities
+drop constraint identities_user_id_fkey,
+add constraint sidentities_user_id_fkey
+   foreign key (user_id)
+   references users(id)
+   on delete cascade;
\ No newline at end of file