diff --git a/modules/seq/base/tests/CMakeLists.txt b/modules/seq/base/tests/CMakeLists.txt
index cb7025d94340ac0bc096c9747f8e879ac78cf5e9..bb96ec008c5d896c8c1ee1f5db3f8a3b9cc018e4 100644
--- a/modules/seq/base/tests/CMakeLists.txt
+++ b/modules/seq/base/tests/CMakeLists.txt
@@ -1,5 +1,6 @@
 set(OST_SEQ_UNIT_TESTS
   test_sequence.cc
+  test_alignment.cc
   tests.cc
 )
 
diff --git a/modules/seq/base/tests/test_alignment.cc b/modules/seq/base/tests/test_alignment.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a11d1bc588f62e23af5594258b718bcc7d45fa89
--- /dev/null
+++ b/modules/seq/base/tests/test_alignment.cc
@@ -0,0 +1,223 @@
+//------------------------------------------------------------------------------
+// This file is part of the OpenStructure project <www.openstructure.org>
+//
+// Copyright (C) 2008-2010 by the OpenStructure authors
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License as published by the Free
+// Software Foundation; either version 3.0 of the License, or (at your option)
+// any later version.
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+// details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with this library; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//------------------------------------------------------------------------------
+#define BOOST_TEST_DYN_LINK
+#include <boost/test/unit_test.hpp>
+
+#include <ost/invalid_handle.hh>
+#include <ost/mol/mol.hh>
+#include <ost/seq/alignment_handle.hh>
+#include <ost/seq/aligned_region.hh>
+#include <ost/seq/sequence_handle.hh>
+#include <ost/seq/sequence_list.hh>
+#include <ost/seq/impl/sequence_list_impl.hh>
+#include <ost/seq/impl/sequence_impl.hh>
+#include <ost/seq/sequence_list.hh>
+
+using namespace ost;
+using namespace ost::seq;
+using namespace ost::mol;
+
+
+struct Fixture {
+  Fixture() {
+    eh = CreateEntity();
+    eh.SetName("TestEntity");
+    XCSEditor e=eh.RequestXCSEditor();
+    chain = e.InsertChain("A");
+    res1 = e.AppendResidue(chain, "ARG");
+    e.InsertAtom(res1, "CA",geom::Vec3(1,0,0));
+    res2 = e.AppendResidue(chain, "ARG");
+    e.InsertAtom(res2, "CA",geom::Vec3(0,1,0));
+    res3 = e.AppendResidue(chain, "ARG");
+    e.InsertAtom(res3, "CA",geom::Vec3(0,0,1));
+  }
+  EntityHandle eh;
+  ChainHandle  chain;
+  ResidueHandle res1;
+  ResidueHandle res2;
+  ResidueHandle res3;
+};
+
+BOOST_AUTO_TEST_SUITE( alignment )
+
+BOOST_AUTO_TEST_CASE(alignment_triv)
+{
+  AlignmentHandle a;
+  BOOST_CHECK_THROW(a.AddSequence(CreateSequence("S1","-asdf-")),InvalidHandle);
+  a = CreateAlignment();
+  BOOST_CHECK_NO_THROW(a.AddSequence(CreateSequence("S1","-asdf-")));
+  BOOST_CHECK_THROW(a.AddSequence(SequenceHandle()),InvalidSequence);
+  BOOST_CHECK_THROW(a.AddSequence(CreateSequence("S2","-asdf-f")),InvalidSequence);
+  SequenceList list = CreateSequenceList();
+  list.AddSequence(CreateSequence("S1", "-asdf-"));
+  list.AddSequence(CreateSequence("S2", "fasdfas"));
+  BOOST_CHECK_THROW(AlignmentFromSequenceList(list),InvalidAlignment);
+  list = CreateSequenceList();
+  list.AddSequence(CreateSequence("S1", "-asdf-"));
+  list.AddSequence(CreateSequence("S2", "fasdfa"));
+  BOOST_CHECK_NO_THROW(AlignmentFromSequenceList(list));
+}
+
+BOOST_AUTO_TEST_CASE(alignment_count_and_length)
+{
+  AlignmentHandle a = CreateAlignment();
+  BOOST_CHECK_EQUAL(a.GetCount(),0);
+  BOOST_CHECK_EQUAL(a.GetLength(),0);
+  a.AddSequence(CreateSequence("S1","asdf"));
+  BOOST_CHECK_EQUAL(a.GetCount(),1);
+  BOOST_CHECK_EQUAL(a.GetLength(),4);
+  a.AddSequence(CreateSequence("S2","qwer"));
+  BOOST_CHECK_EQUAL(a.GetCount(),2);
+  BOOST_CHECK_EQUAL(a.GetLength(),4);
+}
+
+BOOST_AUTO_TEST_CASE(alignment_onelettercode)
+{
+  AlignmentHandle a = CreateAlignment();
+  SequenceHandle seq1 = CreateSequence("S1","-a-sdf");
+  SequenceHandle seq2 = CreateSequence("S2","q--wer");
+  a.AddSequence(seq1);
+  a.AddSequence(seq2);
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(0,0),'-');
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(0,0),seq1.GetOneLetterCode(0));
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(1,0),'q');
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(1,0),seq2.GetOneLetterCode(0));
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(0,3),'s');
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(0,3),seq1.GetOneLetterCode(3));
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(1,3),'w');
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(1,3),seq2.GetOneLetterCode(3));
+  BOOST_CHECK_THROW(a.GetOneLetterCode(0,-1),Error);
+  BOOST_CHECK_THROW(a.GetOneLetterCode(1,6),Error);
+  BOOST_CHECK_THROW(a.GetOneLetterCode(2,0),Error);
+  BOOST_CHECK_THROW(a.GetOneLetterCode(-1,0),Error);
+}
+
+BOOST_AUTO_TEST_CASE(alignment_pos_and_index)
+{
+  AlignmentHandle a = CreateAlignment();
+  a.AddSequence(CreateSequence("S1","-a-sdf"));
+  a.AddSequence(CreateSequence("S2","q--wer"));
+  BOOST_CHECK_EQUAL(a.GetPos(0,1), 3);
+  BOOST_CHECK_EQUAL(a.GetResidueIndex(0,3), 1);
+  BOOST_CHECK_EQUAL(a.GetPos(1,2), 4);
+  BOOST_CHECK_EQUAL(a.GetResidueIndex(1,4), 2);
+  BOOST_CHECK_THROW(a.GetPos(0,-1),Error);
+  BOOST_CHECK_THROW(a.GetPos(1,4),Error);
+  BOOST_CHECK_THROW(a.GetPos(2,0),Error);
+  BOOST_CHECK_THROW(a.GetPos(-1,0),Error);
+}
+
+BOOST_AUTO_TEST_CASE(alignment_getseq)
+{
+  AlignmentHandle a = CreateAlignment();
+  SequenceHandle seq1 = CreateSequence("S1","-a-sdf");
+  SequenceHandle seq2 = CreateSequence("S2","q--wer");
+  a.AddSequence(seq1);
+  a.AddSequence(seq2);
+  BOOST_CHECK_EQUAL(a.GetSequence(0), seq1);
+  BOOST_CHECK_EQUAL(a.GetSequence(1), seq2);
+  BOOST_CHECK_THROW(a.GetSequence(-1), Error);
+  BOOST_CHECK_THROW(a.GetSequence(2), Error);
+}
+
+BOOST_AUTO_TEST_CASE(alignment_attach_view)
+{
+  Fixture f;
+  EntityView v = f.eh.CreateFullView();
+  EntityView v2 = f.eh.CreateFullView();
+
+  AlignmentHandle a = CreateAlignment();
+  SequenceHandle seq1 = CreateSequence("S1","r-r");
+  SequenceHandle seq2 = CreateSequence("S2","aa-");
+  a.AddSequence(seq1);
+  a.AddSequence(seq2);
+  a.AttachView(0,v);
+  a.AttachView(1,v2);
+  BOOST_CHECK_EQUAL(a.GetResidue(0,0), f.res1);
+  BOOST_CHECK_EQUAL(a.GetResidue(0,2), f.res3);
+  BOOST_CHECK_EQUAL(a.GetResidue(1,0), f.res1);
+  BOOST_CHECK_EQUAL(a.GetResidue(1,1), f.res2);
+  BOOST_CHECK_NO_THROW(a.AttachView(0,EntityView()));
+  BOOST_CHECK_EQUAL(a.GetResidue(0,1), EntityView());
+  BOOST_CHECK_EQUAL(a.GetResidue(0,3), EntityView());
+  BOOST_CHECK_THROW(a.GetResidue(-1,0),Error)
+}
+
+BOOST_AUTO_TEST_CASE(alignment_cut)
+{
+  AlignmentHandle a = CreateAlignment();
+  SequenceHandle seq1 = CreateSequence("S1","r-r");
+  SequenceHandle seq2 = CreateSequence("S2","aa-");
+  a.AddSequence(seq1);
+  a.AddSequence(seq2);
+  a.Cut(1,2);
+  BOOST_CHECK_EQUAL(a.GetLength(),2);
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(0,0),'r');
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(0,1),'r');
+  BOOST_CHECK_THROW(a.GetOneLetterCode(0,2),Error);
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(1,0),'a');
+  BOOST_CHECK_EQUAL(a.GetOneLetterCode(1,1),'-');
+  BOOST_CHECK_THROW(a.GetOneLetterCode(1,2),Error);
+}
+
+BOOST_AUTO_TEST_CASE(alignment_shift_region)
+{
+  AlignmentHandle a = CreateAlignment();
+  SequenceHandle seq1 = CreateSequence("S1","abcdef");
+  SequenceHandle seq2 = CreateSequence("S2","ghijkl");
+  a.AddSequence(seq1);
+  a.AddSequence(seq2);
+  a.ShiftRegion(2, 4, 2);
+  BOOST_CHECK_EQUAL(a.GetSequence(0).GetString(),"abefcd");
+  BOOST_CHECK_EQUAL(a.GetSequence(1).GetString(),"ghklij");
+
+  a.ShiftRegion(2, 2, 2);//Shift nothing
+  BOOST_CHECK_EQUAL(a.GetSequence(0).GetString(),"abefcd");
+
+  a.ShiftRegion(2,3,1,1);
+  BOOST_CHECK_EQUAL(a.GetSequence(0).GetString(),"abefcd");
+  BOOST_CHECK_EQUAL(a.GetSequence(1).GetString(),"ghlkij");
+
+  BOOST_CHECK_THROW(a.ShiftRegion(0,2,1,2),Error);
+  BOOST_CHECK_THROW(a.ShiftRegion(0,2,1,-2),Error);
+
+  BOOST_CHECK_THROW(a.ShiftRegion(0,2,-1),std::out_of_range);
+  BOOST_CHECK_THROW(a.ShiftRegion(0,5,2),std::out_of_range);
+}
+
+BOOST_AUTO_TEST_CASE(alignment_aligned_region)
+{
+  AlignmentHandle a = CreateAlignment();
+  SequenceHandle seq1 = CreateSequence("S1","abcdef");
+  SequenceHandle seq2 = CreateSequence("S2","ghijkl");
+  a.AddSequence(seq1);
+  a.AddSequence(seq2);
+  AlignedRegion ar = a.MakeRegion(1,2,0);
+  BOOST_CHECK_EQUAL(ar.GetLength(),2);
+  BOOST_CHECK_EQUAL(ar.GetStart(),1);
+  BOOST_CHECK_EQUAL(ar.GetEnd(),3);
+
+  BOOST_CHECK_THROW(ar = a.MakeRegion(-1,2,0),std::out_of_range);
+  BOOST_CHECK_THROW(ar = a.MakeRegion(0,6,0),std::out_of_range);
+  BOOST_CHECK_THROW(ar = a.MakeRegion(2,4,0),std::out_of_range);
+  BOOST_CHECK_THROW(ar = a.MakeRegion(3,2,0),std::out_of_range);
+  BOOST_CHECK_THROW(ar = a.MakeRegion(3,3,0),std::out_of_range);
+}
+
+BOOST_AUTO_TEST_SUITE_END()