diff --git a/chrome/content/zotero-platform/mac/overlay.css b/chrome/content/zotero-platform/mac/overlay.css
index ee9a7839d..ace263648 100644
--- a/chrome/content/zotero-platform/mac/overlay.css
+++ b/chrome/content/zotero-platform/mac/overlay.css
@@ -107,6 +107,16 @@
 	margin-left: 7px;
 }
 
+@media (min-resolution: 1.5dppx) {
+	#zotero-pane .toolbarbutton-icon {
+		max-width: 28px;
+	}
+	
+	#zotero-tb-sync-error .toolbarbutton-icon {
+		width: 16px;
+	}
+}
+
 .zotero-tb-button, .zotero-tb-button:first-child, .zotero-tb-button:last-child {
   -moz-margin-start: 0 !important;
   -moz-margin-end: 3px !important;
@@ -169,7 +179,7 @@
 	background-size: 14px;
 }
 
-@media (min-resolution: 2dppx) {
+@media (min-resolution: 1.5dppx) {
 	#zotero-pane-stack[oldsearchfield] textbox[type=search] > .textbox-input-box {
 		background: url("chrome://zotero/skin/mac/moz/Search@2x.png") left no-repeat;
 		background-size: 14px;
@@ -467,6 +477,16 @@ treechildren::-moz-tree-image {
 	list-style-image: url('chrome://zotero/skin/mac/toolbar-note-add.png');
 }
 
+@media (min-resolution: 1.5dppx) {
+	#zotero-tb-advanced-search {
+		list-style-image: url('chrome://zotero/skin/mac/toolbar-advanced-search@2x.png');
+	}
+	
+	#zotero-tb-note-add {
+		list-style-image: url('chrome://zotero/skin/mac/toolbar-note-add@2x.png');
+	}
+}
+
 #zotero-tb-actions-menu
 {
 	list-style-image: url('chrome://zotero/skin/mac/cog.png');
diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css
index 5518adfb4..3500fe859 100644
--- a/chrome/content/zotero-platform/unix/overlay.css
+++ b/chrome/content/zotero-platform/unix/overlay.css
@@ -1,12 +1,21 @@
-/*
+/*
  As of Fx36, the built-in styles don't properly handle a menu-button within combined buttons.
 */
+#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon,
+#zotero-toolbar-save-button-single[cui-areatype="toolbar"] .toolbarbutton-icon {
+	width: 32px;
+}
+
+#zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon,
+#zotero-toolbar-save-button[cui-areatype="toolbar"] .toolbarbutton-icon {
+	width: 28px;
+}
+
 #zotero-toolbar-main-button[cui-areatype="toolbar"] {
 	margin-right: -1px;
 }
 
 #zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon {
-	width: 28px !important;
 	margin-left: 2px;
 	margin-right: -3px;
 	padding-left: 5px !important;
@@ -26,16 +35,6 @@
 	padding-right: 6px !important;
 }
 
-#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker {
-	margin-top: 2px;
-	margin-bottom: 2px;
-}
-
-#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker .dropmarker-icon {
-	padding-left: 14px !important;
-	padding-right: 3px !important;
-}
-
 #zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker {
 	margin-top: 6px;
 	margin-bottom: 6px;
@@ -47,6 +46,16 @@
 	margin-bottom: 0;
 }
 
+#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker .dropmarker-icon {
+	padding-left: 14px !important;
+	padding-right: 3px !important;
+}
+
+#zotero-toolbar-save-button-single[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon {
+	margin-top: 3px;
+	margin-bottom: 3px;
+}
+
 #zotero-toolbar-buttons[cui-areatype="toolbar"] > separator {
 	/* Copied from .toolbarbutton-menubutton-dropmarker::before */
 	display: -moz-box;
@@ -86,13 +95,19 @@
 	box-shadow: var(--toolbarbutton-active-boxshadow);
 	transition-duration: 10ms;
 }
-
-#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon {
-	width: 32px;
-}
 /* End toolbar buttons */
 
 
+@media (min-resolution: 1.5dppx) {
+	#zotero-toolbar .toolbarbutton-icon {
+		width: 16px;
+	}
+	
+	#zotero-tb-sync > .toolbarbutton-icon {
+		width: 20px;
+	}
+}
+
 .zotero-tb-button:not([type=menu]) {
 	margin-right: 4px;
 }
diff --git a/chrome/content/zotero-platform/unix/treesource-collection.png b/chrome/content/zotero-platform/unix/treesource-collection.png
deleted file mode 100644
index 784e8fa48..000000000
Binary files a/chrome/content/zotero-platform/unix/treesource-collection.png and /dev/null differ
diff --git a/chrome/content/zotero-platform/unix/treesource-search.png b/chrome/content/zotero-platform/unix/treesource-search.png
deleted file mode 100644
index 0ba939184..000000000
Binary files a/chrome/content/zotero-platform/unix/treesource-search.png and /dev/null differ
diff --git a/chrome/content/zotero-platform/win/overlay.css b/chrome/content/zotero-platform/win/overlay.css
index 73eb1ff8b..756291aee 100644
--- a/chrome/content/zotero-platform/win/overlay.css
+++ b/chrome/content/zotero-platform/win/overlay.css
@@ -1,12 +1,24 @@
-/*
+/*
  As of Fx36, the built-in styles don't properly handle a menu-button within combined buttons.
 */
+#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon {
+	width: 32px;
+}
+
+#zotero-toolbar-save-button-single[cui-areatype="toolbar"] .toolbarbutton-icon {
+	width: 30px;
+}
+
+#zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon,
+#zotero-toolbar-save-button[cui-areatype="toolbar"] .toolbarbutton-icon {
+	width: 28px;
+}
+
 #zotero-toolbar-main-button[cui-areatype="toolbar"] {
 	margin-right: -1px !important;
 }
 
 #zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon {
-	width: 28px;
 	margin-left: 2px;
 	margin-right: -1px;
 	padding-left: 5px !important;
@@ -94,12 +106,18 @@
 #zotero-toolbar-save-button[cui-areatype="toolbar"] > menupopup {
 	margin-top: -5px;
 }
-
-#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon {
-	width: 32px;
-}
 /* End toolbar buttons */
 
+@media (min-resolution: 1.5dppx) {
+	#zotero-toolbar .toolbarbutton-icon {
+		width: 16px;
+	}
+	
+	#zotero-tb-sync > .toolbarbutton-icon {
+		width: 20px;
+	}
+}
+
 #zotero-tb-search-menu-button {
 	margin: 0 -1px 0 -4px;
 	border: 0;
diff --git a/chrome/content/zotero-platform/win/treesource-collection.png b/chrome/content/zotero-platform/win/treesource-collection.png
deleted file mode 100644
index 784e8fa48..000000000
Binary files a/chrome/content/zotero-platform/win/treesource-collection.png and /dev/null differ
diff --git a/chrome/content/zotero-platform/win/treesource-search.png b/chrome/content/zotero-platform/win/treesource-search.png
deleted file mode 100644
index 0ba939184..000000000
Binary files a/chrome/content/zotero-platform/win/treesource-search.png and /dev/null differ
diff --git a/chrome/content/zotero/about.xul b/chrome/content/zotero/about.xul
index 08906ccd8..6f63f2e12 100644
--- a/chrome/content/zotero/about.xul
+++ b/chrome/content/zotero/about.xul
@@ -61,6 +61,7 @@
 					<label class="zotero-text-link" href="http://p.yusukekamiyamane.com/" value="Fugue icons (by Yusuke Kamiyamane)"/>
 					<label class="zotero-text-link" href="http://www.davidashen.net/rnv.html" value="RNV (CSL validation)"/>
 					<label class="zotero-text-link" href="http://documentup.com/kriskowal/q/" value="Q (by Kristopher Michael Kowal)"/>
+					<label class="zotero-text-link" href="https://codefisher.org/pastel-svg/" value="Pastel SVG icons (by Michael Buckley)"/>
 					<label class="zotero-text-link" href="http://www.famfamfam.com/lab/icons/silk/" value="Silk icons (by Mark James)"/>
 					<label class="zotero-text-link" href="http://simile.mit.edu/timeline/" value="SIMILE Project (Timeline)"/>
 					<label class="zotero-text-link" href="http://www.w3.org/2005/ajar/tab" value="Tabulator (RDF parser)"/>
diff --git a/chrome/content/zotero/advancedSearch.js b/chrome/content/zotero/advancedSearch.js
index 28317cc9f..f60f9f699 100644
--- a/chrome/content/zotero/advancedSearch.js
+++ b/chrome/content/zotero/advancedSearch.js
@@ -63,16 +63,7 @@ var ZoteroAdvancedSearch = new function() {
 			isSearchMode: function() { return true; },
 			getItems: Zotero.Promise.coroutine(function* () {
 				var search = yield _searchBox.search.clone();
-				
-				// Hack to create a condition for the search's library --
-				// this logic should really go in the search itself instead of here
-				// and in collectionTreeView.js
-				yield search.loadPrimaryData();
-				var conditions = search.getSearchConditions();
-				if (!conditions.some(function (condition) condition.condition == 'libraryID')) {
-					yield search.addCondition('libraryID', 'is', _searchBox.search.libraryID);
-				}
-				
+				search.libraryID = _libraryID;
 				var ids = yield search.search();
 				return Zotero.Items.get(ids);
 			}),
diff --git a/chrome/content/zotero/bindings/merge.xml b/chrome/content/zotero/bindings/merge.xml
index 2e7d61c17..85499ed07 100644
--- a/chrome/content/zotero/bindings/merge.xml
+++ b/chrome/content/zotero/bindings/merge.xml
@@ -124,6 +124,8 @@
 			<property name="rightpane" onget="return this._rightpane"/>
 			<property name="mergepane" onget="return this._mergepane"/>
 			
+			<property name="onSelectionChange"/>
+			
 			<field name="_leftpane"/>
 			<field name="_rightpane"/>
 			<field name="_mergepane"/>
@@ -397,6 +399,10 @@
 					else {
 						mergepane.ref = pane.original;
 					}
+					
+					if (mergegroup.onSelectionChange) {
+						mergegroup.onSelectionChange();
+					}
 				]]>
 				</body>
 			</method>
diff --git a/chrome/content/zotero/browser.js b/chrome/content/zotero/browser.js
index 9a18121fa..134b86089 100644
--- a/chrome/content/zotero/browser.js
+++ b/chrome/content/zotero/browser.js
@@ -898,7 +898,7 @@ Zotero_Browser.Tab.prototype.getCaptureIcon = function (hiDPI) {
 	case this.CAPTURE_STATE_TRANSLATABLE:
 		var itemType = this.page.translators[0].itemType;
 		return (itemType === "multiple"
-				? "chrome://zotero/skin/treesource-collection.png"
+				? "chrome://zotero/skin/treesource-collection" + suffix + ".png"
 				: Zotero.ItemTypes.getImageSrc(itemType));
 	
 	// TODO: Show icons for images, PDFs, etc.?
diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js
index 8b3f53830..401d32b2e 100644
--- a/chrome/content/zotero/integration/quickFormat.js
+++ b/chrome/content/zotero/integration/quickFormat.js
@@ -318,21 +318,21 @@ var Zotero_QuickFormat = new function () {
 					Zotero.debug("Searched cited items");
 				}
 				
-				_updateItemList(citedItems, citedItemsMatchingSearch, searchResultIDs, isAsync);
+				_updateItemList(citedItems, citedItemsMatchingSearch, str, searchResultIDs, isAsync);
 			}).done();
 			
 			if(!completed) {
 				// We are going to have to wait until items have been retrieved from the document.
 				// Until then, show item list without cited items.
 				Zotero.debug("Getting cited items asynchronously");
-				_updateItemList(false, false, searchResultIDs);
+				_updateItemList(false, false, str, searchResultIDs);
 				isAsync = true;
 			} else {
 				Zotero.debug("Got cited items synchronously");
 			}
 		} else {
 			// No search conditions, so just clear the box
-			_updateItemList([], [], []);
+			_updateItemList([], [], "", []);
 		}
 	}
 	
@@ -353,7 +353,7 @@ var Zotero_QuickFormat = new function () {
 	/**
 	 * Updates the item list
 	 */
-	function _updateItemList(citedItems, citedItemsMatchingSearch, searchResultIDs, preserveSelection) {
+	function _updateItemList(citedItems, citedItemsMatchingSearch, searchString, searchResultIDs, preserveSelection) {
 		var selectedIndex = 1, previousItemID;
 		
 		// Do this so we can preserve the selected item after cited items have been loaded
@@ -411,7 +411,25 @@ var Zotero_QuickFormat = new function () {
 		if(searchResultIDs.length && (!citedItemsMatchingSearch || citedItemsMatchingSearch.length < 50)) {
 			var items = Zotero.Items.get(searchResultIDs);
 			
+			searchString = searchString.toLowerCase();
+			var collation = Zotero.getLocaleCollation();
+			
 			items.sort(function _itemSort(a, b) {
+				var firstCreatorA = a.firstCreator, firstCreatorB = b.firstCreator;
+				
+				// Favor left-bound name matches (e.g., "Baum" < "Appelbaum"),
+				// using last name of first author
+				if (firstCreatorA && firstCreatorB) {
+					let caStartsWith = firstCreatorA.toLowerCase().indexOf(searchString) == 0;
+					let cbStartsWith = firstCreatorB.toLowerCase().indexOf(searchString) == 0;
+					if (caStartsWith && !cbStartsWith) {
+						return -1;
+					}
+					else if (!caStartsWith && cbStartsWith) {
+						return 1;
+					}
+				}
+				
 				var libA = a.libraryID, libB = b.libraryID;
 				if(libA !== libB) {
 					// Sort by number of cites for library
@@ -430,12 +448,12 @@ var Zotero_QuickFormat = new function () {
 				}
 			
 				// Sort by last name of first author
-				var creatorsA = a.getCreators(), creatorsB = b.getCreators(),
-					caExists = creatorsA.length ? 1 : 0, cbExists = creatorsB.length ? 1 : 0;
-				if(caExists !== cbExists) {
-					return cbExists-caExists;
-				} else if(caExists) {
-					return creatorsA[0].ref.lastName.localeCompare(creatorsB[0].ref.lastName);
+				if (firstCreatorA !== "" && firstCreatorB === "") {
+					return -1;
+				} else if (firstCreatorA === "" && firstCreatorB !== "") {
+					return 1
+				} else if (firstCreatorA) {
+					return collation.compareString(1, firstCreatorA, firstCreatorB);
 				}
 				
 				// Sort by date
diff --git a/chrome/content/zotero/itemPane.xul b/chrome/content/zotero/itemPane.xul
index b36d50ba0..4b6c35a5a 100644
--- a/chrome/content/zotero/itemPane.xul
+++ b/chrome/content/zotero/itemPane.xul
@@ -24,7 +24,6 @@
     ***** END LICENSE BLOCK *****
 -->
 <?xml-stylesheet href="chrome://zotero/skin/itemPane.css" type="text/css"?>
-<?xml-stylesheet href="chrome://zotero-platform/content/itemPane.css" type="text/css"?>
 
 <!DOCTYPE window SYSTEM "chrome://zotero/locale/zotero.dtd">
 
diff --git a/chrome/content/zotero/merge.js b/chrome/content/zotero/merge.js
index 1939454a8..5af038222 100644
--- a/chrome/content/zotero/merge.js
+++ b/chrome/content/zotero/merge.js
@@ -62,6 +62,7 @@ var Zotero_Merge_Window = new function () {
 		}
 		
 		_mergeGroup.type = _io.dataIn.type;
+		_mergeGroup.onSelectionChange = _updateResolveAllCheckbox;
 		
 		switch (_mergeGroup.type) {
 			case 'item':
@@ -78,6 +79,8 @@ var Zotero_Merge_Window = new function () {
 		_mergeGroup.rightCaption = _io.dataIn.captions[1];
 		_mergeGroup.mergeCaption = _io.dataIn.captions[2];
 		
+		_resolveAllCheckbox = document.getElementById('resolve-all');
+		
 		_numObjects = document.getElementById('zotero-merge-num-objects');
 		document.getElementById('zotero-merge-total-objects').value = _objects.length;
 		
@@ -101,8 +104,15 @@ var Zotero_Merge_Window = new function () {
 		
 		// Restore previously merged object into merge pane
 		_mergeGroup.merge = _merged[_pos].ref;
-		_mergeGroup.leftpane.removeAttribute("selected");
-		_mergeGroup.rightpane.removeAttribute("selected");
+		if (_merged[_pos].id == _mergeGroup.left.id) {
+			_mergeGroup.leftpane.setAttribute("selected", "true");
+			_mergeGroup.rightpane.removeAttribute("selected");
+		}
+		else {
+			_mergeGroup.leftpane.removeAttribute("selected");
+			_mergeGroup.rightpane.setAttribute("selected", "true");
+		}
+		_updateResolveAllCheckbox();
 		
 		if (_mergeGroup.type == 'item') {
 			_updateChangedCreators();
@@ -125,7 +135,7 @@ var Zotero_Merge_Window = new function () {
 	
 	
 	function onNext() {
-		if (_pos + 1 == _objects.length) {
+		if (_pos + 1 == _objects.length || _resolveAllCheckbox.checked) {
 			return true;
 		}
 		
@@ -160,43 +170,17 @@ var Zotero_Merge_Window = new function () {
 			return;
 		}
 		
+		_updateResolveAllCheckbox();
+		
 		if (_mergeGroup.type == 'item') {
 			_updateChangedCreators();
 		}
 		
-		// On Windows the buttons don't move when one is hidden
-		if ((_pos + 1) != _objects.length) {
-			var nextButton = _wizard.getButton("next");
-			
-			if (Zotero.isMac) {
-				nextButton.setAttribute("hidden", "false");
-				_wizard.getButton("finish").setAttribute("hidden", "true");
-			}
-			else {
-				var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons");
-				var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck");
-				deck.selectedIndex = 1;
-			}
-			
-			_setInstructionsString(nextButton.label);
+		if (_isLastConflict()) {
+			_showFinishButton();
 		}
-		// Last object
 		else {
-			var finishButton = _wizard.getButton("finish");
-			
-			if (Zotero.isMac) {
-				_wizard.getButton("next").setAttribute("hidden", "true");
-				finishButton.setAttribute("hidden", "false");
-			}
-			// Windows uses a deck to switch between the Next and Finish buttons
-			// TODO: check Linux
-			else {
-				var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons");
-				var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck");
-				deck.selectedIndex = 0;
-			}
-			
-			_setInstructionsString(finishButton.label);
+			_showNextButton();
 		}
 		
 		return false;
@@ -204,7 +188,20 @@ var Zotero_Merge_Window = new function () {
 	
 	
 	function onFinish() {
-		_merged[_pos] = _getCurrentMergeObject();
+		// If using one side for all remaining, update merge object
+		if (!_isLastConflict() && _resolveAllCheckbox.checked) {
+			let useRemote = _mergeGroup.rightpane.getAttribute("selected") == "true";
+			for (let i = _pos; i < _objects.length; i++) {
+				_merged[i] = _getMergeObject(
+					_objects[i][useRemote ? 1 : 0],
+					_objects[i][0],
+					_objects[i][1]
+				);
+			}
+		}
+		else {
+			_merged[_pos] = _getCurrentMergeObject();
+		}
 		
 		_io.dataOut = _merged;
 		return true;
@@ -216,21 +213,86 @@ var Zotero_Merge_Window = new function () {
 	}
 	
 	
-	function _getCurrentMergeObject() {
-		var id = _mergeGroup.merge == 'deleted' ?
-			(_mergeGroup.left == 'deleted'
-				? _mergeGroup.right.id : _mergeGroup.left.id)
-			: _mergeGroup.merge.id;
+	this.onResolveAllChange = function (resolveAll) {
+		if (resolveAll || _isLastConflict()) {
+			_showFinishButton();
+		}
+		else {
+			_showNextButton();
+		}
+	}
+	
+	function _updateResolveAllCheckbox() {
+		if (_mergeGroup.rightpane.getAttribute("selected") == 'true') {
+			var label = 'sync.merge.resolveAllRemote';
+		}
+		else {
+			var label = 'sync.merge.resolveAllLocal';
+		}
+		_resolveAllCheckbox.label = Zotero.getString(label);
+	}
+	
+	
+	function _isLastConflict() {
+		return (_pos + 1) == _objects.length;
+	}
+	
+	
+	function _showNextButton() {
+		var nextButton = _wizard.getButton("next");
+		
+		if (Zotero.isMac) {
+			nextButton.setAttribute("hidden", "false");
+			_wizard.getButton("finish").setAttribute("hidden", "true");
+		}
+		else {
+			var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons");
+			var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck");
+			deck.selectedIndex = 1;
+		}
+		
+		_setInstructionsString(nextButton.label);
+	}
+	
+	
+	function _showFinishButton() {
+		var finishButton = _wizard.getButton("finish");
+		
+		if (Zotero.isMac) {
+			_wizard.getButton("next").setAttribute("hidden", "true");
+			finishButton.setAttribute("hidden", "false");
+		}
+		// Windows uses a deck to switch between the Next and Finish buttons
+		// TODO: check Linux
+		else {
+			var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons");
+			var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck");
+			deck.selectedIndex = 0;
+		}
+		
+		_setInstructionsString(finishButton.label);
+	}
+	
+	
+	function _getMergeObject(ref, left, right) {
+		var id = ref == 'deleted'
+			? (left == 'deleted' ? right.id : left.id)
+			: ref.id;
 		
 		return {
 			id: id,
-			ref: _mergeGroup.merge,
-			left: _mergeGroup.left,
-			right: _mergeGroup.right
+			ref: ref,
+			left: left,
+			right: right
 		};
 	}
 	
 	
+	function _getCurrentMergeObject() {
+		return _getMergeObject(_mergeGroup.merge, _mergeGroup.left, _mergeGroup.right);
+	}
+	
+	
 	// Hack to support creator reconciliation via item view
 	function _updateChangedCreators() {
 		if (_mergeGroup.type != 'item') {
diff --git a/chrome/content/zotero/merge.xul b/chrome/content/zotero/merge.xul
index 608f33fba..f15dffb64 100644
--- a/chrome/content/zotero/merge.xul
+++ b/chrome/content/zotero/merge.xul
@@ -48,10 +48,18 @@
 		<description id="zotero-merge-instructions"/>
 		<zoteromergegroup flex="1"/>
 		<separator class="thin"/>
-		<hbox id="zotero-step-count">
-			<label id="zotero-merge-num-objects"/>
-			<label value="&zotero.merge.of;"/>
-			<label id="zotero-merge-total-objects"/>
+		<hbox align="center">
+			<separator orient="vertical" flex="1"/>
+			<hbox>
+				<checkbox id="resolve-all"
+					oncommand="Zotero_Merge_Window.onResolveAllChange(this.checked)"/>
+			</hbox>
+			<separator orient="vertical"/>
+			<hbox id="zotero-step-count">
+				<label id="zotero-merge-num-objects"/>
+				<label value="&zotero.merge.of;"/>
+				<label id="zotero-merge-total-objects"/>
+			</hbox>
 		</hbox>
 	</wizardpage>
 </wizard>
diff --git a/chrome/content/zotero/preferences/preferences_advanced.js b/chrome/content/zotero/preferences/preferences_advanced.js
index 255ec78ed..f99e41d10 100644
--- a/chrome/content/zotero/preferences/preferences_advanced.js
+++ b/chrome/content/zotero/preferences/preferences_advanced.js
@@ -733,9 +733,16 @@ Zotero_Preferences.Debug_Output = {
 				}
 			};
 			try {
-				req.sendAsBinary(data);
+				// Send binary data
+				let numBytes = data.length, ui8Data = new Uint8Array(numBytes);
+				for (let i = 0; i < numBytes; i++) {
+					ui8Data[i] = data.charCodeAt(i) & 0xff;
+				}
+				req.send(ui8Data);
 			}
 			catch (e) {
+				Zotero.debug(e, 1);
+				Components.utils.reportError(e);
 				ps.alert(
 					null,
 					Zotero.getString('general.error'),
diff --git a/chrome/content/zotero/preferences/preferences_search.js b/chrome/content/zotero/preferences/preferences_search.js
index 1675a6c2f..84469e7fa 100644
--- a/chrome/content/zotero/preferences/preferences_search.js
+++ b/chrome/content/zotero/preferences/preferences_search.js
@@ -162,97 +162,135 @@ Zotero_Preferences.Search = {
 	 * if a newer version is available
 	 */
 	checkPDFToolsDownloadVersion: function () {
-		var url = Zotero.Fulltext.pdfToolsDownloadBaseURL
-					+ Zotero.platform.replace(' ', '-') + '.latest';
+		var url = Zotero.Fulltext.pdfToolsDownloadBaseURL + 'latest.json';
 		
 		// Find latest version for this platform
 		var self = this;
 		var sent = Zotero.HTTP.doGet(url, function (xmlhttp) {
 			try {
-				if (xmlhttp.status == 200) {
-					var converterIsRegistered = Zotero.Fulltext.pdfConverterIsRegistered();
-					var infoIsRegistered = Zotero.Fulltext.pdfInfoIsRegistered();
-					var bothRegistered = converterIsRegistered && infoIsRegistered;
-					
-					var converterVersion = xmlhttp.responseText.split(/\s/)[0];
-					var infoVersion = xmlhttp.responseText.split(/\s/)[1];
-					
-					var converterVersionAvailable = converterVersion &&
-						(!converterIsRegistered ||
-							Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' ||
-							converterVersion > Zotero.Fulltext.pdfConverterVersion);
-					var infoVersionAvailable = infoVersion &&
-						(!infoIsRegistered ||
-							Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' ||
-							infoVersion > Zotero.Fulltext.pdfInfoVersion);
-					var bothAvailable = converterVersionAvailable && infoVersionAvailable;
-					
-					/*
-					Zotero.debug(converterIsRegistered);
-					Zotero.debug(infoIsRegistered);
-					Zotero.debug(converterVersion);
-					Zotero.debug(infoVersion);
-					Zotero.debug(Zotero.Fulltext.pdfConverterVersion);
-					Zotero.debug(Zotero.Fulltext.pdfInfoVersion);
-					Zotero.debug(converterVersionAvailable);
-					Zotero.debug(infoVersionAvailable);
-					*/
-					
-					// Up to date -- disable update button
-					if (!converterVersionAvailable && !infoVersionAvailable) {
-						var button = document.getElementById('pdftools-update-button');
-						button.setAttribute('label', Zotero.getString('zotero.preferences.update.upToDate'));
-						button.setAttribute('disabled', true);
-					}
-					// New version available -- display update prompt
-					else {
-						var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
-								createInstance(Components.interfaces.nsIPromptService);
-						var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING)
-							+ (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL);
-						
-						var msg = Zotero.getString('zotero.preferences.search.pdf.available'
-							+ ((converterIsRegistered || infoIsRegistered) ? 'Updates' : 'Downloads'),
-							[Zotero.platform, 'zotero.org']) + '\n\n';
-						
-						if (converterVersionAvailable) {
-							let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform',
-								[Zotero.Fulltext.pdfConverterName, converterVersion]);
-							msg += '- ' + tvp + '\n';
-						}
-						if (infoVersionAvailable) {
-							let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform',
-								[Zotero.Fulltext.pdfInfoName, infoVersion]);
-							msg += '- ' + tvp + '\n';
-						}
-						msg += '\n';
-						msg += Zotero.getString('zotero.preferences.search.pdf.zoteroCanInstallVersion'
-								+ (bothAvailable ? 's' : ''));
-						
-						var index = ps.confirmEx(null,
-							converterIsRegistered ?
-								Zotero.getString('general.updateAvailable') : '',
-							msg,
-							buttonFlags,
-							converterIsRegistered ?
-								Zotero.getString('general.upgrade') :
-								Zotero.getString('general.install'),
-							null, null, null, {});
-						
-						if (index == 0) {
-							var installVersions = {
-								converter: converterVersionAvailable ?
-									converterVersion : null,
-								info: infoVersionAvailable ?
-									infoVersion : null
-							};
-							self.installPDFTools(installVersions);
-						}
-					}
+				if (xmlhttp.status != 200) {
+					throw new Error("Unexpected response code " + xmlhttp.status);
 				}
-				// Version not found for platform
-				else if (xmlhttp.status == 404) {
-					self.onPDFToolsDownloadError(404);
+				
+				var platform = Zotero.platform.replace(/\s/g, '-');
+				var json = JSON.parse(xmlhttp.responseText);
+				var latestVersion = json[platform] || json['default'];
+				
+				Zotero.debug("Latest PDF tools version for " + platform + " is " + latestVersion);
+				
+				var converterIsRegistered = Zotero.Fulltext.pdfConverterIsRegistered();
+				var infoIsRegistered = Zotero.Fulltext.pdfInfoIsRegistered();
+				var bothRegistered = converterIsRegistered && infoIsRegistered;
+				
+				// On Windows, install if not installed or anything other than 3.02a
+				if (Zotero.isWin) {
+					var converterVersionAvailable = !converterIsRegistered
+						|| Zotero.Fulltext.pdfConverterVersion != '3.02a';
+					var infoVersionAvailable = !infoIsRegistered
+						|| Zotero.Fulltext.pdfInfoVersion != '3.02a';
+					var bothAvailable = converterVersionAvailable && infoVersionAvailable;
+					latestVersion = "3.02a";
+				}
+				// Install if not installed, version unknown, outdated, or
+				// Xpdf 3.02/3.04 (to upgrade to Poppler),
+				else {
+					var converterVersionAvailable = (!converterIsRegistered ||
+							Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN'
+								|| latestVersion > Zotero.Fulltext.pdfConverterVersion
+								|| (!latestVersion.startsWith('3.02')
+									&& Zotero.Fulltext.pdfConverterVersion.startsWith('3.02'))
+								|| (!latestVersion.startsWith('3.02') && latestVersion != '3.04'
+									&& Zotero.Fulltext.pdfConverterVersion == '3.04'));
+					var infoVersionAvailable = (!infoIsRegistered ||
+							Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN'
+								|| latestVersion > Zotero.Fulltext.pdfInfoVersion
+								|| (!latestVersion.startsWith('3.02')
+									&& Zotero.Fulltext.pdfInfoVersion.startsWith('3.02'))
+								|| (!latestVersion.startsWith('3.02') && latestVersion != '3.04'
+									&& Zotero.Fulltext.pdfInfoVersion == '3.04'));
+					var bothAvailable = converterVersionAvailable && infoVersionAvailable;
+				}
+				
+				// Up to date -- disable update button
+				if (!converterVersionAvailable && !infoVersionAvailable) {
+					var button = document.getElementById('pdftools-update-button');
+					button.setAttribute('label', Zotero.getString('zotero.preferences.update.upToDate'));
+					button.setAttribute('disabled', true);
+				}
+				// New version available -- display update prompt
+				else {
+					var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
+							createInstance(Components.interfaces.nsIPromptService);
+					var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING)
+						+ (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL);
+					
+					var msg = Zotero.getString('zotero.preferences.search.pdf.available'
+						+ ((converterIsRegistered || infoIsRegistered) ? 'Updates' : 'Downloads'),
+						[Zotero.platform, 'zotero.org']) + '\n\n';
+					
+					if (converterVersionAvailable) {
+						let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform',
+							[Zotero.Fulltext.pdfConverterName, latestVersion]);
+						msg += '- ' + tvp + '\n';
+					}
+					if (infoVersionAvailable) {
+						let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform',
+							[Zotero.Fulltext.pdfInfoName, latestVersion]);
+						msg += '- ' + tvp + '\n';
+					}
+					msg += '\n';
+					msg += Zotero.getString('zotero.preferences.search.pdf.zoteroCanInstallVersion'
+							+ (bothAvailable ? 's' : ''));
+					
+					var index = ps.confirmEx(null,
+						converterIsRegistered ?
+							Zotero.getString('general.updateAvailable') : '',
+						msg,
+						buttonFlags,
+						converterIsRegistered ?
+							Zotero.getString('general.upgrade') :
+							Zotero.getString('general.install'),
+						null, null, null, {});
+					
+					if (index == 0) {
+						document.getElementById('pdftools-update-button').disabled = true;
+						var str = Zotero.getString('zotero.preferences.search.pdf.downloading');
+						document.getElementById('pdftools-update-button').setAttribute('label', str);
+						
+						if (converterVersionAvailable && infoVersionAvailable) {
+							Zotero.Fulltext.downloadPDFTool('converter', latestVersion, function (success) {
+								if (!success) {
+									self.onPDFToolsDownloadError("Error downloading pdftotext");
+									return;
+								}
+								Zotero.Fulltext.downloadPDFTool('info', latestVersion, function (success) {
+									if (!success) {
+										self.onPDFToolsDownloadError("Error downloading pdfinfo");
+										return;
+									}
+									self.updatePDFToolsStatus();
+								});
+							});
+						}
+						else if (converterVersionAvailable) {
+							Zotero.Fulltext.downloadPDFTool('converter', latestVersion, function (success) {
+								if (!success) {
+									self.onPDFToolsDownloadError("Error downloading pdftotext");
+									return;
+								}
+								self.updatePDFToolsStatus();
+							});
+						}
+						else {
+							Zotero.Fulltext.downloadPDFTool('info', latestVersion, function (success) {
+								if (!success) {
+									self.onPDFToolsDownloadError("Error downloading pdfinfo");
+									return;
+								}
+								self.updatePDFToolsStatus();
+							});
+						}
+					}
 				}
 			}
 			catch (e) {
@@ -267,135 +305,6 @@ Zotero_Preferences.Search = {
 	},
 	
 	
-	/*
-	 * Begin installation of specified PDF tools from server -- does a HEAD call to
-	 * make sure file exists and then calls downloadPDFTool() if so
-	 */
-	installPDFTools: function (installVersions) {
-		if (!installVersions) {
-			installVersions = {
-				converter: true,
-				info: true
-			};
-		}
-		
-		// We install the converter first if it's available
-		var url = Zotero.Fulltext.pdfToolsDownloadBaseURL;
-		if (installVersions.converter) {
-			var tool = 'converter';
-			var version = installVersions.converter;
-			url += Zotero.Fulltext.pdfConverterFileName + '-' + installVersions.converter;
-		}
-		else if (installVersions.info) {
-			var tool = 'info';
-			var version = installVersions.info;
-			url += Zotero.Fulltext.pdfInfoFileName + '-' + installVersions.info;
-		}
-		else {
-			return; 
-		}
-		
-		// Find latest version for this platform
-		var self = this;
-		var sent = Zotero.HTTP.doHead(url, function (xmlhttp) {
-			try {
-				if (xmlhttp.status == 200) {
-					// If doing both and on converter, chain pdfinfo
-					if (installVersions.converter && installVersions.info) {
-						self.downloadPDFTool(tool, version, function () {
-							return self.installPDFTools({ info: installVersions.info });
-						});
-					}
-					else {
-						self.downloadPDFTool(tool, version);
-					}
-				}
-				// Version not found for platform
-				else if (xmlhttp.status == 404) {
-					self.onPDFToolsDownloadError(404);
-				}
-			}
-			catch (e) {
-				self.onPDFToolsDownloadError(e);
-			}
-		});
-		
-		// Browser is offline
-		if (!sent) {
-			self.onPDFToolsDownloadError();
-		}
-	},
-	
-	
-	/*
-	 * Download and install specified PDF tool
-	 */
-	downloadPDFTool: function (tool, version, callback) {
-		var ioService = Components.classes["@mozilla.org/network/io-service;1"]
-							.getService(Components.interfaces.nsIIOService);
-		
-		if (tool == 'converter') {
-			var fileName = Zotero.Fulltext.pdfConverterFileName; 
-		}
-		else {
-			var fileName = Zotero.Fulltext.pdfInfoFileName;
-		}
-		
-		
-		var url = Zotero.Fulltext.pdfToolsDownloadBaseURL + fileName + '-' + version;
-		var uri = ioService.newURI(url, null, null);
-		
-		var file = Zotero.getZoteroDirectory();
-		file.append(fileName);
-		var fileURL = ioService.newFileURI(file);
-		
-		const nsIWBP = Components.interfaces.nsIWebBrowserPersist;
-		var wbp = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
-					.createInstance(nsIWBP);
-		
-		var self = this;
-		var progressListener = new Zotero.WebProgressFinishListener(function () {
-			// Set permissions to 755
-			if (Zotero.isMac) {
-				file.permissions = 33261;
-			}
-			else if (Zotero.isLinux) {
-				file.permissions = 493;
-			}
-			
-			// Write the version number to a file
-			var versionFile = Zotero.getZoteroDirectory();
-			versionFile.append(fileName + '.version');
-			Zotero.File.putContents(versionFile, version + '');
-			
-			Zotero.Fulltext.registerPDFTool(tool);
-			
-			// Used to install info tool after converter
-			if (callback) {
-				callback();
-			}
-			// If done
-			else {
-				self.updatePDFToolsStatus();
-			}
-		});
-		
-		/*
-		var tr = Components.classes["@mozilla.org/transfer;1"].
-			createInstance(Components.interfaces.nsITransfer);
-		tr.init(uri, fileURL, "", null, null, null, wbp);
-		*/
-		
-		document.getElementById('pdftools-update-button').disabled = true;
-		var str = Zotero.getString('zotero.preferences.search.pdf.downloading');
-		document.getElementById('pdftools-update-button').setAttribute('label', str);
-		
-		wbp.progressListener = progressListener;
-		Zotero.debug("Saving " + uri.spec + " to " + fileURL.spec);
-		Zotero.Utilities.Internal.saveURI(wbp, uri, fileURL);
-	},
-	
-	
 	onPDFToolsDownloadError: function (e) {
 		if (e == 404) {
 			var str = Zotero.getString('zotero.preferences.search.pdf.toolDownloadsNotAvailable',
diff --git a/chrome/content/zotero/recognizePDF.js b/chrome/content/zotero/recognizePDF.js
index 28df72345..8a1dabb21 100644
--- a/chrome/content/zotero/recognizePDF.js
+++ b/chrome/content/zotero/recognizePDF.js
@@ -139,13 +139,10 @@ var Zotero_RecognizePDF = new function() {
 			cacheFile.remove(false);
 		}
 		
-		var exec = Zotero.getZoteroDirectory();
-		exec.append(Zotero.Fulltext.pdfConverterFileName);
+		var {exec, args} = Zotero.Fulltext.getPDFConverterExecAndArgs();
+		args.push('-enc', 'UTF-8', '-nopgbrk', '-layout', '-l', pages, file.path, cacheFile.path);
 		
-		var args = ['-enc', 'UTF-8', '-nopgbrk', '-layout', '-l', pages];
-		args.push(file.path, cacheFile.path);
-		
-		Zotero.debug('RecognizePDF: Running pdftotext '+args.join(" "));
+		Zotero.debug("RecognizePDF: Running " + exec.path + " " + args.map(arg => "'" + arg + "'").join(" "));
 		
 		return Zotero.Utilities.Internal.exec(exec, args).then(function() {
 			if(!cacheFile.exists()) {
diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js
index fa6bc2ba3..2e3d625a6 100644
--- a/chrome/content/zotero/xpcom/collectionTreeView.js
+++ b/chrome/content/zotero/xpcom/collectionTreeView.js
@@ -492,13 +492,16 @@ Zotero.CollectionTreeView.prototype.getImageSrc = function(row, col)
 		
 		case 'collection':
 		case 'search':
-			return "chrome://zotero-platform/content/treesource-" + collectionType + ".png";
+			if (Zotero.isMac) {
+				return "chrome://zotero-platform/content/treesource-" + collectionType + ".png";
+			}
+			break;
 		
 		case 'publications':
 			return "chrome://zotero/skin/treeitem-journalArticle" + suffix + ".png";
 	}
 	
-	return "chrome://zotero/skin/treesource-" + collectionType + ".png";
+	return "chrome://zotero/skin/treesource-" + collectionType + suffix + ".png";
 }
 
 Zotero.CollectionTreeView.prototype.isContainer = function(row)
@@ -2254,21 +2257,6 @@ Zotero.CollectionTreeRow.prototype.getSearchResults = Zotero.Promise.coroutine(f
 	
 	if(!Zotero.CollectionTreeCache.lastResults) {
 		var s = yield this.getSearchObject();
-		
-		// FIXME: Hack to exclude group libraries for now
-		if (this.isSearch()) {
-			var currentLibraryID = this.ref.libraryID;
-			if (currentLibraryID) {
-				yield s.addCondition('libraryID', 'is', currentLibraryID);
-			}
-			else {
-				var groups = yield Zotero.Groups.getAll();
-				for each(var group in groups) {
-					yield s.addCondition('libraryID', 'isNot', group.libraryID);
-				}
-			}
-		}
-		
 		Zotero.CollectionTreeCache.lastResults = yield s.search();
 		Zotero.CollectionTreeCache.lastTreeRow = this;
 	}
diff --git a/chrome/content/zotero/xpcom/data/cachedTypes.js b/chrome/content/zotero/xpcom/data/cachedTypes.js
index 78ca90307..4568237d0 100644
--- a/chrome/content/zotero/xpcom/data/cachedTypes.js
+++ b/chrome/content/zotero/xpcom/data/cachedTypes.js
@@ -390,6 +390,8 @@ Zotero.ItemTypes = new function() {
 	}
 	
 	function getImageSrc(itemType) {
+		var suffix = Zotero.hiDPI ? "@2x" : "";
+		
 		if (this.isCustom(itemType)) {
 			var id = this.getID(itemType) - this.customIDOffset;
 			if (!_customImages[id]) {
@@ -399,50 +401,57 @@ Zotero.ItemTypes = new function() {
 		}
 		
 		switch (itemType) {
+			// Use treeitem.png
 			case 'attachment-file':
+			case 'document':
+				break;
+			
+			// HiDPI images available
 			case 'attachment-link':
-			case 'attachment-snapshot':
 			case 'attachment-web-link':
-			case 'attachment-pdf':
 			case 'artwork':
 			case 'audioRecording':
 			case 'bill':
-			case 'blogPost':
 			case 'book':
 			case 'bookSection':
-			case 'case':
 			case 'computerProgram':
-			case 'conferencePaper':
-			case 'dictionaryEntry':
-			case 'document':
-			case 'email':
-			case 'encyclopediaArticle':
 			case 'film':
-			case 'forumPost':
-			case 'hearing':
 			case 'instantMessage':
 			case 'interview':
 			case 'journalArticle':
 			case 'letter':
 			case 'magazineArticle':
-			case 'manuscript':
-			case 'map':
 			case 'newspaperArticle':
 			case 'note':
+			case 'report':
+			case 'webpage':
+				return "chrome://zotero/skin/treeitem-" + itemType + suffix + ".png";
+			
+			// No HiDPI images available
+			case 'attachment-snapshot':
+			case 'attachment-pdf':
+			case 'blogPost':
+			case 'case':
+			case 'conferencePaper':
+			case 'dictionaryEntry':
+			case 'email':
+			case 'encyclopediaArticle':
+			case 'forumPost':
+			case 'hearing':
+			case 'manuscript':
+			case 'map':
 			case 'patent':
 			case 'podcast':
 			case 'presentation':
 			case 'radioBroadcast':
-			case 'report':
 			case 'statute':
 			case 'thesis':
 			case 'tvBroadcast':
 			case 'videoRecording':
-			case 'webpage':
 				return "chrome://zotero/skin/treeitem-" + itemType + ".png";
 		}
 		
-		return "chrome://zotero/skin/treeitem.png";
+		return "chrome://zotero/skin/treeitem" + suffix + ".png";
 	}
 }
 
diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js
index 4d10ab9ed..44ae54286 100644
--- a/chrome/content/zotero/xpcom/data/item.js
+++ b/chrome/content/zotero/xpcom/data/item.js
@@ -797,6 +797,9 @@ Zotero.Item.prototype.setField = function(field, value, loadIn) {
 		value = false;
 	}
 	
+	// Make sure to use type-specific field ID if available
+	fieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(itemTypeID, fieldID) || fieldID;
+	
 	if (value !== false && !Zotero.ItemFields.isValidForType(fieldID, itemTypeID)) {
 		var msg = "'" + field + "' is not a valid field for type " + itemTypeID;
 		
diff --git a/chrome/content/zotero/xpcom/data/tags.js b/chrome/content/zotero/xpcom/data/tags.js
index cba035620..b889f938c 100644
--- a/chrome/content/zotero/xpcom/data/tags.js
+++ b/chrome/content/zotero/xpcom/data/tags.js
@@ -670,12 +670,14 @@ Zotero.Tags = new function() {
 	 * @return {Q Promise} A Q promise for a data: URL for a PNG
 	 */
 	this.generateItemsListImage = function (colors, extraImage) {
-		var swatchWidth = 8;
-		var separator = 3;
-		var extraImageSeparator = 1;
-		var extraImageWidth = 16;
-		var canvasHeight = 16;
-		var swatchHeight = 8;
+		var multiplier = (extraImage && extraImage.indexOf('2x') != -1) ? 2 : 1;
+		
+		var swatchWidth = 8 * multiplier;
+		var separator = 3 * multiplier;
+		var extraImageSeparator = 1 * multiplier;
+		var extraImageWidth = 16 * multiplier;
+		var canvasHeight = 16 * multiplier;
+		var swatchHeight = 8 * multiplier;
 		var prependExtraImage = true;
 		
 		var hash = colors.join("") + (extraImage ? extraImage : "");
diff --git a/chrome/content/zotero/xpcom/debug.js b/chrome/content/zotero/xpcom/debug.js
index 7582b329a..a2542c1ad 100644
--- a/chrome/content/zotero/xpcom/debug.js
+++ b/chrome/content/zotero/xpcom/debug.js
@@ -25,10 +25,11 @@
 
 
 Zotero.Debug = new function () {
-	var _console, _stackTrace, _store, _level, _time, _lastTime, _output = [];
+	var _console, _consolePref, _stackTrace, _store, _level, _time, _lastTime, _output = [];
 	
 	this.init = function (forceDebugLog) {
-		_console = forceDebugLog || Zotero.Prefs.get('debug.log');
+		_consolePref = Zotero.Prefs.get('debug.log');
+		_console = _consolePref || forceDebugLog;
 		_store = Zotero.Prefs.get('debug.store');
 		if (_store) {
 			Zotero.Prefs.set('debug.store', false);
@@ -98,11 +99,12 @@ Zotero.Debug = new function () {
 		if (_console) {
 			var output = 'zotero(' + level + ')' + (_time ? deltaStr : '') + ': ' + message;
 			if(Zotero.isFx && !Zotero.isBookmarklet) {
-				// On Windows, where the text console is inexplicably glacial,
-				// log to the Browser Console instead
+				// On Windows, where the text console (-console) is inexplicably glacial,
+				// log to the Browser Console instead if only the -ZoteroDebug flag is used.
+				// Developers can use the debug.log/debug.time prefs and the Cygwin text console.
 				//
 				// TODO: Get rid of the filename and line number
-				if (Zotero.isWin && !Zotero.isStandalone) {
+				if (!_consolePref && Zotero.isWin && !Zotero.isStandalone) {
 					var console = Components.utils.import("resource://gre/modules/devtools/Console.jsm", {}).console;
 					console.log(output);
 				}
diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js
index 077ee2e4f..408afa04a 100644
--- a/chrome/content/zotero/xpcom/fulltext.js
+++ b/chrome/content/zotero/xpcom/fulltext.js
@@ -30,7 +30,7 @@ Zotero.Fulltext = new function(){
 	this.pdfInfoIsRegistered = pdfInfoIsRegistered;
 	this.isCachedMIMEType = isCachedMIMEType;
 	
-	this.__defineGetter__("pdfToolsDownloadBaseURL", function() { return 'http://www.zotero.org/download/xpdf/'; });
+	this.__defineGetter__("pdfToolsDownloadBaseURL", function() { return 'https://www.zotero.org/download/xpdf/'; });
 	this.__defineGetter__("pdfToolsName", function() { return 'Xpdf'; });
 	this.__defineGetter__("pdfToolsURL", function() { return 'http://www.foolabs.com/xpdf/'; });
 	this.__defineGetter__("pdfConverterName", function() { return 'pdftotext'; });
@@ -56,9 +56,11 @@ Zotero.Fulltext = new function(){
 
 	var _pdfConverterVersion = null;
 	var _pdfConverterFileName = null;
+	var _pdfConverterScript = null; // nsIFile of hidden window script on Windows
 	var _pdfConverter = null; // nsIFile to executable
 	var _pdfInfoVersion = null;
 	var _pdfInfoFileName = null;
+	var _pdfInfoScript = null; // nsIFile of redirection script
 	var _pdfInfo = null; // nsIFile to executable
 	
 	var _idleObserverIsRegistered = false;
@@ -127,6 +129,134 @@ Zotero.Fulltext = new function(){
 	}
 	
 	
+	/*
+	 * Download and install latest PDF tool
+	 */
+	this.downloadPDFTool = function (tool, version, callback) {
+		try {
+			var ioService = Components.classes["@mozilla.org/network/io-service;1"]
+				.getService(Components.interfaces.nsIIOService);
+			
+			if (tool == 'converter') {
+				var fileName = this.pdfConverterFileName;
+			}
+			else {
+				var fileName = this.pdfInfoFileName;
+			}
+			
+			var spec = this.pdfToolsDownloadBaseURL + version + "/" + fileName;
+			var uri = ioService.newURI(spec, null, null);
+			
+			var file = Zotero.getTempDirectory();
+			file.append(fileName);
+			
+			Components.utils.import("resource://gre/modules/NetUtil.jsm");
+			Components.utils.import("resource://gre/modules/FileUtils.jsm");
+			
+			Zotero.debug("Saving " + uri.spec + " to " + file.path);
+			NetUtil.asyncFetch(uri, function (is, status) {
+				if (!Components.isSuccessCode(status)) {
+					Zotero.debug(status, 1);
+					Components.utils.reportError(status);
+					if (callback) {
+						callback(false);
+					}
+					return;
+				}
+				
+				Zotero.File.putContentsAsync(file, is)
+				.then(function () {
+					// Delete if too small, since a 404 might not be detected above
+					if (file.fileSize < 50000) {
+						var msg = file.path + " is too small -- deleting";
+						Zotero.debug(msg, 1);
+						Components.utils.reportError(msg);
+						try {
+							file.remove(false);
+						}
+						catch (e) {
+							Zotero.debug(e, 1);
+							Components.utils.reportError(e);
+						}
+						if (callback) {
+							callback(false);
+						}
+						return;
+					}
+					
+					var scriptExt = _getScriptExtension();
+					// On Windows, write out script to hide pdftotext console window
+					// TEMP: disabled
+					if (false && tool == 'converter') {
+						if (Zotero.isWin) {
+							var content = Zotero.File.getContentsFromURL('resource://zotero/hide.' + scriptExt);
+							var scriptFile = Zotero.getTempDirectory();
+							scriptFile.append('pdftotext.' + scriptExt);
+							Zotero.File.putContents(scriptFile, content);
+						}
+					}
+					// Write out output redirection script for pdfinfo
+					// TEMP: disabled on Windows
+					else if (!Zotero.isWin && tool == 'info') {
+						var content = Zotero.File.getContentsFromURL('resource://zotero/redirect.' + scriptExt);
+						var scriptFile = Zotero.getTempDirectory();
+						scriptFile.append('pdfinfo.' + scriptExt);
+						Zotero.File.putContents(scriptFile, content);
+					}
+					
+					// Set permissions to 755
+					if (Zotero.isMac) {
+						file.permissions = 33261;
+						if (scriptFile) {
+							scriptFile.permissions = 33261;
+						}
+					}
+					else if (Zotero.isLinux) {
+						file.permissions = 493;
+						if (scriptFile) {
+							scriptFile.permissions = 493;
+						}
+					}
+					
+					var destDir = Zotero.getZoteroDirectory()
+					// Move redirect script and executable into data dir
+					if (scriptFile) {
+						scriptFile.moveTo(destDir, null);
+					}
+					file.moveTo(destDir, null);
+					
+					// Write the version number to a file
+					var versionFile = destDir.clone();
+					versionFile.append(fileName + '.version');
+					// TEMP
+					if (Zotero.isWin) {
+						version = '3.02a';
+					}
+					Zotero.File.putContents(versionFile, version + '');
+					
+					Zotero.Fulltext.registerPDFTool(tool);
+					
+					if (callback) {
+						callback(true);
+					}
+				})
+				.catch(function (e) {
+					Zotero.debug(e, 1);
+					Components.utils.reportError(e);
+					callback(false);
+				});
+			});
+		}
+		catch (e) {
+			Zotero.debug(e, 1);
+			Components.utils.reportError(e);
+			if (callback) {
+				callback(false);
+			}
+		}
+	};
+	
+	
 	/*
 	 * Looks for pdftotext-{platform}[.exe] in the Zotero data directory
 	 *
@@ -168,12 +298,48 @@ Zotero.Fulltext = new function(){
 		var versionFile = exec.parent;
 		versionFile.append(fileName + '.version');
 		if (versionFile.exists()) {
-			var version = (yield Zotero.File.getSample(versionFile)).split(/[\r\n\s]/)[0];
+			try {
+				var version = (yield Zotero.File.getSample(versionFile)).split(/[\r\n\s]/)[0];
+			}
+			catch (e) {
+				Zotero.debug(e, 1);
+				Components.utils.reportError(e);
+			}
 		}
 		if (!version) {
 			var version = 'UNKNOWN';
 		}
 		
+		// If scripts exist, use those instead
+		switch (tool) {
+		case 'converter':
+			// TEMP: disabled
+			if (false && Zotero.isWin) {
+				var script = Zotero.getZoteroDirectory();
+				script.append('pdftotext.' + _getScriptExtension())
+				if (script.exists()) {
+					Zotero.debug(script.leafName + " registered");
+					_pdfConverterScript = script;
+				}
+			}
+			break;
+		
+		case 'info':
+			// Modified 3.02 version doesn't use redirection script
+			if (version.startsWith('3.02')) break;
+			
+			var script = Zotero.getZoteroDirectory();
+			script.append('pdfinfo.' + _getScriptExtension())
+			// The redirection script is necessary to run pdfinfo
+			if (!script.exists()) {
+				Zotero.debug(script.leafName + " not found -- PDF statistics disabled");
+				return false;
+			}
+			Zotero.debug(toolName + " redirection script registered");
+			_pdfInfoScript = script;
+			break;
+		}
+		
 		switch (tool) {
 			case 'converter':
 				_pdfConverter = exec;
@@ -186,7 +352,7 @@ Zotero.Fulltext = new function(){
 				break;
 		}
 		
-		Zotero.debug(toolName + ' version ' + version + ' registered at ' + exec.path);
+		Zotero.debug(toolName + ' version ' + version + ' registered');
 		
 		return true;
 	});
@@ -202,6 +368,25 @@ Zotero.Fulltext = new function(){
 	}
 	
 	
+	this.getPDFConverterExecAndArgs = function () {
+		if (!this.pdfConverterIsRegistered()) {
+			throw new Error("PDF converter is not registered");
+		}
+		
+		if (_pdfConverterScript) {
+			return {
+				exec: _pdfConverterScript,
+				args: [_pdfConverter.path]
+			}
+		}
+		
+		return {
+			exec: _pdfConverter,
+			args: []
+		}
+	}
+	
+	
 	/*
 	 * Returns true if MIME type is converted to text and cached before indexing
 	 *   (e.g. application/pdf is run through pdftotext)
@@ -418,17 +603,20 @@ Zotero.Fulltext = new function(){
 		else {
 			var parentDirPath = OS.Path.dirname(filePath);
 		}
+		var infoFilePath = OS.Path.join(parentDirPath, this.pdfInfoCacheFile);
 		var cacheFilePath = OS.Path.join(parentDirPath, this.pdfConverterCacheFile);
 		
-		if (_pdfInfo) {
-			var infoFilePath = OS.Path.join(parentDirPath, this.pdfInfoCacheFile);
-			Zotero.debug('Running pdfinfo "' + filePath + '" "' + infoFilePath + '"');
+		// Modified 3.02 version that can output a text file directly
+		if (_pdfInfo && _pdfInfoVersion.startsWith('3.02')) {
+			var args = [filePath, infoFilePath];
 			
-			var proc = Components.classes["@mozilla.org/process/util;1"].
-					createInstance(Components.interfaces.nsIProcess);
+			Zotero.debug("Running " + _pdfInfo.path + ' '
+				+ args.map(arg => "'" + arg + "'").join(' '));
+			
+			var proc = Components.classes["@mozilla.org/process/util;1"]
+				.createInstance(Components.interfaces.nsIProcess);
 			proc.init(_pdfInfo);
 			
-			var args = [filePath, infoFilePath];
 			try {
 				proc.runw(true, args, args.length);
 				var totalPages = yield getTotalPagesFromFile(itemID);
@@ -437,19 +625,36 @@ Zotero.Fulltext = new function(){
 				Zotero.debug("Error running pdfinfo");
 			}
 		}
+		// Use redirection script
+		else if (_pdfInfoScript) {
+			var args = [_pdfInfo.path, filePath, infoFilePath];
+			
+			Zotero.debug("Running " + _pdfInfoScript.path + ' '
+				+ args.map(arg => "'" + arg + "'").join(' '));
+			
+			var proc = Components.classes["@mozilla.org/process/util;1"]
+				.createInstance(Components.interfaces.nsIProcess);
+			proc.init(_pdfInfoScript);
+			
+			try {
+				proc.runw(true, args, args.length);
+				var totalPages = this.getTotalPagesFromFile(itemID);
+			}
+			catch (e) {
+				Components.utils.reportError(e);
+				Zotero.debug("Error running pdfinfo", 1);
+				Zotero.debug(e, 1);
+			}
+		}
 		else {
 			Zotero.debug(this.pdfInfoName + " is not available");
 		}
 		
-		Zotero.debug('Running pdftotext -enc UTF-8 -nopgbrk '
-			+ (allPages ? '' : '-l ' + maxPages) + ' "' + filePath + '" "'
-			+ cacheFilePath + '"');
+		var proc = Components.classes["@mozilla.org/process/util;1"]
+			.createInstance(Components.interfaces.nsIProcess);
+		var {exec, args} = this.getPDFConverterExecAndArgs();
+		args.push('-enc', 'UTF-8', '-nopgbrk');
 		
-		var proc = Components.classes["@mozilla.org/process/util;1"].
-				createInstance(Components.interfaces.nsIProcess);
-		proc.init(_pdfConverter);
-		
-		var args = ['-enc', 'UTF-8', '-nopgbrk'];
 		if (allPages) {
 			if (totalPages) {
 				var pagesIndexed = totalPages;
@@ -460,11 +665,17 @@ Zotero.Fulltext = new function(){
 			var pagesIndexed = Math.min(maxPages, totalPages);
 		}
 		args.push(filePath, cacheFilePath);
+		
+		Zotero.debug("Running " + exec.path + " " + args.map(arg => "'" + arg + "'").join(" "));
+		
 		try {
+			proc.init(exec);
 			proc.runw(true, args, args.length);
 		}
 		catch (e) {
-			Zotero.debug("Error running pdftotext");
+			Components.utils.reportError(e);
+			Zotero.debug("Error running pdftotext", 1);
+			Zotero.debug(e, 1);
 			return false;
 		}
 		
@@ -1601,4 +1812,9 @@ Zotero.Fulltext = new function(){
 			return w;
 		});
 	}
+	
+	function _getScriptExtension() {
+		return Zotero.isWin ? 'vbs' : 'sh';
+	}
+
 }
diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js
index 14c0c682e..c325983ce 100644
--- a/chrome/content/zotero/xpcom/schema.js
+++ b/chrome/content/zotero/xpcom/schema.js
@@ -1573,6 +1573,116 @@ Zotero.Schema = new function(){
 		var translatorUpdates = xmlhttp.responseXML.getElementsByTagName('translator');
 		var styleUpdates = xmlhttp.responseXML.getElementsByTagName('style');
 		
+		var updatePDFTools = function () {
+			// No updates for PPC
+			if (Zotero.platform == 'MacPPC') return;
+			
+			let pdfToolsUpdates = xmlhttp.responseXML.getElementsByTagName('pdftools');
+			if (pdfToolsUpdates.length) {
+				let availableVersion = pdfToolsUpdates[0].getAttribute('version');
+				let installInfo = false;
+				let installConverter = false;
+				
+				// Don't auto-install if not installed
+				if (!Zotero.Fulltext.pdfInfoIsRegistered() && !Zotero.Fulltext.pdfConverterIsRegistered()) {
+					return;
+				}
+				
+				// TEMP
+				if (Zotero.isWin) {
+					if (Zotero.Fulltext.pdfInfoIsRegistered()) {
+						if (Zotero.Fulltext.pdfInfoVersion != '3.02a') {
+							installInfo = true;
+						}
+					}
+					// Install missing component if one is installed
+					else if (Zotero.Fulltext.pdfConverterIsRegistered()) {
+						installInfo = true;
+					}
+					if (Zotero.Fulltext.pdfConverterIsRegistered()) {
+						if (Zotero.Fulltext.pdfConverterVersion != '3.02a') {
+							installConverter = true;
+						}
+					}
+					// Install missing component if one is installed
+					else if (Zotero.Fulltext.pdfInfoIsRegistered()) {
+						installConverter = true;
+					}
+					availableVersion = '3.02';
+				}
+				else {
+					if (Zotero.Fulltext.pdfInfoIsRegistered()) {
+						let currentVersion = Zotero.Fulltext.pdfInfoVersion;
+						if (currentVersion < availableVersion || currentVersion.startsWith('3.02')
+								|| currentVersion == 'UNKNOWN') {
+							installInfo = true;
+						}
+					}
+					// Install missing component if one is installed
+					else if (Zotero.Fulltext.pdfConverterIsRegistered()) {
+						installInfo = true;
+					}
+					if (Zotero.Fulltext.pdfConverterIsRegistered()) {
+						let currentVersion = Zotero.Fulltext.pdfConverterVersion;
+						if (currentVersion < availableVersion || currentVersion.startsWith('3.02')
+								|| currentVersion == 'UNKNOWN') {
+							installConverter = true;
+						}
+					}
+					// Install missing component if one is installed
+					else if (Zotero.Fulltext.pdfInfoIsRegistered()) {
+						installConverter = true;
+					}
+				}
+				
+				let prefKey = 'pdfToolsInstallError';
+				let lastTry = 0, delay = 43200000; // half a day, so doubles to a day initially
+				try {
+					[lastTry, delay] = Zotero.Prefs.get(prefKey).split(';');
+				}
+				catch (e) {}
+				
+				// Allow an additional minute, since repo updates might not be exact
+				if (Date.now() < (parseInt(lastTry) + parseInt(delay) - 60000)) {
+					Zotero.debug("Now enough time since last PDF tools installation failure -- skipping", 2);
+					return;
+				}
+				
+				var checkResult = function (success) {
+					if (success) {
+						try {
+							Zotero.Prefs.clear(prefKey);
+						}
+						catch (e) {}
+					}
+					else {
+						// Keep doubling delay, to a max of 1 week
+						Zotero.Prefs.set(prefKey, Date.now() + ";" + Math.min(delay * 2, 7*24*60*60*1000));
+						
+						let msg = "Error downloading PDF tool";
+						Zotero.debug(msg, 1);
+						throw new Error(msg);
+					}
+				};
+				
+				if (installConverter && installInfo) {
+					Zotero.Fulltext.downloadPDFTool('converter', availableVersion, function (success) {
+						checkResult(success);
+						Zotero.Fulltext.downloadPDFTool('info', availableVersion, checkResult);
+					});
+				}
+				else if (installConverter) {
+					Zotero.Fulltext.downloadPDFTool('converter', availableVersion, checkResult);
+				}
+				else if (installInfo) {
+					Zotero.Fulltext.downloadPDFTool('info', availableVersion, checkResult);
+				}
+				else {
+					Zotero.debug("PDF tools are up to date");
+				}
+			}
+		};
+		
 		if (!translatorUpdates.length && !styleUpdates.length){
 			return Zotero.DB.executeTransaction(function* (conn) {
 				// Store the timestamp provided by the server
@@ -1586,7 +1696,11 @@ Zotero.Schema = new function(){
 				if (!manual) {
 					_setRepositoryTimer(ZOTERO_CONFIG['REPOSITORY_CHECK_INTERVAL']);
 				}
+				
 				return Zotero.Promise.resolve(true);
+			})
+			.tap(function () {
+				updatePDFTools();
 			});
 		}
 		
@@ -1631,6 +1745,9 @@ Zotero.Schema = new function(){
 				
 				return true;
 			});
+		})
+		.tap(function () {
+			updatePDFTools();
 		});
 	}
 	
diff --git a/chrome/content/zotero/xpcom/search.js b/chrome/content/zotero/xpcom/search.js
index 6cb1cc61a..be980d2db 100644
--- a/chrome/content/zotero/xpcom/search.js
+++ b/chrome/content/zotero/xpcom/search.js
@@ -1073,6 +1073,15 @@ Zotero.Search.prototype._buildQuery = Zotero.Promise.coroutine(function* () {
 			+ ")";
 	}
 	
+	// Limit to library search belongs to
+	//
+	// This is equivalent to adding libraryID as a search condition,
+	// but it works with ANY
+	if (this.libraryID !== null) {
+		sql += " AND (itemID IN (SELECT itemID FROM items WHERE libraryID=?))";
+		sqlParams.push(this.libraryID);
+	}
+	
 	if (this._hasPrimaryConditions) {
 		sql += " AND ";
 		
@@ -1687,6 +1696,7 @@ Zotero.Searches = function() {
 		var searches = [];
 		for (var i=0; i<rows.length; i++) {
 			let search = new Zotero.Search;
+			search.libraryID = libraryID;
 			search.id = rows[i].id;
 			yield search.loadPrimaryData();
 			searches.push(search);
diff --git a/chrome/content/zotero/xpcom/storage.js b/chrome/content/zotero/xpcom/storage.js
index e86710f82..9b98fe741 100644
--- a/chrome/content/zotero/xpcom/storage.js
+++ b/chrome/content/zotero/xpcom/storage.js
@@ -861,7 +861,7 @@ Zotero.Sync.Storage = new function () {
 							Zotero.debug("Remote mod time for item " + lk + " is " + itemModTimes[item.id]);
 							
 							// Ignore attachments whose stored mod times haven't changed
-							if (row.storageModTime == itemModTimes[id]) {
+							if (row.storageModTime == itemModTimes[item.id]) {
 								Zotero.debug("Storage mod time (" + row.storageModTime + ") "
 									+ "hasn't changed for item " + lk);
 								return;
@@ -1596,16 +1596,6 @@ Zotero.Sync.Storage = new function () {
 				Zotero.File.checkFileAccessError(e, destFile, 'create');
 			}
 			
-			var origPath = destFile.path;
-			var origFileName = destFile.leafName;
-			destFile.normalize();
-			if (origPath != destFile.path) {
-				var msg = "ZIP file " + zipFile.leafName + " contained symlink '"
-					+ origFileName + "'";
-				Zotero.debug(msg, 1);
-				Components.utils.reportError(msg + " in " + funcName);
-				continue;
-			}
 			destFile.permissions = 0644;
 			
 			// If we're renaming the main file, processDownload() needs to know
@@ -1635,18 +1625,7 @@ Zotero.Sync.Storage = new function () {
 				continue;
 			}
 			
-			// Firefox (as of 3.0.1) can't detect symlinks (at least on OS X),
-			// so use pre/post-normalized path to check
-			var origPath = file.path;
-			var origFileName = file.leafName;
-			file.normalize();
-			if (origPath != file.path) {
-				var msg = "Not deleting symlink '" + origFileName + "'";
-				Zotero.debug(msg, 2);
-				Components.utils.reportError(msg + " in " + funcName);
-				continue;
-			}
-			// This should be redundant with above check, but let's do it anyway
+			// Check symlink awareness, just to be safe
 			if (!parentDir.contains(file, false)) {
 				var msg = "Storage directory doesn't contain '" + file.leafName + "'";
 				Zotero.debug(msg, 2);
diff --git a/chrome/content/zotero/xpcom/sync.js b/chrome/content/zotero/xpcom/sync.js
index b6e35f33f..3726db3cc 100644
--- a/chrome/content/zotero/xpcom/sync.js
+++ b/chrome/content/zotero/xpcom/sync.js
@@ -959,7 +959,7 @@ Zotero.Sync.Runner = new function () {
 			
 			var panel = Zotero.Sync.Runner.updateErrorPanel(doc, errors);
 			
-			panel.openPopup(this, "after_end", 4, 0, false, false);
+			panel.openPopup(this, "after_end", 15, 0, false, false);
 		}
 	}
 	
@@ -1807,7 +1807,12 @@ Zotero.Sync.Server = new function () {
 									}
 								};
 								try {
-									req.sendAsBinary(data);
+									// Send binary data
+									let numBytes = data.length, ui8Data = new Uint8Array(numBytes);
+									for (let i = 0; i < numBytes; i++) {
+										ui8Data[i] = data.charCodeAt(i) & 0xff;
+									}
+									req.send(ui8Data);
 								}
 								catch (e) {
 									_error(e);
@@ -2561,6 +2566,7 @@ Zotero.Sync.Server = new function () {
 		}
 		
 		Zotero.debug(e, 1);
+		Components.utils.reportError(e);
 		
 		_syncInProgress = false;
 		Zotero.DB.rollbackAllTransactions();
diff --git a/chrome/content/zotero/xpcom/translation/translate.js b/chrome/content/zotero/xpcom/translation/translate.js
index d6983b571..d33502817 100644
--- a/chrome/content/zotero/xpcom/translation/translate.js
+++ b/chrome/content/zotero/xpcom/translation/translate.js
@@ -1478,8 +1478,15 @@ Zotero.Translate.Base.prototype = {
 	 * Called when all translators have been collected for detection
 	 */
 	"_detectTranslatorsCollected":function() {
-		Zotero.debug("Translate: All translator detect calls and RPC calls complete");
+		Zotero.debug("Translate: All translator detect calls and RPC calls complete:");
 		this._foundTranslators.sort(function(a, b) { return a.priority-b.priority });
+		if (this._foundTranslators.length) {
+			this._foundTranslators.forEach(function(t) {
+				Zotero.debug("\t" + t.label + ": " + t.priority);
+			});
+		} else {
+			Zotero.debug("\tNo suitable translators found");
+		}
 		this._runHandler("translators", this._foundTranslators);
 	},
 	
@@ -1503,7 +1510,8 @@ Zotero.Translate.Base.prototype = {
 		
 		var me = this;
 		return translator.getCode().then(function(code) {
-			Zotero.debug("Translate: Parsing code for "+translator.label, 4);
+			Zotero.debug("Translate: Parsing code for " + translator.label + " "
+				+ "(" + translator.translatorID + ", " + translator.lastUpdated + ")", 4);
 			me._sandboxManager.eval("var exports = {}, ZOTERO_TRANSLATOR_INFO = "+code,
 				["detect"+me._entryFunctionSuffix, "do"+me._entryFunctionSuffix, "exports",
 					"ZOTERO_TRANSLATOR_INFO"],
diff --git a/chrome/content/zotero/xpcom/utilities.js b/chrome/content/zotero/xpcom/utilities.js
index a0a319037..0f19646bc 100644
--- a/chrome/content/zotero/xpcom/utilities.js
+++ b/chrome/content/zotero/xpcom/utilities.js
@@ -282,39 +282,41 @@ Zotero.Utilities = {
 	 * @param {Boolean} [dontValidate=false] Do not validate check digit
 	 * @return {String|Boolean} Valid ISBN or false
 	 */
-	"cleanISBN":function(isbn, dontValidate) {
-		isbn = isbn.replace(/[^0-9a-z]+/ig, '').toUpperCase()	//we only want to ignore punctuation, spaces
-						.match(/\b(?:97[89][0-9]{10}|[0-9]{9}[0-9X])\b/);	//13 digit or 10 digit
-		if(!isbn) return false;
-		isbn = isbn[0];
-		
-		if (dontValidate && (isbn.length == 10 || isbn.length == 13)) {
-			return isbn;
-		}
-		
-		if(isbn.length == 10) {
-			// Verify ISBN-10 checksum
-			var sum = 0;
-			for (var i = 0; i < 9; i++) {
-				if(isbn[i] == 'X') return false;	//X can only be a check digit
-				sum += isbn[i] * (10-i);
+	"cleanISBN":function(isbnStr, dontValidate) {
+		isbnStr = isbnStr.toUpperCase()
+			.replace(/[\x2D\xAD\u2010-\u2015\u2043\u2212]+/g, ''); // Ignore dashes
+		var isbnRE = /\b(?:97[89]\s*(?:\d\s*){9}\d|(?:\d\s*){9}[\dX])\b/g,
+			isbnMatch;
+		while(isbnMatch = isbnRE.exec(isbnStr)) {
+			var isbn = isbnMatch[0].replace(/\s+/g, '');
+			
+			if (dontValidate) {
+				return isbn;
 			}
-			//check digit might be 'X'
-			sum += (isbn[9] == 'X')? 10 : isbn[9]*1;
-
-			return (sum % 11 == 0) ? isbn : false;
+			
+			if(isbn.length == 10) {
+				// Verify ISBN-10 checksum
+				var sum = 0;
+				for (var i = 0; i < 9; i++) {
+					sum += isbn[i] * (10-i);
+				}
+				//check digit might be 'X'
+				sum += (isbn[9] == 'X')? 10 : isbn[9]*1;
+	
+				if (sum % 11 == 0) return isbn;
+			} else {
+				// Verify ISBN 13 checksum
+				var sum = 0;
+				for (var i = 0; i < 12; i+=2) sum += isbn[i]*1;	//to make sure it's int
+				for (var i = 1; i < 12; i+=2) sum += isbn[i]*3;
+				sum += isbn[12]*1; //add the check digit
+	
+				if (sum % 10 == 0 ) return isbn;
+			}
+			
+			isbnRE.lastIndex = isbnMatch.index + 1; // Retry the same spot + 1
 		}
-
-		if(isbn.length == 13) {
-			// Verify checksum
-			var sum = 0;
-			for (var i = 0; i < 12; i+=2) sum += isbn[i]*1;	//to make sure it's int
-			for (var i = 1; i < 12; i+=2) sum += isbn[i]*3;
-			sum += isbn[12]*1; //add the check digit
-
-			return (sum % 10 == 0 )? isbn : false;
-		}
-
+		
 		return false;
 	},
 	
@@ -324,16 +326,17 @@ Zotero.Utilities = {
 	 *   cleanISBN
 	 * @return {String} ISBN-13
 	 */
-	"toISBN13": function(isbn) {
-		if (!/^(?:97[89])?\d{9}[\dxX]$/.test(isbn)
-			&& !(isbn = Zotero.Utilities.cleanISBN(isbn))
-		) {
-			throw new Error('Invalid ISBN: ' + isbn);
+	"toISBN13": function(isbnStr) {
+		var isbn;
+		if (!(isbn = Zotero.Utilities.cleanISBN(isbnStr, true))) {
+			throw new Error('ISBN not found in "' + isbnStr + '"');
 		}
 		
-		if (isbn.length == 13) return isbn; // Recalculate check digit?
-		
-		isbn = '978' + isbn.substr(0,9);
+		if (isbn.length == 13) {
+			isbn = isbn.substr(0,12); // Strip off check digit and re-calculate it
+		} else {
+			isbn = '978' + isbn.substr(0,9);
+		}
 		
 		var sum = 0;
 		for (var i = 0; i < 12; i++) {
@@ -350,22 +353,30 @@ Zotero.Utilities = {
 	 * Clean and validate ISSN.
 	 * Return issn if valid, otherwise return false
 	 */
-	"cleanISSN":function(/**String*/ issn) {
-		issn = issn.replace(/[^0-9a-z]+/ig, '').toUpperCase()	//we only want to ignore punctuation, spaces
-						.match(/[0-9]{7}[0-9X]/);
-		if(!issn) return false;
-		issn = issn[0];
-
-		// Verify ISSN checksum
-		var sum = 0;
-		for (var i = 0; i < 7; i++) {
-			if(issn[i] == 'X') return false;	//X can only be a check digit
-			sum += issn[i] * (8-i);
+	"cleanISSN":function(/**String*/ issnStr) {
+		issnStr = issnStr.toUpperCase()
+			.replace(/[\x2D\xAD\u2010-\u2015\u2043\u2212]+/g, ''); // Ignore dashes
+		var issnRE = /\b(?:\d\s*){7}[\dX]\b/g,
+			issnMatch;
+		while (issnMatch = issnRE.exec(issnStr)) {
+			var issn = issnMatch[0].replace(/\s+/g, '');
+			
+			// Verify ISSN checksum
+			var sum = 0;
+			for (var i = 0; i < 7; i++) {
+				sum += issn[i] * (8-i);
+			}
+			//check digit might be 'X'
+			sum += (issn[7] == 'X')? 10 : issn[7]*1;
+	
+			if (sum % 11 == 0) {
+				return issn.substring(0,4) + '-' + issn.substring(4);
+			}
+			
+			issnRE.lastIndex = issnMatch.index + 1; // Retry same spot + 1
 		}
-		//check digit might be 'X'
-		sum += (issn[7] == 'X')? 10 : issn[7]*1;
-
-		return (sum % 11 == 0) ? issn.substring(0,4) + '-' + issn.substring(4) : false;
+		
+		return false;
 	},
 	
 	/**
diff --git a/chrome/content/zotero/xpcom/utilities_internal.js b/chrome/content/zotero/xpcom/utilities_internal.js
index 5c50343d0..112edc66e 100644
--- a/chrome/content/zotero/xpcom/utilities_internal.js
+++ b/chrome/content/zotero/xpcom/utilities_internal.js
@@ -302,6 +302,9 @@ Zotero.Utilities.Internal = {
 	 * @param {nsISupports} target file
 	 */
 	saveURI: function (wbp, source, target) {
+		// Handle gzip encoding
+		wbp.persistFlags |= Ci.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
+		
 		// Firefox 35 and below
 		try {
 			wbp.saveURI(source, null, null, null, null, target, null);
@@ -315,11 +318,16 @@ Zotero.Utilities.Internal = {
 	
 	/**
 	 * Launch a process
-	 * @param {nsIFile} cmd Path to command to launch
+	 * @param {nsIFile|String} cmd Path to command to launch
 	 * @param {String[]} args Arguments given
 	 * @return {Promise} Promise resolved to true if command succeeds, or an error otherwise
 	 */
 	"exec":function(cmd, args) {
+		if (typeof cmd == 'string') {
+			Components.utils.import("resource://gre/modules/FileUtils.jsm");
+			cmd = new FileUtils.File(cmd);
+		}
+		
 		if(!cmd.isExecutable()) {
 			return Zotero.Promise.reject(cmd.path+" is not an executable");
 		}
diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js
index 3c846a7dc..c93f83afa 100644
--- a/chrome/content/zotero/xpcom/zotero.js
+++ b/chrome/content/zotero/xpcom/zotero.js
@@ -171,6 +171,7 @@ Components.utils.import("resource://gre/modules/osfile.jsm");
 		
 		if (options) {
 			if (options.openPane) this.openPane = true;
+			if (options.noUserInput) this.noUserInput = true;
 		}
 		
 		this.mainThread = Services.tm.mainThread;
@@ -612,12 +613,13 @@ Components.utils.import("resource://gre/modules/osfile.jsm");
 				Zotero.debug(e, 1);
 				Components.utils.reportError(e); // DEBUG: doesn't always work
 				
-				if (typeof e == 'string' && (e.indexOf('newer than SQL file') != -1
-							|| e.indexOf('Database is incompatible') != -1)) {
-					var kbURL = "https://www.zotero.org/support/kb/newer_db_version";
-					var msg = Zotero.getString('startupError.zoteroVersionIsOlder')
-						+ " " + Zotero.getString('startupError.zoteroVersionIsOlder.upgrade') + "\n\n"
-						+ Zotero.getString('startupError.zoteroVersionIsOlder.current', Zotero.version) + "\n\n"
+				if (e.toString().match('newer than SQL file')) {
+					let versions = e.toString().match(/\((\d+) < \d+\)/);
+					let kbURL = "https://www.zotero.org/support/kb/newer_db_version";
+					let msg = Zotero.getString('startupError.zoteroVersionIsOlder') + " "
+						+ Zotero.getString('startupError.zoteroVersionIsOlder.upgrade') + "\n\n"
+						+ Zotero.getString('startupError.zoteroVersionIsOlder.current', Zotero.version) + "\n"
+						+ (versions ? "DB: " + versions[1] + "\n\n" : "\n")
 						+ Zotero.getString('general.seeForMoreInformation', kbURL);
 					Zotero.startupError = msg;
 					_startupErrorHandler = function() {
@@ -2123,7 +2125,8 @@ Components.utils.import("resource://gre/modules/osfile.jsm");
 			'nsLivemarkService.js',
 			'Sync.Engine.Tabs',
 			'content-sessionStore.js',
-			'org.mozilla.appSessions'
+			'org.mozilla.appSessions',
+			'bad script XDR magic number'
 		];
 		
 		for (var i=0; i<blacklist.length; i++) {
diff --git a/chrome/locale/af-ZA/zotero/zotero.properties b/chrome/locale/af-ZA/zotero/zotero.properties
index f42d73143..184cd38e5 100644
--- a/chrome/locale/af-ZA/zotero/zotero.properties
+++ b/chrome/locale/af-ZA/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/ar/zotero/zotero.properties b/chrome/locale/ar/zotero/zotero.properties
index 4aef0e044..ad9810662 100644
--- a/chrome/locale/ar/zotero/zotero.properties
+++ b/chrome/locale/ar/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=حذف مجموعات المشاركة و المزام
 sync.localObject=كائن محلي
 sync.remoteObject=كائن عن بعد
 sync.mergedObject=كائن مدمج
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=لم يتم تعيين اسم المستخدم
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/bg-BG/zotero/zotero.properties b/chrome/locale/bg-BG/zotero/zotero.properties
index 15ad29293..b89861172 100644
--- a/chrome/locale/bg-BG/zotero/zotero.properties
+++ b/chrome/locale/bg-BG/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Отстранява групите и синхрони
 sync.localObject=Локален запис
 sync.remoteObject=Делечен запис
 sync.mergedObject=Слят запис
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Потребителското име не е въведено
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/ca-AD/zotero/zotero.properties b/chrome/locale/ca-AD/zotero/zotero.properties
index 0a7bfaede..3c3a0b974 100644
--- a/chrome/locale/ca-AD/zotero/zotero.properties
+++ b/chrome/locale/ca-AD/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Elimina el grup i sincronitza
 sync.localObject=Objecte local
 sync.remoteObject=Objecte remot
 sync.mergedObject=Objecte fusionat
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=No s'ha establit un nom d'usuari
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/cs-CZ/zotero/preferences.dtd b/chrome/locale/cs-CZ/zotero/preferences.dtd
index 431604a0f..ab4e5c3fb 100644
--- a/chrome/locale/cs-CZ/zotero/preferences.dtd
+++ b/chrome/locale/cs-CZ/zotero/preferences.dtd
@@ -160,7 +160,7 @@
 
 <!ENTITY zotero.preferences.prefpane.advanced "Pokročilé">
 <!ENTITY zotero.preferences.advanced.filesAndFolders "Soubory a Složky">
-<!ENTITY zotero.preferences.advanced.keys "Shortcuts">
+<!ENTITY zotero.preferences.advanced.keys "Klávesové zkratky">
 
 <!ENTITY zotero.preferences.prefpane.locate "Najít">
 <!ENTITY zotero.preferences.locate.locateEngineManager "Správce mechanismu pro vyhledávání článků">
@@ -201,6 +201,6 @@
 <!ENTITY zotero.preferences.debugOutputLogging.submitToServer "Odeslat na Zotero Server">
 
 <!ENTITY zotero.preferences.openAboutConfig "Otevřít about:config">
-<!ENTITY zotero.preferences.openCSLEdit "Open Style Editor">
-<!ENTITY zotero.preferences.openCSLPreview "Open Style Preview">
+<!ENTITY zotero.preferences.openCSLEdit "Otevřít Editor stylů">
+<!ENTITY zotero.preferences.openCSLPreview "Otevřít Náhled stylů">
 <!ENTITY zotero.preferences.openAboutMemory "Otevřít about:memory">
diff --git a/chrome/locale/cs-CZ/zotero/zotero.dtd b/chrome/locale/cs-CZ/zotero/zotero.dtd
index 99c0a63a1..29e503abd 100644
--- a/chrome/locale/cs-CZ/zotero/zotero.dtd
+++ b/chrome/locale/cs-CZ/zotero/zotero.dtd
@@ -6,8 +6,8 @@
 <!ENTITY zotero.general.delete "Smazat">
 <!ENTITY zotero.general.ok "OK">
 <!ENTITY zotero.general.cancel "Zrušit">
-<!ENTITY zotero.general.refresh "Refresh">
-<!ENTITY zotero.general.saveAs "Save As…">
+<!ENTITY zotero.general.refresh "Obnovit">
+<!ENTITY zotero.general.saveAs "Uložit jako...">
 
 <!ENTITY zotero.errorReport.title "Chybová zpráva Zotera">
 <!ENTITY zotero.errorReport.unrelatedMessages "Může obsahovat zprávy nesouvisející se Zoterem.">
@@ -125,7 +125,7 @@
 <!ENTITY zotero.item.textTransform "Převést text">
 <!ENTITY zotero.item.textTransform.titlecase "Velká Písmena">
 <!ENTITY zotero.item.textTransform.sentencecase "Velké první písmeno">
-<!ENTITY zotero.item.creatorTransform.nameSwap "Swap First/Last Names">
+<!ENTITY zotero.item.creatorTransform.nameSwap "Zaměnit křestní jména / přijmení">
 
 <!ENTITY zotero.toolbar.newNote "Nová poznámka">
 <!ENTITY zotero.toolbar.note.standalone "Nová samostatná poznámka">
diff --git a/chrome/locale/cs-CZ/zotero/zotero.properties b/chrome/locale/cs-CZ/zotero/zotero.properties
index a5bfc99c8..21d427ff7 100644
--- a/chrome/locale/cs-CZ/zotero/zotero.properties
+++ b/chrome/locale/cs-CZ/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=Vytvořit
 general.delete=Smazat
 general.moreInformation=Více informací
 general.seeForMoreInformation=Pro více informací se podívejte na %S
-general.open=Open %S
+general.open=Otevřít %S
 general.enable=Povolit
 general.disable=Zakázat
 general.remove=Odstranit
@@ -204,11 +204,11 @@ pane.items.trash.multiple=Jste si jisti, že chcete přesunout vybranou položku
 pane.items.delete.title=Smazat
 pane.items.delete=Jste si jisti, že chcete smazat zvolenou položku?
 pane.items.delete.multiple=Jste si jisti, že chcete smazat zvolené položky?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=Odstranit z kolekce
+pane.items.remove=Opravdu chcete odstranit zvolenou položku z kolekce?
+pane.items.remove.multiple=Opravdu chcete odstranit vybrané položky z této kolekce?
+pane.items.menu.remove=Odebrat položku z kolekce...
+pane.items.menu.remove.multiple=Odebrat položky z kolekce...
 pane.items.menu.moveToTrash=Přesunout položku do Koše...
 pane.items.menu.moveToTrash.multiple=Přesunout položky do Koše...
 pane.items.menu.export=Exportovat vybranou položku...
@@ -225,7 +225,7 @@ pane.items.menu.createParent=Vytvořit rodičovskou položku z vybrané položky
 pane.items.menu.createParent.multiple=Vytvořit rodičovské položky z vybraných položek
 pane.items.menu.renameAttachments=Přejmenovat soubor z rodičovských metadat
 pane.items.menu.renameAttachments.multiple=Přejmenovat soubory z rodičovských metadat
-pane.items.showItemInLibrary=Show Item in Library
+pane.items.showItemInLibrary=Zobrazit položku v Knihovně.
 
 pane.items.letter.oneParticipant=Dopis pro %S
 pane.items.letter.twoParticipants=Dopis pro %S a %S
@@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Formáty exportu
 zotero.preferences.export.quickCopy.instructions=Rychlé kopírování Vám umožňuje kopírovat vybrané reference do schránky zmáčknutím klávesové zkratky (%S) nebo přetažením položek do textového pole na webové stránce.
 zotero.preferences.export.quickCopy.citationInstructions=Pro citování můžete citace či poznámky pod čarou kopírovat při stisknutí %S nebo stisknutím a držením klávesy Shift při přetahování položky.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
-zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
-zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
-zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
-zotero.preferences.wordProcessors.install=Install %S Add-in
-zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
-zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
-zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
+zotero.preferences.wordProcessors.installationSuccess=Instalace proběhla úspěšně.
+zotero.preferences.wordProcessors.installationError=Instalace nemohla být dokončena, protože došlo k chybě. Prosím ujistěte se, že je %1$S zavřený a poté restartujte %2$S.
+zotero.preferences.wordProcessors.installed=Add-in %S je v současnosti nainstalován.
+zotero.preferences.wordProcessors.notInstalled=Add-in %S není v současnosti nainstalován.
+zotero.preferences.wordProcessors.install=Nainstalovat add-in %S
+zotero.preferences.wordProcessors.reinstall=Přeinstalovat add-in %S
+zotero.preferences.wordProcessors.installing=Instaluje se %S...
+zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S je nekompatibilní s verzemi %3$S před %4$S. Odstraňte prosím %3$S, nebo stáhněte nejnovější verzi z %5$S.
+zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S vyžaduje ke svému běhu %3$S %4$S. Stáhněte prosím  nejnovější verzi %3$S z %5$S.
 
 zotero.preferences.styles.addStyle=Přidat styl
 
@@ -738,7 +738,7 @@ integration.missingItem.multiple=Položka %1$S v této citaci už dále neexistu
 integration.missingItem.description=Kliknutím na "Ne" smažete kódy pole pro citace obsahujících tuto položku, text citace bude zachován, ale bude smazána z vaší bibliografie.
 integration.removeCodesWarning=Odstranění kódů polí neumožní Zoteru aktualizaci citací a bibliografií v tomto dokumentu. Jste si jistí, že chcete pokračovat?
 integration.upgradeWarning=Váš dokument musí být permanentně aktualizován, abyste mohli pracovat se Zoterem 2.0b7 a vyšším. Před pokračováním je doporučeno vytvoření záložní kopie dokumentu. Jste si jisti, že chcete pokračovat?
-integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
+integration.error.newerDocumentVersion=Váš dokument byl vytvořen v novější verzi Zotera (%1$S), než je ta současně nainstalovaná (%2$S). Před úpravami tohoto dokumentu prosím aktualizujte Zotero. 
 integration.corruptField=Kód pole Zotera odpovídající této citaci, který označuje, které položky ve vaší knihovně tato citace reprezentuje, byl poškozen. Přejete si znovu vybrat položku?
 integration.corruptField.description=Kliknutím na "Ne" smažete kódy pole pro citace obsahující tuto položku, text citace bude zachován, ale citace může být smazána z vaší bibliografie.
 integration.corruptBibliography=Kód pole Zotera pro vaší bibliografii byl poškozen. Má Zotero vymazat tento kód pole a vygenerovat novou bibliografii?
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstranit skupinu a synchronizovat
 sync.localObject=Lokální objekt
 sync.remoteObject=Vzdálený objekt
 sync.mergedObject=Sloučený objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Uživatelské jméno není nastaveno
 sync.error.usernameNotSet.text=Musíte zadat své uživatelské jméno a heslo ze zotero.org v Nastavení Zotera, pokud chcete provést synchronizaci s Zotero serverem.
@@ -985,11 +988,11 @@ firstRunGuidance.quickFormatMac=Napište název, nebo autora k nimž hledáte ci
 firstRunGuidance.toolbarButton.new=Zotero otevřete kliknutím sem, nebo použitím klávesové zkratky %S
 firstRunGuidance.toolbarButton.upgrade=Ikona Zotero se nyní nachází v Panelu nástrojů Firefoxu. Zotero otevřete kliknutím na ikonu, nebo stisknutím %S.
 
-styles.bibliography=Bibliography
-styles.editor.save=Save Citation Style
-styles.editor.warning.noItems=No items selected in Zotero.
-styles.editor.warning.parseError=Error parsing style:
-styles.editor.warning.renderError=Error generating citations and bibliography:
-styles.editor.output.individualCitations=Individual Citations
-styles.editor.output.singleCitation=Single Citation (with position "first")
-styles.preview.instructions=Select one or more items in Zotero and click the "Refresh" button to see how these items are rendered by the installed CSL citation styles.
+styles.bibliography=Bibliografie
+styles.editor.save=Uložit citační styl.
+styles.editor.warning.noItems=V Zoteru nejsou vybrány žádné položky.
+styles.editor.warning.parseError=Chyba při parsovaní stylu:
+styles.editor.warning.renderError=Chyba při generování citací a bibliografie:
+styles.editor.output.individualCitations=Jednotlivé citace
+styles.editor.output.singleCitation=Jednotlivá citace (s pozicí "první")
+styles.preview.instructions=Pro náhled těchto položek pomocí nainstalovaných citačních stylů CSL vyberte v Zoteru jednu nebo více položek a klikněte tlačítko "Obnovit".
diff --git a/chrome/locale/da-DK/zotero/zotero.properties b/chrome/locale/da-DK/zotero/zotero.properties
index 0b160efbf..111ea0a2d 100644
--- a/chrome/locale/da-DK/zotero/zotero.properties
+++ b/chrome/locale/da-DK/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Fjern grupper og synkronisering
 sync.localObject=Lokalt objekt
 sync.remoteObject=Eksternt objekt
 sync.mergedObject=Sammenflettet objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Brugernavn ikke angivet
 sync.error.usernameNotSet.text=Du skal indtaste dit zotero.org brugernavn og adgangskode i Zotero-indstillingerne for at synkronisere med Zotero-serveren.
diff --git a/chrome/locale/de/zotero/zotero.properties b/chrome/locale/de/zotero/zotero.properties
index 7ebe46d60..f119d92f1 100644
--- a/chrome/locale/de/zotero/zotero.properties
+++ b/chrome/locale/de/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Gruppen entfernen und synchronisieren
 sync.localObject=Lokales Objekt
 sync.remoteObject=Remote-Objekt
 sync.mergedObject=Zusammengeführtes Objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Benutzername nicht definiert
 sync.error.usernameNotSet.text=Sie müssen Ihren zotero.org Benutzernamen und Passwort in den Zotero Einstellungen eingeben, um mit dem Zotero Server zu synchronisieren.
diff --git a/chrome/locale/el-GR/zotero/about.dtd b/chrome/locale/el-GR/zotero/about.dtd
index 40a016b3f..08cd1590e 100644
--- a/chrome/locale/el-GR/zotero/about.dtd
+++ b/chrome/locale/el-GR/zotero/about.dtd
@@ -9,5 +9,5 @@
 <!ENTITY zotero.executiveProducer "Εκτελεστικός Παραγωγός:">
 <!ENTITY zotero.thanks "Ειδικές Ευχαριστίες:">
 <!ENTITY zotero.about.close "Κλείσιμο">
-<!ENTITY zotero.moreCreditsAndAcknowledgements "More Credits &amp; Acknowledgements">
-<!ENTITY zotero.citationProcessing "Citation &amp; Bibliography Processing">
+<!ENTITY zotero.moreCreditsAndAcknowledgements "Συντελεστές και ευχαριστίες">
+<!ENTITY zotero.citationProcessing "Παραμπομπές &amp; Βιβλιογραφική επεξεργασία">
diff --git a/chrome/locale/el-GR/zotero/zotero.dtd b/chrome/locale/el-GR/zotero/zotero.dtd
index 1a7da7d30..549fe5900 100644
--- a/chrome/locale/el-GR/zotero/zotero.dtd
+++ b/chrome/locale/el-GR/zotero/zotero.dtd
@@ -6,8 +6,8 @@
 <!ENTITY zotero.general.delete "Διαγραφή">
 <!ENTITY zotero.general.ok "ΟΚ">
 <!ENTITY zotero.general.cancel "Ακύρωση">
-<!ENTITY zotero.general.refresh "Refresh">
-<!ENTITY zotero.general.saveAs "Save As…">
+<!ENTITY zotero.general.refresh "Ανανέωση">
+<!ENTITY zotero.general.saveAs "Αποθήκευση ως...">
 
 <!ENTITY zotero.errorReport.title "Αναφορά σφάλματος Zotero">
 <!ENTITY zotero.errorReport.unrelatedMessages "Πιθανόν να συμπεριληφθούν μηνύματα άσχετα με το Zotero.">
@@ -15,7 +15,7 @@
 <!ENTITY zotero.errorReport.submitted "Η αναφορά σας σφάλματος υποβλήθηκε.">
 <!ENTITY zotero.errorReport.reportID "Ταυτότητα αναφοράς:">
 <!ENTITY zotero.errorReport.postToForums "Παρακαλώ, στείλτε ένα μήνυμα στο φόρουμ του Zotero (forums.zotero.org) με αυτή την Ταυτότητα Σφάλματος, μια περιγραφή του προβλήματος και τα απαραίτητα βήματα για την αναπαραγωγή του.">
-<!ENTITY zotero.errorReport.notReviewed "Error reports are generally not reviewed unless referred to in the forums.">
+<!ENTITY zotero.errorReport.notReviewed "Οι αναφορές σφαλμάτων δεν εξετάζονται αν πρώτα δεν αναφερθούν στα φόρα.">
 
 <!ENTITY zotero.upgrade.title "Μάγος Αναβάθμισης Zotero">
 <!ENTITY zotero.upgrade.newVersionInstalled "Εγκαταστήσατε μια νέα έκδοση του Zotero.">
@@ -99,20 +99,20 @@
 <!ENTITY zotero.toolbar.moreItemTypes.label "Περισσότερα">
 <!ENTITY zotero.toolbar.newItemFromPage.label "Δημιουργία Στοιχείου Ιστοσελίδας από την Τρέχουσα Σελίδα">
 <!ENTITY zotero.toolbar.lookup.label "Προσθήκη στοιχείου/ων μέσω Ταυτότητας">
-<!ENTITY zotero.toolbar.removeItem.label "Remove Item...">
-<!ENTITY zotero.toolbar.newCollection.label "New Collection...">
-<!ENTITY zotero.toolbar.newGroup "New Group...">
-<!ENTITY zotero.toolbar.newSubcollection.label "New Subcollection...">
-<!ENTITY zotero.toolbar.newSavedSearch.label "New Saved Search...">
-<!ENTITY zotero.toolbar.emptyTrash.label "Εκκένωση κάδου απορριμάτων">
-<!ENTITY zotero.toolbar.tagSelector.label "Εμφάνιση/Απόκρυψη Επιλογέα ετικετών">
+<!ENTITY zotero.toolbar.removeItem.label "Απομάκρυνση στοιχείου...">
+<!ENTITY zotero.toolbar.newCollection.label "Νέα συλλογή...">
+<!ENTITY zotero.toolbar.newGroup "Νέα ομάδα...">
+<!ENTITY zotero.toolbar.newSubcollection.label "Νέα δευτερεύουσα συλλογή...">
+<!ENTITY zotero.toolbar.newSavedSearch.label "Νέα αποθηκευμένη αναζήτηση...">
+<!ENTITY zotero.toolbar.emptyTrash.label "Άδειασμα κάδου ανακύκλωσης...">
+<!ENTITY zotero.toolbar.tagSelector.label "Εμφάνιση/Απόκρυψη επιλογέα ετικετών">
 <!ENTITY zotero.toolbar.actions.label "Ενέργειες">
-<!ENTITY zotero.toolbar.import.label "Import...">
+<!ENTITY zotero.toolbar.import.label "Εισαγωγή">
 <!ENTITY zotero.toolbar.importFromClipboard "Εισαγωγή από την προσωρινή μνήμη">
 <!ENTITY zotero.toolbar.export.label "Export Library...">
 <!ENTITY zotero.toolbar.rtfScan.label "RTF Scan...">
 <!ENTITY zotero.toolbar.timeline.label "Δημιουργία χρονοδιαγράμματος">
-<!ENTITY zotero.toolbar.preferences.label "Preferences...">
+<!ENTITY zotero.toolbar.preferences.label "Προτιμήσεις...">
 <!ENTITY zotero.toolbar.supportAndDocumentation "Υποστήριξη και Τεκμηρίωση">
 <!ENTITY zotero.toolbar.about.label "Σχετικά με το Zotero">
 <!ENTITY zotero.toolbar.advancedSearch "Προχωρημένη αναζήτηση">
@@ -125,24 +125,24 @@
 <!ENTITY zotero.item.textTransform "Μετασχηματισμός κειμένου">
 <!ENTITY zotero.item.textTransform.titlecase "Μορφή γραμμάτων τίτλου">
 <!ENTITY zotero.item.textTransform.sentencecase "Μορφή γραμμάτων πρότασης">
-<!ENTITY zotero.item.creatorTransform.nameSwap "Swap First/Last Names">
+<!ENTITY zotero.item.creatorTransform.nameSwap "Εναλλαγή πρώτου ονόματος/επιθέτου">
 
 <!ENTITY zotero.toolbar.newNote "Νέα σημείωση">
 <!ENTITY zotero.toolbar.note.standalone "Νέα αυτόνομη σημείωση">
 <!ENTITY zotero.toolbar.note.child "Προσθήκη θυγατρικής σημείωσης">
-<!ENTITY zotero.toolbar.lookup "Lookup by Identifier...">
+<!ENTITY zotero.toolbar.lookup "Εντοπισμός μέσω ταυτοποιητή...">
 <!ENTITY zotero.toolbar.attachment.linked "Link to File...">
-<!ENTITY zotero.toolbar.attachment.add "Store Copy of File...">
+<!ENTITY zotero.toolbar.attachment.add "Αποθήκευση αντιγράφου του αρχείου...">
 <!ENTITY zotero.toolbar.attachment.weblink "Αποθήκευση Συνδέσμου στην Τρέχουσα Σελίδα">
 <!ENTITY zotero.toolbar.attachment.snapshot "Λήψη Στιγμιότυπου της Τρέχουσας Σελίδας">
 
 <!ENTITY zotero.tagSelector.noTagsToDisplay "Δεν υπάρχουν ετικέτες προς εμφάνιση">
 <!ENTITY zotero.tagSelector.filter "Φίλτρο">
-<!ENTITY zotero.tagSelector.showAutomatic "Show automatic">
-<!ENTITY zotero.tagSelector.displayAllInLibrary "Display all tags in this library">
-<!ENTITY zotero.tagSelector.selectVisible "Select visible">
-<!ENTITY zotero.tagSelector.clearVisible "Deselect visible">
-<!ENTITY zotero.tagSelector.clearAll "Deselect all">
+<!ENTITY zotero.tagSelector.showAutomatic "Αυτόματη προβολή">
+<!ENTITY zotero.tagSelector.displayAllInLibrary "Εμφάνιση όλων των ετικετών αυτής της βιβλιοθήκης">
+<!ENTITY zotero.tagSelector.selectVisible "Επιλογή ορατών">
+<!ENTITY zotero.tagSelector.clearVisible "Αποεπιλογή ορατών">
+<!ENTITY zotero.tagSelector.clearAll "Αποεπιλογή όλων">
 <!ENTITY zotero.tagSelector.assignColor "Απόδοση χρώματος...">
 <!ENTITY zotero.tagSelector.renameTag "Rename Tag...">
 <!ENTITY zotero.tagSelector.deleteTag "Delete Tag...">
@@ -205,7 +205,7 @@
 <!ENTITY zotero.annotate.toolbar.collapse.label "Σύμπτυξη όλων των σχολιασμών">
 <!ENTITY zotero.annotate.toolbar.expand.label "Ανάπτυξη όλων των σχολιασμών">
 <!ENTITY zotero.annotate.toolbar.highlight.label "Υπογράμμιση κειμένου">
-<!ENTITY zotero.annotate.toolbar.unhighlight.label "Unhighlight Text">
+<!ENTITY zotero.annotate.toolbar.unhighlight.label "Αναίρεση υπογράμμισης κειμένου">
 
 <!ENTITY zotero.integration.prefs.displayAs.label "Προβολή παραπομπών ως:">
 <!ENTITY zotero.integration.prefs.footnotes.label "Σημειώσεις υποσέλιδου">
@@ -213,7 +213,7 @@
 
 <!ENTITY zotero.integration.prefs.formatUsing.label "Χρήση μορφής:">
 <!ENTITY zotero.integration.prefs.bookmarks.label "Σελιδοδείκτες">
-<!ENTITY zotero.integration.prefs.bookmarks.caption "Bookmarks are preserved across Microsoft Word and OpenOffice, but may be accidentally modified.">
+<!ENTITY zotero.integration.prefs.bookmarks.caption "Στα Microsoft Word και LibreOffice οι σελιδοδείκτες διατηρούνται αλλά ίσως τροποποιηθούν κατά λάθος. Για &#xA;λόγους συμβατότητας, όταν η λειτουργία αυτή είναι επιλεγμένη οι παραθέσεις/παραπομπές δεν μπορούν να εισαχθούν σε υποσέλιδες σημειώσεις ή σε σημειώσεις τέλους.">
 
 
 <!ENTITY zotero.integration.prefs.automaticJournalAbbeviations.label "Αυτόματη συντομογράφηση τίτλων περιοδικών">
@@ -253,7 +253,7 @@
 <!ENTITY zotero.proxy.recognized.disable.label "Να μην γίνεται αυτόματη ανακατεύθυνση των αιτήσεων μέσω προηγουμένως αναγνωρισμένων διαμεσολαβητών.">
 <!ENTITY zotero.proxy.recognized.ignore.label "Αγνόηση">
 
-<!ENTITY zotero.recognizePDF.recognizing.label "Retrieving Metadata...">
+<!ENTITY zotero.recognizePDF.recognizing.label "Ανάκτηση μεταδεδομένων...">
 <!ENTITY zotero.recognizePDF.cancel.label "Ακύρωση">
 <!ENTITY zotero.recognizePDF.pdfName.label "Όνομα PDF">
 <!ENTITY zotero.recognizePDF.itemName.label "Όνομα στοιχείου">
@@ -266,27 +266,27 @@
 <!ENTITY zotero.rtfScan.ambiguousCitations.label "Ασαφής παραπομπή">
 <!ENTITY zotero.rtfScan.mappedCitations.label "Χαρτογραφημένες παραπομπές">
 <!ENTITY zotero.rtfScan.introPage.label "Εισαγωγή">
-<!ENTITY zotero.rtfScan.introPage.description "Zotero can automatically extract and reformat citations and insert a bibliography into RTF files. To get started, choose an RTF file below.">
+<!ENTITY zotero.rtfScan.introPage.description "Το Zotero μπορεί αυτόματα να εξάγει και να αναδιαμορφώσει τις παραπομπές/παραθέσεις και να εισάγει βιβλιογραφία μέσα σε αρχεία τύπου RTF. Η λειτουργία Σάρωσης RTF υποστηρίζει τις παρακάτω μορφές παραπομπών/παραθέσεων: ">
 <!ENTITY zotero.rtfScan.introPage.description2 "Για να ξεκινήσετε, πιο κάτω επιλέξτε ένα αρχείο εισόδου RTF και ένα αρχείο εξόδου:">
 <!ENTITY zotero.rtfScan.scanPage.label "Σάρωση για παραπομπές">
 <!ENTITY zotero.rtfScan.scanPage.description "Το Zotero σαρώνει τα έγγραφά σας για παραπομπές. Παρακαλώ περιμένετε.">
 <!ENTITY zotero.rtfScan.citationsPage.label "Εξακρίβωση παρατιθέμενων στοιχείων">
 <!ENTITY zotero.rtfScan.citationsPage.description "Παρακαλώ, εξετάστε τον κατάλογο των αναγνωρισμένων παραπομπών που ακολουθεί για να βεβαιωθείτε ότι το Zotero έχει επιλέξει τα αντίστοιχα στοιχεία σωστά. Κάθε αχαρτογράφητη ή ασαφής παραπομπή πρέπει να αντιμετωπιστεί πριν προχωρήσετε στο επόμενο βήμα.">
-<!ENTITY zotero.rtfScan.stylePage.label "Document Formatting">
-<!ENTITY zotero.rtfScan.formatPage.label "Formatting Citations">
-<!ENTITY zotero.rtfScan.formatPage.description "Zotero is processing and formatting your RTF file. Please be patient.">
-<!ENTITY zotero.rtfScan.completePage.label "RTF Scan Complete">
-<!ENTITY zotero.rtfScan.completePage.description "Your document has now been scanned and processed. Please ensure that it is formatted correctly.">
-<!ENTITY zotero.rtfScan.inputFile.label "Input File">
-<!ENTITY zotero.rtfScan.outputFile.label "Output File">
+<!ENTITY zotero.rtfScan.stylePage.label "Μορφοποίηση εγγράφου">
+<!ENTITY zotero.rtfScan.formatPage.label "Μορφοποίηση παπομπών/παραθέσεων">
+<!ENTITY zotero.rtfScan.formatPage.description "Το Zotero επεξεργάζεται και μορφοποιεί τα αρχεία σας RTF. Παρακαλώ δείξτε υπομονή.">
+<!ENTITY zotero.rtfScan.completePage.label "Η Σάρωση RTF ολοκληρώθηκε">
+<!ENTITY zotero.rtfScan.completePage.description "Το έγγραφό σας σαρώθηκε και επεξεργάστηκε. Παρααλώ βεβαιωθείτε ότι μοφροποιήθηκε σωστά.">
+<!ENTITY zotero.rtfScan.inputFile.label "Αρχείο εισαγωγής">
+<!ENTITY zotero.rtfScan.outputFile.label "Αρχείο εξαγωγής">
 
-<!ENTITY zotero.file.choose.label "Choose File...">
-<!ENTITY zotero.file.noneSelected.label "No file selected">
+<!ENTITY zotero.file.choose.label "Επιλέξτε αρχείο...">
+<!ENTITY zotero.file.noneSelected.label "Δεν επιλέχθηκε αρχείο">
 
-<!ENTITY zotero.downloadManager.label "Save to Zotero">
-<!ENTITY zotero.downloadManager.saveToLibrary.description "Attachments cannot be saved to the currently selected library. This item will be saved to your library instead.">
-<!ENTITY zotero.downloadManager.noPDFTools.description "To use this feature, you must first install the PDF tools in the Search pane of the Zotero preferences.">
+<!ENTITY zotero.downloadManager.label "Αποθήκευση στο Zotero">
+<!ENTITY zotero.downloadManager.saveToLibrary.description "Στην επιλεγμένη βιβλιοθήκη δεν μπορούν να αποθηκευτούν προσαρτήματα. Αντ' αυτής, το στοιχείο θα αποθηκευτεί στην βιβλιοθήκη σας.">
+<!ENTITY zotero.downloadManager.noPDFTools.description "Για να χρησιμοποιήσετε τη λειτουργία αυτή πρώτα πρέπει να εγκαταστήσετε τα εργαλεία PDF στο πλαίσιο Αναζήτησης των Προτιμήσεων του Zotero.">
 
-<!ENTITY zotero.attachLink.title "Attach Link to URI">
-<!ENTITY zotero.attachLink.label.link "Link:">
-<!ENTITY zotero.attachLink.label.title "Title:">
+<!ENTITY zotero.attachLink.title "Προσάρτηση συνδέσμου στο URI">
+<!ENTITY zotero.attachLink.label.link "Σύνδεσμος:">
+<!ENTITY zotero.attachLink.label.title "Τίτλος:">
diff --git a/chrome/locale/el-GR/zotero/zotero.properties b/chrome/locale/el-GR/zotero/zotero.properties
index ecc153f89..0e7ba7a0c 100644
--- a/chrome/locale/el-GR/zotero/zotero.properties
+++ b/chrome/locale/el-GR/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/en-US/zotero/zotero.properties b/chrome/locale/en-US/zotero/zotero.properties
index c3980e481..c0c80012c 100644
--- a/chrome/locale/en-US/zotero/zotero.properties
+++ b/chrome/locale/en-US/zotero/zotero.properties
@@ -773,6 +773,9 @@ sync.removeGroupsAndSync			= Remove Groups and Sync
 sync.localObject					= Local Object
 sync.remoteObject					= Remote Object
 sync.mergedObject					= Merged Object
+sync.merge.resolveAllLocal         = Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote        = Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet			= Username not set
 sync.error.usernameNotSet.text		= You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/es-ES/zotero/preferences.dtd b/chrome/locale/es-ES/zotero/preferences.dtd
index bb0ca42f2..0f0b6c5f7 100644
--- a/chrome/locale/es-ES/zotero/preferences.dtd
+++ b/chrome/locale/es-ES/zotero/preferences.dtd
@@ -1,6 +1,6 @@
 <!ENTITY zotero.preferences.title "Preferencias de Zotero">
 
-<!ENTITY zotero.preferences.default "Inicial:">
+<!ENTITY zotero.preferences.default "Predeterminado:">
 <!ENTITY zotero.preferences.items "elementos">
 <!ENTITY zotero.preferences.period ",">
 <!ENTITY zotero.preferences.settings "Preferencias">
@@ -48,7 +48,7 @@
 
 <!ENTITY zotero.preferences.prefpane.sync "Sincronizar">
 <!ENTITY zotero.preferences.sync.username "Usuario:">
-<!ENTITY zotero.preferences.sync.password "Clave:">
+<!ENTITY zotero.preferences.sync.password "Contraseña:">
 <!ENTITY zotero.preferences.sync.syncServer "Servidor de sincronización Zotero">
 <!ENTITY zotero.preferences.sync.createAccount "Crear cuenta">
 <!ENTITY zotero.preferences.sync.lostPassword "¿Olvidó su contraseña?">
@@ -130,7 +130,7 @@
 <!ENTITY zotero.preferences.keys.quicksearch "Búsqueda rápida">
 <!ENTITY zotero.preferences.keys.newItem "Crear un nuevo elemento">
 <!ENTITY zotero.preferences.keys.newNote "Crear una Nueva nota">
-<!ENTITY zotero.preferences.keys.toggleTagSelector "Conmutar el selector de marcas">
+<!ENTITY zotero.preferences.keys.toggleTagSelector "Conmutar el selector de etiquetas">
 <!ENTITY zotero.preferences.keys.copySelectedItemCitationsToClipboard "Copiar las citas para los elementos seleccionados al portapapeles">
 <!ENTITY zotero.preferences.keys.copySelectedItemsToClipboard "Copiar los elementos seleccionados al portapapeles">
 <!ENTITY zotero.preferences.keys.importFromClipboard "Importar desde el portapapeles">
@@ -160,7 +160,7 @@
 
 <!ENTITY zotero.preferences.prefpane.advanced "Avanzadas">
 <!ENTITY zotero.preferences.advanced.filesAndFolders "Archivos y carpetas">
-<!ENTITY zotero.preferences.advanced.keys "Shortcuts">
+<!ENTITY zotero.preferences.advanced.keys "Atajos">
 
 <!ENTITY zotero.preferences.prefpane.locate "Localizar">
 <!ENTITY zotero.preferences.locate.locateEngineManager "Administrador de motor de búsqueda de artículo">
@@ -194,7 +194,7 @@
 
 <!ENTITY zotero.preferences.debugOutputLogging "Registro de emisión de depuración">
 <!ENTITY zotero.preferences.debugOutputLogging.message "La emisión de depuración puede ayudar a los desarrolladores de Zotero a diagnosticar problemas. Como el registro de depuración enlentece a Zotero, deberías dejarlo desactivado normalmente a menos que algún desarrollador de Zotero te pida la salida de depuración.">
-<!ENTITY zotero.preferences.debugOutputLogging.linesLogged "líneas en el registro">
+<!ENTITY zotero.preferences.debugOutputLogging.linesLogged "líneas registradas">
 <!ENTITY zotero.preferences.debugOutputLogging.enableAfterRestart "Activar tras el reinicio">
 <!ENTITY zotero.preferences.debugOutputLogging.viewOutput "Ver salida">
 <!ENTITY zotero.preferences.debugOutputLogging.clearOutput "Limpiar salida">
diff --git a/chrome/locale/es-ES/zotero/zotero.properties b/chrome/locale/es-ES/zotero/zotero.properties
index 5e9876446..4bb73516f 100644
--- a/chrome/locale/es-ES/zotero/zotero.properties
+++ b/chrome/locale/es-ES/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=Crear
 general.delete=Borrar
 general.moreInformation=Más información
 general.seeForMoreInformation=Mira en %S para más información
-general.open=Open %S
+general.open=Abrir %S
 general.enable=Activar
 general.disable=Desactivar
 general.remove=Eliminar
@@ -204,11 +204,11 @@ pane.items.trash.multiple=¿Seguro que quieres enviar los ítems a la papelera?
 pane.items.delete.title=Borrar
 pane.items.delete=¿Seguro que quieres borrar el ítem asociado?
 pane.items.delete.multiple=¿Seguro que quieres borrar los ítems seleccionados?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=Quitar de la colección
+pane.items.remove=¿Seguro que quiere eliminar el elemento seleccionado de esta colección?
+pane.items.remove.multiple=¿Está seguro que quiere eliminar estos elementos seleccionados de esta colección?
+pane.items.menu.remove=Quitar ítem de la colección...
+pane.items.menu.remove.multiple=Quitar ítems de la colección...
 pane.items.menu.moveToTrash=Mover ítem a la papelera...
 pane.items.menu.moveToTrash.multiple=Mover ítems a la papelera...
 pane.items.menu.export=Exportar el ítem seleccionado...
@@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Formatos de exportación
 zotero.preferences.export.quickCopy.instructions=La copia rápida te permite copiar referencias seleccionadas al portapapeles pulsando un atajo (%S) o arrastrando ítems a una casilla de texto en una página web.
 zotero.preferences.export.quickCopy.citationInstructions=Para estilos bibliográficos, puedes copiar las citas o pies de página presionando %S o manteniendo pulsada la tecla Mayúsculas antes de arrastrar los ítems.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
-zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
-zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
-zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
-zotero.preferences.wordProcessors.install=Install %S Add-in
-zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
-zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
-zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
+zotero.preferences.wordProcessors.installationSuccess=Instalación fue exitosa.
+zotero.preferences.wordProcessors.installationError=Instalación no pudo ser completada debido a que un error ocurrió. Por favor asegúrese que %1$S está cerrado, posteriormente reinicie %2$S.
+zotero.preferences.wordProcessors.installed=El complemento %S está actualmente instalado.
+zotero.preferences.wordProcessors.notInstalled=El complemento %S no está actualmente instalado.
+zotero.preferences.wordProcessors.install=Instalar complemento %S
+zotero.preferences.wordProcessors.reinstall=Reinstalar complemento %S
+zotero.preferences.wordProcessors.installing=Instalado %S...
+zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S es incompatible con las versiones de %3$S anteriores %4$S. Por favor quite %3$S, o descargue la última versión desde %5$S.
+zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requiere %3$S %4$S o posteriores para funcionar. Por favor descargue la última versión de %3$S desde %5$S.
 
 zotero.preferences.styles.addStyle=Agregar estilo
 
@@ -738,7 +738,7 @@ integration.missingItem.multiple=El ítem %1$S en esta cita ya no existe en tu b
 integration.missingItem.description=Al pulsar "No" borrarás los códigos de campo para citas conteniendo este ítem, manteniendo el texto de la cita pero borrándolo de tu bibliografía.
 integration.removeCodesWarning=Quitando los códigos de campo impedirás que Zotero de actualice citas y bibliografías en este documento. ¿Estás seguro de que deseas continuar?
 integration.upgradeWarning=Tu documento debe ser actualizado de versión de manera permanente para poder funcionar con Zotero 2.1 o posterior. Se recomienda hacer una copia de seguridad antes de proceder. ¿Seguro que quieres continuar?
-integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
+integration.error.newerDocumentVersion=Su documento fue creado con una versión más reciente de Zotero (%1$S) que la actual versión instalada (%2$S). Por favor actualice Zotero antes de editar este documento.
 integration.corruptField=El código de campo Zotero correspondiente a esta cita, el cual señala a Zotero qué ítem en su biblioteca esta cita representa, se ha dañado. ¿Te gustaría volver a seleccionar este ítem?
 integration.corruptField.description=Al pulsar "No" borrarás los códigos de campo para las citas conteniendo este ítem, preservando este texto de cita pero potencialmente borrándolo de tu bibliografía.
 integration.corruptBibliography=El código de campo Zotero en tu bibliografía está corrupto. ¿Debería Zotero borrar este código de campo y generar una nueva bibliografía?
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Quitar grupos y sincronizar
 sync.localObject=Objeto local
 sync.remoteObject=Objeto remoto
 sync.mergedObject=Unir objeto
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nombre de usuario no provisto
 sync.error.usernameNotSet.text=Debes introducir tu usuario y contraseña de zotero.org en las preferencias de Zotero para sincronizar con el servidor de Zotero.
diff --git a/chrome/locale/et-EE/zotero/zotero.properties b/chrome/locale/et-EE/zotero/zotero.properties
index 7dd48ee29..6feae0d6f 100644
--- a/chrome/locale/et-EE/zotero/zotero.properties
+++ b/chrome/locale/et-EE/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Eemalda Grupid ja Sync
 sync.localObject=Kohalik objekt
 sync.remoteObject=Serveri objekt
 sync.mergedObject=Liidetud objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Kasutajanimi ei ole määratud
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/eu-ES/zotero/zotero.properties b/chrome/locale/eu-ES/zotero/zotero.properties
index 73c763c17..daab73d9e 100644
--- a/chrome/locale/eu-ES/zotero/zotero.properties
+++ b/chrome/locale/eu-ES/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Ezabatu Groups eta Sync
 sync.localObject=item lokala
 sync.remoteObject=serbidoreko itema
 sync.mergedObject=proposamen automatikoa
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Erabiltzaile izena ezarri gabe
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/fa/zotero/zotero.properties b/chrome/locale/fa/zotero/zotero.properties
index 11a0a78ed..3aa141d50 100644
--- a/chrome/locale/fa/zotero/zotero.properties
+++ b/chrome/locale/fa/zotero/zotero.properties
@@ -48,8 +48,8 @@ general.disable=غیرفعال
 general.remove=حذف
 general.reset=تنظیم مجدد
 general.hide=پنهان‌کردن
-general.quit=Quit
-general.useDefault=Use Default
+general.quit=خروج
+general.useDefault=استفاده از پیش‌فرض
 general.openDocumentation=Open Documentation
 general.numMore=%S more…
 general.openPreferences=بازکردن تنظیمات
@@ -166,7 +166,7 @@ pane.collections.groupLibraries=Group Libraries
 pane.collections.trash=سطل بازیافت
 pane.collections.untitled=بدون عنوان
 pane.collections.unfiled=آیتم‌های دسته‌بندی نشده
-pane.collections.duplicate=Duplicate Items
+pane.collections.duplicate=موارد تکراری
 
 pane.collections.menu.rename.collection=تغییر نام مجموعه...
 pane.collections.menu.edit.savedSearch=ویرایش جستجوی ذخیره شده
@@ -204,11 +204,11 @@ pane.items.trash.multiple=آیتم‌‌های انتخاب شده به سطل 
 pane.items.delete.title=حذف
 pane.items.delete=آیتم‌ انتخاب شده حذف شود؟
 pane.items.delete.multiple=آیتم‌‌های انتخاب شده حذف شوند؟
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=حذف از مجموعه
+pane.items.remove=آیا اطمینان دارید  که می‌خواهید مورد انتخاب شده از این مجموعه را حذف کنید؟
+pane.items.remove.multiple=آیا اطمینان دارید  که می خواهید موارد انتخاب شده از این مجموعه را می‌خواهید حذف کنید؟
+pane.items.menu.remove=حذف ایتم از مجموعه
+pane.items.menu.remove.multiple=حذف آیتم‌ها از مجموعه
 pane.items.menu.moveToTrash=انتقال به سطل بازیافت...
 pane.items.menu.moveToTrash.multiple=انتقال به سطل بازیافت...
 pane.items.menu.export=صدور این آیتم...
@@ -225,7 +225,7 @@ pane.items.menu.createParent=ساخت آیتم‌ مادر از این آیتم
 pane.items.menu.createParent.multiple=ساخت آیتم‌های مادر از آیتم‌های انتخاب شده
 pane.items.menu.renameAttachments=تغییر نام پرونده با توجه به فراداده‌های مادر
 pane.items.menu.renameAttachments.multiple=تغییر نام پرونده‌ها با توجه به فراداده‌های مادر
-pane.items.showItemInLibrary=Show Item in Library
+pane.items.showItemInLibrary=نمایش آیتم در کتابخانه
 
 pane.items.letter.oneParticipant=نامه به %S
 pane.items.letter.twoParticipants=نامه به %S و %S
@@ -255,8 +255,8 @@ pane.item.defaultLastName=نام خانوادگی
 pane.item.defaultFullName=نام کامل
 pane.item.switchFieldMode.one=تعویض به تک فیلدی
 pane.item.switchFieldMode.two=تعویض به دو فیلدی
-pane.item.creator.moveUp=Move Up
-pane.item.creator.moveDown=Move Down
+pane.item.creator.moveUp=حرکت به بالا
+pane.item.creator.moveDown=حرکت به پایین
 pane.item.notes.untitled=یادداشت بی‌عنوان
 pane.item.notes.delete.confirm=آیا واقعا می‌خواهید این یادداشت را حذف کنید؟
 pane.item.notes.count.zero=بدون یادداشت:
@@ -477,12 +477,12 @@ fileTypes.document=سند
 
 save.attachment=در حال ذخیره تصویر لحظه‌ای...
 save.link=در حال ذخیره پیوند...
-save.link.error=An error occurred while saving this link.
-save.error.cannotMakeChangesToCollection=You cannot make changes to the currently selected collection.
-save.error.cannotAddFilesToCollection=You cannot add files to the currently selected collection.
+save.link.error=هنگام ذخیره لینک خطایی رخ داد.
+save.error.cannotMakeChangesToCollection=شما نمی‌توانید تغییراتی در مجموعه انتخاب‌شده بدهید.
+save.error.cannotAddFilesToCollection=شما نمی‌توانید به مجموعه انتخاب‌شده، فایل‌ها را اضافه کنید.
 
 ingester.saveToZotero=ذخیره در زوترو
-ingester.saveToZoteroUsing=Save to Zotero using "%S"
+ingester.saveToZoteroUsing=ذخیره در زوترور از طریق  "%S"
 ingester.scraping=در حال ذخیره...
 ingester.scrapingTo=Saving to
 ingester.scrapeComplete=ذخیره شد
@@ -495,7 +495,7 @@ ingester.importReferRISDialog.title=درون‌برد RIS/Refer زوترو
 ingester.importReferRISDialog.text=آیا می‌خواهید آیتم‌ها از "%1$S" به زوترو، درون‌برد شوند؟\n\nشما می‌توانید درون‌برد خودکار RIS/Refer را در تنظیمات زوترو، غیرفعال کنید.
 ingester.importReferRISDialog.checkMsg=همیشه برای این وب‌گاه، اجازه داده شود
 
-ingester.importFile.title=Import File
+ingester.importFile.title=واردکردن فایل
 ingester.importFile.text=Do you want to import the file "%S"?
 ingester.importFile.intoNewCollection=Import into new collection
 
@@ -566,7 +566,7 @@ zotero.preferences.export.quickCopy.exportFormats=قالب‌های صدور
 zotero.preferences.export.quickCopy.instructions=با استفاده از "رونوشت سریع" می‌توان مرجع‌های انتخاب شده را با فشردن کلید میان‌بر (%S) یا کشیدن آیتم‌ها به درون جعبه متن روی صفحه وب، رونوشت‌برداری کرد.
 zotero.preferences.export.quickCopy.citationInstructions=For bibliography styles, you can copy citations or footnotes by pressing %S or holding down Shift before dragging items.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
+zotero.preferences.wordProcessors.installationSuccess=با موفقیت نصب شد.
 zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
 zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
 zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
@@ -713,7 +713,7 @@ integration.removeBibEntry.body=آیا واقعا می‌خواهید آن را
 
 integration.cited=Cited
 integration.cited.loading=Loading Cited Items…
-integration.ibid=ibid
+integration.ibid=همان
 integration.emptyCitationWarning.title=یادکرد خالی
 integration.emptyCitationWarning.body=یادکرد تعیین شده در شیوه فعلی خالی خواهد بود. آیا واقعا می‌خواهید آن را بیفزایید؟
 integration.openInLibrary=Open in %S
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=حذف گروه‌ها و همزمان‌‌سازی
 sync.localObject=شیء محلی
 sync.remoteObject=شیء دور
 sync.mergedObject=شیء تلفیقی
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=نام کاربری وارد نشده است
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
@@ -915,7 +918,7 @@ proxies.recognized.add=افزودن پیشکار
 recognizePDF.noOCR=PDF دارای متن OCR نیست.
 recognizePDF.couldNotRead=خواندن متن از PDF امکان‌پذیر نبود.
 recognizePDF.noMatches=No matching references found
-recognizePDF.fileNotFound=File not found
+recognizePDF.fileNotFound=فایل پیدا نشد
 recognizePDF.limit=Google Scholar query limit reached. Try again later.
 recognizePDF.error=An unexpected error occurred.
 recognizePDF.stopped=لغو شده
@@ -985,7 +988,7 @@ firstRunGuidance.quickFormatMac=Type a title or author to search for a reference
 firstRunGuidance.toolbarButton.new=Click here to open Zotero, or use the %S keyboard shortcut.
 firstRunGuidance.toolbarButton.upgrade=The Zotero icon can now be found in the Firefox toolbar. Click the icon to open Zotero, or use the %S keyboard shortcut.
 
-styles.bibliography=Bibliography
+styles.bibliography=کتابنامه
 styles.editor.save=Save Citation Style
 styles.editor.warning.noItems=No items selected in Zotero.
 styles.editor.warning.parseError=Error parsing style:
diff --git a/chrome/locale/fi-FI/zotero/zotero.properties b/chrome/locale/fi-FI/zotero/zotero.properties
index b5e8b0475..969febb14 100644
--- a/chrome/locale/fi-FI/zotero/zotero.properties
+++ b/chrome/locale/fi-FI/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Poista ryhmät ja synkronointi
 sync.localObject=Paikallinen objekti
 sync.remoteObject=Etäobjekti
 sync.mergedObject=Yhdistetty objekti
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Käyttäjänimeä ei määritetty
 sync.error.usernameNotSet.text=Syötä zotero.orgin käyttäjätunnus ja salasana Zoteron asetuksissa, jotta voit synkronoida tiedot Zotero-palvelimen kanssa.
diff --git a/chrome/locale/fr-FR/zotero/zotero.properties b/chrome/locale/fr-FR/zotero/zotero.properties
index 6d9bf15b4..481126775 100644
--- a/chrome/locale/fr-FR/zotero/zotero.properties
+++ b/chrome/locale/fr-FR/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Retirer les groupes et synchroniser
 sync.localObject=Objet local
 sync.remoteObject=Objet distant
 sync.mergedObject=Objet fusionné
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Identifiant non défini
 sync.error.usernameNotSet.text=Vous devez saisir vos nom d'utilisateur et  mot de passe, propres à zotero.org, dans les Préférences de Zotero pour synchroniser avec le serveur Zotero.
diff --git a/chrome/locale/gl-ES/zotero/zotero.properties b/chrome/locale/gl-ES/zotero/zotero.properties
index ac2e4724e..bd97e6c81 100644
--- a/chrome/locale/gl-ES/zotero/zotero.properties
+++ b/chrome/locale/gl-ES/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Borrar o grupo e a sincronización
 sync.localObject=Obxecto local
 sync.remoteObject=Obxecto remoto
 sync.mergedObject=Obxecto unido
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nome de usuario sen definir
 sync.error.usernameNotSet.text=Tes que introducir o teu nome de usuario de zotero.org e o contrasinal nas preferencias de Zotero e con iso poder sincronizar co servidor de Zotero.
diff --git a/chrome/locale/he-IL/zotero/zotero.properties b/chrome/locale/he-IL/zotero/zotero.properties
index 030378a8d..7fb3d6752 100644
--- a/chrome/locale/he-IL/zotero/zotero.properties
+++ b/chrome/locale/he-IL/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/hr-HR/zotero/zotero.properties b/chrome/locale/hr-HR/zotero/zotero.properties
index f42d73143..184cd38e5 100644
--- a/chrome/locale/hr-HR/zotero/zotero.properties
+++ b/chrome/locale/hr-HR/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/hu-HU/zotero/zotero.properties b/chrome/locale/hu-HU/zotero/zotero.properties
index cb5d9b460..c113c7392 100644
--- a/chrome/locale/hu-HU/zotero/zotero.properties
+++ b/chrome/locale/hu-HU/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=Új
 general.delete=Törlés
 general.moreInformation=További információ
 general.seeForMoreInformation=A %S bővebb információkat tartalmaz.
-general.open=Open %S
+general.open=Megnyitás %S
 general.enable=Bekapcsolás
 general.disable=Kikapcsolás
 general.remove=Eltávolítás
@@ -194,7 +194,7 @@ tagColorChooser.numberKeyInstructions=You can add this tag to selected items by
 tagColorChooser.maxTags=Up to %S tags in each library can have colors assigned.
 
 pane.items.loading=Elemek listájának betöltése...
-pane.items.columnChooser.moreColumns=More Columns
+pane.items.columnChooser.moreColumns=Több oszlop
 pane.items.columnChooser.secondarySort=Másodlagos adatrendezés (%S)
 pane.items.attach.link.uri.unrecognized=A Zotero nem ismerte fel a beírt URI-t. Kérem ellenőrizze a címet és próbálja újra.
 pane.items.attach.link.uri.file=Ha linket szeretne csatolni egy fájlhoz, kérem használja a “%S”-t.
@@ -204,11 +204,11 @@ pane.items.trash.multiple=A Kukába helyezés megerősítése?
 pane.items.delete.title=Törlés
 pane.items.delete=A kijelölt elem törlésének megerősítése?
 pane.items.delete.multiple=A kijelölt elemek törlésének megerősítése?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=Gyűjtemény törlése...
+pane.items.remove=Biztos, hogy el akarja távolítani a kijelölt elemet a gyűjteményből?
+pane.items.remove.multiple=Biztos, hogy el akarja távolítani a kijelölt elemeket a gyűjteményből?
+pane.items.menu.remove=Kijelölt elem törlése
+pane.items.menu.remove.multiple=Kijelölt elemek törlése
 pane.items.menu.moveToTrash=Elem mozgatása a Kukába…
 pane.items.menu.moveToTrash.multiple=Elem mozgatása a Kukába…
 pane.items.menu.export=Kiválasztott elem exportálása...
@@ -225,7 +225,7 @@ pane.items.menu.createParent=Szülőelem létrehozása a kijelölt elem alapján
 pane.items.menu.createParent.multiple=Szülőelemek létrehozása a kijelölt elemek alapján
 pane.items.menu.renameAttachments=A fájl átnevezése a szülő metaadata alapján
 pane.items.menu.renameAttachments.multiple=A fájlok átnevezése a szülők metaadata alapján
-pane.items.showItemInLibrary=Show Item in Library
+pane.items.showItemInLibrary=Az elem megjelenítése könyvtárban
 
 pane.items.letter.oneParticipant=Levél (címzett: %S)
 pane.items.letter.twoParticipants=Levél (címzett: %S és %S)
@@ -566,13 +566,13 @@ zotero.preferences.export.quickCopy.exportFormats=Exportálási formátumok
 zotero.preferences.export.quickCopy.instructions=A Gyorsmásolás segítségével a kiválasztott hivatkozásokat a vágólapra lehet másolni a %S gyorsbillentyű lenyomásával. A hivatkozást egy tetszőleges weboldal szövegmezőjébe is be lehet másolni, ha a kijelölt hivatkozást a szövegmezőbe húzzuk.
 zotero.preferences.export.quickCopy.citationInstructions=Bibliográfia-stílusokhoz, %S megnyomásával másolhat hivatkozásokat vagy lábjegyzeteket, vagy tartsa lenyomva a Shift-et az elemek áthúzáshoz.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
+zotero.preferences.wordProcessors.installationSuccess=A telepítés sikeresen befejeződött.
 zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
 zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
 zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
 zotero.preferences.wordProcessors.install=Install %S Add-in
 zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
+zotero.preferences.wordProcessors.installing=Telepítés %S…
 zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
 zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
 
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Csoport és szinkronizáció eltávolítása
 sync.localObject=Helyi objektum
 sync.remoteObject=Távoli objektum
 sync.mergedObject=Összefésült objektum
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Felhasználónév nincs megadva
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
@@ -985,11 +988,11 @@ firstRunGuidance.quickFormatMac=Type a title or author to search for a reference
 firstRunGuidance.toolbarButton.new=A Zotero megnyitásához kattintásához kattintson ide, vagy használja a %S billentyűparancsot.
 firstRunGuidance.toolbarButton.upgrade=A Zotero ikon mostantól a Firefox eszköztárán található. A Zotero megnyitásához kattintson az ikonra, vagy használja a %S gyorsbillentyűt.
 
-styles.bibliography=Bibliography
-styles.editor.save=Save Citation Style
-styles.editor.warning.noItems=No items selected in Zotero.
+styles.bibliography=Bibliográfia
+styles.editor.save=Hivatkozási stílus mentése
+styles.editor.warning.noItems=Nincs kiválasztott elem a Zoteroban.
 styles.editor.warning.parseError=Error parsing style:
-styles.editor.warning.renderError=Error generating citations and bibliography:
+styles.editor.warning.renderError=Hiba a hivatkozások és a bibliográfia generálása közben:
 styles.editor.output.individualCitations=Individual Citations
 styles.editor.output.singleCitation=Single Citation (with position "first")
 styles.preview.instructions=Select one or more items in Zotero and click the "Refresh" button to see how these items are rendered by the installed CSL citation styles.
diff --git a/chrome/locale/id-ID/zotero/zotero.properties b/chrome/locale/id-ID/zotero/zotero.properties
index 7fc8cfca7..c32b67e5d 100644
--- a/chrome/locale/id-ID/zotero/zotero.properties
+++ b/chrome/locale/id-ID/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Hapus Grup dan Sinkronisasi
 sync.localObject=Objek Lokal
 sync.remoteObject=Objek Jauh
 sync.mergedObject=Objek Gabungan
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nama pengguna belum diset
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/is-IS/zotero/zotero.properties b/chrome/locale/is-IS/zotero/zotero.properties
index cbfb0fff2..b78819e7f 100644
--- a/chrome/locale/is-IS/zotero/zotero.properties
+++ b/chrome/locale/is-IS/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Fjarlægja hópa og samhæfa
 sync.localObject=Staðbundinn hlutur
 sync.remoteObject=Fjartengdur hlutur
 sync.mergedObject=Sameinaður hlutur
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Notandanafn ekki tilgreint
 sync.error.usernameNotSet.text=Þú verður að færa inn zotero.org notandanafn og lykilorð í Zotero kjörstillingum til að samhæfa Zotero þjóni.
diff --git a/chrome/locale/it-IT/zotero/zotero.properties b/chrome/locale/it-IT/zotero/zotero.properties
index 8a3317d6a..5bf41139e 100644
--- a/chrome/locale/it-IT/zotero/zotero.properties
+++ b/chrome/locale/it-IT/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Rimuovere i Gruppi e la Sincronizzazione
 sync.localObject=Oggetto locale
 sync.remoteObject=Oggetto remoto
 sync.mergedObject=Oggetto unificato
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nome utente non impostato
 sync.error.usernameNotSet.text=È necessario inserire le proprie credenziali di zotero.org nelle impostazioni di Zotero per attivare la sincronizzazione con il server Zotero.
diff --git a/chrome/locale/ja-JP/zotero/zotero.properties b/chrome/locale/ja-JP/zotero/zotero.properties
index c1657a4e6..4f0ddc86f 100644
--- a/chrome/locale/ja-JP/zotero/zotero.properties
+++ b/chrome/locale/ja-JP/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=グループと同期を取り除く
 sync.localObject=ローカル(手元)のオブジェクト
 sync.remoteObject=リモート(サーバ側)のオブジェクト
 sync.mergedObject=統合されたオブジェクト
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=ユーザーネームが指定されていません
 sync.error.usernameNotSet.text=Zotero サーバーと同期するためには、Zotero 環境設定において、zotero.org のユーザー名とパスワードを入力する必要があります。
diff --git a/chrome/locale/km/zotero/zotero.properties b/chrome/locale/km/zotero/zotero.properties
index fb05361ed..fd6a8005e 100644
--- a/chrome/locale/km/zotero/zotero.properties
+++ b/chrome/locale/km/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=លុបក្រុម និង សមកាលក
 sync.localObject=វត្ថុមូលដ្ឋាន
 sync.remoteObject=វត្ថុឆ្ងាយ
 sync.mergedObject=វត្ថុរួម
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=មិនបានដាក់ឈ្មោះអ្នកប្រើ
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/ko-KR/zotero/zotero.properties b/chrome/locale/ko-KR/zotero/zotero.properties
index d2f2f10f3..3b5e3b8f9 100644
--- a/chrome/locale/ko-KR/zotero/zotero.properties
+++ b/chrome/locale/ko-KR/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=그룹 및 동기화 제거
 sync.localObject=지역 개체
 sync.remoteObject=원격 개체
 sync.mergedObject=병합된 개체
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=사용자명 설정되지 않음
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/lt-LT/zotero/zotero.properties b/chrome/locale/lt-LT/zotero/zotero.properties
index 0bc7421d1..c3c2be77e 100644
--- a/chrome/locale/lt-LT/zotero/zotero.properties
+++ b/chrome/locale/lt-LT/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Pašalinti grupes ir sinchronizuoti
 sync.localObject=Vietinis objektas
 sync.remoteObject=Nutolęs objektas
 sync.mergedObject=Apjungtas objektas
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nenurodytas naudotojo vardas
 sync.error.usernameNotSet.text=Norėdami duomenis sinchronizuoti su Zotero serveriu, įveskite savo zotero.org naudotojo vardą ir slaptažodį.
diff --git a/chrome/locale/mn-MN/zotero/zotero.properties b/chrome/locale/mn-MN/zotero/zotero.properties
index 2cf0f811a..44bfb24b1 100644
--- a/chrome/locale/mn-MN/zotero/zotero.properties
+++ b/chrome/locale/mn-MN/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/nb-NO/zotero/zotero.properties b/chrome/locale/nb-NO/zotero/zotero.properties
index 15c3cb60e..c3bf28fae 100644
--- a/chrome/locale/nb-NO/zotero/zotero.properties
+++ b/chrome/locale/nb-NO/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/nl-NL/zotero/zotero.properties b/chrome/locale/nl-NL/zotero/zotero.properties
index 74fd49f43..19caf1d7d 100644
--- a/chrome/locale/nl-NL/zotero/zotero.properties
+++ b/chrome/locale/nl-NL/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Groepen en synchronisatie verwijderen
 sync.localObject=Lokaal item
 sync.remoteObject=Item van server
 sync.mergedObject=Samengevoegd item
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Gebruikersnaam niet ingesteld
 sync.error.usernameNotSet.text=U moet uw zotero.org gebruikersnaam en wachtwoord in de Zotero-voorkeuren invoeren om te kunnen synchroniseren met de Zotero-server.
diff --git a/chrome/locale/nn-NO/zotero/zotero.properties b/chrome/locale/nn-NO/zotero/zotero.properties
index cfa7f47b8..511a5f796 100644
--- a/chrome/locale/nn-NO/zotero/zotero.properties
+++ b/chrome/locale/nn-NO/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/pl-PL/zotero/zotero.properties b/chrome/locale/pl-PL/zotero/zotero.properties
index 7c6e337b5..a00ee0f13 100644
--- a/chrome/locale/pl-PL/zotero/zotero.properties
+++ b/chrome/locale/pl-PL/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Usuń grupy i synchronizuj
 sync.localObject=Obiekt lokalny
 sync.remoteObject=Obiekt zdalny
 sync.mergedObject=Złączony obiekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nie podano nazwy użytkownika
 sync.error.usernameNotSet.text=W celu synchronizacji z serwerem Zotero musisz podać w ustawieniach Zotero swoją nazwę użytkownika i hasło używane w serwisie zotero.org.
diff --git a/chrome/locale/pt-BR/zotero/zotero.properties b/chrome/locale/pt-BR/zotero/zotero.properties
index b8e45a449..356a132e2 100644
--- a/chrome/locale/pt-BR/zotero/zotero.properties
+++ b/chrome/locale/pt-BR/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remover grupos e sincronização
 sync.localObject=Objeto local
 sync.remoteObject=Objeto remoto
 sync.mergedObject=Objeto mesclado
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nome de usuário não configurado
 sync.error.usernameNotSet.text=Você deve inserir seu nome de usuário e senha do zotero.org nas preferências do Zotero para sincronizar os dados com o servidor Zotero.
diff --git a/chrome/locale/pt-PT/zotero/zotero.properties b/chrome/locale/pt-PT/zotero/zotero.properties
index 5f8dd5e6c..1c416af7a 100644
--- a/chrome/locale/pt-PT/zotero/zotero.properties
+++ b/chrome/locale/pt-PT/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remover Grupos e Sincronização
 sync.localObject=Objecto Local
 sync.remoteObject=Objecto Remoto
 sync.mergedObject=Objecto Integrado
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nome de utilizador por indicar
 sync.error.usernameNotSet.text=Tem de introduzir o seu nome de utilizador e a sua palavra-passe do zotero.org nas preferências Zotero para sincronizar com o servidor Zotero.
diff --git a/chrome/locale/ro-RO/zotero/zotero.properties b/chrome/locale/ro-RO/zotero/zotero.properties
index bbe895dae..ae949aec2 100644
--- a/chrome/locale/ro-RO/zotero/zotero.properties
+++ b/chrome/locale/ro-RO/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Șterge Grupuri și Sincronizare
 sync.localObject=Obiect local
 sync.remoteObject=Obiect la distanță
 sync.mergedObject=Obiect unificat
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nume de utilizator neconfigurat
 sync.error.usernameNotSet.text=Trebuie să introduci numele de utilizator zotero.org și parola în preferințele Zotero pentru a sincroniza cu serverul Zotero.
diff --git a/chrome/locale/ru-RU/zotero/zotero.properties b/chrome/locale/ru-RU/zotero/zotero.properties
index 878a22c73..bf01e5e0e 100644
--- a/chrome/locale/ru-RU/zotero/zotero.properties
+++ b/chrome/locale/ru-RU/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Обнулить группы и синхронизир
 sync.localObject=Локальный объект
 sync.remoteObject=Удаленный объект
 sync.mergedObject=Объединенный объект
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Имя пользователя не установлено
 sync.error.usernameNotSet.text=Для выполнения синхронизации с сервером Zotero необходимо указать имя и пароль пользователя для zotero.org в настройках Zotero.
diff --git a/chrome/locale/sk-SK/zotero/zotero.properties b/chrome/locale/sk-SK/zotero/zotero.properties
index b13606bcc..480a019c8 100644
--- a/chrome/locale/sk-SK/zotero/zotero.properties
+++ b/chrome/locale/sk-SK/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstrániť skupiny a synchronizovať
 sync.localObject=Miestny objekt
 sync.remoteObject=Vzdialený objekt
 sync.mergedObject=Zlúčený objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Nie je nastavené meno používateľa
 sync.error.usernameNotSet.text=Pre synchronizáciu so serverom Zotero musíte zadať vaše užívateľské meno a heslo pre zotero.org v predvoľbách Zotera.
diff --git a/chrome/locale/sl-SI/zotero/preferences.dtd b/chrome/locale/sl-SI/zotero/preferences.dtd
index fc2610e01..701fab826 100644
--- a/chrome/locale/sl-SI/zotero/preferences.dtd
+++ b/chrome/locale/sl-SI/zotero/preferences.dtd
@@ -160,7 +160,7 @@
 
 <!ENTITY zotero.preferences.prefpane.advanced "Napredno">
 <!ENTITY zotero.preferences.advanced.filesAndFolders "Datoteke in mape">
-<!ENTITY zotero.preferences.advanced.keys "Shortcuts">
+<!ENTITY zotero.preferences.advanced.keys "Tipke za bližnjice">
 
 <!ENTITY zotero.preferences.prefpane.locate "Lociraj">
 <!ENTITY zotero.preferences.locate.locateEngineManager "Upravitelj pogona iskanja člankov">
diff --git a/chrome/locale/sl-SI/zotero/zotero.properties b/chrome/locale/sl-SI/zotero/zotero.properties
index 542ba7c59..284c72351 100644
--- a/chrome/locale/sl-SI/zotero/zotero.properties
+++ b/chrome/locale/sl-SI/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=Ustvari
 general.delete=Izbriši
 general.moreInformation=Podrobnosti
 general.seeForMoreInformation=Oglejte si %S za več informacij.
-general.open=Open %S
+general.open=Odpri %S
 general.enable=Omogoči
 general.disable=Onemogoči
 general.remove=Odstrani
@@ -204,11 +204,11 @@ pane.items.trash.multiple=Ste prepričani, da želite izbrane vnose vreči v ko
 pane.items.delete.title=Izbriši
 pane.items.delete=Ste prepričani, da želite izbrisati izbrani vnos?
 pane.items.delete.multiple=Ste prepričani, da želite izbrisati izbrane vnose?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=Odstrani iz zbirke
+pane.items.remove=Ste prepričani, da želite izbrani vnos izbrisati iz te zbirke?
+pane.items.remove.multiple=Ste prepričani, da želite izbrane vnose izbrisati iz te zbirke?
+pane.items.menu.remove=Odstrani vnos iz zbirke ...
+pane.items.menu.remove.multiple=Odstrani vnose iz zbirke ...
 pane.items.menu.moveToTrash=Premakni vnos v koš ...
 pane.items.menu.moveToTrash.multiple=Premakni vnose v koš ...
 pane.items.menu.export=Izvozi vnos ...
@@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Vrste izvoza
 zotero.preferences.export.quickCopy.instructions=Hitro kopiranje omogoča kopiranje izbranih sklicev na odložišče s pritiskom na tipko za bližnjico (%S) ali vleko vnosov v besedilno polje na spletni strani.
 zotero.preferences.export.quickCopy.citationInstructions=Za sloge bibliografije lahko kopirate citate ali sprotne opombe s pritiskom %S ali s pritisnjeno dvigalko pred vleko vnosov.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
-zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
-zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
-zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
-zotero.preferences.wordProcessors.install=Install %S Add-in
-zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
-zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
-zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
+zotero.preferences.wordProcessors.installationSuccess=Namestitev je uspela.
+zotero.preferences.wordProcessors.installationError=Nameščanja ni mogoče zaključiti, ker je prišlo do napake. Zagotovite, da je %1$S zaprt, nato ponovno zaženite %2$S.
+zotero.preferences.wordProcessors.installed=Dodatek %S je trenutno nameščen.
+zotero.preferences.wordProcessors.notInstalled=Dodatek %S trenutno ni nameščen.
+zotero.preferences.wordProcessors.install=Namesti dodatek %S
+zotero.preferences.wordProcessors.reinstall=Ponovno namesti dodatek %S
+zotero.preferences.wordProcessors.installing=Nameščanje %S ...
+zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S ni združljiv z različicami %3$S pred %4$S. Odstranite %3$S ali prenesite najnovejšo različico z %5$S.
+zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S zahteva %3$S %4$S ali novejšega. Prenesite najnovejšo različico %3$S z %5$S.
 
 zotero.preferences.styles.addStyle=Dodaj slog
 
@@ -738,7 +738,7 @@ integration.missingItem.multiple=Vnos %1$S iz tega citata ne obstaja več v vaš
 integration.missingItem.description=Z »Ne« boste izbrisali kode polj za citate, ki vsebujejo ta vnos, s čimer boste obdržali besedilo citata, vendar ga boste izbrisali iz bibliografije.
 integration.removeCodesWarning=Odstranitev kod polj bo preprečila Zoteru posodabljanje citatov in bibliografij v tem dokumentu. Ste prepričani, da želite nadaljevati?
 integration.upgradeWarning=Vaš dokument mora biti trajno posodobljen, da bi deloval z Zoterom 2.1 ali novejšim. Priporočamo, da pred nadaljevanjem naredite varnostno kopijo. Ste prepričani, da želite nadaljevati?
-integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
+integration.error.newerDocumentVersion=Vaš dokument je nastal z novejšo različico Zotera (%1$S) od trenutno nameščene (%2$S). Pred urejanjem tega dokumenta raje nadgradite Zotero.
 integration.corruptField=Koda polja Zotero, ki ustreza temu citatu, ki pove Zoteru, kateri vnos iz vaše knjižnice citat predstavlja, je bila okvarjena. Želite ponovno izbrati vnos?
 integration.corruptField.description=Z »Ne« boste izbrisali kode polj za citate, ki vsebujejo ta vnos, s čimer boste ohranili besedilo citata in ga morebiti izbrisali iz bibliografije.
 integration.corruptBibliography=Koda polja Zotero za bibliografijo je okvarjena. Naj Zotero pobriše to kodo polja in ustvari novo bibliografijo?
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstrani skupine in usklajevanje
 sync.localObject=Krajevni predmet
 sync.remoteObject=Oddaljeni predmet
 sync.mergedObject=Spojeni predmet
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Uporabniško ime ni določeno
 sync.error.usernameNotSet.text=Za usklajevanje s strežnikom Zotero morate v nastavitvah Zotero vnesti svoje uporabniško ime in geslo za zotero.org.
diff --git a/chrome/locale/sr-RS/zotero/zotero.properties b/chrome/locale/sr-RS/zotero/zotero.properties
index ea801d86b..b44d57ef7 100644
--- a/chrome/locale/sr-RS/zotero/zotero.properties
+++ b/chrome/locale/sr-RS/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/sv-SE/zotero/zotero.properties b/chrome/locale/sv-SE/zotero/zotero.properties
index 4c73f4ea3..015a16c87 100644
--- a/chrome/locale/sv-SE/zotero/zotero.properties
+++ b/chrome/locale/sv-SE/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Ta bort grupp och synkronisering
 sync.localObject=Lokalt objekt
 sync.remoteObject=Fjärrobjekt
 sync.mergedObject=Ihopsatt objekt
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Användarnamn är inte valt
 sync.error.usernameNotSet.text=Du måste ange ditt zotero.org-användarnamn och lösenord i Zoteros egenskaper för att synkronisera med Zotero-servern.
diff --git a/chrome/locale/th-TH/zotero/zotero.properties b/chrome/locale/th-TH/zotero/zotero.properties
index 791710cdc..491942eb9 100644
--- a/chrome/locale/th-TH/zotero/zotero.properties
+++ b/chrome/locale/th-TH/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=ลบกลุ่มและการเชื่อ
 sync.localObject=อ็อบเจกต์ในเครื่อง
 sync.remoteObject=อ็อบเจกต์ทางไกล
 sync.mergedObject=รวมอ็อบเจกต์
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=ไม่ได้ตั้งชื่อผู้ใช้ั
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/tr-TR/zotero/preferences.dtd b/chrome/locale/tr-TR/zotero/preferences.dtd
index c16f9c7b6..7223e057f 100644
--- a/chrome/locale/tr-TR/zotero/preferences.dtd
+++ b/chrome/locale/tr-TR/zotero/preferences.dtd
@@ -29,7 +29,7 @@
 <!ENTITY zotero.preferences.automaticSnapshots "Web sayfalarından eserler yaratılırken sayfa görünümü otomatik olarak kaydet">
 <!ENTITY zotero.preferences.downloadAssociatedFiles "Eserleri kaydederken ilişkilendirilen PDF ve diğer dosyaları da otomatik olarak ekle">
 <!ENTITY zotero.preferences.automaticTags "Anahtar kelimeler ve konu başlıkları ile eserleri otomatik olarak etiketle">
-<!ENTITY zotero.preferences.trashAutoEmptyDaysPre "Bu kadar zaman önce çöpe gönderilmiş eserleri otomatik olarak sil:">
+<!ENTITY zotero.preferences.trashAutoEmptyDaysPre "Bu kadar zaman önce Çöp Sepetine gönderilmiş eserleri otomatik olarak sil:">
 <!ENTITY zotero.preferences.trashAutoEmptyDaysPost "gün">
 
 <!ENTITY zotero.preferences.groups "Gruplar">
@@ -160,7 +160,7 @@
 
 <!ENTITY zotero.preferences.prefpane.advanced "Gelişmiş">
 <!ENTITY zotero.preferences.advanced.filesAndFolders "Dosyalar ve Klasörler">
-<!ENTITY zotero.preferences.advanced.keys "Shortcuts">
+<!ENTITY zotero.preferences.advanced.keys "Kısayollar">
 
 <!ENTITY zotero.preferences.prefpane.locate "Yerini Belirle">
 <!ENTITY zotero.preferences.locate.locateEngineManager "Makale Bakma Motoru Yöneticisi">
diff --git a/chrome/locale/tr-TR/zotero/zotero.dtd b/chrome/locale/tr-TR/zotero/zotero.dtd
index 26a5b93f8..3d11fe53d 100644
--- a/chrome/locale/tr-TR/zotero/zotero.dtd
+++ b/chrome/locale/tr-TR/zotero/zotero.dtd
@@ -104,7 +104,7 @@
 <!ENTITY zotero.toolbar.newGroup "Yeni Grup...">
 <!ENTITY zotero.toolbar.newSubcollection.label "Yeni Alt Derme...">
 <!ENTITY zotero.toolbar.newSavedSearch.label "Yeni Kaydedilen Arama...">
-<!ENTITY zotero.toolbar.emptyTrash.label "Çöpü Boşalt">
+<!ENTITY zotero.toolbar.emptyTrash.label "Çöp Sepetini Boşalt">
 <!ENTITY zotero.toolbar.tagSelector.label "Etiket Seçiciyi Göster/Gizle">
 <!ENTITY zotero.toolbar.actions.label "Eylemler">
 <!ENTITY zotero.toolbar.import.label "İçeri Aktar...">
diff --git a/chrome/locale/tr-TR/zotero/zotero.properties b/chrome/locale/tr-TR/zotero/zotero.properties
index 804cd8087..644e8d8e4 100644
--- a/chrome/locale/tr-TR/zotero/zotero.properties
+++ b/chrome/locale/tr-TR/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=Oluştur
 general.delete=Sil
 general.moreInformation=Daha Bilgi
 general.seeForMoreInformation=Daha fazla bilgi için bakınız: %S
-general.open=Open %S
+general.open=%S'u aç
 general.enable=Etkinleştir:
 general.disable=Seçilemez Kıl
 general.remove=Kaldır
@@ -151,11 +151,11 @@ pane.collections.delete.title=Dermeyi Sil
 pane.collections.delete=Seçili dermeyi silmek istediğinize emin misiniz?
 pane.collections.delete.keepItems=Derme içerisindeki eserler silinmeyecektir.
 pane.collections.deleteWithItems.title=Dermeyi ve Eserleri Sil
-pane.collections.deleteWithItems=Seçili derme ile birlikte tüm eserleri silmek istediğinizden emin misiniz?
+pane.collections.deleteWithItems=Seçili dermeyi silip, içindeki tüm eserleri Çöp Sepetine taşımak istediğinize emin misiniz?
 
 pane.collections.deleteSearch.title=Aramayı Sil
 pane.collections.deleteSearch=Seçili aramayı silmek istediğinize emin misiniz?
-pane.collections.emptyTrash=Çöp kutusundaki tüm eserleri kalıcı olarak silmek istediğinize emin misiniz?
+pane.collections.emptyTrash=Çöp Sepetindeki tüm eserleri kalıcı olarak silmek istediğinize emin misiniz?
 pane.collections.newCollection=Yeni Derme
 pane.collections.name=Bu derme için bir isim girin:
 pane.collections.newSavedSeach=Yeni Kaydedilen Arama
@@ -163,7 +163,7 @@ pane.collections.savedSearchName=Bu kayıtlı arama için bir isim giriniz:
 pane.collections.rename=Dermeyi yeniden adlandır:
 pane.collections.library=Kitaplığım
 pane.collections.groupLibraries=Grup Kitaplıkları
-pane.collections.trash=Çöp
+pane.collections.trash=Çöp Sepeti
 pane.collections.untitled=İsimsiz
 pane.collections.unfiled=Dosyalanmamış Eserler
 pane.collections.duplicate=Yinelenen Öğeler
@@ -198,19 +198,19 @@ pane.items.columnChooser.moreColumns=Başka Sütun
 pane.items.columnChooser.secondarySort=İkincil Sıralama (%S)
 pane.items.attach.link.uri.unrecognized=Zotero girdiğiniz URI'yi tanımadı. Adresi kontrol edip tekrar deneyiniz.
 pane.items.attach.link.uri.file=Bir dosyaya bağlantı iliştirmek için lütfen “%S”'u kullanınız.
-pane.items.trash.title=Çöpe Gönder
-pane.items.trash=Seçili eseri çöpe göndermeyi istediğinize emin misiniz?
-pane.items.trash.multiple=Seçili eserleri çöpe göndermeyi istediğinize emin misiniz?
+pane.items.trash.title=Çöp Sepetine Gönder
+pane.items.trash=Seçili eseri Çöp Sepetine göndermeyi istediğinize emin misiniz?
+pane.items.trash.multiple=Seçili eserleri Çöp Sepetine göndermeyi istediğinize emin misiniz?
 pane.items.delete.title=Sil
 pane.items.delete=Seçili olan bu eseri silmek istediğinize emin misiniz?
 pane.items.delete.multiple=Seçili olan bu eserleri silmek istediğinize emin misiniz?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
-pane.items.menu.moveToTrash=Eseri sil...
-pane.items.menu.moveToTrash.multiple=Eserleri sil
+pane.items.remove.title=Dermeden Sil
+pane.items.remove=Seçili eseri, bu dermeden kaldırmak istediğinize emin misiniz?
+pane.items.remove.multiple=Seçili eserleri bu dermeden kaldırmak istediğinize emin misiniz?
+pane.items.menu.remove=Eseri Dermeden Sil...
+pane.items.menu.remove.multiple=Eserleri Dermeden Sil...
+pane.items.menu.moveToTrash=Eseri Çöp Sepetine Gönder...
+pane.items.menu.moveToTrash.multiple=Eserleri Çöp Sepetine Gönder...
 pane.items.menu.export=Seçili Eseri Dışarı Aktar...
 pane.items.menu.export.multiple=Seçili Eserleri Dışarı Aktar...
 pane.items.menu.createBib=Seçili Eserden Bibliyografya Yarat...
@@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Dışarı Aktarım Biçimleri
 zotero.preferences.export.quickCopy.instructions=Çabuk Kopyala, bir kısayol tuşuna (%S) basarak seçilen kaynakların panoya kopyalanmasını ya da eserlerin bir web sayfasındaki bir metin kutusuna sürüklenebilmesini sağlar.
 zotero.preferences.export.quickCopy.citationInstructions=Bibliyografik stiller için, gönderme ve dipnotları, %S tuşuna basarak veya Shift/ÜstKarakter tuşuna basarken eserleri sürükleyerek kopyalayabilirsiniz.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
-zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
-zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
-zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
-zotero.preferences.wordProcessors.install=Install %S Add-in
-zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
-zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
-zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
+zotero.preferences.wordProcessors.installationSuccess=Kurulum başarıyla sonuçlandı.
+zotero.preferences.wordProcessors.installationError=Bir hata oluştuğu için kurulum tamamlanamadı. %1$S'ün kapalı olduğuna emin olduktan sonra %2$S'u yeniden başlatın.
+zotero.preferences.wordProcessors.installed=%S eklentisi kurulu.
+zotero.preferences.wordProcessors.notInstalled=%S eklentisi kurulu değil.
+zotero.preferences.wordProcessors.install=%S Eklentisini Kur
+zotero.preferences.wordProcessors.reinstall=%S Eklentisini Tekrar Kur
+zotero.preferences.wordProcessors.installing=%S Kuruluyor...
+zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S, %3$S uygulamasının %4$S sürümünden önceki sürümleri ile uyumsuz. Lütfen %3$S uygulamasını kaldırınız, ya da en yeni sürümü %5$S adresinden indiriniz.
+zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S doğru çalışabilmek için, %3$S uygulamasının %4$S sürümünü ya da sonraki sürümlerini gerektirmektedir. Lütfen %3$S uygulamasının en yeni sürümünü %5$S adresinden indiriniz.
 
 zotero.preferences.styles.addStyle=Stil Ekle
 
@@ -738,7 +738,7 @@ integration.missingItem.multiple=Zotero veritabanınızda, bu göndermedeki %1$S
 integration.missingItem.description="Hayır"ı tıklamak bu eseri içeren göndermelerin alan kodlarını silecek, gönderme metnini koruyacak, ama kaynakçanızdan silecektir.
 integration.removeCodesWarning=Alan kodlarının silinmesi Zotero'nun bu belgedeki göndermeleri ve kaynakçaları güncellemesini engelleyecektir. Devam etmek istediğinize emin misiniz?
 integration.upgradeWarning=Belgeniz Zotero 2.0b7 ve sonrası ile birlikte çalışabilmesi için kalıcı olarak yükseltilmelidir. İşlemi gerçekleştirmeden önce yedek almanız önerilir. Devam etmek istediğinize emin misiniz?
-integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
+integration.error.newerDocumentVersion=Belgeniz şu an kurulu olan Zotero sürümünden (%2$S) daha yeni bir sürümle (%1$S) yaratılmış. Lütfen bu belgeyi değiştirmeden önce Zotero'yu yükseltiniz.
 integration.corruptField=Kitaplığınızdaki hangi eserde bu göndermenin temsil edildiğini Zotero'ya söyleyen bu göndermeye ilişkin Zotero alan kodu bozulmuştur. Eseri tekrar seçmek ister misiniz?
 integration.corruptField.description="Hayır"ı tıklamak bu eseri içeren göndermelerin alan kodlarını silecek, gönderme metnini koruyacak, ama bir olasılıkla kaynakçanızdan silecektir.
 integration.corruptBibliography=Kaynakçanızın Zotero alan kodu bozulmuştur. Zotero bu alan kodunu silerek yeni bir kaynakça oluştursun mu?
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Grubu Kaldır ve Eşitle
 sync.localObject=Yerel Nesne
 sync.remoteObject=Uzak Nesne
 sync.mergedObject=Nesneyi Birleştir
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Kullanıcı adı yok
 sync.error.usernameNotSet.text=Zotero sunucusu ile eşitlenebilmek için Zotero tercihleri altında zotero.org kullanıcı adı ve parolanızı girmelisiniz.
diff --git a/chrome/locale/uk-UA/zotero/zotero.properties b/chrome/locale/uk-UA/zotero/zotero.properties
index 1f8e0c16b..ce3eb44e4 100644
--- a/chrome/locale/uk-UA/zotero/zotero.properties
+++ b/chrome/locale/uk-UA/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Обнулити групи і синхронізува
 sync.localObject=Локальний об'єкт
 sync.remoteObject=Видалений об'єкт
 sync.mergedObject=Об'єднаний об'єкт
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Ім'я користувача не встановлено
 sync.error.usernameNotSet.text=Для синхронізації з сервером Zotero ви повинні ввести ім'я користувача та пароль для zotero.org в налаштуваннях Zotero.
diff --git a/chrome/locale/vi-VN/zotero/zotero.properties b/chrome/locale/vi-VN/zotero/zotero.properties
index f00b5df7d..0f7bb9b75 100644
--- a/chrome/locale/vi-VN/zotero/zotero.properties
+++ b/chrome/locale/vi-VN/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync
 sync.localObject=Local Object
 sync.remoteObject=Remote Object
 sync.mergedObject=Merged Object
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=Username not set
 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server.
diff --git a/chrome/locale/zh-CN/zotero/preferences.dtd b/chrome/locale/zh-CN/zotero/preferences.dtd
index eb14d8b3a..47c9a4038 100644
--- a/chrome/locale/zh-CN/zotero/preferences.dtd
+++ b/chrome/locale/zh-CN/zotero/preferences.dtd
@@ -160,7 +160,7 @@
 
 <!ENTITY zotero.preferences.prefpane.advanced "高级">
 <!ENTITY zotero.preferences.advanced.filesAndFolders "文件和文件夹">
-<!ENTITY zotero.preferences.advanced.keys "Shortcuts">
+<!ENTITY zotero.preferences.advanced.keys "快捷键">
 
 <!ENTITY zotero.preferences.prefpane.locate "定位">
 <!ENTITY zotero.preferences.locate.locateEngineManager "文章检索引擎管理器">
diff --git a/chrome/locale/zh-CN/zotero/zotero.properties b/chrome/locale/zh-CN/zotero/zotero.properties
index 9b7002d84..edda5fd31 100644
--- a/chrome/locale/zh-CN/zotero/zotero.properties
+++ b/chrome/locale/zh-CN/zotero/zotero.properties
@@ -42,7 +42,7 @@ general.create=创建
 general.delete=删除
 general.moreInformation=更多信息
 general.seeForMoreInformation=查阅 %S 获取更多信息.
-general.open=Open %S
+general.open=打开 %S
 general.enable=启用
 general.disable=禁用
 general.remove=移除
@@ -204,11 +204,11 @@ pane.items.trash.multiple=您确定要将选中的条目移动到回收站吗?
 pane.items.delete.title=删除
 pane.items.delete=您确定要删除所选的条目吗?
 pane.items.delete.multiple=您确定要删除所选的条目吗?
-pane.items.remove.title=Remove from Collection
-pane.items.remove=Are you sure you want to remove the selected item from this collection?
-pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection?
-pane.items.menu.remove=Remove Item from Collection…
-pane.items.menu.remove.multiple=Remove Items from Collection…
+pane.items.remove.title=从分类中移除
+pane.items.remove=您确定要从分类中移除所选的条目吗?
+pane.items.remove.multiple=您确定要从分类中移除所选的多个条目吗?
+pane.items.menu.remove=从分类中移除条目…
+pane.items.menu.remove.multiple=从分类中移除多个条目…
 pane.items.menu.moveToTrash=删除条目…
 pane.items.menu.moveToTrash.multiple=删除条目…
 pane.items.menu.export=导出条目...
@@ -566,13 +566,13 @@ zotero.preferences.export.quickCopy.exportFormats=导出格式
 zotero.preferences.export.quickCopy.instructions=便捷复制是通过快捷键 %S 将所选的条目复制到剪贴板上或通过鼠标拖放将条目粘贴到网页上的文本框中.
 zotero.preferences.export.quickCopy.citationInstructions=要复制文献的引用样式, 在复制引文或脚注前按快捷键%S或按住Shift键然后拖放条目.
 
-zotero.preferences.wordProcessors.installationSuccess=Installation was successful.
-zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S.
-zotero.preferences.wordProcessors.installed=The %S add-in is currently installed.
-zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed.
-zotero.preferences.wordProcessors.install=Install %S Add-in
-zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in
-zotero.preferences.wordProcessors.installing=Installing %S…
+zotero.preferences.wordProcessors.installationSuccess=安装成功。
+zotero.preferences.wordProcessors.installationError=由于发生错误,无法完成安装。请确保 %1$S 关闭,然后重新启动t %2$S。
+zotero.preferences.wordProcessors.installed=加载项 %S 现在已安装。
+zotero.preferences.wordProcessors.notInstalled=加载项 %S 现在未安装。
+zotero.preferences.wordProcessors.install=安装加载项 %S
+zotero.preferences.wordProcessors.reinstall=重新安装加载项 %S
+zotero.preferences.wordProcessors.installing=安装 %S…
 zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S.
 zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S.
 
@@ -738,7 +738,7 @@ integration.missingItem.multiple=高亮的引文中的条目 %1$S 已经不在
 integration.missingItem.description=点击“取消”将删除包含此条目的引文的域代码, 保留引用文本并从引文目录中删除.
 integration.removeCodesWarning=移除域代码将使 Zotero 无法更新本文档的引文及引文目录, 您确定要继续吗?
 integration.upgradeWarning=为使您的文档可以在 Zotero 2.1 或更新的版本中工作, 我们需要您永久升级您的文档. 在继续进行前, 我们建议您做一个备份. 您确定要继续吗?
-integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
+integration.error.newerDocumentVersion=创建本文档的 Zotero 版本 (%1$S) 比当前安装的 Zotero 版本 (%2$S)新。编辑本文档前,请先升级 Zotero。
 integration.corruptField=本引文的域代码--负责通知 Zotero 本引文在文献库里所指向的条目--已经损坏. 您要重新选择该条目吗?
 integration.corruptField.description=点击“取消”将删除包含此条目的引文的域代码, 保留引用文本, 但可能将它从您的引文目录中删除.
 integration.corruptBibliography=引文目录的 Zotero 域代码已经损坏, 要 Zotero 清理域代码并重新生成引文目录吗?
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=移除群组和同步
 sync.localObject=本地对象
 sync.remoteObject=远程对象
 sync.mergedObject=合并的对象
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=未设置用户名
 sync.error.usernameNotSet.text=要与Zotero服务器同步, 您需要在Zotero首选项面板中输入zotero.org的用户名及密码.
diff --git a/chrome/locale/zh-TW/zotero/zotero.properties b/chrome/locale/zh-TW/zotero/zotero.properties
index bb70b4e3b..583cb0145 100644
--- a/chrome/locale/zh-TW/zotero/zotero.properties
+++ b/chrome/locale/zh-TW/zotero/zotero.properties
@@ -770,6 +770,9 @@ sync.removeGroupsAndSync=移除群組與同步
 sync.localObject=本機的物件
 sync.remoteObject=遠端的物件
 sync.mergedObject=合併的物件
+sync.merge.resolveAllLocal=Use the local version for all remaining conflicts
+sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts
+
 
 sync.error.usernameNotSet=沒有設定使用者名稱
 sync.error.usernameNotSet.text=於 Zotero 偏好設定中一定得輸入 zotero.org 使用者名稱與密碼才能與 Zotero 伺服器同步。
diff --git a/chrome/skin/default/zotero/arrow_refresh@2x.png b/chrome/skin/default/zotero/arrow_refresh@2x.png
new file mode 100644
index 000000000..b1a811509
Binary files /dev/null and b/chrome/skin/default/zotero/arrow_refresh@2x.png differ
diff --git a/chrome/skin/default/zotero/arrow_rotate_error.png b/chrome/skin/default/zotero/arrow_rotate_error.png
deleted file mode 100644
index dce1f8008..000000000
Binary files a/chrome/skin/default/zotero/arrow_rotate_error.png and /dev/null differ
diff --git a/chrome/skin/default/zotero/attach@2x.png b/chrome/skin/default/zotero/attach@2x.png
new file mode 100644
index 000000000..a54f95b4e
Binary files /dev/null and b/chrome/skin/default/zotero/attach@2x.png differ
diff --git a/chrome/skin/default/zotero/bindings/attachmentbox.css b/chrome/skin/default/zotero/bindings/attachmentbox.css
index 71cbe9a98..22093505b 100644
--- a/chrome/skin/default/zotero/bindings/attachmentbox.css
+++ b/chrome/skin/default/zotero/bindings/attachmentbox.css
@@ -24,6 +24,13 @@
 	list-style-image: url(chrome://zotero/skin/arrow_refresh.png);
 }
 
+@media (min-resolution: 1.5dppx) {
+	#reindex {
+		list-style-image: url(chrome://zotero/skin/arrow_refresh@2x.png);
+		width: 20px;
+	}
+}
+
 #index-box > button
 {
 	font-size: .95em;
diff --git a/chrome/skin/default/zotero/cog@2x.png b/chrome/skin/default/zotero/cog@2x.png
new file mode 100644
index 000000000..9c07e6cdc
Binary files /dev/null and b/chrome/skin/default/zotero/cog@2x.png differ
diff --git a/chrome/skin/default/zotero/control_stop_blue@2x.png b/chrome/skin/default/zotero/control_stop_blue@2x.png
new file mode 100644
index 000000000..6e7409a4a
Binary files /dev/null and b/chrome/skin/default/zotero/control_stop_blue@2x.png differ
diff --git a/chrome/skin/default/zotero/error@2x.png b/chrome/skin/default/zotero/error@2x.png
new file mode 100644
index 000000000..354aa99b2
Binary files /dev/null and b/chrome/skin/default/zotero/error@2x.png differ
diff --git a/chrome/skin/default/zotero/exclamation@2x.png b/chrome/skin/default/zotero/exclamation@2x.png
new file mode 100644
index 000000000..e0574d61b
Binary files /dev/null and b/chrome/skin/default/zotero/exclamation@2x.png differ
diff --git a/chrome/skin/default/zotero/locate-external-viewer@2x.png b/chrome/skin/default/zotero/locate-external-viewer@2x.png
new file mode 100644
index 000000000..26d913b0a
Binary files /dev/null and b/chrome/skin/default/zotero/locate-external-viewer@2x.png differ
diff --git a/chrome/skin/default/zotero/locate-view-online@2x.png b/chrome/skin/default/zotero/locate-view-online@2x.png
new file mode 100644
index 000000000..850172c07
Binary files /dev/null and b/chrome/skin/default/zotero/locate-view-online@2x.png differ
diff --git a/chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png b/chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png
new file mode 100644
index 000000000..8a0791b68
Binary files /dev/null and b/chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png differ
diff --git a/chrome/skin/default/zotero/mac/toolbar-note-add@2x.png b/chrome/skin/default/zotero/mac/toolbar-note-add@2x.png
new file mode 100644
index 000000000..b128af167
Binary files /dev/null and b/chrome/skin/default/zotero/mac/toolbar-note-add@2x.png differ
diff --git a/chrome/skin/default/zotero/merge.css b/chrome/skin/default/zotero/merge.css
index ff0e7efed..b54fb52a4 100644
--- a/chrome/skin/default/zotero/merge.css
+++ b/chrome/skin/default/zotero/merge.css
@@ -40,8 +40,9 @@ wizard > deck {
 	padding: 0;
 }
 
-#zotero-step-count {
-	-moz-box-pack: end;
+
+#resolve-all {
+	font-size: 1.1em;
 }
 
 #zotero-step-count label:first-child {
diff --git a/chrome/skin/default/zotero/overlay.css b/chrome/skin/default/zotero/overlay.css
index df0a6e098..d3ce75b20 100644
--- a/chrome/skin/default/zotero/overlay.css
+++ b/chrome/skin/default/zotero/overlay.css
@@ -34,6 +34,17 @@
 	height: 1.7em;
 }
 
+/* As of Fx37, the tree doesn't scale HiDPI images properly on Windows and Linux */
+#zotero-collections-tree treechildren::-moz-tree-image,
+#zotero-items-tree treechildren::-moz-tree-image {
+	height: 16px;
+}
+
+#zotero-collections-tree treechildren::-moz-tree-image(primary)
+{
+	margin-right: 5px;
+}
+
 /*#zotero-collections-tree treechildren::-moz-tree-separator {
 	border: none;
 }*/
@@ -283,11 +294,6 @@
 }
 
 
-#zotero-tb-tag-selector
-{
-	list-style-image: url(chrome://zotero/skin/tag-selector.png);
-}
-
 #zotero-collections-tree, #zotero-items-tree, #zotero-item-pane > groupbox
 {
 	margin: 0;
@@ -404,7 +410,7 @@
 
 .zotero-menuitem-attachments-file
 {
-	list-style-image: url('chrome://zotero/skin/treeitem-attachment-file.png');
+	list-style-image: url('chrome://zotero/skin/treeitem.png');
 }
 
 .zotero-menuitem-attachments-link
@@ -666,4 +672,35 @@
 
 .zotero-box-label {
 	margin-left: 3px !important;
-}
\ No newline at end of file
+}
+
+
+/* BEGIN 2X BLOCK -- DO NOT EDIT MANUALLY -- USE 2XIZE */
+@media (min-resolution: 1.5dppx) {
+	#zotero-tb-collection-add { list-style-image: url('chrome://zotero/skin/toolbar-collection-add@2x.png'); }
+	#zotero-tb-actions-menu { list-style-image: url('chrome://zotero/skin/cog@2x.png'); }
+	#zotero-tb-add { list-style-image: url('chrome://zotero/skin/toolbar-item-add@2x.png'); }
+	#zotero-tb-attachment-add { list-style-image: url('chrome://zotero/skin/attach@2x.png'); }
+	#zotero-tb-note-add { list-style-image: url('chrome://zotero/skin/toolbar-note-add@2x.png'); }
+	#zotero-menuitem-note { list-style-image: url('chrome://zotero/skin/treeitem-note@2x.png'); }
+	.zotero-menuitem-new-saved-search { list-style-image: url('chrome://zotero/skin/treesource-search@2x.png'); }
+	.zotero-menuitem-show-duplicates { list-style-image: url('chrome://zotero/skin/treesource-duplicates@2x.png'); }
+	.zotero-menuitem-show-unfiled { list-style-image: url('chrome://zotero/skin/treesource-unfiled@2x.png'); }
+	.zotero-menuitem-new-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-add@2x.png'); }
+	.zotero-menuitem-edit-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-edit@2x.png'); }
+	.zotero-menuitem-delete-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-delete@2x.png'); }
+	.zotero-menuitem-show-in-library { list-style-image: url('chrome://zotero/skin/treesource-library@2x.png'); }
+	.zotero-menuitem-move-to-trash { list-style-image: url('chrome://zotero/skin/treesource-trash-full@2x.png'); }
+	.zotero-menuitem-attach-note { list-style-image: url('chrome://zotero/skin/toolbar-note-add@2x.png'); }
+	.zotero-menuitem-attach { list-style-image: url('chrome://zotero/skin/attach@2x.png'); }
+	.zotero-menuitem-attachments-file { list-style-image: url('chrome://zotero/skin/treeitem@2x.png'); }
+	.zotero-menuitem-attachments-link { list-style-image: url('chrome://zotero/skin/treeitem-attachment-link@2x.png'); }
+	.zotero-menuitem-attachments-web-link { list-style-image: url('chrome://zotero/skin/treeitem-attachment-web-link@2x.png'); }
+	.zotero-menuitem-create-report { list-style-image: url('chrome://zotero/skin/treeitem-report@2x.png'); }
+	#zotero-tb-advanced-search { list-style-image: url('chrome://zotero/skin/toolbar-advanced-search@2x.png'); }
+	#zotero-tb-locate { list-style-image: url('chrome://zotero/skin/toolbar-go-arrow@2x.png'); }
+	#zotero-tb-sync-storage-cancel { list-style-image: url(chrome://zotero/skin/control_stop_blue@2x.png); margin-right: 0; }
+	#zotero-tb-sync-error, #zotero-tb-sync-error[mode=warning] { list-style-image: url(chrome://zotero/skin/error@2x.png); }
+	#zotero-tb-sync-error[mode=error] { list-style-image: url(chrome://zotero/skin/exclamation@2x.png); }
+	#zotero-pane-stack[fullscreenmode="true"] #zotero-tb-fullscreen { list-style-image: url('chrome://zotero/skin/toolbar-fullscreen-top@2x.png'); }
+}
diff --git a/chrome/skin/default/zotero/page-white-add@2x.png b/chrome/skin/default/zotero/page-white-add@2x.png
new file mode 100644
index 000000000..d7dfbb300
Binary files /dev/null and b/chrome/skin/default/zotero/page-white-add@2x.png differ
diff --git a/chrome/skin/default/zotero/tag-automatic@2x.png b/chrome/skin/default/zotero/tag-automatic@2x.png
new file mode 100644
index 000000000..e355ab214
Binary files /dev/null and b/chrome/skin/default/zotero/tag-automatic@2x.png differ
diff --git a/chrome/skin/default/zotero/tag-selector-menu@2x.png b/chrome/skin/default/zotero/tag-selector-menu@2x.png
new file mode 100644
index 000000000..138de1e6e
Binary files /dev/null and b/chrome/skin/default/zotero/tag-selector-menu@2x.png differ
diff --git a/chrome/skin/default/zotero/tag-selector.png b/chrome/skin/default/zotero/tag-selector.png
deleted file mode 100644
index d4c1613e9..000000000
Binary files a/chrome/skin/default/zotero/tag-selector.png and /dev/null differ
diff --git a/chrome/skin/default/zotero/tag@2x.png b/chrome/skin/default/zotero/tag@2x.png
new file mode 100644
index 000000000..8e66dde3c
Binary files /dev/null and b/chrome/skin/default/zotero/tag@2x.png differ
diff --git a/chrome/skin/default/zotero/toolbar-advanced-search@2x.png b/chrome/skin/default/zotero/toolbar-advanced-search@2x.png
new file mode 100644
index 000000000..9d8b23d95
Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-advanced-search@2x.png differ
diff --git a/chrome/skin/default/zotero/toolbar-collection-add@2x.png b/chrome/skin/default/zotero/toolbar-collection-add@2x.png
new file mode 100644
index 000000000..7df8496c4
Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-collection-add@2x.png differ
diff --git a/chrome/skin/default/zotero/toolbar-collection-delete@2x.png b/chrome/skin/default/zotero/toolbar-collection-delete@2x.png
new file mode 100644
index 000000000..302015f21
Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-collection-delete@2x.png differ
diff --git a/chrome/skin/default/zotero/toolbar-collection-edit@2x.png b/chrome/skin/default/zotero/toolbar-collection-edit@2x.png
new file mode 100644
index 000000000..c69654396
Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-collection-edit@2x.png differ
diff --git a/chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png b/chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png
new file mode 100644
index 000000000..b2b090b20
Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png differ
diff --git a/chrome/skin/default/zotero/toolbar-go-arrow@2x.png b/chrome/skin/default/zotero/toolbar-go-arrow@2x.png
new file mode 100644
index 000000000..e22b0cd26
Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-go-arrow@2x.png differ
diff --git a/chrome/skin/default/zotero/toolbar-item-add@2x.png b/chrome/skin/default/zotero/toolbar-item-add@2x.png
new file mode 100644
index 000000000..6813812f3
Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-item-add@2x.png differ
diff --git a/chrome/skin/default/zotero/toolbar-item-from-page.png b/chrome/skin/default/zotero/toolbar-item-from-page.png
deleted file mode 100644
index d5bfa0719..000000000
Binary files a/chrome/skin/default/zotero/toolbar-item-from-page.png and /dev/null differ
diff --git a/chrome/skin/default/zotero/toolbar-link-add@2x.png b/chrome/skin/default/zotero/toolbar-link-add@2x.png
new file mode 100644
index 000000000..b7c2b3e48
Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-link-add@2x.png differ
diff --git a/chrome/skin/default/zotero/toolbar-note-add@2x.png b/chrome/skin/default/zotero/toolbar-note-add@2x.png
new file mode 100644
index 000000000..9b296d2a3
Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-note-add@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-artwork@2x.png b/chrome/skin/default/zotero/treeitem-artwork@2x.png
new file mode 100644
index 000000000..1f61cc722
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-artwork@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-attachment-file.png b/chrome/skin/default/zotero/treeitem-attachment-file.png
deleted file mode 100755
index 8b8b1ca00..000000000
Binary files a/chrome/skin/default/zotero/treeitem-attachment-file.png and /dev/null differ
diff --git a/chrome/skin/default/zotero/treeitem-attachment-link@2x.png b/chrome/skin/default/zotero/treeitem-attachment-link@2x.png
new file mode 100644
index 000000000..821bfbde3
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-attachment-link@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png b/chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png
new file mode 100644
index 000000000..aca80be95
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-audioRecording.png b/chrome/skin/default/zotero/treeitem-audioRecording.png
old mode 100644
new mode 100755
index 3f23ad9ec..6b02f1a39
Binary files a/chrome/skin/default/zotero/treeitem-audioRecording.png and b/chrome/skin/default/zotero/treeitem-audioRecording.png differ
diff --git a/chrome/skin/default/zotero/treeitem-audioRecording@2x.png b/chrome/skin/default/zotero/treeitem-audioRecording@2x.png
new file mode 100755
index 000000000..b37179fd5
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-audioRecording@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-bill@2x.png b/chrome/skin/default/zotero/treeitem-bill@2x.png
new file mode 100644
index 000000000..c0856a9bf
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-bill@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-book@2x.png b/chrome/skin/default/zotero/treeitem-book@2x.png
new file mode 100644
index 000000000..b5556a44b
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-book@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-bookSection@2x.png b/chrome/skin/default/zotero/treeitem-bookSection@2x.png
new file mode 100644
index 000000000..70dcd528c
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-bookSection@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-case.png b/chrome/skin/default/zotero/treeitem-case.png
old mode 100644
new mode 100755
index e213cd5b4..a7d1a2f4a
Binary files a/chrome/skin/default/zotero/treeitem-case.png and b/chrome/skin/default/zotero/treeitem-case.png differ
diff --git a/chrome/skin/default/zotero/treeitem-computerProgram@2x.png b/chrome/skin/default/zotero/treeitem-computerProgram@2x.png
new file mode 100644
index 000000000..a24d7edd1
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-computerProgram@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-document.png b/chrome/skin/default/zotero/treeitem-document.png
deleted file mode 100644
index 0212ba562..000000000
Binary files a/chrome/skin/default/zotero/treeitem-document.png and /dev/null differ
diff --git a/chrome/skin/default/zotero/treeitem-film@2x.png b/chrome/skin/default/zotero/treeitem-film@2x.png
new file mode 100644
index 000000000..d763fc5c4
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-film@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-instantMessage@2x.png b/chrome/skin/default/zotero/treeitem-instantMessage@2x.png
new file mode 100644
index 000000000..cb22703d2
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-instantMessage@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-interview@2x.png b/chrome/skin/default/zotero/treeitem-interview@2x.png
new file mode 100644
index 000000000..654d4c119
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-interview@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-journalArticle@2x.png b/chrome/skin/default/zotero/treeitem-journalArticle@2x.png
index f5ff9572a..c07b11a32 100644
Binary files a/chrome/skin/default/zotero/treeitem-journalArticle@2x.png and b/chrome/skin/default/zotero/treeitem-journalArticle@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-letter@2x.png b/chrome/skin/default/zotero/treeitem-letter@2x.png
new file mode 100644
index 000000000..412bdfbac
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-letter@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-magazineArticle@2x.png b/chrome/skin/default/zotero/treeitem-magazineArticle@2x.png
new file mode 100644
index 000000000..f637971bc
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-magazineArticle@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png b/chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png
new file mode 100644
index 000000000..46b372441
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-note@2x.png b/chrome/skin/default/zotero/treeitem-note@2x.png
new file mode 100644
index 000000000..199897378
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-note@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-report@2x.png b/chrome/skin/default/zotero/treeitem-report@2x.png
new file mode 100644
index 000000000..9653b3552
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-report@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem-webpage@2x.png b/chrome/skin/default/zotero/treeitem-webpage@2x.png
index ba7bc2ef7..87c1f8cff 100644
Binary files a/chrome/skin/default/zotero/treeitem-webpage@2x.png and b/chrome/skin/default/zotero/treeitem-webpage@2x.png differ
diff --git a/chrome/skin/default/zotero/treeitem@2x.png b/chrome/skin/default/zotero/treeitem@2x.png
new file mode 100644
index 000000000..b57a33618
Binary files /dev/null and b/chrome/skin/default/zotero/treeitem@2x.png differ
diff --git a/chrome/skin/default/zotero/treesource-collection@2x.png b/chrome/skin/default/zotero/treesource-collection@2x.png
new file mode 100644
index 000000000..5bc379d13
Binary files /dev/null and b/chrome/skin/default/zotero/treesource-collection@2x.png differ
diff --git a/chrome/skin/default/zotero/treesource-duplicates@2x.png b/chrome/skin/default/zotero/treesource-duplicates@2x.png
new file mode 100644
index 000000000..61730634f
Binary files /dev/null and b/chrome/skin/default/zotero/treesource-duplicates@2x.png differ
diff --git a/chrome/skin/default/zotero/treesource-library@2x.png b/chrome/skin/default/zotero/treesource-library@2x.png
new file mode 100644
index 000000000..3955181a3
Binary files /dev/null and b/chrome/skin/default/zotero/treesource-library@2x.png differ
diff --git a/chrome/skin/default/zotero/treesource-search@2x.png b/chrome/skin/default/zotero/treesource-search@2x.png
new file mode 100644
index 000000000..c36e3d27e
Binary files /dev/null and b/chrome/skin/default/zotero/treesource-search@2x.png differ
diff --git a/chrome/skin/default/zotero/treesource-trash-full@2x.png b/chrome/skin/default/zotero/treesource-trash-full@2x.png
new file mode 100644
index 000000000..081ac96f2
Binary files /dev/null and b/chrome/skin/default/zotero/treesource-trash-full@2x.png differ
diff --git a/chrome/skin/default/zotero/treesource-trash@2x.png b/chrome/skin/default/zotero/treesource-trash@2x.png
new file mode 100644
index 000000000..d7eca38b0
Binary files /dev/null and b/chrome/skin/default/zotero/treesource-trash@2x.png differ
diff --git a/chrome/skin/default/zotero/treesource-unfiled@2x.png b/chrome/skin/default/zotero/treesource-unfiled@2x.png
new file mode 100644
index 000000000..887c69985
Binary files /dev/null and b/chrome/skin/default/zotero/treesource-unfiled@2x.png differ
diff --git a/chrome/skin/default/zotero/zotero.css b/chrome/skin/default/zotero/zotero.css
index 146af6ea9..9d496e9cb 100644
--- a/chrome/skin/default/zotero/zotero.css
+++ b/chrome/skin/default/zotero/zotero.css
@@ -43,13 +43,6 @@ toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button-single {
 	list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png");
 }
 
-@media (min-resolution: 1.5dppx) {
-	#zotero-toolbar-save-button[cui-areatype="toolbar"],
-	#zotero-toolbar-save-button-single[cui-areatype="toolbar"] {
-		list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png");
-	}
-}
-
 /* Show single icon for combo buttons in palette */
 toolbarpaletteitem[place="palette"] #zotero-toolbar-main-button {
 	list-style-image: url("chrome://zotero/skin/zotero-z-32px-australis.svg");
@@ -369,4 +362,13 @@ label.zotero-text-link {
 {
 	width: 29.5em;
 	max-width: 29.5em;
-}
\ No newline at end of file
+}
+
+
+/* BEGIN 2X BLOCK -- DO NOT EDIT MANUALLY -- USE 2XIZE */
+@media (min-resolution: 1.5dppx) {
+	#zotero-toolbar-save-button,#zotero-toolbar-save-button-single  { list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); }
+	#zotero-toolbar-save-button[cui-areatype="menu-panel"],#zotero-toolbar-save-button-single[cui-areatype="menu-panel"],toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button,toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button-single  { list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); }
+	.zotero-scrape-popup-library { list-style-image: url('chrome://zotero/skin/treesource-library@2x.png'); }
+	.zotero-scrape-popup-collection { list-style-image: url('chrome://zotero/skin/treesource-collection@2x.png'); }
+}
diff --git a/components/zotero-service.js b/components/zotero-service.js
index 1df9d05df..72c157f9e 100644
--- a/components/zotero-service.js
+++ b/components/zotero-service.js
@@ -340,8 +340,10 @@ function ZoteroService() {
 		}
 		this.wrappedJSObject = zContext.Zotero;
 	} catch(e) {
-		var msg = typeof e == 'string' ? e : e.name;
-		dump(e + "\n\n");
+		var msg = e instanceof Error
+			? e.name + ': ' + e.message + '\n' + e.fileName + ':' + e.lineNumber + '\n' + e.stack
+			: '' + e;
+		dump(msg + '\n');
 		Components.utils.reportError(e);
 		throw e;
 	}
@@ -376,7 +378,7 @@ ZoteroCommandLineHandler.prototype = {
 	/* nsICommandLineHandler */
 	handle : function(cmdLine) {
 		// Force debug output
-		if (cmdLine.handleFlag("zoterodebug", false)) {
+		if (cmdLine.handleFlag("ZoteroDebug", false)) {
 			zInitOptions.forceDebugLog = true;
 		}
 		
@@ -459,6 +461,10 @@ ZoteroCommandLineHandler.prototype = {
 				}
 			}
 		}
+		
+		if (cmdLine.handleFlag("ZoteroNoUserInput", false)) {
+			zInitOptions.noUserInput = true;
+		}
 	},
 	
 	contractID: "@mozilla.org/commandlinehandler/general-startup;1?type=zotero",
@@ -483,4 +489,4 @@ if (XPCOMUtils.generateNSGetFactory) {
 	var NSGetFactory = XPCOMUtils.generateNSGetFactory([ZoteroService, ZoteroCommandLineHandler]);
 } else {
 	var NSGetModule = XPCOMUtils.generateNSGetModule([ZoteroService, ZoteroCommandLineHandler]);
-}
\ No newline at end of file
+}
diff --git a/install.rdf b/install.rdf
index bb95adc2a..5cf80f000 100644
--- a/install.rdf
+++ b/install.rdf
@@ -25,7 +25,7 @@
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>31.0</em:minVersion>
-        <em:maxVersion>36.*</em:maxVersion>
+        <em:maxVersion>37.*</em:maxVersion>
       </Description>
     </em:targetApplication>
     
diff --git a/resource/hide.vbs b/resource/hide.vbs
new file mode 100644
index 000000000..9f233e2bd
--- /dev/null
+++ b/resource/hide.vbs
@@ -0,0 +1,24 @@
+Option Explicit
+
+Dim WshShell, fso, exe, args, I
+
+Set WshShell = Wscript.CreateObject("Wscript.Shell")
+Set fso = WScript.CreateObject("Scripting.FileSystemObject")
+
+If WScript.Arguments.Count = 0 Then
+  WScript.Echo "Usage: hidden.vbs program.exe [args...]"
+  WScript.Quit 1
+End If
+
+exe = WScript.Arguments(0)
+If Not(fso.FileExists(exe)) Then
+  WScript.Echo "Executable not found: " & exe
+  WScript.Quit 1
+End If
+
+args = ""
+For I = 1 to WScript.Arguments.Count - 1
+  args = args & " " & chr(34) & WScript.Arguments(I) & chr(34)
+Next
+
+WshShell.Run exe & args, 0, true
diff --git a/resource/redirect.sh b/resource/redirect.sh
new file mode 100644
index 000000000..05342e273
--- /dev/null
+++ b/resource/redirect.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then
+    echo "Usage: $0 cmd source output.txt"
+    exit 1
+fi
+"$1" "$2" > "$3"
diff --git a/resource/redirect.vbs b/resource/redirect.vbs
new file mode 100644
index 000000000..4f1e7a3f2
--- /dev/null
+++ b/resource/redirect.vbs
@@ -0,0 +1,33 @@
+Option Explicit
+
+Dim WshShell
+Dim fso
+Dim exe, src, dest
+
+Set WshShell = Wscript.CreateObject("Wscript.Shell")
+Set fso = WScript.CreateObject("Scripting.FileSystemObject")
+
+If Not(Wscript.Arguments.Count = 3) Then
+  Wscript.Echo "Usage: redirect.vbs <.exe file> <source file> <text file>"
+  WScript.Quit 1
+End If
+
+exe = WScript.Arguments(0)
+src = WScript.Arguments(1)
+dest = WScript.Arguments(2)
+If Not(fso.FileExists(exe)) Then
+  WScript.Echo "Executable not found: " & exe
+  WScript.Quit 1
+End If
+
+If Not(fso.FileExists(src)) Then
+  WScript.Echo "Source file not found: " & src
+  WScript.Quit 1
+End If
+
+If Not(fso.FolderExists(Left(dest, InstrRev(dest, "\")))) Then
+  WScript.Echo "Destination folder not found: " & Left(dest, InstrRev(dest, "\"))
+  WScript.Quit 1
+End If
+
+WshShell.Run "%comspec% /c " & exe & " " & chr(34) & src & chr(34) & " > " & chr(34) & dest & chr(34), 0, true
diff --git a/resource/tinymce/plugins/paste/editor_plugin.js b/resource/tinymce/plugins/paste/editor_plugin.js
index 848abfdd8..36b85c2af 100644
--- a/resource/tinymce/plugins/paste/editor_plugin.js
+++ b/resource/tinymce/plugins/paste/editor_plugin.js
@@ -152,6 +152,15 @@
 
 				// Check if browser supports direct plaintext access
 				if (e.clipboardData || dom.doc.dataTransfer) {
+					// Added by Zotero
+					// Get HTML from the clipboard directly
+					var html = e.clipboardData && e.clipboardData.getData('text/html');
+					if (html) {
+						e.preventDefault();
+						process({content : html});
+						return;
+					}
+
 					textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text');
 
 					if (ed.pasteAsPlainText) {
@@ -248,14 +257,6 @@
 							each(nl, function(n) {
 								var child = n.firstChild;
 
-								// Added by Zotero
-								// fix copy/paste of non-http links
-								var links = n.querySelectorAll('a');
-								for (var i = 0; i < links.length; i++) {
-									if (!links[i].href && links[i].getAttribute('data-mce-href'))
-										links[i].setAttribute('href', links[i].getAttribute('data-mce-href'));
-								}
-
 								// WebKit inserts a DIV container with lots of odd styles
 								if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) {
 									dom.remove(child, 1);
diff --git a/test/content/runtests.html b/test/content/runtests.html
index 85294a22d..a2291f173 100644
--- a/test/content/runtests.html
+++ b/test/content/runtests.html
@@ -8,7 +8,7 @@
 	<script src="chrome://zotero/content/include.js"></script>
 	<script src="resource://zotero-unit/chai/chai.js"></script>
 	<script src="resource://zotero-unit/mocha/mocha.js"></script>
-	<script src="support.js" version="application/javascript;version=1.8"></script>
-	<script src="runtests.js" version="application/javascript;version=1.8"></script>
+	<script src="support.js" type="application/javascript;version=1.8"></script>
+	<script src="runtests.js" type="application/javascript;version=1.8"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/test/runtests.sh b/test/runtests.sh
index 7ef72c07c..ee9ee850a 100755
--- a/test/runtests.sh
+++ b/test/runtests.sh
@@ -1,6 +1,19 @@
 #!/bin/bash
 CWD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 
+case "$(uname -s)" in
+   CYGWIN*) IS_CYGWIN=1 ;;
+esac
+
+function makePath {
+	local __assignTo=$1
+	local __path=$2
+	if [ ! -z $IS_CYGWIN ]; then
+		__path="`cygpath -aw \"$__path\"`"
+	fi
+	eval $__assignTo="'$__path'"
+}
+
 DEBUG=false
 if [ "`uname`" == "Darwin" ]; then
 	FX_EXECUTABLE="/Applications/Firefox.app/Contents/MacOS/firefox"
@@ -50,8 +63,16 @@ fi
 # Set up profile directory
 PROFILE="`mktemp -d 2>/dev/null || mktemp -d -t 'zotero-unit'`"
 mkdir "$PROFILE/extensions"
-echo "$CWD" > "$PROFILE/extensions/zotero-unit@zotero.org"
-echo "`dirname "$CWD"`" > "$PROFILE/extensions/zotero@chnm.gmu.edu"
+
+makePath ZOTERO_UNIT_PATH "$CWD"
+echo "$ZOTERO_UNIT_PATH" > "$PROFILE/extensions/zotero-unit@zotero.org"
+
+makePath ZOTERO_PATH "`dirname "$CWD"`"
+echo "$ZOTERO_PATH" > "$PROFILE/extensions/zotero@chnm.gmu.edu"
+
+# Create data directory
+mkdir "$PROFILE/zotero"
+
 cat <<EOF > "$PROFILE/prefs.js"
 user_pref("extensions.autoDisableScopes", 0);
 user_pref("extensions.zotero.debug.log", $DEBUG);
@@ -59,7 +80,17 @@ user_pref("extensions.zotero.firstRunGuidance", false);
 user_pref("extensions.zotero.firstRun2", false);
 EOF
 
-MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$PROFILE" \
+# -v flag on Windows makes Firefox process hang
+if [ -z $IS_CYGWIN ]; then
+	echo "`MOZ_NO_REMOTE=1 NO_EM_RESTART=1 \"$FX_EXECUTABLE\" -v`"
+fi
+
+if [ "$TRAVIS" = true ]; then
+	FX_ARGS="$FX_ARGS --ZoteroNoUserInput"
+fi
+
+makePath FX_PROFILE "$PROFILE"
+MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$FX_PROFILE" \
     -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" $FX_ARGS
 
 # Check for success
diff --git a/test/tests/recognizePDF.js b/test/tests/recognizePDF.js
index 670422748..2bbb07368 100644
--- a/test/tests/recognizePDF.js
+++ b/test/tests/recognizePDF.js
@@ -38,6 +38,8 @@ describe("PDF Recognition", function() {
 	});
 
 	it("should recognize a PDF without a DOI", function() {
+		if (Zotero.noUserInput) this.skip(); // CAPTCHAs make this fail
+		
 		this.timeout(30000);
 		// Import the PDF
 		var testdir = getTestDataDirectory();
diff --git a/test/tests/utilities.js b/test/tests/utilities.js
index b71dcb517..a779b1a9b 100644
--- a/test/tests/utilities.js
+++ b/test/tests/utilities.js
@@ -17,4 +17,159 @@ describe("Zotero.Utilities", function() {
 			}
 		});
 	});
+	describe("cleanISBN", function() {
+		let cleanISBN = Zotero.Utilities.cleanISBN;
+		it("should return false for non-ISBN string", function() {
+			assert.isFalse(cleanISBN(''), 'returned false for empty string');
+			assert.isFalse(cleanISBN('Random String 123'), 'returned false for non-ISBN string');
+			assert.isFalse(cleanISBN('1234X67890'), 'returned false for ISBN10-looking string with X in the middle');
+			assert.isFalse(cleanISBN('987123456789X'), 'returned false for ISBN13-looking string with X as check-digit');
+		});
+		it("should return false for invalid ISBN string", function() {
+			assert.isFalse(cleanISBN('1234567890'), 'returned false for invalid ISBN10');
+			assert.isFalse(cleanISBN('9871234567890'), 'returned false for invalid ISBN13');
+		});
+		it("should return valid ISBN string given clean, valid ISBN string", function() {
+			assert.equal(cleanISBN('123456789X'), '123456789X', 'passed through valid ISBN10');
+			assert.equal(cleanISBN('123456789x'), '123456789X', 'passed through valid ISBN10 with lower case input');
+			assert.equal(cleanISBN('9781234567897'), '9781234567897', 'passed through valid ISBN13');
+			assert.equal(cleanISBN('9791843123391'), '9791843123391', 'passed through valid ISBN13 in 979 range');
+		});
+		it("should strip off internal characters in ISBN string", function() {
+			let ignoredChars = '\x2D\xAD\u2010\u2011\u2012\u2013\u2014\u2015\u2043\u2212' // Dashes
+				+ ' \xA0\r\n\t\x0B\x0C\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005' // Spaces
+				+ '\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF';
+			for (let i=0; i<ignoredChars.length; i++) {
+				let charCode = '\\u' + Zotero.Utilities.lpad(ignoredChars.charCodeAt(i).toString(16).toUpperCase(), '0', 4);
+				assert.equal(cleanISBN('9781' + ignoredChars.charAt(i) + '234567897'), '9781234567897', 'stripped off ' + charCode);
+			}
+			assert.equal(cleanISBN('9781' + ignoredChars + '234567897'), '9781234567897', 'stripped off all ignored characters');
+			
+			let isbnChars = ignoredChars + '1234567890';
+			for (let i=1; i<1327; i++) { // More common characters through Cyrillic letters
+				let c = String.fromCharCode(i);
+				if (isbnChars.indexOf(c) != -1) continue;
+				
+				let charCode = '\\u' + Zotero.Utilities.lpad(i.toString(16).toUpperCase(), '0', 4);
+				assert.isFalse(cleanISBN('9781' + c + '234567897'), 'did not ignore internal character ' + charCode);
+			}
+		});
+		it("should strip off surrounding non-ISBN string", function() {
+			assert.equal(cleanISBN('ISBN 9781234567897'), '9781234567897', 'stripped off preceding string (with space)');
+			assert.equal(cleanISBN('ISBN:9781234567897'), '9781234567897', 'stripped off preceding string (without space)');
+			assert.equal(cleanISBN('9781234567897 ISBN13'), '9781234567897', 'stripped off trailing string (with space)');
+			assert.equal(cleanISBN('9781234567897(ISBN13)'), '9781234567897', 'stripped off trailing string (without space)');
+			assert.equal(cleanISBN('ISBN13:9781234567897 (print)'), '9781234567897', 'stripped off surrounding string');
+			assert.equal(cleanISBN('978 9781234567 897'), '9781234567897', 'stripped off pseudo-ISBN prefix');
+		});
+		it("should return the first valid ISBN from a string with multiple ISBNs", function() {
+			assert.equal(cleanISBN('9781234567897, 9791843123391'), '9781234567897', 'returned first valid ISBN13 from list of valid ISBN13s');
+			assert.equal(cleanISBN('123456789X, 0199535922'), '123456789X', 'returned first valid ISBN13 from list of valid ISBN13s');
+			assert.equal(cleanISBN('123456789X 9781234567897'), '123456789X', 'returned first valid ISBN (10) from a list of mixed-length ISBNs');
+			assert.equal(cleanISBN('9781234567897 123456789X'), '9781234567897', 'returned first valid ISBN (13) from a list of mixed-length ISBNs');
+			assert.equal(cleanISBN('1234567890 9781234567897'), '9781234567897', 'returned first valid ISBN in the list with valid and invalid ISBNs');
+		});
+		it("should not return an ISBN from a middle of a longer number string", function() {
+			assert.isFalse(cleanISBN('1239781234567897'), 'did not ignore number prefix');
+			assert.isFalse(cleanISBN('9781234567897123'), 'did not ignore number suffix');
+			assert.isFalse(cleanISBN('1239781234567897123'), 'did not ignore surrounding numbers');
+		});
+		it("should return valid ISBN from a dirty string", function() {
+			assert.equal(cleanISBN('<b>ISBN</b>:978-1 234\xA056789 - 7(print)\n<b>ISBN-10</b>:123\x2D456789X (print)'), '9781234567897');
+		});
+		it("should not validate check digit when dontValidate is set", function() {
+			assert.equal(cleanISBN('9781234567890', true), '9781234567890', 'plain ISBN13 with wrong check digit');
+			assert.equal(cleanISBN('1234567890', true), '1234567890', 'plain ISBN10 with wrong check digit');
+			assert.equal(cleanISBN('1234567890 9781234567897', true), '1234567890', 'returned first ISBN10 (invalid) in the list with valid and invalid ISBNs');
+			assert.equal(cleanISBN('9781234567890 123456789X', true), '9781234567890', 'returned first ISBN13 (invalid) in the list with valid and invalid ISBNs');
+		});
+		it("should not pass non-ISBN strings if dontValidate is set", function() {
+			assert.isFalse(cleanISBN('', true), 'returned false for empty string');
+			assert.isFalse(cleanISBN('Random String 123', true), 'returned false for non-ISBN string');
+			assert.isFalse(cleanISBN('1234X67890', true), 'returned false for ISBN10-looking string with X in the middle');
+			assert.isFalse(cleanISBN('123456789Y', true), 'returned false for ISBN10-looking string with Y as check digit');
+			assert.isFalse(cleanISBN('987123456789X', true), 'returned false for ISBN13-looking string with X as check-digit');
+			assert.isFalse(cleanISBN('1239781234567897', true), 'did not ignore number prefix');
+			assert.isFalse(cleanISBN('9781234567897123', true), 'did not ignore number suffix');
+			assert.isFalse(cleanISBN('1239781234567897123', true), 'did not ignore surrounding numbers');
+		});
+	});
+	describe("toISBN13", function() {
+		let toISBN13 = Zotero.Utilities.toISBN13;
+		it("should throw on invalid ISBN", function() {
+			let errorMsg = 'ISBN not found in "',
+				invalidStrings = ['', 'random string', '1234567890123'];
+			for (let i=0; i<invalidStrings.length; i++) {
+				assert.throws(toISBN13.bind(null,invalidStrings[i]), errorMsg + invalidStrings[i] + '"');
+			}
+		});
+		it("should convert to ISBN13", function() {
+			assert.equal(toISBN13('123456789X'), '9781234567897', 'converts ISBN10 to ISBN13');
+			assert.equal(toISBN13('9781234567897'), '9781234567897', 'ISBN13 stays the same');
+			assert.equal(toISBN13('9791843123391'), '9791843123391', '979 ISBN13 stays the same');
+			assert.equal(toISBN13('978-1234567897'), '9781234567897', 'accepts hyphenated ISBN');
+		});
+		it("should ignore invalid check digit", function() {
+			assert.equal(toISBN13('1234567890'), '9781234567897', 'converts ISBN10 with invalid check digit to ISBN13');
+			assert.equal(toISBN13('9781234567890'), '9781234567897', 'corrects invalid ISBN13 check digit');
+		});
+	});
+	describe("cleanISSN", function() {
+		let cleanISSN = Zotero.Utilities.cleanISSN;
+		it("should return false for non-ISSN string", function() {
+			assert.isFalse(cleanISSN(''), 'returned false for empty string');
+			assert.isFalse(cleanISSN('Random String 123'), 'returned false for non-ISSN string');
+			assert.isFalse(cleanISSN('123X-5679'), 'returned false for ISSN-looking string with X in the middle');
+		});
+		it("should return false for invalid ISSN string", function() {
+			assert.isFalse(cleanISSN('12345678'), 'returned false for invalid ISSN');
+			assert.isFalse(cleanISSN('1234-5678'), 'returned false for invalid ISSN with hyphen');
+		});
+		it("should return valid ISSN string given clean, valid ISSN string", function() {
+			assert.equal(cleanISSN('1234-5679'), '1234-5679', 'passed through valid ISSN');
+			assert.equal(cleanISSN('2090-424X'), '2090-424X', 'passed through valid ISSN with X check digit');
+		});
+		it("should hyphenate valid ISSN", function() {
+			assert.equal(cleanISSN('12345679'), '1234-5679', 'hyphenated valid ISSN');
+		});
+		it("should strip off internal characters in ISSN string", function() {
+			let ignoredChars = '\x2D\xAD\u2010\u2011\u2012\u2013\u2014\u2015\u2043\u2212' // Dashes
+				+ ' \xA0\r\n\t\x0B\x0C\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005' // Spaces
+				+ '\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF';
+			for (let i=0; i<ignoredChars.length; i++) {
+				let charCode = '\\u' + Zotero.Utilities.lpad(ignoredChars.charCodeAt(i).toString(16).toUpperCase(), '0', 4);
+				assert.equal(cleanISSN('1' + ignoredChars.charAt(i) + '2345679'), '1234-5679', 'stripped off ' + charCode);
+			}
+			assert.equal(cleanISSN('1' + ignoredChars + '2345679'), '1234-5679', 'stripped off all ignored characters');
+			
+			let isbnChars = ignoredChars + '1234567890';
+			for (let i=1; i<1327; i++) { // More common characters through Cyrillic letters
+				let c = String.fromCharCode(i);
+				if (isbnChars.indexOf(c) != -1) continue;
+				
+				let charCode = '\\u' + Zotero.Utilities.lpad(i.toString(16).toUpperCase(), '0', 4);
+				assert.isFalse(cleanISSN('1' + c + '2345679'), 'did not ignore internal character ' + charCode);
+			}
+		});
+		it("should strip off surrounding non-ISSN string", function() {
+			assert.equal(cleanISSN('ISSN 1234-5679'), '1234-5679', 'stripped off preceding string (with space)');
+			assert.equal(cleanISSN('ISSN:1234-5679'), '1234-5679', 'stripped off preceding string (without space)');
+			assert.equal(cleanISSN('1234-5679 ISSN'), '1234-5679', 'stripped off trailing string (with space)');
+			assert.equal(cleanISSN('1234-5679(ISSN)'), '1234-5679', 'stripped off trailing string (without space)');
+			assert.equal(cleanISSN('ISSN:1234-5679 (print)'), '1234-5679', 'stripped off surrounding string');
+			assert.equal(cleanISSN('123 12345 679'), '1234-5679', 'stripped off pseudo-ISSN prefix');
+		});
+		it("should return the first valid ISSN from a string with multiple ISSNs", function() {
+			assert.equal(cleanISSN('1234-5679, 0028-0836'), '1234-5679', 'returned first valid ISSN from list of valid ISSNs');
+			assert.equal(cleanISSN('1234-5678, 0028-0836'), '0028-0836', 'returned first valid ISSN in the list with valid and invalid ISSNs');
+		});
+		it("should not return an ISSN from a middle of a longer number string", function() {
+			assert.isFalse(cleanISSN('12312345679'), 'did not ignore number prefix');
+			assert.isFalse(cleanISSN('12345679123'), 'did not ignore number suffix');
+			assert.isFalse(cleanISSN('12312345679123'), 'did not ignore surrounding numbers');
+		});
+		it("should return valid ISSN from a dirty string", function() {
+			assert.equal(cleanISSN('<b>ISSN</b>:1234\xA0-\t5679(print)\n<b>eISSN (electronic)</b>:0028-0836'), '1234-5679');
+		});
+	});
 });
diff --git a/update.rdf b/update.rdf
index de96024e6..5f361368e 100644
--- a/update.rdf
+++ b/update.rdf
@@ -12,7 +12,7 @@
             <RDF:Description>
               <id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</id>
               <minVersion>31.0</minVersion>
-              <maxVersion>36.*</maxVersion>
+              <maxVersion>37.*</maxVersion>
               <updateLink>http://download.zotero.org/extension/zotero.xpi</updateLink>
               <updateHash>sha1:</updateHash>
             </RDF:Description>