diff --git a/modules/io/pymod/export_pdb_io.cc b/modules/io/pymod/export_pdb_io.cc
index fe2a3a75f0635e36dbab85cc4157bacb696151d6..1aec7e6fe5415aea60d813955b924b271c3159db 100644
--- a/modules/io/pymod/export_pdb_io.cc
+++ b/modules/io/pymod/export_pdb_io.cc
@@ -53,6 +53,7 @@ void export_pdb_io()
     pdb_scope.attr("SKIP_FAULTY_RECORDS")=PDB::SKIP_FAULTY_RECORDS;
     pdb_scope.attr("WRITE_MULTIPLE_MODELS")=PDB::WRITE_MULTIPLE_MODELS;
     pdb_scope.attr("JOIN_SPREAD_ATOM_RECORDS")=PDB::JOIN_SPREAD_ATOM_RECORDS;
+    pdb_scope.attr("CALPHA_ONLY")=PDB::CALPHA_ONLY;    
   }
 
   class_<PDBReader, boost::noncopyable>("PDBReader", init<String>())
diff --git a/modules/io/src/mol/pdb_reader.cc b/modules/io/src/mol/pdb_reader.cc
index a2ce79cd12998a98f8e4cccb139cd967bebd5455..c8e1136526d786b8daf971f99c586b29350db34d 100644
--- a/modules/io/src/mol/pdb_reader.cc
+++ b/modules/io/src/mol/pdb_reader.cc
@@ -283,8 +283,18 @@ bool PDBReader::ParseAtomIdent(const StringRef& line, int line_num,
     }
     throw IOException(str(format("invalid res number on line %d") % line_num));
   }
+
   char  ins_c=line[26];  
   resnum=to_res_num(res_num.second, ins_c);
+  if (PDB::Flags() & PDB::CALPHA_ONLY) {
+    if (record_type[0]=='H' || record_type[0]=='h') {
+      return false;
+    } 
+    if (atom_name!=StringRef("CA", 2)) {
+      return false;
+    }
+    return true;
+  }
   return true;
 }
 
@@ -301,7 +311,7 @@ void PDBReader::ParseAnisou(const StringRef& line, int line_num,
   }
   double anisou[6]={0.0, 0.0, 0.0, 0.0, 0.0, 0.0};  
   for (int i=0;i<6; ++i) {
-    std::pair<bool, int> result=line.substr(29+i*7, 6).to_int();
+    std::pair<bool, int> result=line.substr(29+i*7, 6).ltrim().to_int();
     if (!result.first) {
       if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS) {
         return;
@@ -312,7 +322,8 @@ void PDBReader::ParseAnisou(const StringRef& line, int line_num,
   }
   String aname(atom_name.str());
   if (!curr_residue_.IsValid()) {
-    if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS) {
+    if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS || 
+        PDB::Flags() & PDB::CALPHA_ONLY) {
       return;
     } 
     const char* fmt_str="invalid ANISOU record for inexistent atom on line %d";
@@ -320,7 +331,8 @@ void PDBReader::ParseAnisou(const StringRef& line, int line_num,
   }
   mol::AtomHandle atom=curr_residue_.FindAtom(aname);
   if (!atom.IsValid()) {
-    if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS) {
+    if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS ||
+        PDB::Flags() & PDB::CALPHA_ONLY) {
       return;
     } 
     const char* fmt_str="invalid ANISOU record for inexistent atom on line %d";
diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc
index 7866377c2056932e99732b36d60fcdaceff3041d..fe5c51f3af93f401554f6e4ec356180d75a69e08 100644
--- a/modules/io/tests/test_io_pdb.cc
+++ b/modules/io/tests/test_io_pdb.cc
@@ -56,7 +56,8 @@ BOOST_AUTO_TEST_CASE(atom_record)
   BOOST_REQUIRE_EQUAL(ent.GetChainCount(), 2);
   BOOST_REQUIRE_EQUAL(ent.GetResidueCount(), 2);
   BOOST_REQUIRE_EQUAL(ent.GetAtomCount(), 2);
-  mol::AtomHandle a1=ent.FindChain("A").GetAtomList()[0];
+  mol::AtomHandle a1=ent.FindAtom("A", mol::ResNum(1), "N");
+  BOOST_REQUIRE(a1.IsValid());
   BOOST_CHECK_EQUAL(a1.GetName(), "N");
   BOOST_CHECK_EQUAL(a1.GetResidue().GetName(), "MET");
   BOOST_CHECK_EQUAL(a1.GetResidue().GetChain().GetName(), "A");  
@@ -66,7 +67,8 @@ BOOST_AUTO_TEST_CASE(atom_record)
   BOOST_CHECK_EQUAL(a1.GetProp().occupancy, 0.5);  
   BOOST_CHECK_EQUAL(a1.GetProp().element, "N");
   BOOST_CHECK_EQUAL(a1.GetProp().is_hetatm, false);
-  mol::AtomHandle a2=ent.FindChain(" ").GetAtomList()[0];
+  mol::AtomHandle a2=ent.FindAtom(" ", mol::ResNum(1), "CA");
+  BOOST_REQUIRE(a2.IsValid());  
   BOOST_CHECK_EQUAL(a2.GetName(), "CA");
   BOOST_CHECK_EQUAL(a2.GetResidue().GetName(), "MET");
   BOOST_CHECK_EQUAL(a2.GetResidue().GetChain().GetName(), " ");  
@@ -120,9 +122,53 @@ BOOST_AUTO_TEST_CASE(join_spread_records_off)
   BOOST_CHECK_EQUAL(res1.GetAtomCount(), 1);
   BOOST_CHECK(res1.FindAtom("N"));
   mol::ResidueHandle res2=ent.FindResidue("A", mol::ResNum(2));  
-  BOOST_CHECK(res2.IsValid());
+  BOOST_REQUIRE(res2.IsValid());
   BOOST_CHECK_EQUAL(res2.GetAtomCount(), 1);
   BOOST_CHECK(res2.FindAtom("N"));
 }
 
+BOOST_AUTO_TEST_CASE(calpha_only_import_on)
+{
+  String fname("testfiles/pdb/calpha.pdb");
+  PDBReader reader(fname);
+  PDB::PushFlags(PDB::CALPHA_ONLY);
+  mol::EntityHandle ent=mol::CreateEntity();
+  reader.Import(ent);
+  PDB::PopFlags();
+  BOOST_CHECK_EQUAL(ent.GetResidueCount(), 1);
+  BOOST_CHECK_EQUAL(ent.GetAtomCount(), 1);
+}
+
+BOOST_AUTO_TEST_CASE(calpha_only_import_off)
+{
+  String fname("testfiles/pdb/calpha.pdb");
+  PDBReader reader(fname);
+  mol::EntityHandle ent=mol::CreateEntity();
+  reader.Import(ent);
+  BOOST_CHECK_EQUAL(ent.GetResidueCount(), 2);
+  BOOST_CHECK_EQUAL(ent.GetAtomCount(), 4);
+}
+
+BOOST_AUTO_TEST_CASE(anisou_record)
+{
+  String fname("testfiles/pdb/anisou.pdb");
+  PDBReader reader(fname);
+  mol::EntityHandle ent=mol::CreateEntity();
+  reader.Import(ent);
+  BOOST_REQUIRE(ent.GetAtomCount()==1);
+  mol::AtomHandle a1=ent.FindAtom("A", mol::ResNum(7), "N");
+  BOOST_REQUIRE(a1.IsValid());
+  mol::AtomProp props=a1.GetProp();
+  BOOST_CHECK_CLOSE( 0.0100, props.anisou(0, 0), 1e-4);
+  BOOST_CHECK_CLOSE(-0.0016, props.anisou(1, 0), 1e-4);
+  BOOST_CHECK_CLOSE(-0.0026, props.anisou(2, 0), 1e-4);
+  BOOST_CHECK_CLOSE(-0.0016, props.anisou(0, 1), 1e-4);
+  BOOST_CHECK_CLOSE( 0.0110, props.anisou(1, 1), 1e-4);
+  BOOST_CHECK_CLOSE(-0.0054, props.anisou(2, 1), 1e-4);
+  BOOST_CHECK_CLOSE(-0.0026, props.anisou(0, 2), 1e-4);
+  BOOST_CHECK_CLOSE(-0.0054, props.anisou(1, 2), 1e-4);
+  BOOST_CHECK_CLOSE( 0.0120, props.anisou(2, 2), 1e-4);    
+}
+
+
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/io/tests/testfiles/pdb/anisou.pdb b/modules/io/tests/testfiles/pdb/anisou.pdb
new file mode 100644
index 0000000000000000000000000000000000000000..55692976ebb41d2288dac08652f7083967c03434
--- /dev/null
+++ b/modules/io/tests/testfiles/pdb/anisou.pdb
@@ -0,0 +1,2 @@
+ATOM    134  N   GLU A   7      -3.391  15.554   9.400  1.00  3.46           C
+ANISOU  133  N   GLU A   7      100    110    120    -16    -26    -54       N  
diff --git a/modules/io/tests/testfiles/pdb/calpha.pdb b/modules/io/tests/testfiles/pdb/calpha.pdb
new file mode 100644
index 0000000000000000000000000000000000000000..9e30b5c6b2c971639b95235b35784b84f07cec7f
--- /dev/null
+++ b/modules/io/tests/testfiles/pdb/calpha.pdb
@@ -0,0 +1,6 @@
+ATOM    134  CA  GLU A   7      -3.391  15.554   9.400  1.00  3.46           C  
+ANISOU  134  CA  GLU A   7      443    511    361    -28    -37    -88       C  
+ATOM    135  C   GLU A   7      -3.799  15.410  10.865  1.00  3.42           C  
+ANISOU  135  C   GLU A   7      419    507    375    -14    -45   -103       C  
+ATOM    136  O   GLU A   7      -4.948  15.082  11.188  1.00  4.00           O
+HETATM 1469 CA    CA A1000      46.224   7.128  -8.698  1.00  7.59          CA
\ No newline at end of file