diff --git a/modules/geom/src/vec3.cc b/modules/geom/src/vec3.cc
index a21d150d620c3632355b906adfbdbc44d22131e3..84467ced5a4ddf66dd5ae23e1de054c7cb8e175d 100644
--- a/modules/geom/src/vec3.cc
+++ b/modules/geom/src/vec3.cc
@@ -48,11 +48,11 @@ Mat3 Vec3List::GetInertia() const
 Mat3 Vec3List::GetPrincipalAxes() const
 {
   Mat3 inertia=this->GetInertia();  
-  EMat3 inertia_mat(*reinterpret_cast<EMat3*>(&inertia));
+  EMat3 inertia_mat(inertia.Data());
 
   Eigen::SVD<EMat3> svd(inertia_mat);
   EMat3 rot=svd.matrixU();
-  Mat3 axes(*reinterpret_cast<Mat3*>(&rot));
+  Mat3 axes(rot.data());
   return axes;
 }
 
diff --git a/modules/mol/alg/src/superpose_frames.cc b/modules/mol/alg/src/superpose_frames.cc
index defe8a324a896c8b18b03aec68f1aec7a50ff001..aafec9d78f986b69b08f0c2e12c160e48a680bec 100644
--- a/modules/mol/alg/src/superpose_frames.cc
+++ b/modules/mol/alg/src/superpose_frames.cc
@@ -35,26 +35,26 @@ typedef Eigen::Matrix<Real, Eigen::Dynamic, 3> EMatX3;
 
 
 inline geom::Vec3 rvec_to_gvec(const ERVec3 &vec) {
-  return *reinterpret_cast<const geom::Vec3*>(&vec);
+  return geom::Vec3(vec.data());
 }
 
 inline geom::Vec3 cvec_to_gvec(const ECVec3 &vec) {
-  return *reinterpret_cast<const geom::Vec3*>(&vec);
+  return geom::Vec3(vec.data());
 }
 
 inline geom::Mat3 emat_to_gmat(const EMat3 &mat)
 {
-  return *reinterpret_cast<const geom::Mat3*>(&mat);
+  return geom::Mat3(mat.data());
 }
 
 inline ERVec3 gvec_to_rvec(const geom::Vec3 &vec)
 {
-  return *reinterpret_cast<const ERVec3*>(&vec);
+  return ERVec3(&vec[0]);
 }
 
 inline ECVec3 gvec_to_cvec(const geom::Vec3 &vec)
 {
-  return *reinterpret_cast<const ECVec3*>(&vec);
+  return ECVec3(&vec[0]);
 }
 
 inline EMat3X row_sub(const EMat3X& m, const ERVec3& s)
diff --git a/modules/mol/alg/src/svd_superpose.cc b/modules/mol/alg/src/svd_superpose.cc
index ef3d4de2538e7a86db94ba4602c2be0e08b0ccc5..22fa34c1d8c48a9aa370d006a3ab68a5276af091 100644
--- a/modules/mol/alg/src/svd_superpose.cc
+++ b/modules/mol/alg/src/svd_superpose.cc
@@ -152,58 +152,24 @@ SuperposerSVD::SuperposerSVD(int natoms, bool alloc_atoms):
   
 }
 
-geom::Vec3 SuperposerSVDImpl::EigenVec3ToVec3(const EVec3 &vec){
-#if  defined _MSC_VER
-  geom::Vec3 myvec3;
-  for (int i=0; i<3; ++i) {
-      myvec3[i]=vec[i]; 
-  }
-  return myvec3;
-#else
-  return *reinterpret_cast<const geom::Vec3*>(&vec);
-#endif
+geom::Vec3 SuperposerSVDImpl::EigenVec3ToVec3(const EVec3 &vec)
+{
+  return geom::Vec3(vec.data());
 }
 
 geom::Mat3 SuperposerSVDImpl::EigenMat3ToMat3(const EMat3 &mat)
 {
-#if  defined _MSC_VER
-  geom::Mat3 mymat3;
-  for (int i=0; i<3; ++i) {
-    for (int j=0; j<3; ++j) {    
-      mymat3(j,i)=mat(i,j); 
-    }
-  }
-  return mymat3;
-#else
-  return *reinterpret_cast<const geom::Mat3*>(&mat);
-#endif
-
+  return geom::Mat3(mat.data());
 }
 
 EVec3 SuperposerSVDImpl::Vec3ToEigenRVec(const geom::Vec3 &vec)
 {
-#if  defined _MSC_VER
-  EVec3 myvec3=EVec3::Zero();
-  for (int counter=0; counter<3; ++counter) {
-    myvec3[counter]=vec[counter];
-  }
-  return myvec3;
-#else
-  return *reinterpret_cast<const ERVec3*>(&vec);
-#endif
+  return EVec3(&vec[0]);
 }
 
 EVec3 SuperposerSVDImpl::Vec3ToEigenVec(const geom::Vec3 &vec)
 {
-#if  defined _MSC_VER
-  EVec3 myvec3=EVec3::Zero();
-  for (int counter=0; counter<3; ++counter) {
-    myvec3[counter]=vec[counter];
-  }
-  return myvec3;
-#else
-  return *reinterpret_cast<const EVec3*>(&vec);  
-#endif
+  return EVec3(&vec[0]);
 }
 
 EMatX SuperposerSVDImpl::SubtractVecFromMatrixRows(EMatX Mat,
diff --git a/modules/seq/alg/src/merge_pairwise_alignments.cc b/modules/seq/alg/src/merge_pairwise_alignments.cc
index 6bba7edd06e48c707e815b0eded56b1226a32fe5..5636f32c97af7b96297663f75d6456abf954a4d4 100644
--- a/modules/seq/alg/src/merge_pairwise_alignments.cc
+++ b/modules/seq/alg/src/merge_pairwise_alignments.cc
@@ -38,7 +38,7 @@ void update_shifts(const AlignmentHandle& aln,
                    ShiftMap& shifts)
 {
   ConstSequenceHandle s1=aln.GetSequence(0);  
-  if (s1.GetGaplessString()!=ref_seq.GetString()) {
+  if (!Match(s1.GetGaplessString(), ref_seq.GetString())) {
     throw IntegrityError("The gapless version of '"+s1.GetString()+
                          "' is not identical to the reference sequence.");
   }
diff --git a/modules/seq/base/doc/seq.rst b/modules/seq/base/doc/seq.rst
index f42a2f574c7afff92265932553bbe3c6d85f96b9..64ac6d3a7d974446f95657f30748d3ddc508f325 100644
--- a/modules/seq/base/doc/seq.rst
+++ b/modules/seq/base/doc/seq.rst
@@ -184,7 +184,7 @@ The SequenceHandle
 
   .. attribute:: offset
   
-    Shorthand for :meth:`GetSequenceOffset`/:meth:`SetSequenceOffset`
+    Shorthand for :meth:`GetOffset`/:meth:`SetOffset`
 
   .. method:: __len__()
     
@@ -194,6 +194,16 @@ The SequenceHandle
 
     Returns the sequence as a string.
 
+.. function:: Match(s1, s2)
+
+  :param s1: The first sequence
+  :param s2: The second sequence
+  :type s1: :class:`SequenceHandle`, or :class:`str`
+  :type s2: :class:`SequenceHandle`, or :class:`str`
+
+  Check whether the two sequences s1 and s2 match. This function performs are
+  case-insensitive comparison of the two sequences. The character  'X' is
+  interpreted as a wildcard character that always matches the other sequence.
 
 The SequenceList    
 --------------------------------------------------------------------------------
diff --git a/modules/seq/base/pymod/export_sequence.cc b/modules/seq/base/pymod/export_sequence.cc
index c72fe3ae8e65f0f65d78e6751d57655b61711eb4..6db4d304e88f968afd3d51ef1f63f79c940dd1a6 100644
--- a/modules/seq/base/pymod/export_sequence.cc
+++ b/modules/seq/base/pymod/export_sequence.cc
@@ -50,6 +50,8 @@ void (AlignmentHandle::*attach_view_b)(int, const mol::EntityView&,
 SequenceHandle (*seq_from_chain_a)(const String&,const mol::ChainView&)=&SequenceFromChain;
 SequenceHandle (*seq_from_chain_b)(const String&,const mol::ChainHandle&)=&SequenceFromChain;
 
+bool (*m1)(const String&, const String&)=&Match;
+bool (*m2)(const ConstSequenceHandle&, const ConstSequenceHandle&)=&Match;
 template <typename T>
 T do_slice(const T& t, slice& sl) {
   int start=0, end=t.GetCount();
@@ -270,6 +272,8 @@ void export_sequence()
     .add_property("offset", &SequenceHandle::GetOffset,
                   &SequenceHandle::SetOffset)
   ;
+  def("Match", m1);
+  def("Match", m2);
 
   implicitly_convertible<SequenceHandle, ConstSequenceHandle>();
   
diff --git a/modules/seq/base/src/sequence_handle.cc b/modules/seq/base/src/sequence_handle.cc
index caeccfaececda45b3f61efc37f44201385607523..62539237a9a7dfe0de1105bb647f1dd5b08f2a40 100644
--- a/modules/seq/base/src/sequence_handle.cc
+++ b/modules/seq/base/src/sequence_handle.cc
@@ -407,4 +407,25 @@ char SequenceHandle::operator[](size_t index) const
   return this->GetString()[index];
 }
 
+
+bool Match(const ConstSequenceHandle& s1, const ConstSequenceHandle& s2)
+{
+  return Match(s1.GetString(), s2.GetString());
+}
+
+bool Match(const String& s1, const String& s2)
+{
+  if (s1.size()!=s2.size()) {
+    return false;
+  }
+  for (size_t i=0; i<s1.size(); ++i) {
+    char c1=s1[i];
+    char c2=s2[i];
+    if (toupper(c1)!=toupper(c2) && toupper(c1)!='X' && toupper(c2)!='X') {
+      return false;
+    }
+  }
+  return true;
+}
+
 }}
diff --git a/modules/seq/base/src/sequence_handle.hh b/modules/seq/base/src/sequence_handle.hh
index a84e1b18db19cef0b35a4e2cdf1d8f954d458fec..3b3f1b1abf471f151cf79179248150960514fcc3 100644
--- a/modules/seq/base/src/sequence_handle.hh
+++ b/modules/seq/base/src/sequence_handle.hh
@@ -304,6 +304,12 @@ SequenceHandle DLLEXPORT_OST_SEQ SequenceFromInfo(info::InfoGroup& group);
 
 DLLEXPORT_OST_SEQ std::ostream& operator<<(std::ostream& os, 
                                            const ConstSequenceHandle& sequence);
+
+bool DLLEXPORT_OST_SEQ Match(const ConstSequenceHandle& s1,
+                             const ConstSequenceHandle& s2);
+
+bool DLLEXPORT_OST_SEQ Match(const String& s1,
+                             const String& s2);
 }}
 
 #endif
diff --git a/modules/seq/base/tests/test_sequence.cc b/modules/seq/base/tests/test_sequence.cc
index 87669a644335e9e101c4c638d32b51e51344708d..3c418443503c2d94552e2571f85c9037d2821df7 100644
--- a/modules/seq/base/tests/test_sequence.cc
+++ b/modules/seq/base/tests/test_sequence.cc
@@ -65,6 +65,15 @@ BOOST_AUTO_TEST_CASE(seq_triv)
   BOOST_CHECK_THROW(s.SetString("1"), InvalidSequence);
 }
 
+BOOST_AUTO_TEST_CASE(match)
+{
+  BOOST_CHECK(Match("abcdefghijkl", "ABcDeFgHiJkL"));
+  BOOST_CHECK(Match("abcxXxxxxjXl", "ABcDeFgHiJkL"));
+  BOOST_CHECK(Match("ABcDeFgHiJkL", "ABcDeFXxiJxL"));
+  BOOST_CHECK(!Match("abc", "abcd"));
+  BOOST_CHECK(!Match("abc", "aby"));
+}
+
 BOOST_AUTO_TEST_CASE(seq_throw_invalid)
 {
   SequenceHandle s;