diff --git a/geomagio/TimeseriesFactory.py b/geomagio/TimeseriesFactory.py
index 2d9ec3f81b472a08d72bd4d75d492c6146fdaa8a..f631b90aaadff0b8cef50f2ae6388d5233124420 100644
--- a/geomagio/TimeseriesFactory.py
+++ b/geomagio/TimeseriesFactory.py
@@ -23,16 +23,12 @@ class TimeseriesFactory(object):
         data interval, optional.
         default 'minute'.
     urlTemplate : str
-        A string that contains any of the following replacement patterns:
-        - '%(i)s' : interval abbreviation
-        - '%(interval)s' interval name
-        - '%(julian)s' julian date
-        - '%(obs)s' lowercase observatory code
-        - '%(OBS)s' uppercase observatory code
-        - '%(t)s' type abbreviation
-        - '%(type)s' type name
-        - '%(year)s' year formatted as YYYY
-        - '%(ymd)s' time formatted as YYYYMMDD
+        A string that contains replacement patterns.
+        See https://github.com/usgs/geomag-algorithms/blob/master/docs/io.md
+        and/or TimeseriesFactory._get_url()
+    urlInterval : int
+        Interval in seconds between URLs.
+        Intervals begin at the unix epoch (1970-01-01T00:00:00Z)
     """
     def __init__(self, observatory=None, channels=('H', 'D', 'Z', 'F'),
             type='variation', interval='minute',
@@ -82,7 +78,34 @@ class TimeseriesFactory(object):
         TimeseriesFactoryException
             if any parameters are unsupported, or errors occur loading data.
         """
-        raise NotImplementedError('"get_timeseries" not implemented')
+        observatory = observatory or self.observatory
+        channels = channels or self.channels
+        type = type or self.type
+        interval = interval or self.interval
+
+        timeseries = obspy.core.Stream()
+        urlIntervals = Util.get_intervals(
+                starttime=starttime,
+                endtime=endtime,
+                size=self.urlInterval)
+        for urlInterval in urlIntervals:
+            url = self._get_url(
+                    observatory=observatory,
+                    date=urlInterval['start'],
+                    type=type,
+                    interval=interval,
+                    channels=channels)
+            data = Util.read_url(url)
+            try:
+                timeseries += self.parse_string(data)
+            except NotImplementedError:
+                raise NotImplementedError('"get_timeseries" not implemented')
+            except Exception as e:
+                print >> sys.stderr, "Error parsing data: " + str(e)
+                print >> sys.stderr, data
+        timeseries.merge()
+        timeseries.trim(starttime, endtime)
+        return timeseries
 
     def parse_string(self, data):
         """Parse the contents of a string in the format of an IAGA2002 file.
@@ -127,7 +150,39 @@ class TimeseriesFactory(object):
         TimeseriesFactoryException
             if any errors occur.
         """
-        raise NotImplementedError('"put_timeseries" not implemented')
+        if not self.urlTemplate.startswith('file://'):
+            raise TimeseriesFactoryException('Only file urls are supported')
+        channels = channels or self.channels
+        type = type or self.type
+        interval = interval or self.interval
+        stats = timeseries[0].stats
+        delta = stats.delta
+        observatory = stats.station
+        starttime = starttime or stats.starttime
+        endtime = endtime or stats.endtime
+
+        urlIntervals = Util.get_intervals(
+                starttime=starttime,
+                endtime=endtime,
+                size=self.urlInterval)
+        for urlInterval in urlIntervals:
+            url = self._get_url(
+                    observatory=observatory,
+                    date=urlInterval['start'],
+                    type=type,
+                    interval=interval,
+                    channels=channels)
+            url_data = timeseries.slice(
+                    starttime=urlInterval['start'],
+                    # subtract delta to omit the sample at end: `[start, end)`
+                    endtime=(urlInterval['end'] - delta))
+            url_file = Util.get_file_from_url(url, createParentDirectory=True)
+            with open(url_file, 'wb') as fh:
+                try:
+                    self.write_file(fh, url_data, channels)
+                except NotImplementedError:
+                    raise NotImplementedError(
+                            '"get_timeseries" not implemented')
 
     def write_file(self, fh, timeseries, channels):
         """Write timeseries data to the given file object.
@@ -172,61 +227,6 @@ class TimeseriesFactory(object):
             os.makedirs(parent)
         return filename
 
-    def _get_timeseries(self, starttime, endtime, observatory=None,
-            channels=None, type=None, interval=None):
-        """A basic implementation of get_timeseries using parse_string.
-
-        Parameters
-        ----------
-        starttime : UTCDateTime
-            time of first sample in timeseries.
-        endtime : UTCDateTime
-            time of last sample in timeseries.
-        observatory : str
-            observatory code, usually 3 characters, optional.
-            uses default if unspecified.
-        channels : array_like
-            list of channels to load, optional.
-            uses default if unspecified.
-        type : {'definitive', 'provisional', 'quasi-definitive', 'variation'}
-            data type, optional.
-            uses default if unspecified.
-        interval : {'daily', 'hourly', 'minute', 'monthly', 'second'}
-            data interval, optional.
-            uses default if unspecified.
-
-        Returns
-        -------
-        obspy.core.Stream
-            stream containing traces for requested timeseries.
-        """
-        observatory = observatory or self.observatory
-        channels = channels or self.channels
-        type = type or self.type
-        interval = interval or self.interval
-
-        timeseries = obspy.core.Stream()
-        urlIntervals = Util.get_intervals(
-                starttime=starttime,
-                endtime=endtime,
-                size=self.urlInterval)
-        for urlInterval in urlIntervals:
-            url = self._get_url(
-                    observatory=observatory,
-                    date=urlInterval['start'],
-                    type=type,
-                    interval=interval,
-                    channels=channels)
-            data = Util.read_url(url)
-            try:
-                timeseries += self.parse_string(data)
-            except Exception as e:
-                print >> sys.stderr, "Error parsing data: " + str(e)
-                print >> sys.stderr, data
-        timeseries.merge()
-        timeseries.trim(starttime, endtime)
-        return timeseries
-
     def _get_url(self, observatory, date, type='variation', interval='minute',
             channels=None):
         """Get the url for a specified file.
@@ -401,61 +401,3 @@ class TimeseriesFactory(object):
             raise TimeseriesFactoryException(
                     'Unsupported type "%s"' % type)
         return type_name
-
-    def _put_timeseries(self, timeseries, starttime=None, endtime=None,
-            channels=None, type=None, interval=None):
-        """A basic implementation of put_timeseries using write_file.
-
-        Parameters
-        ----------
-        timeseries : obspy.core.Stream
-            stream containing traces to store.
-        starttime : UTCDateTime
-            time of first sample in timeseries to store.
-            uses first sample if unspecified.
-        endtime : UTCDateTime
-            time of last sample in timeseries to store.
-            uses last sample if unspecified.
-        channels : array_like
-            list of channels to store, optional.
-            uses default if unspecified.
-        type : {'definitive', 'provisional', 'quasi-definitive', 'variation'}
-            data type, optional.
-            uses default if unspecified.
-        interval : {'daily', 'hourly', 'minute', 'monthly', 'second'}
-            data interval, optional.
-            uses default if unspecified.
-        Raises
-        ------
-        TimeseriesFactoryException
-            if any errors occur.
-        """
-        if not self.urlTemplate.startswith('file://'):
-            raise TimeseriesFactoryException('Only file urls are supported')
-        channels = channels or self.channels
-        type = type or self.type
-        interval = interval or self.interval
-        stats = timeseries[0].stats
-        delta = stats.delta
-        observatory = stats.station
-        starttime = starttime or stats.starttime
-        endtime = endtime or stats.endtime
-
-        urlIntervals = Util.get_intervals(
-                starttime=starttime,
-                endtime=endtime,
-                size=self.urlInterval)
-        for urlInterval in urlIntervals:
-            url = self._get_url(
-                    observatory=observatory,
-                    date=urlInterval['start'],
-                    type=type,
-                    interval=interval,
-                    channels=channels)
-            url_data = timeseries.slice(
-                    starttime=urlInterval['start'],
-                    # subtract delta to omit the sample at end: `[start, end)`
-                    endtime=(urlInterval['end'] - delta))
-            url_file = Util.get_file_from_url(url, createParentDirectory=True)
-            with open(url_file, 'wb') as fh:
-                self.write_file(fh, url_data, channels)
diff --git a/geomagio/iaga2002/IAGA2002Factory.py b/geomagio/iaga2002/IAGA2002Factory.py
index 9f17624edd72e543e40ffb2afa7def084696655c..83154283b14180e5530b3f80da88646480488c4e 100644
--- a/geomagio/iaga2002/IAGA2002Factory.py
+++ b/geomagio/iaga2002/IAGA2002Factory.py
@@ -34,42 +34,6 @@ class IAGA2002Factory(TimeseriesFactory):
     def __init__(self, **kwargs):
         TimeseriesFactory.__init__(self, **kwargs)
 
-    def get_timeseries(self, starttime, endtime, observatory=None,
-            channels=None, type=None, interval=None):
-        """Get timeseries data
-
-        Parameters
-        ----------
-        observatory : str
-            observatory code.
-        starttime : obspy.core.UTCDateTime
-            time of first sample.
-        endtime : obspy.core.UTCDateTime
-            time of last sample.
-        type : {'variation', 'quasi-definitive'}
-            data type.
-        interval : {'minute', 'second'}
-            data interval.
-
-        Returns
-        -------
-        obspy.core.Stream
-            timeseries object with requested data.
-
-        Raises
-        ------
-        TimeseriesFactoryException
-            if invalid values are requested, or errors occur while
-            retrieving timeseries.
-        """
-        return self._get_timeseries(
-                starttime=starttime,
-                endtime=endtime,
-                observatory=observatory,
-                channels=channels,
-                type=type,
-                interval=interval)
-
     def parse_string(self, iaga2002String):
         """Parse the contents of a string in the format of an IAGA2002 file.
 
@@ -104,38 +68,6 @@ class IAGA2002Factory(TimeseriesFactory):
             stream += obspy.core.Trace(data[channel], stats)
         return stream
 
-    def put_timeseries(self, timeseries, starttime=None, endtime=None,
-            channels=None, type=None, interval=None):
-        """Store timeseries data.
-
-        Parameters
-        ----------
-        timeseries : obspy.core.Stream
-            stream containing traces to store.
-        starttime : UTCDateTime
-            time of first sample in timeseries to store.
-            uses first sample if unspecified.
-        endtime : UTCDateTime
-            time of last sample in timeseries to store.
-            uses last sample if unspecified.
-        channels : array_like
-            list of channels to store, optional.
-            uses default if unspecified.
-        type : {'definitive', 'provisional', 'quasi-definitive', 'variation'}
-            data type, optional.
-            uses default if unspecified.
-        interval : {'daily', 'hourly', 'minute', 'monthly', 'second'}
-            data interval, optional.
-            uses default if unspecified.
-        """
-        return self._put_timeseries(
-                timeseries=timeseries,
-                starttime=starttime,
-                endtime=endtime,
-                channels=channels,
-                type=type,
-                interval=interval)
-
     def write_file(self, fh, timeseries, channels):
         """writes timeseries data to the given file object.
 
diff --git a/geomagio/imfv283/IMFV283Factory.py b/geomagio/imfv283/IMFV283Factory.py
index a12e079d2af0851e460ee5961caaac7a72f0ac91..f7b493f7e18aaadc63159882edb9e342723872a4 100644
--- a/geomagio/imfv283/IMFV283Factory.py
+++ b/geomagio/imfv283/IMFV283Factory.py
@@ -53,7 +53,8 @@ class IMFV283Factory(TimeseriesFactory):
             if invalid values are requested, or errors occur while
             retrieving timeseries.
         """
-        timeseries = self._get_timeseries(
+        timeseries = TimeseriesFactory.get_timeseries(
+                self,
                 starttime=starttime,
                 endtime=endtime,
                 observatory=observatory,
diff --git a/geomagio/imfv283/StreamIMFV283Factory.py b/geomagio/imfv283/StreamIMFV283Factory.py
index 57e24c955cef534bacf60f9b2faa5209859157a0..d64b886385d1db2bf31105178871bbab3eb9351f 100644
--- a/geomagio/imfv283/StreamIMFV283Factory.py
+++ b/geomagio/imfv283/StreamIMFV283Factory.py
@@ -28,6 +28,4 @@ class StreamIMFV283Factory(IMFV283Factory):
         Notes: Calls IMFV283Factory.parse_string in place of
             IMFV283Factory.get_timeseries.
         """
-
-        self._stream.seek(0)
         return IMFV283Factory.parse_string(self, self._stream.read())
diff --git a/geomagio/pcdcp/PCDCPFactory.py b/geomagio/pcdcp/PCDCPFactory.py
index a293ec7701ba19a75624e2c5146a0fc5b187a1e8..0cfc04d20a00335317cdac29f9e1621a3cc8506c 100644
--- a/geomagio/pcdcp/PCDCPFactory.py
+++ b/geomagio/pcdcp/PCDCPFactory.py
@@ -3,7 +3,6 @@
 import obspy.core
 from .. import ChannelConverter
 from ..TimeseriesFactory import TimeseriesFactory
-from ..TimeseriesFactoryException import TimeseriesFactoryException
 from PCDCPParser import PCDCPParser
 from PCDCPWriter import PCDCPWriter
 
@@ -37,42 +36,6 @@ class PCDCPFactory(TimeseriesFactory):
     def __init__(self, **kwargs):
         TimeseriesFactory.__init__(self, **kwargs)
 
-    def get_timeseries(self, starttime, endtime, observatory=None,
-            channels=None, type=None, interval=None):
-        """Get timeseries data
-
-        Parameters
-        ----------
-        observatory : str
-            3-letter observatory code.
-        starttime : obspy.core.UTCDateTime
-            Time of first sample.
-        endtime : obspy.core.UTCDateTime
-            Time of last sample.
-        type : {'variation', 'quasi-definitive'}
-            Data type.
-        interval : {'minute', 'second'}
-            Data interval.
-
-        Returns
-        -------
-        obspy.core.Stream
-            timeseries object with requested data.
-
-        Raises
-        ------
-        TimeseriesFactoryException
-            If invalid values are requested, or errors occur while
-            retrieving timeseries.
-        """
-        return self._get_timeseries(
-                starttime=starttime,
-                endtime=endtime,
-                observatory=observatory,
-                channels=channels,
-                type=type,
-                interval=interval)
-
     def parse_string(self, pcdcpString):
         """Parse the contents of a string in the format of a pcdcp file.
 
@@ -126,42 +89,6 @@ class PCDCPFactory(TimeseriesFactory):
 
         return stream
 
-    def _get_days(self, starttime, endtime):
-        """Get days between (inclusive) starttime and endtime.
-
-        Parameters
-        ----------
-        starttime : obspy.core.UTCDateTime
-            the start time
-        endtime : obspy.core.UTCDateTime
-            the end time
-
-        Returns
-        -------
-        array_like
-            list of times, one per day, for all days between and including
-            ``starttime`` and ``endtime``.
-
-        Raises
-        ------
-        TimeseriesFactoryException
-            if starttime is after endtime
-        """
-        if starttime > endtime:
-            raise TimeseriesFactoryException(
-                'starttime must be before endtime.')
-
-        days = []
-        day = starttime
-        lastday = (endtime.year, endtime.month, endtime.day)
-        while True:
-            days.append(day)
-            if lastday == (day.year, day.month, day.day):
-                break
-            # move to next day
-            day = obspy.core.UTCDateTime(day.timestamp + 86400)
-        return days
-
     def write_file(self, fh, timeseries, channels):
         """writes timeseries data to the given file object.
 
@@ -174,72 +101,3 @@ class PCDCPFactory(TimeseriesFactory):
             list of channels to store
         """
         PCDCPWriter().write(fh, timeseries, channels)
-
-    def put_timeseries(self, timeseries, starttime=None, endtime=None,
-            channels=None, type=None, interval=None):
-        """Store timeseries data.
-
-        Parameters
-        ----------
-        timeseries : obspy.core.Stream
-            stream containing traces to store.
-        starttime : UTCDateTime
-            time of first sample in timeseries to store.
-            uses first sample if unspecified.
-        endtime : UTCDateTime
-            time of last sample in timeseries to store.
-            uses last sample if unspecified.
-        channels : array_like
-            list of channels to store, optional.
-            uses default if unspecified.
-        type : {'definitive', 'provisional', 'quasi-definitive', 'variation'}
-            data type, optional.
-            uses default if unspecified.
-        interval : {'daily', 'hourly', 'minute', 'monthly', 'second'}
-            data interval, optional.
-            uses default if unspecified.
-        """
-        print self.urlTemplate
-        if not self.urlTemplate.startswith('file://'):
-            raise TimeseriesFactoryException('Only file urls are supported')
-
-        channels = channels or self.channels
-        type = type or self.type
-        interval = interval or self.interval
-        stats = timeseries[0].stats
-        observatory = stats.station
-        starttime = starttime or stats.starttime
-        endtime = endtime or stats.endtime
-        days = self._get_days(starttime, endtime)
-        for day in days:
-            day_filename = self._get_file_from_url(
-                    self._get_url(observatory, day, type, interval))
-
-            day_timeseries = self._get_slice(timeseries, day, interval)
-            with open(day_filename, 'wb') as fh:
-                self.write_file(fh, day_timeseries, channels)
-
-    def _get_slice(self, timeseries, day, interval):
-        """Get the first and last time for a day
-
-        Parameters
-        ----------
-        timeseries : obspy.core.Stream
-            timeseries to slice
-        day : UTCDateTime
-            time in day to slice
-
-        Returns
-        -------
-        obspy.core.Stream
-            sliced stream
-        """
-        day = day.datetime
-        start = obspy.core.UTCDateTime(day.year, day.month, day.day, 0, 0, 0)
-
-        if interval == 'minute':
-            end = start + 86340.0
-        else:
-            end = start + 86399.999999
-
-        return timeseries.slice(start, end)
diff --git a/geomagio/temperature/TEMPFactory.py b/geomagio/temperature/TEMPFactory.py
index 213c72806b91cf7423da32042c2a0c68640204e2..515e93d19f8ce4250a325ab859575ee608ef45ce 100644
--- a/geomagio/temperature/TEMPFactory.py
+++ b/geomagio/temperature/TEMPFactory.py
@@ -1,8 +1,6 @@
 """Factory that loads temp/volt Files."""
 
-import obspy.core
 from ..TimeseriesFactory import TimeseriesFactory
-from ..TimeseriesFactoryException import TimeseriesFactoryException
 from TEMPWriter import TEMPWriter
 
 
@@ -26,81 +24,11 @@ class TEMPFactory(TimeseriesFactory):
         - '%(type)s' type name
         - '%(year)s' year formatted as YYYY
         - '%(ymd)s' time formatted as YYYYMMDD
-
-    See Also
-    --------
-    TEMPParser
     """
 
     def __init__(self, **kwargs):
         TimeseriesFactory.__init__(self, **kwargs)
 
-    def get_timeseries(self, starttime, endtime, observatory=None,
-            channels=None, type=None, interval=None):
-        """Get timeseries data
-
-        Parameters
-        ----------
-        observatory : str
-            3-letter observatory code.
-        starttime : obspy.core.UTCDateTime
-            Time of first sample.
-        endtime : obspy.core.UTCDateTime
-            Time of last sample.
-        type : {'variation', 'quasi-definitive'}
-            Data type.
-        interval : {'minute', 'second'}
-            Data interval.
-
-        Returns
-        -------
-        obspy.core.Stream
-            timeseries object with requested data.
-
-        Raises
-        ------
-        TimeseriesFactoryException
-            If invalid values are requested, or errors occur while
-            retrieving timeseries.
-        """
-        raise NotImplementedError('"get_timeseries" not implemented')
-
-    def _get_days(self, starttime, endtime):
-        """Get days between (inclusive) starttime and endtime.
-
-        Parameters
-        ----------
-        starttime : obspy.core.UTCDateTime
-            the start time
-        endtime : obspy.core.UTCDateTime
-            the end time
-
-        Returns
-        -------
-        array_like
-            list of times, one per day, for all days between and including
-            ``starttime`` and ``endtime``.
-
-        Raises
-        ------
-        TimeseriesFactoryException
-            if starttime is after endtime
-        """
-        if starttime > endtime:
-            raise TimeseriesFactoryException(
-                'starttime must be before endtime.')
-
-        days = []
-        day = starttime
-        lastday = (endtime.year, endtime.month, endtime.day)
-        while True:
-            days.append(day)
-            if lastday == (day.year, day.month, day.day):
-                break
-            # move to next day
-            day = obspy.core.UTCDateTime(day.timestamp + 86400)
-        return days
-
     def write_file(self, fh, timeseries, channels):
         """writes timeseries data to the given file object.
 
@@ -113,72 +41,3 @@ class TEMPFactory(TimeseriesFactory):
             list of channels to store
         """
         TEMPWriter().write(fh, timeseries, channels)
-
-    def put_timeseries(self, timeseries, starttime=None, endtime=None,
-            channels=None, type=None, interval=None):
-        """Store timeseries data.
-
-        Parameters
-        ----------
-        timeseries : obspy.core.Stream
-            stream containing traces to store.
-        starttime : UTCDateTime
-            time of first sample in timeseries to store.
-            uses first sample if unspecified.
-        endtime : UTCDateTime
-            time of last sample in timeseries to store.
-            uses last sample if unspecified.
-        channels : array_like
-            list of channels to store, optional.
-            uses default if unspecified.
-        type : {'definitive', 'provisional', 'quasi-definitive', 'variation'}
-            data type, optional.
-            uses default if unspecified.
-        interval : {'daily', 'hourly', 'minute', 'monthly', 'second'}
-            data interval, optional.
-            uses default if unspecified.
-        """
-        print self.urlTemplate
-        if not self.urlTemplate.startswith('file://'):
-            raise TimeseriesFactoryException('Only file urls are supported')
-
-        channels = channels or self.channels
-        type = type or self.type
-        interval = interval or self.interval
-        stats = timeseries[0].stats
-        observatory = stats.station
-        starttime = starttime or stats.starttime
-        endtime = endtime or stats.endtime
-        days = self._get_days(starttime, endtime)
-        for day in days:
-            day_filename = self._get_file_from_url(
-                    self._get_url(observatory, day, type, interval))
-
-            day_timeseries = self._get_slice(timeseries, day, interval)
-            with open(day_filename, 'wb') as fh:
-                self.write_file(fh, day_timeseries, channels)
-
-    def _get_slice(self, timeseries, day, interval):
-        """Get the first and last time for a day
-
-        Parameters
-        ----------
-        timeseries : obspy.core.Stream
-            timeseries to slice
-        day : UTCDateTime
-            time in day to slice
-
-        Returns
-        -------
-        obspy.core.Stream
-            sliced stream
-        """
-        day = day.datetime
-        start = obspy.core.UTCDateTime(day.year, day.month, day.day, 0, 0, 0)
-
-        if interval == 'minute':
-            end = start + 86340.0
-        else:
-            end = start + 86399.999999
-
-        return timeseries.slice(start, end)
diff --git a/geomagio/vbf/VBFFactory.py b/geomagio/vbf/VBFFactory.py
index 72abb80b4836fba9e441c7ccf79566ad8be96dd0..e2b91ce0add44ebe942904351550b423514e4dfa 100644
--- a/geomagio/vbf/VBFFactory.py
+++ b/geomagio/vbf/VBFFactory.py
@@ -1,8 +1,6 @@
 """Factory that loads VBF Files."""
 
-import obspy.core
 from ..TimeseriesFactory import TimeseriesFactory
-from ..TimeseriesFactoryException import TimeseriesFactoryException
 from VBFWriter import VBFWriter
 
 
@@ -15,176 +13,33 @@ class VBFFactory(TimeseriesFactory):
 
     Parameters
     ----------
-    urlTemplate : str
-        A string that contains any of the following replacement patterns:
-        - '%(i)s' : interval abbreviation
-        - '%(interval)s' interval name
-        - '%(julian)s' julian day formatted as JJJ
-        - '%(obs)s' lowercase observatory code
-        - '%(OBS)s' uppercase observatory code
-        - '%(t)s' type abbreviation
-        - '%(type)s' type name
-        - '%(year)s' year formatted as YYYY
-        - '%(ymd)s' time formatted as YYYYMMDD
+    output : {'binlog', 'vbf'}
+        bin-change or vbf style output.
+
+    All other named parameters passed to TimeseriesFactory.
 
     See Also
     --------
-    VBFParser
+    TimeseriesFactory
     """
 
-    # Flag "output" used for vbf file vs bin-change log.
     def __init__(self, output='vbf', **kwargs):
         TimeseriesFactory.__init__(self, **kwargs)
         self.output = output
 
-    def get_timeseries(self, starttime, endtime, observatory=None,
-            channels=None, type=None, interval=None):
-        """Get timeseries data
-
-        Parameters
-        ----------
-        observatory : str
-            3-letter observatory code.
-        starttime : obspy.core.UTCDateTime
-            Time of first sample.
-        endtime : obspy.core.UTCDateTime
-            Time of last sample.
-        type : {'variation', 'quasi-definitive'}
-            Data type.
-        interval : {'minute', 'second'}
-            Data interval.
-
-        Returns
-        -------
-        obspy.core.Stream
-            timeseries object with requested data.
-
-        Raises
-        ------
-        TimeseriesFactoryException
-            If invalid values are requested, or errors occur while
-            retrieving timeseries.
-        """
-        raise NotImplementedError('"get_timeseries" not implemented')
-
-    def _get_days(self, starttime, endtime):
-        """Get days between (inclusive) starttime and endtime.
-
-        Parameters
-        ----------
-        starttime : obspy.core.UTCDateTime
-            the start time
-        endtime : obspy.core.UTCDateTime
-            the end time
-
-        Returns
-        -------
-        array_like
-            list of times, one per day, for all days between and including
-            ``starttime`` and ``endtime``.
-
-        Raises
-        ------
-        TimeseriesFactoryException
-            if starttime is after endtime
-        """
-        if starttime > endtime:
-            raise TimeseriesFactoryException(
-                'starttime must be before endtime.')
-
-        days = []
-        day = starttime
-        lastday = (endtime.year, endtime.month, endtime.day)
-        while True:
-            days.append(day)
-            if lastday == (day.year, day.month, day.day):
-                break
-            # move to next day
-            day = obspy.core.UTCDateTime(day.timestamp + 86400)
-        return days
-
     def write_file(self, fh, timeseries, channels):
-        """writes timeseries data to the given file object.
+        """Write timeseries data to the given file object.
 
         Parameters
         ----------
-        fh: file object
+        fh : writable
+            file handle where data is written.
         timeseries : obspy.core.Stream
             stream containing traces to store.
-        channels : array_like
-            list of channels to store
+        channels : list
+            list of channels to store.
         """
-
         if self.output == 'binlog':
             VBFWriter().write_change_log(fh, timeseries, channels)
         else:
             VBFWriter().write(fh, timeseries, channels)
-
-    def put_timeseries(self, timeseries, starttime=None, endtime=None,
-            channels=None, type=None, interval=None):
-        """Store timeseries data.
-
-        Parameters
-        ----------
-        timeseries : obspy.core.Stream
-            stream containing traces to store.
-        starttime : UTCDateTime
-            time of first sample in timeseries to store.
-            uses first sample if unspecified.
-        endtime : UTCDateTime
-            time of last sample in timeseries to store.
-            uses last sample if unspecified.
-        channels : array_like
-            list of channels to store, optional.
-            uses default if unspecified.
-        type : {'definitive', 'provisional', 'quasi-definitive', 'variation'}
-            data type, optional.
-            uses default if unspecified.
-        interval : {'daily', 'hourly', 'minute', 'monthly', 'second'}
-            data interval, optional.
-            uses default if unspecified.
-        """
-        print self.urlTemplate
-        if not self.urlTemplate.startswith('file://'):
-            raise TimeseriesFactoryException('Only file urls are supported')
-
-        channels = channels or self.channels
-        type = type or self.type
-        interval = interval or self.interval
-        stats = timeseries[0].stats
-        observatory = stats.station
-        starttime = starttime or stats.starttime
-        endtime = endtime or stats.endtime
-        days = self._get_days(starttime, endtime)
-        for day in days:
-            day_filename = self._get_file_from_url(
-                    self._get_url(observatory, day, type, interval))
-
-            day_timeseries = self._get_slice(timeseries, day, interval)
-            with open(day_filename, 'wb') as fh:
-                self.write_file(fh, day_timeseries, channels)
-
-    def _get_slice(self, timeseries, day, interval):
-        """Get the first and last time for a day
-
-        Parameters
-        ----------
-        timeseries : obspy.core.Stream
-            timeseries to slice
-        day : UTCDateTime
-            time in day to slice
-
-        Returns
-        -------
-        obspy.core.Stream
-            sliced stream
-        """
-        day = day.datetime
-        start = obspy.core.UTCDateTime(day.year, day.month, day.day, 0, 0, 0)
-
-        if interval == 'minute':
-            end = start + 86340.0
-        else:
-            end = start + 86399.999999
-
-        return timeseries.slice(start, end)