diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..177b023826d654441af327f040207dccc829713e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+__pycache__/
+swagger/__pycache__/
+src/__pycache__/
+
diff --git a/README.md b/README.md
index ad27d658cce41e0216884ef07dd64c9a790f4dcb..e42cae615826530cc1c6dbb680590db534465746 100644
--- a/README.md
+++ b/README.md
@@ -1,93 +1,97 @@
-# NSC
+# Network Slice Controller (NSC) Architecture
 
+The Network Slice Controller (NSC) is a component defined by the IETF to orchestrate the request, realization, and lifecycle control of network slices. It consists of two main modules: the mapper and the realizer. 
 
+## Overview
 
-## Getting started
+The NSC handles end-to-end network slice requests originating from 5G customers. These requests are managed by the 5G end-to-end orchestrator, which configures RAN and Core Network elements accordingly and passes the request to the NSC for processing. The NSC then interacts with relevant network controllers to implement the network slice into the transport network.
 
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
+## Main Modules
 
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
+### Mapper
 
-## Add your files
+The mapper processes client network slice requests and correlates them with existing slices. When a slice request arrives, the mapper translates it by converting the request expressed in 3GPP NRM terms into the IETF NBI data model. This involves identifying the service demarcation points (SDPs) that define the connectivity in the transport network. Once these parameters are identified and mapped into the data model, the next step is to check the feasibility of implementing the slice request.
 
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
+Realizing a slice requires an existing network resource partition (NRP) with the specified slice requirements, which may not be available at the time of the request. This information will be retrieved from an external module, which is beyond the scope of this definition. This module will provide a response regarding the feasibility of realizing the slice.
 
-```
-cd existing_repo
-git remote add origin https://labs.etsi.org/rep/tfs/nsc.git
-git branch -M main
-git push -uf origin main
-```
+If there are no available NRPs for instantiating the slice, the mapper will request the realizer to create a new NRP. This involves interacting with the network controllers responsible for the transport network handled by the NSC. This process is iterative until the mapper determines that the slice realization is feasible. In the current version, it is assumed that there is only one available NRP corresponding to the entire network, and that it is always accessible to the user.
 
-## Integrate with your tools
+### Realizer
 
-- [ ] [Set up project integrations](https://labs.etsi.org/rep/tfs/nsc/-/settings/integrations)
+The realizer module determines the realization of each slice by interacting with specific network controllers. This version is currently working with Teraflow SDN controller. It receives requests from the mapper and decides on the technologies to be used to instantiate the slice based on the selected NRP associated with the slice. For example, Layer 2 VPN is the technology employed to realize network slices in this version. To achieve this, the realizer generates a request for the network controller to establish a Layer 2 VPN between two SDPs with the requirements specified in the slice request.
 
-## Collaborate with your team
+## Workflow
 
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
+1. **Request Initiation**: Network slice request originates from a 5G customer and is managed by the 5G end-to-end orchestrator.
 
-## Test and Deploy
+2. **Mapper Processing**: Converts the request into the IETF NBI data model, identifies SDPs, and checks feasibility.
 
-Use the built-in continuous integration in GitLab.
+3. **Realizer Action**: Determines technology (e.g., Layer 2 VPN) and interacts with network controllers to instantiate the slice.
 
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
+4. **Implementation**: Network controllers configure the transport network as per the slice requirements.
 
-***
+## Arquitecture
 
-# Editing this README
+<img src="images/NSC_Architecture.png" alt="NSC Architecture">
 
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
+## Requirements
+- Python3
+- python3-pip
+- python3-venv
 
-## Suggestions for a good README
+## Configuration Constants
 
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
+In the main configuration file, several constants can be adjusted to customize the Network Slice Controller (NSC) behavior:
 
-## Name
-Choose a self-explaining name for your project.
+### Logging
+- `DEFAULT_LOGGING_LEVEL`: Sets logging verbosity
+  - Default: `logging.INFO`
+  - Options: `logging.DEBUG`, `logging.INFO`, `logging.WARNING`, `logging.ERROR`
 
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
+### Server
+- `NSC_PORT`: Server port
+  - Default: `8081`
 
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
+### Paths
+- `SRC_PATH`: Absolute path to source directory
+- `TEMPLATES_PATH`: Path to templates directory
 
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
-
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
+### Teraflow Configuration
+- `TFS_UPLOAD`: Enable/disable uploading slice service to Teraflow
+  - Default: `False`
+- `TFS_IP`: Teraflow SDN controller IP
+  - Default: `"192.168.165.10"`
+- `TFS_L2VPN_SUPPORT`: Enable additional L2VPN configuration support
+  - Default: `False`
 
 ## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
 
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
+To deploy and execute the NSC, follow these steps:
+
+0. **Preparation**
+    ```
+    git clone https://github.com/Telefonica/network_slice_controller.git
+    cd network_slice_controller
+    python3 -m venv venv
+    source venv/bin/activate
+    pip install -r requirements.txt
+    ```
+
+1. **Start NSC Server**:
+    ```
+    python3 app.py
+    ```
 
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
+2. **Generate Slice Requests**:
 
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
+    To send slice request, the NSC accepts POST request at the endpoint /slice. It is available in the swagger documentation panel at {ip}:{NSC_PORT}/nsc
 
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
+<!-- ## Versioning and Assumptions
 
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
+- The current version assumes a single available Network Resource Partition (NRP) for the entire network.
+- It interacts with specific network controllers tailored to the technology required for slice instantiation (e.g., Teraflow SDN controller).
 
-## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
+## External Modules
 
-## License
-For open source projects, say how it is licensed.
+The planner module, which is out of the scope of this development, provides information on NRP availability and feasibility of slice realization. -->
 
-## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
diff --git a/app.py b/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..383d31c8e5c60fe498f87747fc6fc9ea104c68b1
--- /dev/null
+++ b/app.py
@@ -0,0 +1,37 @@
+# Copyright 2025 Telefonica Innovación Digital S.L.
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from flask import Flask
+from flask_restx import Api
+from flask_cors import CORS
+from swagger.slice_namespace import slice_ns
+from src.Constants import NSC_PORT
+
+app = Flask(__name__)
+CORS(app)
+
+# Create API instance
+api = Api(
+    app,
+    version="1.0",
+    title="Network Slice Controller (NSC) API",
+    description="API for orchestrating and realizing transport network slice requests",
+    doc="/nsc"  # Swagger UI URL
+)
+
+# Register namespaces
+api.add_namespace(slice_ns, path="/slice")
+
+if __name__ == "__main__":
+    app.run(host="0.0.0.0", port=NSC_PORT, debug=True)
diff --git a/images/NSC_Architecture.png b/images/NSC_Architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..adee5374846eccdbf1974e616890b55fc4c131e2
Binary files /dev/null and b/images/NSC_Architecture.png differ
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e01b5584ed4de910f98767f741c470b1c05637d5
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,5 @@
+Flask
+flask-cors
+flask-restx
+netmiko
+requests
diff --git a/src/Constants.py b/src/Constants.py
new file mode 100644
index 0000000000000000000000000000000000000000..f699aed96dbcfa94839baaf467b139e874fd3afb
--- /dev/null
+++ b/src/Constants.py
@@ -0,0 +1,35 @@
+# Copyright 2025 Telefonica Innovación Digital S.L.
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging, os
+# Default logging level
+DEFAULT_LOGGING_LEVEL = logging.INFO
+
+# Default port for NSC deployment
+NSC_PORT = 8081
+
+# Paths
+# Obtain the absolute path of the current file
+SRC_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Create the path to the desired file relative to the current file
+TEMPLATES_PATH = os.path.join(SRC_PATH, "templates")
+
+# TFS Flags
+# Flag to determine if configurations should be uploaded to Teraflow
+TFS_UPLOAD = False
+# Teraflow IP
+TFS_IP = "192.168.165.10"
+# Flag to determine if additional L2VPN configuration support is required for deploying L2VPNs with path selection
+TFS_L2VPN_SUPPORT = False
\ No newline at end of file
diff --git a/src/helpers.py b/src/helpers.py
new file mode 100644
index 0000000000000000000000000000000000000000..24c0dac9de3ea0140209d2610f392f124524ea8a
--- /dev/null
+++ b/src/helpers.py
@@ -0,0 +1,124 @@
+# Copyright 2025 Telefonica Innovación Digital S.L.
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging, requests, json
+from netmiko import ConnectHandler
+from src.Constants import DEFAULT_LOGGING_LEVEL
+
+# Configure logging to provide clear and informative log messages
+logging.basicConfig(
+    level=DEFAULT_LOGGING_LEVEL,
+    format='%(levelname)s - %(message)s')
+
+#Teraflow
+class tfs_connector():
+    
+    def simple_post(self, tfs_ip, service):
+        user="admin"
+        password="admin"
+        token=""
+        session = requests.Session()
+        session.auth = (user, password)
+        url=f'http://{tfs_ip}/webui'
+        response=session.get(url=url)
+        for item in response.iter_lines():
+            if("csrf_token" in str(item)):
+                string=str(item).split('<input id="csrf_token" name="csrf_token" type="hidden" value=')[1]
+                token=string.split(">")[0].strip('"')
+        logging.debug("csrf token %s",token)
+
+        files = {'descriptors': ("data.json", json.dumps(service).encode("utf-8"), "application/json")}
+        token={'csrf_token':token}
+        response = session.post(url,files=files,data=token,timeout=60)
+        logging.debug("Http response: %s",response.text)
+        return response
+
+#CISCO
+class cisco_connector():
+    def __init__(self, address, configs=None):
+        self.address=address
+        self.configs=configs
+
+    def execute_commands(self, commands):
+        try:
+            # Configuración del dispositivo
+            device = {
+                'device_type': 'cisco_xr',  # Esto depende del tipo de dispositivo (ej: 'cisco_ios', 'cisco_xr', 'linux', etc.)
+                'host': self.address,
+                'username': 'cisco',
+                'password': 'cisco12345',
+            }
+
+            # Conexión por SSH
+            connection = ConnectHandler(**device)
+
+            # Enviar comandos
+            output = connection.send_config_set(commands)
+            logging.debug(output)
+
+            # Cerrar la conexión
+            connection.disconnect()
+
+        except Exception as e:
+            logging.error(f"Failed to execute commands on {self.address}: {str(e)}")
+
+    def create_command_template(self, config):
+
+        commands = [
+            "l2vpn",
+            f"pw-class l2vpn_vpws_profile_example_{config["number"]}",
+            "encapsulation mpls"
+        ]
+        
+        commands.extend([
+            "transport-mode vlan passthrough",
+            "control-word"
+        ])
+        
+        commands.extend([
+            f"preferred-path interface tunnel-te {config["number"]}",
+            "exit",
+            "exit"
+        ])
+        
+        commands.extend([
+            "xconnect group l2vpn_vpws_group_example",
+            f"p2p {config["ni_name"]}",
+            f"interface {config["interface"]}.{config["vlan"]}",
+            f"neighbor ipv4 {config["remote_router"]} pw-id {config["vlan"]}",
+            "no pw-class l2vpn_vpws_profile_example",
+            f"pw-class l2vpn_vpws_profile_example_{config["number"]}"
+        ])
+    
+
+        return commands
+    
+    def full_create_command_template(self):
+        commands =[]
+        for config in self.configs:
+            commands_temp = self.create_command_template(config)
+            commands.extend(commands_temp)
+        commands.append("commit")
+        commands.append("end")
+        return commands
+
+    def create_command_template_delete(self):
+        commands = [
+            "no l2vpn",
+        ]
+    
+        commands.append("commit")
+        commands.append("end")
+
+        return commands
\ No newline at end of file
diff --git a/src/network_slice_controller.py b/src/network_slice_controller.py
new file mode 100644
index 0000000000000000000000000000000000000000..4f053daf28ed17f822b63165a781a2356615afb9
--- /dev/null
+++ b/src/network_slice_controller.py
@@ -0,0 +1,1055 @@
+# Copyright 2025 Telefonica Innovación Digital S.L.
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import json, time, os, logging, uuid
+from datetime import datetime
+from src.helpers import tfs_connector, cisco_connector
+from src.Constants import DEFAULT_LOGGING_LEVEL, TFS_UPLOAD, TFS_IP, TFS_L2VPN_SUPPORT, SRC_PATH, TEMPLATES_PATH
+
+# Configure logging to provide clear and informative log messages
+logging.basicConfig(
+    level=DEFAULT_LOGGING_LEVEL,
+    format='%(levelname)s - %(message)s')
+
+class NSController:
+    """
+    Network Slice Controller (NSC) - A class to manage network slice creation, 
+    modification, and deletion across different network domains.
+
+    This controller handles the translation, mapping, and realization of network 
+    slice intents from different formats (3GPP and IETF) to network-specific 
+    configurations.
+
+    Key Functionalities:
+    - Intent Processing: Translate and process network slice intents
+    - Slice Management: Create, modify, and delete network slices
+    - NRP (Network Resource Partition) Mapping: Match slice requirements with available resources
+    - Slice Realization: Convert intents to specific network configurations (L2VPN, L3VPN)
+    """
+
+    def __init__(self, upload_to_tfs = TFS_UPLOAD, tfs_ip=TFS_IP, need_l2vpn_support=TFS_L2VPN_SUPPORT):
+        """
+        Initialize the Network Slice Controller.
+
+        Args:
+            upload_to_tfs (bool, optional): Flag to determine if configurations 
+                should be uploaded to Teraflow system. Defaults to False.
+            need_l2vpn_support (bool, optional): Flag to determine if additional
+                L2VPN configuration support is required. Defaults to False.
+        
+        Attributes:
+            upload_to_tfs (bool): Flag for Teraflow upload
+            answer (dict): Stores slice creation responses
+            tfs_requests (dict): Stores requests to be sent to Teraflow
+            start_time (float): Tracks slice setup start time
+            end_time (float): Tracks slice setup end time
+            need_l2vpn_support (bool): Flag for additional L2VPN configuration support
+        """
+        self.upload_to_tfs = upload_to_tfs
+        self.tfs_ip = tfs_ip
+        self.answer = {}
+        self.cool_answer = {}
+        self.start_time = 0
+        self.end_time = 0
+        self.setup_time = 0
+        self.need_l2vpn_support = need_l2vpn_support
+        # Internal templates and views
+        self.__gpp_template = ""
+        self.__ietf_template = ""
+        self.__teraflow_template = ""
+        self.__nrp_view = ""
+        self.subnet=""
+
+    # API Methods
+    def add_flow(self, intent):
+        """
+        Create a new transport network slice.
+
+        Args:
+            intent (dict): Network slice intent in 3GPP or IETF format
+
+        Returns:
+            Result of the Network Slice Controller (NSC) operation
+
+        API Endpoint:
+            POST /slice
+
+        Raises:
+            ValueError: If no transport network slices are found
+            Exception: For unexpected errors during slice creation process
+        """
+        return self.nsc(intent)
+
+    def get_flows(self,slice_id=None):
+        """
+        Retrieve transport network slice information.
+
+        This method allows retrieving:
+        - All transport network slices
+        - A specific slice by its ID
+
+        Args:
+            slice_id (str, optional): Unique identifier of a specific slice. 
+                                      Defaults to None.
+
+        Returns:
+            dict or list: 
+            - If slice_id is provided: Returns the specific slice details
+            - If slice_id is None: Returns a list of all slices
+            - Returns an error response if no slices are found
+
+        API Endpoint:
+            GET /slice/{id}
+
+        Raises:
+            ValueError: If no transport network slices are found
+            Exception: For unexpected errors during file processing
+        """
+        try:
+            # Read slice database from JSON file
+            with open(os.path.join(SRC_PATH, "slice_ddbb.json"), 'r') as file:
+                content = json.load(file)
+            # If specific slice ID is provided, find and return matching slice
+            if slice_id:
+                for slice in content:
+                    if slice["slice_id"] == slice_id:
+                        return slice
+            # If no slices exist, raise an error
+            if len(content) == 0:
+                raise ValueError("Transport network slices not found")
+            
+            # Return all slices if no specific ID is given
+            return content
+        
+        except ValueError as e:
+            # Handle case where no slices are found
+            return self.__send_response(False, code=404, message=str(e))
+        except Exception as e:
+            # Handle unexpected errors
+            return self.__send_response(False, code=500, message=str(e))
+
+    def modify_flow(self,slice_id, intent):
+        """
+        Modify an existing transport network slice.
+
+        Args:
+            slice_id (str): Unique identifier of the slice to modify
+            intent (dict): New intent configuration for the slice
+
+        Returns:
+            Result of the Network Slice Controller (NSC) operation
+
+        API Endpoint:
+            PUT /slice/{id}
+        """
+        return self.nsc(intent, slice_id)
+
+    def delete_flows(self, slice_id=None):
+        """
+        Delete transport network slice(s).
+
+        This method supports:
+        - Deleting a specific slice by ID
+        - Deleting all slices
+        - Optional cleanup of L2VPN configurations
+
+        Args:
+            slice_id (str, optional): Unique identifier of slice to delete. 
+                                      Defaults to None.
+
+        Returns:
+            dict: Response indicating successful deletion or error details
+
+        API Endpoint:
+            DELETE /slice/{id}
+
+        Raises:
+            ValueError: If no slices are found to delete
+            Exception: For unexpected errors during deletion process
+
+        Notes:
+            - If upload_to_tfs is True, attempts to delete from Teraflow
+            - If need_l2vpn_support is True, performs additional L2VPN cleanup
+        """
+        try:
+            # Read current slice database
+            with open(os.path.join(SRC_PATH, "slice_ddbb.json"), 'r') as file:
+                content = json.load(file)
+            id = None
+
+            # Delete specific slice if slice_id is provided
+            if slice_id:
+                for i, slice in enumerate(content):
+                    if slice["slice_id"] == slice_id:
+                        del content[i]
+                        id = i
+                        break
+                # Raise error if slice not found
+                if not id:
+                    raise ValueError("Transport network slice not found")
+                # Update slice database
+                with open(os.path.join(SRC_PATH, "slice_ddbb.json"), 'w') as file:
+                    json.dump(content, file, indent=4)
+                logging.info(f"Slice {slice_id} removed successfully")
+                return self.__send_response(False, code=200, status="success", message=f"Transpor network slice {slice_id} deleted successfully")
+            
+            # Delete all slices
+            else:
+                # Optional: Delete in Teraflow if configured
+                if self.upload_to_tfs == True:
+                    # TODO: should send a delete request to Teraflow
+                    if self.need_l2vpn_support:
+                        self.__tfs_l2vpn_delete()
+
+                # Verify slices exist before deletion
+                with open(os.path.join(SRC_PATH, "slice_ddbb.json"), 'r') as file:
+                    if len(json.load(file)) == 0:
+                        raise ValueError("Transport network slices not found")
+                    
+                # Clear slice database
+                with open(os.path.join(SRC_PATH, "slice_ddbb.json"), 'w') as file:
+                    json.dump([], file, indent=4)
+
+                logging.info("All slices removed successfully")
+                return self.__send_response(False, code=200, status="success", message="All transport network slices deleted successfully.")
+        
+        except ValueError as e:
+            return self.__send_response(False, code=404, message=str(e))
+        except Exception as e:
+            return self.__send_response(False, code=500, message=str(e))
+
+    # Main NSC Functionalities    
+    def nsc(self, intent_json, slice_id=None):
+        """
+        Main Network Slice Controller method to process and realize network slice intents.
+
+        Workflow:
+        1. Load IETF template
+        2. Process intent (detect format, translate if needed)
+        3. Extract slice data
+        4. Store slice information
+        5. Map slice to Network Resource Pool (NRP)
+        6. Realize slice configuration
+        7. Upload to Teraflow (optional)
+
+        Args:
+            intent_json (dict): Network slice intent in 3GPP or IETF format
+            slice_id (str, optional): Existing slice identifier for modification
+
+        Returns:
+            tuple: Response status and HTTP status code
+        
+        """
+        try:
+            # Start performance tracking
+            self.start_time = time.perf_counter()
+
+            # Reset requests and load IETF template
+            self.__load_template(1, os.path.join(TEMPLATES_PATH, "ietf_template_empty.json"))  
+            tfs_requests = {"services":[]}
+            
+            # Process intent (translate if 3GPP)
+            ietf_intents = self.__nbi_processor(intent_json)
+
+            if ietf_intents:
+                for intent in ietf_intents:
+                     # Extract and store slice request details
+                    self.__extract_data(intent)
+                    self.__store_data(intent, slice_id)       
+                    # Mapper
+                    self.__mapper(intent)
+                    # Realizer
+                    tfs_request = self.__realizer(intent)
+                    tfs_requests["services"].append(tfs_request)
+            else:
+                return self.__send_response(False, code=404, message="No intents found")
+
+            # Generated service
+            logging.debug(json.dumps(tfs_requests, indent=2))
+            
+            # Optional: Upload template to Teraflow
+            if self.upload_to_tfs == True:
+                response = tfs_connector().simple_post(self.tfs_ip, tfs_requests)
+
+                if not response.ok:
+                    return self.__send_response(False, code=response.status_code, message=f"Teraflow upload failed. Response: {response.text}")
+                
+                # For deploying an L2VPN with path selection (not supported by Teraflow)
+                if self.need_l2vpn_support:
+                    self.__tfs_l2vpn_support(tfs_requests["services"])
+
+                logging.info("Request sent to Teraflow")
+
+            # End performance tracking
+            self.end_time = time.perf_counter()
+            return self.__send_response(True, code=200)
+
+        except ValueError as e:
+            return self.__send_response(False, code=400, message=str(e))
+        except Exception as e:
+            return self.__send_response(False, code=500, message=str(e))
+        
+    def __nbi_processor(self, intent_json):
+        """
+        Process and translate network slice intents from different formats (3GPP or IETF).
+
+        This method detects the input JSON format and converts 3GPP intents to IETF format.
+        Supports multiple slice subnets in 3GPP format.
+
+        Args:
+            intent_json (dict): Input network slice intent in either 3GPP or IETF format.
+
+        Returns:
+            list: A list of IETF-formatted network slice intents.
+
+        Raises:
+            ValueError: If the JSON request format is not recognized.
+        """
+        # Detect the input JSON format (3GPP or IETF)
+        format = self.__detect_format(intent_json)
+        ietf_intents = []
+        logging.info("--------NEW REQUEST--------")
+
+        # TODO Needs to be generalized to support different names of slicesubnets
+        # Process different input formats
+        if format == "3GPP":
+            # Translate each subnet in 3GPP format to IETF format
+            for subnet in intent_json["RANSliceSubnet1"]["networkSliceSubnetRef"]:
+                ietf_intents.append(self.__translator(intent_json, subnet))
+            logging.info(f"3GPP requests translated to IETF template")
+        elif format == "IETF":
+            # If already in IETF format, add directly
+            logging.info(f"IETF intent received")
+            ietf_intents.append(intent_json)
+        else:
+            # Handle unrecognized format
+            logging.error(f"JSON request format not recognized")
+            raise ValueError("JSON request format not recognized")
+        
+        return ietf_intents
+
+    def __mapper(self, ietf_intent):
+        """
+        Map an IETF network slice intent to the most suitable Network Resource Partition (NRP).
+
+        This method:
+        1. Retrieves the current NRP view
+        2. Extracts Service Level Objectives (SLOs) from the intent
+        3. Finds NRPs that can meet the SLO requirements
+        4. Selects the best NRP based on viability and availability
+        5. Attaches the slice to the selected NRP or creates a new one
+
+        Args:
+            ietf_intent (dict): IETF-formatted network slice intent.
+
+        Raises:
+            Exception: If no suitable NRP is found and slice creation fails.
+        """ 
+        # Retrieve NRP view
+        self.__realizer(None, True, "READ")
+
+        # Extract Service Level Objectives (SLOs) from the intent
+        slos = ietf_intent["ietf-network-slice-service:network-slice-services"]["slo-sle-templates"]["slo-sle-template"][0]["slo-policy"]["metric-bound"]
+
+        # Find candidate NRPs that can meet the SLO requirements
+        candidates = [
+            (nrp, self.__slo_viability(slos, nrp)[1]) 
+            for nrp in self.__nrp_view 
+            if self.__slo_viability(slos, nrp)[0] and nrp["available"]
+        ]
+        logging.debug(f"Candidates: {candidates}")
+
+        # Select the best NRP based on candidates
+        best_nrp = max(candidates, key=lambda x: x[1])[0] if candidates else None
+        logging.debug(f"Best NRP: {best_nrp}")
+
+        if best_nrp:
+            best_nrp["slices"].append(ietf_intent["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["id"])
+            # Update NRP view
+            self.__realizer(ietf_intent, True, "UPDATE")
+            # TODO Here we should put how the slice is attached to an already created nrp
+        else: 
+            # Request the controller to create a new NRP that meets the SLOs
+            answer = self.__realizer(ietf_intent, True, "CREATE", best_nrp)
+            if not answer:
+                raise Exception("Slice rejected due to lack of NRPs") 
+            # TODO Here we should put how the slice is attached to the new nrp
+
+    def __realizer(self, ietf_intent, need_nrp=False, order=None, nrp=None):
+        """
+        Manage the slice creation workflow.
+
+        This method handles two primary scenarios:
+        1. Interact with network controllers for NRP (Network Resource Partition) operations when need_nrp is True
+        2. Slice service selection when need_nrp is False
+
+        Args:
+            ietf_intent (dict): IETF-formatted network slice intent.
+            need_nrp (bool, optional): Flag to indicate if NRP operations are needed. Defaults to False.
+            order (str, optional): Type of NRP operation (READ, UPDATE, CREATE). Defaults to None.
+            nrp (dict, optional): Specific Network Resource Partition to operate on. Defaults to None.
+        """
+        if need_nrp:
+            # Perform NRP-related operations
+            self.__nrp(order, nrp)
+        else:
+            # Select slice service method
+            return self.__select_way("L2VPN", ietf_intent)
+
+    ### Generic functionalities
+    def __load_template(self, which, dir_t):
+        """
+        Load and process JSON templates for different network slice formats.
+
+        Args:
+            which (int): Template selector (0: 3GPP, 1: IETF, other: Teraflow)
+            dir_t (str): Directory path to the template file
+        """
+        try:
+            # Open and read the template file
+            with open(dir_t, 'r') as source:
+                # Clean up the JSON template
+                template = source.read().replace('\t', '').replace('\n', '').replace("'", '"').strip()
+                
+                # Store template based on selector
+                if which == 0:
+                    self.__gpp_template = template
+                elif which == 1:
+                    self.__ietf_template = template
+                else:
+                    self.__teraflow_template = template
+                
+        except Exception as e:
+            logging.error(f"Template loading error: {e}")
+            return self.__send_response(False, code=500, message=f"Template loading error: {e}")
+
+    def __send_response(self, result, status="error", message=None, code=None):
+        """
+        Generate and send a response to the 3GPP client about the slice request.
+
+        Args:
+            result (bool): Indicates whether the slice request was successful
+            status (str, optional): Response status. Defaults to "error"
+            message (str, optional): Additional error message. Defaults to None
+            code (str, optional): Response code. Defaults to None
+
+        Returns:
+            tuple: A tuple containing the response dictionary and status code
+        """    
+        if result:
+            # Successful slice creation
+            logging.info("Your slice request was fulfilled sucessfully")
+            self.setup_time = (self.end_time - self.start_time)*1000
+            logging.info(f"Setup time: {self.setup_time:.2f}")
+
+            # Construct detailed successful response
+            answer = {
+                "status": "success",
+                "code": code,
+                "slices": [],
+                "setup_time": self.setup_time
+            }
+            # Add slice details to the response
+            for subnet in self.answer:
+                slice_info = {
+                    "id": subnet,
+                    "source": self.answer[subnet]["Source"],
+                    "destination": self.answer[subnet]["Destination"],
+                    "vlan": self.answer[subnet]["VLAN"],
+                    "bandwidth(Mbps)": self.answer[subnet]["QoS Requirements"][0],
+                    "latency(ms)": self.answer[subnet]["QoS Requirements"][1]
+                }
+                answer["slices"].append(slice_info)
+            self.cool_answer = answer
+        else:
+            # Failed slice creation
+            logging.info("Your request cannot be fulfilled. Reason: "+message)
+            self.cool_answer = {
+                "status" :status,
+                "code": code,
+                "message": message
+            }
+        return self.cool_answer, code
+
+    def __extract_data(self, intent_json):
+        """
+        Extract source and destination IP addresses from the IETF intent.
+
+        Args:
+            intent_json (dict): IETF-formatted network slice intent
+        """
+        # Extract source and destination IP addresses
+        source = intent_json["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][0]["sdp-ip-address"]
+        destination = intent_json["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][1]["sdp-ip-address"]
+
+        logging.info(f"Intent generated between {source} and {destination}") 
+
+        # Store slice and connection details
+        self.subnet = intent_json["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["id"]
+        self.subnet = intent_json["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["id"]
+        self.answer[self.subnet] = {
+            "Source": source,
+            "Destination": destination
+        }
+    
+    def __store_data(self, intent, slice_id):
+        """
+        Store network slice intent information in a JSON database file.
+
+        This method:
+        1. Creates a JSON file if it doesn't exist
+        2. Reads existing content
+        3. Updates or adds new slice intent information
+
+        Args:
+            intent (dict): Network slice intent to be stored
+            slice_id (str, optional): Existing slice ID to update. Defaults to None.
+        """
+        file_path = os.path.join(SRC_PATH, "slice_ddbb.json")
+        # Create initial JSON file if it doesn't exist
+        if not os.path.exists(file_path):
+            with open(file_path, 'w') as file:
+                json.dump([], file, indent=4)
+
+        # Read existing content
+        with open(file_path, 'r') as file:
+            content = json.load(file)
+    
+        # Update or add new slice intent
+        if slice_id:
+            # Update existing slice intent
+            for slice in content:
+                if slice["slice_id"] == slice_id:
+                    slice["intent"] = intent
+        else:
+            # Add new slice intent
+            content.append(
+                {
+                    "slice_id": intent["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["id"],
+                    "intent": intent
+                })
+        
+        # # Write updated content back to file
+        with open(file_path, 'w') as file:
+            json.dump(content, file, indent=4)
+
+    ### NBI processor functionalities
+    def __detect_format(self,json_data):    
+        """
+        Detect the format of the input network slice intent.
+
+        This method identifies whether the input JSON is in 3GPP or IETF format 
+        by checking for specific keys in the JSON structure.
+
+        Args:
+            json_data (dict): Input network slice intent JSON
+
+        Returns:
+            str or None: 
+                - "IETF" if IETF-specific keys are found
+                - "3GPP" if 3GPP-specific keys are found
+                - None if no recognizable format is detected
+        """
+        # Check for IETF-specific key
+        if "ietf-network-slice-service:network-slice-services" in json_data:
+            return "IETF"
+        # Check for 3GPP-specific keys
+        if any(key in json_data for key in ["NetworkSlice1", "TopSliceSubnet1", "CNSliceSubnet1", "RANSliceSubnet1"]):
+            return "3GPP"
+        
+        return None
+    
+    def __translator(self, gpp_intent, subnet):
+        """
+        Translate a 3GPP network slice intent to IETF format.
+
+        This method converts a 3GPP intent into a standardized IETF intent template, 
+        mapping key parameters such as QoS profiles, service endpoints, and connection details.
+
+        Args:
+            gpp_intent (dict): Original 3GPP network slice intent
+            subnet (str): Specific subnet reference within the 3GPP intent
+
+        Returns:
+            dict: Translated IETF-formatted network slice intent
+        
+        Notes:
+            - Generates a unique slice service ID using UUID
+            - Maps QoS requirements, source/destination endpoints
+            - Logs the translated intent to a JSON file for reference
+        """
+        # Load IETF template and create a copy to modify
+        ietf_i = json.loads(str(self.__ietf_template))
+
+        # Extract endpoint transport objects
+        ep_transport_objects = gpp_intent[subnet]["EpTransport"]
+
+        # Populate template with SLOs (currently supporting QoS profile, latency and bandwidth)
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slo-sle-templates"]["slo-sle-template"][0]["id"] = gpp_intent[ep_transport_objects[0]]["qosProfile"]
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slo-sle-templates"]["slo-sle-template"][0]["slo-policy"]["metric-bound"][0]["bound"] = gpp_intent[subnet]["SliceProfileList"][0]["RANSliceSubnetProfile"]["uLThptPerSliceSubnet"]["MaxThpt"]
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slo-sle-templates"]["slo-sle-template"][0]["slo-policy"]["metric-bound"][1]["bound"] = gpp_intent[subnet]["SliceProfileList"][0]["RANSliceSubnetProfile"]["uLLatency"]
+
+        # Generate unique slice service ID and description
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["id"] = f"slice-service-{uuid.uuid4()}"
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["description"] = f"Transport network slice mapped with 3GPP slice {next(iter(gpp_intent))}"
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["slo-sle-policy"]["slo-sle-template"] = ietf_i["ietf-network-slice-service:network-slice-services"]["slo-sle-templates"]["slo-sle-template"][0]["id"]
+        
+        # Configure Source SDP
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][0]["node-id"] = ep_transport_objects[0].split(" ", 1)[1]
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][0]["sdp-ip-address"] = gpp_intent[gpp_intent[ep_transport_objects[0]]["EpApplicationRef"][0]]["remoteAddress"]
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][0]["service-match-criteria"]["match-criterion"][0]["match-type"] = gpp_intent[ep_transport_objects[0]]["logicalInterfaceInfo"]["logicalInterfaceType"]
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][0]["service-match-criteria"]["match-criterion"][0]["value"] = gpp_intent[ep_transport_objects[0]]["logicalInterfaceInfo"]["logicalInterfaceId"]
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][0]["attachment-circuits"]["attachment-circuit"][0]["ac-ipv4-address"] = gpp_intent[ep_transport_objects[1]]["IpAddress"] 
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][0]["attachment-circuits"]["attachment-circuit"][0]["sdp-peering"]["peer-sap-id"] = gpp_intent[ep_transport_objects[1]]["NextHopInfo"] 
+
+        # Configure Destination SDP
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][1]["node-id"] = ep_transport_objects[1].split(" ", 1)[1]
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][1]["sdp-ip-address"] = gpp_intent[gpp_intent[ep_transport_objects[1]]["EpApplicationRef"][0]]["remoteAddress"]
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][1]["service-match-criteria"]["match-criterion"][0]["match-type"] = gpp_intent[ep_transport_objects[1]]["logicalInterfaceInfo"]["logicalInterfaceType"]
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][1]["service-match-criteria"]["match-criterion"][0]["value"] = gpp_intent[ep_transport_objects[1]]["logicalInterfaceInfo"]["logicalInterfaceId"]
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][1]["attachment-circuits"]["attachment-circuit"][0]["ac-ipv4-address"] = gpp_intent[ep_transport_objects[0]]["IpAddress"] 
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][1]["attachment-circuits"]["attachment-circuit"][0]["sdp-peering"]["peer-sap-id"] = gpp_intent[ep_transport_objects[0]]["NextHopInfo"] 
+
+        # Configure Connection Group and match-criteria
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["connection-groups"]["connection-group"][0]["id"] = f"{ep_transport_objects[0].split(' ', 1)[1]}_{ep_transport_objects[1].split(' ', 1)[1]}"
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][0]["service-match-criteria"]["match-criterion"][0]["target-connection-group-id"] = f"{ep_transport_objects[0].split(' ', 1)[1]}_{ep_transport_objects[1].split(' ', 1)[1]}"
+        ietf_i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][1]["service-match-criteria"]["match-criterion"][0]["target-connection-group-id"] = f"{ep_transport_objects[0].split(' ', 1)[1]}_{ep_transport_objects[1].split(' ', 1)[1]}"
+
+        # Log translated intent for debugging
+        logging.debug(json.dumps(ietf_i,indent=2))
+        with open(os.path.join(TEMPLATES_PATH, "ietf_template_example.json"), "w") as archivo:
+            archivo.write(json.dumps(ietf_i,indent=2))
+        return ietf_i
+    
+    ### Mapper functionalities
+    def __slo_viability(self, slice_slos, nrp_slos):
+        """
+        Compare Service Level Objectives (SLOs) between a slice and a Network Resource Partition (NRP).
+
+        This method assesses whether an NRP can satisfy the SLOs of a network slice.
+
+        Args:
+            slice_slos (list): Service Level Objectives of the slice
+            nrp_slos (dict): Service Level Objectives of the Network Resource Pool
+
+        Returns:
+            tuple: A boolean indicating viability and a flexibility score
+                - First value: True if NRP meets SLOs, False otherwise
+                - Second value: A score representing how well the NRP meets the SLOs
+        """
+        # Define SLO types for maximum and minimum constraints
+        slo_type = {
+            "max": ["one-way-delay-maximum", "two-way-delay-maximum", "one-way-delay-percentile", "two-way-delay-percentile",
+                    "one-way-delay-variation-maximum", "two-way-delay-variation-maximum",
+                    "one-way-delay-variation-percentile", "two-way-delay-variation-percentile",
+                    "one-way-packet-loss", "two-way-packet-loss"],
+            "min": ["one-way-bandwidth", "two-way-bandwidth", "shared-bandwidth"]
+        }
+        flexibility_scores = []
+        for slo in slice_slos:
+            for nrp_slo in nrp_slos['slos']:
+                if slo["metric-type"] == nrp_slo["metric-type"]:
+                    # Handle maximum type SLOs
+                    if slo["metric-type"] in slo_type["max"]:
+                        flexibility = (nrp_slo["bound"] - slo["bound"]) / slo["bound"]
+                        if slo["bound"] > nrp_slo["bound"]:
+                            return False, 0  # Does not meet maximum constraint
+                    # Handle minimum type SLOs
+                    if slo["metric-type"] in slo_type["min"]:
+                        flexibility = (slo["bound"] - nrp_slo["bound"]) / slo["bound"]
+                        if slo["bound"] < nrp_slo["bound"]:
+                            return False, 0  # Does not meet minimum constraint
+                    flexibility_scores.append(flexibility)
+                    break  # Exit inner loop after finding matching metric
+            
+            # Calculate final viability score
+            score = sum(flexibility_scores) / len(flexibility_scores) if flexibility_scores else 0
+        return True, score  # Si pasó todas las verificaciones, la NRP es viable
+    
+    def __planner(self, intent, nrp_view):
+        """
+        TODO
+        Request slice viability from the Planner module.
+
+        This method prepares and sends a viability request for network slice creation, 
+        detaching the implementation from the main core thread.
+
+        Args:
+            intent (dict): Network slice intent
+            nrp_view (list): Current Network Resource Pool view
+
+        Returns:
+            tuple: A tuple containing:
+                - Viability status (str): "Good" or other status
+                - Reason (str): Explanation of viability
+        
+        Notes:
+            - Calculates source and destination service delivery points (SDP)
+            - Extracts QoS requirements
+            - Performs viability check through internal methods
+        """
+        
+        #Version 1
+        matriz = {}
+        matriz["payloads"] = []
+        #for i in intent:
+        # SI ya existe, suma, si no existe, lo crea
+        origen = self.__calculate_sdp(intent["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][0]["sdp-ip-address"])
+        destino = self.__calculate_sdp(intent["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][1]["sdp-ip-address"])
+        #qos_req = i["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["slo-sle-policy"]["slo-sle-template"]
+        qos_req = intent["ietf-network-slice-service:network-slice-services"]["slo-sle-templates"]["slo-sle-template"][0]["slo-policy"]["metric-bound"][0]["bound"]
+        payload = {
+            "Source": origen,
+            "Destination": destino,
+            "QoS requirements": qos_req
+        }
+        matriz["payloads"].append(payload)
+        m_res = []
+        m_qos = []
+        for p in matriz["payloads"]:
+            res = p
+            m_res.append(res)
+            m_qos.append(p["QoS requirements"])
+        m_res, m_qos = self.__viability(m_res,intent, m_qos)
+        reason="Viable"
+        viability = "Good"
+        return viability, reason
+
+    def __viability(self, matrix, intent, qos):
+        """
+        TODO
+        """
+        aux = {}
+        aux["good"] = []
+        aux["bad"] = []
+        l_qos = []
+        for i in range(len(intent)):
+            # if matrix[i]['success'] == True:
+            aux["good"].append(matrix[i])
+            l_qos.append(qos[i])
+            # else:
+            # aux["bad"].append(intent[i])
+        return aux, l_qos
+
+    def __calculate_sdp(self, pip):
+        '''
+        TODO
+        Imput:
+        Output:
+        Work: Identifies the network entpoint from the IP-sdp received. 
+            Version 0 will be done directly with next hop.
+            Version 1 will translate directly from the public IP of each node to their Loopback address.
+        '''
+        nid = 0
+        with open(os.path.join(TEMPLATES_PATH, "ips.json"), 'r') as source:
+            jason = source.read()
+            jason = jason.replace('\t', '').replace('\n', '').replace("'", '"').strip()
+            nodos = json.loads(str(jason))
+            #template = json.loads(str(jason))
+            # Once we have the template, we search for the one charged.
+            for nodo in nodos["public-prefixes"]:
+                if pip == nodo["prefix"]:
+                    #nid = nodo["node-id"]
+                    nid = nodo["node-name"]
+            for nodo in nodos["CU"]:
+                if pip == nodo["prefix"]:
+                    #nid = nodo["node-id"]
+                    nid = nodo["node-name"]
+            for nodo in nodos["DU"]:
+                if pip == nodo["prefix"]:
+                    #nid = nodo["node-id"]
+                    nid = nodo["node-name"]
+        return nid
+
+
+    ### Realizer functionalities.
+    def __nrp(self, request, nrp):
+        """
+        Manage Network Resource Partition (NRP) operations.
+
+        This method handles CRUD operations for Network Resource Partitions,
+        interacting with Network Controllers (currently done statically via a JSON-based database file).
+
+        Args:
+            request (str): The type of operation to perform. 
+                Supported values:
+                - "CREATE": Add a new NRP to the database
+                - "READ": Retrieve the current NRP view
+                - "UPDATE": Update an existing NRP (currently a placeholder)
+
+            nrp (dict): The Network Resource Partition details to create or update.
+
+        Returns:
+            None or answer: 
+            - For "CREATE": Returns the response from the controller (currently using a static JSON)
+            - For "READ": Gets the NRP view from the controller (currently using a static JSON)
+            - For "UPDATE": Placeholder for update functionality
+
+        Notes:
+            - Uses a local JSON file "nrp_ddbb.json" to store NRP information as controller operation is not yet defined
+        """
+        if request == "CREATE":
+            # TODO: Implement actual request to Controller to create an NRP
+            logging.debug("Creating NRP")
+
+            # Load existing NRP database
+            with open(os.path.join(SRC_PATH, "nrp_ddbb.json"), "r") as archivo:
+                self.__nrp_view = json.load(archivo)
+
+            # Append new NRP to the view
+            self.__nrp_view.append(nrp)
+
+            # Placeholder for controller POST request
+            answer = None
+            return answer
+        elif request == "READ":
+            # TODO: Request to Controller to get topology and current NRP view
+            logging.debug("Reading Topology")
+
+            # Load NRP database
+            with open(os.path.join(SRC_PATH, "nrp_ddbb.json"), "r") as archivo:
+                self.__nrp_view = json.load(archivo)
+            
+        elif request == "UPDATE":
+            # TODO: Implement request to Controller to update NRP
+            logging.debug("Updating NRP")
+            answer = ""
+    
+    def __select_way(self,way, ietf_intent):
+        """
+        Determine the method of slice realization.
+
+        Args:
+            way (str): The type of technology to use.
+                Supported values:
+                - "L2VPN": Layer 2 Virtual Private Network
+                - "L3VPN": Layer 3 Virtual Private Network
+
+            ietf_intent (dict): IETF-formatted network slice intent.
+
+        Returns:
+            dict: A realization request for the specified network slice type.
+
+        """
+        if way == "L2VPN":
+            realizing_request = self.__tfs_l2vpn(ietf_intent)
+        elif way == "L3VPN":
+            realizing_request = self.__tfs_l3vpn(ietf_intent)
+        return realizing_request
+    
+    def __tfs_l2vpn(self, ietf_intent):
+        """
+        Translate slice intent into a TeraFlow service request.
+
+        This method prepares a L2VPN service request by:
+        1. Defining endpoint routers
+        2. Loading a service template
+        3. Generating a unique service UUID
+        4. Configuring service endpoints
+        5. Adding QoS constraints
+        6. Preparing configuration rules for network interfaces
+
+        Args:
+            ietf_intent (dict): IETF-formatted network slice intent.
+
+        Returns:
+            dict: A TeraFlow service request for L2VPN configuration.
+
+        """
+        # Hardcoded router endpoints
+        # TODO (should be dynamically determined)
+        origin_router_id = '4.4.4.4'
+        origin_router_if = '0/0/0-GigabitEthernet0/0/0/0'
+        destination_router_id = '5.5.5.5'
+        destination_router_if = '0/0/3-GigabitEthernet0/0/0/3'
+
+        # Extract QoS Profile from intent
+        QoSProfile = ietf_intent["ietf-network-slice-service:network-slice-services"]["slo-sle-templates"]["slo-sle-template"][0]["id"]
+
+        vlan_value = 0
+        
+        # Load L2VPN service template
+        self.__load_template(2, os.path.join(TEMPLATES_PATH, "L2-VPN_template_empty.json"))
+        tfs_request = json.loads(str(self.__teraflow_template))["services"][0]
+
+        # Generate unique service UUID
+        tfs_request["service_id"]["service_uuid"]["uuid"] += "-" + str(int(datetime.now().timestamp() * 1e7))
+
+        # Configure service endpoints
+        for endpoint in tfs_request["service_endpoint_ids"]:
+            endpoint["device_id"]["device_uuid"]["uuid"] = origin_router_id if endpoint is tfs_request["service_endpoint_ids"][0] else destination_router_id
+            endpoint["endpoint_uuid"]["uuid"] = origin_router_if if endpoint is tfs_request["service_endpoint_ids"][0] else destination_router_if
+
+        self.answer[self.subnet]["QoS Requirements"] = []
+        # Add service constraints
+        for i, constraint in enumerate(tfs_request["service_constraints"]):
+            bound = ietf_intent["ietf-network-slice-service:network-slice-services"]["slo-sle-templates"]["slo-sle-template"][0]["slo-policy"]["metric-bound"][i]["bound"]
+            self.answer[self.subnet]["QoS Requirements"].append(bound)
+            constraint["custom"]["constraint_value"] = str(bound)
+
+        # Add configuration rules
+        for i, config_rule in enumerate(tfs_request["service_config"]["config_rules"][1:], start=1):
+            router_id = origin_router_id if i == 1 else destination_router_id
+            router_if = origin_router_if if i == 1 else destination_router_if
+            resource_value = config_rule["custom"]["resource_value"]
+
+            sdp_index = i - 1
+            vlan_value = ietf_intent["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][sdp_index]["service-match-criteria"]["match-criterion"][0]["value"]
+            resource_value["vlan_id"] = int(vlan_value)
+            resource_value["circuit_id"] = vlan_value
+            resource_value["remote_router"] = destination_router_id if i == 1 else origin_router_id
+            resource_value["ni_name"] = 'ELAN{:s}'.format(str(vlan_value))
+            config_rule["custom"]["resource_key"] = f"/device[{router_id}]/endpoint[{router_if}]/settings"
+
+        # Log and store VLAN information
+        logging.info(f"Intent with VLAN {vlan_value} realized\n")
+        self.answer[self.subnet]["VLAN"] = vlan_value
+        return tfs_request
+    
+    def __tfs_l2vpn_support(self, requests):
+        """
+        Configuration support for L2VPN with path selection based on MPLS traffic-engineering tunnels
+
+        Args:
+            requests (list): A list of configuration parameters.
+
+        """
+        sources={
+            "source": "10.60.125.44",
+            "config":[]
+        }
+        destinations={
+            "destination": "10.60.125.45",
+            "config":[]
+        }
+        for request in requests:
+            # Configure Source Endpoint
+            temp_source = request["service_config"]["config_rules"][1]["custom"]["resource_value"]
+            endpoints = request["service_endpoint_ids"]
+            config = {
+                "ni_name": temp_source["ni_name"],
+                "remote_router": temp_source["remote_router"],
+                "interface": endpoints[0]["endpoint_uuid"]["uuid"].replace("0/0/0-", ""),
+                "vlan" : temp_source["vlan_id"],
+                "number" : temp_source["vlan_id"] % 10 + 1
+            }
+            sources["config"].append(config)
+
+            # Configure Destination Endpoint
+            temp_destiny = request["service_config"]["config_rules"][2]["custom"]["resource_value"]
+            config = {
+                "ni_name": temp_destiny["ni_name"],
+                "remote_router": temp_destiny["remote_router"],
+                "interface": endpoints[1]["endpoint_uuid"]["uuid"].replace("0/0/3-", ""),
+                "vlan" : temp_destiny["vlan_id"],
+                "number" : temp_destiny["vlan_id"] % 10 + 1
+            }
+            destinations["config"].append(config)
+         
+        #cisco_source = cisco_connector(source_address, ni_name, remote_router, vlan, vlan % 10 + 1)
+        cisco_source = cisco_connector(sources["source"], sources["config"])
+        commands = cisco_source.full_create_command_template()
+        cisco_source.execute_commands(commands)
+
+        #cisco_destiny = cisco_connector(destination_address, ni_name, remote_router, vlan, vlan % 10 + 1)
+        cisco_destiny = cisco_connector(destinations["destination"], destinations["config"])
+        commands = cisco_destiny.full_create_command_template()
+        cisco_destiny.execute_commands(commands)
+
+    def __tfs_l2vpn_delete(self):
+        """
+        Delete L2VPN configurations from Cisco devices.
+
+        This method removes L2VPN configurations from Cisco routers
+
+        Notes:
+            - Uses cisco_connector to generate and execute deletion commands
+            - Clears Network Interface (NI) settings
+        """
+        # Delete Source Endpoint Configuration
+        source_address = "10.60.125.44"
+        cisco_source = cisco_connector(source_address)
+        cisco_source.execute_commands(cisco_source.create_command_template_delete())
+
+        # Delete Destination Endpoint Configuration
+        destination_address = "10.60.125.45"
+        cisco_destiny = cisco_connector(destination_address)
+        cisco_destiny.execute_commands(cisco_destiny.create_command_template_delete())
+    
+    def __tfs_l3vpn(self, ietf_intent):
+        """
+        Translate L3VPN (Layer 3 Virtual Private Network) intent into a TeraFlow service request.
+
+        Similar to __tfs_l2vpn, but configured for Layer 3 VPN:
+        1. Defines endpoint routers
+        2. Loads service template
+        3. Generates unique service UUID
+        4. Configures service endpoints
+        5. Adds QoS constraints
+        6. Prepares configuration rules for network interfaces
+
+        Args:
+            ietf_intent (dict): IETF-formatted network slice intent.
+
+        Returns:
+            dict: A TeraFlow service request for L3VPN configuration.
+        """
+        # Hardcoded router endpoints
+        # TODO should be dynamically determined
+        origin_router_id = '4.4.4.4'
+        origin_router_if = '0/0/0-GigabitEthernet0/0/0/0'
+        destination_router_id = '5.5.5.5'
+        destination_router_if = '0/0/3-GigabitEthernet0/0/0/3'
+        
+        # Load L3VPN service template
+        self.__load_template(2, os.path.join(TEMPLATES_PATH, "L3-VPN_template_empty.json"))
+        tfs_request = json.loads(str(self.__teraflow_template))["services"][0]
+
+        # Generate unique service UUID
+        tfs_request["service_id"]["service_uuid"]["uuid"] += "-" + str(int(datetime.now().timestamp() * 1e7))
+
+        # Configure service endpoints
+        for endpoint in tfs_request["service_endpoint_ids"]:
+            endpoint["device_id"]["device_uuid"]["uuid"] = origin_router_id if endpoint is tfs_request["service_endpoint_ids"][0] else destination_router_id
+            endpoint["endpoint_uuid"]["uuid"] = origin_router_if if endpoint is tfs_request["service_endpoint_ids"][0] else destination_router_if
+
+        # Add service constraints
+        for i, constraint in enumerate(tfs_request["service_constraints"]):
+            bound = ietf_intent["ietf-network-slice-service:network-slice-services"]["slo-sle-templates"]["slo-sle-template"][0]["slo-policy"]["metric-bound"][i]["bound"]
+            constraint["custom"]["constraint_value"] = str(bound)
+
+        # Add configuration rules
+        for i, config_rule in enumerate(tfs_request["service_config"]["config_rules"][1:], start=1):
+            router_id = origin_router_id if i == 1 else destination_router_id
+            router_if = origin_router_if if i == 1 else destination_router_if
+            resource_value = config_rule["custom"]["resource_value"]
+
+            sdp_index = i - 1
+            vlan_value = ietf_intent["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][sdp_index]["service-match-criteria"]["match-criterion"][0]["value"]
+            resource_value["router_id"] = destination_router_id if i == 1 else origin_router_id
+            resource_value["vlan_id"] = int(vlan_value)
+            resource_value["address_ip"] = destination_router_id if i == 1 else origin_router_id
+            resource_value["policy_AZ"] = "policyA"
+            resource_value["policy_ZA"] = "policyB"
+            resource_value["ni_name"] = 'ELAN{:s}'.format(str(vlan_value))
+            config_rule["custom"]["resource_key"] = f"/device[{router_id}]/endpoint[{router_if}]/settings"
+        
+        return tfs_request
+
+
+
+
+
+
+    
diff --git a/src/nrp_ddbb.json b/src/nrp_ddbb.json
new file mode 100644
index 0000000000000000000000000000000000000000..948967ef9fd1a9389ac634b19255857a5e13d3aa
--- /dev/null
+++ b/src/nrp_ddbb.json
@@ -0,0 +1,38 @@
+[
+    {
+        "nrp-id": "nrp_X",
+        "resources": ["link1", "link2", "node1"],
+        "slos": [
+            {
+              "metric-type": "one-way-bandwidth",
+              "metric-unit": "kbps",
+              "bound": 1
+            },
+            {
+              "metric-type": "one-way-delay-maximum",
+              "metric-unit": "milliseconds",
+              "bound": 800
+            }
+          ],
+        "slices": ["slice-service-02873501-bf0a-4b02-8540-2f9d970ea20f", "slice-service-e3b22fa8-f3da-4da8-881b-c66e5161b4a5"],
+        "available": true
+    },
+    {
+      "nrp-id": "nrp_X2",
+      "resources": ["link1", "link2", "node1"],
+      "slos": [
+          {
+            "metric-type": "one-way-bandwidth",
+            "metric-unit": "kbps",
+            "bound": 1
+          },
+          {
+            "metric-type": "one-way-delay-maximum",
+            "metric-unit": "milliseconds",
+            "bound": 800
+          }
+        ],
+      "slices": ["slice-service-02873501-bf0a-4b02-8540-2f9d970ea20f", "slice-service-e3b22fa8-f3da-4da8-881b-c66e5161b4a5"],
+      "available": true
+  }
+]
\ No newline at end of file
diff --git a/src/old/intent_generator.py b/src/old/intent_generator.py
new file mode 100644
index 0000000000000000000000000000000000000000..05eae796f8a910477e0f66ce04d173a3541f5a24
--- /dev/null
+++ b/src/old/intent_generator.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python3
+import json
+import os
+#import requests
+import socket
+import random
+
+# Obtain the current directory
+current_dir = os.path.dirname(os.path.abspath(__file__))
+
+# Create the path to the templates directory
+parent_dir = os.path.dirname(current_dir)
+file_path = os.path.join(parent_dir, "templates")
+
+class IntentCreator:
+
+    def __init__(self, plt, lnodes):
+        self.plantilla = ''
+        with open(plt, 'r') as source:
+            self.plantilla = source.read()
+        self.nodes = ''
+        with open(lnodes, 'r') as source:
+            self.nodes = source.read()
+            self.nodes = json.loads(str(self.nodes))
+
+
+    def __create_ep(self,node_name, node_ip, vlan_id):
+        ep_tansport_key = f"EpTransport {node_name}"
+        ep_transport = {
+            ep_tansport_key:{
+                "IpAddress":str(node_ip.rsplit('.', 1)[0] + '.1'),
+                "logicalInterfaceInfo":{
+                    "logicalInterfaceType":"VLAN",
+                    "logicalInterfaceId":vlan_id
+                },
+                "NextHopInfo": str(node_ip.rsplit('.', 1)[0] + '.254'),
+                "qosProfile":"A",
+                "EpApplicationRef":[f"EP_F1U {node_name}"] 
+            }
+        }
+
+        ep_rp_key = f"EP_F1U {node_name}"
+        ep_rp = {
+            ep_rp_key:{
+                "localAddress":node_ip,
+                "remoteAddress":"",
+                "epTransportRef":[ep_tansport_key] 
+            }
+        }
+        return ep_transport,ep_rp
+
+    def create_intent(self):
+        '''
+        In this function we are going to create intents randomly and return them as a json.
+        Parameters to modify:
+         - Origin IP, Destination IP, Interfaces, Match type
+         - SDP id and Node id
+         - Required value
+        '''
+
+        request = json.loads(str(self.plantilla))
+
+        # Subnet list in the slicing environment
+        subnets = [["TopSliceSubnet1","TopSliceSubnetProfile"],["CNSliceSubnet1","CNSliceSubnetProfile"], ["RANSliceSubnet1","RANSliceSubnetProfile"], ["MidhaulSliceSubnet1","RANSliceSubnetProfile"], ["BackhaulSliceSubnet1","RANSliceSubnetProfile"]]
+
+        # Possible values for throughput and latency
+        throughput = [100, 200, 500, 1000]
+        latency = [5, 10, 15, 20]
+
+        # Assign random values to the QoS parameters
+        top_slice_qos = [random.choice(throughput), 0, random.choice(latency)]
+        top_slice_qos[1] = int(2*top_slice_qos[0])
+        cn_slice_qos = [int(val) for val in [top_slice_qos[0]/2,top_slice_qos[1]/2, top_slice_qos[2]*0.4]]
+        ran_slice_qos = [int(val) for val in [top_slice_qos[0]/2,top_slice_qos[1]/2, top_slice_qos[2]*0.6]]
+        midhaul_slice_qos = [int(val) for val in [ran_slice_qos[0]*0.6,ran_slice_qos[1]*0.6, ran_slice_qos[2]/3]]
+        backhaul_slice_qos = [int(val) for val in [ran_slice_qos[0]*0.4,ran_slice_qos[1]*0.4, ran_slice_qos[2]*2/3]]
+
+        qos = [top_slice_qos, cn_slice_qos, ran_slice_qos, midhaul_slice_qos, backhaul_slice_qos]
+
+        for index, subnet in enumerate(subnets):
+            request[subnet[0]]["SliceProfileList"][0][subnet[1]]["dLThptPerSliceSubnet"]["GuaThpt"] = qos[index][0]
+            request[subnet[0]]["SliceProfileList"][0][subnet[1]]["dLThptPerSliceSubnet"]["MaxThpt"] = qos[index][1]
+            request[subnet[0]]["SliceProfileList"][0][subnet[1]]["uLThptPerSliceSubnet"]["GuaThpt"] = qos[index][0]
+            request[subnet[0]]["SliceProfileList"][0][subnet[1]]["uLThptPerSliceSubnet"]["MaxThpt"] = qos[index][1]
+            request[subnet[0]]["SliceProfileList"][0][subnet[1]]["dLLatency"] = qos[index][2]
+            request[subnet[0]]["SliceProfileList"][0][subnet[1]]["uLLatency"] = qos[index][2]
+        
+        #dus = self.nodes["public-prefixes"]
+        #cus = self.nodes["public-prefixes"]
+        dus = self.nodes["DU"]
+        cus = self.nodes["CU"]
+
+        if random.randint(0, 1) == 0:
+            src = random.choice(dus)
+            dst = random.choice(cus)
+        else:
+            src = random.choice(cus)
+            dst = random.choice(dus)
+
+        # Delete all the EpTransport objects from the request
+        pop_keys = []
+
+        for key in request:
+            # Verify if the key is an EpTransport object
+            if key.startswith("EpTransport") or key.startswith("EP_F1U"):
+                # Aggregate the key to the list of keys to be removed
+                pop_keys.append(key)
+
+        for key in pop_keys:
+            request.pop(key)
+
+        # Randomly select a VLAN ID
+        l_iid = ["100","200","300", "400"]
+        vlan_id = random.choice(l_iid)
+
+        # Create the EPs for the source and destination nodes
+        ep_transport_src, ep_rp_src = self.__create_ep(src["node-name"], src["prefix"], vlan_id)
+        request.update(ep_transport_src)
+        request.update(ep_rp_src)
+        ep_transport_dst, ep_rp_dst = self.__create_ep(dst["node-name"], dst["prefix"], vlan_id)
+        request.update(ep_transport_dst)
+        request.update(ep_rp_dst)
+
+        ep_transport_src_name = list(ep_transport_src.keys())[0]
+        ep_transport_dst_name = list(ep_transport_dst.keys())[0]
+
+        request["MidhaulSliceSubnet1"]["EpTransport"] = [ep_transport_src_name, ep_transport_dst_name]
+
+        request[ep_transport_src[ep_transport_src_name]["EpApplicationRef"][0]]["remoteAddress"] = request[ep_transport_dst[ep_transport_dst_name]["EpApplicationRef"][0]]["localAddress"]
+        request[ep_transport_dst[ep_transport_dst_name]["EpApplicationRef"][0]]["remoteAddress"] = request[ep_transport_src[ep_transport_src_name]["EpApplicationRef"][0]]["localAddress"]
+
+        return (str(request).replace('\t', '').replace('\n', '').replace("'", '"').replace("None", '"None"'))
+        
+if __name__ == '__main__':
+    creador = IntentCreator(os.path.join(file_path, "3gpp_template_empty.json"), os.path.join(file_path, "ips.json"))
+    print(creador.create_intent())
diff --git a/src/old/send_request.py b/src/old/send_request.py
new file mode 100644
index 0000000000000000000000000000000000000000..dc55d57b9cb8a3eb134ecf82bc14f8389d7fe991
--- /dev/null
+++ b/src/old/send_request.py
@@ -0,0 +1,28 @@
+import sys, os
+import requests
+import time
+import json
+from intent_generator import IntentCreator
+
+# Obtain the current directory
+current_dir = os.path.dirname(os.path.abspath(__file__))
+
+# Create the path to the templates directory
+parent_dir = os.path.dirname(current_dir)
+file_path = os.path.join(parent_dir, "templates")
+
+def send_request(port):
+    if len(sys.argv) == 2:
+        resp = IntentCreator(os.path.join(file_path, "3gpp_template_empty.json"), os.path.join(file_path, "ips.json")).create_intent()
+        requests.post(f'http://localhost:{port}/intent', headers={'Content-Type': 'application/json'}, data=resp)
+    else:
+        intent = sys.argv[2]
+        with open(intent, 'r') as source:
+            resp = source.read()
+            resp = str(resp).replace('\t', '').replace('\n', '').replace("'", '"').replace("None", '"None"')
+        requests.post(f'http://localhost:{port}/intent', headers={'Content-Type': 'application/json'}, data=resp)
+
+while True:
+    # Use: python3 send_request.py <port> <intent_file>
+    send_request(sys.argv[1])
+    time.sleep(3)
diff --git a/src/slice_ddbb.json b/src/slice_ddbb.json
new file mode 100644
index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc
--- /dev/null
+++ b/src/slice_ddbb.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/src/templates/3gpp_template_empty.json b/src/templates/3gpp_template_empty.json
new file mode 100644
index 0000000000000000000000000000000000000000..a0c6225d79d901adbc1fabf0b2a1888772445b34
--- /dev/null
+++ b/src/templates/3gpp_template_empty.json
@@ -0,0 +1,176 @@
+{
+   "NetworkSlice1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "serviceProfileList":[],
+      "networkSliceSubnetRef":"TopSliceSubnet1"
+   },
+   "TopSliceSubnet1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "nsInfo":{},
+      "managedFunctionRef":[], 
+      "networkSliceSubnetType":"TOP_SLICESUBNET",
+      "SliceProfileList":[ 
+         {
+            "sliceProfileId":"TopId",
+            "pLMNInfoList":null,
+            "TopSliceSubnetProfile":{ 
+               "dLThptPerSliceSubnet":{
+                  "GuaThpt":0,
+                  "MaxThpt":0
+               },
+               "uLThptPerSliceSubnet":{
+                  "GuaThpt":0,
+                  "MaxThpt":0
+               },
+               "dLLatency":0,
+               "uLLatency":0
+            }
+         }
+      ],
+      "networkSliceSubnetRef":["CNSliceSubnet1","RANSliceSubnet1"]
+   },
+   "CNSliceSubnet1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "nsInfo":{}, 
+      "managedFunctionRef":[], 
+      "networkSliceSubnetType":"CN_SLICESUBNET",
+      "SliceProfileList":[
+         {
+            "sliceProfileId":"CNId",
+            "pLMNInfoList":null,
+            "CNSliceSubnetProfile":{
+               "dLThptPerSliceSubnet":{
+                  "GuaThpt":0,
+                  "MaxThpt":0
+               },
+               "uLThptPerSliceSubnet":{
+                  "GuaThpt":0,
+                  "MaxThpt":0
+               },
+               "dLLatency":0,
+               "uLLatency":0
+            }
+         }
+      ]
+   },
+   "RANSliceSubnet1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "nsInfo":{},
+      "managedFunctionRef":[],
+      "networkSliceSubnetType":"RAN_SLICESUBNET",
+      "SliceProfileList":[
+         {
+            "sliceProfileId":"RANId",
+            "pLMNInfoList":null,
+            "RANSliceSubnetProfile":{
+               "dLThptPerSliceSubnet":{
+                  "GuaThpt":0,
+                  "MaxThpt":0
+               },
+               "uLThptPerSliceSubnet":{
+                  "GuaThpt":0,
+                  "MaxThpt":0
+               },
+               "dLLatency":0,
+               "uLLatency":0
+            }
+         }
+      ],
+      "networkSliceSubnetRef":["MidhaulSliceSubnet1", "BackhaulSliceSubnet1"]
+   },
+   "MidhaulSliceSubnet1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "nsInfo":{}, 
+      "managedFunctionRef":[],
+      "networkSliceSubnetType":"RAN_SLICESUBNET",
+      "SliceProfileList":[
+         {
+            "sliceProfileId":"MidhaulId",
+            "pLMNInfoList":null,
+            "RANSliceSubnetProfile":{
+               "dLThptPerSliceSubnet":{
+                  "GuaThpt":0,
+                  "MaxThpt":0
+               },
+               "uLThptPerSliceSubnet":{
+                  "GuaThpt":0,
+                  "MaxThpt":0
+               },
+               "dLLatency":0,
+               "uLLatency":0
+            }
+         }
+      ],
+      "EpTransport":["EpTransport DU1","EpTransport CU-UP1"]
+   },
+   "BackhaulSliceSubnet1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "nsInfo":{},
+      "managedFunctionRef":[],
+      "networkSliceSubnetType":"RAN_SLICESUBNET",
+      "SliceProfileList":[
+         {
+            "sliceProfileId":"BackhaulId",
+            "pLMNInfoList":null,
+            "RANSliceSubnetProfile":{
+               "dLThptPerSliceSubnet":{
+                  "GuaThpt":0,
+                  "MaxThpt":0
+               },
+               "uLThptPerSliceSubnet":{
+                  "GuaThpt":0,
+                  "MaxThpt":0
+               },
+               "dLLatency":0,
+               "uLLatency":0
+            }
+         }
+      ],
+      "EpTransport":["EpTransport CU-UP2","EpTransport UPF"]
+   },
+   "EpTransport DU1":
+      {
+         "IpAddress":"",
+         "logicalInterfaceInfo":{
+            "logicalInterfaceType":"",
+            "logicalInterfaceId":""
+         },
+         "NextHopInfo": "",
+         "qosProfile":"", 
+         "EpApplicationRef":["EP_F1U DU1"] 
+      },
+   "EpTransport CU-UP1":
+      {
+         "IpAddress":"",
+         "logicalInterfaceInfo":{
+            "logicalInterfaceType":"",
+            "logicalInterfaceId":""
+         },
+         "NextHopInfo": "",
+         "QosProfile":"",
+         "EpApplicationRef":["EP_F1U CU-UP1"] 
+      },
+   "EP_F1U DU1":[
+      {
+         "localAddress":"",
+         "remoteAddress":"",
+         "epTransportRef":["EpTransport DU1"] 
+      }
+   ],
+   "EP_F1U CU-UP1":[
+      {
+         "localAddress":"",
+         "remoteAddress":"",
+         "epTransportRef":["EpTransport CU-UP1"] 
+      }
+   ]
+}
+
+
+
diff --git a/src/templates/3gpp_template_example.json b/src/templates/3gpp_template_example.json
new file mode 100644
index 0000000000000000000000000000000000000000..28471a8b2026b00c6d60222e8a9943290c6bc45a
--- /dev/null
+++ b/src/templates/3gpp_template_example.json
@@ -0,0 +1,187 @@
+{
+  "NetworkSlice1": {
+    "operationalState": "",
+    "administrativeState": "",
+    "serviceProfileList": [],
+    "networkSliceSubnetRef": "TopSliceSubnet1"
+  },
+  "TopSliceSubnet1": {
+    "operationalState": "",
+    "administrativeState": "",
+    "nsInfo": {},
+    "managedFunctionRef": [],
+    "networkSliceSubnetType": "TOP_SLICESUBNET",
+    "SliceProfileList": [
+      {
+        "sliceProfileId": "TopId",
+        "pLMNInfoList": null,
+        "TopSliceSubnetProfile": {
+          "dLThptPerSliceSubnet": {
+            "GuaThpt": 200,
+            "MaxThpt": 400
+          },
+          "uLThptPerSliceSubnet": {
+            "GuaThpt": 200,
+            "MaxThpt": 400
+          },
+          "dLLatency": 20,
+          "uLLatency": 20
+        }
+      }
+    ],
+    "networkSliceSubnetRef": [
+      "CNSliceSubnet1",
+      "RANSliceSubnet1"
+    ]
+  },
+  "CNSliceSubnet1": {
+    "operationalState": "",
+    "administrativeState": "",
+    "nsInfo": {},
+    "managedFunctionRef": [],
+    "networkSliceSubnetType": "CN_SLICESUBNET",
+    "SliceProfileList": [
+      {
+        "sliceProfileId": "CNId",
+        "pLMNInfoList": null,
+        "CNSliceSubnetProfile": {
+          "dLThptPerSliceSubnet": {
+            "GuaThpt": 100,
+            "MaxThpt": 200
+          },
+          "uLThptPerSliceSubnet": {
+            "GuaThpt": 100,
+            "MaxThpt": 200
+          },
+          "dLLatency": 8,
+          "uLLatency": 8
+        }
+      }
+    ]
+  },
+  "RANSliceSubnet1": {
+    "operationalState": "",
+    "administrativeState": "",
+    "nsInfo": {},
+    "managedFunctionRef": [],
+    "networkSliceSubnetType": "RAN_SLICESUBNET",
+    "SliceProfileList": [
+      {
+        "sliceProfileId": "RANId",
+        "pLMNInfoList": null,
+        "RANSliceSubnetProfile": {
+          "dLThptPerSliceSubnet": {
+            "GuaThpt": 100,
+            "MaxThpt": 200
+          },
+          "uLThptPerSliceSubnet": {
+            "GuaThpt": 100,
+            "MaxThpt": 200
+          },
+          "dLLatency": 12,
+          "uLLatency": 12
+        }
+      }
+    ],
+    "networkSliceSubnetRef": [
+      "MidhaulSliceSubnet1",
+      "BackhaulSliceSubnet1"
+    ]
+  },
+  "MidhaulSliceSubnet1": {
+    "operationalState": "",
+    "administrativeState": "",
+    "nsInfo": {},
+    "managedFunctionRef": [],
+    "networkSliceSubnetType": "RAN_SLICESUBNET",
+    "SliceProfileList": [
+      {
+        "sliceProfileId": "MidhaulId",
+        "pLMNInfoList": null,
+        "RANSliceSubnetProfile": {
+          "dLThptPerSliceSubnet": {
+            "GuaThpt": 60,
+            "MaxThpt": 120
+          },
+          "uLThptPerSliceSubnet": {
+            "GuaThpt": 60,
+            "MaxThpt": 120
+          },
+          "dLLatency": 4,
+          "uLLatency": 4
+        }
+      }
+    ],
+    "EpTransport": [
+      "EpTransport CU-UP1",
+      "EpTransport DU3"
+    ]
+  },
+  "BackhaulSliceSubnet1": {
+    "operationalState": "",
+    "administrativeState": "",
+    "nsInfo": {},
+    "managedFunctionRef": [],
+    "networkSliceSubnetType": "RAN_SLICESUBNET",
+    "SliceProfileList": [
+      {
+        "sliceProfileId": "BackhaulId",
+        "pLMNInfoList": null,
+        "RANSliceSubnetProfile": {
+          "dLThptPerSliceSubnet": {
+            "GuaThpt": 40,
+            "MaxThpt": 80
+          },
+          "uLThptPerSliceSubnet": {
+            "GuaThpt": 40,
+            "MaxThpt": 80
+          },
+          "dLLatency": 8,
+          "uLLatency": 8
+        }
+      }
+    ],
+    "EpTransport": [
+      "EpTransport CU-UP2",
+      "EpTransport UPF"
+    ]
+  },
+  "EpTransport CU-UP1": {
+    "IpAddress": "100.1.1.1",
+    "logicalInterfaceInfo": {
+      "logicalInterfaceType": "VLAN",
+      "logicalInterfaceId": "300"
+    },
+    "NextHopInfo": "100.1.1.254",
+    "qosProfile": "5QI100",
+    "EpApplicationRef": [
+      "EP_F1U CU-UP1"
+    ]
+  },
+  "EP_F1U CU-UP1": {
+    "localAddress": "100.1.1.2",
+    "remoteAddress": "1.1.3.2",
+    "epTransportRef": [
+      "EpTransport CU-UP1"
+    ]
+  },
+  "EpTransport DU3": {
+    "IpAddress": "1.1.3.1",
+    "logicalInterfaceInfo": {
+      "logicalInterfaceType": "VLAN",
+      "logicalInterfaceId": "300"
+    },
+    "NextHopInfo": "1.1.3.254",
+    "qosProfile": "5QI100",
+    "EpApplicationRef": [
+      "EP_F1U DU3"
+    ]
+  },
+  "EP_F1U DU3": {
+    "localAddress": "1.1.3.2",
+    "remoteAddress": "100.1.1.2",
+    "epTransportRef": [
+      "EpTransport DU3"
+    ]
+  }
+}
\ No newline at end of file
diff --git a/src/templates/3gpp_template_filled.json b/src/templates/3gpp_template_filled.json
new file mode 100644
index 0000000000000000000000000000000000000000..dcab03aa3d095fd133fbddbac12c3621ddb481ee
--- /dev/null
+++ b/src/templates/3gpp_template_filled.json
@@ -0,0 +1,182 @@
+{
+   "NetworkSlice1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "serviceProfileList":[ // Requisitos generales de una NetworkSlice. Lo suponemos vacío. The attributes in ServiceProfile represent mapped requirements from an Network Slice Customer (e.g. an enterprise) to an Network Slice Provider
+         //{
+         //   "serviceProfileId":"",
+         //   "pLMNInfoList": null, //It defines which PLMN and S-NSSAI combinations that are assigned for the service to satisfy service requirements represented by the ServiceProfile
+         //   "sST":"2" // 1 (eMBB), 2(URLLC), 3(MIoT), 4(V2X) o 5(HMTC)
+         //}
+      ],
+      "networkSliceSubnetRef":"TopSliceSubnet1" //Es un DN (string)
+   },
+   "TopSliceSubnet1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "nsInfo":{}, // Se usa si la slice está en un entorno virtualizado
+      "managedFunctionRef":[], // ??? Es un DNList (array de strings)
+      "networkSliceSubnetType":"TOP_SLICESUBNET",
+      "SliceProfileList":[ // Requisitos de una NetworkSliceSubnet, la cual representa un conjunto de funciones de red agrupadas.
+         {
+            "sliceProfileId":"TopId",
+            "pLMNInfoList":null,
+            "TopSliceSubnetProfile":{ //Condition: It shall be present when the slice profile is for top/root network slice subnet 
+               "dLThptPerSliceSubnet":{ //kbps
+                  "GuaThpt":1000,
+                  "MaxThpt":2000
+               },
+               "uLThptPerSliceSubnet":{
+                  "GuaThpt":1000,
+                  "MaxThpt":2000
+               },
+               "dLLatency":5, //ms
+               "uLLatency":5
+            }
+         }
+      ],
+      "networkSliceSubnetRef":["CNSliceSubnet1","RANSliceSubnet1"]
+   },
+   "CNSliceSubnet1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "nsInfo":{}, // Se usa si la slice está en un entorno virtualizado
+      "managedFunctionRef":[], // ??? Es un DNList (array de strings)
+      "networkSliceSubnetType":"CN_SLICESUBNET",
+      "SliceProfileList":[ // Requisitos de una NetworkSliceSubnet, la cual representa un conjunto de funciones de red agrupadas. Los requisitos de transporte se representan aquí
+         {
+            "sliceProfileId":"CNId",
+            "pLMNInfoList":null,
+            "CNSliceSubnetProfile":{
+               "dLThptPerSliceSubnet":{
+                  "GuaThpt":500,
+                  "MaxThpt":1000
+               },
+               "uLThptPerSliceSubnet":{
+                  "GuaThpt":500,
+                  "MaxThpt":1000
+               },
+               "dLLatency":2,
+               "uLLatency":2
+            }
+         }
+      ]
+   },
+   "RANSliceSubnet1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "nsInfo":{}, // Se usa si la slice está en un entorno virtualizado
+      "managedFunctionRef":[], // ??? Es un DNList (array de strings)
+      "networkSliceSubnetType":"RAN_SLICESUBNET",
+      "SliceProfileList":[ // Requisitos de una NetworkSliceSubnet, la cual representa un conjunto de funciones de red agrupadas. Los requisitos de transporte se representan aquí
+         {
+            "sliceProfileId":"RANId",
+            "pLMNInfoList":null,
+            "RANSliceSubnetProfile":{
+               "dLThptPerSliceSubnet":{
+                  "GuaThpt":500,
+                  "MaxThpt":1000
+               },
+               "uLThptPerSliceSubnet":{
+                  "GuaThpt":500,
+                  "MaxThpt":1000
+               },
+               "dLLatency":3,
+               "uLLatency":3
+            }
+         }
+      ],
+      "networkSliceSubnetRef":["MidhaulSliceSubnet1", "BackhaulSliceSubnet1"]
+   },
+   "MidhaulSliceSubnet1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "nsInfo":{}, // Se usa si la slice está en un entorno virtualizado
+      "managedFunctionRef":[], // ??? Es un DNList (array de strings),
+      "networkSliceSubnetType":"RAN_SLICESUBNET",
+      "SliceProfileList":[ // Requisitos de una NetworkSliceSubnet, la cual representa un conjunto de funciones de red agrupadas. Los requisitos de transporte se representan aquí
+         {
+            "sliceProfileId":"MidhaulId",
+            "pLMNInfoList":null,
+            "RANSliceSubnetProfile":{
+               "dLThptPerSliceSubnet":{
+                  "GuaThpt":300,
+                  "MaxThpt":600
+               },
+               "uLThptPerSliceSubnet":{
+                  "GuaThpt":300,
+                  "MaxThpt":600
+               },
+               "dLLatency":1,
+               "uLLatency":1
+            }
+         }
+      ],
+      "EpTransport":["EpTransport DU1","EpTransport CU-UP1"] // Es un DNList (array de strings)
+   },
+   "BackhaulSliceSubnet1":{
+      "operationalState":"",
+      "administrativeState":"",
+      "nsInfo":{}, // Se usa si la slice está en un entorno virtualizado
+      "managedFunctionRef":[], // ??? Es un DNList (array de strings),
+      "networkSliceSubnetType":"RAN_SLICESUBNET",
+      "SliceProfileList":[ // Requisitos de una NetworkSliceSubnet, la cual representa un conjunto de funciones de red agrupadas. Los requisitos de transporte se representan aquí
+         {
+            "sliceProfileId":"BackhaulId",
+            "pLMNInfoList":null,
+            "RANSliceSubnetProfile":{
+               "dLThptPerSliceSubnet":{
+                  "GuaThpt":200,
+                  "MaxThpt":400
+               },
+               "uLThptPerSliceSubnet":{
+                  "GuaThpt":200,
+                  "MaxThpt":400
+               },
+               "dLLatency":2,
+               "uLLatency":2
+            }
+         }
+      ],
+      "EpTransport":["EpTransport CU-UP2","EpTransport UPF"] // Es un DNList (array de strings) 
+   },
+   "EpTransport DU1":
+      {
+         "IpAddress":"100.1.1.1",
+         "logicalInterfaceInfo":{
+            "logicalInterfaceType":"VLAN", //VLAN, MPLS o Segment
+            "logicalInterfaceId":"100"
+         },
+         "NextHopInfo": "100.1.1.254",
+         "qosProfile":"5QI100", //Revisar el mapeo de los requisitos de la slice con esto
+         "EpApplicationRef":["EP_F1U DU1"] //Es un DNList (array de string)
+      },
+   "EpTransport CU-UP1":
+      {
+         "IpAddress":"1.1.1.1",
+         "logicalInterfaceInfo":{
+            "logicalInterfaceType":"VLAN", //VLAN, MPLS o Segment
+            "logicalInterfaceId":"100"
+         },
+         "NextHopInfo": "1.1.1.254",
+         "QosProfile":"5QI100",
+         "EpApplicationRef":["EP_F1U CU-UP1"] //Es un DNList (array de string)
+      },
+   "EP_F1U DU1":[ // El 3GPP parece que aun no ha definido las interfaces entre los distinos functional splits, por lo que estos objetos no están claros. Suponemos EP_F1U para todo, que es el que se usa para la interfaz F1-U entre gNB-DU y gNB-CU
+      {
+         "localAddress":"100.1.1.2",
+         "remoteAddress":"1.1.1.2",
+         "epTransportRef":["EpTransport DU1"] //Es un DNList (array de string)
+      }
+   ],
+   "EP_F1U CU-UP1":[ //Otras opciones son EP_N3 (interfaz N3 entre RAN y UPF) y EP_NgU (interfaz NG-U entre gNB y UPF)
+      {
+         "localAddress":"1.1.1.2",
+         "remoteAddress":"100.1.1.2",
+         "epTransportRef":["EpTransport CU-UP1"] //Es un DNList (array de string)
+      }
+   ]
+}
+
+
+
diff --git a/src/templates/L2-VPN_template_empty.json b/src/templates/L2-VPN_template_empty.json
new file mode 100644
index 0000000000000000000000000000000000000000..85caed08d492bff56396c2e2e87b5098dee84209
--- /dev/null
+++ b/src/templates/L2-VPN_template_empty.json
@@ -0,0 +1,38 @@
+{
+    "services": [
+        {
+            "service_id": {
+                "context_id": {"context_uuid": {"uuid": "admin"}},
+                "service_uuid": {"uuid": "l2-acl-svc"}
+            },
+            "service_type": 2,
+            "service_status": {"service_status": 1},
+            "service_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": ""}}, "endpoint_uuid": {"uuid": "eth-1/0/21"}}, 
+                {"device_id": {"device_uuid": {"uuid": ""}}, "endpoint_uuid": {"uuid": "eth-1/0/21"}} 
+            ],
+            "service_constraints": [
+                {"custom": {"constraint_type": "bandwidth[kbps]", "constraint_value": "0"}}, 
+                {"custom": {"constraint_type": "latency[ms]", "constraint_value": "0"}}
+            ],
+            "service_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {
+                }}},
+                {"action": 1, "custom": {"resource_key": "", "resource_value": {
+                    "sub_interface_index": 0,
+                    "vlan_id": 0,
+                    "circuit_id": "",
+                    "remote_router":"",
+                    "ni_name": "prueba" 
+                }}},
+                {"action": 1, "custom": {"resource_key": "", "resource_value": { 
+                    "sub_interface_index": 0, 
+                    "vlan_id": 0,
+                    "circuit_id": "",
+                    "remote_router":"",
+                    "ni_name": "prueba" 
+                }}}
+            ]}
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/templates/L2-VPN_template_example.json b/src/templates/L2-VPN_template_example.json
new file mode 100644
index 0000000000000000000000000000000000000000..b29e3c69911c332fa5bac045f0f2b994008d629f
--- /dev/null
+++ b/src/templates/L2-VPN_template_example.json
@@ -0,0 +1,271 @@
+{
+  "services": [
+    {
+      "service_id": {
+        "context_id": {
+          "context_uuid": {
+            "uuid": "admin"
+          }
+        },
+        "service_uuid": {
+          "uuid": "l2-acl-svc-17429923732568250"
+        }
+      },
+      "service_type": 2,
+      "service_status": {
+        "service_status": 1
+      },
+      "service_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "4.4.4.4"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "0/0/0-GigabitEthernet0/0/0/0"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "5.5.5.5"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "0/0/3-GigabitEthernet0/0/0/3"
+          }
+        }
+      ],
+      "service_constraints": [
+        {
+          "custom": {
+            "constraint_type": "bandwidth[kbps]",
+            "constraint_value": "20"
+          }
+        },
+        {
+          "custom": {
+            "constraint_type": "latency[ms]",
+            "constraint_value": "20"
+          }
+        }
+      ],
+      "service_config": {
+        "config_rules": [
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/settings",
+              "resource_value": {}
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/device[4.4.4.4]/endpoint[0/0/0-GigabitEthernet0/0/0/0]/settings",
+              "resource_value": {
+                "sub_interface_index": 0,
+                "vlan_id": 100,
+                "circuit_id": "100",
+                "remote_router": "5.5.5.5",
+                "ni_name": "ELAN100"
+              }
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/device[5.5.5.5]/endpoint[0/0/3-GigabitEthernet0/0/0/3]/settings",
+              "resource_value": {
+                "sub_interface_index": 0,
+                "vlan_id": 100,
+                "circuit_id": "100",
+                "remote_router": "4.4.4.4",
+                "ni_name": "ELAN100"
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "service_id": {
+        "context_id": {
+          "context_uuid": {
+            "uuid": "admin"
+          }
+        },
+        "service_uuid": {
+          "uuid": "l2-acl-svc-17429923733224160"
+        }
+      },
+      "service_type": 2,
+      "service_status": {
+        "service_status": 1
+      },
+      "service_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "4.4.4.4"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "0/0/0-GigabitEthernet0/0/0/0"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "5.5.5.5"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "0/0/3-GigabitEthernet0/0/0/3"
+          }
+        }
+      ],
+      "service_constraints": [
+        {
+          "custom": {
+            "constraint_type": "bandwidth[kbps]",
+            "constraint_value": "200"
+          }
+        },
+        {
+          "custom": {
+            "constraint_type": "latency[ms]",
+            "constraint_value": "5"
+          }
+        }
+      ],
+      "service_config": {
+        "config_rules": [
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/settings",
+              "resource_value": {}
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/device[4.4.4.4]/endpoint[0/0/0-GigabitEthernet0/0/0/0]/settings",
+              "resource_value": {
+                "sub_interface_index": 0,
+                "vlan_id": 101,
+                "circuit_id": "101",
+                "remote_router": "5.5.5.5",
+                "ni_name": "ELAN101"
+              }
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/device[5.5.5.5]/endpoint[0/0/3-GigabitEthernet0/0/0/3]/settings",
+              "resource_value": {
+                "sub_interface_index": 0,
+                "vlan_id": 101,
+                "circuit_id": "101",
+                "remote_router": "4.4.4.4",
+                "ni_name": "ELAN101"
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "service_id": {
+        "context_id": {
+          "context_uuid": {
+            "uuid": "admin"
+          }
+        },
+        "service_uuid": {
+          "uuid": "l2-acl-svc-17429923733753200"
+        }
+      },
+      "service_type": 2,
+      "service_status": {
+        "service_status": 1
+      },
+      "service_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "4.4.4.4"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "0/0/0-GigabitEthernet0/0/0/0"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "5.5.5.5"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "0/0/3-GigabitEthernet0/0/0/3"
+          }
+        }
+      ],
+      "service_constraints": [
+        {
+          "custom": {
+            "constraint_type": "bandwidth[kbps]",
+            "constraint_value": "200"
+          }
+        },
+        {
+          "custom": {
+            "constraint_type": "latency[ms]",
+            "constraint_value": "10"
+          }
+        }
+      ],
+      "service_config": {
+        "config_rules": [
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/settings",
+              "resource_value": {}
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/device[4.4.4.4]/endpoint[0/0/0-GigabitEthernet0/0/0/0]/settings",
+              "resource_value": {
+                "sub_interface_index": 0,
+                "vlan_id": 102,
+                "circuit_id": "102",
+                "remote_router": "5.5.5.5",
+                "ni_name": "ELAN102"
+              }
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/device[5.5.5.5]/endpoint[0/0/3-GigabitEthernet0/0/0/3]/settings",
+              "resource_value": {
+                "sub_interface_index": 0,
+                "vlan_id": 102,
+                "circuit_id": "102",
+                "remote_router": "4.4.4.4",
+                "ni_name": "ELAN102"
+              }
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/templates/L2-VPN_template_filled.json b/src/templates/L2-VPN_template_filled.json
new file mode 100644
index 0000000000000000000000000000000000000000..594fc27321d4628b7f1fb3cf803063eceb228b7f
--- /dev/null
+++ b/src/templates/L2-VPN_template_filled.json
@@ -0,0 +1,36 @@
+{
+    "services": [
+        {
+            "service_id": {
+                "context_id": {"context_uuid": {"uuid": "admin"}}, //Siempre usaremos admin
+                "service_uuid": {"uuid": "l2-acl-svc"} //identificador unico
+            },
+            "service_type": 2, // Numero que identifica que es una vpn de nivel 2, se mantiene
+            "service_status": {"service_status": 1},
+            "service_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R149"}}, "endpoint_uuid": {"uuid": "eth-1/0/21"}}, // Se tiene que cambiar por el endpoint de origen
+                {"device_id": {"device_uuid": {"uuid": "R155"}}, "endpoint_uuid": {"uuid": "eth-1/0/21"}}  // Se tiene que cambiar por el endpoint de destino
+            ],
+            "service_constraints": [ //Requerimientos que han de darse, de momento no funciona por lo que mantener igual
+                {"custom": {"constraint_type": "bandwidth[kbps]", "constraint_value": "10.0"}}, 
+                {"custom": {"constraint_type": "latency[ms]", "constraint_value": "15.2"}}
+            ],
+            "service_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": { //Regla default, se mantiene
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[R149]/endpoint[eth-1/0/21]/settings", "resource_value": { //Camino de ida, hay que cambiar la vlan, circuit_id y sub_interface_index por el valor de vlan que queramos usar
+                    "sub_interface_index": 0,
+                    "vlan_id": 999,
+                    "circuit_id": "999",
+                    "remote_router":"5.5.5.1" // Este valor es la ip del router en el otro extremo
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[R155]/endpoint[eth-1/0/21]/settings", "resource_value": { //Camino de vuelta, hay que cambiar la vlan, circuit_id y sub_interface_index por el valor de vlan que queramos usar
+                    "sub_interface_index": 0, 
+                    "vlan_id": 999,
+                    "circuit_id": "999",
+                    "remote_router":"5.5.5.5" // Este valor es la ip del router en el otro extremo
+                }}}
+            ]}
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/templates/L3-VPN_template_empty.json b/src/templates/L3-VPN_template_empty.json
new file mode 100644
index 0000000000000000000000000000000000000000..e894cfa4208734dc75c822ced467b7aa8e7d67a9
--- /dev/null
+++ b/src/templates/L3-VPN_template_empty.json
@@ -0,0 +1,46 @@
+{
+    "services": [
+        {
+            "service_id": {
+                "context_id": {"context_uuid": {"uuid": "admin"}},
+                "service_uuid": {"uuid": "l3-acl-svc"}
+            },
+            "service_type": 1,
+            "service_status": {"service_status": 1},
+            "service_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": ""}}, "endpoint_uuid": {"uuid": ""}}, 
+                {"device_id": {"device_uuid": {"uuid": ""}}, "endpoint_uuid": {"uuid": ""}} 
+            ],
+            "service_constraints": [
+                {"custom": {"constraint_type": "bandwidth[kbps]", "constraint_value": "0"}},
+                {"custom": {"constraint_type": "latency[ms]", "constraint_value": "0"}}
+            ],
+            "service_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {
+                    "bgp_as"             : 65000,
+                    "route_distinguisher": "65000:533"
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[R149]/endpoint[eth-1/0/20]/settings", "resource_value": {
+                    "router_id"          : "",
+                    "sub_interface_index": 0,
+                    "vlan_id"            : 0,
+                    "address_ip"         : "",
+                    "address_prefix"     : 16,
+                    "policy_AZ"           : "srv_ACL",
+                    "policy_ZA"           : "srv_ACLr",
+                    "ni_name"             : "prueba"
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[R155]/endpoint[eth-1/0/20]/settings", "resource_value": {
+                    "router_id"          : "",
+                    "sub_interface_index": 0,
+                    "vlan_id"            : 0,
+                    "address_ip"         : "",
+                    "address_prefix"     : 16,
+                    "policy_AZ"           : "srv_ACLr",
+                    "policy_ZA"           : "srv_ACL",
+                    "ni_name"             : "prueba"
+                }}}
+            ]}
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/templates/L3-VPN_template_example.json b/src/templates/L3-VPN_template_example.json
new file mode 100644
index 0000000000000000000000000000000000000000..d0a70b7d738121afb27c9ad0cad178fb797d6193
--- /dev/null
+++ b/src/templates/L3-VPN_template_example.json
@@ -0,0 +1,102 @@
+{
+  "services": [
+    {
+      "service_id": {
+        "context_id": {
+          "context_uuid": {
+            "uuid": "admin"
+          }
+        },
+        "service_uuid": {
+          "uuid": "l3-acl-svc-17258860855224490"
+        }
+      },
+      "service_type": 1,
+      "service_status": {
+        "service_status": 1
+      },
+      "service_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "4.4.4.4"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "0/0/1-GigabitEthernet0/0/0/1"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "5.5.5.5"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "0/0/1-GigabitEthernet0/0/0/1"
+          }
+        }
+      ],
+      "service_constraints": [
+        {
+          "custom": {
+            "constraint_type": "bandwidth[kbps]",
+            "constraint_value": "120"
+          }
+        },
+        {
+          "custom": {
+            "constraint_type": "latency[ms]",
+            "constraint_value": "2"
+          }
+        }
+      ],
+      "service_config": {
+        "config_rules": [
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/settings",
+              "resource_value": {
+                "bgp_as": 65000,
+                "route_distinguisher": "65000:533"
+              }
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/device[4.4.4.4]/endpoint[0/0/1-GigabitEthernet0/0/0/1]/settings",
+              "resource_value": {
+                "router_id": "5.5.5.5",
+                "sub_interface_index": 0,
+                "vlan_id": 300,
+                "address_ip": "5.5.5.5",
+                "address_prefix": 16,
+                "policy_AZ": "policyA",
+                "policy_ZA": "policyB",
+                "ni_name": "ELAN300"
+              }
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "/device[5.5.5.5]/endpoint[0/0/1-GigabitEthernet0/0/0/1]/settings",
+              "resource_value": {
+                "router_id": "4.4.4.4",
+                "sub_interface_index": 0,
+                "vlan_id": 300,
+                "address_ip": "4.4.4.4",
+                "address_prefix": 16,
+                "policy_AZ": "policyA",
+                "policy_ZA": "policyB",
+                "ni_name": "ELAN300"
+              }
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/templates/L3-VPN_template_filled.json b/src/templates/L3-VPN_template_filled.json
new file mode 100644
index 0000000000000000000000000000000000000000..12bea2aa922a55b17d5906cc03032ac9c5bdba42
--- /dev/null
+++ b/src/templates/L3-VPN_template_filled.json
@@ -0,0 +1,44 @@
+{
+    "servs": [
+        {
+            "service_id": {
+                "context_id": {"context_uuid": {"uuid": "admin"}}, //Siempre usaremos admin
+                "service_uuid": {"uuid": "l3-svc"} //identificador unico
+            },
+            "service_type": 1, // Numero que identifica que es una vpn de nivel 3, se mantiene
+            "service_status": {"service_status": 1},
+            "service_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R149"}}, "endpoint_uuid": {"uuid": "eth-1/0/20"}}, // Se tiene que cambiar por el endpoint de origen
+                {"device_id": {"device_uuid": {"uuid": "R155"}}, "endpoint_uuid": {"uuid": "eth-1/0/20"}} // Se tiene que cambiar por el endpoint de destino
+            ],
+            "service_constraints": [ // Requerimientos que han de darse, de momento no funciona por lo que mantener igual
+                {"custom": {"constraint_type": "bandwidth[gbps]", "constraint_value": "10.0"}},
+                {"custom": {"constraint_type": "latency[ms]", "constraint_value": "15.2"}}
+            ],
+            "service_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": { //Regla default, se mantiene
+                    "bgp_as"             : 65000,
+                    "route_distinguisher": "65000:533"
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[R149]/endpoint[eth-1/0/20]/settings", "resource_value": {
+                    "router_id"          : "5.5.5.5",
+                    "sub_interface_index": 0,
+                    "vlan_id"            : 533,
+                    "address_ip"         : "172.16.12.12",
+                    "address_prefix"     : 16,
+                    "policy_AZ"           : "srv_ACL",
+                    "policy_ZA"           : "srv_ACLr"
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[R155]/endpoint[eth-1/0/20]/settings", "resource_value": {
+                    "router_id"          : "5.5.5.1",
+                    "sub_interface_index": 0,
+                    "vlan_id"            : 533,
+                    "address_ip"         : "172.16.13.13",
+                    "address_prefix"     : 16,
+                    "policy_AZ"           : "srv_ACLr",
+                    "policy_ZA"           : "srv_ACL"
+                }}}
+            ]}
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/templates/descriptor-topology copy.json b/src/templates/descriptor-topology copy.json
new file mode 100644
index 0000000000000000000000000000000000000000..304373aceb7a48ac4898c361833d46e21590d04b
--- /dev/null
+++ b/src/templates/descriptor-topology copy.json	
@@ -0,0 +1,570 @@
+{
+  "dummy_mode": true,
+  "contexts":[
+     {
+        "context_id":{
+           "context_uuid":{
+              "uuid":"admin"
+           }
+        },
+        "topology_ids":[
+           
+        ],
+        "service_ids":[
+           
+        ]
+     }
+  ],
+  "topologies":[
+     {
+        "topology_id":{
+           "context_id":{
+              "context_uuid":{
+                 "uuid":"admin"
+              }
+           },
+           "topology_uuid":{
+              "uuid":"admin"
+           }
+        },
+        "device_ids":[
+           {
+              "device_uuid":{
+                 "uuid":"1.1.1.1"
+              }
+           },
+           {
+              "device_uuid":{
+                 "uuid":"2.2.2.2"
+              }
+           }
+        ],
+        "link_ids":[
+           {
+              "link_uuid":{
+                 "uuid":"4.4.4.4/0/0/1-GigabitEthernet0/0/0/1==2.2.2.2/GigabitEthernet2"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"2.2.2.2/GigabitEthernet2==4.4.4.4/0/0/1-GigabitEthernet0/0/0/1"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"2.2.2.2/GigabitEthernet1==1.1.1.1/GigabitEthernet1"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"1.1.1.1/GigabitEthernet1==2.2.2.2/GigabitEthernet1"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"2.2.2.2/GigabitEthernet4==5.5.5.5/0/0/0-GigabitEthernet0/0/0/0"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"5.5.5.5/0/0/0-GigabitEthernet0/0/0/0==2.2.2.2/GigabitEthernet4"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"2.2.2.2/GigabitEthernet3==3.3.3.3/0/0/3-GigabitEthernet0/0/0/3"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"3.3.3.3/0/0/3-GigabitEthernet0/0/0/3==2.2.2.2/GigabitEthernet3"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"1.1.1.1/GigabitEthernet2==5.5.5.5/0/0/2-GigabitEthernet0/0/0/2"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"5.5.5.5/0/0/2-GigabitEthernet0/0/0/2==1.1.1.1/GigabitEthernet2"
+              }
+           }
+        ]
+     }
+  ],
+  "devices":[
+     {
+        "device_id":{
+           "device_uuid":{
+              "uuid":"1.1.1.1"
+           }
+        },
+        "device_type":"packet-router",
+        "device_config":{
+           "config_rules":[
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/address",
+                    "resource_value":"10.60.125.41"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/port",
+                    "resource_value":"830"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/settings",
+                    "resource_value":{
+                       "username":"cisco",
+                       "password":"cisco12345",
+                       "vendor":"CISCO",
+                       "force_running":false,
+                       "hostkey_verify":false,
+                       "message_renderer":"pyangbind",
+                       "look_for_keys":false,
+                       "allow_agent":false,
+                       "commit_per_rule":true,
+                       "device_params":{
+                          "name":"default"
+                       },
+                       "manager_params":{
+                          "timeout":120
+                       }
+                    }
+                 }
+              },
+              {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[GigabitEthernet1]", "resource_value": {
+                "uuid": "GigabitEthernet1", "name": "GigabitEthernet1", "type": "-"
+              }}},
+              {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[GigabitEthernet2]", "resource_value": {
+                "uuid": "GigabitEthernet2", "name": "GigabitEthernet2", "type": "-"
+              }}},
+              {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[GigabitEthernet3]", "resource_value": {
+                "uuid": "GigabitEthernet3", "name": "GigabitEthernet3", "type": "-"
+              }}},
+              {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[GigabitEthernet4]", "resource_value": {
+                "uuid": "GigabitEthernet4", "name": "GigabitEthernet4", "type": "-"
+              }}},
+              {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[GigabitEthernet5]", "resource_value": {
+                "uuid": "GigabitEthernet5", "name": "GigabitEthernet5", "type": "-"
+              }}}
+           ]
+        },
+        "device_operational_status":2,
+        "device_drivers":[
+           1
+        ],
+        "device_endpoints":[
+          {"name": "GigabitEthernet1", "endpoint_type": "-", "endpoint_id": {
+            "device_id": {"device_uuid": {"uuid": "1.1.1.1"}}, "endpoint_uuid": {"uuid": "GigabitEthernet1"},
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}
+          }},
+          {"name": "GigabitEthernet2", "endpoint_type": "-", "endpoint_id": {
+            "device_id": {"device_uuid": {"uuid": "1.1.1.1"}}, "endpoint_uuid": {"uuid": "GigabitEthernet2"},
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}
+          }},
+          {"name": "GigabitEthernet3", "endpoint_type": "-", "endpoint_id": {
+            "device_id": {"device_uuid": {"uuid": "1.1.1.1"}}, "endpoint_uuid": {"uuid": "GigabitEthernet3"},
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}
+          }},
+          {"name": "GigabitEthernet4", "endpoint_type": "-", "endpoint_id": {
+            "device_id": {"device_uuid": {"uuid": "1.1.1.1"}}, "endpoint_uuid": {"uuid": "GigabitEthernet4"},
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}
+          }},
+          {"name": "GigabitEthernet5", "endpoint_type": "-", "endpoint_id": {
+            "device_id": {"device_uuid": {"uuid": "1.1.1.1"}}, "endpoint_uuid": {"uuid": "GigabitEthernet5"},
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}
+          }}
+        ]
+     },
+     {
+        "device_id":{
+           "device_uuid":{
+              "uuid":"2.2.2.2"
+           }
+        },
+        "device_type":"packet-router",
+        "device_config":{
+           "config_rules":[
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/address",
+                    "resource_value":"10.60.125.42"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/port",
+                    "resource_value":"830"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/settings",
+                    "resource_value":{
+                       "username":"cisco",
+                       "password":"cisco12345",
+                       "vendor":"CISCO",
+                       "force_running":false,
+                       "hostkey_verify":false,
+                       "message_renderer":"pyangbind",
+                       "look_for_keys":false,
+                       "allow_agent":false,
+                       "commit_per_rule":true,
+                       "device_params":{
+                          "name":"default"
+                       },
+                       "manager_params":{
+                          "timeout":120
+                       }
+                    }
+                 }
+              },
+              {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[GigabitEthernet1]", "resource_value": {
+                "uuid": "GigabitEthernet1", "name": "GigabitEthernet1", "type": "-"
+              }}},
+              {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[GigabitEthernet2]", "resource_value": {
+                "uuid": "GigabitEthernet2", "name": "GigabitEthernet2", "type": "-"
+              }}},
+              {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[GigabitEthernet3]", "resource_value": {
+                "uuid": "GigabitEthernet3", "name": "GigabitEthernet3", "type": "-"
+              }}},
+              {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[GigabitEthernet4]", "resource_value": {
+                "uuid": "GigabitEthernet4", "name": "GigabitEthernet4", "type": "-"
+              }}},
+              {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[GigabitEthernet5]", "resource_value": {
+                "uuid": "GigabitEthernet5", "name": "GigabitEthernet5", "type": "-"
+              }}}
+           ]
+        },
+        "device_operational_status":2,
+        "device_drivers":[
+           1
+        ],
+        "device_endpoints":[
+          {"name": "GigabitEthernet1", "endpoint_type": "-", "endpoint_id": {
+            "device_id": {"device_uuid": {"uuid": "2.2.2.2"}}, "endpoint_uuid": {"uuid": "GigabitEthernet1"},
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}
+          }},
+          {"name": "GigabitEthernet2", "endpoint_type": "-", "endpoint_id": {
+            "device_id": {"device_uuid": {"uuid": "2.2.2.2"}}, "endpoint_uuid": {"uuid": "GigabitEthernet2"},
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}
+          }},
+          {"name": "GigabitEthernet3", "endpoint_type": "-", "endpoint_id": {
+            "device_id": {"device_uuid": {"uuid": "2.2.2.2"}}, "endpoint_uuid": {"uuid": "GigabitEthernet3"},
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}
+          }},
+          {"name": "GigabitEthernet4", "endpoint_type": "-", "endpoint_id": {
+            "device_id": {"device_uuid": {"uuid": "2.2.2.2"}}, "endpoint_uuid": {"uuid": "GigabitEthernet4"},
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}
+          }},
+          {"name": "GigabitEthernet5", "endpoint_type": "-", "endpoint_id": {
+            "device_id": {"device_uuid": {"uuid": "2.2.2.2"}}, "endpoint_uuid": {"uuid": "GigabitEthernet5"},
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}
+          }}
+        ]
+     }
+  ],
+  "links":[
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"4.4.4.4/0/0/1-GigabitEthernet0/0/0/1==2.2.2.2/GigabitEthernet2"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"4.4.4.4"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"2.2.2.2"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet2"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"2.2.2.2/GigabitEthernet2==4.4.4.4/0/0/1-GigabitEthernet0/0/0/1"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"2.2.2.2"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet2"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"4.4.4.4"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"2.2.2.2/GigabitEthernet1==1.1.1.1/GigabitEthernet1"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"2.2.2.2"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet1"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"1.1.1.1"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet1"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"1.1.1.1/GigabitEthernet1==2.2.2.2/GigabitEthernet1"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"1.1.1.1"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet1"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"2.2.2.2"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet1"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"2.2.2.2/GigabitEthernet4==5.5.5.5/0/0/0-GigabitEthernet0/0/0/0"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"2.2.2.2"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet4"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"5.5.5.5"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/0-GigabitEthernet0/0/0/0"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"5.5.5.5/0/0/0-GigabitEthernet0/0/0/0==2.2.2.2/GigabitEthernet4"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"5.5.5.5"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/0-GigabitEthernet0/0/0/0"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"2.2.2.2"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet4"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"2.2.2.2/GigabitEthernet3==3.3.3.3/0/0/3-GigabitEthernet0/0/0/3"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"2.2.2.2"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet3"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"3.3.3.3"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/3-GigabitEthernet0/0/0/3"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"3.3.3.3/0/0/3-GigabitEthernet0/0/0/3==2.2.2.2/GigabitEthernet3"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"3.3.3.3"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/3-GigabitEthernet0/0/0/3"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"2.2.2.2"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet3"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"1.1.1.1/GigabitEthernet2==5.5.5.5/0/0/2-GigabitEthernet0/0/0/2"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"1.1.1.1"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet2"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"5.5.5.5"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/2-GigabitEthernet0/0/0/2"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"5.5.5.5/0/0/2-GigabitEthernet0/0/0/2==1.1.1.1/GigabitEthernet2"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"5.5.5.5"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/2-GigabitEthernet0/0/0/2"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"1.1.1.1"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"GigabitEthernet2"
+              }
+           }
+        ]
+     }
+  ]
+}
\ No newline at end of file
diff --git a/src/templates/descriptor-topology-tid.json b/src/templates/descriptor-topology-tid.json
new file mode 100644
index 0000000000000000000000000000000000000000..588d9e90e08589b8d78d7a51c6c5ef8c3f607c0b
--- /dev/null
+++ b/src/templates/descriptor-topology-tid.json
@@ -0,0 +1,752 @@
+{
+  "contexts":[
+     {
+        "context_id":{
+           "context_uuid":{
+              "uuid":"admin"
+           }
+        },
+        "topology_ids":[
+           
+        ],
+        "service_ids":[
+           
+        ]
+     }
+  ],
+  "topologies":[
+     {
+        "topology_id":{
+           "context_id":{
+              "context_uuid":{
+                 "uuid":"admin"
+              }
+           },
+           "topology_uuid":{
+              "uuid":"admin"
+           }
+        },
+        "device_ids":[
+         {
+            "device_uuid":{
+               "uuid":"1.1.1.1"
+            }
+         },
+         {
+            "device_uuid":{
+               "uuid":"2.2.2.2"
+            }
+         },
+           {
+              "device_uuid":{
+                 "uuid":"3.3.3.3"
+              }
+           },
+           {
+              "device_uuid":{
+                 "uuid":"4.4.4.4"
+              }
+           },
+           {
+              "device_uuid":{
+                 "uuid":"5.5.5.5"
+              }
+           }
+        ],
+        "link_ids":[
+           {
+              "link_uuid":{
+                 "uuid":"5.5.5.5/0/0/1-GigabitEthernet0/0/0/1==3.3.3.3/0/0/1-GigabitEthernet0/0/0/1"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"3.3.3.3/0/0/1-GigabitEthernet0/0/0/1==5.5.5.5/0/0/1-GigabitEthernet0/0/0/1"
+              }
+           },
+           {
+            "link_uuid":{
+               "uuid":"5.5.5.5/0/0/2-GigabitEthernet0/0/0/2==1.1.1.1/0/0/1-GigabitEthernet0/0/0/1"
+            }
+         },
+         {
+            "link_uuid":{
+               "uuid":"1.1.1.1/0/0/1-GigabitEthernet0/0/0/1==5.5.5.5/0/0/2-GigabitEthernet0/0/0/2"
+            }
+         },
+         {
+            "link_uuid":{
+               "uuid":"5.5.5.5/0/0/0-GigabitEthernet0/0/0/0==2.2.2.2/0/0/2-GigabitEthernet0/0/0/2"
+            }
+         },
+         {
+            "link_uuid":{
+               "uuid":"2.2.2.2/0/0/2-GigabitEthernet0/0/0/2==5.5.5.5/0/0/0-GigabitEthernet0/0/0/0"
+            }
+         },
+         {
+            "link_uuid":{
+               "uuid":"3.3.3.3/0/0/3-GigabitEthernet0/0/0/3==2.2.2.2/0/0/3-GigabitEthernet0/0/0/3"
+            }
+         },
+         {
+            "link_uuid":{
+               "uuid":"2.2.2.2/0/0/3-GigabitEthernet0/0/0/3==3.3.3.3/0/0/3-GigabitEthernet0/0/0/3"
+            }
+         },
+         {
+          "link_uuid":{
+             "uuid":"1.1.1.1/0/0/0-GigabitEthernet0/0/0/0==2.2.2.2/0/0/0-GigabitEthernet0/0/0/0"
+          }
+       },
+       {
+          "link_uuid":{
+             "uuid":"2.2.2.2/0/0/0-GigabitEthernet0/0/0/0==1.1.1.1/0/0/0-GigabitEthernet0/0/0/0"
+          }
+       },
+       {
+          "link_uuid":{
+             "uuid":"4.4.4.4/0/0/1-GigabitEthernet0/0/0/1==2.2.2.2/0/0/1-GigabitEthernet0/0/0/1"
+          }
+       },
+       {
+          "link_uuid":{
+             "uuid":"2.2.2.2/0/0/1-GigabitEthernet0/0/0/1==4.4.4.4/0/0/1-GigabitEthernet0/0/0/1"
+          }
+       }
+        ]
+     }
+  ],
+  "devices":[
+   {
+      "device_id":{
+         "device_uuid":{
+            "uuid":"1.1.1.1"
+         }
+      },
+      "device_type":"packet-router",
+      "device_config":{
+         "config_rules":[
+            {
+               "action":1,
+               "custom":{
+                  "resource_key":"_connect/address",
+                  "resource_value":"10.95.90.41"
+               }
+            },
+            {
+               "action":1,
+               "custom":{
+                  "resource_key":"_connect/port",
+                  "resource_value":"830"
+               }
+            },
+            {
+               "action":1,
+               "custom":{
+                  "resource_key":"_connect/settings",
+                  "resource_value":{
+                     "username":"cisco",
+                     "password":"cisco12345",
+                     "vendor":"CISCO",
+                     "force_running":false,
+                     "hostkey_verify":false,
+                     "message_renderer":"pyangbind",
+                     "look_for_keys":false,
+                     "allow_agent":false,
+                     "commit_per_rule":true,
+                     "device_params":{
+                        "name":"default"
+                     },
+                     "manager_params":{
+                        "timeout":120
+                     }
+                  }
+               }
+            }
+         ]
+      },
+      "device_operational_status":2,
+      "device_drivers":[
+         1
+      ],
+      "device_endpoints":[
+         
+      ]
+   },
+   {
+      "device_id":{
+         "device_uuid":{
+            "uuid":"2.2.2.2"
+         }
+      },
+      "device_type":"packet-router",
+      "device_config":{
+         "config_rules":[
+            {
+               "action":1,
+               "custom":{
+                  "resource_key":"_connect/address",
+                  "resource_value":"10.95.90.42"
+               }
+            },
+            {
+               "action":1,
+               "custom":{
+                  "resource_key":"_connect/port",
+                  "resource_value":"830"
+               }
+            },
+            {
+               "action":1,
+               "custom":{
+                  "resource_key":"_connect/settings",
+                  "resource_value":{
+                     "username":"cisco",
+                     "password":"cisco12345",
+                     "vendor":"CISCO",
+                     "force_running":false,
+                     "hostkey_verify":false,
+                     "message_renderer":"pyangbind",
+                     "look_for_keys":false,
+                     "allow_agent":false,
+                     "commit_per_rule":true,
+                     "device_params":{
+                        "name":"default"
+                     },
+                     "manager_params":{
+                        "timeout":120
+                     }
+                  }
+               }
+            }
+         ]
+      },
+      "device_operational_status":2,
+      "device_drivers":[
+         1
+      ],
+      "device_endpoints":[
+         
+      ]
+   },
+     {
+        "device_id":{
+           "device_uuid":{
+              "uuid":"3.3.3.3"
+           }
+        },
+        "device_type":"packet-router",
+        "device_config":{
+           "config_rules":[
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/address",
+                    "resource_value":"10.95.90.43"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/port",
+                    "resource_value":"830"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/settings",
+                    "resource_value":{
+                       "username":"cisco",
+                       "password":"cisco12345",
+                       "vendor":"CISCO",
+                       "force_running":false,
+                       "hostkey_verify":false,
+                       "message_renderer":"pyangbind",
+                       "look_for_keys":false,
+                       "allow_agent":false,
+                       "commit_per_rule":true,
+                       "device_params":{
+                          "name":"default"
+                       },
+                       "manager_params":{
+                          "timeout":120
+                       }
+                    }
+                 }
+              }
+           ]
+        },
+        "device_operational_status":2,
+        "device_drivers":[
+           1
+        ],
+        "device_endpoints":[
+           
+        ]
+     },
+     {
+        "device_id":{
+           "device_uuid":{
+              "uuid":"4.4.4.4"
+           }
+        },
+        "device_type":"packet-router",
+        "device_config":{
+           "config_rules":[
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/address",
+                    "resource_value":"10.95.90.44"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/port",
+                    "resource_value":"830"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/settings",
+                    "resource_value":{
+                       "username":"cisco",
+                       "password":"cisco12345",
+                       "vendor":"CISCO",
+                       "force_running":false,
+                       "hostkey_verify":false,
+                       "message_renderer":"pyangbind",
+                       "look_for_keys":false,
+                       "allow_agent":false,
+                       "commit_per_rule":true,
+                       "device_params":{
+                          "name":"default"
+                       },
+                       "manager_params":{
+                          "timeout":120
+                       }
+                    }
+                 }
+              }
+           ]
+        },
+        "device_operational_status":2,
+        "device_drivers":[
+           1
+        ],
+        "device_endpoints":[
+           
+        ]
+     },
+     {
+        "device_id":{
+           "device_uuid":{
+              "uuid":"5.5.5.5"
+           }
+        },
+        "device_type":"packet-router",
+        "device_config":{
+           "config_rules":[
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/address",
+                    "resource_value":"10.95.90.45"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/port",
+                    "resource_value":"830"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/settings",
+                    "resource_value":{
+                       "username":"cisco",
+                       "password":"cisco12345",
+                       "vendor":"CISCO",
+                       "force_running":false,
+                       "hostkey_verify":false,
+                       "message_renderer":"pyangbind",
+                       "look_for_keys":false,
+                       "allow_agent":false,
+                       "commit_per_rule":true,
+                       "device_params":{
+                          "name":"default"
+                       },
+                       "manager_params":{
+                          "timeout":120
+                       }
+                    }
+                 }
+              }
+           ]
+        },
+        "device_operational_status":2,
+        "device_drivers":[
+           1
+        ],
+        "device_endpoints":[
+           
+        ]
+     }
+  ],
+  "links":[
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"5.5.5.5/0/0/1-GigabitEthernet0/0/0/1==3.3.3.3/0/0/1-GigabitEthernet0/0/0/1"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"5.5.5.5"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"3.3.3.3"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"3.3.3.3/0/0/1-GigabitEthernet0/0/0/1==5.5.5.5/0/0/1-GigabitEthernet0/0/0/1"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"3.3.3.3"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"5.5.5.5"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+              }
+           }
+        ]
+     },
+     {
+      "link_id":{
+         "link_uuid":{
+            "uuid":"5.5.5.5/0/0/2-GigabitEthernet0/0/0/2==1.1.1.1/0/0/1-GigabitEthernet0/0/0/1"
+         }
+      },
+      "link_endpoint_ids":[
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"5.5.5.5"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/2-GigabitEthernet0/0/0/2"
+            }
+         },
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"1.1.1.1"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+            }
+         }
+      ]
+   },
+   {
+      "link_id":{
+         "link_uuid":{
+            "uuid":"1.1.1.1/0/0/1-GigabitEthernet0/0/0/1==5.5.5.5/0/0/2-GigabitEthernet0/0/0/2"
+         }
+      },
+      "link_endpoint_ids":[
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"1.1.1.1"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+            }
+         },
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"5.5.5.5"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/2-GigabitEthernet0/0/0/2"
+            }
+         }
+      ]
+   },
+   {
+      "link_id":{
+         "link_uuid":{
+            "uuid":"5.5.5.5/0/0/0-GigabitEthernet0/0/0/0==2.2.2.2/0/0/2-GigabitEthernet0/0/0/2"
+         }
+      },
+      "link_endpoint_ids":[
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"5.5.5.5"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/0-GigabitEthernet0/0/0/0"
+            }
+         },
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"2.2.2.2"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/2-GigabitEthernet0/0/0/2"
+            }
+         }
+      ]
+   },
+   {
+      "link_id":{
+         "link_uuid":{
+            "uuid":"2.2.2.2/0/0/2-GigabitEthernet0/0/0/2==5.5.5.5/0/0/0-GigabitEthernet0/0/0/0"
+         }
+      },
+      "link_endpoint_ids":[
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"2.2.2.2"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/2-GigabitEthernet0/0/0/2"
+            }
+         },
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"5.5.5.5"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/0-GigabitEthernet0/0/0/0"
+            }
+         }
+      ]
+   },
+   {
+      "link_id":{
+         "link_uuid":{
+            "uuid":"3.3.3.3/0/0/3-GigabitEthernet0/0/0/3==2.2.2.2/0/0/3-GigabitEthernet0/0/0/3"
+         }
+      },
+      "link_endpoint_ids":[
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"3.3.3.3"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/3-GigabitEthernet0/0/0/3"
+            }
+         },
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"2.2.2.2"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/3-GigabitEthernet0/0/0/3"
+            }
+         }
+      ]
+   },
+   {
+      "link_id":{
+         "link_uuid":{
+            "uuid":"2.2.2.2/0/0/3-GigabitEthernet0/0/0/3==3.3.3.3/0/0/3-GigabitEthernet0/0/0/3"
+         }
+      },
+      "link_endpoint_ids":[
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"2.2.2.2"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/3-GigabitEthernet0/0/0/3"
+            }
+         },
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"3.3.3.3"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/3-GigabitEthernet0/0/0/3"
+            }
+         }
+      ]
+   },
+   {
+      "link_id":{
+         "link_uuid":{
+            "uuid":"1.1.1.1/0/0/0-GigabitEthernet0/0/0/0==2.2.2.2/0/0/0-GigabitEthernet0/0/0/0"
+         }
+      },
+      "link_endpoint_ids":[
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"1.1.1.1"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/0-GigabitEthernet0/0/0/0"
+            }
+         },
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"2.2.2.2"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/0-GigabitEthernet0/0/0/0"
+            }
+         }
+      ]
+   },
+   {
+      "link_id":{
+         "link_uuid":{
+            "uuid":"2.2.2.2/0/0/0-GigabitEthernet0/0/0/0==1.1.1.1/0/0/0-GigabitEthernet0/0/0/0"
+         }
+      },
+      "link_endpoint_ids":[
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"2.2.2.2"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/0-GigabitEthernet0/0/0/0"
+            }
+         },
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"1.1.1.1"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/0-GigabitEthernet0/0/0/0"
+            }
+         }
+      ]
+   },
+   {
+      "link_id":{
+         "link_uuid":{
+            "uuid":"4.4.4.4/0/0/1-GigabitEthernet0/0/0/1==2.2.2.2/0/0/1-GigabitEthernet0/0/0/1"
+         }
+      },
+      "link_endpoint_ids":[
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"4.4.4.4"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+            }
+         },
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"2.2.2.2"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+            }
+         }
+      ]
+   },
+   {
+      "link_id":{
+         "link_uuid":{
+            "uuid":"2.2.2.2/0/0/1-GigabitEthernet0/0/0/1==4.4.4.4/0/0/1-GigabitEthernet0/0/0/1"
+         }
+      },
+      "link_endpoint_ids":[
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"2.2.2.2"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+            }
+         },
+         {
+            "device_id":{
+               "device_uuid":{
+                  "uuid":"4.4.4.4"
+               }
+            },
+            "endpoint_uuid":{
+               "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+            }
+         }
+      ]
+   }
+  ]
+}
\ No newline at end of file
diff --git a/src/templates/descriptor-topology.json b/src/templates/descriptor-topology.json
new file mode 100644
index 0000000000000000000000000000000000000000..e22737b52783b5db72e5809d83f4cbbc3a936c09
--- /dev/null
+++ b/src/templates/descriptor-topology.json
@@ -0,0 +1,290 @@
+{
+  "contexts":[
+     {
+        "context_id":{
+           "context_uuid":{
+              "uuid":"admin"
+           }
+        },
+        "topology_ids":[
+           
+        ],
+        "service_ids":[
+           
+        ]
+     }
+  ],
+  "topologies":[
+     {
+        "topology_id":{
+           "context_id":{
+              "context_uuid":{
+                 "uuid":"admin"
+              }
+           },
+           "topology_uuid":{
+              "uuid":"admin"
+           }
+        },
+        "device_ids":[
+           {
+              "device_uuid":{
+                 "uuid":"3.3.3.3"
+              }
+           },
+           {
+              "device_uuid":{
+                 "uuid":"4.4.4.4"
+              }
+           },
+           {
+              "device_uuid":{
+                 "uuid":"5.5.5.5"
+              }
+           }
+        ],
+        "link_ids":[
+           {
+              "link_uuid":{
+                 "uuid":"5.5.5.5/0/0/1-GigabitEthernet0/0/0/1==3.3.3.3/0/0/1-GigabitEthernet0/0/0/1"
+              }
+           },
+           {
+              "link_uuid":{
+                 "uuid":"3.3.3.3/0/0/1-GigabitEthernet0/0/0/1==5.5.5.5/0/0/1-GigabitEthernet0/0/0/1"
+              }
+           }
+        ]
+     }
+  ],
+  "devices":[
+     {
+        "device_id":{
+           "device_uuid":{
+              "uuid":"3.3.3.3"
+           }
+        },
+        "device_type":"packet-router",
+        "device_config":{
+           "config_rules":[
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/address",
+                    "resource_value":"10.60.125.43"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/port",
+                    "resource_value":"830"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/settings",
+                    "resource_value":{
+                       "username":"cisco",
+                       "password":"cisco12345",
+                       "vendor":"CISCO",
+                       "force_running":false,
+                       "hostkey_verify":false,
+                       "message_renderer":"pyangbind",
+                       "look_for_keys":false,
+                       "allow_agent":false,
+                       "commit_per_rule":true,
+                       "device_params":{
+                          "name":"default"
+                       },
+                       "manager_params":{
+                          "timeout":120
+                       }
+                    }
+                 }
+              }
+           ]
+        },
+        "device_operational_status":2,
+        "device_drivers":[
+           1
+        ],
+        "device_endpoints":[
+           
+        ]
+     },
+     {
+        "device_id":{
+           "device_uuid":{
+              "uuid":"4.4.4.4"
+           }
+        },
+        "device_type":"packet-router",
+        "device_config":{
+           "config_rules":[
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/address",
+                    "resource_value":"10.60.125.44"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/port",
+                    "resource_value":"830"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/settings",
+                    "resource_value":{
+                       "username":"cisco",
+                       "password":"cisco12345",
+                       "vendor":"CISCO",
+                       "force_running":false,
+                       "hostkey_verify":false,
+                       "message_renderer":"pyangbind",
+                       "look_for_keys":false,
+                       "allow_agent":false,
+                       "commit_per_rule":true,
+                       "device_params":{
+                          "name":"default"
+                       },
+                       "manager_params":{
+                          "timeout":120
+                       }
+                    }
+                 }
+              }
+           ]
+        },
+        "device_operational_status":2,
+        "device_drivers":[
+           1
+        ],
+        "device_endpoints":[
+           
+        ]
+     },
+     {
+        "device_id":{
+           "device_uuid":{
+              "uuid":"5.5.5.5"
+           }
+        },
+        "device_type":"packet-router",
+        "device_config":{
+           "config_rules":[
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/address",
+                    "resource_value":"10.60.125.45"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/port",
+                    "resource_value":"830"
+                 }
+              },
+              {
+                 "action":1,
+                 "custom":{
+                    "resource_key":"_connect/settings",
+                    "resource_value":{
+                       "username":"cisco",
+                       "password":"cisco12345",
+                       "vendor":"CISCO",
+                       "force_running":false,
+                       "hostkey_verify":false,
+                       "message_renderer":"pyangbind",
+                       "look_for_keys":false,
+                       "allow_agent":false,
+                       "commit_per_rule":true,
+                       "device_params":{
+                          "name":"default"
+                       },
+                       "manager_params":{
+                          "timeout":120
+                       }
+                    }
+                 }
+              }
+           ]
+        },
+        "device_operational_status":2,
+        "device_drivers":[
+           1
+        ],
+        "device_endpoints":[
+           
+        ]
+     }
+  ],
+  "links":[
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"5.5.5.5/0/0/1-GigabitEthernet0/0/0/1==3.3.3.3/0/0/1-GigabitEthernet0/0/0/1"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"5.5.5.5"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"3.3.3.3"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+              }
+           }
+        ]
+     },
+     {
+        "link_id":{
+           "link_uuid":{
+              "uuid":"3.3.3.3/0/0/1-GigabitEthernet0/0/0/1==5.5.5.5/0/0/1-GigabitEthernet0/0/0/1"
+           }
+        },
+        "link_endpoint_ids":[
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"3.3.3.3"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+              }
+           },
+           {
+              "device_id":{
+                 "device_uuid":{
+                    "uuid":"5.5.5.5"
+                 }
+              },
+              "endpoint_uuid":{
+                 "uuid":"0/0/1-GigabitEthernet0/0/0/1"
+              }
+           }
+        ]
+     }
+  ]
+}
\ No newline at end of file
diff --git a/src/templates/descriptor.json b/src/templates/descriptor.json
new file mode 100644
index 0000000000000000000000000000000000000000..4923ab4427b5723d970c006043242373fb4eafdd
--- /dev/null
+++ b/src/templates/descriptor.json
@@ -0,0 +1,27 @@
+{
+    "contexts": [
+      {
+        "context_id": {
+          "context_uuid": {
+            "uuid": "admin"
+          }
+        },
+        "topology_ids": [],
+        "service_ids": []
+      }
+    ],
+    "topologies": [
+      {
+        "topology_id": {
+          "context_id": {
+            "context_uuid": {
+              "uuid": "admin"
+            }
+          },
+          "topology_uuid": {
+            "uuid": "admin"
+          }
+        }
+      }
+    ]
+  }
\ No newline at end of file
diff --git a/src/templates/ietfL2VPN_template.json b/src/templates/ietfL2VPN_template.json
new file mode 100644
index 0000000000000000000000000000000000000000..79037c2f7e423ce44b34bd90f35ca8fe74071f18
--- /dev/null
+++ b/src/templates/ietfL2VPN_template.json
@@ -0,0 +1,38 @@
+{
+    "l2vpn": {
+      "vpn-services": {
+        "vpn-service": [
+          {
+            "vpn-id": 100,
+            "name": "VPN_L2_Example",
+            "vpn-type": "point-to-point",
+            "site": [
+              {
+                "site-id": 1,
+                "site-role": "hub",
+                "site-location": "R4",
+                "site-network-access": {
+                  "interface": {
+                    "ip-address": "4.4.4.4",
+                    "encapsulation": "ethernet"
+                  }
+                }
+              },
+              {
+                "site-id": 2,
+                "site-role": "spoke",
+                "site-location": "R5",
+                "site-network-access": {
+                  "interface": {
+                    "ip-address": "5.5.5.5",
+                    "encapsulation": "ethernet"
+                  }
+                }
+              }
+            ]
+          }
+        ]
+      }
+    }
+  }
+  
\ No newline at end of file
diff --git a/src/templates/ietfL3VPN_template.json b/src/templates/ietfL3VPN_template.json
new file mode 100644
index 0000000000000000000000000000000000000000..07ffbe91b29addee98b3ac390076a581916038d5
--- /dev/null
+++ b/src/templates/ietfL3VPN_template.json
@@ -0,0 +1,184 @@
+{
+    "ietf-l3vpn-svc:l3vpn-svc": {
+      "sites": {
+        "site": [
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "4.4.4.4",
+                  "location": "router4"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "router4"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "4.4.4.4/24",
+                          "lan-tag": "100",
+                          "next-hop": "2.2.2.2"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_router4",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "4.4.4.4",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "2.2.2.2",
+                        "prefix-length": "24",
+                        "provider-address": "4.4.4.4"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 20
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 5000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 1000000000
+                  },
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:hub-role",
+                    "vpn-id": "vpn-example"
+                  }
+                }
+              ]
+            }
+          },
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "5.5.5.5",
+                  "location": "router5"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "router5"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "5.5.5.5/24",
+                          "lan-tag": "200",
+                          "next-hop": "2.2.2.2"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_router5",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "5.5.5.5",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "2.2.2.2",
+                        "prefix-length": "24",
+                        "provider-address": "5.5.5.5"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 10
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 1000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 5000000000
+                  },
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:spoke-role",
+                    "vpn-id": "vpn-example"
+                  }
+                }
+              ]
+            }
+          }
+        ]
+      },
+      "vpn-services": {
+        "vpn-service": [
+          {
+            "vpn-id": "vpn-example"
+          }
+        ]
+      }
+    }
+  }
+  
\ No newline at end of file
diff --git a/src/templates/ietf_template_empty.json b/src/templates/ietf_template_empty.json
new file mode 100644
index 0000000000000000000000000000000000000000..b4fb81f6d61100bfa0dcdb17fa0165eb03bd9ed8
--- /dev/null
+++ b/src/templates/ietf_template_empty.json
@@ -0,0 +1,178 @@
+{
+  "ietf-network-slice-service:network-slice-services":{
+     "slo-sle-templates":{
+        "slo-sle-template":[
+           {
+              "id":"",
+              "description":"",
+              "slo-policy":{
+                 "metric-bound":[
+                    {
+                       "metric-type":"one-way-bandwidth",
+                       "metric-unit":"kbps",
+                       "bound":""
+                    },
+                    {
+                       "metric-type":"one-way-delay-maximum",
+                       "metric-unit":"milliseconds",
+                       "bound":""
+                    }
+                 ]
+              },
+              "sle-policy":{
+                 "security":"",
+                 "isolation":"",
+                 "path-constraints":{
+                    "service-functions":"",
+                    "diversity":{
+                       "diversity":{
+                          "diversity-type":""
+                       }
+                    }
+                 }
+              }
+           }
+        ]
+     },
+     "slice-service":[
+        {
+           "id":"5GSliceMapping",
+           "description":"example 5G Slice mapping",
+           "service-tags":{
+              "tag-type":{
+                 "tag-type":"",
+                 "value":""
+              }
+           },
+           "slo-sle-policy":{
+              "slo-sle-template":""
+           },
+           "status":{
+              
+           },
+           "sdps":{
+              "sdp":[
+                 {
+                    "id":"01",
+                    "geo-location":"",
+                    "node-id":"",
+                    "sdp-ip-address":"",
+                    "tp-ref":"",
+                    "service-match-criteria":{
+                       "match-criterion":[
+                          {
+                             "index":1,
+                             "match-type":"",
+                             "value":[
+                                
+                             ],
+                             "target-connection-group-id":""
+                          }
+                       ]
+                    },
+                    "incoming-qos-policy":"",
+                    "outgoing-qos-policy":"",
+                    "sdp-peering":{
+                       "peer-sap-id":"",
+                       "protocols":""
+                    },
+                    "ac-svc-ref":[
+                       
+                    ],
+                    "attachment-circuits":{
+                       "attachment-circuit":[
+                          {
+                             "id":"100",
+                             "ac-ipv4-address":"",
+                             "ac-ipv4-prefix-length":0,
+                             "sdp-peering":{
+                                "peer-sap-id":""
+                             },
+                             "status":{
+                                
+                             }
+                          }
+                       ]
+                    },
+                    "status":{
+                       
+                    },
+                    "sdp-monitoring":""
+                 },
+                 {
+                    "id":"02",
+                    "geo-location":"",
+                    "node-id":"",
+                    "sdp-ip-address":"",
+                    "tp-ref":"",
+                    "service-match-criteria":{
+                       "match-criterion":[
+                          {
+                             "index":1,
+                             "match-type":"",
+                             "value":[
+                                
+                             ],
+                             "target-connection-group-id":""
+                          }
+                       ]
+                    },
+                    "incoming-qos-policy":"",
+                    "outgoing-qos-policy":"",
+                    "sdp-peering":{
+                       "peer-sap-id":"",
+                       "protocols":""
+                    },
+                    "ac-svc-ref":[
+                       
+                    ],
+                    "attachment-circuits":{
+                       "attachment-circuit":[
+                          {
+                             "id":"200",
+                             "ac-ipv4-address":"",
+                             "ac-ipv4-prefix-length":0,
+                             "sdp-peering":{
+                                "peer-sap-id":""
+                             },
+                             "status":{
+                                
+                             }
+                          }
+                       ]
+                    },
+                    "status":{
+                       
+                    },
+                    "sdp-monitoring":""
+                 }
+              ]
+           },
+           "connection-groups":{
+              "connection-group":[
+                 {
+                    "id":"",
+                    "connectivity-type":"ietf-vpn-common:any-to-any",
+                    "connectivity-construct":[
+                       {
+                          "id":1,
+                          "a2a-sdp":[
+                             {
+                                "sdp-id":"01"
+                             },
+                             {
+                                "sdp-id":"02"
+                             }
+                          ]
+                       }
+                    ],
+                    "status":{
+                       
+                    }
+                 }
+              ]
+           }
+        }
+     ]
+  }
+}
\ No newline at end of file
diff --git a/src/templates/ietf_template_example.json b/src/templates/ietf_template_example.json
new file mode 100644
index 0000000000000000000000000000000000000000..82782208df2489ba0aba0a27c121f90a71c34d4d
--- /dev/null
+++ b/src/templates/ietf_template_example.json
@@ -0,0 +1,158 @@
+{
+  "ietf-network-slice-service:network-slice-services": {
+    "slo-sle-templates": {
+      "slo-sle-template": [
+        {
+          "id": "A",
+          "description": "",
+          "slo-policy": {
+            "metric-bound": [
+              {
+                "metric-type": "one-way-bandwidth",
+                "metric-unit": "kbps",
+                "bound": 2
+              },
+              {
+                "metric-type": "one-way-delay-maximum",
+                "metric-unit": "milliseconds",
+                "bound": 20
+              }
+            ]
+          },
+          "sle-policy": {
+            "security": "",
+            "isolation": "",
+            "path-constraints": {
+              "service-functions": "",
+              "diversity": {
+                "diversity": {
+                  "diversity-type": ""
+                }
+              }
+            }
+          }
+        }
+      ]
+    },
+    "slice-service": [
+      {
+        "id": "slice-service-366e05b7-34e6-4597-9e28-e580abaeda71",
+        "description": "Transport network slice mapped with 3GPP slice NetworkSlice1",
+        "service-tags": {
+          "tag-type": {
+            "tag-type": "",
+            "value": ""
+          }
+        },
+        "slo-sle-policy": {
+          "slo-sle-template": "A"
+        },
+        "status": {},
+        "sdps": {
+          "sdp": [
+            {
+              "id": "01",
+              "geo-location": "",
+              "node-id": "CU-N2",
+              "sdp-ip-address": "10.60.60.105",
+              "tp-ref": "",
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": "VLAN",
+                    "value": "100",
+                    "target-connection-group-id": "CU-N2_AMF-N2"
+                  }
+                ]
+              },
+              "incoming-qos-policy": "",
+              "outgoing-qos-policy": "",
+              "sdp-peering": {
+                "peer-sap-id": "",
+                "protocols": ""
+              },
+              "ac-svc-ref": [],
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "id": "100",
+                    "ac-ipv4-address": "10.60.60.105",
+                    "ac-ipv4-prefix-length": 0,
+                    "sdp-peering": {
+                      "peer-sap-id": "5.5.5.5"
+                    },
+                    "status": {}
+                  }
+                ]
+              },
+              "status": {},
+              "sdp-monitoring": ""
+            },
+            {
+              "id": "02",
+              "geo-location": "",
+              "node-id": "AMF-N2",
+              "sdp-ip-address": "10.60.11.3",
+              "tp-ref": "",
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": "VLAN",
+                    "value": "100",
+                    "target-connection-group-id": "CU-N2_AMF-N2"
+                  }
+                ]
+              },
+              "incoming-qos-policy": "",
+              "outgoing-qos-policy": "",
+              "sdp-peering": {
+                "peer-sap-id": "",
+                "protocols": ""
+              },
+              "ac-svc-ref": [],
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "id": "200",
+                    "ac-ipv4-address": "10.60.11.3",
+                    "ac-ipv4-prefix-length": 0,
+                    "sdp-peering": {
+                      "peer-sap-id": "4.4.4.4"
+                    },
+                    "status": {}
+                  }
+                ]
+              },
+              "status": {},
+              "sdp-monitoring": ""
+            }
+          ]
+        },
+        "connection-groups": {
+          "connection-group": [
+            {
+              "id": "CU-N2_AMF-N2",
+              "connectivity-type": "ietf-vpn-common:any-to-any",
+              "connectivity-construct": [
+                {
+                  "id": 1,
+                  "a2a-sdp": [
+                    {
+                      "sdp-id": "01"
+                    },
+                    {
+                      "sdp-id": "02"
+                    }
+                  ]
+                }
+              ],
+              "status": {}
+            }
+          ]
+        }
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/src/templates/ietf_template_filled.json b/src/templates/ietf_template_filled.json
new file mode 100644
index 0000000000000000000000000000000000000000..e7a525e096c027323a4feb63ff8407f9385a2ee0
--- /dev/null
+++ b/src/templates/ietf_template_filled.json
@@ -0,0 +1,152 @@
+{
+  "ietf-network-slice-service:network-slice-services":{
+     "slo-sle-templates":{
+        "slo-sle-template":[
+           {
+              "id":"MidhaulId",
+              "slo-policy":{
+                 "metric-bound":[
+                    {
+                       "metric-type":"one-way-bandwidth",
+                       "metric-unit":"kbps",
+                       "bound":300
+                    },
+                    {
+                       "metric-type":"one-way-delay-maximum",
+                       "metric-unit":"milliseconds",
+                       "bound":1
+                    }
+                 ]
+              },
+              "sle-policy":{
+                 "security":[
+                    
+                 ],
+                 "isolation":[
+                    
+                 ],
+                 "steering-constraints":{
+                    "path-constraints":"",
+                    "service-function":""
+                 }
+              }
+           }
+        ]
+     },
+     "slice-service":[
+        {
+           "id":"5GSliceMapping",
+           "description":"example 5G Slice mapping",
+           "slo-sle-template":"MidhaulId",
+           "status":{
+              
+           },
+           "sdps":{
+              "sdp":[
+                 {
+                    "id":"01",
+                    "node-id":"DU1",
+                    "sdp-ip-address":"1.1.1.2",
+                    "service-match-criteria":{
+                       "match-criterion":[
+                          {
+                             "index":1,
+                             "match-type":"vlan-match",
+                             "value":[
+                                "100"
+                             ],
+                             "target-connection-group-id":"DU-CU"
+                          }
+                       ]
+                    },
+                    "sdp-peering":{
+                       "peer-sap-id":"",
+                       "protocols":""
+                    },
+                    "ac-svc-name":[
+                       
+                    ],
+                    "attachment-circuits":{
+                       "attachment-circuit":[
+                          {
+                             "id":"100",
+                             "ac-ipv4-address":"1.1.1.1",
+                             "ac-ipv4-prefix-length":0,
+                             "sdp-peering":{
+                                "peer-sap-id":"1.1.1.254"
+                             },
+                             "status":{
+                                
+                             }
+                          }
+                       ]
+                    },
+                    "status":{
+                       
+                    }
+                 },
+                 {
+                    "id":"02",
+                    "node-id":"CU-UP1",
+                    "sdp-ip-address":"100.1.1.2",
+                    "service-match-criteria":{
+                       "match-criterion":[
+                          {
+                             "index":1,
+                             "match-type":"vlan-match",
+                             "value":[
+                                "100"
+                             ],
+                             "target-connection-group-id":"DU-CU"
+                          }
+                       ]
+                    },
+                    "attachment-circuits":{
+                       "attachment-circuit":[
+                          {
+                             "id":"200",
+                             "ac-ipv4-address":"100.1.1.1",
+                             "ac-ipv4-prefix-length":0,
+                             "sdp-peering":{
+                                "peer-sap-id":"100.1.1.254"
+                             },
+                             "status":{
+                                
+                             }
+                          }
+                       ]
+                    },
+                    "status":{
+                       
+                    }
+                 }
+              ]
+           },
+           "connection-groups":{
+              "connection-group":[
+                 {
+                    "id":"DU-CU",
+                    "connectivity-type":"ietf-vpn-common:any-to-any",
+                    "connectivity-construct":[
+                       {
+                          "id":1,
+                          "a2a-sdp":[
+                             {
+                                "sdp-id":"01"
+                             },
+                             {
+                                "sdp-id":"02"
+                             }
+                          ]
+                       }
+                    ],
+                    "status":{
+                       
+                    }
+                 }
+              ]
+           }
+        }
+     ]
+  }
+}
\ No newline at end of file
diff --git a/src/templates/ips.json b/src/templates/ips.json
new file mode 100644
index 0000000000000000000000000000000000000000..c041c4c41f46e678598ae13d0743923e2998a114
--- /dev/null
+++ b/src/templates/ips.json
@@ -0,0 +1,18 @@
+{
+	"CU":[
+		{"prefix":"100.1.1.2", "node-name":"CU-UP1" },
+		{"prefix":"100.1.2.2", "node-name":"CU-UP2" }
+	],
+	"DU":[
+		{"prefix":"1.1.1.2", "node-name":"DU1" },
+		{"prefix":"1.1.2.2", "node-name":"DU2" },
+		{"prefix":"1.1.3.2", "node-name":"DU3" }
+	],
+	"public-prefixes":[
+		{"prefix":"10.95.90.125", "node-name":"HL5-2-2" },
+		{"prefix":"10.95.90.126", "node-name":"HL5-1-2" },
+		{"prefix":"10.95.86.167", "node-name":"HL5-3-2" },
+		{"prefix":"10.95.86.107", "node-name":"HL4-1-2" },
+		{"prefix":"10.95.90.85", "node-name":"HL4-2-2" }
+	]
+}
diff --git a/src/templates/test_service.json b/src/templates/test_service.json
new file mode 100644
index 0000000000000000000000000000000000000000..bd956b7281afce8f3626bfa08be5dc9471e63e8b
--- /dev/null
+++ b/src/templates/test_service.json
@@ -0,0 +1,93 @@
+{
+    "services": [
+      {
+        "service_id": {
+          "context_id": {
+            "context_uuid": {
+              "uuid": "admin"
+            }
+          },
+          "service_uuid": {
+            "uuid": "l2-acl-svc-17387469754519430"
+          }
+        },
+        "service_type": 2,
+        "service_status": {
+          "service_status": 1
+        },
+        "service_endpoint_ids": [
+          {
+            "device_id": {
+              "device_uuid": {
+                "uuid": "172.16.185.31"
+              }
+            },
+            "endpoint_uuid": {
+              "uuid": "eth-1/0/22"
+            }
+          },
+          {
+            "device_id": {
+              "device_uuid": {
+                "uuid": "172.16.185.32"
+              }
+            },
+            "endpoint_uuid": {
+              "uuid": "eth-1/0/6"
+            }
+          }
+        ],
+        "service_constraints": [
+          {
+            "custom": {
+              "constraint_type": "bandwidth[kbps]",
+              "constraint_value": "20"
+            }
+          },
+          {
+            "custom": {
+              "constraint_type": "latency[ms]",
+              "constraint_value": "20"
+            }
+          }
+        ],
+        "service_config": {
+          "config_rules": [
+            {
+              "action": 1,
+              "custom": {
+                "resource_key": "/settings",
+                "resource_value": {}
+              }
+            },
+            {
+              "action": 1,
+              "custom": {
+                "resource_key": "/device[172.16.185.31]/endpoint[eth-1/0/22]/settings",
+                "resource_value": {
+                  "sub_interface_index": 0,
+                  "vlan_id": 100,
+                  "circuit_id": "100",
+                  "remote_router": "172.16.185.32",
+                  "ni_name": "ELAN100"
+                }
+              }
+            },
+            {
+              "action": 1,
+              "custom": {
+                "resource_key": "/device[172.16.185.32]/endpoint[eth-1/0/6]/settings",
+                "resource_value": {
+                  "sub_interface_index": 0,
+                  "vlan_id": 100,
+                  "circuit_id": "100",
+                  "remote_router": "172.16.185.31",
+                  "ni_name": "ELAN100"
+                }
+              }
+            }
+          ]
+        }
+      }
+    ]
+  }
\ No newline at end of file
diff --git a/swagger/models/create_models.py b/swagger/models/create_models.py
new file mode 100644
index 0000000000000000000000000000000000000000..3dac63b2b131e5e710f3a61b1e0b40f0f6d65336
--- /dev/null
+++ b/swagger/models/create_models.py
@@ -0,0 +1,324 @@
+# Copyright 2025 Telefonica Innovación Digital S.L.
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from flask_restx import fields
+
+def create_gpp_nrm_28541_model(slice_ns):
+    # 3GPP NRM TS28.541 Data models
+    logical_interface_info_model = slice_ns.model(
+        "LogicalInterfaceInfo",
+        {
+            "logicalInterfaceType": fields.String(
+                description="Type of logical interface", example="VLAN"
+            ),
+            "logicalInterfaceId": fields.String(
+                description="Identifier of the logical interface", example="300"
+            ),
+        },
+    )
+
+    ep_transport_model = slice_ns.model(
+        "EpTransport",
+        {
+            "IpAddress": fields.String(
+                description="IP address of the endpoint", example="100.1.1.1"
+            ),
+            "logicalInterfaceInfo": fields.Nested(
+                logical_interface_info_model, description="Logical interface details"
+            ),
+            "NextHopInfo": fields.String(
+                description="Next hop information", example="100.1.1.254"
+            ),
+            "qosProfile": fields.String(description="QoS profile", example="5QI100"),
+            "EpApplicationRef": fields.List(
+                fields.String,
+                description="References to associated applications",
+                example=["EP_F1U CU-UP1"],
+            ),
+        },
+    )
+
+    slice_profile_model = slice_ns.model(
+        "SliceProfile",
+        {
+            "sliceProfileId": fields.String(
+                description="ID of the slice profile", example="TopId"
+            ),
+            "pLMNInfoList": fields.Raw(
+                description="PLMN information list (nullable)", example=None
+            ),
+            "TopSliceSubnetProfile": fields.Nested(
+                slice_ns.model(
+                    "TopSliceSubnetProfile",
+                    {
+                        "dLThptPerSliceSubnet": fields.Nested(
+                            slice_ns.model(
+                                "DLThpt",
+                                {
+                                    "GuaThpt": fields.Integer(
+                                        description="Guaranteed throughput", example=200
+                                    ),
+                                    "MaxThpt": fields.Integer(
+                                        description="Maximum throughput", example=400
+                                    ),
+                                },
+                            ),
+                            description="Downlink throughput details",
+                        ),
+                        "uLThptPerSliceSubnet": fields.Nested(
+                            slice_ns.model(
+                                "ULThpt",
+                                {
+                                    "GuaThpt": fields.Integer(
+                                        description="Guaranteed throughput", example=200
+                                    ),
+                                    "MaxThpt": fields.Integer(
+                                        description="Maximum throughput", example=400
+                                    ),
+                                },
+                            ),
+                            description="Uplink throughput details",
+                        ),
+                        "dLLatency": fields.Integer(
+                            description="Downlink latency", example=20
+                        ),
+                        "uLLatency": fields.Integer(
+                            description="Uplink latency", example=20
+                        ),
+                    },
+                ),
+                description="Top slice subnet profile details",
+            ),
+        },
+    )
+
+    subnet_model = slice_ns.model(
+        "Subnet",
+        {
+            "operationalState": fields.String(
+                description="Operational state of the subnet", example=""
+            ),
+            "administrativeState": fields.String(
+                description="Administrative state of the subnet", example=""
+            ),
+            "nsInfo": fields.Raw(
+                description="Network slice information (object)", example={}
+            ),
+            "managedFunctionRef": fields.List(
+                fields.Raw, description="Managed function references", example=[]
+            ),
+            "networkSliceSubnetType": fields.String(
+                description="Type of the subnet", example="TOP_SLICESUBNET"
+            ),
+            "SliceProfileList": fields.List(
+                fields.Nested(slice_profile_model),
+                description="List of slice profiles for the subnet",
+            ),
+            "networkSliceSubnetRef": fields.List(
+                fields.String,
+                description="References to other subnets",
+                example=["CNSliceSubnet1", "RANSliceSubnet1"],
+            ),
+        },
+    )
+
+    gpp_network_slice_request_model = slice_ns.model(
+        "NetworkSliceRequest",
+        {
+            "NetworkSlice1": fields.Nested(
+                subnet_model,
+                description="Top-level slice details",
+            ),
+            "TopSliceSubnet1": fields.Nested(
+                subnet_model, description="Details of the top slice subnet"
+            ),
+            "CNSliceSubnet1": fields.Nested(
+                subnet_model, description="Details of the CN slice subnet"
+            ),
+            "RANSliceSubnet1": fields.Nested(
+                subnet_model, description="Details of the RAN slice subnet"
+            ),
+            "MidhaulSliceSubnet1": fields.Nested(
+                subnet_model, description="Details of the midhaul slice subnet"
+            ),
+            "BackhaulSliceSubnet1": fields.Nested(
+                subnet_model, description="Details of the backhaul slice subnet"
+            ),
+            "EpTransport CU-UP1": fields.Nested(
+                ep_transport_model, description="Details of the transport endpoint CU-UP1"
+            ),
+            "EP_F1U CU-UP1": fields.Nested(
+                slice_ns.model(
+                    "EPF1U",
+                    {
+                        "localAddress": fields.String(
+                            description="Local address", example="100.1.1.2"
+                        ),
+                        "remoteAddress": fields.String(
+                            description="Remote address", example="1.1.3.2"
+                        ),
+                        "epTransportRef": fields.List(
+                            fields.String,
+                            description="References to transport endpoints",
+                            example=["EpTransport CU-UP1"],
+                        ),
+                    },
+                ),
+                description="Details of the application endpoint F1U",
+            ),
+        },
+    )
+    return gpp_network_slice_request_model
+
+def create_ietf_network_slice_nbi_yang_model(slice_ns):
+    # IETF draft-ietf-teas-ietf-network-slice-nbi-yang Data models
+    slo_policy_model = slice_ns.model('SloPolicy', {
+        'metric-bound': fields.List(fields.Nested(slice_ns.model('MetricBound', {
+            'metric-type': fields.String(),
+            'metric-unit': fields.String(),
+            'bound': fields.Integer()
+        })))
+    })
+
+    sle_policy_model = slice_ns.model('SlePolicy', {
+        'security': fields.String(),
+        'isolation': fields.String(),
+        'path-constraints': fields.Nested(slice_ns.model('PathConstraints', {
+            'service-functions': fields.String(),
+            'diversity': fields.Nested(slice_ns.model('Diversity', {
+                'diversity-type': fields.String()
+            }))
+        }))
+    })
+
+    slo_sle_template_model = slice_ns.model('SloSleTemplate', {
+        'id': fields.String(),
+        'description': fields.String(),
+        'slo-policy': fields.Nested(slo_policy_model),
+        'sle-policy': fields.Nested(sle_policy_model)
+    })
+
+    service_match_criteria_model = slice_ns.model('ServiceMatchCriteria', {
+        'match-criterion': fields.List(fields.Nested(slice_ns.model('MatchCriterion', {
+            'index': fields.Integer(),
+            'match-type': fields.String(),
+            'value': fields.String(),
+            'target-connection-group-id': fields.String()
+        })))
+    })
+
+    attachment_circuit_model = slice_ns.model('AttachmentCircuit', {
+        'id': fields.String(),
+        'ac-ipv4-address': fields.String(),
+        'ac-ipv4-prefix-length': fields.Integer(),
+        'sdp-peering': fields.Nested(slice_ns.model('SdpPeering', {
+            'peer-sap-id': fields.String()
+        })),
+        'status': fields.String()
+    })
+
+    sdp_model = slice_ns.model('Sdp', {
+        'id': fields.String(),
+        'geo-location': fields.String(),
+        'node-id': fields.String(),
+        'sdp-ip-address': fields.String(),
+        'tp-ref': fields.String(),
+        'service-match-criteria': fields.Nested(service_match_criteria_model),
+        'incoming-qos-policy': fields.String(),
+        'outgoing-qos-policy': fields.String(),
+        'sdp-peering': fields.Nested(slice_ns.model('SdpPeering', {
+            'peer-sap-id': fields.String(),
+            'protocols': fields.String()
+        })),
+        'ac-svc-ref': fields.List(fields.String()),
+        'attachment-circuits': fields.List(fields.Nested(attachment_circuit_model)),
+        'status': fields.String(),
+        'sdp-monitoring': fields.String()
+    })
+
+    connection_group_model = slice_ns.model('ConnectionGroup', {
+        'id': fields.String(),
+        'connectivity-type': fields.String(),
+        'connectivity-construct': fields.List(fields.Nested(slice_ns.model('ConnectivityConstruct', {
+            'id': fields.Integer(),
+            'a2a-sdp': fields.List(fields.Nested(slice_ns.model('A2ASdp', {
+                'sdp-id': fields.String()
+            })))
+        }))),
+        'status': fields.String()
+    })
+
+    slice_service_model = slice_ns.model('SliceService', {
+        'id': fields.String(),
+        'description': fields.String(),
+        'service-tags': fields.Nested(slice_ns.model('ServiceTags', {
+            'tag-type': fields.Nested(slice_ns.model('TagType', {
+                'tag-type': fields.String(),
+                'value': fields.String()
+            }))
+        })),
+        'slo-sle-policy': fields.Nested(slice_ns.model('SloSlePolicy', {
+            'slo-sle-template': fields.String()
+        })),
+        'status': fields.String(),
+        'sdps': fields.Nested(slice_ns.model('Sdps', {
+            'sdp': fields.List(fields.Nested(sdp_model))
+        })),
+        'connection-groups': fields.Nested(slice_ns.model('ConnectionGroups', {
+            'connection-group': fields.List(fields.Nested(connection_group_model))
+        }))
+    })
+
+    ietf_network_slice_request_model = slice_ns.model('NetworkSliceService', {
+        'ietf-network-slice-service:network-slice-services': fields.Nested(slice_ns.model('NetworkSliceServices', {
+        'slo-sle-templates': fields.Nested(slice_ns.model('SloSleTemplates', {
+            'slo-sle-template': fields.List(fields.Nested(slo_sle_template_model))
+        })),
+        'slice-service': fields.List(fields.Nested(slice_service_model))
+    }))
+    })
+
+    slice_ddbb_model = slice_ns.model('ddbb_model', {
+        'slice_id': fields.String(),
+        'intent': fields.List(fields.Nested(ietf_network_slice_request_model))
+    })
+
+
+    slice_response_model = slice_ns.model(
+        "SliceResponse",
+        {
+            "status": fields.String(description="Status of the request", example="success"),
+            "slices": fields.List(
+                fields.Nested(
+                    slice_ns.model(
+                        "SliceDetails",
+                        {
+                            "id": fields.String(description="Slice ID", example="CU-UP1_DU1"),
+                            "source": fields.String(description="Source IP", example="100.2.1.2"),
+                            "destination": fields.String(description="Destination IP", example="100.1.1.2"),
+                            "vlan": fields.String(description="VLAN ID", example="100"),
+                            "bandwidth(Mbps)": fields.Integer(
+                                description="Bandwidth in Mbps", example=120
+                            ),
+                            "latency(ms)": fields.Integer(
+                                description="Latency in milliseconds", example=4
+                            ),
+                        },
+                    )
+                ),
+                description="List of slices",
+            ),
+        },
+    )
+    return slice_ddbb_model, slice_response_model
\ No newline at end of file
diff --git a/swagger/slice_namespace.py b/swagger/slice_namespace.py
new file mode 100644
index 0000000000000000000000000000000000000000..6585163a659b2eaa9db237a2c7a062ea8c4b29db
--- /dev/null
+++ b/swagger/slice_namespace.py
@@ -0,0 +1,126 @@
+# Copyright 2025 Telefonica Innovación Digital S.L.
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from flask import request
+from flask_restx import Namespace, Resource, fields, reqparse
+from src.network_slice_controller import NSController
+import json
+from swagger.models.create_models import create_gpp_nrm_28541_model, create_ietf_network_slice_nbi_yang_model
+
+slice_ns = Namespace(
+    "slice",
+    description="Operations related to transport network slices"
+)
+
+# 3GPP NRM TS28.541 Data models
+gpp_network_slice_request_model = create_gpp_nrm_28541_model(slice_ns)
+
+# IETF draft-ietf-teas-ietf-network-slice-nbi-yang Data models
+
+slice_ddbb_model, slice_response_model = create_ietf_network_slice_nbi_yang_model(slice_ns)
+
+upload_parser = reqparse.RequestParser()
+upload_parser.add_argument('file', location='files', type='FileStorage', help="Archivo a subir")
+upload_parser.add_argument('json_data', location='form', help="Datos JSON en formato string")
+
+# Namespace Controllers
+@slice_ns.route("/")
+class SliceList(Resource):
+    @slice_ns.doc(summary="Return all transport network slices", description="Returns all transport network slices from the slice controller.")
+    @slice_ns.response(200, "Slices returned", slice_ddbb_model)
+    @slice_ns.response(404, "Transport network slices not found")
+    @slice_ns.response(500, "Internal server error")
+    def get(self):
+        """Retrieve all slices"""
+        controller = NSController()
+        return controller.get_flows()
+    
+    @slice_ns.doc(summary="Submit a transport network slice request", description="This endpoint allows clients to submit transport network slice requests using a JSON payload.")
+    @slice_ns.response(200, "Slice request successfully processed", slice_response_model)
+    @slice_ns.response(400, "Invalid request format")
+    @slice_ns.response(500, "Internal server error")
+    @slice_ns.expect(upload_parser)
+    def post(self):
+        """Submit a new slice request with a file"""
+
+        json_data = None
+
+        # Try to get the JSON data from the uploaded file
+        uploaded_file = request.files.get('file')
+        if uploaded_file:
+            if not uploaded_file.filename.endswith('.json'):
+                return {"error": "Only JSON files allowed"}, 400
+            
+            try:
+                json_data = json.load(uploaded_file)  # Convert file to JSON
+            except json.JSONDecodeError:
+                return {"error": "JSON file not valid"}, 400
+
+        # If no file was uploaded, try to get the JSON data from the form
+        if json_data is None:
+            raw_json = request.form.get('json_data')
+            if raw_json:
+                try:
+                    json_data = json.loads(raw_json)  # Convert string to JSON
+                except json.JSONDecodeError:
+                    return {"error": "JSON file not valid"}, 400
+        
+        # If no JSON data was found, return an error
+        if json_data is None:
+            return {"error": "No data sent"}, 400
+
+        # Process the JSON data with the NSController
+        controller = NSController()
+        return controller.add_flow(json_data)
+    
+    @slice_ns.doc(summary="Delete all transport network slices", description="Deletes all transport network slices from the slice controller.")
+    @slice_ns.response(200, "All transport network slices deleted successfully.")
+    @slice_ns.response(500, "Internal server error")
+    def delete(self):
+        """Delete all slices"""
+        controller = NSController()
+        return controller.delete_flows()
+
+
+@slice_ns.route("/<string:slice_id>")
+@slice_ns.doc(params={"slice_id": "The ID of the slice to retrieve or modify"})
+class Slice(Resource):
+    @slice_ns.doc(summary="Return a specific transport network slice", description="Returns specific information related to a slice by providing its id")
+    @slice_ns.response(200, "Slice returned", slice_ddbb_model)
+    @slice_ns.response(404, "Transport network slice not found.")
+    @slice_ns.response(500, "Internal server error")
+    def get(self, slice_id):
+        """Retrieve a specific slice"""
+        controller = NSController()
+        return controller.get_flows(slice_id)
+
+    @slice_ns.doc(summary="Delete a specific transport network slice", description="Deletes a specific transport network slice from the slice controller based on the provided `slice_id`.")
+    @slice_ns.response(200, "Transport network slice deleted successfully.")
+    @slice_ns.response(404, "Transport network slice not found.")
+    @slice_ns.response(500, "Internal server error")
+    def delete(self, slice_id):
+        """Delete a slice"""
+        controller = NSController()
+        return controller.delete_flows(slice_id)
+
+    @slice_ns.expect(slice_ddbb_model, validate=True)
+    @slice_ns.doc(summary="Modify a specific transport network slice", description="Returns a specific slice that has been modified")
+    @slice_ns.response(200, "Slice modified", slice_ddbb_model)
+    @slice_ns.response(404, "Transport network slice not found.")
+    @slice_ns.response(500, "Internal server error")
+    def put(self, slice_id):
+        """Modify a slice"""
+        json_data = request.get_json()
+        controller = NSController()
+        return controller.modify_flow(slice_id, json_data)