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
+
+
+
