--- /dev/null
+import kernel
+
+class A
+ init ca
+ do
+ 'A'.output
+ end
+
+ init ca2
+ do
+ 'A'.output
+ '2'.output
+ end
+
+ meth foo
+ do
+ 'a'.output
+ '\n'.output
+ end
+end
+
+class B
+special A
+ init cb
+ do
+ 'B'.output
+ '{'.output
+ ca
+ '}'.output
+ end
+
+ redef meth foo
+ do
+ 'b'.output
+ super
+ end
+end
+
+class C
+special B
+ init cc
+ do
+ 'C'.output
+ '{'.output
+ cb
+ '}'.output
+ end
+
+ redef meth foo
+ do
+ 'c'.output
+ super
+ end
+end
+
+class M
+special A
+ redef meth foo
+ do
+ 'm'.output
+ super
+ end
+end
+
+class N
+special B
+special M
+ redef meth foo
+ do
+ 'n'.output
+ super
+ end
+end
+
+class O
+special N
+special C
+ init co
+ do
+ 'O'.output
+ '{'.output
+ cc
+ '}'.output
+ end
+ redef meth foo
+ do
+ 'o'.output
+ super
+ end
+end
+
+(new A.ca).foo
+(new A.ca2).foo
+(new B.cb).foo
+#alt1#(new B.ca).foo
+#alt1#(new B.ca2).foo
+(new C.cc).foo
+#alt1#(new C.ca).foo
+#alt1#(new C.ca2).foo
+#alt1#(new C.cb).foo
+(new M.ca).foo
+(new M.ca2).foo
+(new N.cb).foo
+#alt1#(new N.ca).foo
+#alt1#(new N.ca2).foo
+(new O.co).foo
+#alt1#(new O.ca).foo
+#alt1#(new O.ca2).foo
+#alt1#(new O.cb).foo
+#alt1#(new O.cc).foo
+
--- /dev/null
+import kernel
+
+class A
+ init ca
+ do
+ 'A'.output
+ end
+
+ meth foo
+ do
+ 'a'.output
+ '\n'.output
+ end
+end
+
+class B
+special A
+#alt1# init cb
+#alt1# do
+#alt1# 'B'.output
+#alt1# '{'.output
+#alt1# ca
+#alt1# '}'.output
+#alt1# end
+
+#alt3# init cb
+#alt3# do
+#alt3# 'B'.output
+#alt3# '{'.output
+#alt3# ca
+#alt3# '}'.output
+#alt3# end
+
+ redef meth foo
+ do
+ 'b'.output
+ super
+ end
+end
+
+class C
+special A
+#alt2# init cc
+#alt2# do
+#alt2# 'C'.output
+#alt2# '{'.output
+#alt2# ca
+#alt2# '}'.output
+#alt2# end
+
+#alt3# init cc
+#alt3# do
+#alt3# 'C'.output
+#alt3# '{'.output
+#alt3# ca
+#alt3# '}'.output
+#alt3# end
+
+ redef meth foo
+ do
+ 'c'.output
+ super
+ end
+end
+
+class M
+special C
+ redef meth foo
+ do
+ 'm'.output
+ super
+ end
+end
+
+class N
+special B
+special M
+ redef meth foo
+ do
+ 'n'.output
+ super
+ end
+end
+
+(new A.ca).foo
+#alt0#(new B.ca).foo
+#alt1#(new B.cb).foo
+#alt2#(new B.ca).foo
+#alt0#(new C.ca).foo
+#alt1#(new C.ca).foo
+#alt2#(new C.cc).foo
+#alt0#(new M.ca).foo
+#alt1#(new M.ca).foo
+#alt2#(new M.cc).foo
+#alt0#(new N.ca).foo
+#alt1#(new N.cb).foo
+#alt2#(new N.cc).foo
+
+
--- /dev/null
+import kernel
+
+class A
+ init ca
+ do
+ 'A'.output
+ end
+
+ meth foo
+ do
+ 'a'.output
+ '\n'.output
+ end
+end
+
+class M
+special A
+ redef meth foo
+ do
+ 'm'.output
+ super
+ end
+end
+
+class B
+special A
+ init cb
+ do
+ 'B'.output
+ '{'.output
+ ca
+ '}'.output
+ end
+
+ redef meth foo
+ do
+ 'b'.output
+ super
+ end
+end
+
+class N
+special A
+ redef meth foo
+ do
+ 'n'.output
+ super
+ end
+end
+
+class O
+special M
+special B
+ redef meth foo
+ do
+ 'o'.output
+ super
+ end
+end
+
+class P
+special B
+special N
+ redef meth foo
+ do
+ 'p'.output
+ super
+ end
+end
+
+class Q
+#alt0#special M
+#alt0#special B
+#alt0#special N
+
+#alt1#special O
+#alt1#special N
+
+#alt2#special M
+#alt2#special P
+
+#alt3#special O
+#alt3#special P
+ redef meth foo
+ do
+ 'q'.output
+ super
+ end
+end
+
+(new A.ca).foo
+(new M.ca).foo
+(new B.cb).foo
+(new N.ca).foo
+(new O.cb).foo
+(new P.cb).foo
+(new Q.cb).foo
+
--- /dev/null
+import kernel
+
+redef interface Object
+
+ meth foo
+ do
+ 'a'.output
+ '\n'.output
+ end
+end
+
+interface M
+ redef meth foo
+ do
+ 'm'.output
+ super
+ end
+end
+
+class B
+ init cb
+ do
+ 'B'.output
+ end
+
+ redef meth foo
+ do
+ 'b'.output
+ super
+ end
+end
+
+interface N
+ redef meth foo
+ do
+ 'n'.output
+ super
+ end
+end
+
+class O
+special M
+special B
+ redef meth foo
+ do
+ 'o'.output
+ super
+ end
+end
+
+class P
+special B
+special N
+ redef meth foo
+ do
+ 'p'.output
+ super
+ end
+end
+
+class Q
+#alt0#special M
+#alt0#special B
+#alt0#special N
+
+#alt1#special O
+#alt1#special N
+
+#alt2#special M
+#alt2#special P
+
+#alt3#special O
+#alt3#special P
+ redef meth foo
+ do
+ 'q'.output
+ super
+ end
+end
+
+(new B.cb).foo
+(new O.cb).foo
+(new P.cb).foo
+(new Q.cb).foo
+
--- /dev/null
+import kernel
+
+class A
+ init ca(a: Char)
+ do
+ 'A'.output
+ a.output
+ end
+
+ meth foo
+ do
+ 'a'.output
+ '\n'.output
+ end
+end
+
+class B
+special A
+ init cb(a, b: Char)
+ do
+ 'B'.output
+ b.output
+ '{'.output
+ ca(a)
+ '}'.output
+ end
+
+ redef meth foo
+ do
+ 'b'.output
+ super
+ end
+end
+
+class C
+special B
+ init cc(a,b,c: Char)
+ do
+ 'C'.output
+ c.output
+ '{'.output
+ cb(a,b)
+ '}'.output
+ end
+
+ redef meth foo
+ do
+ 'c'.output
+ super
+ end
+end
+
+class M
+special A
+ redef meth foo
+ do
+ 'm'.output
+ super
+ end
+end
+
+class N
+special B
+special M
+ redef meth foo
+ do
+ 'n'.output
+ super
+ end
+end
+
+class O
+special N
+special C
+ init co(a,b,c,o: Char)
+ do
+ 'O'.output
+ o.output
+ '{'.output
+ cc(a,b,c)
+ '}'.output
+ end
+ redef meth foo
+ do
+ 'o'.output
+ super
+ end
+end
+
+(new A.ca('1')).foo
+(new B.cb('1','2')).foo
+(new C.cc('1','2','3')).foo
+(new M.ca('1')).foo
+(new N.cb('1','2')).foo
+(new O.co('1','2','3','4')).foo
+
--- /dev/null
+import kernel
+
+class A
+ init do 'A'.output
+ init init2 do 'a'.output
+ meth foo do '\n'.output
+end
+
+class B
+special A
+ #alt1#redef init do '1'.output
+ init do '1'.output #!alt1#
+ #alt1#redef init init2 do '2'.output
+ init init2 do '2'.output #!alt1#
+ #alt1#redef init init3 do '3'.output
+ init init3 do '3'.output #!alt1#
+end
+
+(new A).foo
+(new A.init2).foo
+(new B).foo
+(new B.init2).foo
+(new B.init3).foo
+
--- /dev/null
+Aa
+A2a
+B{A}ba
+C{B{A}}cba
+Ama
+A2ma
+B{A}nbma
+O{C{B{A}}}onmcba
--- /dev/null
+Aa
+Aba
+Aca
+Amca
+Anbmca
--- /dev/null
+Aa
+B{A}ba
+Aca
+Amca
+B{A}nbmca
--- /dev/null
+Aa
+Aba
+C{A}ca
+C{A}mca
+C{A}nbmca
--- /dev/null
+alt/base_init_inherit2_alt3.nit:75,1--81:7: Error: Explicit constructor required in N since multiple inheritance of constructor is forbiden. Conflicting classes are B, C. Costructors are base_init_inherit2_alt3::A::ca, base_init_inherit2_alt3::B::cb, base_init_inherit2_alt3::C::cc.
--- /dev/null
+./base_init_inherit3.nit:82,1--87:7: Error: No property Q::foo is inherited. Remove the redef keyword to define a new property.
--- /dev/null
+Aa
+Ama
+B{A}ba
+Ana
+B{A}omba
+B{A}pbna
+B{A}qmbna
--- /dev/null
+Aa
+Ama
+B{A}ba
+Ana
+B{A}omba
+B{A}pbna
+B{A}qombna
--- /dev/null
+Aa
+Ama
+B{A}ba
+Ana
+B{A}omba
+B{A}pbna
+B{A}qmpbna
--- /dev/null
+Aa
+Ama
+B{A}ba
+Ana
+B{A}omba
+B{A}pbna
+B{A}qompbna
--- /dev/null
+./base_init_inherit4.nit:84,2--9: Error: Method 'cb' doesn't exists in Q.
--- /dev/null
+Bba
+Bomba
+Bpbna
+Bqmbna
--- /dev/null
+Bba
+Bomba
+Bpbna
+Bqombna
--- /dev/null
+Bba
+Bomba
+Bpbna
+Bqmpbna
--- /dev/null
+Bba
+Bomba
+Bpbna
+Bqompbna
--- /dev/null
+A1a
+B2{A1}ba
+C3{B2{A1}}cba
+A1ma
+B2{A1}nbma
+O4{C3{B2{A1}}}onmcba
--- /dev/null
+alt/base_init_inherit_alt1.nit:95,2--9: Error: Method 'ca' doesn't exists in B.
+alt/base_init_inherit_alt1.nit:96,2--10: Error: Method 'ca2' doesn't exists in B.
+alt/base_init_inherit_alt1.nit:98,2--9: Error: Method 'ca' doesn't exists in C.
+alt/base_init_inherit_alt1.nit:99,2--10: Error: Method 'ca2' doesn't exists in C.
+alt/base_init_inherit_alt1.nit:100,2--9: Error: Method 'cb' doesn't exists in C.
+alt/base_init_inherit_alt1.nit:104,2--9: Error: Method 'ca' doesn't exists in N.
+alt/base_init_inherit_alt1.nit:105,2--10: Error: Method 'ca2' doesn't exists in N.
+alt/base_init_inherit_alt1.nit:107,2--9: Error: Method 'ca' doesn't exists in O.
+alt/base_init_inherit_alt1.nit:108,2--10: Error: Method 'ca2' doesn't exists in O.
+alt/base_init_inherit_alt1.nit:109,2--9: Error: Method 'cb' doesn't exists in O.
+alt/base_init_inherit_alt1.nit:110,2--9: Error: Method 'cc' doesn't exists in O.
--- /dev/null
+A
+a
+A1
+a2
+A3
--- /dev/null
+alt/base_init_simple_alt1.nit:11,2--25: Error: No property B::init is inherited. Remove the redef keyword to define a new property.
+alt/base_init_simple_alt1.nit:12,2--31: Error: No property B::init2 is inherited. Remove the redef keyword to define a new property.
+alt/base_init_simple_alt1.nit:13,2--31: Error: No property B::init3 is inherited. Remove the redef keyword to define a new property.