diff --git a/bfps/base.py b/bfps/base.py
index ccd298e717d0cfedae2674c80aa81e2e5540aa77..b836a66afbcf56afeab1688bf329b1a34d69d417 100644
--- a/bfps/base.py
+++ b/bfps/base.py
@@ -21,6 +21,7 @@
 
 
 import os
+import h5py
 
 class base(object):
     def __init__(
@@ -52,25 +53,25 @@ class base(object):
         key = self.parameters.keys()
         key.sort()
         src_txt = ('int read_parameters()\n{\n'
-                 + 'int err_while_reading = 0, errr;\n'
                  + 'if (myrank == {0})'.format(self.iorank)
                  + '\n{\n'
-                 + 'FILE *par_file;\n'
                  + 'char fname[{0}];\n'.format(self.string_length)
-                 + 'sprintf(fname, "%s_pars.txt", simname);\n'
-                 + 'par_file = fopen(fname, "r");\n')
+                 + 'sprintf(fname, "%s.h5", simname);\n'
+                 + 'H5::H5File par_file(fname, H5F_ACC_RDONLY);\n'
+                 + 'H5::DataSet dset;\n'
+                 + 'H5::StrType strdtype(0, H5T_VARIABLE);\n'
+                 + 'H5::DataSpace strdspace(H5S_SCALAR);\n'
+                 + 'std::string tempstr;')
         #src_txt += 'std::cerr << fname << std::endl;\n'
         for i in range(len(key)):
+            src_txt += 'dset = par_file.openDataSet("parameters/{0}");\n'.format(key[i])
             if type(self.parameters[key[i]]) == int:
-                src_txt += ('if (fscanf(par_file, "' + key[i] + ' = %d\\n", &' + key[i] + ') != 1)\n'
-                          + '    err_while_reading++;\n')
+                src_txt += 'dset.read(&{0}, H5::PredType::NATIVE_INT);\n'.format(key[i])
             elif type(self.parameters[key[i]]) == str:
-                src_txt += ('if (fscanf(par_file, "' + key[i] + ' = %s\\n", ' + key[i] + ') != 1)\n'
-                          + '    err_while_reading++;\n')
+                src_txt += ('dset.read(tempstr, strdtype, strdspace);\n' +
+                            'sprintf({0}, "%s", tempstr.c_str());\n').format(key[i])
             else:
-                src_txt += ('if (fscanf(par_file, "' + key[i] + ' = %le\\n", &' + key[i] + ') != 1)\n'
-                          + '    err_while_reading++;\n')
-            #src_txt += 'DEBUG_MSG("read ' + key[i] + ', err_while_reading is %d\\n", err_while_reading);\n'
+                src_txt += 'dset.read(&{0}, H5::PredType::NATIVE_DOUBLE);\n'.format(key[i])
         src_txt += '}\n' # finishing if myrank == 0
         # now broadcasting values to all ranks
         for i in range(len(key)):
@@ -80,13 +81,7 @@ class base(object):
                 src_txt += 'MPI_Bcast((void*)(' + key[i] + '), {0}, MPI_CHAR, {1}, MPI_COMM_WORLD);\n'.format(self.string_length, self.iorank)
             else:
                 src_txt += 'MPI_Bcast((void*)(&' + key[i] + '), 1, MPI_DOUBLE, {0}, MPI_COMM_WORLD);\n'.format(self.iorank)
-        src_txt += ('MPI_Allreduce((void*)(&err_while_reading), (void*)(&errr), 1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD);\n'
-                  + 'if (errr > 0)\n{\n'
-                  + 'fprintf(stderr, "Error reading parameters.\\nAttempting to exit.\\n");\n'
-                  + 'MPI_Finalize();\n'
-                  + 'exit(0);\n'
-                  + '}\n'             # finishing errr check
-                  + 'return 0;\n}\n') # finishing read_parameters
+        src_txt += 'return 0;\n}\n' # finishing read_parameters
         return src_txt
     def cprint_pars(self):
         key = self.parameters.keys()
@@ -101,17 +96,11 @@ class base(object):
                 src_txt += 'DEBUG_MSG("'+ key[i] + ' = %le\\n", ' + key[i] + ');\n'
         return src_txt
     def write_par(self):
-        filename = self.simname + '_pars.txt'
         if not os.path.isdir(self.work_dir):
             os.makedirs(self.work_dir)
-        ofile = open(os.path.join(self.work_dir, filename), 'w')
-        key = self.parameters.keys()
-        key.sort()
-        for i in range(len(key)):
-            if type(self.parameters[key[i]]) == float:
-                ofile.write(('{0} = {1:e}\n').format(key[i], self.parameters[key[i]]))
-            else:
-                ofile.write('{0} = {1}\n'.format(key[i], self.parameters[key[i]]))
+        ofile = h5py.File(os.path.join(self.work_dir, self.simname + '.h5'), 'w')
+        for k in self.parameters.keys():
+            ofile['parameters/' + k] = self.parameters[k]
         ofile.close()
         return None
     def read_parameters(self):
diff --git a/bfps/code.py b/bfps/code.py
index 635d4a25563d8984423b230f49cfbc1323f885da..fa1c3165ff9cb866c96ee841c96e523efdd92c7c 100644
--- a/bfps/code.py
+++ b/bfps/code.py
@@ -41,6 +41,7 @@ class code(base):
                 #include "base.hpp"
                 #include "fluid_solver.hpp"
                 #include <iostream>
+                #include <H5Cpp.h>
                 #include <fftw3-mpi.h>
                 //endcpp
                 """
diff --git a/machine_settings.py b/machine_settings.py
index 2b3a21f7d11144f8f2a1765fc8e18e4c03f47329..77967a1af0b665d4458793ef0c9a293f692993c0 100644
--- a/machine_settings.py
+++ b/machine_settings.py
@@ -7,14 +7,14 @@ import os
 hostname = os.getenv('HOSTNAME')
 
 extra_compile_args = ['-mtune=native', '-ffast-math', '-std=c++11']
-extra_libraries = []
+extra_libraries = ['hdf5_cpp', 'hdf5']
 
 if hostname == 'chichi-G':
     include_dirs = ['/usr/local/include',
                     '/usr/include/mpich']
     library_dirs = ['/usr/local/lib'
                     '/usr/lib/mpich']
-    extra_libraries = ['mpich']
+    extra_libraries += ['mpich']
 
 if hostname in ['frontend01', 'frontend02']:
     include_dirs = ['/usr/nld/mvapich2-1.9a2-gcc/include',
@@ -26,7 +26,7 @@ if hostname in ['frontend01', 'frontend02']:
                     '/usr/nld/gcc-4.7.2/lib64',
                     '/usr/nld/fftw-3.3.3-mvapich2-1.9a2-gcc/lib',
                     '/usr/nld/fftw-3.3.3-float-mvapich2-1.9a2-gcc/lib']
-    extra_libraries = ['mpich']
+    extra_libraries += ['mpich']
 
 if hostname == 'tolima':
     local_install_dir = '/scratch.local/chichi/installs'
diff --git a/setup.py b/setup.py
index 32e0b80d6291e88520b6767a6ed8ffb0987fb458..dcf43c69aada4ac7488c93d2a6872c8507ac9816 100644
--- a/setup.py
+++ b/setup.py
@@ -89,7 +89,7 @@ libbfps = Extension(
 setup(
         name = 'bfps',
         packages = ['bfps'],
-        install_requires = ['numpy>=1.8', 'matplotlib>=1.3'],
+        install_requires = ['numpy>=1.8', 'matplotlib>=1.3', 'h5py>=2.2.1'],
         ext_modules = [libbfps],
         package_data = {'bfps': header_list + ['../machine_settings.py',
                                                'install_info.pickle']},