diff --git a/modules/io/pymod/export_mmcif_io.cc b/modules/io/pymod/export_mmcif_io.cc
index 2cdee1b9bfdf36026960a62377682c84128a5764..fb1fbe01cfdfcaf7e5eeda72b9baaba2dfe45207 100644
--- a/modules/io/pymod/export_mmcif_io.cc
+++ b/modules/io/pymod/export_mmcif_io.cc
@@ -26,6 +26,7 @@ using namespace boost::python;
 #include <ost/io/mol/io_profile.hh>
 #include <ost/io/mol/mmcif_reader.hh>
 #include <ost/io/mol/mmcif_info.hh>
+#include <ost/io/mol/star_writer.hh>
 #include <ost/io/mol/mmcif_writer.hh>
 #include <ost/io/mmcif_str.hh>
 using namespace ost;
@@ -56,6 +57,14 @@ boost::python::tuple WrapMMCifStringToEntity(const String& mmcif,
                                    std::get<2>(res));
 }
 
+void WrapStarLoopAddData(StarWriterLoop& sl, const boost::python::list& l) {
+  std::vector<StarWriterValue> v;
+  for (int i = 0; i < boost::python::len(l); ++i){
+    v.push_back(boost::python::extract<StarWriterValue>(l[i]));
+  }
+  sl.AddData(v);
+}
+
 void export_mmcif_io()
 {
   class_<MMCifReader, boost::noncopyable>("MMCifReader", init<const String&, EntityHandle&, const IOProfile&>())
@@ -76,10 +85,42 @@ void export_mmcif_io()
                                    return_value_policy<copy_const_reference>()))
     ;
 
-  class_<MMCifWriter, boost::noncopyable>("MMCifWriter", init<const String&, const IOProfile&>())
+  class_<StarWriterObject, boost::noncopyable>("StarWriterObject", no_init);
+
+  class_<StarWriterValue>("StarWriterValue", no_init)
+    .def("FromInt", &StarWriterValue::FromInt, (arg("int_val"))).staticmethod("FromInt")
+    .def("FromFloat", &StarWriterValue::FromFloat, (arg("float_val"), arg("decimals"))).staticmethod("FromFloat")
+    .def("FromString", &StarWriterValue::FromString, (arg("string_val"))).staticmethod("FromString")
+    .def("GetValue", &StarWriterValue::GetValue, return_value_policy<copy_const_reference>())
+  ;
+
+  class_<StarWriterDataItem, bases<StarWriterObject> >("StarWriterDataItem", init<const String&, const String&, const StarWriterValue&>())
+    .def("GetCategory", &StarWriterDataItem::GetCategory, return_value_policy<copy_const_reference>())
+    .def("GetAttribute", &StarWriterDataItem::GetAttribute, return_value_policy<copy_const_reference>())
+    .def("GetValue", &StarWriterDataItem::GetValue, return_value_policy<copy_const_reference>())
+  ;
+
+  class_<StarWriterLoopDesc, bases<StarWriterObject> >("StarWriterLoopDesc", init<const String&>())
+    .def("GetCategory", &StarWriterLoopDesc::GetCategory, return_value_policy<copy_const_reference>())
+    .def("GetSize", &StarWriterLoopDesc::GetSize)
+    .def("Add", &StarWriterLoopDesc::Add, (arg("attribute")))
+    .def("GetIndex", &StarWriterLoopDesc::GetIndex, (arg("attribute")))
+  ;
+
+  class_<StarWriterLoop, bases<StarWriterObject> >("StarWriterLoop", init<const StarWriterLoopDesc&>())
+    .def("GetDesc", &StarWriterLoop::GetDesc, return_value_policy<reference_existing_object>())
+    .def("GetN", &StarWriterLoop::GetN)
+    .def("AddData", &WrapStarLoopAddData, (arg("data_list")))
+  ;
+
+  class_<StarWriter, boost::noncopyable>("StarWriter", init<const String&>())
+    .def("Push", &StarWriter::Push, arg("star_writer_object"))
+    .def("Write", &StarWriter::Write, arg("data_name"))
+  ;
+
+  class_<MMCifWriter, boost::noncopyable, bases<StarWriter> >("MMCifWriter", init<const String&, const IOProfile&>())
     .def("SetStructure", &MMCifWriter::SetStructure, (arg("ent"), arg("mmcif_conform")=true))
-    .def("Write", &MMCifWriter::Write)
-    ;
+  ;
 
   enum_<MMCifInfoCitation::MMCifInfoCType>("MMCifInfoCType")
     .value("Journal", MMCifInfoCitation::JOURNAL)