Index: src/Parser/Psi3Parser.cpp
===================================================================
--- src/Parser/Psi3Parser.cpp	(revision 9011c1ce1292bb6459bc13092fe0c8ad098f64ec)
+++ src/Parser/Psi3Parser.cpp	(revision d640ea4f513e93f75000fdadbe0789cf1671a383)
@@ -160,106 +160,74 @@
 void FormatParser< psi3 >::save(ostream *file, const std::vector<atom *> &atoms)
 {
-//  Vector center;
-////  vector<atom *> allatoms = World::getInstance().getAllAtoms();
-//
-//  // calculate center
-//  for (std::vector<atom *>::const_iterator runner = atoms.begin();runner != atoms.end(); ++runner)
-//    center += (*runner)->getPosition();
-//  center.Scale(1./(double)atoms.size());
-//
-//  // first without hessian
-//  if (file->fail()) {
-//    DoeLog(1) && (eLog()<< Verbose(1) << "Cannot open psi3 output file." << endl);
-//  } else {
-//    *file << "% Created by MoleCuilder" << endl;
-//    *file << "psi3: (" << endl;
-//    *file << "\tsavestate = " << getParams().getParameter(Psi3Parser_Parameters::savestateParam) << endl;
-//    *file << "\tdo_gradient = " << getParams().getParameter(Psi3Parser_Parameters::do_gradientParam) << endl;
-//    if (Converter(getParams().getParameter(Psi3Parser_Parameters::hessianParam))) {
-//      *file << "\tfreq<MolecularFrequencies>: (" << endl;
-//      *file << "\t\tmolecule=$:molecule" << endl;
-//      *file << "\t)" << endl;
+  Vector center;
+//  vector<atom *> allatoms = World::getInstance().getAllAtoms();
+
+  // calculate center
+  for (std::vector<atom *>::const_iterator runner = atoms.begin();runner != atoms.end(); ++runner)
+    center += (*runner)->getPosition();
+  center.Scale(1./(double)atoms.size());
+
+  // first without hessian
+  if (file->fail()) {
+    DoeLog(1) && (eLog()<< Verbose(1) << "Cannot open psi3 output file." << std::endl);
+  } else {
+    *file << "% Created by MoleCuilder" << std::endl;
+    *file << "psi: (" << std::endl;
+    *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::labelParam)
+                  << " = \"" << getParams().getParameter(Psi3Parser_Parameters::labelParam) << "\"" << std::endl;
+    *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::jobtypeParam)
+                  << " = " << getParams().getParameter(Psi3Parser_Parameters::jobtypeParam) << std::endl;
+    *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::wavefunctionParam)
+                  << " = " << getParams().getParameter(Psi3Parser_Parameters::wavefunctionParam) << std::endl;
+    *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::maxiterParam)
+                  << " = " << getParams().getParameter(Psi3Parser_Parameters::maxiterParam) << std::endl;
+    *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::referenceParam)
+                  << " = " << getParams().getParameter(Psi3Parser_Parameters::referenceParam) << std::endl;
+    *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::basisParam)
+                  << " = \"" << getParams().getParameter(Psi3Parser_Parameters::basisParam) << "\"" << std::endl;
+    const std::string reference = getParams().getParameter(Psi3Parser_Parameters::referenceParam);
+//    if (reference == getParams().getReferenceName(Psi3Parser_Parameters::RHF)) {
 //    }
-//    const std::string theory = getParams().getParameter(Psi3Parser_Parameters::theoryParam);
-//    if (theory == getParams().getTheoryName(Psi3Parser_Parameters::CLHF)) {
-//      *file << "\tmole<" << getParams().getParameter(Psi3Parser_Parameters::theoryParam) << ">: (" << endl;
-//      *file << "\t\tmolecule = $:molecule" << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::basisParam) << " = $:basis" << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::maxiterParam)
-//          << " = " << getParams().getParameter(Psi3Parser_Parameters::maxiterParam)<< endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::memoryParam)
-//          << " = " << getParams().getParameter(Psi3Parser_Parameters::memoryParam) << endl;
-//      *file << "\t)" << endl;
-//    } else if (theory == getParams().getTheoryName(Psi3Parser_Parameters::CLKS)) {
-//      *file << "\tmole<" << getParams().getParameter(Psi3Parser_Parameters::theoryParam) << ">: (" << endl;
-//      *file << "\t\tfunctional<StdDenFunctional>:(name=B3LYP)" << endl;
-//      *file << "\t\tmolecule = $:molecule" << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::basisParam) << " = $:basis" << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::maxiterParam)
-//          << " = " << getParams().getParameter(Psi3Parser_Parameters::maxiterParam)<< endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::memoryParam)
-//          << " = " << getParams().getParameter(Psi3Parser_Parameters::memoryParam) << endl;
-//      *file << "\t)" << endl;
-//    } else if (theory == getParams().getTheoryName(Psi3Parser_Parameters::MBPT2)) {
-//      *file << "\tmole<" << getParams().getParameter(Psi3Parser_Parameters::theoryParam) << ">: (" << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::basisParam) << " = $:basis" << endl;
-//      *file << "\t\tmolecule = $:molecule" << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::memoryParam)
-//          << " = " << getParams().getParameter(Psi3Parser_Parameters::memoryParam) << endl;
-//      *file << "\t\treference<CLHF>: (" << endl;
-//      *file << "\t\t\t" << getParams().getParameterName(Psi3Parser_Parameters::maxiterParam)
-//          << " = " << getParams().getParameter(Psi3Parser_Parameters::maxiterParam)<< endl;
-//      *file << "\t\t\t" << getParams().getParameterName(Psi3Parser_Parameters::basisParam) << " = $:basis" << endl;
-//      *file << "\t\t\tmolecule = $:molecule" << endl;
-//      *file << "\t\t\t" << getParams().getParameterName(Psi3Parser_Parameters::memoryParam)
-//          << " = " << getParams().getParameter(Psi3Parser_Parameters::memoryParam) << endl;
-//      *file << "\t\t)" << endl;
-//      *file << "\t)" << endl;
-//    } else if (theory == getParams().getTheoryName(Psi3Parser_Parameters::MBPT2_R12)) {
-//      *file << "\tmole<" << getParams().getParameter(Psi3Parser_Parameters::theoryParam) << ">: (" << endl;
-//      *file << "\t\tmolecule = $:molecule" << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::basisParam) << " = $:basis" << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::aux_basisParam) << " = $:abasis" << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::stdapproxParam)
-//          << " = \"" << getParams().getParameter(Psi3Parser_Parameters::stdapproxParam) << "\"" << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::nfzcParam)
-//          << " = " << getParams().getParameter(Psi3Parser_Parameters::nfzcParam) << endl;
-//      *file << "\t\t" << getParams().getParameterName(Psi3Parser_Parameters::memoryParam)
-//          << " = " << getParams().getParameter(Psi3Parser_Parameters::memoryParam) << endl;
-//      *file << "\t\tintegrals<IntegralCints>:()" << endl;
-//      *file << "\t\treference<CLHF>: (" << endl;
-//      *file << "\t\t\tmolecule = $:molecule" << endl;
-//      *file << "\t\t\t" << getParams().getParameterName(Psi3Parser_Parameters::basisParam) << " = $:basis" << endl;
-//      *file << "\t\t\tmaxiter = " << getParams().getParameter(Psi3Parser_Parameters::maxiterParam) << endl;
-//      *file << "\t\t\tmemory = " << getParams().getParameter(Psi3Parser_Parameters::memoryParam) << endl;
-//      *file << "\t\t\tintegrals<" << getParams().getParameter(Psi3Parser_Parameters::integrationParam) << ">:()" << endl;
-//      *file << "\t\t)" << endl;
-//      *file << "\t)" << endl;
-//    } else {
-//      DoeLog(0) && (eLog() << Verbose(0)
-//          << "Unknown level of theory requested for MPQC output file." << std::endl);
+//    if (reference == getParams().getReferenceName(Psi3Parser_Parameters::ROHF)) {
 //    }
-//    *file << ")" << endl;
-//    *file << "molecule<Molecule>: (" << endl;
-//    *file << "\tunit = " << (World::getInstance().getConfig()->GetIsAngstroem() ? "angstrom" : "bohr" ) << endl;
-//    *file << "\t{ atoms geometry } = {" << endl;
-//    // output of atoms
-//    for (std::vector<atom *>::const_iterator AtomRunner = atoms.begin(); AtomRunner != atoms.end(); ++AtomRunner) {
-//      (*AtomRunner)->OutputMPQCLine(file, &center);
-//    }
-//    *file << "\t}" << endl;
-//    *file << ")" << endl;
-//    *file << "basis<GaussianBasisSet>: (" << endl;
-//    *file << "\tname = \"" << getParams().getParameter(Psi3Parser_Parameters::basisParam) << "\"" << endl;
-//    *file << "\tmolecule = $:molecule" << endl;
-//    *file << ")" << endl;
-//    if (theory == getParams().getTheoryName(Psi3Parser_Parameters::MBPT2_R12)) {
-//      *file << "% auxiliary basis set specification" << endl;
-//      *file << "\tabasis<GaussianBasisSet>: (" << endl;
-//      *file << "\tname = \"" << getParams().getParameter(Psi3Parser_Parameters::aux_basisParam) << "\"" << endl;
-//      *file << "\tmolecule = $:molecule" << endl;
-//      *file << ")" << endl;
-//    }
-//  }
+    if ((reference == getParams().getReferenceName(Psi3Parser_Parameters::UHF))
+        || (reference == getParams().getReferenceName(Psi3Parser_Parameters::TWOCON))) {
+      *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::multiplicityParam)
+                    << " = " << getParams().getParameter(Psi3Parser_Parameters::multiplicityParam) << std::endl;
+      *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::chargeParam)
+                    << " = " << getParams().getParameter(Psi3Parser_Parameters::chargeParam) << std::endl;
+    }
+    if (reference == getParams().getReferenceName(Psi3Parser_Parameters::TWOCON)) {
+      *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::soccParam)
+                    << " = " << getParams().getParameter(Psi3Parser_Parameters::soccParam) << std::endl;
+      *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::doccParam)
+                    << " = " << getParams().getParameter(Psi3Parser_Parameters::doccParam) << std::endl;
+      *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::subgroupParam)
+                    << " = " << getParams().getParameter(Psi3Parser_Parameters::subgroupParam) << std::endl;
+      *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::unique_axisParam)
+                    << " = " << getParams().getParameter(Psi3Parser_Parameters::unique_axisParam) << std::endl;
+    }
+    if ((reference != getParams().getReferenceName(Psi3Parser_Parameters::RHF))
+        && (reference != getParams().getReferenceName(Psi3Parser_Parameters::ROHF))
+        && (reference != getParams().getReferenceName(Psi3Parser_Parameters::UHF))
+        && (reference != getParams().getReferenceName(Psi3Parser_Parameters::TWOCON)))
+    {
+      DoeLog(0) && (eLog() << Verbose(0)
+          << "Unknown level of reference requested for Psi3 output file." << std::endl);
+    }
+    *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::freeze_coreParam)
+                  << " = " << getParams().getParameter(Psi3Parser_Parameters::freeze_coreParam) << std::endl;
+    *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::unitsParam)
+                  << " = " << getParams().getParameter(Psi3Parser_Parameters::unitsParam) << std::endl;
+    *file << "\tgeometry = (" << std::endl;
+    // output of atoms
+    for (std::vector<atom *>::const_iterator AtomRunner = atoms.begin(); AtomRunner != atoms.end(); ++AtomRunner) {
+      (*AtomRunner)->OutputPsi3Line(file, &center);
+    }
+    *file << "\t)" << std::endl;
+    *file << "\t" << getParams().getParameterName(Psi3Parser_Parameters::originParam)
+                  << " = " << getParams().getParameter(Psi3Parser_Parameters::originParam) << std::endl;
+    *file << ")" << std::endl;
+  }
 }
 
Index: src/Parser/unittests/ParserPsi3UnitTest.cpp
===================================================================
--- src/Parser/unittests/ParserPsi3UnitTest.cpp	(revision 9011c1ce1292bb6459bc13092fe0c8ad098f64ec)
+++ src/Parser/unittests/ParserPsi3UnitTest.cpp	(revision d640ea4f513e93f75000fdadbe0789cf1671a383)
@@ -53,10 +53,10 @@
 \tbasis = \"cc-pVTZ\"\n\
 \tfreeze_core = no\n\
-\tunits = bohr\n\
+\tunits = angstrom\n\
 \tgeometry = (\n\
-\t\t( H     0.0000      0.0000  0.0 )\n\
-\t\t( H     0.0000      0.0000  0.74 )\n\
+\t( H\t0\t0\t-0.37 )\n\
+\t( H\t0\t0\t0.37 )\n\
 \t)\n\
-\torigin = (0.0 0.0 0.0)\n\
+\torigin = (0.0\t0.0\t0.0)\n\
 )\n"; // tested with ???
 
@@ -70,10 +70,10 @@
 \tbasis = \"cc-pVTZ\"\n\
 \tfreeze_core = no\n\
-\tunits = bohr\n\
+\tunits = angstrom\n\
 \tgeometry = (\n\
-\t\t( H     0.0000      0.0000  0.0 )\n\
-\t\t( H     0.0000      0.0000  0.74 )\n\
+\t( H\t0\t0\t-0.37 )\n\
+\t( H\t0\t0\t0.37 )\n\
 \t)\n\
-\torigin = (0.0 0.0 0.0)\n\
+\torigin = (0.0\t0.0\t0.0)\n\
 )\n"; // tested with ???
 
@@ -87,12 +87,12 @@
 \tbasis = \"cc-pVTZ\"\n\
 \tmultp = 2\n\
-\t%charge = 2\n\
+\tcharge = 2\n\
 \tfreeze_core = no\n\
-\tunits = bohr\n\
+\tunits = angstrom\n\
 \tgeometry = (\n\
-\t\t( H     0.0000      0.0000  0.0 )\n\
-\t\t( H     0.0000      0.0000  0.74 )\n\
+\t( H\t0\t0\t-0.37 )\n\
+\t( H\t0\t0\t0.37 )\n\
 \t)\n\
-\torigin = (0.0 0.0 0.0)\n\
+\torigin = (0.0\t0.0\t0.0)\n\
 )\n"; // tested with ???
 
@@ -103,17 +103,19 @@
 \twfn = scf\n\
 \tmaxiter = 80\n\
-\treference = TWOCON\n\
+\treference = twocon\n\
 \tbasis = \"cc-pVTZ\"\n\
 \tmultp = 1\n\
-\t%charge = 2\n\
-\tsocc = ( 1 1 0 0 0 0 0 0)\n\
-\tdocc = (0     0     0     0     0     0     0     0)\n\
+\tcharge = 2\n\
+\tsocc = ( 1 1 0 0 0 0 0 0 )\n\
+\tdocc = ( 0 0 0 0 0 0 0 0 )\n\
+\tsubgroup = c2v\n\
+\tunique_axis = x\n\
 \tfreeze_core = no\n\
-\tunits = bohr\n\
+\tunits = angstrom\n\
 \tgeometry = (\n\
-\t\t( H     0.0000      0.0000  0.0 )\n\
-\t\t( H     0.0000      0.0000  0.74 )\n\
+\t( H\t0\t0\t-0.37 )\n\
+\t( H\t0\t0\t0.37 )\n\
 \t)\n\
-\torigin = (0.0 0.0 0.0)\n\
+\torigin = (0.0\t0.0\t0.0)\n\
 )\n"; // tested with ???
 
@@ -286,78 +288,123 @@
       ++iter)
     PositionSum += (*iter)->getPosition();
-  CPPUNIT_ASSERT_EQUAL( PositionSum, Vector(0,0,0.74) );
+  CPPUNIT_ASSERT_EQUAL( PositionSum, Vector(0.,0.,0.) );
 }
 
 void ParserPsi3UnitTest::writePsi3Test() {
-//  // build up water molecule
-//  string first;
-//  string second;
-//  atom *Walker = NULL;
-//  Walker = World::getInstance().createAtom();
-//  Walker->setType(8);
-//  Walker->setPosition(Vector(0,0,0));
-//  Walker = World::getInstance().createAtom();
-//  Walker->setType(1);
-//  Walker->setPosition(Vector(0.758602,0,0.504284));
-//  Walker = World::getInstance().createAtom();
-//  Walker->setType(1);
-//  Walker->setPosition(Vector(0.758602,0,-0.504284));
-//  CPPUNIT_ASSERT_EQUAL(3, World::getInstance().numAtoms());
-//
-//  // create two stringstreams, one stored, one created
-//
-//  std::vector<atom *> atoms = World::getInstance().getAllAtoms();
-//  {
-//    // compare both configs for CLHF
-//    stringstream output;
-//    params->setParameter(
-//        Psi3Parser_Parameters::theoryParam,
-//        params->getTheoryName(Psi3Parser_Parameters::CLHF)
-//            );
-//    parser->save(&output, atoms);
-//    stringstream input(waterPsi3_CLHF);
-//    for (; std::getline(input, first) && std::getline(output, second); ) {
-//      //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
-//      CPPUNIT_ASSERT(first == second);
-//    }
-//  }
-//  {
-//    // compare both configs for CLKS
-//    stringstream output;
-//    params->setParameter(
-//        Psi3Parser_Parameters::theoryParam,
-//        params->getTheoryName(Psi3Parser_Parameters::CLKS)
-//            );
-//    stringstream input(waterPsi3_CLKS);
-//    for (; std::getline(input, first) && std::getline(output, second); ) {
-//      //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
-//      CPPUNIT_ASSERT(first == second);
-//    }
-//  }
-//  {
-//    // compare both configs for MBPT2
-//    stringstream output;
-//    params->setParameter(
-//        Psi3Parser_Parameters::theoryParam,
-//        params->getTheoryName(Psi3Parser_Parameters::MBPT2)
-//            );
-//    stringstream input(waterPsi3_MBPT2);
-//    for (; std::getline(input, first) && std::getline(output, second); ) {
-//      //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
-//      CPPUNIT_ASSERT(first == second);
-//    }
-//  }
-//  {
-//    // compare both configs for MBPT2_R12
-//    stringstream output;
-//    params->setParameter(
-//        Psi3Parser_Parameters::theoryParam,
-//        params->getTheoryName(Psi3Parser_Parameters::MBPT2_R12)
-//            );
-//    stringstream input(waterPsi3_MBPT2_R12);
-//    for (; std::getline(input, first) && std::getline(output, second); ) {
-//      //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
-//      CPPUNIT_ASSERT(first == second);
-//    }
-//  }
-}
+  // build up hydrogen molecule
+  string first;
+  string second;
+  atom *Walker = NULL;
+  Walker = World::getInstance().createAtom();
+  Walker->setType(1);
+  Walker->setPosition(Vector(0.,0.,0.));
+  Walker = World::getInstance().createAtom();
+  Walker->setType(1);
+  Walker->setPosition(Vector(0.,0,0.74));
+  CPPUNIT_ASSERT_EQUAL(2, World::getInstance().numAtoms());
+
+  // set general parameters: label and freeze_core
+  params->setParameter(
+      Psi3Parser_Parameters::labelParam,
+      "cc-pVTZ SCF H2"
+          );
+  params->setParameter(
+      Psi3Parser_Parameters::freeze_coreParam,
+      params->ValidFreezeCore[Psi3Parser_Parameters::NO]
+          );
+  params->setParameter(
+      Psi3Parser_Parameters::unitsParam,
+      params->ValidUnits[Psi3Parser_Parameters::angstrom]
+          );
+
+  // create two stringstreams, one stored, one created
+  std::vector<atom *> atoms = World::getInstance().getAllAtoms();
+  {
+    // compare both configs for RHF
+    stringstream output;
+    params->setParameter(
+        Psi3Parser_Parameters::referenceParam,
+        params->ValidReference[Psi3Parser_Parameters::RHF]
+            );
+    parser->save(&output, atoms);
+    stringstream input(hydrogenPsi3_RHF);
+    // check for non-empty streams
+    input.peek();
+    output.peek();
+    CPPUNIT_ASSERT(input.good() && output.good());
+    // check equality of streams per line (for debugging)
+    for (; std::getline(input, first) && std::getline(output, second); ) {
+      //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
+      CPPUNIT_ASSERT(first == second);
+    }
+  }
+  {
+    // compare both configs for ROHF
+    stringstream output;
+    params->setParameter(
+        Psi3Parser_Parameters::referenceParam,
+        params->ValidReference[Psi3Parser_Parameters::ROHF]
+            );
+    parser->save(&output, atoms);
+    stringstream input(hydrogenPsi3_ROHF);
+    // check for non-empty streams
+    input.peek();
+    output.peek();
+    CPPUNIT_ASSERT(input.good() && output.good());
+    // check equality of streams per line (for debugging)
+    for (; std::getline(input, first) && std::getline(output, second); ) {
+      //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
+      CPPUNIT_ASSERT(first == second);
+    }
+  }
+  {
+    params->setParameter(Psi3Parser_Parameters::multiplicityParam, "2");
+    params->setParameter(Psi3Parser_Parameters::chargeParam, "2");
+    // compare both configs for UHF
+    stringstream output;
+    params->setParameter(
+        Psi3Parser_Parameters::referenceParam,
+        params->ValidReference[Psi3Parser_Parameters::UHF]
+            );
+    parser->save(&output, atoms);
+    params->setParameter(Psi3Parser_Parameters::chargeParam, "0");
+    params->setParameter(Psi3Parser_Parameters::multiplicityParam, "1");
+    stringstream input(hydrogenPsi3_UHF);
+    // check for non-empty streams
+    input.peek();
+    output.peek();
+    CPPUNIT_ASSERT(input.good() && output.good());
+    // check equality of streams per line (for debugging)
+    for (; std::getline(input, first) && std::getline(output, second); ) {
+      //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
+      CPPUNIT_ASSERT(first == second);
+    }
+  }
+  {
+    params->setParameter(Psi3Parser_Parameters::multiplicityParam, "1");
+    params->setParameter(Psi3Parser_Parameters::chargeParam, "2");
+    params->setParameter(Psi3Parser_Parameters::soccParam, "( 1 1 0 0 0 0 0 0 )");
+    params->setParameter(Psi3Parser_Parameters::doccParam, "( 0 0 0 0 0 0 0 0 )");
+    params->setParameter(Psi3Parser_Parameters::subgroupParam, "c2v");
+    params->setParameter(Psi3Parser_Parameters::unique_axisParam, "x");
+    // compare both configs for TWOCON
+    stringstream output;
+    params->setParameter(
+        Psi3Parser_Parameters::referenceParam,
+        params->ValidReference[Psi3Parser_Parameters::TWOCON]
+            );
+    parser->save(&output, atoms);
+    params->setParameter(Psi3Parser_Parameters::multiplicityParam, "1");
+    params->setParameter(Psi3Parser_Parameters::chargeParam, "0");
+    stringstream input(hydrogenPsi3_TWOCON);
+    // check for non-empty streams
+    input.peek();
+    output.peek();
+    CPPUNIT_ASSERT(input.good() && output.good());
+    // check equality of streams per line (for debugging)
+    for (; std::getline(input, first) && std::getline(output, second); ) {
+      //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
+      CPPUNIT_ASSERT(first == second);
+    }
+  }
+}
