diff --git a/netbox_sys_plugin/api/serializers.py b/netbox_sys_plugin/api/serializers.py
index 9f059aff5e5fec54e89589655507eca399f02b1c..7dd60b3d07ba0f359b1c9fdfb98300f35bd09bed 100644
--- a/netbox_sys_plugin/api/serializers.py
+++ b/netbox_sys_plugin/api/serializers.py
@@ -14,6 +14,7 @@ from virtualization.choices import *
 from netbox.api.serializers import NetBoxModelSerializer
 from ..utils import validate_extra_config_values
 from ..validators import validate_extra_config_structure
+import json
 
 #Netbox Data Serializer
 
@@ -396,4 +397,132 @@ class VirtualMachineSerializer(NetBoxModelSerializer):
         vm_assigned_extra_config = VmAssignedExtraConfig.objects.filter(assigned_object_type=ContentType.objects.get_for_model(VirtualMachine),
             assigned_object_id=obj.id)
         return NestedVmAssignedExtraConfigSerializer(vm_assigned_extra_config, many=True).data
-    
\ No newline at end of file
+
+class CreateVirtualMachineSerializer(serializers.Serializer):
+    """Serializer to handle Create VM requests."""
+    provider_type = serializers.IntegerField(required=True)
+    provider = serializers.IntegerField(required=True)
+    name = serializers.CharField(required=True, max_length=50)
+    status = serializers.CharField(required=True, max_length=50)
+    owner = serializers.IntegerField(required=True)
+    platform = serializers.IntegerField(required=True)
+    description = serializers.CharField(required=True)
+    virtual_machine_type = serializers.IntegerField(required=True)
+    interface_name = serializers.CharField(required=True, max_length=50)
+    ip_addresses = serializers.CharField(required=True, max_length=50)
+    ip_addresses_status = serializers.CharField(required=True, max_length=50)
+    gateway = serializers.CharField(required=True, max_length=50)
+    gateway_status = serializers.CharField(required=True, max_length=50)
+    domain_names = serializers.JSONField(required=False)
+    extra_config_structure = serializers.IntegerField(required=True)
+    extra_config_values = serializers.JSONField(required=False)
+    ntp_service_name = serializers.CharField(required=True, max_length=50)
+    ntp_service_protocol = serializers.CharField(required=True, max_length=50)
+    ntp_service_ports = serializers.CharField(required=True, max_length=50)
+    dns_service_name = serializers.CharField(required=True, max_length=50)
+    dns_service_protocol = serializers.CharField(required=True, max_length=50)
+    dns_service_ports = serializers.CharField(required=True, max_length=50)
+    syslog_service_name = serializers.CharField(required=True, max_length=50)
+    syslog_service_protocol = serializers.CharField(required=True, max_length=50)
+    syslog_service_ports = serializers.CharField(required=True, max_length=50)
+    tag = serializers.IntegerField(required=False)
+
+    class Meta:
+        fields = ['cluster_type','cluster','name','status','role','platform'
+                  ,'description','virtual_machine_type','interface_name','ip_addresses','ip_addresses_status'
+                  ,'gateway','gateway_status','domain_names','extra_config_structure','extra_config_values'
+                  ,'ntp_service_name','ntp_service_protocol','ntp_service_ports'
+                  ,'dns_service_name','dns_service_protocol','dns_service_ports'
+                  ,'syslog_service_name','syslog_service_protocol','syslog_service_ports'
+                  ,'tag'
+                  ]
+
+    def validate(self, data):
+        request = self.context.get("request")
+        if not request or not request.user.has_perm("virtualization.add_virtualmachine"):
+            raise serializers.ValidationError("You dont have permission to create a VM")
+
+        cluster_type = data.pop('provider_type', None)
+        data['cl_list_new-cluster_type']= str(cluster_type)
+        
+        cluster = data.pop('provider', None)
+        data['cl_list_new-cluster']= str(cluster)
+
+        name = data.pop('name', None)
+        data['vms_new-0-name']=name
+
+        status = data.pop('status', None)
+        data['vms_new-0-status']=status
+
+        role = data.pop('owner', None)
+        data['vms_new-0-role']=str(role)
+        
+        platform = data.pop('platform', None)
+        data['vms_new-0-platform']=str(platform)
+
+        description = data.pop('description', None)
+        data['vms_new-0-description']=description
+
+        virtual_machine_type = data.pop('virtual_machine_type', None)
+        data['vmassignedvmtype_new-virtual_machine_type']=str(virtual_machine_type)
+        
+        interface_name = data.pop('interface_name', None)
+        data['vmis_new-0-name']=interface_name
+        
+        ip_addresses = data.pop('ip_addresses', None)
+        data['ip_new-address']=ip_addresses
+
+        ip_addresses_status = data.pop('ip_addresses_status', None)
+        data['ip_new-status']=ip_addresses_status
+
+        gateway = data.pop('gateway', None)
+        data['gateway_new-address']=gateway
+
+        gateway_status = data.pop('gateway_status', None)
+        data['gateway_new-status']=gateway_status
+        
+        domain_names = data.pop('domain_names', None)
+        data['domainnames_new-domain_names']=json.dumps(domain_names)
+        
+        extra_config_structure = data.pop('extra_config_structure', None)
+        data['vmassignedextraconfig_new-provider_type_extra_config']=str(extra_config_structure)
+
+        extra_config_values = data.pop('extra_config_values', None)
+        data['vmassignedextraconfig_new-extra_config_values']=json.dumps(extra_config_values)
+
+        ntp_service_name = data.pop('ntp_service_name', None)
+        data['service_ntp-0-name']=ntp_service_name
+
+        ntp_service_protocol = data.pop('ntp_service_protocol', None)
+        data['service_ntp-0-protocol']=ntp_service_protocol
+        
+        ntp_service_ports = data.pop('ntp_service_ports', None)
+        data['service_ntp-0-ports']=ntp_service_ports
+        
+        dns_service_name = data.pop('dns_service_name', None)
+        data['service_dns-0-name']=dns_service_name
+
+        dns_service_protocol = data.pop('dns_service_protocol', None)
+        data['service_dns-0-protocol']=dns_service_protocol
+
+        dns_service_ports = data.pop('dns_service_ports', None)
+        data['service_dns-0-ports']= dns_service_ports
+
+        syslog_service_name = data.pop('syslog_service_name', None)
+        data['service_syslog-0-name']=syslog_service_name
+        
+        syslog_service_protocol = data.pop('syslog_service_protocol', None)
+        data['service_syslog-0-protocol']=syslog_service_protocol
+        
+        syslog_service_ports = data.pop('syslog_service_ports', None)
+        data['service_syslog-0-ports']=syslog_service_ports
+
+        tag = data.pop('tag', None)
+        data['tag_new-tag']=str(tag)
+
+        data = super().validate(data)
+        return data
+
+    def create(self, data):
+        """Process VM creation using CreateVmForm."""
+        return data
diff --git a/netbox_sys_plugin/api/urls.py b/netbox_sys_plugin/api/urls.py
index b6d7df961be9e650a4e68f4d9217b01bbeee36c5..67be6be3662b9595c9aa16e74345adce309c42a2 100644
--- a/netbox_sys_plugin/api/urls.py
+++ b/netbox_sys_plugin/api/urls.py
@@ -12,6 +12,7 @@ router.register(r'ProviderTypeExtraConfig', ProviderTypeExtraConfigViewSet)
 router.register(r'VirtualMachine', VirtualMachineViewSet, basename='virtualmachine')
 router.register(r'ExtraConfig', ProviderTypeExtraConfigViewSet)
 router.register(r'AssignedExtraConfig', VmAssignedExtraConfigViewSet)
+router.register(r'CreateVirtualMachine', CreateVirtualMachineViewSet,basename='CreteVirtualMachine')
 
 app_name = 'netbox_sys_plugin'
 
diff --git a/netbox_sys_plugin/api/views.py b/netbox_sys_plugin/api/views.py
index c407a5412339f914289540ea91610c1888bd2e4c..ea8e963e96fcc8023164c9357208c66a3bcc6d3f 100644
--- a/netbox_sys_plugin/api/views.py
+++ b/netbox_sys_plugin/api/views.py
@@ -1,12 +1,15 @@
 from rest_framework import viewsets, status
-from rest_framework.decorators import action
+from rest_framework.permissions import IsAuthenticated, DjangoModelPermissions
 from rest_framework.response import Response
+from django.core.exceptions import ValidationError
 from django.db.models import Prefetch
 from netbox.api.viewsets import NetBoxModelViewSet
 from virtualization import filtersets
+from django.db import transaction
 from .. filtersets import VmTypeFilterSet, ProviderTypeExtraConfigFilterSet
 from .. models import VirtualMachineMaintenance, ProviderCredentials, VmAssignedVirtualMachineType, VirtualMachineType,DomainNames, ProviderTypeExtraConfig, WebhookPayload
 from . serializers import *
+from ..forms import CreateVmForm
 
 class VirtualMachineMaintenanceViewSet(viewsets.ModelViewSet):
     queryset = VirtualMachineMaintenance.objects.all()
@@ -66,3 +69,24 @@ class VmAssignedExtraConfigViewSet(viewsets.ModelViewSet):
     serializer_class = VmAssignedExtraConfigSerializer
     http_method_names = ["get", "post", "patch", "delete", "options"]
 
+class CreateVirtualMachineViewSet(NetBoxModelViewSet):
+    """API ViewSet to handle VM creation."""
+    queryset = Cluster.objects.all()
+    serializer_class = CreateVirtualMachineSerializer
+    permission_classes = [IsAuthenticated, DjangoModelPermissions]
+    http_method_names = ["post"]
+
+    def create(self, request):
+        serializer = self.get_serializer(data=request.data)
+        if serializer.is_valid():
+            try:
+                with transaction.atomic():
+                    vm = serializer.save()
+                    form = CreateVmForm(data=vm)
+                    vm = form.process_creation(vm)
+                    return Response({
+                        "message": "VM created successfully!",
+                    }, status=status.HTTP_201_CREATED)
+            except (ValueError, ValidationError) as e:
+                return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
+        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
diff --git a/netbox_sys_plugin/tests/createvm/test_createvm_api.py b/netbox_sys_plugin/tests/createvm/test_createvm_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..eaa1d555866d500002e3c4d5c71c187322f30608
--- /dev/null
+++ b/netbox_sys_plugin/tests/createvm/test_createvm_api.py
@@ -0,0 +1,391 @@
+"""SYS Plugin CreateVirtualMachine API Test Case Class"""
+
+from users.models import ObjectPermission
+from django.contrib.contenttypes.models import ContentType
+from rest_framework import status
+from virtualization.models import Cluster, ClusterType, VMInterface, VirtualMachine
+from dcim.models import DeviceRole, Platform
+from ipam.models import IPAddress, Service
+from extras.models import Tag
+from ... models import DomainNames, VmAssignedVirtualMachineType, VirtualMachineType, VmAssignedExtraConfig, ProviderTypeExtraConfig, WebhookPayload
+from ..base import BaseAPITestCase
+
+class CreateVmAPITestCase(BaseAPITestCase):
+    """Test suite for Create Virtual Machine API"""
+    brief_fields = [
+"cluster_type","cluster","name","status","role","platform","description","virtual_machine_type","interface_name","ip_addresses"
+  "ip_addresses_status","gateway","gateway_status","domain_names","extra_config_structure","extra_config_values","ntp_service_name",
+  "ntp_service_protocol","ntp_service_ports","dns_service_name","dns_service_protocol","dns_service_ports","syslog_service_name",
+  "syslog_service_protocol","syslog_service_ports","tag"
+    ]
+
+
+    @classmethod
+    def setUpTestData(cls):
+
+        """Set up test data for Create Virtual Machine API"""
+        #Create Tag
+        cls.tag = Tag.objects.create(name="test_tag",slug="testtag")
+        #Create Device Role
+        cls.devicerole = DeviceRole.objects.create(name="Test Device", slug="TestRole")
+        #Create Platform
+        cls.platform = Platform.objects.create(name="Test platform", slug="TestPlatform")
+        # Create a ClusterType
+        cls.cluster_type = ClusterType.objects.create(name="Test ClusterType1", slug="ClusterType1")
+        # Create Cluster
+        cls.cluster = Cluster.objects.create(name="Test Cluster", type=cls.cluster_type)
+        # Create VM Type
+        cls.vmtype = VirtualMachineType.objects.create(
+            virtual_machine_type_name='vm_type_name1',
+            virtual_machine_type_desc='vm_type_desc_1',
+            assigned_object=cls.cluster_type
+        )
+        cls.extra_config_structure = ProviderTypeExtraConfig.objects.create(
+            extra_config_name="TEST",
+            extra_config_structure={'test_extra': [{'id': {'required': 'true','type': 'String'}}]},
+            extra_config_description="Test Extra",
+            assigned_object=cls.cluster_type
+        )
+
+        # Data for valid creation
+        cls.valid_create_data = [{
+            "provider_type": cls.cluster_type.id,
+            "provider": cls.cluster.id,
+            "name": "vm_test",
+            "status": "active",
+            "owner": cls.devicerole.id,
+            "platform": cls.platform.id,
+            "description": "test",
+            "virtual_machine_type": cls.vmtype.id,
+            "interface_name": "interface_test",
+            "ip_addresses": "192.168.1.10/24",
+            "ip_addresses_status": "active",
+            "gateway": "193.168.1.10/24",
+            "gateway_status": "active",
+            "domain_names": {"example_domain_name": "vm.example.com"},
+            "extra_config_structure": cls.extra_config_structure.id,
+            "extra_config_values": {"id": "id"},
+            "ntp_service_name": "ntp_test",
+            "ntp_service_protocol": "tcp",
+            "ntp_service_ports": "44",
+            "dns_service_name": "dns_test",
+            "dns_service_protocol": "tcp",
+            "dns_service_ports": "44",
+            "syslog_service_name": "syslog_test",
+            "syslog_service_protocol": "tcp",
+            "syslog_service_ports": "44",
+            "tag":str(cls.tag.id)
+            },
+            {
+            "provider_type": cls.cluster_type.id,
+            "provider": cls.cluster.id,
+            "name": "vm_test2",
+            "status": "active",
+            "owner": cls.devicerole.id,
+            "platform": cls.platform.id,
+            "description": "test",
+            "virtual_machine_type": cls.vmtype.id,
+            "interface_name": "interface_test",
+            "ip_addresses": "192.168.1.10/24",
+            "ip_addresses_status": "active",
+            "gateway": "193.168.1.10/24",
+            "gateway_status": "active",
+            "domain_names": {"example_domain_name": "vm.example.com"},
+            "extra_config_structure": cls.extra_config_structure.id,
+            "extra_config_values": {"id": "id"},
+            "ntp_service_name": "ntp_test",
+            "ntp_service_protocol": "tcp",
+            "ntp_service_ports": "44",
+            "dns_service_name": "dns_test",
+            "dns_service_protocol": "tcp",
+            "dns_service_ports": "44",
+            "syslog_service_name": "syslog_test",
+            "syslog_service_protocol": "tcp",
+            "syslog_service_ports": "44",
+            "tag":str(cls.tag.id)
+            }]
+
+        # Data for invalid creation
+        cls.invalid_create_data = [
+            #Check unique
+            {
+            "provider_type": cls.cluster_type.id,
+            "provider": cls.cluster.id,
+            "name": "vm_test",
+            "status": "active",
+            "owner": cls.devicerole.id,
+            "platform": cls.platform.id,
+            "description": "test_unique",
+            "virtual_machine_type": cls.vmtype.id,
+            "interface_name": "interface_test",
+            "ip_addresses": "192.168.1.10/24",
+            "ip_addresses_status": "active",
+            "gateway": "193.168.1.10/24",
+            "gateway_status": "active",
+            "domain_names": {"example_domain_name": "vm.example.com"},
+            "extra_config_structure": cls.extra_config_structure.id,
+            "extra_config_values": {"id": "id"},
+            "ntp_service_name": "ntp_test",
+            "ntp_service_protocol": "tcp",
+            "ntp_service_ports": "44",
+            "dns_service_name": "dns_test",
+            "dns_service_protocol": "tcp",
+            "dns_service_ports": "44",
+            "syslog_service_name": "syslog_test",
+            "syslog_service_protocol": "tcp",
+            "syslog_service_ports": "44",
+            "tag":str(cls.tag.id)
+            },
+            #Invalid port
+            {
+            "provider_type": cls.cluster_type.id,
+            "provider": cls.cluster.id,
+            "name": "vm_test",
+            "status": "active",
+            "owner": cls.devicerole.id,
+            "platform": cls.platform.id,
+            "description": "test_invalid",
+            "virtual_machine_type": cls.vmtype.id,
+            "interface_name": "interface_test",
+            "ip_addresses": "192.168.1.10/24",
+            "ip_addresses_status": "active",
+            "gateway": "193.168.1.10/24",
+            "gateway_status": "active",
+            "domain_names": {"example_domain_name": "vm.example.com"},
+            "extra_config_structure": cls.extra_config_structure.id,
+            "extra_config_values": {"id": "id"},
+            "ntp_service_name": "ntp_test",
+            "ntp_service_protocol": "tcp",
+            "ntp_service_ports": "44",
+            "dns_service_name": "dns_test",
+            "dns_service_protocol": "tcp",
+            "dns_service_ports": "AA",
+            "syslog_service_name": "syslog_test",
+            "syslog_service_protocol": "tcp",
+            "syslog_service_ports": "44",
+            "tag":str(cls.tag.id)
+            },
+            #Missing field
+            {
+            "provider_type": cls.cluster_type.id,
+            "provider": cls.cluster.id,
+            "name": "vm_test",
+            "status": "active",
+            "owner": cls.devicerole.id,
+            "platform": cls.platform.id,
+            "virtual_machine_type": cls.vmtype.id,
+            "interface_name": "interface_test",
+            "ip_addresses": "192.168.1.10/24",
+            "ip_addresses_status": "active",
+            "gateway": "193.168.1.10/24",
+            "gateway_status": "active",
+            "domain_names": {"example_domain_name": "vm.example.com"},
+            "extra_config_structure": cls.extra_config_structure.id,
+            "extra_config_values": {"id": "id"},
+            "ntp_service_name": "ntp_test",
+            "ntp_service_protocol": "tcp",
+            "ntp_service_ports": "44",
+            "dns_service_name": "dns_test",
+            "dns_service_protocol": "tcp",
+            "dns_service_ports": "AA",
+            "syslog_service_name": "syslog_test",
+            "syslog_service_protocol": "tcp",
+            "syslog_service_ports": "44",
+            "tag":str(cls.tag.id)
+            }
+        ]
+
+    def test_valid_createVM(self):
+        """Test creating a valid CreateVM"""
+
+        obj_perm = ObjectPermission(
+            name="Create CreateVM Permission",
+            actions=["add", "view"],
+        )
+        obj_perm.save()
+        obj_perm.users.add(self.user)
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Platform))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Service))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Tag))
+
+        api_data = self.valid_create_data[0]
+        response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+
+    def test_unique_key_createVM(self):
+        """Test unique vm key of CreateVM"""
+
+        obj_perm = ObjectPermission(
+            name="Create test unique CreateVM Permission",
+            actions=["add", "view"],
+        )
+        obj_perm.save()
+        obj_perm.users.add(self.user)
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Platform))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Service))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Tag))
+
+        #1st VM
+        api_data = self.invalid_create_data[0]
+        response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        #2nd VM
+        api_data = self.invalid_create_data[0]
+        response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header)
+        self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
+        self.assertIn('Virtual machine name must be unique per cluster.',str(response.data))
+
+    def test_invalid_value_createVM(self):
+        """Test creating an invalid CreateVM"""
+
+        obj_perm = ObjectPermission(
+            name="Create invalid CreateVM Permission",
+            actions=["add", "view"],
+        )
+        obj_perm.save()
+        obj_perm.users.add(self.user)
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Platform))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Service))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Tag))
+
+        api_data = self.invalid_create_data[1]
+        response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header)
+        self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
+        self.assertIn('Error during creation: Invalid ports value: AA',str(response.data))
+
+    def test_invalid_missing_value_createVM(self):
+        """Test creating an invalid CreateVM"""
+
+        obj_perm = ObjectPermission(
+            name="Create invalid CreateVM Permission",
+            actions=["add", "view"],
+        )
+        obj_perm.save()
+        obj_perm.users.add(self.user)
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Platform))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Service))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Tag))
+
+        api_data = self.invalid_create_data[2]
+        response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header)
+        self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
+        self.assertIn('This field is required.',str(response.data))
+
+
+    def test_get_all_created_virtual_machines(self):
+        """Test fetching all VMs"""
+        obj_perm = ObjectPermission(
+            name="View all VMs Permission",
+            actions=["view","add"],
+        )
+        obj_perm.save()
+        obj_perm.users.add(self.user)
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Platform))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Service))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Tag))
+
+        #1st VM
+        api_data = self.valid_create_data[0]
+        response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        #2nd VM
+        api_data = self.valid_create_data[1]
+        response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+
+        response = self.client.get("/api/plugins/sys/VirtualMachine/", **self.header)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
+        self.assertGreaterEqual(len(response.data), 2)
+
+    def test_get_single_created_virtual_machine(self):
+        """Test fetching a single VM"""
+        obj_perm = ObjectPermission(
+            name="View single VM Permission",
+            actions=["view","add"],
+        )
+        obj_perm.save()
+        obj_perm.users.add(self.user)
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DeviceRole))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Platform))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ClusterType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Cluster))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VMInterface))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachine))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Service))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(DomainNames))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedVirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VirtualMachineType))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(VmAssignedExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(ProviderTypeExtraConfig))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(WebhookPayload))
+        obj_perm.object_types.add(ContentType.objects.get_for_model(Tag))
+
+        #1st VM
+        api_data = self.valid_create_data[0]
+        response = self.client.post("/api/plugins/sys/CreateVirtualMachine/", api_data, format="json", **self.header)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+
+        VM = VirtualMachine.objects.first()
+        response = self.client.get((f'/api/plugins/sys/VirtualMachine/{VM.id}/'), **self.header)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
diff --git a/netbox_sys_plugin/tests/createvm/test_createvm_view.py b/netbox_sys_plugin/tests/createvm/test_createvm_view.py
index 5c094801582b777ae52bd94e522a5a8710950a71..79df3d9738a272626996ea8917c880e7c2e54300 100644
--- a/netbox_sys_plugin/tests/createvm/test_createvm_view.py
+++ b/netbox_sys_plugin/tests/createvm/test_createvm_view.py
@@ -136,7 +136,7 @@ class CreateVmFormTestCase(TestCase):
 
         #invalid role/owner
         self.invalid_ports_form_data = self.form_data_template.copy()
-        self.invalid_ports_form_data["vms_new-0-role"] = "2"  # Invalid format
+        self.invalid_ports_form_data["vms_new-0-role"] = "999"  # Invalid Number
         form_data = self.invalid_ports_form_data
         form = CreateVmForm(data=form_data)
         with self.assertRaises(ValueError) as context:
@@ -156,7 +156,7 @@ class CreateVmFormTestCase(TestCase):
 
         #invalid platform
         self.invalid_ports_form_data = self.form_data_template.copy()
-        self.invalid_ports_form_data["vms_new-0-platform"] = "2"  # Invalid id
+        self.invalid_ports_form_data["vms_new-0-platform"] = "999"  # Invalid id
         form_data = self.invalid_ports_form_data
         form = CreateVmForm(data=form_data)
         with self.assertRaises(ValueError) as context:
@@ -176,7 +176,7 @@ class CreateVmFormTestCase(TestCase):
 
         #invalid Extra Config
         self.invalid_ports_form_data = self.form_data_template.copy()
-        self.invalid_ports_form_data["vmassignedextraconfig_new-provider_type_extra_config"] = "2"  # Invalid id
+        self.invalid_ports_form_data["vmassignedextraconfig_new-provider_type_extra_config"] = "999"  # Invalid id
         form_data = self.invalid_ports_form_data
         form = CreateVmForm(data=form_data)
         with self.assertRaises(ValueError) as context:
diff --git a/netbox_sys_plugin/tests/test_init.py b/netbox_sys_plugin/tests/test_init.py
index 8a0c2e0d70e9556cf6f7718867a04b26644ed88d..b0b0bb75ddce613ac44bc7d3a9fee1ef446f175e 100644
--- a/netbox_sys_plugin/tests/test_init.py
+++ b/netbox_sys_plugin/tests/test_init.py
@@ -24,5 +24,5 @@ class InitTestCase(APITestCase):
         self.assertTrue("VirtualMachine" in content)
         self.assertTrue("ExtraConfig" in content)
         self.assertTrue("AssignedExtraConfig" in content)
-        self.assertTrue("VirtualMachine" in content)
+        self.assertTrue("CreateVirtualMachine" in content)
         self.assertEqual(response.status_code, 200)