diff --git a/geomagio/edge/EdgeFactory.py b/geomagio/edge/EdgeFactory.py
index 7b18ac56b7293faa200afd5b7e92399f203a2d2a..70d97eea95d6c9cdcd1e94eab3889267a0b2b005 100644
--- a/geomagio/edge/EdgeFactory.py
+++ b/geomagio/edge/EdgeFactory.py
@@ -16,7 +16,7 @@ from typing import List, Optional
 import numpy
 import numpy.ma
 from obspy import Stream, Trace, UTCDateTime
-from obspy.clients import earthworm
+from obspy.clients import earthworm, neic
 
 from .. import ChannelConverter, TimeseriesUtility
 from ..geomag_types import DataInterval, DataType
@@ -24,6 +24,7 @@ from ..TimeseriesFactory import TimeseriesFactory
 from ..TimeseriesFactoryException import TimeseriesFactoryException
 from ..ObservatoryMetadata import ObservatoryMetadata
 from .RawInputClient import RawInputClient
+from .SNCL import SNCL
 from .LegacySNCL import LegacySNCL
 
 
@@ -38,8 +39,6 @@ class EdgeFactory(TimeseriesFactory):
         the port number the waveserver is listening on.
     write_port: integer
         the port number the client is writing to.
-    cwbport: int
-        the port number of the cwb host to connect to.
     tag: str
         A tag used by edge to log and associate a socket with a given data
         source
@@ -62,8 +61,13 @@ class EdgeFactory(TimeseriesFactory):
     locationCode: str
         the location code for the given edge server, overrides type
         in get_timeseries/put_timeseries
-    cwbhost: str
-        a string represeting the IP number of the cwb host to connect to.
+    scaleFactor: int
+        all data written to edge (via raw input client) will be scaled
+        by this integer prior to write; all data read from edge will be
+        will be divided by this integer after read; default = 1000
+    snclMapper: {'geomag','legacy'}
+        a mapper of common channel names to SEED SNCL codes (that is,
+        station, network, channel, location codes); default = legacy
 
     See Also
     --------
@@ -82,7 +86,6 @@ class EdgeFactory(TimeseriesFactory):
         host: str = "edgecwb.usgs.gov",
         port: int = 2060,
         write_port: int = 7981,
-        cwbport: int = 0,
         tag: str = "GeomagAlg",
         forceout: bool = False,
         observatory: Optional[str] = None,
@@ -91,20 +94,31 @@ class EdgeFactory(TimeseriesFactory):
         interval: Optional[DataInterval] = None,
         observatoryMetadata: Optional[ObservatoryMetadata] = None,
         locationCode: Optional[str] = None,
-        cwbhost: Optional[str] = None,
+        scaleFactor: int = 1000,
+        snclMapper: str = "legacy",
     ):
         TimeseriesFactory.__init__(self, observatory, channels, type, interval)
-        self.client = earthworm.Client(host, port)
+        if port == 2060:
+            # earthworm (phasing this out gradually)
+            self.client = earthworm.Client(host, port)
+        else:
+            # CWBQuery/miniseed protocol (preferred)
+            self.client = neic.Client(host, port)
         self.host = host
         self.port = port
         self.write_port = write_port
-        self.cwbport = cwbport
         self.tag = tag
         self.forceout = forceout
         self.interval = interval
         self.observatoryMetadata = observatoryMetadata or ObservatoryMetadata()
         self.locationCode = locationCode
-        self.cwbhost = cwbhost or ""
+        self.scaleFactor = scaleFactor
+        if snclMapper == "legacy":
+            self.get_sncl = LegacySNCL.get_sncl
+        elif snclMapper == "geomag":
+            self.get_sncl = SNCL.get_sncl
+        else:
+            raise TimeseriesFactoryException("Unrecognized SNCL mapper")
 
     def get_timeseries(
         self,
@@ -248,7 +262,7 @@ class EdgeFactory(TimeseriesFactory):
             make a copy before calling if they don't want that side effect.
         """
         for trace in stream:
-            trace.data = numpy.divide(trace.data, 1000.00)
+            trace.data = numpy.divide(trace.data, self.scaleFactor)
 
     def _convert_trace_to_int(self, trace_in: Trace) -> Trace:
         """convert geomag edge traces stored as decimal, to ints by multiplying
@@ -268,7 +282,7 @@ class EdgeFactory(TimeseriesFactory):
         the trace must be a masked array.
         """
         trace = trace_in.copy()
-        trace.data = numpy.multiply(trace.data, 1000.00)
+        trace.data = numpy.multiply(trace.data, self.scaleFactor)
         trace.data = trace.data.astype(int)
 
         return trace
@@ -326,7 +340,7 @@ class EdgeFactory(TimeseriesFactory):
         data: Trace
             timeseries trace of the requested channel data
         """
-        sncl = LegacySNCL.get_sncl(
+        sncl = self.get_sncl(
             station=observatory,
             data_type=type,
             interval=interval,
@@ -437,7 +451,7 @@ class EdgeFactory(TimeseriesFactory):
         -----
         RawInputClient seems to only work when sockets are
         """
-        sncl = LegacySNCL.get_sncl(
+        sncl = self.get_sncl(
             station=observatory,
             data_type=type,
             interval=interval,
@@ -445,18 +459,10 @@ class EdgeFactory(TimeseriesFactory):
             location=self.locationCode,
         )
 
-        now = UTCDateTime(datetime.utcnow())
-        if ((now - endtime) > 864000) and (self.cwbport > 0):
-            host = self.cwbhost
-            port = self.cwbport
-        else:
-            host = self.host
-            port = self.write_port
-
         ric = RawInputClient(
             self.tag,
-            host,
-            port,
+            self.host,
+            self.write_port,
             sncl.station,
             sncl.channel,
             sncl.location,