diff --git a/tests/test-client.sh b/tests/test-client.sh
new file mode 100755
index 0000000000000000000000000000000000000000..236b161fc6b1a2c4508e6e6b5c18c6f37530bc8f
--- /dev/null
+++ b/tests/test-client.sh
@@ -0,0 +1,359 @@
+#!/bin/bash
+# Copyright (C) 2010 Centro de Computacao Cientifica e Software Livre
+# Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+#
+# This file is part of client
+#
+# client is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+# USA.
+
+#------------------------------------------------------------------------------
+# function: initFiles
+# Load ${fileC[]} data to ${fileN[]} files, with corresponding index.
+function initFiles()
+{
+    declare idc
+
+    for (( idc=1 ; idc <= ${#fileC[@]} ; idc+=1 )); do
+        mkdir -p $(dirname ${fileN[$idc]})
+
+        printf "${fileC[$idc]}" > ${fileN[$idc]}
+    done
+}
+#------------------------------------------------------------------------------
+# function: execTest
+# Run test progamed in ${testF[]} and format result message.
+function execTest()
+{
+    initFiles
+
+    eval "${command[$(echo ${testF[$idc]} | cut -d'-' -f4)]}"
+    eval "${command[$(echo ${testF[$idc]} | cut -d'-' -f3)]}"
+
+    message=$(echo "${msg[$(echo ${testF[$idc]} | cut -d'-' -f2)]}" |
+        cut -d'*' -f1)
+    fileToCat=$(echo "${msg[$(echo ${testF[$idc]} | cut -d'-' -f2)]}" |
+        cut -d'*' -f2)
+
+    printf "[ Test $((${idc}+1))/${total} ] Running:  \"$(basename "${APP}"
+        ) ${param[$(echo ${testF[$idc]} | cut -d'-'\
+        -f1)]}\" with ${message}\n\nResult:\n" "$(test -n "${fileToCat}" &&
+            cat "${fileToCat}")"
+
+    ${APP} ${param[$(echo ${testF[$idc]} | cut -d'-' -f1)]}
+    ret=$?
+
+    if $($(cut -d'-' -f5 <<< ${testF[$idc]})); then
+        op=-ne
+    else
+        op=-eq
+    fi
+
+    if test ${ret} ${op} 0; then
+        printf "\nOK: application returned ${ret}\n"
+    else
+        printf "\nFAILURE: application returned ${ret}\n"
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Settings to this script
+PREFIX=$(pwd)
+APP="${PREFIX}/run.sh"
+LOGFILE="${PREFIX}/test-client.log"
+LEVEL=1
+
+#------------------------------------------------------------------------------
+# Parameters passed to application
+param[1]=""
+param[2]="--update"
+param[3]="${param[2]} ${param[2]}"
+param[4]="--inventory"
+param[5]="${param[4]} ${param[4]}"
+param[6]="${param[5]} test.xml"
+param[7]="${param[4]} test.xml"
+param[8]="AAA"
+
+#------------------------------------------------------------------------------
+# Files content. There are loaded with iniFiles()
+fileC[1]="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
+<collect><inep><number type=\"int\" value=\"1234\"/></inep><inventory>
+<disk type=\"tree\"><hdd quantity=\"3\"><hdd0>
+<model value=\"ST3250823AS_5ND23ZJA\" type=\"string\"/>
+<size value=\"232\" type=\"int\"/><used value=\"0\" type=\"int\"/></hdd0><hdd1>
+<model value=\"SAMSUNG_SP2504C_S09QJ1UYB10582\" type=\"string\"/>
+<size value=\"232\" type=\"int\"/><used value=\"0\" type=\"int\"/></hdd1><hdd2>
+<model value=\"SAMSUNG_SP2504C_S09QJ1UYB10589\" type=\"string\"/>
+<size value=\"232\" type=\"int\"/><used value=\"0\" type=\"int\"/></hdd2></hdd>
+</disk><memory><size type=\"int\" value=\"3989\"/></memory><os>
+<distro type=\"string\" value=\"Debian GNU/Linux 5.0 \"/>
+<kernel type=\"string\" value=\"2.6.27.21-opteron\"/>
+<type type=\"string\" value=\"Linux\"/></os><processor>
+<model type=\"string\" value=\"AMD Opteron(tm) Processor 242\"/></processor>
+</inventory><mac-address><number type=\"string\" value=\"00:e0:81:2e:fd:ee\"/>
+</mac-address><use><network><RX type=\"int\" value=\"\"/>
+<TX type=\"int\" value=\"\"/></network></use></collect>"
+fileC[2]="12017000"
+fileC[3]="phost=\npport=\npuid=\nppasswd="
+fileC[4]="0.1.0"
+
+#------------------------------------------------------------------------------
+# Files name manipulated. ${fileN[]} with index equal to ${fileC[]} is loaded
+# with  it's content.
+fileN[1]="${PREFIX}/../data/collect_data.xml"
+fileN[2]="${PREFIX}/conf/inep"
+fileN[3]="${PREFIX}/conf/proxy"
+fileN[4]="${PREFIX}/conf/version"
+fileN[5]="${PREFIX}/bin"
+fileN[6]="${PREFIX}/bin/client"
+fileN[7]="${PREFIX}/common.sh"
+fileN[8]="${PREFIX}/conf"
+fileN[9]="${PREFIX}/lib"
+fileN[10]="${PREFIX}/.bin-excluded"
+fileN[11]="${PREFIX}/bin/client.bkp"
+fileN[12]="${PREFIX}/.common.sh-excluded"
+fileN[13]="${PREFIX}/.conf-excluded"
+fileN[14]="${PREFIX}/.lib-excluded"
+fileN[15]="${PREFIX}/run.sh"
+
+#------------------------------------------------------------------------------
+# url used in connection tests.
+url[1]="http\:\/\/colombard\.c3sl\.ufpr\.br\:8080\/axis\/Seed2\.jws"
+url[2]="colombard\.c3sl\.ufpr\.br\:8080\/axis\/Seed2\.jws"
+url[3]="http\:\/\/Seed2\.jws"
+url[4]="AAA"
+url[5]="http\:\/\/www\.google\.com\.br"
+
+#------------------------------------------------------------------------------
+# Sintax: "[Message]*[file to print with cat(1)]"
+# ps. The local to print file contents is defined by %s
+msg[1]="all files intacts*"
+msg[2]="corrupted ${fileN[2]} file \n\nContent:\n%s*${fileN[2]}"
+msg[3]="corrupted ${fileN[3]} file \n\nContent:\n%s*${fileN[3]}"
+msg[4]="corrupted ${fileN[1]} file \n\nContent:\n%s*${fileN[1]}"
+msg[5]="corrupted ${fileN[4]} file \n\nContent:\n%s*${fileN[4]}"
+msg[6]="deleted ${fileN[2]} file*"
+msg[7]="deleted ${fileN[3]} file*"
+msg[8]="deleted ${fileN[1]} file*"
+msg[9]="deleted ${fileN[4]} file*"
+msg[10]="deleted ${fileN[5]} directory*"
+msg[11]="deleted ${fileN[8]} directory*"
+msg[12]="deleted ${fileN[9]} directory*"
+msg[13]="corrupted ${fileN[6]} executable*"
+msg[14]="deleted ${fileN[6]} executable*"
+msg[15]="corrupted ${fileN[7]} script*"
+msg[16]="deleted ${fileN[7]} script*"
+msg[17]="connection to \"${url[1]}\" server*"
+msg[18]="connection to \"${url[2]}\" server*"
+msg[19]="connection to \"${url[3]}\" server*"
+msg[20]="connection to \"${url[4]}\" server*"
+msg[21]="connection to \"${url[5]}\" server*"
+
+#------------------------------------------------------------------------------
+# commands used in tests.
+command[1]="sort -R ${fileN[1]} -o ${fileN[1]}"
+command[2]="printf \"\nbdd9398636d20d714e0a9adb75c15978\" >> ${fileN[2]}"
+command[3]="printf \"bdd9398636d20d714e0a9adb75c15978\" > ${fileN[2]}"
+command[4]="printf \"bdd9398636d20d714e0a9adb75c15978\" > ${fileN[3]}"
+command[5]="sed -i 's/phost=/phost=bdd9398636d20d714e0a9adb75c15978/g'\
+    ${fileN[3]}"
+command[6]="sed -i 's/pport=/pport=bdd9398636d20d714e0a9adb75c15978/g'\
+    ${fileN[3]}"
+command[7]="sed -i 's/puid=/puid=bdd9398636d20d714e0a9adb75c15978/g'\
+    ${fileN[3]}"
+command[8]="sed -i 's/ppasswd=/ppasswd=bdd9398636d20d714e0a9adb75c15978/g'\
+    ${fileN[3]}"
+command[9]="mv -f ${fileN[5]} ${fileN[10]}"
+command[10]="mv -f ${fileN[6]} ${fileN[11]}"
+command[11]="mv -f ${fileN[7]} ${fileN[12]}"
+command[12]="mv -f ${fileN[8]} ${fileN[13]}"
+command[13]="mv -f ${fileN[9]} ${fileN[14]}"
+command[14]="mv -f ${fileN[10]} ${fileN[5]}"
+command[15]="mv -f ${fileN[11]} ${fileN[6]}"
+command[16]="mv -f ${fileN[12]} ${fileN[7]}"
+command[17]="mv -f ${fileN[13]} ${fileN[8]}"
+command[18]="mv -f ${fileN[14]} ${fileN[9]}"
+command[19]="sort -R ${fileN[11]} -o ${fileN[6]}"
+command[20]="cp -a $(which ls) ${fileN[7]}"
+command[21]="${command[10]}; ${command[19]}"
+command[22]="${command[11]}; ${command[20]}"
+command[23]="rm -f ${fileN1[1]}"
+command[24]="rm -f ${fileN[2]}"
+command[25]="rm -f ${fileN[3]}"
+command[26]="rm -f ${fileN[4]}"
+command[27]="sed -i 's/phost=/phost=127.0.0.1/g' ${fileN[3]}"
+command[28]="sed -i 's/pport=/pport=3128/g' ${fileN[3]}"
+command[29]="sed -i 's/puid=/puid=user0/g' ${fileN[3]}"
+command[30]="sed -i 's/ppasswd=/ppasswd=1234/g' ${fileN[3]}"
+command[31]="${command[27]}; ${command[28]}; ${command[29]}; ${command[30]}"
+command[32]="sed -i 's/^url\=\".*\"$/url\=\"${url[1]}\"/g' ${fileN[15]}"
+command[33]="sed -i 's/^url\=\".*\"$/url\=\"${url[2]}\"/g' ${fileN[15]}"
+command[34]="sed -i 's/^url\=\".*\"$/url\=\"${url[3]}\"/g' ${fileN[15]}"
+command[35]="sed -i 's/^url\=\".*\"$/url\=\"${url[4]}\"/g' ${fileN[15]}"
+command[36]="sed -i 's/^url\=\".*\"$/url\=\"${url[5]}\"/g' ${fileN[15]}"
+command[37]="sed -i 's/\$.dirname.\/run.log/\/dev\/stdout/g' run.sh"
+command[38]="sed -i 's/\/dev\/stdout/\$\{dirname\}\/run.log/g' run.sh"
+command[39]="${command[27]}; ${command[28]}"
+command[40]="${command[29]}; ${command[30]}"
+command[41]="${command[27]}; ${command[28]}; ${command[29]}"
+command[42]="${command[28]}; ${command[29]}; ${command[30]}"
+command[43]="${command[27]}; ${command[28]}; ${command[30]}"
+
+#------------------------------------------------------------------------------
+# Vector index to each test step: "param[]-msg[]-command[]-command[]-failTest"
+# failTest is a boolean value, if test not must fail failTest must be false.
+# Last command is used by default to restore at normal state files.
+testF=(
+    "1-1-37-32-false" # index 0
+    "1-2-2-0-true"
+    "1-2-3-0-true"
+    "1-3-4-0-true"
+    "1-3-5-0-true"
+    "1-3-6-0-true"
+    "1-3-7-0-true"
+    "1-3-8-0-true"
+
+    "1-3-31-0-true"
+    "1-3-39-0-true"
+    "1-3-40-0-true"
+    "1-3-41-0-true"
+    "1-3-42-0-true"
+    "1-3-43-0-true"
+
+    "1-4-1-0-true"
+    "1-6-24-0-true"
+    "1-7-25-0-true"
+    "1-8-23-0-true"
+    "1-9-26-0-true"
+    "2-1-0-0-false"
+    "2-2-2-0-true"
+    "2-2-3-0-true"
+    "2-3-4-0-true"
+    "2-3-5-0-true"
+    "2-3-6-0-true"
+    "2-3-7-0-true"
+    "2-3-8-0-true"
+    "2-4-1-0-true"
+    "2-6-24-0-true"
+    "2-7-25-0-true"
+    "2-8-23-0-true"
+    "2-9-26-0-true"
+    "4-1-0-0-false"
+    "4-2-2-0-true"
+    "4-2-3-0-true"
+    "4-3-4-0-true"
+    "4-3-5-0-true"
+    "4-3-6-0-true"
+    "4-3-7-0-true"
+    "4-3-8-0-true"
+    "4-4-1-0-true"
+    "4-6-24-0-true"
+    "4-7-25-0-true"
+    "4-8-23-0-true"
+    "4-9-26-0-true" # index 44
+
+    "1-0-0-0-false" # index 45
+    "2-0-0-0-false"
+    "3-0-0-0-true"
+    "4-0-0-0-false"
+    "5-0-0-0-true"
+    "6-0-0-0-true"
+    "7-0-0-0-true"
+    "8-0-0-0-true" # index 52
+
+    "1-10-9-0-true" # index 53
+    "1-14-10-14-true"
+    "1-16-11-15-true"
+    "1-11-12-16-true"
+    "1-12-13-17-true"
+    "1-13-21-18-true"
+    "1-15-22-15-true"
+    "2-10-9-16-true"
+    "2-14-10-14-true"
+    "2-16-11-15-true"
+    "2-11-12-16-true"
+    "2-12-13-17-true"
+    "2-13-21-18-true"
+    "2-15-22-15-true"
+    "4-10-9-16-true"
+    "4-14-10-14-true"
+    "4-16-11-15-true"
+    "4-11-12-16-true"
+    "4-12-13-17-true"
+    "4-13-21-18-true"
+    "4-15-22-15-true"
+    "1-1-0-16-false" # index 74
+
+    "1-17-32-0-true" # index 75
+    "1-18-33-0-true"
+    "1-19-34-0-true"
+    "1-20-35-0-true"
+    "1-21-36-0-true"
+    "2-17-32-0-true"
+    "2-18-33-0-true"
+    "2-19-34-0-true"
+    "2-20-35-0-true"
+    "2-21-36-0-true"
+    "4-17-32-0-true"
+    "4-18-33-0-true"
+    "4-19-34-0-true"
+    "4-20-35-0-true"
+    "4-21-36-0-true" # index 89
+
+    "1-1-38-32-false") # index 90
+#------------------------------------------------------------------------------
+# Defines test categories.
+# sintax: "[category name]-[testF[] begin index]-[testF[] end index]"
+testType[1]="files treatment-0-44"
+testType[2]="parameters-45-52"
+testType[3]="application struct-53-74"
+testType[4]="server connection-75-89"
+testType[5]="restoring application-90-90"
+
+total=${#testF[@]}
+
+#------------------------------------------------------------------------------
+# main code
+# run each test category
+
+if (( $# == 1 )) && [[ $1 == "--logfile" ]]; then
+    exec 1>> ${LOGFILE} 2>&1
+    printf "" > ${LOGFILE}
+fi
+
+printf "application path: ${PREFIX}\n"
+printf "###############################################################%s\n\n"\
+    "###########################"
+
+for (( i=1 ; i <= ${#testType[@]} ; i+=1 )); do
+
+    testName=$(echo ${testType[$i]} | cut -d'-' -f1)
+    begin=$(echo ${testType[$i]} | cut -d'-' -f2)
+    end=$(echo ${testType[$i]} | cut -d'-' -f3)
+
+    printf "Testing ${testName}...\n\n"
+
+    for (( idc=${begin} ; idc <= ${end} ; idc+=1 )); do
+        printf "*--------------------------------------------------------%s\n"\
+            "---------------------------------"
+        execTest
+    done
+
+    printf "\nEnd test of ${testName}.\n"
+    printf "###########################################################%s\n\n"\
+        "###############################"
+done
+
+exit 0