- Migrated the Jenkinsfile to match that of the PLC4X project
diff --git a/Jenkinsfile b/Jenkinsfile
index fab451c..2edcad1 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -18,107 +18,253 @@
  *  limitations under the License.
  *
  */
-node('ubuntu') {
+pipeline {
 
-    currentBuild.result = "SUCCESS"
-
-    echo 'Building Branch: ' + env.BRANCH_NAME
-
-    // Setup the required environment variables.
-    def mvnHome = "${tool 'Maven 3 (latest)'}"
-    env.JAVA_HOME="${tool 'JDK 1.8 (latest)'}"
-    env.PATH="${env.JAVA_HOME}/bin:${env.PATH}"
-
-    // Make sure the feature branches don't change the SNAPSHOTS in Nexus.
-    def mavenGoal = "install"
-    def mavenLocalRepo = ""
-    if(env.BRANCH_NAME == 'develop') {
-        mavenGoal = "sonar:sonar deploy"
-    } else {
-        mavenLocalRepo = "-Dmaven.repo.local=${env.WORKSPACE}/.repository"
+    agent {
+        node {
+            label 'ubuntu'
+        }
     }
-    def mavenFailureMode = "" // consider "--fail-at-end"? Odd ordering side effects?
 
-    try {
-        /*stage ('Cleanup') {
-            echo 'Cleaning up the workspace'
-            deleteDir()
-        }*/
+    environment {
+        // It seems the login the jenkins slave uses, doesn't pick up the environment changes,
+        // so we have to try to manually add theme here.
+        MAVEN_HOME = '/opt/maven'
+        PATH = "${MAVEN_HOME}/bin:${env.PATH}"
 
-        stage ('Checkout') {
-            echo 'Checking out branch ' + env.BRANCH_NAME
-            checkout scm
+        PLC4X_BUILD_ON_JENKINS = true
+        JENKINS_PROFILE = 'jenkins-build'
+        // On non develop build we don't want to pollute the global m2 repo
+        MVN_LOCAL_REPO_OPT = '-Dmaven.repo.local=.repository'
+        // Test failures will be handled by the jenkins junit steps and mark the build as unstable.
+        MVN_TEST_FAIL_IGNORE = '-Dmaven.test.failure.ignore=true'
+
+        JAVA_HOME="${tool 'JDK 1.8 (latest)'}"
+    }
+
+    tools {
+        maven 'Maven 3 (latest)'
+        jdk 'JDK 1.8 (latest)'
+    }
+
+    options {
+        // Kill this job after one hour.
+        timeout(time: 1, unit: 'HOURS')
+        // When we have test-fails e.g. we don't need to run the remaining steps
+        skipStagesAfterUnstable()
+        buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '3'))
+    }
+
+    stages {
+        stage('Initialization') {
+            steps {
+                echo 'Building Branch: ' + env.BRANCH_NAME
+                echo 'Using PATH = ' + env.PATH
+            }
         }
 
-        stage ('Clean') {
-            echo 'Cleaning Edgent'
-            sh "${mvnHome}/bin/mvn ${mavenLocalRepo} -Pplatform-android,platform-java7,distribution clean"
+        stage('Cleanup') {
+            steps {
+                echo 'Cleaning up the workspace'
+                deleteDir()
+            }
         }
 
-        stage ('Build Edgent') {
-            echo 'Building Edgent'
-            withSonarQubeEnv('ASF Sonar Analysis') {
-                sh "${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} -Pplatform-android,platform-java7,distribution,toolchain -Djava8.home=${env.JAVA_HOME} -Dedgent.build.ci=true ${mavenGoal}"
+        stage('Checkout') {
+            steps {
+                echo 'Checking out branch ' + env.BRANCH_NAME
+                checkout scm
+            }
+        }
+
+        stage('Build') {
+            when {
+                expression {
+                    env.BRANCH_NAME != 'develop'
+                }
+            }
+            steps {
+                echo 'Building'
+                sh 'mvn -P${JENKINS_PROFILE} ${MVN_TEST_FAIL_IGNORE} ${MVN_LOCAL_REPO_OPT} clean install'
+            }
+            post {
+                always {
+                    junit(testResults: '**/surefire-reports/*.xml', allowEmptyResults: true)
+                    junit(testResults: '**/failsafe-reports/*.xml', allowEmptyResults: true)
+                }
+            }
+        }
+
+        stage('Build develop') {
+            when {
+                branch 'develop'
+            }
+            steps {
+                echo 'Building'
+                // We'll deploy to a relative directory so we can save
+                // that and deploy in a later step on a different node
+                sh 'mvn ${MVN_TEST_FAIL_IGNORE} -Pplatform-android,platform-java7,distribution,toolchain -Djava8.home=${JAVA_HOME} -Dedgent.build.ci=true -DaltDeploymentRepository=snapshot-repo::default::file:./local-snapshots-dir clean deploy'
+            }
+            post {
+                always {
+                    junit(testResults: '**/surefire-reports/*.xml', allowEmptyResults: true)
+                    junit(testResults: '**/failsafe-reports/*.xml', allowEmptyResults: true)
+                }
+            }
+        }
+
+        stage('Code Quality') {
+            when {
+                branch 'develop'
+            }
+            steps {
+                echo 'Checking Code Quality'
+                withSonarQubeEnv('ASF Sonar Analysis') {
+                    sh 'mvn -P${JENKINS_PROFILE} sonar:sonar'
+                }
+            }
+        }
+
+        stage('Deploy') {
+            when {
+                branch 'develop'
+            }
+            steps {
+                echo 'Deploying'
+                // Deploy the artifacts using the wagon-maven-plugin.
+                sh 'mvn -f jenkins.pom -X -P deploy-snapshots wagon:upload'
             }
         }
 
         stage ('Build Site') {
-            if(env.BRANCH_NAME == 'develop') {
+            when {
+                branch 'develop'
+            }
+            steps {
                 echo 'Building Site'
                 sh "${mvnHome}/bin/mvn ${mavenLocalRepo} site site:stage"
-            } else {
-                echo 'Building Site (skipped for non develop branch)'
             }
         }
 
-/* ========================== TODO figure out what to do with samples now in a separate repo
-        stage ('Build Samples') {
-            echo 'Building samples'
-            sh "cd samples; ${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} clean package"
-            sh "cd samples/topology; ./run-sample.sh HelloEdgent"
-            sh "cd samples; ${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} -Pplatform-java7 clean package"
-            sh "cd samples/topology; ./run-sample.sh HelloEdgent"
-        }
 
-        stage ('Build Templates') {
-            echo 'Building templates'
-            sh "cd samples/template; ${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} clean package; ./app-run.sh"
-            sh "cd samples/template; ${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} -Pplatform-java7 clean package; ./app-run.sh"
-            sh "cd samples/template; ${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} -Pplatform-android clean package; ./app-run.sh"
-        }
-========================== */
-
-        /* There seems to be a problem with this (Here the output of the build log):
-
-        Verifying get-edgent-jars
-        [Pipeline] sh
-        [edgent-pipeline_develop-JN4DHO6BQV4SCTGBDJEOL4ZIC6T36DGONHH3VGS4DCDBO6UXH4MA] Running shell script
-        + cd samples/get-edgent-jars-project
-        + ./get-edgent-jars.sh
-        ./get-edgent-jars.sh: 111: [: java8: unexpected operator
-        ./get-edgent-jars.sh: 118: ./get-edgent-jars.sh: Syntax error: "(" unexpected
-
-        */
-        /*stage ('Verify get-engent-jars') {
-            if(env.BRANCH_NAME == 'develop') {
-                echo 'Verifying get-edgent-jars'
-                sh "cd samples/get-edgent-jars-project; ./get-edgent-jars.sh"
-            } else {
-                echo 'Verifying get-edgent-jars (skipped for non develop branch)'
+        stage('Stage site') {
+            when {
+                branch 'develop'
             }
-        }*/
+            steps {
+                echo 'Staging Site'
+                sh 'mvn -P${JENKINS_PROFILE} site:stage'
+                // Stash the generated site so we can publish it on the 'git-website' node.
+                stash includes: 'target/staging/**/*', name: 'edgent-site'
+            }
+        }
+
+        stage('Deploy site') {
+            when {
+                branch 'develop'
+            }
+            // Only the nodes labeled 'git-websites' have the credentials to commit to the.
+            agent {
+                node {
+                    label 'git-websites'
+                }
+            }
+            steps {
+                echo 'Deploying Site'
+                // Clean up the site directory.
+                dir("target/staging") {
+                    deleteDir()
+                }
+
+                // Unstash the previously stashed site.
+                unstash 'edgent-site'
+                // Publish the site with the scm-publish plugin.
+                sh 'mvn -f jenkins.pom -X -P deploy-site scm-publish:publish-scm'
+
+                // Clean up the snapshots directory (freeing up more space after deploying).
+                dir("target/staging") {
+                    deleteDir()
+                }
+            }
+        }
     }
 
+    // Send out notifications on unsuccessful builds.
+    post {
+        // If this build failed, send an email to the list.
+        failure {
+            script {
+                if(env.BRANCH_NAME == "develop") {
+                    emailext(
+                        subject: "[BUILD-FAILURE]: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]'",
+                        body: """
+BUILD-FAILURE: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]':
 
-    catch (err) {
-        currentBuild.result = "FAILURE"
-/*            mail body: "project build error is here: ${env.BUILD_URL}" ,
-            from: 'xxxx@yyyy.com',
-            replyTo: 'dev@edgent.apache.org',
-            subject: 'Autobuild for Branch ' env.BRANCH_NAME
-            to: 'commits@edgent.apache.org'
-*/
-        throw err
+Check console output at "<a href="${env.BUILD_URL}">${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]</a>"
+""",
+                        to: "dev@edgent.apache.org",
+                        recipientProviders: [[$class: 'DevelopersRecipientProvider']]
+                    )
+                }
+            }
+        }
+
+        // If this build didn't fail, but there were failing tests, send an email to the list.
+        unstable {
+            script {
+                if(env.BRANCH_NAME == "develop") {
+                    emailext(
+                        subject: "[BUILD-UNSTABLE]: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]'",
+                        body: """
+BUILD-UNSTABLE: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]':
+
+Check console output at "<a href="${env.BUILD_URL}">${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]</a>"
+""",
+                        to: "dev@edgent.apache.org",
+                        recipientProviders: [[$class: 'DevelopersRecipientProvider']]
+                    )
+                }
+            }
+        }
+
+        // Send an email, if the last build was not successful and this one is.
+        success {
+            // Cleanup the build directory if the build was successful
+            // (in this cae we probably don't have to do any post-build analysis)
+            deleteDir()
+            script {
+                if ((env.BRANCH_NAME == "develop") && (currentBuild.previousBuild != null) && (currentBuild.previousBuild.result != 'SUCCESS')) {
+                    emailext (
+                        subject: "[BUILD-STABLE]: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]'",
+                        body: """
+BUILD-STABLE: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]':
+
+Is back to normal.
+""",
+                        to: "dev@edgent.apache.org",
+                        recipientProviders: [[$class: 'DevelopersRecipientProvider']]
+                    )
+                }
+            }
+        }
+
+        always {
+            script {
+                if(env.BRANCH_NAME == "master") {
+                    emailext(
+                        subject: "[COMMIT-TO-MASTER]: A commit to the master branch was made'",
+                        body: """
+COMMIT-TO-MASTER: A commit to the master branch was made:
+
+Check console output at "<a href="${env.BUILD_URL}">${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]</a>"
+""",
+                        to: "dev@edgent.apache.org",
+                        recipientProviders: [[$class: 'DevelopersRecipientProvider']]
+                    )
+                }
+            }
+        }
     }
 
+
 }
\ No newline at end of file
diff --git a/jenkins.pom b/jenkins.pom
new file mode 100644
index 0000000..e8b1321
--- /dev/null
+++ b/jenkins.pom
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you 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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>21</version>
+    </parent>
+
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-jenkins-tools</artifactId>
+    <version>0.2.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>PLC4X: Jenkins Tools</name>
+    <description>Set of helpers to do individual tasks only needed on our Jenkins build.</description>
+
+    <distributionManagement>
+        <site>
+            <id>apache.website</id>
+            <url>scm:git:https://gitbox.apache.org/repos/asf/incubator-edgent-website.git</url>
+        </site>
+    </distributionManagement>
+
+    <profiles>
+        <!--
+            This profile is used to deploy all the artifacts in the
+            'local-snapshots-dir' to Apache's SNAPSHOT repo.
+        -->
+        <profile>
+            <id>deploy-snapshots</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>wagon-maven-plugin</artifactId>
+                        <version>2.0.0</version>
+                        <configuration>
+                            <fromDir>${project.basedir}/local-snapshots-dir</fromDir>
+                            <includes>**</includes>
+                            <serverId>apache.snapshots.https</serverId>
+                            <url>${distMgmtSnapshotsUrl}</url>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>deploy-site</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-scm-publish-plugin</artifactId>
+                        <configuration>
+                            <!-- mono-module doesn't require site:stage -->
+                            <content>${project.build.directory}/staging</content>
+                            <!-- branch where to deploy -->
+                            <scmBranch>asf-site</scmBranch>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index a53f0ba..7090271 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache</groupId>
     <artifactId>apache</artifactId>
-    <version>19</version>
+    <version>21</version>
   </parent>
 
   <groupId>org.apache.edgent</groupId>