diff --git a/geomagio/WebService.py b/geomagio/WebService.py
index bb567864350917bc7710ad9383f0bd384d56d477..c40a914668175a0aa702887de1779d92cca250b0 100644
--- a/geomagio/WebService.py
+++ b/geomagio/WebService.py
@@ -282,11 +282,11 @@ class WebService(object):
         else:
             output_format = output_format.lower()
         observatory_id = observatory_id.upper()
-        if observatory_id not in self.metadata.keys():
+        if observatory_id not in list(self.metadata.keys()):
             raise WebServiceException(
                    'Bad id value "%s".'
                    ' Valid values are: %s'
-                   % (observatory_id, self.metadata.keys()))
+                   % (observatory_id, list(self.metadata.keys())))
         if not starttime:
             now = datetime.now()
             today = UTCDateTime(
diff --git a/geomagio/WebServiceUsage.py b/geomagio/WebServiceUsage.py
index f72fdc438e373adc06b47ab37de44464fc0b912e..858f621ab0cf7ea38db9d8fe56e8dfa50b4674ea 100644
--- a/geomagio/WebServiceUsage.py
+++ b/geomagio/WebServiceUsage.py
@@ -5,7 +5,7 @@ from geomagio.ObservatoryMetadata import ObservatoryMetadata
 
 class WebServiceUsage(object):
     def __init__(self, metadata=None, mount_path=None, host_prefix=None):
-        metadata = metadata or ObservatoryMetadata().metadata.keys()
+        metadata = metadata or list(ObservatoryMetadata().metadata.keys())
         self.date = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
         self.metadata = ', '.join(sorted(metadata))
         self.mount_path = mount_path
diff --git a/geomagio/iaga2002/IAGA2002Factory.py b/geomagio/iaga2002/IAGA2002Factory.py
index f18dbf7419310225b737dde9d05f571bee923ebe..6867d3a2c5eff8160e640f2fc120490076e805c7 100644
--- a/geomagio/iaga2002/IAGA2002Factory.py
+++ b/geomagio/iaga2002/IAGA2002Factory.py
@@ -72,7 +72,7 @@ class IAGA2002Factory(TimeseriesFactory):
                 rate = 1
             else:
                 raise Exception('one sample, and unable to guess rate')
-        for channel in data.keys():
+        for channel in list(data.keys()):
             stats = obspy.core.Stats(metadata)
             stats.starttime = starttime
             stats.sampling_rate = rate
diff --git a/geomagio/imfv122/IMFV122Factory.py b/geomagio/imfv122/IMFV122Factory.py
index 294058f019dca6408a28506f39e829874dd342c6..9210287bf042baed1b7b1fa8b9e01aa026da6999 100644
--- a/geomagio/imfv122/IMFV122Factory.py
+++ b/geomagio/imfv122/IMFV122Factory.py
@@ -43,10 +43,10 @@ class IMFV122Factory(TimeseriesFactory):
         starttime = obspy.core.UTCDateTime(parser.times[0])
         endtime = obspy.core.UTCDateTime(parser.times[-1])
         data = parser.data
-        length = len(data[data.keys()[0]])
+        length = len(data[list(data.keys())[0]])
         rate = (length - 1) / (endtime - starttime)
         stream = obspy.core.Stream()
-        for channel in data.keys():
+        for channel in list(data.keys()):
             stats = obspy.core.Stats(metadata)
             stats.starttime = starttime
             stats.sampling_rate = rate
diff --git a/geomagio/pcdcp/PCDCPFactory.py b/geomagio/pcdcp/PCDCPFactory.py
index df94833c2eb00cc6f7f4a6751a6f602f71290491..c6d783dac98f2da442a1746be5c7cd271bdc69e7 100644
--- a/geomagio/pcdcp/PCDCPFactory.py
+++ b/geomagio/pcdcp/PCDCPFactory.py
@@ -71,7 +71,7 @@ class PCDCPFactory(TimeseriesFactory):
         rate = (length - 1) / (endtime - starttime)
         stream = obspy.core.Stream()
 
-        for channel in data.keys():
+        for channel in list(data.keys()):
             stats = obspy.core.Stats()
             stats.network = 'NT'
             stats.station = parser.header['station']