diff --git a/scripts/configure-compute-node-develop-UBUNTU16.04.sh b/scripts/configure-compute-node-develop-UBUNTU16.04.sh
new file mode 100644
index 0000000..4abe3c7
--- /dev/null
+++ b/scripts/configure-compute-node-develop-UBUNTU16.04.sh
@@ -0,0 +1,432 @@
+#!/bin/bash 
+
+##
+# Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U.
+# This file is part of openvim
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact with: nfvlabs@tid.es
+##
+
+# Authors: Antonio Lopez, Pablo Montes, Alfonso Tierno
+# June 2015
+
+# Personalize RHEL7.1 on compute nodes
+# Prepared to work with the following network card drivers:
+# 	tg3, igb drivers for management interfaces
+# 	ixgbe (Intel Niantic) and i40e (Intel Fortville) drivers for data plane interfaces
+
+# To download:
+# wget https://raw.githubusercontent.com/nfvlabs/openmano/master/scripts/configure-compute-node-develope-UBUNTU16.04.sh
+# To execute:
+# chmod +x ./configure-compute-node-RHEL7.1.sh
+# sudo ./configure-compute-node-RHEL7.1.sh <user> <iface>
+
+# Assumptions:
+# All virtualization options activated on BIOS (vt-d, vt-x, SR-IOV, no power savings...)
+# RHEL7.1 installed without /home partition and with the following packages selection:
+# @base, @core, @development, @network-file-system-client, @virtualization-hypervisor, @virtualization-platform, @virtualization-tools
+
+interfaced_path='/etc/network/interfaces.d/'
+#interfaced_path='/home/ubuntu/openvim_install/openvim/test-inter/'
+set_mtu_path='/etc/'
+VLAN_INDEX=20
+function _usage(){
+
+    echo -e "Usage: sudo $0 [-y] <user-name>  <iface-name>"
+    echo -e "  Configure compute host for VIM usage. (version 0.4). Params:"
+    echo -e "     -y  do not prompt for confirmation. If a new user is created, the user name is set as password"
+    echo -e "     <user-name> Create if not exist and configure this user for openvim to connect"
+    echo -e "     <iface-name> if suplied creates bridge interfaces on this interface, needed for openvim"
+}
+
+function _interface_cfg_generator(){
+    #$1 interface name | $2 MTU | $3 type
+
+echo "
+auto ${1}
+iface ${1} inet ${3}
+        mtu ${2}
+        ${bridge_ports}
+" >> ${interfaced_path}${1}."cfg"
+}
+
+
+function _interface_cfg_generator(){
+    #$1 interface name | $2 vlan  | $3 virbrMan | $4  MTU
+
+echo "
+auto ${1}.${2}
+iface ${1}.${2} inet manual
+        mtu ${4}
+        post-up vconfig add ${1} ${2}
+        post-down vconfig rem ${1}.${2}
+
+auto ${3}
+iface ${3} inet manual
+        bridge_ports ${1}.${2}
+        mtu ${4}
+        vlan-raw-device $1
+" >> ${interfaced_path}${1}.${2}."cfg"
+}
+
+function _install_user() {
+    # create user given by the user and add to groups need it.
+    # Add required groups
+    groupadd -f admin
+    groupadd -f libvirt   #for other operating systems may be libvirtd
+
+    # Adds user, default password same as name
+    if grep -q "^${user_name}:" /etc/passwd
+    then
+        #user exist, add to group
+        echo "adding user ${user_name} to groups libvirt,admin"
+        usermod -a -G libvirt,admin -g admin ${user_name}
+    else
+        #create user if it does not exist
+        [ -z "$FORCE" ] && read -p "user '${user_name}' does not exist, create (Y/n)" kk
+        if ! [ -z "$kk" -o "$kk"="y" -o "$kk"="Y" ]
+        then
+            exit
+        fi
+        echo "creating and configuring user ${user_name}"
+        useradd -m -G libvirt,admin -g admin ${user_name}
+        #Password
+        if [ -z "$FORCE" ]
+            then
+                echo "Provide a password for ${user_name}"
+                passwd ${user_name}
+            else
+                echo -e "$user_name\n$user_name" | passwd --stdin ${user_name}
+        fi
+    fi
+
+}
+
+function _openmano_img_2_libvirt_img(){
+    # Links the OpenMANO required folder /opt/VNF/images to /var/lib/libvirt/images.
+    # The OS installation
+    # should have only a / partition with all possible space available
+
+    echo " link /opt/VNF/images to /var/lib/libvirt/images"
+    if [ "$user_name" != "" ]
+    then
+        # The orchestator needs to link the images folder
+        rm -f /opt/VNF/images
+        mkdir -p /opt/VNF/
+        ln -s /var/lib/libvirt/images /opt/VNF/images
+        chown -R ${user_name}:admin /opt/VNF
+        chown -R root:admin /var/lib/libvirt/images
+        chmod g+rwx /var/lib/libvirt/images
+    else
+        mkdir -p /opt/VNF/images
+        chmod o+rx /opt/VNF/images
+    fi
+}
+
+function _install_pacckags_dependences()
+{
+    # Required packages by openvim
+    apt-get -y update
+    apt-get -y install  grub-common screen virt-manager ethtool build-essential \
+                        x11-common x11-utils libguestfs-tools hwloc libguestfs-tools \
+                        numactl vlan nfs-common nfs-kernel-server
+    echo "Remove unneeded packages....."
+    apt-get -y autoremove
+}
+
+function _network_configuration(){
+    # adding vlan support
+    grep -q '8021q' '/etc/modules'; [ $? -eq 1 ] && sudo su -c 'echo "8021q" >> /etc/modules'
+
+    #grep -q ${interface} '/etc/network/interfaces.d/50-cloud-init.cfg'; [ $? -eq 0 ] && sed -e '/'${interface}'/ s/^#*/#/' -i  '/etc/network/interfaces.d/50-cloud-init.cfg'
+
+    # Network interfaces static configuration
+    echo "Interface ==> $interface"
+    if [ -n "$interface" ]
+    then
+        # For management and data interfaces
+        rm -f /etc/udev/rules.d/pci_config.rules # it will be created to define VFs
+        # Set ONBOOT=on and MTU=9000 on the interface used for the bridges
+        echo "configuring iface $interface"
+
+    # Static network interface configuration and MTU
+    MTU=9000
+    virbrMan_interface_number=20
+
+    #Create bridge interfaces
+    echo "Creating bridge ifaces: "
+    for ((i =1; i <= ${virbrMan_interface_number}; i++))
+        do
+            i2digits=${i}
+            [ ${i} -lt 10 ] && i2digits="0${i}"
+            echo "    ${interface} ${VLAN_INDEX}${i2digits}"
+            echo "    virbrMan${i}  vlan ${VLAN_INDEX}${i2digits}"
+            j=${i}
+            #$1 interface name | $2 vlan | $3 MTU | $3 virbrMan | $4 bridge_ports
+            _interface_cfg_generator  ${interface} ${VLAN_INDEX}${i2digits} 'virbrMan'${i} ${MTU}
+    done
+
+    fi
+}
+
+function _disable_aaparmor(){
+    #Deactivating apparmor while looking for a better solution
+    /etc/init.d/apparmor stop
+    update-rc.d -f apparmor remove
+}
+
+function _check_interface(){
+    #check if interface given as an argument exits
+    if [ -n "$1" ] && ! ifconfig $1 &> /dev/null
+    then
+        echo "Error: interface '$1' is not present in the system"\n
+        _usage
+        exit 1
+    fi
+}
+
+function _user_remainder_pront()
+{
+    echo
+    echo "Do not forget to create a shared (NFS, Samba, ...) where original virtual machine images are allocated"
+    echo
+    echo "Do not forget to copy the public ssh key into /home/${user_name}/.ssh/authorized_keys for authomatic login from openvim controller"
+    echo
+    echo "Reboot the system to make the changes effective"
+}
+
+function _libvirt_configuration(){
+    # Libvirt options for openvim
+    echo "configure Libvirt options"
+    sed -i 's/#unix_sock_group = "libvirt"/unix_sock_group = "libvirt"/' /etc/libvirt/libvirtd.conf
+    sed -i 's/#unix_sock_rw_perms = "0770"/unix_sock_rw_perms = "0770"/' /etc/libvirt/libvirtd.conf
+    sed -i 's/#unix_sock_dir = "\/var\/run\/libvirt"/unix_sock_dir = "\/var\/run\/libvirt"/' /etc/libvirt/libvirtd.conf
+    sed -i 's/#auth_unix_rw = "none"/auth_unix_rw = "none"/' /etc/libvirt/libvirtd.conf
+
+    chmod a+rwx /var/lib/libvirt/images
+    mkdir /usr/libexec/
+    pushd /usr/libexec/
+    ln -s /usr/bin/qemu-system-x86_64 qemu-kvm
+    popd
+}
+
+function _hostinfo_config()
+{
+
+    echo "#By default openvim assumes control plane interface naming as em1,em2,em3,em4 " > /opt/VNF/images/hostinfo.yaml
+    echo "creating local information /opt/VNF/images/hostinfo.yaml"
+    echo "#and bridge ifaces as virbrMan1, virbrMan2, ..." >> /opt/VNF/images/hostinfo.yaml
+    echo "#if compute node contain a different name it must be indicated in this file" >> /opt/VNF/images/hostinfo.yaml
+    echo "#with the format extandard-name: compute-name" >> /opt/VNF/images/hostinfo.yaml
+    chmod o+r /opt/VNF/images/hostinfo.yaml
+}
+
+function _get_opts()
+{
+    [[ ${BASH_SOURCE[0]} != $0 ]] && ___exit="return" || ___exit="exit"
+
+    options="$1"
+    shift
+
+    get_argument=""
+    #reset variables
+    params=""
+    for option_group in $options
+    do
+        _name=${option_group%%:*}
+        _name=${_name%=}
+        _name=${_name//-/_}
+        eval option_${_name}='""'
+    done
+
+    while [[ $# -gt 0 ]]
+    do
+        argument="$1"
+        shift
+        if [[ -n $get_argument ]]
+        then
+            [[ ${argument:0:1} == "-" ]] && echo "option '-$option' requires an argument"  >&2 && $___exit 1
+            eval ${get_argument}='"$argument"'
+            #echo option $get_argument with argument
+            get_argument=""
+            continue
+        fi
+
+
+        #short options
+        if [[ ${argument:0:1} == "-" ]] && [[ ${argument:1:1} != "-" ]] && [[ ${#argument} -ge 2 ]]
+        then
+            index=0
+            while index=$((index+1)) && [[ $index -lt ${#argument} ]]
+            do
+                option=${argument:$index:1}
+                bad_option=y
+                for option_group in $options
+                do
+                    _name=""
+                    for o in $(echo $option_group | tr ":=" " ")
+                    do
+                        [[ -z "$_name" ]] && _name=${o//-/_}
+                        #echo option $option versus $o
+                        if [[ "$option" == "${o}" ]]
+                        then
+                            eval option_${_name}='${option_'${_name}'}-'
+                            bad_option=n
+                            if [[ ${option_group:${#option_group}-1} != "=" ]]
+                            then
+                                continue
+                            fi
+                            if [[ ${#argument} -gt $((index+1)) ]]
+                            then
+                                eval option_${_name}='"${argument:$((index+1))}"'
+                                index=${#argument}
+                            else
+                                get_argument=option_${_name}
+                                #echo next should be argument $argument
+                            fi
+
+                            break
+                        fi
+                    done
+                done
+                [[ $bad_option == y ]] && echo "invalid argument '-$option'?  Type -h for help" >&2 && $___exit 1
+            done
+        elif [[ ${argument:0:2} == "--" ]] && [[ ${#argument} -ge 3 ]]
+        then
+            option=${argument:2}
+            option_argument=${option#*=}
+            option_name=${option%%=*}
+            [[ "$option_name" == "$option" ]] && option_argument=""
+            bad_option=y
+            for option_group in $options
+            do
+                _name=""
+                for o in $(echo $option_group | tr ":=" " ")
+                do
+                    [[ -z "$_name" ]] && _name=${o//-/_}
+                    #echo option $option versus $o
+                    if [[ "$option_name" == "${o}" ]]
+                    then
+                        bad_option=n
+                        if [[ ${option_group:${#option_group}-1} != "=" ]]
+                        then #not an argument
+                            [[ -n "${option_argument}" ]] && echo "option '--${option%%=*}' do not accept an argument " >&2 && $___exit 1
+                            eval option_${_name}='"${option_'${_name}'}-"'
+                        elif [[ -n "${option_argument}" ]]
+                        then
+                            eval option_${_name}='"${option_argument}"'
+                        else
+                            get_argument=option_${_name}
+                            #echo next should be argument $argument
+                        fi
+                        break
+                    fi
+                done
+            done
+            [[ $bad_option == y ]] && echo "invalid argument '-$option'?  Type -h for help" >&2 && $___exit 1
+        elif [[ ${argument:0:2} == "--" ]]
+        then
+            option__="$*"
+            bad_option=y
+            for o in $options
+            do
+                if [[ "$o" == "--" ]]
+                then
+                    bad_option=n
+                    option__=" $*"
+                    break
+                fi
+            done
+            [[ $bad_option == y ]] && echo "invalid argument '--'?  Type -h for help" >&2 && $___exit 1
+            break
+        else
+            params="$params ${argument}"
+        fi
+
+    done
+
+    [[ -n "$get_argument" ]] && echo "option '-$option' requires an argument"  >&2 && $___exit 1
+    $___exit 0
+
+}
+
+function _parse_opts()
+{
+    FORCE=""
+    if [ -n "$option_help" ];
+    then
+        _usage
+        exit -1
+    fi
+
+    if [ -n "$option_force" ];
+        then
+            FORCE="yes"
+            echo "force = yes"
+        fi
+
+    [ -z "$option_user" ] && echo -e "ERROR: User argument is mandatory, --user=<user>\n" && usage
+    USER=${option_user}
+     echo "user_name = "$option_user
+
+    [ -z "$option_iface_name" ] && echo -e "ERROR: User argument is mandatory, --user=<user>\n" && usage
+    interface=$option_iface_name
+
+}
+#1 CHECK input parameters
+#1.1 root privileges
+[ "${USER}" != "root" ] && echo "Needed root privileges" && _usage && exit -1
+
+
+#Parse opts
+_get_opts "help:h force:f user:u= iface-name:in= "  $*
+_parse_opts
+
+echo "checking interface "$interface
+
+_check_interface $interface
+
+echo '
+#################################################################
+#####       INSTALL USER                                    #####
+#################################################################'
+_install_user
+
+echo '
+#################################################################
+#####       INSTALL NEEDED PACKETS                          #####
+#################################################################'
+_install_pacckags_dependences
+
+echo '
+#################################################################
+#####       OTHER CONFIGURATION                             #####
+#################################################################'
+_openmano_img_2_libvirt_img
+_hostinfo_config
+_libvirt_configuration
+
+echo '
+#################################################################
+#####       NETWORK CONFIGURATION                           #####
+#################################################################'
+_network_configuration
+_disable_aaparmor
+_user_remainder_pront
+
+
+
diff --git a/scripts/host-add-develop.sh b/scripts/host-add-develop.sh
index ed84cdf..d62db8d 100755
--- a/scripts/host-add-develop.sh
+++ b/scripts/host-add-develop.sh
@@ -1,3 +1,4 @@
+
 #!/bin/bash
 
 ##
@@ -24,17 +25,22 @@
 #Get configuration of a host for using it as a compute node
 
 function usage(){
-    echo  -e "usage: $0 user ip_name nb_cores GiB_memory nb_10GB_interfaces [hostname] [>> host.yaml]\n  Get host parameters and generated a yaml file to be used for openvim host-add"
-    echo -e "  - In case hostname is not specified it will be used the name of the machine where the script is run"
-    echo -e "  - nb_cores must be an odd number and bigger or equal to 4."
-    echo -e "  - GiB_memory must be an odd number and bigger or equal to 16. 4GiB of memory will be reserved for the host OS, the rest will be used by VM."
-    echo -e "  - nb_10GB_interfaces must be an odd number and bigger or equal to 4."
-    echo -e "  - The output will be a server descriptor with two numas and resources (memory, cores and interfaces) equally distributed between them."
-    echo -e "  - Each interface (physical funtion) will have defined 8 SR-IOV (virtual functions)."
+
+    echo -e "\nUsage: $0 --user <user> --ip=<X.X.X.X> --cores=<core_number> --huge-pages-1G=<huga_pages_number> --nb-10GB-interfaces==<interface_number>"
+    echo -e "Generate a develop host yaml to be used for openvim host-add\n"
+    echo -e "   --user  -u  <user>        Server OAM Ip"
+    echo -e "   --ip    -i  <ip>          Server hostname"
+    echo -e "   --cores -c  <cores>       Numa Cores available must be an odd number and bigger or equal to 4."
+    echo -e "   --huge-pages-1G      -hp  <huge_pages_number>   Must be an odd number and bigger or equal to 16. 4GiB of memory will be reserved for the host OS, the rest will be used by VM."
+    echo -e "   --nb-10GB-interfaces -ni  <nb-10GB-interfaces>  Dataplane interfaces must be an odd number and bigger or equal to 4."
+    echo -e "\n"
+    echo -e "The output will be a server descriptor with two numas and resources (memory, cores and interfaces) equally distributed between them."
+    echo -e "Each interface (physical funtion) will have defined 8 SR-IOV (virtual functions)."
+    echo -e "\n"
     exit 1
 }
 
-function get_hash_value() {   echo `eval  echo $\{\`echo $1[$2]\`\}`; }
+function get_hash_value() {   echo `eval  echo $\{\`echo $USER[$IP]\`\}`; }
 
 function get_mac(){
   seed=$1
@@ -47,105 +53,298 @@
   echo $mac
 }
 
+function _parse_opts(){
+
+    #help argument
+    if [ -n "$option_help" ];
+    then
+        usage
+    fi
+
+    #User argument
+    [ -z "$option_user" ] && echo -e "ERROR: User argument is mandatory, --user=<user>\n" && usage
+    USER=${option_user}
+
+    [ -z "$option_ip" ] && echo -e "ERROR: OAM IP argument is mandatory, --ip=<X.X.X.X>\n" && usage
+    IP=${option_ip}
+
+    #TODO to be checl diference between real cores an numa cores
+    #cores argument
+    REAL_CORES=$(grep -c "^processor" "/proc/cpuinfo")
+    if [ -z "$option_cores" ] ; then
+        CORES=REAL_CORES
+    else
+        CORES=${option_cores}
+    fi
+
+    #Ensure the core user input is big enough
+    ([ $((CORES%2)) -ne 0 ]) && echo -e "ERROR: Wrong number of cores\n" && usage
+
+    MEMORY=$(($(grep MemTotal /proc/meminfo | awk '{print $2}') /1024/1024))
+    if [ -z "$option_huge_pages_1G" ] ; then
+        HUGE_PAGES_MEMORY=0
+    else
+        HUGE_PAGES_MEMORY=${option_huge_pages_1G}
+    fi
+    #Ensure the memory user input is big enough
+    #([ $((MEMORY%2)) -ne 0 ] || [ $MEMORY -lt 16 ] ) && echo -e "ERROR: Wrong number of memory\n" && usage
+
+    #nb_10GB_interfaces argument
+    if [ -z "$nb_10GB_interfaces" ] ; then
+        INTERFACES=8
+    else
+        INTERFACES=${nb_10GB_interfaces}
+    fi
+    ([ $((INTERFACES%2)) -ne 0 ] || [ $INTERFACES -lt 4 ] ) && echo -e "ERROR: Wrong number of interfaces\n" && usage
+
+    # Parameter by default
+    NUMAS=1
+    ([ $((NUMAS%2)) -ne 0 ]) && NUMAS=1
+}
+
+function _generate_compute_develope_yaml(){
+
+    _yaml_init
+
+    FEATURES_LIST="lps,dioc,hwsv,tlbps,ht,lps,64b,iommu"
+
+    #Generate a cpu topology for 4 numas with hyperthreading
+    #in this developing/fake server all cores can be used
+    #TODO check if this calculation is correct
+    echo2file "#This file was created by $0"
+    echo2file "#for adding this compute node to openvim"
+    echo2file "#copy this file to openvim controller and run"
+    echo2file "#openvim host-add <this>"
+    echo2file
+    echo2file "host:"
+    echo2file "  name:    $HOST_NAME"
+    echo2file "  user:    $USER"
+    echo2file "  ip_name: $IP"
+    echo2file "host-data:"
+    echo2file "  name:        $HOST_NAME"
+    echo2file "  user:        $USER"
+    echo2file "  ip_name:     $IP"
+    echo2file "  ranking:     100"
+    echo2file "  description: $HOST_NAME"
+    echo2file "  features:    $FEATURES_LIST"
+    echo2file "  numas:"
+
+    numa=0
+    last_iface=0
+    iface_counter=0
+
+    while [ $numa -lt $NUMAS ]
+    do
+
+      HUGE_PAGES=$((HUGE_PAGES_MEMORY/2-2))
+      ([ ${HUGE_PAGES} -lt -1 ]) && HUGE_PAGES=0
+
+      echo2file "  - numa_socket:  $numa"
+    #MEMORY
+      echo2file "    hugepages: $((HUGE_PAGES))"
+      echo2file "    memory:    $((MEMORY/$NUMAS))"
+    #CORES
+      echo2file "    cores:"
+
+      for((n_core=0;n_core<$REAL_CORES;n_core++))
+        do
+            THREAD_ID=$(($n_core+1))
+            CORE_ID=$(($((${n_core}+${numa}))/2))
+            echo2file "    - core_id:   ${CORE_ID}"
+            echo2file "      thread_id: ${THREAD_ID}"
+            [ $CORE_ID -eq 0 ] && echo2file "      status:    noteligible"
+
+            thread_counter=$((thread_counter+1))
+      done
+      # GENERATE INTERFACES INFORMATION AND PRINT IT
+      seed=$RANDOM
+      echo2file "    interfaces:"
+      for ((iface=0;iface<$INTERFACES;iface+=2))
+      do
+        name="iface$iface_counter"
+        bus=$((iface+last_iface))
+        bus=$((iface))
+        pci=`printf "0000:%02X:00.0" $bus`
+        mac=`get_mac $seed`
+        seed=$((seed+1))
+
+        echo2file "    - source_name: $name"
+        echo2file "      Mbps: 10000"
+        echo2file "      pci: \"$pci\""
+        echo2file "      mac: \"$mac\""
+        echo2file "      sriovs:"
+
+        PCI_COUNTER=0
+        for((nb_sriov=0;nb_sriov<8;nb_sriov++))
+        do
+          #PCI_COUNTER=$((PCI_COUNTER+2))
+          #echo2file "nb_sriov "$nb_sriov
+          #echo2file "PCI_COUNTER "$PCI_COUNTER
+
+          pci=`printf "0000:%02X:10.%i" $bus $nb_sriov`
+          mac=`get_mac $seed`
+          seed=$((seed+1))
+          echo2file "      - source_name: eth$nb_sriov"
+          echo2file "        mac: \"$mac\""
+          echo2file "        pci: \"$pci\""
+        done
+        iface_counter=$((iface_counter+1))
+      done
+      last_iface=$(((numa+1)*127/NUMAS+5)) #made-up formula for more realistic pci numbers
+      numa=$((numa+1))
+    done
+}
+
+function _yaml_init(){
+    echo -n > host-develope.yaml
+}
+
+function echo2file(){
+    echo "${1}"
+    echo "${1}" >> host-develope.yaml
+}
+
+function _get_opts()
+{
+    [[ ${BASH_SOURCE[0]} != $0 ]] && ___exit="return" || ___exit="exit"
+
+    options="$1"
+    shift
+
+    get_argument=""
+    #reset variables
+    params=""
+    for option_group in $options
+    do
+        _name=${option_group%%:*}
+        _name=${_name%=}
+        _name=${_name//-/_}
+        eval option_${_name}='""'
+    done
+
+    while [[ $# -gt 0 ]]
+    do
+        argument="$1"
+        shift
+        if [[ -n $get_argument ]]
+        then
+            [[ ${argument:0:1} == "-" ]] && echo "option '-$option' requires an argument"  >&2 && $___exit 1
+            eval ${get_argument}='"$argument"'
+            #echo option $get_argument with argument
+            get_argument=""
+            continue
+        fi
+
+
+        #short options
+        if [[ ${argument:0:1} == "-" ]] && [[ ${argument:1:1} != "-" ]] && [[ ${#argument} -ge 2 ]]
+        then
+            index=0
+            while index=$((index+1)) && [[ $index -lt ${#argument} ]]
+            do
+                option=${argument:$index:1}
+                bad_option=y
+                for option_group in $options
+                do
+                    _name=""
+                    for o in $(echo $option_group | tr ":=" " ")
+                    do
+                        [[ -z "$_name" ]] && _name=${o//-/_}
+                        #echo option $option versus $o
+                        if [[ "$option" == "${o}" ]]
+                        then
+                            eval option_${_name}='${option_'${_name}'}-'
+                            bad_option=n
+                            if [[ ${option_group:${#option_group}-1} != "=" ]]
+                            then
+                                continue
+                            fi
+                            if [[ ${#argument} -gt $((index+1)) ]]
+                            then
+                                eval option_${_name}='"${argument:$((index+1))}"'
+                                index=${#argument}
+                            else
+                                get_argument=option_${_name}
+                                #echo next should be argument $argument
+                            fi
+
+                            break
+                        fi
+                    done
+                done
+                [[ $bad_option == y ]] && echo "invalid argument '-$option'?  Type -h for help" >&2 && $___exit 1
+            done
+        elif [[ ${argument:0:2} == "--" ]] && [[ ${#argument} -ge 3 ]]
+        then
+            option=${argument:2}
+            option_argument=${option#*=}
+            option_name=${option%%=*}
+            [[ "$option_name" == "$option" ]] && option_argument=""
+            bad_option=y
+            for option_group in $options
+            do
+                _name=""
+                for o in $(echo $option_group | tr ":=" " ")
+                do
+                    [[ -z "$_name" ]] && _name=${o//-/_}
+                    #echo option $option versus $o
+                    if [[ "$option_name" == "${o}" ]]
+                    then
+                        bad_option=n
+                        if [[ ${option_group:${#option_group}-1} != "=" ]]
+                        then #not an argument
+                            [[ -n "${option_argument}" ]] && echo "option '--${option%%=*}' do not accept an argument " >&2 && $___exit 1
+                            eval option_${_name}='"${option_'${_name}'}-"'
+                        elif [[ -n "${option_argument}" ]]
+                        then
+                            eval option_${_name}='"${option_argument}"'
+                        else
+                            get_argument=option_${_name}
+                            #echo next should be argument $argument
+                        fi
+                        break
+                    fi
+                done
+            done
+            [[ $bad_option == y ]] && echo "invalid argument '-$option'?  Type -h for help" >&2 && $___exit 1
+        elif [[ ${argument:0:2} == "--" ]]
+        then
+            option__="$*"
+            bad_option=y
+            for o in $options
+            do
+                if [[ "$o" == "--" ]]
+                then
+                    bad_option=n
+                    option__=" $*"
+                    break
+                fi
+            done
+            [[ $bad_option == y ]] && echo "invalid argument '--'?  Type -h for help" >&2 && $___exit 1
+            break
+        else
+            params="$params ${argument}"
+        fi
+
+    done
+
+    [[ -n "$get_argument" ]] && echo "option '-$option' requires an argument"  >&2 && $___exit 1
+    $___exit 0
+
+}
 
 #check root privileges and non a root user behind
+[ "${USER}" != "root" ] && echo "Needed root privileges" && _usage && exit -1
 
-[ "$#" -lt "5" ] && echo "Missing parameters" && usage
-[ "$#" -gt "6" ] && echo "Too many parameters" && usage
+#process options
+DIRNAME=$(readlink -f ${BASH_SOURCE[0]})
+DIRNAME=$(dirname $DIRNAME)
+
+#source ${DIRNAME}/get-options.sh "help:h user:u= ip:i= cores:c= huge-pages-1G:hp= nb-10GB-interfaces:ni="  $*
+_get_opts "help:h user:u= ip:i= cores:c= huge-pages-1G:hp= nb-10GB-interfaces:ni="  $*
+_parse_opts
+
 HOST_NAME=`cat /etc/hostname`
-[ "$#" -eq "6" ] && HOST_NAME=$6
-FEATURES_LIST="lps,dioc,hwsv,tlbps,ht,lps,64b,iommu"
-NUMAS=2
-CORES=$3
-MEMORY=$4
-INTERFACES=$5
 
-#Ensure the user input is big enough
-([ $((CORES%2)) -ne 0 ] || [ $CORES -lt 4 ] ) && echo -e "ERROR: Wrong number of cores\n" && usage
-([ $((MEMORY%2)) -ne 0 ] || [ $MEMORY -lt 16 ] ) && echo -e "ERROR: Wrong number of memory\n" && usage
-([ $((INTERFACES%2)) -ne 0 ] || [ $INTERFACES -lt 4 ] ) && echo -e "ERROR: Wrong number of interfaces\n" && usage
-
-#Generate a cpu topology for 4 numas with hyperthreading
-CPUS=`pairs_gap=$((CORES/NUMAS));numa=0;inc=0;sibling=0;for((thread=0;thread<=$((pairs_gap-1));thread++)); do printf " ${numa}-${sibling}-${thread} ${numa}-${sibling}-$((thread+pairs_gap))";numa=$(((numa+1)%$NUMAS)); sibling=$((sibling+inc)); inc=$(((inc+1)%2));  done`     
-
-#in this developing/fake server all cores can be used
-
-echo "#This file was created by $0"
-echo "#for adding this compute node to openvim"
-echo "#copy this file to openvim controller and run"
-echo "#openvim host-add <this>"
-echo
-echo "host:"
-echo "  name:    $HOST_NAME"
-echo "  user:    $1"
-echo "  ip_name: $2"
-echo "host-data:"
-echo "  name:        $HOST_NAME"
-echo "  user:        $1"
-echo "  ip_name:     $2"
-echo "  ranking:     100"
-echo "  description: $HOST_NAME"
-echo "  features:    $FEATURES_LIST"
-echo "  numas:"
-
-numa=0
-last_iface=0
-iface_counter=0
-while [ $numa -lt $NUMAS ]
-do
-  echo "  - numa_socket:  $numa"
-#MEMORY
-  echo "    hugepages: $((MEMORY/2-2))"
-  echo "    memory:    $((MEMORY/2))"
-
-#CORES
-  echo "    cores:"
-  for cpu in $CPUS
-  do
-    PHYSICAL=`echo $cpu | cut -f 1 -d"-"`
-    CORE=`echo $cpu | cut -f 2 -d"-"`
-    THREAD=`echo $cpu | cut -f 3 -d"-"`
-    [ $PHYSICAL != $numa ] && continue   #skip non physical
-    echo "    - core_id:   $CORE"
-    echo "      thread_id: $THREAD"
-    [ $CORE -eq 0 ] && echo "      status:    noteligible"
-  done
- 
-
-  #GENERATE INTERFACES INFORMATION AND PRINT IT
-  seed=$RANDOM
-  echo "    interfaces:"
-  for ((iface=0;iface<$INTERFACES;iface+=2))
-  do
-    name="iface$iface_counter"
-    bus=$((iface+last_iface))
-    pci=`printf "0000:%02X:00.0" $bus`
-    mac=`get_mac $seed`
-    seed=$((seed+1))
-  
-    echo "    - source_name: $name"
-    echo "      Mbps: 10000"
-    echo "      pci: \"$pci\""
-    echo "      mac: \"$mac\""
-    echo "      switch_dpid: \"01:02:03:04:05:06\""
-    echo "      switch_port: fake0/$iface_counter"
-    echo "      sriovs:"
-
-    for((nb_sriov=0;nb_sriov<8;nb_sriov++))
-    do
-      pci=`printf "0000:%02X:10.%i" $bus $nb_sriov`
-      mac=`get_mac $seed`
-      seed=$((seed+1))
-      echo "      - mac: \"$mac\""
-      echo "        pci: \"$pci\""
-      echo "        source_name: $nb_sriov"
-    done
-  
-  iface_counter=$((iface_counter+1))
-  done
-  last_iface=$(((numa+1)*127/NUMAS+5)) #made-up formula for more realistic pci numbers 
-  
-
-  numa=$((numa+1))
-done
+_generate_compute_develope_yaml
 
