diff --git a/README.md b/README.md
index 35a37a2aa0875e556e808c101222e83583d131aa..21a9d6eda7dd63ebc1bb94ba7356630b1b55dcf5 100644
--- a/README.md
+++ b/README.md
@@ -3,42 +3,13 @@ Geomag Algorithms
 
 Geomag algorithms includes tools to fetch, process, and output geomag data.
 
-## Supported Formats ##
 
-### [Edge](readme_io.md#edge) ###
+## Getting Started
 
-Use an Edge server for data input.
-
-### [IAGA](readme_io.md#iaga2002)###
-
-Use IAGA2002 formatted files for input and/or output.
-
-### [IMFV283](readme_io.IMFV283#) ###
-
-Use IMFV283 formatted files for input and/or output.
-
-### [PCDCP](readme_io.md#) ###
-
-Use PCDCP formatted files for input and/or output.
-
-
----
-## Supported Algorithms ##
-
-### [DeltaF](./docs/DeltaF_usage.md) ###
-Calculate DeltaF from geographic, or observatory coordinates.
-
-### [XYZ](./docs/XYZ_usage.md) ###
-Rotate data between coordinate systems. From HEZ or HDZ to XYZ and back.
-
-
----
-## Getting Started ##
-
-### [Install](readme_dependency_install.md) ###
+### [Install](./docs/install.md)
 First time install. Walk through dependencies and other considerations.
 
-### [Use](readme_usage.md) ###
+### [Command Line Usage](./docs/usage.md)
 Details and examples for proper usage. Get started quickly.
 
 Basic usage:
@@ -46,6 +17,23 @@ Basic usage:
   - Use the main script, `geomag.py -h`
   - In python scripts, `import geomagio`
 
-### [Develop](readme_develop_install.md) ###
+### [Python API](./docs/api.md)
+API Overview and examples for using the geomag-algorithms project in python.
+
+### [Develop](./docs/develop_install.md)
 Development dependencies discussed here. Project is built with Grunt and Node
 and is written primarily in Python 2.7.
+
+
+## Supported Formats
+
+- [Edge](./docs/io.md#Edge)
+- [IAGA2002](./docs/io.md#IAGA2002)
+- [IMFV283 (Input only)](./docs/io.md#IMFV283)
+- [PCDCP](./docs/io.md#PCDCP)
+
+
+## Supported Algorithms
+
+- [DeltaF](./docs/algorithms/DeltaF_usage.md)
+- [XYZ](./docs/algorithms/XYZ_usage.md)
diff --git a/docs/DeltaF_usage.md b/docs/DeltaF_usage.md
deleted file mode 100644
index 9a1695f068c9189e5de23cc1ad037e388537b69e..0000000000000000000000000000000000000000
--- a/docs/DeltaF_usage.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# DeltaF Usage #
-
-`geomag.py --deltaf {geo, obs, obsd}`
-
-### Reference Frames ###
- - 'geo':  ['X', 'Y', 'Z', 'F']
- - 'obs':  ['H', 'E', 'Z', 'F']
- - 'obsd': ['H', 'D', 'Z', 'F']
-
-### Example ###
-
-To convert HEZF data in pcdcp files to deltaf for Tucson observatory for all of
-March 2013 output to edge:
-
-      geomag.py --deltaf obs --observatory TUC \
-      --starttime 2013-03-01T00:00:00Z --endtime 2013-03-31T23:59:00Z \
-      --input-pcdcp-url file://data-pcdcp/./%(OBS)s%(year)s%(julian)s.%(i)s \
-      --output-edge 127.0.0.1 \
-      --type variation --interval minute --outchannels G
-
-### Library Notes ###
-
-Please see the Library Notes for [XYZ Usage](./XYZ_usage.md)
-
----
-### [DeltaF Algorithm](DeltaF.md) ###
-Describes the theory behind the Delta F algorithm, as well as some
-implementation issues and solutions.
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 84fef51d101e7b6179f70b3e6b374578bf9e8113..0000000000000000000000000000000000000000
--- a/docs/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-Geomag Algorithms Documents Folder
-==================================
-
-Documents explaining geomag-algorithms
-
-[DeltaF Algorithm](./DeltaF.md)
-------
-
-Describes the theory behind the DeltaF algorithm,  as well as some implementation
-issues and solutions.
-
-[XYZ Algorithm](./XYZ.md)
-------
-
-Describes the theory behind the XYZ algorithm,  as well as some implementation
-issues and solutions.
-
-[Trace Metadata](./metadata.md)
------------
-
-Describes the metadata stored in the obspy.core.trace.stats class used by the
-geomag algorithms.
diff --git a/docs/deltaf.md b/docs/algorithms/DeltaF.md
similarity index 96%
rename from docs/deltaf.md
rename to docs/algorithms/DeltaF.md
index fc5c8e7173f579922ee093114365a7b817804b49..d5a956e0c7db15890594fc6ae80b5222984c8ace 100644
--- a/docs/deltaf.md
+++ b/docs/algorithms/DeltaF.md
@@ -1,4 +1,6 @@
-# DeltaF Algorithm
+DeltaF Algorithm
+================
+
 Algorithm Theoretical Basis for "Geomag Delta F"
 
 E. Joshua Rigler <[erigler@usgs.gov](mailto:erigler@usgs.gov)>
@@ -35,7 +37,7 @@ field obtained by adding vector components in quadrature:
 
 Of course, if data are only available in hdZ (where d=(D-D0)) coordinates, as
 is common with USGS preliminary data, they should be converted into a Cartesian
-system used in ( [Eq. 2](#eq2)). See the [XYZ Algorithm](XYZ.md) for a discussion on the 
+system used in ( [Eq. 2](#eq2)). See the [XYZ Algorithm](./XYZ.md) for a discussion on the
 cartesian coordinate system(s) used.
 
 ## Practical Considerations
diff --git a/docs/algorithms/DeltaF_usage.md b/docs/algorithms/DeltaF_usage.md
new file mode 100644
index 0000000000000000000000000000000000000000..ff93d774601967b7c784293904ca7a715d5dfb44
--- /dev/null
+++ b/docs/algorithms/DeltaF_usage.md
@@ -0,0 +1,73 @@
+DeltaF Algorithm Usage
+======================
+
+Delta F is the difference between the magnitude of magnetic vector measurements,
+and a scalar total-field measurement made by independent sensors.  Read more
+about the [DeltaF Algorithm](./DeltaF.md).
+
+
+`geomag.py --deltaf {geo, obs, obsd}`
+
+
+### Reference Frames
+
+ - `geo`: `[X, Y, Z, F]`
+ - `obs`: `[H, E, Z, F]`
+ - `obsd`: `[H, D, Z, F]`
+
+
+## Example
+
+To compute DeltaF from  HEZF data for Tucson observatory:
+```
+geomag.py \
+    --deltaf obs \
+    --observatory TUC \
+    --type variation \
+    --interval minute \
+    --inchannels H E Z F \
+    --outchannels G \
+    --starttime 2015-11-01T00:00:00Z \
+    --endtime 2015-11-01T00:10:00Z \
+    --input-edge cwbpub.cr.usgs.gov \
+    --input-edge-port 2060 \
+    --output-iaga-stdout
+```
+
+
+### Output
+```
+Format                 IAGA-2002                                    |
+Source of Data         United States Geological Survey (USGS)       |
+Station Name           Tucson                                       |
+IAGA CODE              TUC                                          |
+Geodetic Latitude      32.174                                       |
+Geodetic Longitude     249.267                                      |
+Elevation              946                                          |
+Reported               GNULNULNUL                                   |
+Sensor Orientation     HDZF                                         |
+Digital Sampling       100.0 second                                 |
+Data Interval Type     filtered 1-minute (00:15-01:45)              |
+Data Type              variation                                    |
+# DECBAS               7258    (Baseline declination value in       |
+# tenths of minutes East (0-216,000)).                              |
+# Vector 1-minute values are computed from 1-second values using    |
+# the INTERMAGNET gaussian filter centered on the minute. Scalar    |
+# 1-minute values are computed from 1-second values using the       |
+# INTERMAGNET gaussian filter centered on the minute.               |
+# CONDITIONS OF USE: The Conditions of Use for data provided        |
+# through INTERMAGNET and acknowledgement templates can be found at |
+# www.intermagnet.org                                               |
+DATE       TIME         DOY     TUCG      TUCNUL    TUCNUL    TUCNUL |
+2015-11-01 00:00:00.000 305      -174.39  99999.99  99999.99  99999.99
+2015-11-01 00:01:00.000 305      -174.40  99999.99  99999.99  99999.99
+2015-11-01 00:02:00.000 305      -174.40  99999.99  99999.99  99999.99
+2015-11-01 00:03:00.000 305      -174.39  99999.99  99999.99  99999.99
+2015-11-01 00:04:00.000 305      -174.39  99999.99  99999.99  99999.99
+2015-11-01 00:05:00.000 305      -174.41  99999.99  99999.99  99999.99
+2015-11-01 00:06:00.000 305      -174.39  99999.99  99999.99  99999.99
+2015-11-01 00:07:00.000 305      -174.34  99999.99  99999.99  99999.99
+2015-11-01 00:08:00.000 305      -174.39  99999.99  99999.99  99999.99
+2015-11-01 00:09:00.000 305      -174.39  99999.99  99999.99  99999.99
+2015-11-01 00:10:00.000 305      -174.39  99999.99  99999.99  99999.99
+```
diff --git a/docs/XYZ.md b/docs/algorithms/XYZ.md
similarity index 98%
rename from docs/XYZ.md
rename to docs/algorithms/XYZ.md
index 5d79fe75956020f0fb9a3b69bd4d5b0060ef63ec..fd54c8e1df9b15fb263ccfe861e9b6caffc51dba 100644
--- a/docs/XYZ.md
+++ b/docs/algorithms/XYZ.md
@@ -1,5 +1,6 @@
+XYZ Algorithm
+=============
 
-# XYZ Algorithm
 Algorithm Theoretical Basis for "Geomag XYZ"
 
 E. Joshua Rigler <[erigler@usgs.gov](mailto:erigler@usgs.gov)>
@@ -78,7 +79,7 @@ reference frame, "e" is the secondary axis in this reference frame, and "Z" is
 the tertiary axis, which remains common for all reference frames discussed in
 this document.
 
-![Magnetic Field Vectors in three coordinate systems](images/figure.png)
+![Magnetic Field Vectors in three coordinate systems](../images/figure.png)
 
 The figure above illustrates how the same full magnetic field vector **F**, can
 be represented in heZ, HDZ, and XYZ coordinates. Red objects are specific to
diff --git a/docs/XYZ_usage.md b/docs/algorithms/XYZ_usage.md
similarity index 77%
rename from docs/XYZ_usage.md
rename to docs/algorithms/XYZ_usage.md
index 765b0b2ab32b848ce0edb226b29ae00ae6e6dad5..b01fdd8be4834f4ed1884bb1840e3faa61b2613d 100644
--- a/docs/XYZ_usage.md
+++ b/docs/algorithms/XYZ_usage.md
@@ -1,32 +1,31 @@
+XYZ Algorithm Usage
+===================
+
+The XYZ Algorithm rotates between `geographic`, `observatory`, and `magnetic`,
+channel orientations.  Read more about the [XYZ Algorithm](./XYZ.md).
 
-# XYZ Usage #
 
 `geomag.py --xyz {geo, mag, obs, obsd} {geo, mag, obs, obsd}`
 
-### Reference Frames ###
+### Reference Frames
 
 There are 3 reference frames in this library.
 
-#### Geographic or cartesian ####
-
- - `geo` is XYZ
+#### Geographic or cartesian
 
- - 'geo':  ['X', 'Y', 'Z', 'F']
+ - `geo` is `[X, Y, Z, F]`
 
-#### Magnetic or cylindrical ####
+#### Magnetic or cylindrical
 
- - `mag` is HDZ
+ - `mag` is `[H, D, Z, F]`
 
- - 'mag':  ['H', 'D', 'Z', 'F']
+#### Observatory
 
-#### Observatory ####
+ - `obs` is `[H, E, Z, F]`
+ - `obsd` is `[H, D, Z, F]`
 
- - `obs` is heZ
 
- - 'obs':  ['H', 'E', 'Z', 'F']
- - 'obsd': ['H', 'D', 'Z', 'F']
-
-### Example ###
+### Example
 
 To convert HEZF data in pcdcp files to XYZF for Tucson observatory for all of
 March 2013 output to iaga2002 files:
@@ -38,8 +37,7 @@ March 2013 output to iaga2002 files:
       --type variation --interval minute
 
 
----
-### Library Notes ###
+### Library Notes
 
 > Note: Within this library all channels are uppercase.
 > We use context (ie obs vs. mag vs geo), to differentiate between h,H; e,E;
@@ -57,7 +55,7 @@ These are provided by `geomagio.StreamConverter`.
 > Note: this library internally represents data gaps as NaN, and factories
 > convert to this where possible.
 
----
+
 ### [Algorithm Theoretical Basis for "Geomag XYZ"](XYZ.md) ###
 Describes the theory behind the XYZ algorithm, as well as some implementation
 issues and solutions.
diff --git a/docs/api.md b/docs/api.md
new file mode 100644
index 0000000000000000000000000000000000000000..15c8df354c0b47fbcd11445a1c0b5e87fd246910
--- /dev/null
+++ b/docs/api.md
@@ -0,0 +1,83 @@
+Geomag Algorithms API
+=====================
+
+Geomag algorithms is built around the
+[ObsPy](https://github.com/obspy/obspy/wiki),
+[SciPy](http://www.scipy.org/),
+and [NumPy](http://www.numpy.org/)
+frameworks, which provide many tools for processing timeseries and other
+scientific data.
+
+
+## Architecture
+
+- Data are read into a standard Internal Data Format by Input/Output factories.
+- Algorithms process data.
+- A command line script `geomag.py` uses a Controller to manage input,
+optional processing, and output of data.
+
+![Architecture diagram](./images/architecture.png)
+
+
+## Internal Data Format
+
+ObsPy Trace and Stream objects are used to hold timeseries data.
+
+- [Custom geomag metadata properties](./metadata.md) are added to each Trace
+object's Stats by IO factories.
+- Data gaps are represented as `numpy.nan`.
+- Times use `obspy.core.UTCDateTime`.
+- Most channels use `nT` units.
+- Angular channels use `radians`.
+
+
+## Input/Output factories
+
+Base class is `geomagio.TimeseriesFactory`.
+Exception base class is `geomagio.TimeseriesFactoryException`.
+
+- [Edge/Earthworm](./io/Edge.md) `geomagio.edge.EdgeFactory`
+- [IAGA 2002](./io/Iaga2002.md) `geomagio.iaga2002.IAGA2002Factory`
+- IMF V2.83 (Input Only) `geomagio.imfv283.IMFV283Factory`
+- PCDCP `geomagio.pcdcp.PCDCPFactory`
+
+
+## Algorithms
+
+Base class is `geomagio.Algorithm`
+Exception base class is `geomagio.AlgorithmException`
+
+- Delta F `geomagio.DeltaFAlgorithm`
+- XYZ `geomagio.XYZAlgorithm`
+
+
+## Example
+
+The following example:
+- Uses `EdgeFactory` to read data from the USGS EDGE server
+- Uses `XYZAlgorithm` to change the data from observatory channels (H, E, Z, F)
+  to geographic channels (X, Y, Z, F).
+- Plots the data using matplotlib
+
+```python
+from geomagio import XYZAlgorithm
+from geomagio.edge import EdgeFactory
+from obspy.core import UTCDateTime
+
+# read data from the USGS EDGE server
+factory = EdgeFactory(host='cwbpub.cr.usgs.gov', port=2060)
+hezf = factory.get_timeseries(
+        observatory='BOU',
+        interval='minute',
+        type='variation',
+        channels=('H', 'E', 'Z', 'F'),
+        starttime=UTCDateTime('2015-11-01T00:00:00Z'),
+        endtime=UTCDateTime('2015-11-01T23:59:59Z'))
+
+# convert from HEZF channels to XYZF channels
+algorithm = XYZAlgorithm(informat='obs', outformat='geo')
+xyzf = algorithm.process(hezf)
+
+# open interactive matplotlib plot
+xyzf.plot()
+```
diff --git a/readme_develop_install.md b/docs/develop.md
similarity index 89%
rename from readme_develop_install.md
rename to docs/develop.md
index 1b07b644df752d60aeee2d3fc5da16cba07172d2..56b824e1b9da3be93a1d72ddb04720db9b0ebb84 100644
--- a/readme_develop_install.md
+++ b/docs/develop.md
@@ -1,6 +1,5 @@
-Readme development dependencies
-
-## Develop ##
+Development Dependencies
+========================
 
 These instructions only need to be completed if you plan on developing new
 code for this project.
@@ -30,8 +29,7 @@ Begin Developing
         grunt
 
 
----
-### Windows ###
+### Windows
 
 1. Install the newest release of [Node (http://nodejs.org/download/)][] for
    Windows, using the Windows Installer (.msi).
@@ -42,13 +40,12 @@ Begin Developing
 [Node]: http://nodejs.org/download/
 
 
----
-### Coding Standards ###
+### Coding Standards
 
 This project adheres to PEP8 standards in most cases:
     https://www.python.org/dev/peps/pep-0008
 
-### PEP8 Exceptions ###
+#### PEP8 Exceptions
 
 - Hanging/Visual indents (E126, E127, E128, E131)
 
@@ -56,10 +53,9 @@ This project adheres to PEP8 standards in most cases:
     - do not use visual indents.
 
 
----
-### Add an SSH Key to GitHub ###
+### Add an SSH Key to GitHub
 
-1. `ssh-keygen -t rsa -b 2048` (in terminal)
+1. `ssh-keygen -t rsa -b 4096` (in terminal)
 
 2. Press **Enter** to accept the default save location.
 
@@ -79,4 +75,3 @@ This project adheres to PEP8 standards in most cases:
 7. Click **Add SSH key**. Give it a meaningful title.
 
 8. Copy your SSH Key into the Key, and click **Add key**.
-
diff --git a/docs/images/architecture.png b/docs/images/architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b856714c0a5e894dd8a1af262a625ea93f804d8
Binary files /dev/null and b/docs/images/architecture.png differ
diff --git a/readme_dependency_install.md b/docs/install.md
similarity index 93%
rename from readme_dependency_install.md
rename to docs/install.md
index be0863c6a8b41c2e0466dbfb1d53ff61b440063a..acc78ec56d532d76218565d03f0f024842b4c5c1 100644
--- a/readme_dependency_install.md
+++ b/docs/install.md
@@ -1,6 +1,5 @@
-Readme install dependencies
-
-## Install ##
+Installation
+============
 
 We recommend using
 [virtual environments (http://docs.python-guide.org/en/latest/dev/virtualenvs/)][].
@@ -17,7 +16,8 @@ specific dependency information.
   - Use the main script, `geomag.py -h`
   - In python scripts, `import geomagio`
 
-The [Usage](readme_usage.md) page has more detailed instructions and examples.
+The [Command Line Usage](./usage.md) and [Python API](./api.md)
+pages have more instructions and examples.
 
 [virtual environments]: http://docs.python-guide.org/en/latest/dev/virtualenvs/
 
@@ -45,7 +45,7 @@ The [Usage](readme_usage.md) page has more detailed instructions and examples.
 
 1. Update paths as needed in your `~/.bash_profile`:
 
-        export PATH=$PATH:/usr/local/bin`
+        export PATH=$PATH:/usr/local/bin
         # npm installed binaries
         export PATH=$PATH:/usr/local/share/npm/bin
         # gem installed binaries
diff --git a/readme_io.md b/docs/io.md
similarity index 90%
rename from readme_io.md
rename to docs/io.md
index a7820c85e6867cb3024fb590b6f5882943437027..e2ae9cfea7522b8264736fdcef60c43580d7db8b 100644
--- a/readme_io.md
+++ b/docs/io.md
@@ -1,15 +1,12 @@
-Readme input output details
+IO Formats
+==========
 
-## IO Formats ##
-There are currently 2 supported file formats for input and output in addition
-to Edge server input.
-
-#### EDGE ####
+#### EDGE
 
 `--input-edge HOST PORT`
 Specify an IP address or host name where your Edge lives along with a port.
 
-#### Iaga2002 ####
+#### Iaga2002
 
 `--input-iaga-file FILENAME`
 Specify the name of the file to read from.
@@ -32,7 +29,7 @@ Output will be send directly to the command line.
 `--output-iaga-url URL`
 Use a file pattern to write to multiple IAGA2002 files.
 
-#### IMFV283 ####
+#### IMFV283
 
 `--input-imfv283-file FILENAME`
 Specify the name of the file to read from.
@@ -46,7 +43,7 @@ Use a file pattern to read IMFV283 file.
 `--input-imfv283-goes`
 Reads IMFV283 data from an internet goes server.
 
-#### PCDCP ####
+#### PCDCP
 
 `--input-pcdcp-file FILENAME`
 Specify the name of the file to read from.
@@ -67,15 +64,15 @@ Output will be send directly to the command line.
 Use a file pattern to write to multiple PCDCP files.
 
 
-## IO Methods ##
+## IO Methods
 Several methods exist for retrieving and storing data.
 
-#### Edge Server ####
+#### Edge Server
 
 `--input-edge HOST PORT`
 Specify an IP address or host name where your Edge lives along with a port.
 
-#### Single File ####
+#### Single File
 
 `--input-iaga-file FILENAME`
 `--input-imfv283-file FILENAME`
@@ -84,7 +81,7 @@ Specify an IP address or host name where your Edge lives along with a port.
 `--output-pcdcp-file FILENAME`
 Specify a single file name for the data to be read from or written to.
 
-#### Multiple Files ####
+#### Multiple Files
 
 `--input-iaga-url`
 `--input-imfv283-url`
@@ -115,7 +112,7 @@ Typical PCDCP files are stored as `file://./%(OBS)s%(Y)s%(j)s.%(i)s`
 
 Example: BOU2013092.min
 
-#### Std In and Std Out ####
+#### Std In and Std Out
 
 `--input-iaga-stdin`
 `--input-imfv283-stdin`
diff --git a/docs/io/Edge.md b/docs/io/Edge.md
new file mode 100644
index 0000000000000000000000000000000000000000..3238158ccfcc669bcda5478911acb53af2e40672
--- /dev/null
+++ b/docs/io/Edge.md
@@ -0,0 +1,49 @@
+Edge/Earthworm IO Factory
+=========================
+
+Read from an Earthworm-style interface
+
+`geomagio.edge.EdgeFactory`
+
+## Command Line Example
+(backslashes added for readability)
+<pre>
+geomag.py \
+    <b>--input-edge cwbpub.cr.usgs.gov</b> \
+    <b>--input-edge-port 2060</b> \
+    --observatory BOU
+    --inchannels H E Z F \
+    --interval minute \
+    --type variation \
+    --starttime=2015-11-01T00:00:00Z \
+    --endtime=2015-11-01T23:59:59Z \
+    --output-iaga-stdout
+</pre>
+
+
+## API Example
+```python
+from __future__ import print_function
+from geomagio.edge import EdgeFactory
+from obspy.core import UTCDateTime
+
+factory = EdgeFactory(host='cwbpub.cr.usgs.gov', port=2060)
+data = factory.get_timeseries(
+        observatory='BOU',
+        channels=['H', 'E', 'Z', 'F'],
+        interval='minute',
+        type='variation',
+        starttime=UTCDateTime('2015-11-01T00:00:00Z'),
+        endtime=UTCDateTime('2015-11-01T23:59:59Z'))
+
+print(data)
+```
+
+### Output
+```
+4 Trace(s) in Stream:
+NT.BOU.R0.H | 2015-11-01T00:00:00.000000Z - 2015-11-02T00:00:00.000000Z | 60.0 s, 1441 samples
+NT.BOU.R0.E | 2015-11-01T00:00:00.000000Z - 2015-11-02T00:00:00.000000Z | 60.0 s, 1441 samples
+NT.BOU.R0.Z | 2015-11-01T00:00:00.000000Z - 2015-11-02T00:00:00.000000Z | 60.0 s, 1441 samples
+NT.BOU.R0.F | 2015-11-01T00:00:00.000000Z - 2015-11-02T00:00:00.000000Z | 60.0 s, 1441 samples
+```
diff --git a/docs/io/Iaga2002.md b/docs/io/Iaga2002.md
new file mode 100644
index 0000000000000000000000000000000000000000..fcea4710bab1d4c59e982cf3dc240e786bb2ddaa
--- /dev/null
+++ b/docs/io/Iaga2002.md
@@ -0,0 +1,30 @@
+IAGA2002 IO Factory
+===================
+
+IAGA Ascii Exchange format.
+
+https://www.ngdc.noaa.gov/IAGA/vdat/iagaformat.html
+
+`geomagio.iaga2002.IAGA2002Factory`
+
+## Command Line Example
+(backslashes added for readability)
+```
+geomag.py \
+    --input-iaga-file /PATH/TO/IAGAFILE
+    --inchannels H D Z F
+    --output-iaga-stdout
+```
+
+
+## API Example
+```python
+from geomagio.iaga2002 import IAGA2002Factory
+from obspy.core import UTCDateTime
+
+factory = IAGA2002Factory()
+data = None
+with open('/PATH/TO/IAGAFILE', 'r') as f:
+    data = factory.parse_string(f.read())
+print(data)
+```
diff --git a/readme_usage.md b/docs/usage.md
similarity index 96%
rename from readme_usage.md
rename to docs/usage.md
index c65eeb325dfef7bfe21fdd556eb0869737f1f020..bc28f80a448391409d1e1fc8e20c6e32147c23a4 100644
--- a/readme_usage.md
+++ b/docs/usage.md
@@ -1,6 +1,4 @@
-Readme usage details
-
-## Usage ##
+## Command Line Usage
 
 You can install the project if you haven't already with
 
@@ -72,8 +70,8 @@ There are flags to specify certain algorithms should be run against the data.
 
 `--xyz {geo, mag, obs, obsd} {geo, mag, obs, obsd}`
 
-#### [XYZ Usage](./docs/XYZ_usage.md) ####
+#### [XYZ Usage](./algorithms/XYZ_usage.md) ####
 Rotate data from HEZ or HDZ to XYZ and back.
 
 Extensive explanation of all input and output methods:
-[IO Methods](readme_io.md)
+[IO Methods](./io.md)
diff --git a/geomagio/edge/EdgeFactory.py b/geomagio/edge/EdgeFactory.py
index 89536cbd282fc7bbe1226a03a27cc820bbe652e8..7b92a33ea51715e3a2702c0acf8d1d00995c82e8 100644
--- a/geomagio/edge/EdgeFactory.py
+++ b/geomagio/edge/EdgeFactory.py
@@ -72,7 +72,7 @@ class EdgeFactory(TimeseriesFactory):
         for reading.
     """
 
-    def __init__(self, host=None, port=None, write_port=None,
+    def __init__(self, host='cwbpub.cr.usgs.gov', port=2060, write_port=None,
             observatory=None, channels=None, type=None, interval=None,
             observatoryMetadata=None, locationCode=None,
             cwbhost=None, cwbport=0, tag='GeomagAlg', forceout=False):
diff --git a/geomagio/iaga2002/IAGA2002Factory.py b/geomagio/iaga2002/IAGA2002Factory.py
index 9abb5faf246c5a3c0ce2369dec727f04c1e38b03..37ce68313262ae1415a3892eb8ab451f10b06750 100644
--- a/geomagio/iaga2002/IAGA2002Factory.py
+++ b/geomagio/iaga2002/IAGA2002Factory.py
@@ -33,8 +33,8 @@ class IAGA2002Factory(TimeseriesFactory):
     IAGA2002Parser
     """
 
-    def __init__(self, urlTemplate, observatory=None, channels=None, type=None,
-            interval=None):
+    def __init__(self, urlTemplate=None, observatory=None, channels=None,
+            type=None, interval=None):
         TimeseriesFactory.__init__(self, observatory, channels, type,
                 interval, urlTemplate)