diff --git a/chrome/content/zotero/xpcom/retractions.js b/chrome/content/zotero/xpcom/retractions.js
index 590e85f17b..2d31588090 100644
--- a/chrome/content/zotero/xpcom/retractions.js
+++ b/chrome/content/zotero/xpcom/retractions.js
@@ -206,7 +206,7 @@ Zotero.Retractions = {
 			
 			// PMID
 			if (json.extra) {
-				let pmid = this._extractPMID(json.extra);
+				let pmid = this._extractExtraFields(json.extra).pmid;
 				if (pmid) {
 					valuesToCheck.push({
 						type: this.TYPE_PMID,
@@ -681,14 +681,17 @@ Zotero.Retractions = {
 	},
 	
 	_getItemPMID: function (item) {
-		// TEMP
-		return this._extractPMID(item.getField('extra')) || null;
+		return this._extractExtraFields(item.getField('extra')).pmid;
 	},
 	
 	// TEMP
-	_extractPMID: function (str) {
+	_extractExtraFields: function (str) {
+		var fields = {
+			doi: null,
+			pmid: null
+		};
 		if (!str) {
-			return false;
+			return fields;
 		}
 		var lines = str.split(/\n+/g);
 		for (let line of lines) {
@@ -705,11 +708,18 @@ Zotero.Retractions = {
 				.replace(/{:([^:]+):([^}]+)}/);
 			value = value.trim();
 			
-			if (field == 'pmid' || field == 'pubmedid') {
-				return value;
+			if (field == 'doi' && !fields.doi) {
+				fields.doi = value;
+			}
+			else if ((field == 'pmid' || field == 'pubmedid') && !fields.pmid) {
+				fields.pmid = value;
+			}
+			
+			if (fields.doi && fields.pmid) {
+				break;
 			}
 		}
-		return false;
+		return fields;
 	},
 	
 	_valueToKey: function (type, value) {
@@ -747,54 +757,61 @@ Zotero.Retractions = {
 	},
 	
 	_cacheKeyMappings: async function () {
-		await this._cacheDOIMappings();
-		await this._cachePMIDMappings();
-	},
-	
-	_cacheDOIMappings: async function () {
 		this._keyItems[this.TYPE_DOI] = new Map();
 		this._itemKeys[this.TYPE_DOI] = new Map();
-		
-		var sql = "SELECT itemID AS id, value FROM itemData "
-			+ "JOIN itemDataValues USING (valueID) WHERE fieldID=?";
-		var rows = await Zotero.DB.queryAsync(sql, Zotero.ItemFields.getID('DOI'));
-		for (let row of rows) {
-			let value = Zotero.Utilities.cleanDOI(row.value);
-			if (!value) continue;
-			this._addItemKeyMapping(this.TYPE_DOI, value, row.id);
-		}
-		
-		// Extract from Extract field
-		sql = "SELECT itemID AS id, value FROM itemData "
-			+ "JOIN itemDataValues USING (valueID) WHERE fieldID=?";
-		rows = await Zotero.DB.queryAsync(sql, Zotero.ItemFields.getID('extra'));
-		for (let row of rows) {
-			let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value);
-			let doi = fields.get('DOI');
-			if (!doi) continue;
-			let value = Zotero.Utilities.cleanDOI(doi);
-			if (!value) continue;
-			this._addItemKeyMapping(this.TYPE_DOI, value, row.id);
-		}
-	},
-	
-	_cachePMIDMappings: async function () {
 		this._keyItems[this.TYPE_PMID] = new Map();
 		this._itemKeys[this.TYPE_PMID] = new Map();
 		
-		var sql = "SELECT itemID AS id, value FROM itemData "
-			+ "JOIN itemDataValues USING (valueID) WHERE fieldID=?";
-		var rows = await Zotero.DB.queryAsync(sql, Zotero.ItemFields.getID('extra'));
+		var doiFieldID = Zotero.ItemFields.getID('DOI');
+		var extraFieldID = Zotero.ItemFields.getID('extra');
+		
+		var sql = "SELECT itemID AS id, fieldID, value FROM itemData "
+			+ "JOIN itemDataValues USING (valueID) WHERE fieldID IN (?, ?)";
+		var rows = await Zotero.DB.queryAsync(
+			sql,
+			[
+				doiFieldID,
+				extraFieldID
+			]
+		);
+		
 		for (let row of rows) {
-			/*
-			let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value);
-			let pmid = fields.get('pmid') || fields.get('pubmedID');
-			if (!pmid) continue;
-			this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id);
-			*/
-			let pmid = this._extractPMID(row.value);
-			if (!pmid) continue;
-			this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id);
+			// DOI field
+			if (row.fieldID == doiFieldID) {
+				let value = Zotero.Utilities.cleanDOI(row.value);
+				if (value) {
+					this._addItemKeyMapping(this.TYPE_DOI, value, row.id);
+				}
+			}
+			// Extra field
+			else {
+				// DOI
+				/*
+				let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value);
+				let doi = fields.get('DOI');
+				if (!doi) continue;
+				*/
+				let { doi, pmid } = this._extractExtraFields(row.value);
+				
+				if (doi) {
+					let value = Zotero.Utilities.cleanDOI(doi);
+					if (value) {
+						this._addItemKeyMapping(this.TYPE_DOI, value, row.id);
+					}
+				}
+				
+				// PMID
+				/*
+				let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value);
+				let pmid = fields.get('pmid') || fields.get('pubmedID');
+				if (!pmid) continue;
+				this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id);
+				*/
+				//let pmid = this._extractPMID(row.value);
+				if (pmid) {
+					this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id);
+				}
+			}
 		}
 	},
 	
diff --git a/test/tests/retractionsTest.js b/test/tests/retractionsTest.js
index 7926299d29..c1948db782 100644
--- a/test/tests/retractionsTest.js
+++ b/test/tests/retractionsTest.js
@@ -258,6 +258,17 @@ describe("Retractions", function() {
 			var indexes = await Zotero.Retractions.getRetractionsFromJSON(json);
 			assert.sameMembers(indexes, [0]);
 		});
+		
+		it("should identify object with retracted DOI on subsequent line in Extra", async function () {
+			var json = [
+				{
+					extra: `Foo: Bar\nDOI: ${retractedDOI}`
+				}
+			];
+			
+			var indexes = await Zotero.Retractions.getRetractionsFromJSON(json);
+			assert.sameMembers(indexes, [0]);
+		});
 	});