diff --git a/src/morphism_base_sugared.rs b/src/morphism_base_sugared.rs
index 1fb1dcf..93d3b10 100644
--- a/src/morphism_base_sugared.rs
+++ b/src/morphism_base_sugared.rs
@@ -48,7 +48,7 @@ impl<M: SugaredMorphism + Clone> SugaredMorphismBase<M> {
 
         match (src_floor, dst_floor) {
             (SugaredTypeTerm::Struct{ struct_repr: struct_repr_lhs, members: members_lhs},
-                SugaredTypeTerm::Struct { struct_repr: _struct_repr_rhs, members: members_rhs })
+                SugaredTypeTerm::Struct { struct_repr: struct_repr_rhs, members: members_rhs })
             => {
                 // todo: optimization: check if struct repr match
 
@@ -84,7 +84,8 @@ impl<M: SugaredMorphism + Clone> SugaredMorphismBase<M> {
                 if ! failed && necessary {
                     Some(MorphismInstance2::MapStruct {
                         ψ: src_ψ,
-                        struct_repr: struct_repr_lhs.clone(),
+                        src_struct_repr: struct_repr_lhs.clone(),
+                        dst_struct_repr: struct_repr_rhs.clone(),
                         member_morph
                     })
                 } else {
diff --git a/src/morphism_sugared.rs b/src/morphism_sugared.rs
index f9c36eb..4d6a521 100644
--- a/src/morphism_sugared.rs
+++ b/src/morphism_sugared.rs
@@ -168,7 +168,8 @@ pub enum MorphismInstance2<M: SugaredMorphism + Clone> {
     },
     MapStruct{
         ψ: SugaredTypeTerm,
-        struct_repr: Option<Box<SugaredTypeTerm>>,
+        src_struct_repr: Option<Box<SugaredTypeTerm>>,
+        dst_struct_repr: Option<Box<SugaredTypeTerm>>,
         member_morph: Vec< (String, MorphismInstance2<M>) >
     },
     MapEnum{
@@ -204,14 +205,15 @@ impl<M: SugaredMorphism + Clone> MorphismInstance2<M> {
             }
             MorphismInstance2::Chain { path } => {
                 if path.len() > 0 {
+                    let s = self.get_subst();
                     SugaredMorphismType {
-                        src_type: path.first().unwrap().get_type().src_type,
-                        dst_type: path.last().unwrap().get_type().dst_type
+                        src_type: path.first().unwrap().get_type().src_type.clone().apply_subst(&s).clone(),
+                        dst_type: path.last().unwrap().get_type().dst_type.clone().apply_subst(&s).clone()
                     }
                 } else {
                     SugaredMorphismType {
-                        src_type: SugaredTypeTerm::TypeID(TypeID::Var(45454)),
-                        dst_type: SugaredTypeTerm::TypeID(TypeID::Var(45454))
+                        src_type: SugaredTypeTerm::TypeID(TypeID::Fun(45454)),
+                        dst_type: SugaredTypeTerm::TypeID(TypeID::Fun(45454))
                     }
                 }
             }
@@ -229,11 +231,11 @@ impl<M: SugaredMorphism + Clone> MorphismInstance2<M> {
                     ]).strip()
                 }
             }
-            MorphismInstance2::MapStruct { ψ, struct_repr, member_morph } => {
+            MorphismInstance2::MapStruct { ψ, src_struct_repr, dst_struct_repr, member_morph } => {
                 SugaredMorphismType {
                     src_type: SugaredTypeTerm::Ladder(vec![ ψ.clone(),
                             SugaredTypeTerm::Struct{
-                                struct_repr: struct_repr.clone(),
+                                struct_repr: src_struct_repr.clone(),
                                 members:
                                     member_morph.iter().map(|(symbol, morph)| {
                                        SugaredStructMember{ symbol:symbol.clone(), ty: morph.get_type().src_type }
@@ -242,7 +244,7 @@ impl<M: SugaredMorphism + Clone> MorphismInstance2<M> {
                         ]).strip(),
                     dst_type: SugaredTypeTerm::Ladder(vec![ ψ.clone(),
                             SugaredTypeTerm::Struct{
-                                struct_repr: struct_repr.clone(),
+                                struct_repr: dst_struct_repr.clone(),
                                 members: member_morph.iter().map(|(symbol, morph)| {
                                     SugaredStructMember { symbol: symbol.clone(), ty: morph.get_type().dst_type}
                                 }).collect()
@@ -289,7 +291,7 @@ impl<M: SugaredMorphism + Clone> MorphismInstance2<M> {
             MorphismInstance2::MapSeq { ψ, seq_repr, item_morph } => {
                 item_morph.get_subst()
             },
-            MorphismInstance2::MapStruct { ψ, struct_repr, member_morph } => {
+            MorphismInstance2::MapStruct { ψ, src_struct_repr, dst_struct_repr, member_morph } => {
                 let mut σ = HashMap::new();
                 for (symbol, m) in member_morph.iter() {
                     σ = σ.append(&mut m.get_subst());
@@ -318,7 +320,7 @@ impl<M: SugaredMorphism + Clone> MorphismInstance2<M> {
                 ψ.apply_subst(γ);
                 item_morph.apply_subst(γ);
             }
-            MorphismInstance2::MapStruct { ψ, struct_repr, member_morph } => {
+            MorphismInstance2::MapStruct { ψ, src_struct_repr, dst_struct_repr, member_morph } => {
                 for (_,ty) in member_morph {
                     ty.apply_subst(γ);
                 }