user_array.append(userdict)
 
+        user_array.append({
+            "name": "opnfv",
+            "plain_text_passwd": "OPNFV_HOST",
+            "ssh_redirect_user": True,
+            "sudo": "ALL=(ALL) NOPASSWD:ALL",
+            "groups": "sudo",
+            })
+
         return user_array
 
     def _serialize_netconf_v1(self):
+        interfaces = {} # map from iface_name => dhcp_config
+        #vlans = {} # map from vlan_id => dhcp_config
+
         config_arr = []
 
         for interface in self._resource().interfaces.all():
             interface_name = interface.profile.name
             interface_mac = interface.mac_address
 
+            iface_dict_entry = {
+                    "type": "physical",
+                    "name": interface_name,
+                    "mac_address": interface_mac,
+                }
+
+
             for vlan in interface.config.all():
-                vlan_dict_entry = {'type': 'vlan'}
-                vlan_dict_entry['name'] = str(interface_name) + "." + str(vlan.vlan_id)
-                vlan_dict_entry['link'] = str(interface_name)
-                vlan_dict_entry['vlan_id'] = int(vlan.vlan_id)
-                vlan_dict_entry['mac_address'] = str(interface_mac)
+                if vlan.tagged:
+                    vlan_dict_entry = {'type': 'vlan'}
+                    vlan_dict_entry['name'] = str(interface_name) + "." + str(vlan.vlan_id)
+                    vlan_dict_entry['vlan_link'] = str(interface_name)
+                    vlan_dict_entry['vlan_id'] = int(vlan.vlan_id)
+                    vlan_dict_entry['mac_address'] = str(interface_mac)
+                    if vlan.public:
+                        vlan_dict_entry["subnets"] = [ { "type": "dhcp" } ]
+                    config_arr.append(vlan_dict_entry)
+                if (not vlan.tagged) and vlan.public:
+                    iface_dict_entry["subnets"] = [ { "type": "dhcp" } ]
+
                 #vlan_dict_entry['mtu'] = # TODO, determine override MTU if needed
 
-                config_arr.append(vlan_dict_entry)
+            config_arr.append(iface_dict_entry)
+
 
         ns_dict = {
                 'type': 'nameserver',
         return main_dict
 
     def serialize(self) -> str:
-        return yaml.dump(self._to_dict())
+        return str("#cloud-config\n") + yaml.dump(self._to_dict())
 
 class Job(models.Model):
     """
 
     lab_user,
     GenerateTokenView,
     analytics_job,
-    resource_cidata,
+    resource_ci_metadata,
+    resource_ci_userdata,
     all_images,
     all_opsyss,
     single_image,
     path('labs/<slug:lab_name>/booking/<int:booking_id>/idf', get_idf, name="get-idf"),
     path('labs/<slug:lab_name>/jobs/<int:job_id>', specific_job),
     path('labs/<slug:lab_name>/jobs/<int:job_id>/<slug:task_id>', specific_task),
-    path('labs/<slug:lab_name>/jobs/<int:job_id>/cidata/<slug:resource_id>', resource_cidata),
+    path('labs/<slug:lab_name>/jobs/<int:job_id>/cidata/<slug:resource_id>/user-data', resource_ci_userdata),
+    path('labs/<slug:lab_name>/jobs/<int:job_id>/cidata/<slug:resource_id>/meta-data', resource_ci_metadata),
     path('labs/<slug:lab_name>/jobs/new', new_jobs),
     path('labs/<slug:lab_name>/jobs/current', current_jobs),
     path('labs/<slug:lab_name>/jobs/done', done_jobs),
 
     return JsonResponse(lab_manager.get_job(job_id), safe=False)
 
 @csrf_exempt
-def resource_cidata(request, lab_name="", job_id="", resource_id=""):
+def resource_ci_userdata(request, lab_name="", job_id="", resource_id=""):
     #lab_token = request.META.get('HTTP_AUTH_TOKEN')
     #lab_manager = LabManagerTracker.get(lab_name, lab_token)
 
 
     return HttpResponse(cifile.serialize(), status=200)
 
+@csrf_exempt
+def resource_ci_metadata(request, lab_name="", job_id="", resource_id=""):
+    return HttpResponse("#cloud-config", status=200)
+
 
 def new_jobs(request, lab_name=""):
     lab_token = request.META.get('HTTP_AUTH_TOKEN')