diff --git a/modules/io/pymod/export_mmcif_io.cc b/modules/io/pymod/export_mmcif_io.cc
index c192630ad95cb9a1e1d40699fa3278d36350d01d..de498d38271fa4696a9aab3e62451db238578846 100644
--- a/modules/io/pymod/export_mmcif_io.cc
+++ b/modules/io/pymod/export_mmcif_io.cc
@@ -65,6 +65,11 @@ void WrapStarLoopAddData(StarWriterLoop& sl, const boost::python::list& l) {
   sl.AddData(v);
 }
 
+void WrapStarWriterWrite(StarWriter& writer, const String& data_name,
+                         const String& filename) {
+  writer.Write(data_name, filename);
+}
+
 void export_mmcif_io()
 {
   class_<MMCifReader, boost::noncopyable>("MMCifReader", init<const String&, EntityHandle&, const IOProfile&>())
@@ -113,12 +118,12 @@ void export_mmcif_io()
     .def("AddData", &WrapStarLoopAddData, (arg("data_list")))
   ;
 
-  class_<StarWriter, boost::noncopyable>("StarWriter", init<const String&>())
+  class_<StarWriter>("StarWriter", init<>())
     .def("Push", &StarWriter::Push, arg("star_writer_object"))
-    .def("Write", &StarWriter::Write, arg("data_name"))
+    .def("Write", &WrapStarWriterWrite, (arg("data_name"), arg("filename")))
   ;
 
-  class_<MMCifWriter, boost::noncopyable, bases<StarWriter> >("MMCifWriter", init<const String&>())
+  class_<MMCifWriter, bases<StarWriter> >("MMCifWriter", init<>())
     .def("SetStructure", &MMCifWriter::SetStructure, (arg("ent"), arg("mmcif_conform")=true))
   ;
 
diff --git a/modules/io/src/mol/mmcif_writer.cc b/modules/io/src/mol/mmcif_writer.cc
index 79ff70034b3f9cee9f944f2cbc1cefb9d12a2f0d..bcefc0ea1dc948d4d45f4a2293dded97b67f4585 100644
--- a/modules/io/src/mol/mmcif_writer.cc
+++ b/modules/io/src/mol/mmcif_writer.cc
@@ -1400,10 +1400,6 @@ int MMCifWriterEntity::GetAsymIdx(const String& asym_id) const {
   throw ost::io::IOException(err);  
 }
 
-MMCifWriter::MMCifWriter(const String& filename):
-  StarWriter(filename),
-  structure_set_(false) { }
-
 void MMCifWriter::SetStructure(const ost::mol::EntityHandle& ent,
                                bool mmcif_conform) {
 
diff --git a/modules/io/src/mol/mmcif_writer.hh b/modules/io/src/mol/mmcif_writer.hh
index 3ff8cbffdebeeed159a7c9843dac1a9d8ef96435..cc44706df3479edd944ec298f5231de94a03449e 100644
--- a/modules/io/src/mol/mmcif_writer.hh
+++ b/modules/io/src/mol/mmcif_writer.hh
@@ -69,7 +69,7 @@ struct MMCifWriterEntity {
 class DLLEXPORT_OST_IO MMCifWriter : public StarWriter {
 public:
 
-  MMCifWriter(const String& filename);
+  MMCifWriter(): structure_set_(false) { }
 
   virtual ~MMCifWriter() { }
 
diff --git a/modules/io/src/mol/star_writer.cc b/modules/io/src/mol/star_writer.cc
index b06270bb8cd2f75c0a75a71107d45fd49be8fa6d..4b64bd370f4deb824bd72b7101a250472ca9c5b2 100644
--- a/modules/io/src/mol/star_writer.cc
+++ b/modules/io/src/mol/star_writer.cc
@@ -25,39 +25,37 @@
 
 namespace ost{ namespace io{
 
-StarWriter::StarWriter(std::ostream& stream): filename_("<stream>") {
+void StarWriter::Write(const String& data_name, std::ostream& stream) {
   if(!stream) {
     std::stringstream ss;
     ss << "Cannot open stream: [Errno " << errno << "] "
        << strerror(errno) << std::endl;
     throw IOException(ss.str());
   }
-  stream_.push(stream);
+  // write data header
+  stream << "data_" << data_name << std::endl;
+  // write StarWriterObjects
+  for(auto star_obj : categories_to_write_) {
+    star_obj->ToStream(stream);
+    stream << String("#") << std::endl;
+  }
 }
 
 
-StarWriter::StarWriter(const String& filename): filename_(filename),
-                                                fstream_(filename.c_str()) {
-  if (!fstream_) {
+void StarWriter::Write(const String& data_name, const String& filename) {
+  std::ofstream fstream(filename.c_str());
+  if (!fstream) {
     std::stringstream ss;
-    ss << "Cannot open " << filename_ << ": [Errno " << errno << "] "
+    ss << "Cannot open " << filename << ": [Errno " << errno << "] "
        << strerror(errno) << std::endl;
     throw IOException(ss.str());
   }
+  boost::iostreams::filtering_stream<boost::iostreams::output> stream;
   if (boost::iequals(".gz", boost::filesystem::extension(filename))) {
-    stream_.push(boost::iostreams::gzip_compressor());
-  }
-  stream_.push(fstream_);
-}
-
-void StarWriter::Write(const String& data_name) {
-  // write data header
-  stream_ << "data_" << data_name << std::endl;
-
-  for(auto star_obj : categories_to_write_) {
-    star_obj->ToStream(stream_);
-    stream_ << String("#") << std::endl;
+    stream.push(boost::iostreams::gzip_compressor());
   }
+  stream.push(fstream);
+  this->Write(data_name, stream);
 }
 
 }} // ns
diff --git a/modules/io/src/mol/star_writer.hh b/modules/io/src/mol/star_writer.hh
index ea4a396d3a3e4d2163235da3dc00ba305dbf06f9..dd8cb5a2acf1feaa27154eb5c6101b4c9908882b 100644
--- a/modules/io/src/mol/star_writer.hh
+++ b/modules/io/src/mol/star_writer.hh
@@ -228,16 +228,15 @@ private:
 
 class DLLEXPORT_OST_IO StarWriter {
 public:
-  StarWriter(std::ostream& stream);
-  StarWriter(const String& filename);
+  StarWriter() { }
   virtual ~StarWriter() { }
 
   void Push(StarWriterObjectPtr obj) { categories_to_write_.push_back(obj); }
-  void Write(const String& data_name);
+
+  void Write(const String& data_name, const String& filename);
+  void Write(const String& data_name, std::ostream& stream);
+
 private:
-  String filename_;
-  std::ofstream fstream_;
-  boost::iostreams::filtering_stream<boost::iostreams::output> stream_;
   std::vector<StarWriterObjectPtr> categories_to_write_;
 };