diff --git a/.gitignore b/.gitignore
index e44e39073dba1cfc73a4f18cab410469ce0737b3..f09f2154082bb5325c7d291fa082ed530789a0e0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -58,6 +58,8 @@ coverage.xml
 
 # Sphinx documentation
 docs/_build/
+docs/_static
+docs/_templates
 
 # PyBuilder
 target/
diff --git a/mhcflurry/__init__.py b/mhcflurry/__init__.py
index b909f85378c2d1fe0f79bef142a8ed469344601a..e743fb33ac4c3b80e66dd80f0e15ac167320316c 100644
--- a/mhcflurry/__init__.py
+++ b/mhcflurry/__init__.py
@@ -12,10 +12,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from .class1_affinity_prediction.class1_neural_network import (
-    Class1NeuralNetwork)
-from .class1_affinity_prediction.class1_affinity_predictor import (
+from mhcflurry.class1_affinity_predictor import (
     Class1AffinityPredictor)
+from mhcflurry.class1_neural_network import (
+    Class1NeuralNetwork)
 
 __version__ = "1.0.0"
 
diff --git a/mhcflurry/class1_affinity_prediction/__init__.py b/mhcflurry/class1_affinity_prediction/__init__.py
deleted file mode 100644
index 96707e88331792c6a4cc0d0214ef656b7522bfff..0000000000000000000000000000000000000000
--- a/mhcflurry/class1_affinity_prediction/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from __future__ import absolute_import
-
-from .class1_neural_network import Class1NeuralNetwork
-from .class1_affinity_predictor import Class1AffinityPredictor
-
-__all__ = [
-    'Class1NeuralNetwork',
-    'Class1AffinityPredictor',
-]
diff --git a/mhcflurry/class1_affinity_prediction/class1_affinity_predictor.py b/mhcflurry/class1_affinity_predictor.py
similarity index 99%
rename from mhcflurry/class1_affinity_prediction/class1_affinity_predictor.py
rename to mhcflurry/class1_affinity_predictor.py
index af94cfa05e167d49327a6f9cb5170952a909895d..f1251282814fdb23870948e329bf3cd292a9a973 100644
--- a/mhcflurry/class1_affinity_prediction/class1_affinity_predictor.py
+++ b/mhcflurry/class1_affinity_predictor.py
@@ -1,26 +1,24 @@
 import collections
-import time
 import hashlib
 import json
-from os.path import join, exists
-from six import string_types
 import logging
-import warnings
 import sys
+import time
+import warnings
+from os.path import join, exists
 
+import mhcnames
 import numpy
 import pandas
 from numpy.testing import assert_equal
+from six import string_types
 
-import mhcnames
-
-from ..encodable_sequences import EncodableSequences
-from ..downloads import get_path
-from ..common import random_peptides
-from ..percent_rank_transform import PercentRankTransform
-from ..regression_target import to_ic50
-
-from .class1_neural_network import Class1NeuralNetwork
+from mhcflurry.class1_neural_network import Class1NeuralNetwork
+from mhcflurry.common import random_peptides
+from mhcflurry.downloads import get_path
+from mhcflurry.encodable_sequences import EncodableSequences
+from mhcflurry.percent_rank_transform import PercentRankTransform
+from mhcflurry.regression_target import to_ic50
 
 
 class Class1AffinityPredictor(object):
diff --git a/mhcflurry/class1_affinity_prediction/class1_neural_network.py b/mhcflurry/class1_neural_network.py
similarity index 98%
rename from mhcflurry/class1_affinity_prediction/class1_neural_network.py
rename to mhcflurry/class1_neural_network.py
index a30d30b365eb7dfdc1d3775bba748337899e1792..07ee5a307a3c0ef1263985bf023381bce26c9b90 100644
--- a/mhcflurry/class1_affinity_prediction/class1_neural_network.py
+++ b/mhcflurry/class1_neural_network.py
@@ -7,10 +7,10 @@ import pandas
 
 from mhcflurry.hyperparameters import HyperparameterDefaults
 
-from ..encodable_sequences import EncodableSequences
-from ..amino_acid import available_vector_encodings, vector_encoding_length
-from ..regression_target import to_ic50, from_ic50
-from ..common import random_peptides, amino_acid_distribution
+from mhcflurry.encodable_sequences import EncodableSequences
+from mhcflurry.amino_acid import available_vector_encodings, vector_encoding_length
+from mhcflurry.regression_target import to_ic50, from_ic50
+from mhcflurry.common import random_peptides, amino_acid_distribution
 
 
 class Class1NeuralNetwork(object):
diff --git a/mhcflurry/predict_command.py b/mhcflurry/predict_command.py
index f3a4a2016e35d3cc7ccd615fdf0624827d34d2fe..0b35d348ed97c899fa3ed641d306cd05f47d4a2b 100644
--- a/mhcflurry/predict_command.py
+++ b/mhcflurry/predict_command.py
@@ -47,7 +47,7 @@ import logging
 import pandas
 
 from .downloads import get_path
-from .class1_affinity_prediction import Class1AffinityPredictor
+from .class1_affinity_predictor import Class1AffinityPredictor
 
 
 parser = argparse.ArgumentParser(
diff --git a/mhcflurry/class1_affinity_prediction/train_allele_specific_models_command.py b/mhcflurry/train_allele_specific_models_command.py
similarity index 98%
rename from mhcflurry/class1_affinity_prediction/train_allele_specific_models_command.py
rename to mhcflurry/train_allele_specific_models_command.py
index 46680fbf2b22fae60cf222a72cfba9e338545f05..8345ec9f0a7a50e81564f9e790c26b090af1aa4a 100644
--- a/mhcflurry/class1_affinity_prediction/train_allele_specific_models_command.py
+++ b/mhcflurry/train_allele_specific_models_command.py
@@ -2,21 +2,20 @@
 Train Class1 single allele models.
 
 """
+import argparse
 import os
+import signal
 import sys
-import argparse
-import yaml
 import time
-import signal
 import traceback
 from multiprocessing import Pool
 
 import pandas
+import yaml
 from mhcnames import normalize_allele_name
 
-from .class1_affinity_predictor import Class1AffinityPredictor
-from ..common import configure_logging
-
+from mhcflurry.class1_affinity_predictor import Class1AffinityPredictor
+from mhcflurry.common import configure_logging
 
 parser = argparse.ArgumentParser(usage=__doc__)
 
@@ -89,6 +88,7 @@ parser.add_argument(
     "Set to 1 for serial run. Set to 0 to use number of cores. "
     "Default: %(default)s.")
 
+
 def run(argv=sys.argv[1:]):
     # On sigusr1 print stack trace
     print("To show stack trace, run:\nkill -s USR1 %d" % os.getpid())
diff --git a/test/test_class1_neural_network.py b/test/test_class1_neural_network.py
index 8747f7e00be1b417ee76045e85522949b43e58c1..835c632d7c2c4dc6cbe1f454bc8e04ee754229d2 100644
--- a/test/test_class1_neural_network.py
+++ b/test/test_class1_neural_network.py
@@ -2,7 +2,7 @@ import numpy
 import pandas
 numpy.random.seed(0)
 
-from mhcflurry import Class1NeuralNetwork
+from mhcflurry.class1_neural_network import Class1NeuralNetwork
 
 from nose.tools import eq_
 from numpy import testing
diff --git a/test/test_hyperparameters.py b/test/test_hyperparameters.py
index c1af6cacc0e27752ae842804362b61dd16ebc0c2..0b887236f8be6313630c89e046978969316d7401 100644
--- a/test/test_hyperparameters.py
+++ b/test/test_hyperparameters.py
@@ -1,6 +1,6 @@
 from numpy.testing import assert_equal
 
-from mhcflurry.class1_affinity_prediction import Class1NeuralNetwork
+from mhcflurry.class1_neural_network import Class1NeuralNetwork
 
 
 def test_all_combinations_of_hyperparameters():
diff --git a/test/test_train_allele_specific_models_command.py b/test/test_train_allele_specific_models_command.py
index a556cc9a28d75a7e65f8d1202731464a73c91710..affcde7569b0ae5766ae554f50a73122f3e3894f 100644
--- a/test/test_train_allele_specific_models_command.py
+++ b/test/test_train_allele_specific_models_command.py
@@ -1,15 +1,14 @@
-import tempfile
-import shutil
-import os
 import json
+import os
+import shutil
+import tempfile
 
 from numpy.testing import assert_array_less, assert_equal
 
-from mhcflurry.class1_affinity_prediction import (
-    train_allele_specific_models_command, Class1AffinityPredictor)
+from mhcflurry import train_allele_specific_models_command
+from mhcflurry import Class1AffinityPredictor
 from mhcflurry.downloads import get_path
 
-
 HYPERPARAMETERS = [
     {
         "n_models": 2,