2to3 --fix=dict with manual cleanup
diff --git a/Lib/fontTools/afmLib.py b/Lib/fontTools/afmLib.py
index 3c0b4bc..d2ce79a 100644
--- a/Lib/fontTools/afmLib.py
+++ b/Lib/fontTools/afmLib.py
@@ -241,8 +241,7 @@
 		# write kerning info
 		lines.append("StartKernData")
 		lines.append("StartKernPairs " + repr(len(self._kerning)))
-		items = self._kerning.items()
-		items.sort()		# XXX is order important?
+		items = sorted(self._kerning.items())
 		for (leftchar, rightchar), value in items:
 			lines.append("KPX %s %s %d" % (leftchar, rightchar, value))
 		lines.append("EndKernPairs")
@@ -266,13 +265,13 @@
 		return pair in self._kerning
 	
 	def kernpairs(self):
-		return self._kerning.keys()
+		return list(self._kerning.keys())
 	
 	def has_char(self, char):
 		return char in self._chars
 	
 	def chars(self):
-		return self._chars.keys()
+		return list(self._chars.keys())
 	
 	def comments(self):
 		return self._comments
diff --git a/Lib/fontTools/cffLib.py b/Lib/fontTools/cffLib.py
index f32f9cf..8170a98 100644
--- a/Lib/fontTools/cffLib.py
+++ b/Lib/fontTools/cffLib.py
@@ -523,13 +523,13 @@
 				self.fdArray = fdArray
 	
 	def keys(self):
-		return self.charStrings.keys()
+		return list(self.charStrings.keys())
 	
 	def values(self):
 		if self.charStringsAreIndexed:
 			return self.charStringsIndex
 		else:
-			return self.charStrings.values()
+			return list(self.charStrings.values())
 	
 	def has_key(self, name):
 		return name in self.charStrings
diff --git a/Lib/fontTools/fondLib.py b/Lib/fontTools/fondLib.py
index d3b6c2f..5debb8c 100644
--- a/Lib/fontTools/fondLib.py
+++ b/Lib/fontTools/fondLib.py
@@ -372,8 +372,7 @@
 				nameparts[part] = None
 		del nameparts[self.ffFamilyName]
 		nameparts = sorted(nameparts.keys())
-		items = splitnames.items()
-		items.sort()
+		items = sorted(splitnames.items())
 		numindices = 0
 		for style, split in items:
 			if len(split) > 1:
diff --git a/Lib/fontTools/ttLib/__init__.py b/Lib/fontTools/ttLib/__init__.py
index 2e208b4..5916bdf 100644
--- a/Lib/fontTools/ttLib/__init__.py
+++ b/Lib/fontTools/ttLib/__init__.py
@@ -193,7 +193,7 @@
 			# assume "file" is a writable file object
 			closeStream = 0
 		
-		tags = self.keys()
+		tags = list(self.keys())
 		if "GlyphOrder" in tags:
 			tags.remove("GlyphOrder")
 		numTables = len(tags)
@@ -235,7 +235,7 @@
 		self.disassembleInstructions = disassembleInstructions
 		self.bitmapGlyphDataFormat = bitmapGlyphDataFormat
 		if not tables:
-			tables = self.keys()
+			tables = list(self.keys())
 			if "GlyphOrder" not in tables:
 				tables = ["GlyphOrder"] + tables
 			if skipTables:
@@ -351,9 +351,9 @@
 	__contains__ = has_key
 	
 	def keys(self):
-		keys = self.tables.keys()
+		keys = list(self.tables.keys())
 		if self.reader:
-			for key in self.reader.keys():
+			for key in list(self.reader.keys()):
 				if key not in keys:
 					keys.append(key)
 
@@ -363,7 +363,7 @@
 		return ["GlyphOrder"] + keys
 	
 	def __len__(self):
-		return len(self.keys())
+		return len(list(self.keys()))
 	
 	def __getitem__(self, tag):
 		try:
@@ -487,7 +487,7 @@
 			cmap = tempcmap.cmap
 			# create a reverse cmap dict
 			reversecmap = {}
-			for unicode, name in cmap.items():
+			for unicode, name in list(cmap.items()):
 				reversecmap[name] = unicode
 			allNames = {}
 			for i in range(numGlyphs):
@@ -642,11 +642,11 @@
 		the 'preferCFF' argument to specify which one should be taken.
 		"""
 		if preferCFF and "CFF " in self:
-			return self["CFF "].cff.values()[0].CharStrings
+			return list(self["CFF "].cff.values())[0].CharStrings
 		if "glyf" in self:
 			return _TTGlyphSet(self)
 		if "CFF " in self:
-			return self["CFF "].cff.values()[0].CharStrings
+			return list(self["CFF "].cff.values())[0].CharStrings
 		raise TTLibError("Font contains no outlines")
 
 
@@ -664,7 +664,7 @@
 		self._ttFont = ttFont
 	
 	def keys(self):
-		return self._ttFont["glyf"].keys()
+		return list(self._ttFont["glyf"].keys())
 	
 	def has_key(self, glyphName):
 		return glyphName in self._ttFont["glyf"]
@@ -939,7 +939,7 @@
 	from fontTools.ttLib.sfnt import SFNTReader, SFNTWriter
 	reader = SFNTReader(inFile, checkChecksums=checkChecksums)
 	writer = SFNTWriter(outFile, len(reader.tables), reader.sfntVersion, reader.flavor, reader.flavorData)
-	tables = reader.keys()
+	tables = list(reader.keys())
 	for tag in sortedTagList(tables, tableOrder):
 		writer[tag] = reader[tag]
 	writer.close()
diff --git a/Lib/fontTools/ttLib/sfnt.py b/Lib/fontTools/ttLib/sfnt.py
index d69b7b7..3cac90f 100644
--- a/Lib/fontTools/ttLib/sfnt.py
+++ b/Lib/fontTools/ttLib/sfnt.py
@@ -238,7 +238,7 @@
 
 	def _calcMasterChecksum(self, directory):
 		# calculate checkSumAdjustment
-		tags = self.tables.keys()
+		tags = list(self.tables.keys())
 		checksums = []
 		for i in range(len(tags)):
 			checksums.append(self.tables[tags[i]].checkSum)
diff --git a/Lib/fontTools/ttLib/tables/L_T_S_H_.py b/Lib/fontTools/ttLib/tables/L_T_S_H_.py
index bae8778..275de66 100644
--- a/Lib/fontTools/ttLib/tables/L_T_S_H_.py
+++ b/Lib/fontTools/ttLib/tables/L_T_S_H_.py
@@ -24,7 +24,7 @@
 	
 	def compile(self, ttFont):
 		version = 0
-		names = self.yPels.keys()
+		names = list(self.yPels.keys())
 		numGlyphs = len(names)
 		yPels = [0] * numGlyphs
 		# ouch: the assertion is not true in Chicago!
diff --git a/Lib/fontTools/ttLib/tables/T_S_I__1.py b/Lib/fontTools/ttLib/tables/T_S_I__1.py
index 7f23593..07fe1a3 100644
--- a/Lib/fontTools/ttLib/tables/T_S_I__1.py
+++ b/Lib/fontTools/ttLib/tables/T_S_I__1.py
@@ -89,8 +89,7 @@
 			writer.endtag("glyphProgram")
 			writer.newline()
 			writer.newline()
-		extra_names = self.extraPrograms.keys()
-		extra_names.sort()
+		extra_names = sorted(self.extraPrograms.keys()))
 		for name in extra_names:
 			text = self.extraPrograms[name]
 			if not text:
diff --git a/Lib/fontTools/ttLib/tables/V_O_R_G_.py b/Lib/fontTools/ttLib/tables/V_O_R_G_.py
index a095dcd..e2fe5f9 100644
--- a/Lib/fontTools/ttLib/tables/V_O_R_G_.py
+++ b/Lib/fontTools/ttLib/tables/V_O_R_G_.py
@@ -38,8 +38,8 @@
 
 
 	def compile(self, ttFont):
-		vorgs = self.VOriginRecords.values()
-		names = self.VOriginRecords.keys()
+		vorgs = list(self.VOriginRecords.values())
+		names = list(self.VOriginRecords.keys())
 		nameMap = ttFont.getReverseGlyphMap()
 		lenRecords = len(vorgs) 
 		try:
diff --git a/Lib/fontTools/ttLib/tables/_c_m_a_p.py b/Lib/fontTools/ttLib/tables/_c_m_a_p.py
index 5d4e7ce..7886044 100644
--- a/Lib/fontTools/ttLib/tables/_c_m_a_p.py
+++ b/Lib/fontTools/ttLib/tables/_c_m_a_p.py
@@ -360,8 +360,8 @@
 				# same as mapping it to .notdef.
 		# cmap values are GID's.
 		glyphOrder = self.ttFont.getGlyphOrder()
-		gids = cmap.values()
-		charCodes = cmap.keys()
+		gids = list(cmap.values())
+		charCodes = list(cmap.keys())
 		lenCmap = len(gids)
 		try:
 			names = list(map(operator.getitem, [glyphOrder]*lenCmap, gids ))
@@ -714,7 +714,7 @@
 
 		from fontTools.ttLib.sfnt import maxPowerOfTwo
 		
-		charCodes = self.cmap.keys()
+		charCodes = list(self.cmap.keys())
 		lenCharCodes = len(charCodes)
 		if lenCharCodes == 0:
 			startCode = [0xffff]
@@ -862,7 +862,7 @@
 		if self.data:
 			return struct.pack(">HHH", self.format, self.length, self.language) + self.data
 		cmap = self.cmap
-		codes = cmap.keys()
+		codes = list(cmap.keys())
 		if codes: # yes, there are empty cmap tables.
 			codes = list(range(codes[0], codes[-1] + 1))
 			firstCode = codes[0]
@@ -945,9 +945,9 @@
 	def compile(self, ttFont):
 		if self.data:
 			return struct.pack(">HHLLL", self.format, self.reserved, self.length, self.language, self.nGroups) + self.data
-		charCodes = self.cmap.keys()
+		charCodes = list(self.cmap.keys())
 		lenCharCodes = len(charCodes) 
-		names = self.cmap.values()
+		names = list(self.cmap.values())
 		nameMap = ttFont.getReverseGlyphMap()
 		try:
 			gids = list(map(operator.getitem, [nameMap]*lenCharCodes, names))
diff --git a/Lib/fontTools/ttLib/tables/otTables.py b/Lib/fontTools/ttLib/tables/otTables.py
index ef9a44e..3cb86be 100644
--- a/Lib/fontTools/ttLib/tables/otTables.py
+++ b/Lib/fontTools/ttLib/tables/otTables.py
@@ -159,7 +159,7 @@
 		mapping = getattr(self, "mapping", None)
 		if mapping is None:
 			mapping = self.mapping = {}
-		items = mapping.items()
+		items = list(mapping.items())
 		getGlyphID = font.getGlyphID
 		gidItems = [(getGlyphID(item[0]), getGlyphID(item[1])) for item in items]
 		sortableItems = sorted(zip(gidItems, items))
@@ -241,7 +241,7 @@
 		classDefs = getattr(self, "classDefs", None)
 		if classDefs is None:
 			classDefs = self.classDefs = {}
-		items = classDefs.items()
+		items = list(classDefs.items())
 		getGlyphID = font.getGlyphID
 		for i in range(len(items)):
 			glyphName, cls = items[i]
@@ -303,7 +303,7 @@
 		alternates = getattr(self, "alternates", None)
 		if alternates is None:
 			alternates = self.alternates = {}
-		items = alternates.items()
+		items = list(alternates.items())
 		for i in range(len(items)):
 			glyphName, set = items[i]
 			items[i] = font.getGlyphID(glyphName), glyphName, set
@@ -368,7 +368,7 @@
 		ligatures = getattr(self, "ligatures", None)
 		if ligatures is None:
 			ligatures = self.ligatures = {}
-		items = ligatures.items()
+		items = list(ligatures.items())
 		for i in range(len(items)):
 			glyphName, set = items[i]
 			items[i] = font.getGlyphID(glyphName), glyphName, set