diff --git a/modules/io/src/mol/pdb_reader.cc b/modules/io/src/mol/pdb_reader.cc
index 3b69915de24795389f6566e5ce43e0cc487d9c8d..930ffbcf453f0563768d8aae0351f65fe6ac07bf 100644
--- a/modules/io/src/mol/pdb_reader.cc
+++ b/modules/io/src/mol/pdb_reader.cc
@@ -697,8 +697,11 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num,
                             atom_name, alt_loc, record_type, serial)) {
     return;                            
   }
-  std::pair<bool, Real> charge, radius;
-  std::pair<bool, Real> occ, temp;
+
+  std::pair<bool, Real> charge = std::make_pair(false, 0.0);
+  std::pair<bool, Real> radius = std::make_pair(false, 0.0);
+  std::pair<bool, Real> occ = std::make_pair(false, 0.0);
+  std::pair<bool, Real> temp = std::make_pair(false, 0.0);
   geom::Vec3 apos;
 
   for (int i=0;i<3; ++i) {
@@ -728,6 +731,20 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num,
     if (line.length()>=66) {
       temp=line.substr(60, 6).ltrim().to_float();      
     }
+    if (line.length()>=80) {
+      // example charge formatting: 1+, 2- etc.
+      charge = line.substr(78,1).trim().to_float();
+      if(charge.first) {
+        if(line[79] != '-' && line[79] != '+') {
+          std::stringstream ss;
+          ss << "error on line " << line_num << ": "
+             << "expect charge in format 1+, 2-, etc. got: "
+             << line.substr(78, 2);
+          throw IOException(ss.str());      
+        }
+        if(line[79] == '-') charge.second *= (-1);
+      }
+    }
   }
   LOG_TRACE( "line: [" << line << "]" );
   String s_ele;
@@ -838,6 +855,7 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num,
   }
   Real b=temp.first ? temp.second : 0.0;
   Real o=occ.first ? occ.second : 1.0;
+
   if (!profile_.quack_mode && alt_loc!=' ') {
     // Check if there is already a atom with the same name.
     mol::AtomHandle me=curr_residue_.FindAtom(aname);
@@ -869,16 +887,16 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num,
     ah=editor.InsertAtom(curr_residue_, aname, apos, s_ele);
     ++atom_count_;
   }
-  if(is_pqr_) {
-    if (radius.first) {
-      ah.SetRadius(radius.second);
-    }
+
+  if (radius.first) {
+    ah.SetRadius(radius.second);
   }
-  ah.SetBFactor(b);
-  ah.SetOccupancy(o);
   if (charge.first) {
     ah.SetCharge(charge.second);
   }
+  ah.SetBFactor(b);
+  ah.SetOccupancy(o);
+
   ah.SetHetAtom(record_type[0]=='H');
   if(profile_.read_conect && serial != -1) {
     this->amap_[serial] = ah;