diff --git a/group_vars/dev_environments.yml b/group_vars/dev_environments.yml
new file mode 100644
index 0000000000000000000000000000000000000000..60ccfbbc17ad7285838f8d5b6387652ac9c4f9d9
--- /dev/null
+++ b/group_vars/dev_environments.yml
@@ -0,0 +1,18 @@
+s3:
+  access_key: AKIA6DQFYS5WRMJU4FW6
+  secret_key: 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
+  region: eu-west-3
+  bucket: geant-emulation-images
+
+normal_images:
+  - filename: cEOS-lab-4.28.2.1F.tar
+    image_name: ceos
+    image_tag: 4.28.1.1F
+
+vrnetlab_images:
+  - vm_image: vmx-bundle-18.2R1.9.tgz
+    integration: vmx
+    image_name: vrnetlab/vr-vmx
+    image_tag: 18.2R1.9
+
+nat_user: nat
diff --git a/roles/dev_images/tasks/build_image.yml b/roles/dev_images/tasks/build_image.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e33f4289b586c1d4d91ab2a6c8a6f0fd6bc10aa1
--- /dev/null
+++ b/roles/dev_images/tasks/build_image.yml
@@ -0,0 +1,22 @@
+- name: Inspect a single image
+  community.docker.docker_image_info:
+    name: "{{ image.image_name }}:{{ image.image_tag }}"
+  register: image_exists
+
+- name: Stop if image exists
+  ansible.builtin.meta: end_play
+  when: image_exists.images | length > 0
+
+- name: Get VM image
+  amazon.aws.aws_s3:
+    aws_access_key: "{{ s3.access_key }}"
+    aws_secret_key: "{{ s3.secret_key }}"
+    region: "{{ s3.region }}"
+    bucket: "{{ s3.bucket }}"
+    object: "{{ image.vm_image }}"
+    dest: "$HOME/vrnetlab/{{ image.integration }}/{{ image.vm_image }}"
+    mode: get
+
+- name: Build/install the docker image
+  community.general.make:
+    chdir: "$HOME/vrnetlab/{{ image.integration }}"
diff --git a/roles/dev_images/tasks/import_image.yml b/roles/dev_images/tasks/import_image.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8144ec18d9105166855bcea98bf8ee6f7b976b7e
--- /dev/null
+++ b/roles/dev_images/tasks/import_image.yml
@@ -0,0 +1,42 @@
+- name: Inspect a single image
+  community.docker.docker_image_info:
+    name: "{{ image.image_name }}:{{ image.image_tag }}"
+  register: image_exists
+
+- name: Stop if image exists
+  ansible.builtin.meta: end_play
+  when: image_exists.images | length > 0
+
+- name: Get VM images
+  amazon.aws.aws_s3:
+    aws_access_key: "{{ s3.access_key }}"
+    aws_secret_key: "{{ s3.secret_key }}"
+    region: "{{ s3.region }}"
+    bucket: "{{ s3.bucket }}"
+    object: "{{ image.filename }}"
+    dest: "/tmp/{{ image.filename }}"
+    mode: get
+
+# - name: Add docker images
+#   community.docker.docker_image:
+#     docker_host: "unix:/run/docker.sock"
+#     name: "{{ item.image_name }}"
+#     tag: "{{ item.image_tag }}"
+#     load_path: "/tmp/{{ item.filename }}"
+#     source: load
+#     state: present
+#   loop:
+#     - filename: cEOS-lab-4.28.2.1F.tar
+#       image_name: ceos
+#       image_tag: 4.28.1.1F
+
+
+- name: Add docker images
+  # community.docker.docker_image doesn't work in this case
+  ansible.builtin.shell:
+    cmd: "docker image import /tmp/{{ image.filename }} {{ image.image_name }}:{{ image.image_tag }}"
+
+- name: Remove downloaded file
+  ansible.builtin.file:
+    path: "/tmp/{{ image.filename }}"
+    state: absent
diff --git a/roles/dev_images/tasks/main.yml b/roles/dev_images/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5d1180ef47c051a77ff12a614d2aca862c0c4b53
--- /dev/null
+++ b/roles/dev_images/tasks/main.yml
@@ -0,0 +1,23 @@
+- name: Install Packages
+  ansible.builtin.apt:
+    pkg:
+      - git
+      - make
+
+- name: Clone vrnetlab
+  ansible.builtin.git:
+    repo: https://github.com/hellt/vrnetlab
+    version: v0.8.1
+    dest: $HOME/vrnetlab
+
+- name: Build vrnetlab images
+  ansible.builtin.include_tasks: build_image.yml
+  loop: "{{ vrnetlab_images }}"
+  loop_control:
+    loop_var: image
+
+- name: Import normal images
+  ansible.builtin.include_tasks: import_image.yml
+  loop: "{{ normal_images }}"
+  loop_control:
+    loop_var: image
diff --git a/roles/dev_networks/files/lab01/vmx1.cfg b/roles/dev_networks/files/lab01/vmx1.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..b3b28e0e2ec7bd3cd486c284e42b37442def54d6
--- /dev/null
+++ b/roles/dev_networks/files/lab01/vmx1.cfg
@@ -0,0 +1,5 @@
+configure
+set interfaces ge-0/0/0 unit 0 family inet address 192.168.1.2/24
+set interfaces ge-0/0/1 unit 1 family inet address 192.168.1.3/24
+set interfaces ge-0/0/2 unit 2 family inet address 192.168.1.4/24
+commit
\ No newline at end of file
diff --git a/roles/dev_networks/files/lab01/vmx2.cfg b/roles/dev_networks/files/lab01/vmx2.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..31d78460f025fe1f23a97fc398bdf9aeaa40e895
--- /dev/null
+++ b/roles/dev_networks/files/lab01/vmx2.cfg
@@ -0,0 +1,5 @@
+configure
+set interfaces ge-0/0/0 unit 0 family inet address 192.168.2.2/24
+set interfaces ge-0/0/1 unit 1 family inet address 192.168.2.3/24
+set interfaces ge-0/0/2 unit 2 family inet address 192.168.2.4/24
+commit
\ No newline at end of file
diff --git a/roles/dev_networks/files/lab01/vr-vmx.clab.yml b/roles/dev_networks/files/lab01/vr-vmx.clab.yml
new file mode 100644
index 0000000000000000000000000000000000000000..75f4b8545573db28d93e846b0a1fbd8cbed5d5ff
--- /dev/null
+++ b/roles/dev_networks/files/lab01/vr-vmx.clab.yml
@@ -0,0 +1,15 @@
+name: vr-vmx
+
+topology:
+  nodes:
+    vmx1:
+      kind: vr-vmx
+      image: vrnetlab/vr-vmx:18.2R1.9
+      startup-config: vmx1.cfg
+    vmx2:
+      kind: vr-vmx
+      image: vrnetlab/vr-vmx:18.2R1.9
+      startup-config: vmx2.cfg
+
+  links:
+    - endpoints: ["vmx1:eth1", "vmx2:eth1"]
diff --git a/roles/dev_networks/tasks/main.yml b/roles/dev_networks/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fa9b7321a3e782ccd9cebd10048e7173cfc5bd78
--- /dev/null
+++ b/roles/dev_networks/tasks/main.yml
@@ -0,0 +1,6 @@
+- name: Copy lab01 project to remote
+  ansible.builtin.copy:
+    src: lab01
+    dest: $HOME
+    directory_mode: '0755'
+    mode: '0644'
diff --git a/roles/dev_networks/templates/ceosx2.clab.yml.j2 b/roles/dev_networks/templates/ceosx2.clab.yml.j2
new file mode 100644
index 0000000000000000000000000000000000000000..caf1bb07ec41af8c42af2e8f8a81a05733a72456
--- /dev/null
+++ b/roles/dev_networks/templates/ceosx2.clab.yml.j2
@@ -0,0 +1,14 @@
+name: ceosx2
+
+topology:
+  nodes:
+    ceos1:
+      kind: ceos
+      image: ceos:4.28.1.1F
+    ceos2:
+      kind: ceos
+      image: ceos:4.28.1.1F
+
+  links:
+    - endpoints: ["ceos1:eth1", "ceos2:eth1"]
+
diff --git a/roles/dev_networks/templates/srlceos01.clab.yml.j2 b/roles/dev_networks/templates/srlceos01.clab.yml.j2
new file mode 100644
index 0000000000000000000000000000000000000000..75f1be002dd443b1a116ca94bea9696b53766a78
--- /dev/null
+++ b/roles/dev_networks/templates/srlceos01.clab.yml.j2
@@ -0,0 +1,14 @@
+name: srlceos01
+
+topology:
+  nodes:
+    srl:
+      kind: srl
+      image: ghcr.io/nokia/srlinux
+    ceos:
+      kind: srl
+      image: ghcr.io/nokia/srlinux
+
+  links:
+    - endpoints: ["srl:e1-1", "ceos:e1-1"]
+