diff --git a/molecule/centos-7-build/molecule.yml b/molecule/centos-7-build/molecule.yml
index 0360b8cc2206c8e5c8ba696028262159d0d62040..a9a71d95f5a66aeb73976bb7e273d25608370259 100644
--- a/molecule/centos-7-build/molecule.yml
+++ b/molecule/centos-7-build/molecule.yml
@@ -1,6 +1,4 @@
 ---
-dependency:
-  name: galaxy
 driver:
   name: docker
 platforms:
diff --git a/molecule/centos-7/molecule.yml b/molecule/centos-7/molecule.yml
index 0603e267605af13ec94cd328829cf256e7f690b5..2903631796cbccdc9d13eeed22b0d2e4f5e3193e 100644
--- a/molecule/centos-7/molecule.yml
+++ b/molecule/centos-7/molecule.yml
@@ -1,6 +1,4 @@
 ---
-dependency:
-  name: galaxy
 driver:
   name: docker
 platforms:
diff --git a/molecule/centos-8-build/molecule.yml b/molecule/centos-8-build/molecule.yml
index a7ffacdfa8caa09d62e66fade483224a561bddc6..e19fe11a826af2f6992e603b9aef2102f2f2c01c 100644
--- a/molecule/centos-8-build/molecule.yml
+++ b/molecule/centos-8-build/molecule.yml
@@ -1,6 +1,4 @@
 ---
-dependency:
-  name: galaxy
 driver:
   name: docker
 platforms:
diff --git a/molecule/centos-8/molecule.yml b/molecule/centos-8/molecule.yml
index 4e1ab7930258cd43312471abb3e5ca6776f567bf..eba21c6a5a42d5cedcba711d102ecbd4090ec7cb 100644
--- a/molecule/centos-8/molecule.yml
+++ b/molecule/centos-8/molecule.yml
@@ -1,6 +1,4 @@
 ---
-dependency:
-  name: galaxy
 driver:
   name: docker
 platforms:
diff --git a/molecule/fedora-latest-build/Dockerfile b/molecule/fedora-latest-build/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..f3c2ef6281d6bd7a1abd6641191c91c71f3e04c8
--- /dev/null
+++ b/molecule/fedora-latest-build/Dockerfile
@@ -0,0 +1,30 @@
+FROM fedora:latest
+ENV container=docker
+
+RUN rm -fv /var/cache/dnf/metadata_lock.pid; \
+dnf makecache; \
+dnf --assumeyes install \
+    /usr/bin/python3 \
+    /usr/bin/python3-config \
+    /usr/bin/dnf-3 \
+    sudo \
+    bash \
+    systemd \
+    procps-ng \
+    iproute && \
+dnf clean all; \
+(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
+rm -f /lib/systemd/system/multi-user.target.wants/*;\
+rm -f /etc/systemd/system/*.wants/*;\
+rm -f /lib/systemd/system/local-fs.target.wants/*; \
+rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
+rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
+rm -f /lib/systemd/system/basic.target.wants/*;\
+rm -f /lib/systemd/system/anaconda.target.wants/*; \
+rm -rf /var/cache/dnf/;
+
+STOPSIGNAL RTMIN+3
+
+VOLUME ["/sys/fs/cgroup"]
+
+CMD ["/usr/sbin/init"]
diff --git a/molecule/fedora-latest-build/molecule.yml b/molecule/fedora-latest-build/molecule.yml
new file mode 100644
index 0000000000000000000000000000000000000000..624d99f2e7a7a3351504d7a9a4752e610e7d42c5
--- /dev/null
+++ b/molecule/fedora-latest-build/molecule.yml
@@ -0,0 +1,18 @@
+---
+driver:
+  name: docker
+platforms:
+  - name: fedora-latest-build
+    image: fedora-latest
+    dockerfile: Dockerfile
+    hostname: ipaserver.test.local
+    dns_servers:
+      - 8.8.8.8
+    volumes:
+      - /sys/fs/cgroup:/sys/fs/cgroup:ro
+    command: /usr/sbin/init
+    privileged: true
+provisioner:
+  name: ansible
+  playbooks:
+    prepare: ../resources/playbooks/prepare-build.yml
diff --git a/molecule/fedora-latest/molecule.yml b/molecule/fedora-latest/molecule.yml
new file mode 100644
index 0000000000000000000000000000000000000000..af6fd8d6e25b3d1759377e8c86fc9768ac14e3c0
--- /dev/null
+++ b/molecule/fedora-latest/molecule.yml
@@ -0,0 +1,18 @@
+---
+driver:
+  name: docker
+platforms:
+  - name: fedora-latest
+    image: quay.io/ansible-freeipa/upstream-tests:fedora-latest
+    pre_build_image: true
+    hostname: ipaserver.test.local
+    dns_servers:
+      - 127.0.0.1
+    volumes:
+      - /sys/fs/cgroup:/sys/fs/cgroup:ro
+    command: /usr/sbin/init
+    privileged: true
+provisioner:
+  name: ansible
+  playbooks:
+    prepare: ../resources/playbooks/prepare.yml
diff --git a/molecule/resources/playbooks/prepare-build.yml b/molecule/resources/playbooks/prepare-build.yml
index 784fe7e3b27d2374ff528ed7c2a7c8dc0e99696f..d65236990d75f241286f4a2c1d4029beff5e2d16 100644
--- a/molecule/resources/playbooks/prepare-build.yml
+++ b/molecule/resources/playbooks/prepare-build.yml
@@ -2,34 +2,7 @@
 - name: Converge
   hosts: all
   tasks:
-  - name: Ensure IPv6 is ENABLED
-    sysctl:
-      name: "{{ item.name }}"
-      value: "{{ item.value }}"
-      sysctl_set: yes
-      state: present
-      reload: yes
-    with_items :
-      - name: net.ipv6.conf.all.disable_ipv6
-        value: 0
-      - name: net.ipv6.conf.lo.disable_ipv6
-        value: 0
-      - name: net.ipv6.conf.eth0.disable_ipv6
-        value: 1
-
-  - name: stat protected_regular
-    stat:
-      path: /proc/sys/fs/protected_regular
-    register: result
-
-  - name: Ensure fs.protected_regular is disabled
-    sysctl:
-      name: fs.protected_regular
-      value: 0
-      sysctl_set: yes
-      state: present
-      reload: yes
-    when: result.stat.exists
+  - include_tasks: prepare-common.yml
 
   - name: Ensure sudo package is installed
     package:
diff --git a/molecule/resources/playbooks/prepare-common.yml b/molecule/resources/playbooks/prepare-common.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3a950157728cb37cc49b44f609e9ae76a72de335
--- /dev/null
+++ b/molecule/resources/playbooks/prepare-common.yml
@@ -0,0 +1,29 @@
+- name: Ensure IPv6 is ENABLED
+  sysctl:
+    name: "{{ item.name }}"
+    value: "{{ item.value }}"
+    sysctl_set: yes
+    state: present
+    reload: yes
+  with_items :
+    - name: net.ipv6.conf.all.disable_ipv6
+      value: 0
+    - name: net.ipv6.conf.lo.disable_ipv6
+      value: 0
+    - name: net.ipv6.conf.eth0.disable_ipv6
+      value: 1
+
+- name: stat protected_regular
+  stat:
+    path: /proc/sys/fs/protected_regular
+  register: result
+
+- name: Ensure fs.protected_regular is disabled
+  sysctl:
+    name: fs.protected_regular
+    value: 0
+    sysctl_set: yes
+    state: present
+    reload: yes
+  when: result.stat.exists
+
diff --git a/molecule/resources/playbooks/prepare.yml b/molecule/resources/playbooks/prepare.yml
index fc564d0115f1b21df4a3b7293eac1c1ee7ea3c27..74abef819be5a5bf5805cd5cc8c400d1ecceefbd 100644
--- a/molecule/resources/playbooks/prepare.yml
+++ b/molecule/resources/playbooks/prepare.yml
@@ -2,12 +2,14 @@
 - name: Converge
   hosts: all
   tasks:
+  - include_tasks: prepare-common.yml
+
   - name: Ensure lock dirs for DS exists
     file:
       state: directory
       owner: dirsrv
       group: dirsrv
-      path: "{{ item }} "
+      path: "{{ item }}"
     loop:
       - /var/lock/dirsrv/
       - /var/lock/dirsrv/slapd-TEST-LOCAL/
diff --git a/tests/azure/build-containers.yml b/tests/azure/build-containers.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2f987809dc1d8c7772fcc0150fac95aea0f851c9
--- /dev/null
+++ b/tests/azure/build-containers.yml
@@ -0,0 +1,31 @@
+---
+
+schedules:
+- cron: "0 0 * * *"
+  displayName: Daily midnight build
+  branches:
+    include:
+    - master
+
+pool:
+  vmImage: 'ubuntu-18.04'
+
+jobs:
+
+- template: templates/build_container.yml
+  parameters:
+    job_name_suffix: Centos7
+    container_name: centos-7
+    build_scenario_name: centos-7-build
+
+- template: templates/build_container.yml
+  parameters:
+    job_name_suffix: Centos8
+    container_name: centos-8
+    build_scenario_name: centos-8-build
+
+- template: templates/build_container.yml
+  parameters:
+    job_name_suffix: FedoraLatest
+    container_name: fedora-latest
+    build_scenario_name: fedora-latest-build
diff --git a/tests/azure/templates/build_container.yml b/tests/azure/templates/build_container.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8649a336f3d776f486ec8e88615db9630e190979
--- /dev/null
+++ b/tests/azure/templates/build_container.yml
@@ -0,0 +1,35 @@
+
+parameters:
+  - name: job_name_suffix
+    type: string
+  - name: container_name
+    type: string
+  - name: build_scenario_name
+    type: string
+
+jobs:
+- job: BuildTestImage${{ parameters.job_name_suffix }}
+  displayName: Build ${{ parameters.container_name }} test container
+  steps:
+  - task: UsePythonVersion@0
+    inputs:
+      versionSpec: '3.6'
+
+  - script: python -m pip install --upgrade pip setuptools wheel
+    displayName: Install tools
+
+  - script: pip install molecule[docker]
+    displayName: Install molecule
+
+  - script: molecule create -s ${{ parameters.build_scenario_name }}
+    displayName: Create test container
+
+  - script: |
+      docker stop ${{ parameters.build_scenario_name }}
+      docker commit ${{ parameters.build_scenario_name }} quay.io/ansible-freeipa/upstream-tests:${{ parameters.container_name }}
+      docker login -u="$QUAY_ROBOT_USERNAME" -p="$QUAY_ROBOT_TOKEN" quay.io
+      docker push quay.io/ansible-freeipa/upstream-tests:${{ parameters.container_name }}
+    displayName: Save image and upload
+    env:
+      # Secrets needs to be mapped as env vars to work properly
+      QUAY_ROBOT_TOKEN: $(QUAY_ROBOT_TOKEN)