diff --git a/scripts/nbhelper.py b/scripts/nbhelper.py
index 75195e9..8b540dd 100644
--- a/scripts/nbhelper.py
+++ b/scripts/nbhelper.py
@@ -47,6 +47,35 @@
     pynetbox.core.api.Api, yaml.SafeRepresenter.represent_none
 )
 
+netboxapi = None
+netbox_config = None
+netbox_version = None
+
+
+def initialize(extra_args):
+    global netboxapi, netbox_config, netbox_version
+
+    args = parse_cli_args(extra_args)
+    netbox_config = yaml.safe_load(args.settings.read())
+
+    for require_args in ["api_endpoint", "token", "tenant_name"]:
+        if not netbox_config.get(require_args):
+            logger.error("The require argument: %s was not set. Stop." % require_args)
+            sys.exit(1)
+
+    netboxapi = pynetbox.api(
+        netbox_config["api_endpoint"], token=netbox_config["token"], threading=True,
+    )
+
+    if not netbox_config.get("validate_certs", True):
+        session = requests.Session()
+        session.verify = False
+        netboxapi.http_session = session
+
+    netbox_version = netboxapi.version
+
+    return args
+
 
 def parse_cli_args(extra_args={}):
     """
@@ -66,79 +95,95 @@
         "--debug", action="store_true", help="Print additional debugging information"
     )
 
-    if extra_args:
-        for ename, ekwargs in extra_args.items():
-            parser.add_argument(ename, **ekwargs)
+    for ename, ekwargs in extra_args.items():
+        parser.add_argument(ename, **ekwargs)
 
     args = parser.parse_args()
-
-    # only print log messages if debugging
-    if args.debug:
-        logger.setLevel(logging.DEBUG)
-    else:
-        logger.setLevel(logging.INFO)
+    log_level = logging.DEBUG if args.debug else logging.INFO
+    logger.setLevel(log_level)
 
     return args
 
 
+def check_name_dns(name):
+
+    badchars = re.search("[^a-z0-9.-]", name.lower(), re.ASCII)
+
+    if badchars:
+        logger.error(
+            "DNS name '%s' has one or more invalid characters: '%s'",
+            name,
+            badchars.group(0),
+        )
+        sys.exit(1)
+
+    return name.lower()
+
+
+def clean_name_dns(name):
+    return re.sub("[^a-z0-9.-]", "-", name.lower(), 0, re.ASCII)
+
+
 class AttrDict(dict):
     def __init__(self, *args, **kwargs):
         super(AttrDict, self).__init__(*args, **kwargs)
         self.__dict__ = self
 
 
-class NBHelper:
-    def __init__(self, args):
+class NBTenant:
+    def __init__(self):
+        self.name = netbox_config["tenant_name"]
+        self.name_segments = netbox_config.get("prefix_segments", 1)
+        self.tenant = netboxapi.tenancy.tenants.get(name=self.name)
 
-        self.settings = yaml.safe_load(args.settings.read())
+        # NBTenant only keep the resources which owns by it
+        self.devices = list()
+        self.vms = list()
+        self.prefixes = dict()
 
-        self.nbapi = pynetbox.api(
-            self.settings["api_endpoint"], token=self.settings["token"], threading=True,
-        )
+        # Get the Device and Virtual Machines from Netbox API
+        for device_data in netboxapi.dcim.devices.filter(tenant=self.tenant.slug):
+            self.devices.append(NBDevice(device_data))
 
-        if not self.settings["validate_certs"]:
+        for vm_data in netboxapi.virtualization.virtual_machines.filter(
+            tenant=self.tenant.slug
+        ):
+            self.vms.append(NBVirtualMachine(vm_data))
 
-            session = requests.Session()
-            session.verify = False
-            self.nbapi.http_session = session
+    def get_prefixes(self):
+        """Get the IP Prefixes owns by current tenant"""
 
-        self.nb_version = self.nbapi.version
+        if self.prefixes:
+            return self.prefixes
 
-    def all_prefixes(self):
+        vrf = netboxapi.ipam.vrfs.get(tenant=self.tenant.slug)
+        for prefix_data in netboxapi.ipam.prefixes.filter(vrf_id=vrf.id):
+            if prefix_data.description:
+                self.prefixes[prefix_data.description] = NBPrefix(
+                    prefix_data, self.name_segments
+                )
+
+        return self.prefixes
+
+    def generate_netplan(self, name=""):
         """
-        Return a list of prefix objects
+        Get the interface config of specific server belongs to this tenant,
+        If the name wasn't specified, return the management device config by default
         """
 
-        p_items = []
+        target = None
 
-        segments = 1
-
-        if "prefix_segments" in self.settings:
-            segments = self.settings["prefix_segments"]
-
-        for prefix in self.settings["ip_prefixes"]:
-            p_items.append(NBPrefix.get_prefix(self.nbapi, prefix, segments))
-
-        return p_items
-
-    @classmethod
-    def check_name_dns(cls, name):
-
-        badchars = re.search("[^a-z0-9.-]", name.lower(), re.ASCII)
-
-        if badchars:
-            logger.error(
-                "DNS name '%s' has one or more invalid characters: '%s'",
-                name,
-                badchars.group(0),
+        if not name:
+            target = next(
+                filter(
+                    lambda m: m.data["device_role"]["name"] == "Router",
+                    self.devices + self.vms,
+                )
             )
-            sys.exit(1)
+        else:
+            target = next(filter(lambda m: m.name == name, self.devices + self.vms))
 
-        return name.lower()
-
-    @classmethod
-    def clean_name_dns(cls, name):
-        return re.sub("[^a-z0-9.-]", "-", name.lower(), 0, re.ASCII)
+        return target.generate_netplan()
 
 
 @yaml.yaml_object(ydump)
@@ -146,21 +191,16 @@
 
     prefixes = {}
 
-    def __init__(self, api, prefix, name_segments):
-
-        self.nbapi = api
-        self.prefix = prefix
+    def __init__(self, data, name_segments):
+        self.data = data
         self.name_segments = name_segments
-
-        # get prefix information
-        self.prefix_data = self.nbapi.ipam.prefixes.get(prefix=self.prefix)
-        self.domain_extension = NBHelper.check_name_dns(self.prefix_data.description)
+        self.domain_extension = check_name_dns(self.data.description)
 
         logger.debug(
-            "prefix %s, domain_extension %s, data: %s",
-            self.prefix,
+            "Preix %s: domain_extension %s, data: %s",
+            self.data.prefix,
             self.domain_extension,
-            dict(self.prefix_data),
+            dict(self.data),
         )
 
         # ip centric info
@@ -176,14 +216,18 @@
         return cls.prefixes
 
     @classmethod
-    def get_prefix(cls, api, prefix, name_segments=1):
+    def get_prefix(cls, prefix, name_segments=1):
         if prefix in cls.prefixes:
             return cls.prefixes[prefix]
 
-        return NBPrefix(api, prefix, name_segments)
+        data = netboxapi.ipam.prefixes.get(prefix=prefix)
+        if data:
+            return NBPrefix(data, name_segments)
+        else:
+            raise Exception("The prefix %s wasn't found in Netbox" % prefix)
 
     def __repr__(self):
-        return str(self.prefix)
+        return str(self.data.prefix)
 
     @classmethod
     def to_yaml(cls, representer, node):
@@ -204,16 +248,16 @@
         """
 
         # get all parents of this prefix (include self)
-        possible_parents = self.nbapi.ipam.prefixes.filter(contains=self.prefix)
+        possible_parents = netboxapi.ipam.prefixes.filter(contains=self.data.prefix)
 
-        logger.debug("Prefix %s: possible parents %s", self.prefix, possible_parents)
+        logger.debug(
+            "Prefix %s: possible parents %s", self.data.prefix, possible_parents
+        )
 
         # filter out self, return first found
         for pparent in possible_parents:
-            if pparent.prefix != self.prefix:
-                return NBPrefix.get_prefix(
-                    self.nbapi, pparent.prefix, self.name_segments
-                )
+            if pparent.prefix != self.data.prefix:
+                return NBPrefix.get_prefix(pparent.prefix, self.name_segments)
 
         return None
 
@@ -222,7 +266,7 @@
         find ip information for items (devices/vms, reserved_ips, dhcp_range) in prefix
         """
 
-        ips = self.nbapi.ipam.ip_addresses.filter(parent=self.prefix)
+        ips = netboxapi.ipam.ip_addresses.filter(parent=self.data.prefix)
 
         for ip in sorted(ips, key=lambda k: k["address"]):
 
@@ -248,22 +292,17 @@
             # devices and VMs
             if ip.assigned_object:  # can be null if not assigned to a device/vm
                 aotype = ip.assigned_object_type
-
                 if aotype == "dcim.interface":
-
-                    self.aos[str(ip)] = NBDevice.get_dev(
-                        self.nbapi, ip.assigned_object.device.id,
+                    self.aos[str(ip)] = NBDevice.get_by_id(
+                        ip.assigned_object.device.id,
                     )
-
                 elif aotype == "virtualization.vminterface":
-                    self.aos[str(ip)] = NBVirtualMachine.get_vm(
-                        self.nbapi, ip.assigned_object.virtual_machine.id,
+                    self.aos[str(ip)] = NBVirtualMachine.get_by_id(
+                        ip.assigned_object.virtual_machine.id,
                     )
-
                 else:
                     logger.error("IP %s has unknown device type: %s", ip, aotype)
                     sys.exit(1)
-
             else:
                 logger.warning("Unknown IP type %s, with attributes: %s", ip, dict(ip))
 
@@ -277,8 +316,56 @@
     This parent class holds common functions for those two child classes
     """
 
-    def __init__(self, api):
-        self.nbapi = api
+    objects = dict()
+
+    def __init__(self, data):
+        self.data = data
+
+        # The AssignedObject attributes
+        self.id = data.id
+        self.name = data.name
+        self.ips = dict()
+
+        # The NetBox objects related with this AssignedObject
+        self.services = None
+        self.interfaces = list()
+        self.mgmt_interfaces = list()
+        self.interfaces_by_ip = dict()
+
+        if self.__class__ == NBDevice:
+            self.interfaces = netboxapi.dcim.interfaces.filter(device_id=self.id)
+            self.services = netboxapi.ipam.services.filter(device_id=self.id)
+            ip_addresses = netboxapi.ipam.ip_addresses.filter(device_id=self.id)
+        elif self.__class__ == NBVirtualMachine:
+            self.interfaces = netboxapi.virtualization.interfaces.filter(
+                virtual_machine_id=self.id
+            )
+            self.services = netboxapi.ipam.services.filter(virtual_machine_id=self.id)
+            ip_addresses = netboxapi.ipam.ip_addresses.filter(
+                virtual_machine_id=self.id
+            )
+
+        for ip in ip_addresses:
+            self.ips[ip.address] = ip
+            if ip.assigned_object and self.__class__ == NBDevice:
+                self.interfaces_by_ip[ip.address] = netboxapi.dcim.interfaces.get(
+                    ip.assigned_object_id
+                )
+            elif ip.assigned_object and self.__class__ == NBVirtualMachine:
+                self.interfaces_by_ip[
+                    ip.address
+                ] = netboxapi.virtualization.interfaces.get(ip.assigned_object_id)
+                self.interfaces_by_ip[ip.address].mgmt_only = False
+
+        logger.debug(
+            "%s id: %d, data: %s, ips: %s"
+            % (self.type, self.id, dict(self.data), self.ips)
+        )
+
+        self.netplan_config = dict()
+
+    def __repr__(self):
+        return str(dict(self.data))
 
     def dns_name(self, ip, prefix):
         """
@@ -296,7 +383,7 @@
             return name
 
         # clean/split the device name
-        name_split = NBHelper.clean_name_dns(self.data.name).split(".")
+        name_split = clean_name_dns(self.data.name).split(".")
 
         # always add interface suffix to mgmt interfaces
         if self.interfaces_by_ip[ip].mgmt_only:
@@ -377,11 +464,109 @@
         Returns the interface data for the device that has the primary_ip
         """
 
-        if self.data["primary_ip"]:
-            return self.interfaces_by_ip[self.data["primary_ip"]["address"]]
+        if self.data.primary_ip:
+            return self.interfaces_by_ip[self.data.primary_ip.address]
 
         return None
 
+    @property
+    def type(self):
+        return "AssignedObject"
+
+    @classmethod
+    def get_by_id(cls, obj_id):
+        raise Exception("not implemented")
+
+    @classmethod
+    def all_objects(cls):
+        return cls.objects
+
+    @classmethod
+    def to_yaml(cls, representer, node):
+        return representer.represent_dict(
+            {
+                "data": node.data,
+                "services": node.services,
+                "ips": node.ips,
+                "interfaces_by_ip": node.interfaces_by_ip,
+            }
+        )
+
+    def generate_netplan(self):
+        """
+        Get the interface config of specific server belongs to this tenant
+        """
+
+        if self.netplan_config:
+            return self.netplan_config
+
+        if not self.data:
+            logger.error(
+                "{type} {name} doesn't have data yet.".format(
+                    type=self.type, name=self.name
+                )
+            )
+            sys.exit(1)
+
+        primary_ip = self.data.primary_ip.address if self.data.primary_ip else None
+        primary_if = self.interfaces_by_ip[primary_ip] if primary_ip else None
+        physical_ifs = filter(
+            lambda i: str(i.type) != "Virtual"
+            and i != primary_if
+            and i.mgmt_only == False,
+            self.interfaces,
+        )
+
+        self.netplan_config["ethernets"] = dict()
+
+        if self.data.device_role.name == "Router":
+            for address, interface in self.interfaces_by_ip.items():
+                if interface.mgmt_only == True or str(interface.type) == "Virtual":
+                    continue
+
+                self.netplan_config["ethernets"].setdefault(interface.name, {})
+                self.netplan_config["ethernets"][interface.name].setdefault(
+                    "addresses", []
+                ).append(address)
+
+        elif self.data.device_role.name == "Server":
+            if primary_if:
+                self.netplan_config["ethernets"][primary_if.name] = {
+                    "dhcp4": "yes",
+                    "dhcp4-overrides": {"route-metric": 100},
+                }
+
+            for physical_if in physical_ifs:
+                self.netplan_config["ethernets"][physical_if.name] = {
+                    "dhcp4": "yes",
+                    "dhcp4-overrides": {"route-metric": 200},
+                }
+        else:
+            # Exclude the device type which is not Router and Server
+            return None
+
+        # Get interfaces own by AssignedObject and is virtual (VLAN interface)
+        virtual_ifs = filter(lambda i: str(i.type) == "Virtual", self.interfaces)
+
+        for virtual_if in virtual_ifs:
+            if "vlans" not in self.netplan_config:
+                self.netplan_config["vlans"] = dict()
+
+            # vlan_object_id is the "id" on netbox, it's different from known VLAN ID
+            vlan_object_id = virtual_if.tagged_vlans[0].id
+            vlan_object = netboxapi.ipam.vlans.get(vlan_object_id)
+            virtual_if_ips = netboxapi.ipam.ip_addresses.filter(
+                interface_id=virtual_if.id
+            )
+
+            self.netplan_config["vlans"][virtual_if.name] = {
+                "id": vlan_object.vid,
+                "link": virtual_if.label,
+                "addresses": [ip.address for ip in virtual_if_ips],
+            }
+
+        return self.netplan_config
+
 
 @yaml.yaml_object(ydump)
 class NBDevice(NBAssignedObject):
@@ -390,69 +575,29 @@
     Also caches all known devices in a class variable (devs)
     """
 
-    devs = {}
+    objects = dict()
 
-    def __init__(self, api, dev_id):
+    def __init__(self, data):
 
-        super().__init__(api)
+        super().__init__(data)
+        self.objects[self.id] = self
 
-        self.id = dev_id
-        self.data = self.nbapi.dcim.devices.get(dev_id)
-        self.services = self.nbapi.ipam.services.filter(device_id=dev_id)
-
-        # not filled in unless specifically asked for (expensive for a 48 port switch)
-        self.interfaces = []
-        self.mgmt_interfaces = []
-
-        # look up all IP's for this device
-        self.ips = {
-            str(ip): ip for ip in self.nbapi.ipam.ip_addresses.filter(device_id=dev_id)
-        }
-
-        # look up interfaces by IP
-        self.interfaces_by_ip = {}
-        for ip, ip_data in self.ips.items():
-            if ip_data.assigned_object:
-                self.interfaces_by_ip[ip] = self.nbapi.dcim.interfaces.get(
-                    ip_data.assigned_object_id
-                )
-
-        logger.debug(
-            "NBDevice id: %d, data: %s, ips: %s", self.id, dict(self.data), self.ips,
-        )
-
-        self.devs[dev_id] = self
-
-    def __repr__(self):
-        return str(dict(self.data))
+    @property
+    def type(self):
+        return "NBDevice"
 
     def get_interfaces(self):
         if not self.interfaces:
-            self.interfaces = self.nbapi.dcim.interfaces.filter(device_id=self.id)
+            self.interfaces = netboxapi.dcim.interfaces.filter(device_id=self.id)
 
         return self.interfaces
 
     @classmethod
-    def get_dev(cls, api, dev_id):
-        if dev_id in cls.devs:
-            return cls.devs[dev_id]
+    def get_by_id(cls, obj_id):
+        obj = cls.objects.get(obj_id, None)
+        obj = obj or NBDevice(netboxapi.dcim.devices.get(obj_id))
 
-        return NBDevice(api, dev_id)
-
-    @classmethod
-    def all_devs(cls):
-        return cls.devs
-
-    @classmethod
-    def to_yaml(cls, representer, node):
-        return representer.represent_dict(
-            {
-                "data": node.data,
-                "services": node.services,
-                "ips": node.ips,
-                "interfaces_by_ip": node.interfaces_by_ip,
-            }
-        )
+        return obj
 
 
 @yaml.yaml_object(ydump)
@@ -461,77 +606,34 @@
     VM equivalent of NBDevice
     """
 
-    vms = {}
+    objects = dict()
 
-    def __init__(self, api, vm_id):
+    def __init__(self, data):
 
-        super().__init__(api)
+        super().__init__(data)
+        self.objects[self.id] = self
 
-        self.id = vm_id
-        self.data = self.nbapi.virtualization.virtual_machines.get(vm_id)
-        self.services = self.nbapi.ipam.services.filter(virtual_machine_id=vm_id)
-
-        # not filled in unless specifically asked for
-        self.interfaces = []
-
-        # look up all IP's for this device
-        self.ips = {
-            str(ip): ip
-            for ip in self.nbapi.ipam.ip_addresses.filter(virtual_machine_id=vm_id)
-        }
-
-        # look up interfaces by IP
-        self.interfaces_by_ip = {}
-        for ip, ip_data in self.ips.items():
-            if ip_data.assigned_object:
-                self.interfaces_by_ip[ip] = self.nbapi.virtualization.interfaces.get(
-                    ip_data.assigned_object_id
-                )
-                # hack as VM interfaces lack this key, and needed for services
-                self.interfaces_by_ip[ip].mgmt_only = False
-
-        logger.debug(
-            "NBVirtualMachine id: %d, data: %s, ips: %s",
-            self.id,
-            dict(self.data),
-            self.ips,
-        )
-
-        self.vms[vm_id] = self
-
-    def __repr__(self):
-        return str(dict(self.data))
+    @property
+    def type(self):
+        return "NBVirtualMachine"
 
     def get_interfaces(self):
         if not self.interfaces:
-            self.interfaces = self.nbapi.virtualization.interfaces.filter(
+            self.interfaces = netboxapi.virtualization.interfaces.filter(
                 virtual_machine_id=self.id
             )
 
         return self.interfaces
 
     @classmethod
-    def get_vm(cls, api, vm_id):
-        if vm_id in cls.vms:
-            return cls.vms[vm_id]
-
-        return NBVirtualMachine(api, vm_id)
-
-    @classmethod
-    def all_vms(cls):
-        return cls.vms
-
-    @classmethod
-    def to_yaml(cls, representer, node):
-        return representer.represent_dict(
-            {
-                "data": node.data,
-                "services": node.services,
-                "ips": node.ips,
-                "interfaces_by_ip": node.interfaces_by_ip,
-            }
+    def get_by_id(cls, obj_id):
+        obj = cls.objects.get(obj_id, None)
+        obj = obj or NBVirtualMachine(
+            netboxapi.virtualization.virtual_machines.get(obj_id)
         )
 
+        return obj
+
 
 @yaml.yaml_object(ydump)
 class NBDNSForwardZone:
