diff --git a/modules/gfx/src/impl/trace_renderer.cc b/modules/gfx/src/impl/trace_renderer.cc
index 5c493d7fe5a572223b044df94024229ecaf46079..043dbb2d6c50a20c5a3c1fdd4dcb2700f7567615 100644
--- a/modules/gfx/src/impl/trace_renderer.cc
+++ b/modules/gfx/src/impl/trace_renderer.cc
@@ -18,6 +18,7 @@
 //------------------------------------------------------------------------------
 
 #include <ost/gfx/entity.hh>
+#include <ost/gfx/povray.hh>
 
 #include "trace_renderer.hh"
 
@@ -190,6 +191,35 @@ void TraceRenderer::ConnectProfiles(VertexID prof0, VertexID prof1, int n,
   }
 }
 
+void TraceRenderer::RenderPov(PovState& pov, const std::string& name)
+{
+  pov.write_merge_or_union(name);
+
+  for (int node_list=0; node_list<trace_subset_.GetSize(); ++node_list) {
+    const NodeListSubset& nl=trace_subset_[node_list];
+
+    geom::Vec3 p0=nl[0].atom.GetPos();
+    float rad0=0.2;
+    Color col0=nl[0].color1;
+    pov.write_sphere(p0,rad0,col0,name);
+    for (int i=1; i<nl.GetSize();++i) {
+      const NodeEntry& entry=nl[i];
+      geom::Vec3 p1=nl[i].atom.GetPos();
+      float rad1=0.2;
+      Color col1=nl[i].color1;
+      pov.write_sphere(p1,rad1,col1,name);
+      geom::Vec3 pm=(p0+p1)*0.5;
+      pov.write_cyl(p0,pm,rad0,col0,name,true);
+      pov.write_cyl(pm,p1,rad1,col1,name,true);
+      p0=p1;
+      rad0=rad1;
+      col0=col1;
+    }
+  }
+
+  pov.inc() << " }\n";
+}
+
 void TraceRenderer::Render()
 {
 
diff --git a/modules/gfx/src/impl/trace_renderer.hh b/modules/gfx/src/impl/trace_renderer.hh
index e549b8f585e79c86de74fee086a55436e53f6cdf..77cb8d3daa3d1584b45d38ea125bc03f6181a470 100644
--- a/modules/gfx/src/impl/trace_renderer.hh
+++ b/modules/gfx/src/impl/trace_renderer.hh
@@ -43,6 +43,7 @@ public:
   virtual void PrepareRendering(TraceSubset& trace_subset, 
                                 IndexedVertexArray& va, bool is_sel);
   virtual void Render();
+  virtual void RenderPov(PovState& pov, const std::string& name);
 
   virtual bool CanSetOptions(RenderOptionsPtr& render_options);
   virtual void SetOptions(RenderOptionsPtr& render_options);
diff --git a/modules/io/src/mol/entity_io_crd_handler.cc b/modules/io/src/mol/entity_io_crd_handler.cc
index 194febcf7ac48fac35c02876670e37cc0aa83e0e..7ff0dc0f282677e0aede5d7ebaac41cb175dc7e1 100644
--- a/modules/io/src/mol/entity_io_crd_handler.cc
+++ b/modules/io/src/mol/entity_io_crd_handler.cc
@@ -244,12 +244,13 @@ mol::CoordGroupHandle LoadCHARMMTraj(const String& crd_fn,
 {
   Profile profile_load("LoadCHARMMTraj");
 
-  bool skip_flag = !(flags&0x1);
-  bool gap_flag = !(flags&0x2);
+  bool gap_flag = true;
 
   boost::filesystem::path crd_f(crd_fn);
   boost::filesystem::path trj_f(trj_fn);
 
+  
+
   // first the coordinate reference file
   conop::BuilderP builder = conop::Conopology::Instance().GetBuilder();  
   mol::EntityHandle ent=mol::CreateEntity();
@@ -295,6 +296,20 @@ mol::CoordGroupHandle LoadCHARMMTraj(const String& crd_fn,
     }
   }
 
+  bool skip_flag=false;
+
+  if(header.icntrl[19]!=0) { // CHARMM format
+    skip_flag=(header.icntrl[10]!=0);
+    if(skip_flag) {
+      LOGN_VERBOSE("LoadCHARMMTraj: using CHARMM format with per-frame header");
+    } else {
+      LOGN_VERBOSE("LoadCHARMMTraj: using CHARMM format");
+    }
+  } else {
+    // XPLOR format
+    LOGN_VERBOSE("LoadCHARMMTraj: using XPLOR format");
+  }
+
   if(gap_flag) ff.read(dummy,sizeof(dummy));
   ff.read(reinterpret_cast<char*>(&header.ntitle),sizeof(int));
   if(swap_flag) swap_int(&header.ntitle,1);