diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4324612e0bc3cc61cc98d19ad596bdadf9baf788..fdeb0b4e233dc148b56fb4ae97bc79fbae68779a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -92,7 +92,7 @@ set(CPACK_GENERATOR "RPM")
 set(CPACK_PACKAGE_NAME "irods-uu-microservices")
 set(CPACK_PACKAGE_VENDOR "Utrecht University <fbyoda@uu.nl>")
 set(CPACK_PACKAGE_CONTACT "Utrecht University <fbyoda@uu.nl>")
-set(CPACK_PACKAGE_VERSION "4.1.11_0.3.0")
+set(CPACK_PACKAGE_VERSION "4.1.11_0.3.3")
 
 set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/package/description.txt")
 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Miscellaneous microservices developed by Utrecht university.")
diff --git a/src/msiLoadMetadataFromXml.cc b/src/msiLoadMetadataFromXml.cc
index eabee0f685dd26fa4a5387da3cf797ba6a936800..34b7424625536d8e6e5aebd00ce27cfca35012ce 100644
--- a/src/msiLoadMetadataFromXml.cc
+++ b/src/msiLoadMetadataFromXml.cc
@@ -114,12 +114,13 @@ msiLoadMetadataFromXml(msParam_t *targetObj, msParam_t *xmlParam, ruleExecInfo_t
 	
 	/* for new AVU creation */
 	modAVUMetadataInp_t modAVUMetadataInp;
-	const int MAX_ATTR_NAME_LEN = 2700;
-        const int MAX_ATTR_VALUE_LEN = 2700;
-	const int MAX_ATTR_UNIT_LEN = 250;
+	const size_t MAX_ATTR_NAME_LEN = 2700;
+        const size_t MAX_ATTR_VALUE_LEN = 2700;
+	const size_t MAX_ATTR_UNIT_LEN = 250;
 	char* attrName;
 	char* attrValue;
 	char* attrUnit;
+	size_t attrNameLen, attrValueLen, attrUnitLen;
 	rodsLong_t coll_id;
 
 
@@ -152,16 +153,7 @@ msiLoadMetadataFromXml(msParam_t *targetObj, msParam_t *xmlParam, ruleExecInfo_t
 	}
 
 
-	/* Get path of XML document */
-	/*
-	rei->status = parseMspForDataObjInp (xmlObj, &xmlDataObjInp, &myXmlDataObjInp, 0);
-	if (rei->status < 0)
-	{
-		rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: input xmlObj error. status = %d", rei->status);
-		return (rei->status);
-	}
 
-	*/
 
 
 	if ( strcmp( xmlParam->type, BUF_LEN_MS_T) == 0 && xmlParam->inpOutBuf != NULL) {
@@ -171,6 +163,14 @@ msiLoadMetadataFromXml(msParam_t *targetObj, msParam_t *xmlParam, ruleExecInfo_t
 		
 	} else if ( strcmp( xmlParam->type, STR_MS_T) == 0 || strcmp( xmlParam->type, DataObjInp_MS_T) == 0) {
 
+		/* Get path of XML document */
+		rei->status = parseMspForDataObjInp (xmlParam, &xmlDataObjInp, &myXmlDataObjInp, 0);
+		if (rei->status < 0)
+		{
+			rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: input xmlObj error. status = %d", rei->status);
+			return (rei->status);
+		}
+
 		/******************************** OPEN AND READ FROM XML OBJECT ********************************/
 
 		/* Open XML file */
@@ -264,32 +264,43 @@ msiLoadMetadataFromXml(msParam_t *targetObj, msParam_t *xmlParam, ruleExecInfo_t
 			attrName = (char*)xmlNodeGetContent(getChildNodeByName(nodes->nodeTab[i], "Attribute"));
 			if (!attrName) {
 				rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: AVU does not contain an Attribute element");
-				break;
+				continue;
 			}
-			if (strlen(attrName) > MAX_ATTR_NAME_LEN) {
-				rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute name is too large (>%d) - %s",
-					MAX_ATTR_NAME_LEN, attrName);
-				break;
+			attrNameLen = strlen(attrName);
+			if (attrNameLen > MAX_ATTR_NAME_LEN) {
+				rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute name for AVU #%d is too large (%d>%d)",
+					i + 1, attrNameLen, MAX_ATTR_NAME_LEN, attrName);
+				continue;
+			} else if (attrNameLen == 0) {
+				rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute name for AVU #%d is empty",
+					i + 1);
 			}
 
 			attrValue = (char*)xmlNodeGetContent(getChildNodeByName(nodes->nodeTab[i], "Value"));
 			if (!attrValue) {
-				rodsLog(LOG_ERROR, "msiLoadMetadataFromXml: AVU does not contain an Value element");
-				break;
+				rodsLog(LOG_ERROR, "msiLoadMetadataFromXml: AVU #%d does not contain a Value element",
+					i + 1);
+				continue;
 			}
-			if (strlen(attrValue) > MAX_ATTR_VALUE_LEN) {
-				rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute value is too large (>%d) - %s",
-					MAX_ATTR_VALUE_LEN, attrValue);
-				break;
+			attrValueLen = strlen(attrValue);
+			if (attrValueLen > MAX_ATTR_VALUE_LEN) {
+				rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute value is too large (%d>%d) - %s",
+					attrValueLen, MAX_ATTR_VALUE_LEN, attrValue);
+				continue;
+			} else if (attrValueLen == 0) {
+				rodsLog(LOG_ERROR, "msiLoadMetadataFromXml: attribute value in AVU #%d with name '%s' is empty",
+					i + 1, attrName);
+				continue;
 			}
 	
 			attrUnit = (char*)xmlNodeGetContent(getChildNodeByName(nodes->nodeTab[i], "Unit"));
 			/* attrUnit can be null */
 			if (attrUnit) {
-				if (strlen(attrUnit) > MAX_ATTR_UNIT_LEN) {
-					rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute unit is too large (>%d) - %s",
-					MAX_ATTR_UNIT_LEN, attrUnit);
-					break;
+				attrUnitLen = strlen(attrUnit);
+				if (attrUnitLen > MAX_ATTR_UNIT_LEN) {
+					rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute unit in AVU #%d is too large (%d>%d)",
+					i + 1, attrUnitLen, MAX_ATTR_UNIT_LEN, attrUnit);
+					continue;
 				}
 			}
 
diff --git a/tests/avu.xml b/tests/avu.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8424820c47b0d8ba04ca92363eca8f0a9c319bfd
--- /dev/null
+++ b/tests/avu.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+<!-- This is ment to test msiLoadMetadataFromXml -->
+	<AVU></AVU>
+	<AVU>
+		<Attribute>Test entities</Attribute>
+		<Value>&apos;Komkommer &amp; Tomaat &gt; Rucola&quot;</Value>
+		<Unit>kg</Unit>
+	</AVU>
+	<AVU>
+		<Attribute></Attribute>
+		<Value>Empty Attribute</Value>
+	</AVU>
+	<AVU>
+		<Attribute>Test Empty Value</Attribute>
+		<Value></Value>
+	</AVU>
+	<AVU>
+		<Attribute>Test No Value</Attribute>
+		<Unit>N/A</Unit>
+	</AVU>
+	<AVU>
+		<Attribute>Test Chinese</Attribute>
+		<Value>>価点行思先景録再選町能法日</Value>
+		<Unit>Chinese</Unit>
+	</AVU>
+	<AVU>
+		<Attribute>Test Chinese Too long</Attribute>
+		<Value>価点行思先景録再選町能法日。無体予表食棄教山知単北議献堀康二。協稿定用需田教露恒政氷明庭当効。向速兆類日落木逃中学消展審以産今。多信県喫党情茨著説文経憂仲。応著理給着級覧帯脇転術戸。索理価掲読中載中当労残社骨戦。界雨権金断辞故引並竹剤長。報薬上紀京音月年手易和断更戦同体羽先。長井政栂掲端金質未誕意住更衣経外庫用。
+
+金参家針掲層費越辛親謙可。索屋治防陽上茂富全確消分題回速能問。町断情堀宮了海事写祉一土杯況。初羽報評降町困串最現問相権介型国。首斎光同了者幕為祭塚人年講題博。時駐待風偽雲郵書並企間人落授介見経。調均佐高席申稼放中球市方来作権足園専占。同著京禁事署組分館表佐編円載棋企朝。場分探教打川木川浅農構記齢催属谷評。
+
+軽限融後年断式芸歴沿渋並拉一録百将惑。製検試小精旅優勝度中況込利。下野後影済生起景情富不致正聞図毎構長政。滞争趣組載決逮人野紹及名信経洋法南明。帯甲前他陳天活第少室整資険情夜鋭超既。詐元稿筑学合近思地休工絵話月時。紛情帯断読辞社属九格内非広薬会。愛鎮回禁空相独京雪易軽暮剤経。請難最権催道億権芸組図滞真開文芸待変刊理。
+
+上歯録購円供署賦際嗅探提留張男駅。避句親辺系海池記議調護土食売梨真負津市得。競強吾選隊供際激崩読覧迎組運済爆歩。合格情楽学歩販申同倉訴威並投介。再脱年問投全投姫低源入真香聞芸。東伝盗心多左始志測能籍禁荏相阪。子起請伝電都見始例回空続覚資基妨政軽割。属不氷広子稿消金手張意繰社善外取護能明扱。台谷野締細文日漁対独皇必権。
+
+領特記重取以南根日長最本図情権十。写近力人停車関飛係文掲南。必角認実載高使打端読罪水判家衝事。速桂著海場筋評府市止精考年。性材圧開料化運刊提択円一対浮作魚者初。気想暮連上仕収町豊人込光棋。放必自接離式早風遺現同効多明軍刊。経聞情航文場投単職必共応朝社。目迎麦流入更問能内露麻際安前。落吉報準午潟委症歴支小要代金着界高。
+
+超教目放供安詳棋勝付以知府誇動図夏事江馴。切島外援食始前掲動院意武。炎金氏葉読産例無各能脂開進旅止大稿国面。当扱問占球緊着木出寄座隆非必。日周更板立広圧人兼真数掲界魚引。手真弘外真演来路金一泉委相。国住千南調梁真同体規委場増念係供報。復込写前松際崎心載後過得隊択。必展毎齢有届豊面手掲権連。字読量降育治再訴福下拉生約止。
+
+育弁温売上表罪際何外輸画死個不悲場決。社願原制神祝択警挙飲玲掲的武。用松連手日暮政試技覧目王会増惑図務進崎逃。終族昭文体扶森近三別狩税帯高住調芸庁点場。書起社転若方館医収事紙学雇。視主酒元調味画持題開月貝。神運設相舎歩勇一歌自約新要聞加略毎苦問行。橋並月三毎業観達南作教教当。要項済作続野週字民住村戦議対年区必軍供方。
+
+近専評新市備市選下哲中表。活掲祭記事企系書腕民隆前身後掲公週人戦。生告売最本九世指価位月書告稿今供。念九午記町聞対発廷社労古台州早質臼社。置川夜菓阪凍下並要村子大郎産。米以障惑響州僕告検無目夕。券不一転男設作駐決覧生函摩団元電万意月住。最者北番百習治問市熱台井見更佑始一女難日。整層選昌庭公痛差技軒七山読程線宿念商索。
+
+多殊行著必量安供直紹見行格。堀戸球題話巣力制分念使降辺育歌詳券里蘭月。状国良発阪提縁挙景問祝者田取著。会育大用上載楽台発探入程団平。限離経夜橋初史大産申点裁作断具。酸覧設製備型一備原参改会績初覧平下。下定中難結景外掲誇景夜真。校南会入考月定職部投首入好。年形加技前禁魅術坪前国書夫。謙問速機払権無学阪掲冷要年批美治経政。
+</Value>
+<Unit>Chinese</Unit>
+</AVU>
+</metadata>
diff --git a/tests/msi_json_arrayops_test.r b/tests/msi_json_arrayops_test.r
index 5e41b1a188215f0301bd2a123bdfe72f7dcecbf9..5e6022a35704322b9b7f394badf30b52920f6a7f 100644
--- a/tests/msi_json_arrayops_test.r
+++ b/tests/msi_json_arrayops_test.r
@@ -6,7 +6,7 @@ myTestRule {
    *item2 = 'U123456-ru.nl';
    *item3 = '{"type":"PMID","id":"12345"}';
    *item4 = '{"type":"arXiv","id":"xyz/abc"}';
-   *item5 = 'null';
+   *item5 = '1';
    *item6 = 'true';
    *item7 = 'false';
    *item8 = '["DICOM","test"]';
@@ -22,23 +22,23 @@ myTestRule {
    *ec = errorcode( msi_json_arrayops(*json_str, *item8, "add", *size) );
 
     # adding null does not supported? 
-   #*ec = errorcode( msi_json_arrayops(*json_str, *item5, "add", *size) );
+   *ec = errorcode( msi_json_arrayops(*json_str, *item5, "add", *size) );
 
     # adding those will append additional boolean values to array 
-   #*ec = errorcode( msi_json_arrayops(*json_str, *item6, "add", *size) );
-   #*ec = errorcode( msi_json_arrayops(*json_str, *item7, "add", *size) );
+   *ec = errorcode( msi_json_arrayops(*json_str, *item6, "add", *size) );
+   *ec = errorcode( msi_json_arrayops(*json_str, *item7, "add", *size) );
 
     # adding those will not change array because they have been presented in it
-   #*ec = errorcode( msi_json_arrayops(*json_str, *item1, "add", *size) );
-   #*ec = errorcode( msi_json_arrayops(*json_str, *item2, "add", *size) );
-   #*ec = errorcode( msi_json_arrayops(*json_str, *item3, "add", *size) );
-   #*ec = errorcode( msi_json_arrayops(*json_str, *item4, "add", *size) );
+   *ec = errorcode( msi_json_arrayops(*json_str, *item1, "add", *size) );
+   *ec = errorcode( msi_json_arrayops(*json_str, *item2, "add", *size) );
+   *ec = errorcode( msi_json_arrayops(*json_str, *item3, "add", *size) );
+   *ec = errorcode( msi_json_arrayops(*json_str, *item4, "add", *size) );
 
    writeLine("stdout", *json_str ++ " size: " ++ *size);
 
    ## remove JSON object (rm/find)
-   #*ec = errorcode( msi_json_arrayops(*json_str, *item3, "rm", *size) );
-   #writeLine("stdout", *json_str ++ " size: " ++ *size);
+   *ec = errorcode( msi_json_arrayops(*json_str, *item3, "rm", *size) );
+   writeLine("stdout", *json_str ++ " size: " ++ *size);
 
    #*idx = 0;
    #*ec = errorcode( msi_json_arrayops(*json_str, *item5, "find", *idx) );
@@ -57,7 +57,7 @@ myTestRule {
    *ec = errorcode( msi_json_arrayops(*json_str, "", "size", *mysize) );
    writeLine("stdout", *json_str ++ " size: " ++ str(*mysize));
 
-   *idx = 0;
+   *idx = 1;
    *item1 = "";
    *ec = errorcode( msi_json_arrayops(*json_str, *item1, "get", *idx) );
    writeLine("stdout", *json_str ++ " " ++ *item1 ++ " at idx: " ++ str(*idx));
diff --git a/tests/test_msiLoadMetadataFromXml_Buf.r b/tests/test_msiLoadMetadataFromXml_Buf.r
new file mode 100644
index 0000000000000000000000000000000000000000..37fbca1397405f9d68d746761509b36d2c0cf7a1
--- /dev/null
+++ b/tests/test_msiLoadMetadataFromXml_Buf.r
@@ -0,0 +1,30 @@
+testRule {
+	if (*objPath=="") {
+		writeLine("stdout", "\*objPath is a required parameter");
+		fail;
+	}
+
+	msiGetIcatTime(*timestamp, 'unix');
+	*str = 
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
+<metadata>
+  <AVU>
+    <Attribute>TestAttribute1</Attribute>
+    <Value>TestValue *timestamp</Value>
+  </AVU>
+  <AVU>
+  <Attribute></Attribute>
+  <Value></Value>
+  </AVU>
+  <AVU>
+    <Attribute>TestAttribute2</Attribute>
+    <Value>TestValue *timestamp</Value>
+    <Unit>km/h</Unit>
+  </AVU>
+</metadata>"
+
+	msiStrToBytesBuf(*str, *buf);
+	msiLoadMetadataFromXml(*objPath, *buf);
+}
+input *objPath=""
+output ruleExecOut
diff --git a/tests/test_msiLoadMetadataFromXml_File.r b/tests/test_msiLoadMetadataFromXml_File.r
new file mode 100644
index 0000000000000000000000000000000000000000..54aed64645fc290cd2aea9f59a9a1e1d992e3c70
--- /dev/null
+++ b/tests/test_msiLoadMetadataFromXml_File.r
@@ -0,0 +1,10 @@
+testRule {
+	if (*objPath=="" || *avuXml =="") {
+		writeLine("stdout", "\*objPath and \*avuXml are a required parameters");
+		fail;
+	}
+
+	msiLoadMetadataFromXml(*objPath, *avuXml);
+}
+input *objPath="", *avuXml=""
+output ruleExecOut
diff --git a/tests/test_msiXsltApply.r b/tests/test_msiXsltApply.r
new file mode 100644
index 0000000000000000000000000000000000000000..02a825feadc429f4bd04cb218b55523875ab92d9
--- /dev/null
+++ b/tests/test_msiXsltApply.r
@@ -0,0 +1,10 @@
+testRule {
+	if (*xsltObj=="" || *xmlObj=="") {
+		writeLine("stdout", "\*xsltObj and \*xmlObj are required parameters");
+	} else {
+		msiXsltApply(*xsltObj, *xmlObj, *outputBuf);
+		writeBytesBuf("stdout", *outputBuf);
+	}
+}
+input *xsltObj="", *xmlObj=""
+output ruleExecOut