diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..567609b1234a9b8806c5a05da6c866e480aa148d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+build/
diff --git a/.jenkins.sh b/.jenkins.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f641f31af5c73f8bddd9f308b439c22beb9be4fa
--- /dev/null
+++ b/.jenkins.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright ETSI 2017
+# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt
+
+cd "$(dirname "$0")"
+
+run_dir="$(pwd)/src"
+store_dir="$(pwd)/build"
+
+mkdir -p "$store_dir"
+
+cd docker
+
+./build-container.sh
+./run-container.sh "${run_dir}" "${store_dir}"
+
+exit $?
diff --git a/Readme.md b/Readme.md
index 8d3f27ea0effd71a30b296aebf3c23029c90a77d..918fe740bb3af9807d6b2a1c113c33edaea62c11 100644
--- a/Readme.md
+++ b/Readme.md
@@ -9,6 +9,27 @@ The APIs described in this repository are defined for the following reference po
 
 More information at [NFV Solutions wiki](https://nfvwiki.etsi.org/index.php?title=NFV_Solutions).
 
+## Content structure
+
+All the main OpenAPI files should be put in the `src` directory and organized with the following schema:
+
+   src/deliverable-number/api-name/api-name.yaml
+   
+e.g.
+
+   src/SOL003/LifeCycleManagement/lifeCycleManagement.yaml
+   
+   
+## Building
+
+The build file `.jenkins.sh` will validate the files, evaluate JSON references and store the generated files in the build directory. In case the build is executed by Jenkins, the merged file will be store in a specific directory to be web-served.
+
+To build locally, once Docker is installed, simple run
+
+   $sudo bash .jenkins.sh
+   
+and the results will be stored in a `build/` directory in the project folder.
+
 ## How to raise issues
 
 Change requests can be filed at [ETSI Forge Bugzilla](https://forge.etsi.org/bugzilla/enter_bug.cgi?product=NFV).
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..8d7280cfca572dbe390bcc728faecdc0f2385b99
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,16 @@
+# Copyright ETSI 2017
+# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt
+
+FROM alpine:3.6
+
+RUN apk update
+RUN apk add bash
+RUN apk add nodejs
+RUN apk add nodejs-npm
+RUN npm install -g swagger-tools@0.10.3
+RUN npm install -g json-refs@3.0.2
+
+ADD validate-in-docker.sh /validate-in-docker.sh
+RUN chmod +x /validate-in-docker.sh
+
+CMD ["/validate-in-docker.sh", "/work", "/storage"]
diff --git a/docker/build-container.sh b/docker/build-container.sh
new file mode 100755
index 0000000000000000000000000000000000000000..7c10a3858a6374c6cbf28d11633575e7f3b51971
--- /dev/null
+++ b/docker/build-container.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+# Copyright ETSI 2017
+# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt
+
+docker build -t openapivalidator .
\ No newline at end of file
diff --git a/docker/run-container.sh b/docker/run-container.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3742c37feb117589aa57a2441c11bc4c15f39a9e
--- /dev/null
+++ b/docker/run-container.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+# Copyright ETSI 2017
+# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt
+
+if [ -n "$JOB_BASE_NAME" ] ; then 
+  s="/var/www/html/api/nfv/$JOB_BASE_NAME/$GIT_COMMIT"
+else
+  s="${2:-`pwd`}"
+fi 
+
+f="${1:-`pwd`}"
+
+mkdir -v -p "$s"
+
+echo "Mounting dir $f as /work"
+echo "Mounting dir $s as /storage"
+
+docker run -v "$f":/work  -v "$s":/storage openapivalidator
diff --git a/docker/validate-in-docker.sh b/docker/validate-in-docker.sh
new file mode 100755
index 0000000000000000000000000000000000000000..70d316cf5fa8305f416a4ab9acbcfc44f60e40d1
--- /dev/null
+++ b/docker/validate-in-docker.sh
@@ -0,0 +1,90 @@
+#!/bin/bash
+# Copyright ETSI 2017
+# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt
+
+# Merges OpenAPIs interfaces in the working directory
+# and validates them individually.
+# Exit status is 0 if all validation passed, 1 otherwise
+
+# Usage:
+# $0 <working-directory> <storage-dir>
+
+#set -x
+
+function store_api () {
+	f="$1"
+	cp -v "$1" "${storage_dir}/"
+}
+
+function validate_api () {
+  file="$1"
+  api="$2"
+  deliverable="$3"
+  echo "--- Merging file."
+  merged_file="${deliverable}-${api}-API.yaml"
+  json-refs resolve "${file}" > "${merged_file}"
+
+  echo "--- Validating ${merged_file}"
+  swagger-tools validate "${merged_file}"
+  vres=$?
+  echo "--- Validation done ($res)."
+
+  # If validation succedes, store the generated file
+  [ $vres ] && store_api "${merged_file}"
+  
+  return $vres
+}
+
+
+## Main ##
+
+wd="${1?"Usage: $0 <working-directory> <storage-directory>"}"
+storage_dir="${2?"Usage: $0 <working-directory> <storage-directory>"}"
+
+echo "Entering dir $wd"
+cd "$wd"
+
+# Stores the overall validation result
+# (single results in OR)
+fres=0
+
+for d in */ ; do
+
+    if [ -z "$d" -o "$d" = "*/" ]; then
+        continue
+    fi
+ 
+    deliverable="${d::-1}"
+    echo "#### Checking directory $deliverable ($d)"
+    
+    cd "$deliverable"
+    for dd in */ ; do
+
+        if [ -z "$dd" -o "$dd" = "*/" ]; then
+            continue
+        fi
+        
+        api="${dd::-1}"
+        echo "########## Checking directory $api ($dd)"
+        cd "$dd"
+        for file in ./*; do
+            file_name="${file:2}"
+            #echo "-- $file"
+            #echo "-- Checking file $file_name"
+
+            if [ "$file_name" == "$api.yaml" ]; then            
+	              validate_api "$file_name" "$api" "$deliverable"
+	              res=$?
+                fres=$(($fres||$res))
+            fi
+        done
+        echo 
+        cd ..
+     done
+     cd ..
+done
+
+# Exit code needed for jenkins to know the verdict of the build
+echo "-- Final validator returns $fres."
+exit $fres
+