From dae3cefa56f250eda1672a0a52840fb8be0f36d6 Mon Sep 17 00:00:00 2001
From: "Fuentes Serna  Juan Mariano (ID SIS)" <juanf@bs-mbpr28.d.ethz.ch>
Date: Tue, 11 Dec 2018 15:47:34 +0100
Subject: [PATCH] SSDM-6975 : Dynamic properties

---
 .../1/as/master-data/data-model.xls           | Bin 103424 -> 102912 bytes
 .../scripts}/genetic_modifications.py         |   8 +-
 .../1/as/webapps/eln-lims/html/index.html     |   2 +-
 .../eln-lims/html/js/config/Profile.js        |   2 +-
 ...echnology.js => LifeSciencesTechnology.js} |  12 +-
 .../eln-lims/1/compatibility/comments.py      | 183 ------------
 .../eln-lims/1/compatibility/managed.py       | 267 ------------------
 .../1/compatibility/requests_children_code.py |  14 -
 8 files changed, 12 insertions(+), 476 deletions(-)
 rename openbis_standard_technologies/dist/core-plugins/{eln-lims/1/compatibility => eln-lims-life-sciences/1/as/master-data/scripts}/genetic_modifications.py (92%)
 rename openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/{BiologyTechnology.js => LifeSciencesTechnology.js} (88%)
 delete mode 100644 openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/comments.py
 delete mode 100644 openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/managed.py
 delete mode 100644 openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/requests_children_code.py

diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims-life-sciences/1/as/master-data/data-model.xls b/openbis_standard_technologies/dist/core-plugins/eln-lims-life-sciences/1/as/master-data/data-model.xls
index fcb9ea57fb21fb635024372cb7a862d01a076864..e48c6791cc01af5e22d312990581b33b826836ad 100644
GIT binary patch
delta 10908
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
G=Klb+5^uKv

delta 11662
zcmaJ{2V7Lg_MTb5g2=^Qmc@z<Tg0Fk3m|Qg78eu{u*QZl8queQs4=z}W6)7Yjbe#~
z7kf5}&nWg9`!ms~&)9;-7%TRO|1-yPFMHqb{r>R>$8+ZUzH{cx+_}4BCao$nDZk9-
zsusTAS<TYZ;?ZYabn7%R(tWzcFU9%NeUrQUVy$(Wb3^%dykgzwL9Nr~oa2*fgahWG
z=cxaRjI8iE-{yQ$;l9N@;C$#k>c7~|kv<<-+;4w-uA=i|<-u+F1<^Gs+k=&3Y_W4^
z)Vi|bb!^j0iNpGi`f$jAx_yWD|6o-1M<0)J4oV2B>Currs=>t4K^=tOU@zzGLA$-W
zH)bp}K0YBSG|8S2-!d^a)DdS7*KP0a5wSSnh_)yC|G&sm5wSKq!fInIEVOG<M0a~=
z%czL>h$MU0-f;=x_DFkIaVvXpJwL{}M#RSUj<v@}{5JqIIuk~>=GK~wMaHK7Z@|Pc
zDHdC8#!@3f9ZCNia(?VX54SgLrHGrDHPPOgu?5hkkGn9oyF6p|5b!-2s~XB!-wKRL
zus6YGgfaG=7uc>~D>4=n4rAVo{Ry_c#@Oiy#%w-}O^syiEZ9R)j8&=3*o|n$T32Cg
zr=79#RT--g!&nN~pTO3v#wN15-5C3@8e?0*TB<YV7Ry*7*l)nz2J0UO#noVJIoQ9z
zTH+Z?fDU{B_It25!M;-q5+pzZnE2^LD8$Ox(DxZD0J{flMPJ4;yEC>9Y>I=i)vypg
zNiZ3|iHvQBzj)MPY;rPVr@#jFV5~P|>_@OS!5;0&*dq>|Nr6Hvj4cAY53ElrW5I5W
zIno%*ac8V~FUFER7&`#=FR;n!j7=y5odA0u?4S(Ba?8TRG64e}p9o3vCqm0R_JP?z
z%a4M61a@p+##TVf<N7f+23j82pRsgk`5#~_L(7*9VC)Fk*bf*R4XytV*fP-a{DF*}
z0Xt(5V_PZ#Z!qv+2`+(khb3q?gt0zg=Yib?RvXG#hxV`*|AfDs1sjva*eF<v9bj*O
z4IBmnumq>Uz5pBjA!8%eQh+^L!&&s%mtJux6BuhUow3VbgO$L|V{F!1z-(gdZUHRe
z9>$Ixf#S|H=5?E~lBbMa_uy<`HO_`N<Se!=XRW((b~1spvChKT8@S~=&G}*OZHwj(
zO@7ThnFao6?6Mdj9NHyV5EXNWSUd|Chs3x1v=}<CzjlU36kcOz#pQX{;D1xB0>;jP
zH^Jh`prtGfejapDN?wcu{%1mZA@Uc|dcIZrm0}e!c2T533}%7(y)kw{Oqsu%KNjH&
z2HA>XizvOSIP%2s+(7-QII_Us_KafH01?NY8=gYE5T5c?@E;VjqQ)KYRK2iiUF!9P
zdc)YCg!Dz^UD0`=Rr8^k4P%v@gBLp7w0LS_Jq-ROj(wA%-6LQFjNKPOO9J@=F?2}-
z{!q+b5?Dd)_Ci*jHDc}}cYY0VV@bA_KswEk(?kqh>PT)%I?XZG%<$BN0>D$nw=fmo
z0-N2OkS&nc!tfNYrSQ(P+FDVpB_P6BYr|8BcSK~KzpV|$S|K9P@D!r0m;s1)Db^Yh
zL5AlBitWU)ybLXo=F}GJ7$}04Ir`TiToA^Tr)JU4G>djPi<*RNhse5wY;Qug$Hl5e
z$o5#tZE<&*HMlm#f-zQ)*d0vl4#>6=vI8RPi;(61nlHuP!&n264KW+VI%2G$$cLC8
z#X4ckUtEURb;zMMYG;f!5<V;ZwK|0Bg0aTV@D-tMe3+QF%F+J~!6RTuV;q30A#lpO
z?8!)Mi2ejdBGN+0C=)UYr=&lZQJBt6bX;u>h5;-q8e{InhPQ@G9y_w{QAKt{-WR#6
zcWVzQmVmh*ip(`u?GeQiG4@!@Sd+yEi{dp7t(Zo7;K&ovV{JPP&LzyBf~wENlC{?0
z=M+oDnDW%z;k<XLDGh6SLC7>jz7!AETD4ac>xHquMeTfl?KQ>HF;?P?&+p{MD~MU^
z9GVw3pdSortfIKL&Km4ZvHlp-s3~y%yA&`03(z0_0VrHagssoeawyqgWRDjc*Z1Xj
zgwF=6_6Ln*;mDt&1H|r9Y#7G=5(75)YkI3cMAiFZ;f4(DeR^s}A}&w3Z*&ANqdG@n
zY&q4LZK^XH>s&#|Y(%aUxf`w8V2X{#*buQ}V}|w_RWlA_(?z3A9|cDe?h}kffv1*3
z%`yyr-X7;UkVRwBgv>#t-Fb3TsGBB8auNm?2tTL8cA9{bF?PoA)G=~a%ywFn|4p&a
z5pmA&6yj&_R0&f|B}~DI{zAwp$UAR%ig!Vjfby>tn~I2whNlphz*EZ8Ov=+x`7$A=
zA@4tir+8Py@E@$nzfo*DBCZ;qLR<q+DbFw|&p_qtgq(rA8-}NNH^miD*0<Rgh^Rz}
zFPK97PRcV)$}>^9h>$apcgye;@3x5FnxV}DmO7SZBSMNDTOGC|gv-U)QNvTLW1`tM
zYw}MNn}dkshNlqg!BaDxYpQ21)^mc8bCGw_@D%TqSiCJm`;zKefQW^nOo1agop1{=
zR_ZC%x0G#>Dcd5<){l6LkXPy{-YT)Nz?%F4Ar>Q|)KiGnr2LIZ`5ROoOT2H8SL!L=
z8sWFyn*0$VmLQ_kQ;4;syws$;6qP?F-csb1dWx4XW`pu4gvdigsizSCB;{o$<z=Y+
z9r2bSZ=K;O-g;-r_8S)41_~}m$VS6ckWHfGM{DwCimgDz7Q<7B@4-_GztWU^B_?+g
zawYP9Fg(TEDu(a0CU2wIw}>b(JcZZ}o>E?AQeK71|03in<n1s##rsiQ0p*<(TaAca
zhNlpP;3?%bCgnA#yql0~khjP16mPGH-(^kSN3pet*l&0WaR5A}oNrRjN9BWr%tziK
z!&AJ&qHtG+_D^7`$8tR)){AC^4y`lcHe#%cm{r(L3!&I1jD?D`h2ykuiR;AJ29dVg
zp@k7{E5^Etox81CIK{SMEJ76R&d|Oi?hcH#7v1+bl7k7i6Jw>Gs<s1+safta&2ksa
zQe*ECZx`}98lK{Ha=zT-@1|{`bbAr9OSC*NQp+XaevIXcjR&mS9Eu%)SQwilE*$XJ
z=2Gk+#^wsIgZ`SJ*ddGw5pvK!cpk+Lqn`3q!SLP4<@I$0mt{U7k05)#$UA5aT|lv;
z7*n2NA2YF!AzKpi80Jx4A*%`J<-HSDQSDIG(1kSq6OJoSDIGT{9Y>`_gglN&<te4(
zs5JFZ)&7fV`~;3GPbr-=DV;>6ZwPr3k;+rZQzqmoL@puZDMT(2e;=|2>u;UY7*n2N
ztIwOIFa9&gUP|mUh+HZX4`*oK15Rz>pD|V_b{=+UGYNMdV_yotBUWt|#V$ZBjD01d
zkN9h|DfTPIz7{zU)2q3Nu}Wg|kwMyzl;aBO?RGXgYIU;>Bl1-YerR}V-whX;$4d|A
zYls*@h->&d9SNSA=5^CFuj4fJ<M=w3Fp7BBk(Vt_g7RpJ-9W?`!&BdW{z1w&P0BY>
zS$~DxMBX^!-2~+@HePf-QF`qEj))vW{EmoENx8_RT!hLK2w8-@iH4_?Cy9+GtTz2~
z;4MT9A;c|I9x94Xw6p20zl{j}<Hv18WQh(Zt;wGe>kmXsHayky&%sk2y<@8G4pujX
zkav(b)$kN=n)vRd)i#}Ce<EUr;VHxy;`+%9%?Y|{qumFD#=496Qx2Pha1Sw-WO#~|
zEDBFqlY3C?5h8jTo<gL6rz(DIs`xQhoJz>YSWlYaDPAwp^0d|XxKfOW3_=uRw=zlj
ziAnhhD)%Pj6Xf+VJhf7NMII>YA7P#%qCX*?qVfPzer8gBhRXT}n`g)yNW5pr8zj8X
zSY!1)@Ej5P9(az3p`@(7Y?VIvFHl+E8849cc4y2zd%E0Kz?Qsu^F~}a+q~93at?q!
z2tSA5=P>*n5!cGxDDTN$V45s3;Y^1A4-i+2`5FW@7DJ_$Ks21yps|v<=Q`QC(a;+N
z#u}blhd5{2IrumePeI0&R)XOvNTNtPZ#6bH2SgatH#X-A@xGXQK0`Z7IXzJ0m?$~#
z&?=KsS&UT{eJ)tFm4qvYv6W)x1#55>!j(t$s^F<j<q5X5jh^t;K8#f(q$eV)iz^rU
zYOg5fjfx&3{#S=qhGIS#D<d}lYSqe8tP;k`iHi^`PqE6V=PBGTW@vv?tUBWUBSu_w
z1Ye=5YhvsMc&fr$fGn-B7F4LQ-w0U?kvGNP7p>Y=iq*#0@1oHqf9)E@tPl%hMI!Bz
z)wufbMcgeh<x&8DBQ{^^%S)V<FTb#GH{tc$AnqZue{1Cj%ZVGH9xnrFZ6sHZmjjPk
z#NOX(^RnXdZ>=~NURSL)ki?oBm}+i-T`eQRueJ)XkYEE8^drFryetUnJ!ydQ7Lj-L
zD;^=5U+coZ6vM8m`c7U8;5<^iydKD3i<UR6@H^(ld|pmmz41FQFAm+z;<2L5?^!%f
z<iYQF;aQXbztf7Ea!)a(D2qpl2k<*uq~FTocIS~>(>Y{F{KL*?iN$}6;w8fS&K4fy
z+;itWH{MPB{Z|&;OANl3A^v@@CifC|?`83dBIW*Q?k!H<Pv8l{??F?piRcFjJW(u!
zzx#-N4^)<x4@X0mRS#7bpGR9%mVJ-y{43#A4D%4fi+|)XqS=$tkYxFjEM7@?Jx#Ur
zV`B8vv2f*d@2Qnn7M{;CY;fC+4OJ&%=_cq24UJ}1#FS?V0s5U}PiR^+8$ft<W|rbp
z5MNc4JWI8~Jvl0>ld}|&iim0=`*}iuej}KQiUSF+&el?V8se*qd(TsCg9y>fgy@Bc
z8e+hU(Y&U(2)}EI#FwLaZE@&jhHWr$)G1r4+8a4m5%Mav(hxwLhhxSMF7t<3hOsf?
zyI1~vjPvxXsTS@ldX%K{p<;81mD|Mel2jYq*5kC)p<F814+Z^1*qd>%C_CT4qRel@
zM|1nue7*q|MfR}pR#v#lXC9VvEDN6!jvGFUyTgv0Etgw3ESR*o@gI4tEOg_rw`4PS
zF!6GMJBQsRi`;or9wmJ|AQ&xkl(84w_TXQu1Y^rWg5i{4oJ)dnnBZ%<uPi2LSPm0h
zEr$tW%VUD=<uO4yPe@Qlw(;bF{3AKgll$`#1+zT)PZmg<QW4W0P{v-++MBD*Ca-Id
zb|j^p;gWU+q>W~|vbhhYo$Ui@V`NMvXi7J^rxJ+NmCY;jR9io4sQU0%+R)k9(0X!n
zWvC@v-mDC@{6l(H;Z|N>HmU-_Q8EoY+i0Tan&`PmZy@JZfkX{uNfn-8T&mB(?KVcH
zR|PSDIkqayJy9O13UhBHA5{fHW0_fv2iiUcY4uW?2S-RWt7CX-|Bsa$s{uVq9;*g~
zXc<%;jJ;rG^|!0hrY5vy95B>!FLi0lQf$i{nNt(na-}9;%a_Y(wRjyqreIAi{x1uU
zlzn`mq}Ot@FJ#D($9-Y8;}_Vt)wp9^fm4_un?VpZMx+gw4<Jo>6S>C*J#H$4{DAg}
z9O}od0s1ZCD&&1iEmKz=r5#_5EsK(y{cu9Qb=3BibL;R_KC$3#9X?1ccTzo=*Cd)3
z{Ob|$-)`d#IIp=fub!IMg8H!9pUIu|xxY3U(5j1@xd-&^bNQe?Oyn~osG2!l)@}e3
zX(odjxDd7=VTv3IK|Vv~DoB7_?+W=IAyeg52->~?P4ymgnx^H%X*HMi8@fn4kvC2D
zfFPeHa~gtllw8;lrW`H3{nb*+@%}jTbIOC6hcxD`_)IyXF|WmioY@$c?`~s0j(;r&
zHsPT>rXarwZwjZmJR1NMAv-tc{=xd}_hQCen)Y7YQTj`1FT9kZnSNoq7uRTkT+$qh
znkTn|iqXS;s4_?1g|Ptr4sRb4B+Xu3N0ct=ew_W6vP}z@TK1#LEUIO{sh0g%i+&xq
zAEg({+!jzv3%MRtj9Lz$%2)EL8e1g)R;Hz_+0q4a5FxW=ECg+fsX%q_QCi?3EU=ZF
z?aDiZyt#6p;>{=CVH58#@>)yxR?zDxIYOCed082IL3Hc4PvM1kV7ID^JoOZwcG<0`
zaktKs_1oYwPHBUOQ%E2lPTK-O<Q-YREe~wGgqrj-HYpE0ZYcvd(Q3ierv4clv_$5#
zh1s`}3xU&B-S4TfUrd}|49+jeQ7E-r&zq)o9;X#0z2C*HI7JzI!OM5~LA3|>w1Yjk
zOg?A_dvJb%XM0}74PF_3@4-<VDNnx#N7idlQ@O8WZvDu*ju~Iex*eg)K-saQ%NpIl
zUQd=I)Yx)4OPP3?-w{ug=N;ihX)Eh@f->Hf3p?S7a=eqviBg2pD`+yeOq01qld0Sp
z7iWSp_JTW|-!9Jh5Lld*Kvau!-(_*`<Kirk2SRXh8im62g5-rzNWMyXg~6G>j?z6g
zrF)F&+R5-R9vHP6AgU3MO}qOsE`ol`_84nlPh!O;v0@baRu+c2JUGSJD|Kn8q>D|`
z#VD;`!WE<R2I<=s+Sy*V@9NU=C#bSk4ui1({pRfn5;jsTPffKv#ae>p_pT~WQ6*m%
zL6C2fUg40agKQG+lIR&irpa^&+NP28bCdLQl#Z2o;jlJw(lY`~yc`pOtA8j0RzFHU
zP{C-K9*N6$B$BsqhrReT29|F#h^pmtvy{FG+$`$FFJ(wKT)vgvVEJNXQY=1O$6`U`
zJsA|oBfL}(%K<qW{(Vy}i{rKV7P%u1R(XfK7YD7;ZwbpIW*61(X>mP1JT2-2>i4p3
zJgoV@0HQ=a;Sr5y`swOvQ4gzrE#-+~g(OzNBvt{%I?9b87O<VfDwxD7pqPIDQ~||y
zORofIzEd_yfZ_{eI(Py4?SvOX_E5fxrhFAK-w$#n@B+3`zKW)N6)~Uw?YJU}?Ol)v
z={iZ@M3)aW-Z->Vj#p!yB|rlCR(VW$iLxjW7P5=<c^{e|C3BRCmbaC$7bJCm`#9co
zz<R2$>1sV|xvXa`T+fBFWfHDuZW5k0VaYr&SU+uiv1a|W@x@Zqm^$BVrYYNS%17l!
zpa-Z60kvK>)0AyEW&I1d4aJU0uO2Xy5ZR;$?C*WV^RsxcXm(hp!<g+S2&#N_O!?|y
zzEC+2cu_j94)WAhu*zP?RD2!Gr><wuvk;c&4HpoWX7G>DL2MR-?*{NQY+Fx0-NM7<
zj8vCe>Z0a;xib}NQ8yl{mU^aI>R~NWvN#p{-zN?Ge?0AN|I^dqY=0?drNi02NUll8
zW|zyrX79*=)qE}QWk3&JOV3O&uVkZ4m-H<#{Rx={V*&aVLJORWx*%4?v@{jd5{rqK
z%QNv&e~^ifdhOm=+B9YC1&@03PdPs&NAv}^L|*O-#dMXk`@zeyyNv12n`)V$se0H2
z)HK$+U~+#hEH(#4Lok{|UKrR2mMq&0<V`2`pkO#yjrBA<C6i)!>i$L-i$G)_8jC>b
zzJ{ledNGlR{D{UP5jn!}5IK?DD1@s2&rHoC3ZbJ6&s8)Uk)vrW8j<4+&lPD$<QN*W
zBXYdqy+uxZn=l5U|DeGbgnnXpuA<!#IhMw{Au`ACT#<1QjbN!Xrv8Vd2$lxF3t@us
zz>9!CmL@n~^^IO*83a||#v@pLdMXkT+H1jJZk?D;2=y&OWBm+IEtb9@@570qvHr%G
zx=JfYTHTTN0gZLX;&onk<P9*!6i<CkR_mdbUSk9G#d4U44kQjDqQjzyS>&lLr?J6?
z=UQkI@`e~=il@G)sf5YM8%ATvlrKUbR5KiE3@YL>BC72Sb<-Gp*9TAEfITqbaG5y-
zTA59do(R!5UQdLKG{%&4EJ>@UL1UlNSPJs=ZJ2_*DaM%Msqf-yE@}s8@Zjs7Drt<~
z%2XsyH3k(?y~`C*Z5EB`$TUo-Z_za5O(R|!Hhm`XdLeHTjrBsFzF~VIZ@Pu{eJ><V
zBBI(}8vBfh=_X=25@#4=s?e3hQyW)flW8midHP9`fxIt_F~x(ITM*7r9Tf2I6Ev7<
tB4#3SrZJ|7FJ<#Ap5p~+;Xin-!GH1xxBx83&E+Gw44KNK)(qo~{trgp)xQ7$

diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/genetic_modifications.py b/openbis_standard_technologies/dist/core-plugins/eln-lims-life-sciences/1/as/master-data/scripts/genetic_modifications.py
similarity index 92%
rename from openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/genetic_modifications.py
rename to openbis_standard_technologies/dist/core-plugins/eln-lims-life-sciences/1/as/master-data/scripts/genetic_modifications.py
index b91679ab633..0739e95afae 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/genetic_modifications.py
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims-life-sciences/1/as/master-data/scripts/genetic_modifications.py
@@ -37,7 +37,7 @@ def calculate():
                 parentCode = parent.code()
                 #Add the code
                 annotationMap = getAnnotationsForParent(parent, child)
-                if(annotationMap["PLASMID_RELATIONSHIP"] == "LOT"):
+                if(annotationMap["ANNOTATION.SYSTEM.PLASMID_RELATIONSHIP"] == "LOT"):
                     newLostList.append(parent.entityPE().getPermId())
                 elif parent.entityPE().getPermId() not in lostList:
                      #Check if is the first to add the separator or not
@@ -58,16 +58,16 @@ def calculate():
     return genotypeResult
 
 def getAnnotationString(annotationMap):
-    return annotationMap["PLASMID_RELATIONSHIP"] + " " + annotationMap["PLASMID_ANNOTATION"]
+    return annotationMap["ANNOTATION.SYSTEM.PLASMID_RELATIONSHIP"] + " " + annotationMap["ANNOTATION.SYSTEM.PLASMID_ANNOTATION"]
 
 def getAnnotationsForParent(parent, child):
     permId = parent.entityPE().getPermId()
     annotations = child.propertyValue("ANNOTATIONS_STATE")
     if (annotations is not None) and ('<root' in annotations):
-        relationshipValue = getAnnotationFromPermId(annotations, permId, "PLASMID_RELATIONSHIP")
+        relationshipValue = getAnnotationFromPermId(annotations, permId, "ANNOTATION.SYSTEM.PLASMID_RELATIONSHIP")
         if relationshipValue is None:
             relationshipValue = "None"
-        annotationValue = getAnnotationFromPermId(annotations, permId, "PLASMID_ANNOTATION");
+        annotationValue = getAnnotationFromPermId(annotations, permId, "ANNOTATION.SYSTEM.PLASMID_ANNOTATION");
         if annotationValue is None:
             annotationValue = ""
         annotation = "\"" + str(annotationValue) + "\""
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/index.html b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/index.html
index cd590405472..50c5bd15300 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/index.html
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/index.html
@@ -262,7 +262,7 @@
 	
 	<script type="text/javascript" src="./js/plugins/ELNLIMSPlugin.js"></script>
 	<script type="text/javascript" src="./js/plugins/GenericTechnology.js"></script>
-	<script type="text/javascript" src="./js/plugins/BiologyTechnology.js"></script>
+	<script type="text/javascript" src="./js/plugins/LifeSciencesTechnology.js"></script>
 	<script type="text/javascript" src="./js/plugins/MicroscopyTechnology.js"></script>
 	
 	<script type="text/javascript">
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/Profile.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/Profile.js
index 1350c50b9cc..53fb5118d6c 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/Profile.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/config/Profile.js
@@ -133,7 +133,7 @@ $.extend(DefaultProfile.prototype, {
 //				"ADMIN-BS-MBPR28.D.ETHZ.CH-E96954A7" : "http://localhost:8080/download"
 		}
 		
-		this.plugins = [new GenericTechnology(), new BiologyTechnology(), new MicroscopyTechnology()];
+		this.plugins = [new GenericTechnology(), new LifeSciencesTechnology(), new MicroscopyTechnology()];
 		this.sampleFormTop = function($container, model) {
 			for(var i = 0; i < this.plugins.length; i++) {
 				this.plugins[i].sampleFormTop($container, model);
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/BiologyTechnology.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/LifeSciencesTechnology.js
similarity index 88%
rename from openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/BiologyTechnology.js
rename to openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/LifeSciencesTechnology.js
index c7dfec2ec05..d064fe15a72 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/BiologyTechnology.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/LifeSciencesTechnology.js
@@ -1,8 +1,8 @@
-function BiologyTechnology() {
+function LifeSciencesTechnology() {
 	this.init();
 }
 
-$.extend(BiologyTechnology.prototype, ELNLIMSPlugin.prototype, {
+$.extend(LifeSciencesTechnology.prototype, ELNLIMSPlugin.prototype, {
 	init: function() {
 				
 	},
@@ -151,7 +151,7 @@ $.extend(BiologyTechnology.prototype, ELNLIMSPlugin.prototype, {
 														"LABEL" : "Plasmid",
 														"TYPE": "PLASMID",
 														"MIN_COUNT" : 0,
-														"ANNOTATION_PROPERTIES" : [{"TYPE" : "ANNOTATION.PLASMID.PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "ANNOTATION.PLASMID.PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.COMMENTS", "MANDATORY" : false }]
+														"ANNOTATION_PROPERTIES" : [{"TYPE" : "ANNOTATION.SYSTEM.PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.COMMENTS", "MANDATORY" : false }]
 													}																				
 												],
 				},
@@ -169,7 +169,7 @@ $.extend(BiologyTechnology.prototype, ELNLIMSPlugin.prototype, {
 														"LABEL" : "Plasmid",
 														"TYPE": "PLASMID",
 														"MIN_COUNT" : 0,
-														"ANNOTATION_PROPERTIES" : [{"TYPE" : "ANNOTATION.PLASMID.PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "ANNOTATION.PLASMID.PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.COMMENTS", "MANDATORY" : false }]
+														"ANNOTATION_PROPERTIES" : [{"TYPE" : "ANNOTATION.SYSTEM.PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.COMMENTS", "MANDATORY" : false }]
 													}																					
 												],
 				},
@@ -187,7 +187,7 @@ $.extend(BiologyTechnology.prototype, ELNLIMSPlugin.prototype, {
 														"LABEL" : "Plasmid",
 														"TYPE": "PLASMID",
 														"MIN_COUNT" : 0,
-														"ANNOTATION_PROPERTIES" : [{"TYPE" : "ANNOTATION.PLASMID.PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "ANNOTATION.PLASMID.PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.COMMENTS", "MANDATORY" : false }]
+														"ANNOTATION_PROPERTIES" : [{"TYPE" : "ANNOTATION.SYSTEM.PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.COMMENTS", "MANDATORY" : false }]
 													},		
 					                             	{
 														"LABEL" : "Parental fly",
@@ -211,7 +211,7 @@ $.extend(BiologyTechnology.prototype, ELNLIMSPlugin.prototype, {
 														"LABEL" : "Plasmid",
 														"TYPE": "PLASMID",
 														"MIN_COUNT" : 0,
-														"ANNOTATION_PROPERTIES" : [{"TYPE" : "ANNOTATION.PLASMID.PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "ANNOTATION.PLASMID.PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.COMMENTS", "MANDATORY" : false }]
+														"ANNOTATION_PROPERTIES" : [{"TYPE" : "ANNOTATION.SYSTEM.PLASMID_RELATIONSHIP", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.PLASMID_ANNOTATION", "MANDATORY" : false },{"TYPE" : "ANNOTATION.SYSTEM.COMMENTS", "MANDATORY" : false }]
 													}																					
 												],
 				}
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/comments.py b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/comments.py
deleted file mode 100644
index 396f3acb179..00000000000
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/comments.py
+++ /dev/null
@@ -1,183 +0,0 @@
-from java.util import Date
-
-"""
-Example XML property value handled by this script:
-<root>
-  <commentEntry date="2011-02-20 14:15:28 GMT+01:00" person="buczekp">Here is the 1st  entry text.<commentEntry>
-  <commentEntry date="2011-02-20 14:16:28 GMT+01:00" person="kohleman">Here is the 2nd  entry text - a warning!<commentEntry>
-  <commentEntry date="2011-02-20 14:17:28 GMT+01:00" person="tpylak">Here is the 3rd  entry text - an error!!!<commentEntry>
-  <commentEntry date="2011-02-20 14:18:28 GMT+01:00" person="brinn">Here is the 4th  entry text - an error!!!<commentEntry>
-  <commentEntry date="2011-02-20 14:19:28 GMT+01:00" person="felmer">Here is the 5th  entry text - a warning!<commentEntry>
-</root>
-"""
-##
-## Configuration
-##
-COMMENT_ENTRY_ELEMENT_LABEL = 'commentEntry'
-
-""" labels of table columns and corresponding input fields """
-DATE_LABEL = 'Date'
-PERSON_LABEL = 'Person'
-COMMENT_TEXT_LABEL = 'Comment Text'
-  
-""" names of attributes of XML elements for comment entries """
-DATE_ATTRIBUTE = 'date'
-PERSON_ATTRIBUTE = 'person'
-  
-""" action labels (shown as button labels in UI) """
-ADD_ACTION_LABEL = 'Add Comment Entry'
-EDIT_ACTION_LABEL = 'Edit'
-DELETE_ACTION_LABEL = 'Delete'
-  
-##
-## Main Methods
-##
-def configureUI():
-    """Create table builder and add headers of columns."""
-    builder = createTableBuilder()
-    builder.addHeader(DATE_LABEL, 250) # date and comment text values are long, override default width (150)
-    builder.addHeader(PERSON_LABEL)
-    builder.addHeader(COMMENT_TEXT_LABEL, 400)
-      
-    """
-       Extract XML elements from property value to a Python list.
-       For each element (comment entry) add add a row to the table.  
-    """
-    elements = list(propertyConverter().convertToElements(property))
-    for commentEntry in elements:
-        row = builder.addRow()
-        row.setCell(DATE_LABEL, Date(long(commentEntry.getAttribute(DATE_ATTRIBUTE))))
-        row.setCell(PERSON_LABEL, commentEntry.getAttribute(PERSON_ATTRIBUTE))
-        row.setCell(COMMENT_TEXT_LABEL, commentEntry.getData())
-  
-    """Specify that the property should be shown in a tab and set the table output."""
-    property.setOwnTab(True)
-    uiDescription = property.getUiDescription()
-    uiDescription.useTableOutput(builder.getTableModel())
-  
-    """
-       Define and add actions with input fields used to:
-       1. specify attributes of new comment entry,
-    """
-    addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\
-                             .setDescription('Add a new comment entry:')
-    widgets = [
-        inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL)\
-                            .setMandatory(True)
-    ]
-    addAction.addInputWidgets(widgets)
-      
-    """
-       2. modify attributes of a selected comment entry,
-    """
-    editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\
-                              .setDescription('Edit selected comment entry:')
-    # Exactly 1 row needs to be selected to enable action.
-    editAction.setRowSelectionRequiredSingle()            
-    widgets = [
-        inputWidgetFactory().createMultilineTextInputField(COMMENT_TEXT_LABEL).setMandatory(True)
-    ]
-    editAction.addInputWidgets(widgets)
-    # Bind field name with column name.
-    editAction.addBinding(COMMENT_TEXT_LABEL, COMMENT_TEXT_LABEL)
-  
-    """
-       3. delete selected comment entries.
-    """
-    deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\
-                                .setDescription('Are you sure you want to delete selected comment entry?')
-    # Delete is enabled when at least 1 row is selected.
-    deleteAction.setRowSelectionRequired()
-    
-  
-def updateFromUI(action):
-    """Extract list of elements from old value of the property."""
-    converter = propertyConverter()
-    elements = list(converter.convertToElements(property))
-  
-    """Implement behaviour of user actions."""
-    if action.name == ADD_ACTION_LABEL:
-        """
-           For 'add' action create new comment entry element with values from input fields
-           and add it to existing elements.
-        """
-        element = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL)
-        """Fill element attributes with appropriate values."""
-        element.addAttribute(DATE_ATTRIBUTE, str(Date().getTime()))            # current date
-        element.addAttribute(PERSON_ATTRIBUTE, action.getPerson().getUserId()) # invoker the action
-        """Retrieve values from input fields filled by user on the client side."""
-
-        """Set comment text as a text element, not an attribute."""
-        element.setData(action.getInputValue(COMMENT_TEXT_LABEL))
-        """Add the new entry to the end of the element list."""
-        elements.append(element)
-    elif action.name == EDIT_ACTION_LABEL:
-        """
-           For 'edit' action find the comment entry element corresponding to selected row
-           and replace it with an element with values from input fields.
-        """
-        
-        selectedRowId = action.getSelectedRows()[0]
-        xmlUser = elements[selectedRowId].getAttribute(PERSON_ATTRIBUTE)
-        if action.getPerson().getUserId() == xmlUser:
-          elements[selectedRowId].setData(action.getInputValue(COMMENT_TEXT_LABEL))
-        else:
-          raise ValidationException('Comment creator and current user differ:\n' + str(xmlUser) + "!=" + str(action.getPerson().getUserId()) )
-    elif action.name == DELETE_ACTION_LABEL:
-        """
-           For 'delete' action delete the entries that correspond to selected rows.
-           NOTE: As many rows can be deleted at once it is easier to delete them in reversed order.
-        """
-        rowIds = list(action.getSelectedRows())
-        rowIds.reverse()       
-        for rowId in rowIds:
-              xmlUser = elements[rowId].getAttribute(PERSON_ATTRIBUTE)
-              if action.getPerson().getUserId() == xmlUser:
-                elements.pop(rowId)
-              else:
-                raise ValidationException('Comment creator and current user differ:\n' +  str(xmlUser) + "!=" + str(action.getPerson().getUserId()) )
-    else:
-        raise ValidationException('action not supported')
-      
-    """Update value of the managed property to XML string created from modified list of elements."""
-    property.value = converter.convertToString(elements)
-
-##
-## Form Methods
-##
-def showRawValueInForms():
-    return False
- 
-def updateFromRegistrationForm(bindings):
-    elements = []
-    for item in bindings:
-        comment_text_list = item.get('COMMENTENTRY')
-        sampleLink = _createCommentEntry(comment_text_list)
-        elements.append(sampleLink)
-            
-    property.value = propertyConverter().convertToString(elements)
-
-##
-## Batch Import Methods
-##
-def batchColumnNames():
-    return [COMMENT_ENTRY_ELEMENT_LABEL]
-
-def updateFromBatchInput(bindings):
-    elements = []
-    input = bindings.get('COMMENTENTRY')
-    if input is not None:
-        commentEntry = _createCommentEntry(input)
-        elements.append(commentEntry)
-        property.value = propertyConverter().convertToString(elements)
-        
-##
-## Help Methods
-##
-def _createCommentEntry(comment_text_list):
-    #if comment_text_list is not None:
-    commentEntry = elementFactory().createElement(COMMENT_ENTRY_ELEMENT_LABEL)
-    commentEntry.addAttribute(PERSON_ATTRIBUTE, person.getUserId())
-    commentEntry.addAttribute(DATE_ATTRIBUTE,str(Date().getTime()))
-    commentEntry.setData(comment_text_list)
-    return commentEntry   
\ No newline at end of file
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/managed.py b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/managed.py
deleted file mode 100644
index 848a92850e0..00000000000
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/managed.py
+++ /dev/null
@@ -1,267 +0,0 @@
-from ch.systemsx.cisd.openbis.generic.server import CommonServiceProvider
-
-##
-## Configuration
-##
-
-# This needs to be edited for each sample type to match the Profile.js ANNOTATION_PROPERTIES map.
-configuration = {}
-configuration["MEDIA"] = {
-                          "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False }
-                         };
-
-configuration["SOLUTION_BUFFER"] = {
-                          "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False }
-                         };
-
-configuration["GENERAL_PROTOCOL"] = {
-                          "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "GENERAL_PROTOCOL" : {"COMMENTS" : False }
-                         };
-
-configuration["PCR_PROTOCOL"] = {
-                          "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False }
-                         };
-
-configuration["WESTERN_BLOTTING_PROTOCOL"] = {
-                          "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "ANTIBODY" : {"QUANTITY" : False, "COMMENTS" : False }
-                         };
-
-configuration["PLASMID"] = {
-                          "PLASMID" : {"COMMENTS" : False }
-                         };
-
-configuration["BACTERIA"] = {
-                          "BACTERIA" : {"COMMENTS" : False },
-                          "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False }
-                         };
-
-configuration["YEAST"] = {
-                          "YEAST" : {"COMMENTS" : False },
-                          "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False, "CONTAINED" : False }
-                         };
-
-configuration["CELL_LINE"] = {
-                          "CELL_LINE" : {"COMMENTS" : False },
-                          "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False },
-                          "FLY" : {"COMMENTS" : False }
-                         };
-
-configuration["FLY"] = {
-                          "FLY" : {"COMMENTS" : False },
-                          "PLASMID" : {"PLASMID_RELATIONSHIP" : False, "PLASMID_ANNOTATION" : False, "COMMENTS" : False }
-                         };
-
-configuration["EXPERIMENTAL_STEP"] = {
-                          "ANTIBODY" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "BACTERIA" : {"COMMENTS" : False },
-                          "CELL_LINE" : {"COMMENTS" : False },
-                          "CHEMICAL" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "ENZYME" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "FLY" : {"COMMENTS" : False },
-                          "MEDIA" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "OLIGO" : {"COMMENTS" : False },
-                          "PLASMID" : {"COMMENTS" : False },
-                          "RNA" : {"COMMENTS" : False },
-                          "SOLUTION_BUFFER" : {"QUANTITY" : False, "COMMENTS" : False },
-                          "YEAST" : {"COMMENTS" : False },
-                          "GENERAL_PROTOCOL" : {"COMMENTS" : False },
-                          "PCR_PROTOCOL" : {"COMMENTS" : False },
-                          "WESTERN_BLOTTING_PROTOCOL" : {"COMMENTS" : False }
-                         };
-
-#Global Variables
-annotableType = "<REPLACE_WITH_ANNOTABLE_TYPE>"
-propertyTypes = None
-def getPropertyTypes():
-    global propertyTypes
-    if propertyTypes is None:
-        server = CommonServiceProvider.getCommonServer()
-        contextOrNull = server.tryToAuthenticateAsSystem()
-        propertyTypes = server.listPropertyTypes(contextOrNull.getSessionToken(), False)
-    return propertyTypes;
-
-##
-## Help Methods
-##
-def getAllAnnotableSampleTypesForType(fromAnnotableType):
-    allTypes = {};
-    for sampleTypeWithAnnotations in configuration:
-        if (fromAnnotableType == None) or (fromAnnotableType == sampleTypeWithAnnotations):
-            for sampleTypeWithAnnotationsForType in configuration[sampleTypeWithAnnotations]:
-                    allTypes[sampleTypeWithAnnotationsForType] = True;
-    return allTypes;
-
-def getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCodeToFind, fromAnnotableType):
-    for sampleTypeWithAnnotations in configuration:
-        if (fromAnnotableType == None) or (fromAnnotableType == sampleTypeWithAnnotations):
-            for sampleTypeWithAnnotationsForType in configuration[sampleTypeWithAnnotations]:
-                    if sampleTypeWithAnnotationsForType == sampleTypeCodeToFind:
-                            return configuration[sampleTypeWithAnnotations][sampleTypeWithAnnotationsForType];
-    return None;
-    
-def getPropertyType(propertyTypeCode):
-    for propertyType in getPropertyTypes():
-        if propertyType.code == propertyTypeCode:
-            return propertyType
-    return None;
-
-def createAnnotationsFor(identifier, annotations, sampleType):
-    permId = entityInformationProvider().getSamplePermId(identifier);
-    newAnnotation = elementFactory().createSampleLink(permId)
-    
-    newAnnotation.addAttribute("identifier", identifier)
-    newAnnotation.addAttribute("sampleType", sampleType)
-    for annotation in annotations:
-        newAnnotation.addAttribute(annotation, annotations[annotation])
-    return newAnnotation
-
-def getWidgetForAdd(sampleTypeCode, annotableType):
-    #print "sampleTypeCode:" + sampleTypeCode + " - " + annotableType #Deleting this comment causes the thing to break
-    widgets = []
-    widgetIdentifier = inputWidgetFactory().createTextInputField("identifier")\
-                            .setMandatory(True)\
-                            .setValue("")\
-                            .setDescription("")
-    widgets.append(widgetIdentifier)
-    for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType):
-        propertyType = getPropertyType(propertyTypeCode)
-        widget = inputWidgetFactory().createTextInputField(propertyType.label)\
-                        .setMandatory(getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType)[propertyTypeCode])\
-                        .setValue("")\
-                        .setDescription(propertyType.description)
-        widgets.append(widget)
-    return widgets;
-
-def isValid(dataType, value):
-    return True
-
-##
-## Main Methods
-##
-def configureUI():
-    # Add Headers
-    tableBuilder = createTableBuilder()
-    tableBuilder.addHeader("identifier")
-    tableBuilder.addHeader("sampleType")
-    tableBuilder.addHeader("name")
-    
-    usedTableHeaders = {"identifier" : True, "sampleType" : True, "name" : True }
-    
-    for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType):
-        for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType):
-            if propertyTypeCode not in usedTableHeaders:
-                tableBuilder.addHeader(propertyTypeCode)
-                usedTableHeaders[propertyTypeCode] = True
-
-    property.setOwnTab(True)
-    uiDescription = property.getUiDescription()
-    uiDescription.useTableOutput(tableBuilder.getTableModel())
-    
-    # Add Rows
-    samples = list(propertyConverter().convertToElements(property))
-    for sample in samples:
-        row = tableBuilder.addRow()
-        permId = sample.getAttribute("permId")
-        
-        nameValue = entityInformationProvider().getSamplePropertyValue(permId, "NAME")
-        if nameValue is not None:
-            row.setCell("name", nameValue)
-        
-        for annotation in sample.getAttributes():
-            if annotation != "permId":
-                if annotation == "identifier":
-                    row.setCell(annotation, sample, sample.getAttribute(annotation))
-                else:
-                    row.setCell(annotation, sample.getAttribute(annotation))
-            
-    # Add Create buttons
-    for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType):
-        title = "Add " + sampleTypeCode;
-        addAction = uiDescription.addTableAction(title).setDescription(title)
-        widgets = getWidgetForAdd(sampleTypeCode, annotableType)
-        addAction.addInputWidgets(widgets)
-
-    # Add Delete button
-    deleteAction = uiDescription.addTableAction("Delete")\
-                                .setDescription('Are you sure you want to delete selected annotation?')
-    deleteAction.setRowSelectionRequired() # Delete is enabled when at least 1 row is selected.
-    
-def updateFromUI(action):
-    converter = propertyConverter()
-    elements = list(converter.convertToElements(property))
-    
-    if action.name.startswith("Add"):
-        sampleTypeCode = action.name[4:]
-        identifier = action.getInputValue("identifier")
-        annotations = { }
-        for propertyTypeCode in getPropertyTypesForSampleTypeFromAnnotableType(sampleTypeCode, annotableType):
-            propertyType = getPropertyType(propertyTypeCode)
-            propertyTypeValue = action.getInputValue(propertyType.label)
-            if not isValid(propertyType.dataType, propertyTypeValue):
-                raise ValidationException("Property " + str(propertyType.label) + " with invalid value " + str(propertyTypeValue))
-            if propertyTypeValue is None:
-                propertyTypeValue = ""
-            annotations[propertyTypeCode] = propertyTypeValue
-        newAnnotation = createAnnotationsFor(identifier, annotations, sampleTypeCode)
-        elements.append(newAnnotation)
-    
-    if action.name.startswith("Delete"):
-        rowIds = list(action.getSelectedRows())
-        rowIds.reverse()
-        for rowId in rowIds:
-            elements.pop(rowId) 
-    
-    property.value = converter.convertToString(elements)
-
-##
-## Batch Import Methods
-##
-def batchColumnNames():
-    allTypes = []
-    for sampleTypeCode in getAllAnnotableSampleTypesForType(annotableType):
-        allTypes.append(sampleTypeCode)
-    return allTypes
-
-def updateFromBatchInput(bindings):
-    #print "--------> UPDATE FROM BATCH INPUT: "
-    elements = []
-                
-    for annotableSampleType in getAllAnnotableSampleTypesForType(annotableType):
-        annotatedSamples = bindings.get(annotableSampleType)
-        #print "-----> TYPE: " + str(annotableSampleType) + " BINDINGS: " + str(annotatedSamples)
-        if (annotatedSamples != None and annotatedSamples != ""):
-            #Annotations
-            for sampleLine in annotatedSamples.split("\\"):
-                propertyTypes = getPropertyTypesForSampleTypeFromAnnotableType(annotableSampleType, annotableType)
-                identifier = None
-                permId = None
-                sampleLink = None
-                for sampleProperty in sampleLine.split(";"):
-                    propertyName = sampleProperty.split(":")[0]
-                    propertyValue = sampleProperty.split(":")[1]
-                    if propertyName == "identifier":
-                        identifier = propertyValue
-                        permId = entityInformationProvider().getSamplePermId(propertyValue)
-                        sampleLink = elementFactory().createSampleLink(permId)
-                        sampleLink.addAttribute(propertyName, propertyValue)
-                        sampleLink.addAttribute('sampleType', annotableSampleType)
-                    elif propertyName in propertyTypes:
-                        sampleLink.addAttribute(propertyName, propertyValue)
-                    else:
-                        raise NameError('Found invalid property: ' + propertyName + " on type " + annotableSampleType)
-                if identifier is not None:
-                   elements.append(sampleLink)
-    #Links
-    property.value = propertyConverter().convertToString(elements)
\ No newline at end of file
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/requests_children_code.py b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/requests_children_code.py
deleted file mode 100644
index c79ad63402a..00000000000
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/compatibility/requests_children_code.py
+++ /dev/null
@@ -1,14 +0,0 @@
-def retrieve_childrenCode(): 
-
-    sample= entity.samplePE()
-    children=sample.children
-    if len(children) != 0: 
-        children_code = children[0].getCode()
-    else:
-        children_code="n.a."
-        
-
-    return children_code
-     
-def calculate():
-    return retrieve_childrenCode()
-- 
GitLab