diff --git a/mhcflurry/package_metadata.py b/mhcflurry/package_metadata.py
index 559a6d7a70ee86e0088a72442e45ca21ac00ae16..36e61c641d912318fc6e395d4913c21c77c544ff 100644
--- a/mhcflurry/package_metadata.py
+++ b/mhcflurry/package_metadata.py
@@ -1,2 +1,2 @@
 
-__version__ = "0.0.8"
+__version__ = "0.1.0"
diff --git a/mhcflurry/predict_command.py b/mhcflurry/predict_command.py
index 4a010402ecb357d296a574c2c89a93ec116051ad..edcc6af020e175bd5077f1e1a84e9e9b6d61553c 100644
--- a/mhcflurry/predict_command.py
+++ b/mhcflurry/predict_command.py
@@ -122,8 +122,19 @@ def run(argv=sys.argv[1:]):
             parser.error(
                 "Specify either an input CSV file or both the "
                 "--alleles and --peptides arguments")
-
-        pairs = list(itertools.product(args.alleles, args.peptides))
+        # split user specified allele and peptide strings in case they
+        # contain multiple entries separated by commas
+        alleles = []
+        for allele_string in args.alleles:
+            alleles.extend([s.strip() for s in allele_string.split(",")])
+        peptides = []
+        for peptide in args.peptides:
+            peptides.extend(peptide.strip() for p in peptide.split(","))
+        for peptide in peptides:
+            if not peptide.isalpha():
+                raise ValueError(
+                    "Unexpected character(s) in peptide '%s'" % peptide)
+        pairs = list(itertools.product(alleles, peptides))
         df = pandas.DataFrame({
             "allele": [p[0] for p in pairs],
             "peptide": [p[1] for p in pairs],
diff --git a/requirements.txt b/requirements.txt
index 78a52a934f1732bc8eb3d459bafa9c01f1d54728..e1768825d305e148f3429f64c7b54c4f60dd06dd 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,7 +2,7 @@ numpy>= 1.11
 pandas>=0.13.1
 appdirs
 theano>=0.8.2
-keras==1.1.0
+keras==1.2.0
 fancyimpute>=0.0.12
 scikit-learn
 h5py
diff --git a/setup.py b/setup.py
index 07adad407a940d14046cf4eb03e04bc1ac30f516..909ba1f78c4328e7374ce3243423e1ce72d35e1c 100644
--- a/setup.py
+++ b/setup.py
@@ -15,9 +15,14 @@
 import os
 import logging
 import re
+import sys
 
 from setuptools import setup
 
+# normally we would import six.PY2 but can't yet assume that six
+# is installed here
+PY2 = (sys.version_info.major == 2)
+
 readme_dir = os.path.dirname(__file__)
 readme_filename = os.path.join(readme_dir, 'README.md')
 
@@ -43,6 +48,25 @@ with open('mhcflurry/package_metadata.py', 'r') as f:
         re.MULTILINE).group(1)
 
 if __name__ == '__main__':
+    required_packages = [
+        'numpy>=1.11',
+        'pandas>=0.13.1',
+        'appdirs',
+        'theano>=0.8.2',
+        'keras==1.2.0',
+        'fancyimpute>=0.0.12',
+        'scikit-learn',
+        'h5py',
+        'typechecks',
+        'pepdata',
+        'bottle',
+        'six',
+    ]
+    if PY2:
+        # concurrent.futures is a standard library in Py3 but Py2
+        # requires this backport
+        required_packages.append('futures')
+
     setup(
         name='mhcflurry',
         version=version,
@@ -71,21 +95,7 @@ if __name__ == '__main__':
         package_data={
             'mhcflurry': ['downloads.yml'],
         },
-        install_requires=[
-            'numpy>=1.11',
-            'pandas>=0.13.1',
-            'appdirs',
-            'theano>=0.8.2',
-            'keras==1.1.0',
-            'fancyimpute>=0.0.12',
-            'scikit-learn',
-            'h5py',
-            'typechecks',
-            'pepdata',
-            'futures',
-            'bottle',
-            'six',
-        ],
+        install_requires=required_packages,
         long_description=readme,
         packages=['mhcflurry', 'mhcflurry.class1_allele_specific'],
     )