diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index af007259420189de595538d71a69c4e3aea0bde0..c5ae5d2a49de307843bd31c986b7bab853c880dd 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,5 +1,10 @@
-Changes in Release 1.2.2
+Changes In Release 1.2.3
+--------------------------------------------------------------------------------
+
+  * PDBWriter: Prevent writing of out-of-bounds atom coordinates.
 
+Changes in Release 1.2.2
+--------------------------------------------------------------------------------
   * Fixed loop indentation in the PDBize function for bio units, leading to
     exponential running time/ memory consumption. This problem only affected a
     fraction of PDB entries.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 12d7c437b3d323f549ee212953d1137f83208b22..e20df9ab673a010a06b86d6699ec0b86ef13d6a9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 2.6.4 FATAL_ERROR)
 project(OpenStructure CXX C)
 set (OST_VERSION_MAJOR 1)
 set (OST_VERSION_MINOR 2)
-set (OST_VERSION_PATCH 2)
+set (OST_VERSION_PATCH 3)
 set (OST_VERSION_STRING ${OST_VERSION_MAJOR}.${OST_VERSION_MINOR}.${OST_VERSION_PATCH} )
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake_support)
 include(OST)
diff --git a/modules/io/src/mol/pdb_writer.cc b/modules/io/src/mol/pdb_writer.cc
index e54da5baec836003654ab38adea7eac8a2880fb9..af00fb80656f02846c90a47070e0f1aa609af807 100644
--- a/modules/io/src/mol/pdb_writer.cc
+++ b/modules/io/src/mol/pdb_writer.cc
@@ -69,6 +69,15 @@ bool shift_left(const String& atom_name, bool is_hetatm,
           element=="MG" || element=="LI");
 }
 
+
+bool atom_pos_ok(geom::Vec3 p) {
+  for (int i=0; i<3; ++i) {
+    if (p[i]<=-1000 || p[i] >= 10000) {
+      return false;
+    }
+  }
+  return true;
+}
 void write_atom(std::ostream& ostr, FormattedLine& line, 
                 const mol::AtomHandle& atom, int atomnum, 
                 bool is_pqr, bool charmm_style)
@@ -132,6 +141,9 @@ void write_atom(std::ostream& ostr, FormattedLine& line,
   
   // deal with alternative atom locations
   if (names.empty()) {
+    if (!atom_pos_ok(p)) {
+      throw IOException("Atom position outside of bounds supported by PDB format");
+    }
     line(30, 8)=fmt::LPaddedFloat(p[0],  3);
     line(38, 8)=fmt::LPaddedFloat(p[1],  3);
     line(46, 8)=fmt::LPaddedFloat(p[2],  3);
@@ -162,6 +174,9 @@ void write_atom(std::ostream& ostr, FormattedLine& line,
       p=atom.GetEntity().GetTransform().Apply(atom.GetAltPos(*i));
       line(30, 50).Clear();
 
+      if (!atom_pos_ok(p)) {
+        throw IOException("Atom position outside of bounds supported by PDB format");
+      }
       if (i->size()>1) {
         throw IOException("Alternative atom indicator '"+atom.GetQualifiedName()+
                           "("+*i+")' too long for PDB output. At most 1 "
diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc
index d1e9526c574fa69d345f961c26181fc07b289280..9b5b6691f6a9410a943bc4ea5850e3e261513d2a 100644
--- a/modules/io/tests/test_io_pdb.cc
+++ b/modules/io/tests/test_io_pdb.cc
@@ -1035,6 +1035,24 @@ BOOST_AUTO_TEST_CASE(test_pqr_read_atom)
   BOOST_CHECK_CLOSE(a2.GetRadius(), Real(1.7503), Real(1e-4));
 }
 
+BOOST_AUTO_TEST_CASE(checks_for_atom_pos_overflow)
+{
+  std::stringstream out;
+  PDBWriter writer(out, IOProfile());
+  writer.SetIsPQR(true);
+
+  mol::EntityHandle ent=mol::CreateEntity();
+  mol::XCSEditor edi=ent.EditXCS();
+  mol::ChainHandle ch=edi.InsertChain("A");
+  mol::ResidueHandle r=edi.AppendResidue(ch, "GLY");
+
+  mol::AtomHandle a=edi.InsertAtom(r, "CA", geom::Vec3(0, -1000,0), "C");
+  
+  BOOST_CHECK_THROW(writer.Write(ent), IOException);
+  edi.SetAtomPos(a, geom::Vec3(10000,0,0));
+  BOOST_CHECK_THROW(writer.Write(ent), IOException);
+}
+
 BOOST_AUTO_TEST_CASE(test_pqr_write_atom)
 {
   std::stringstream out;