diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..73f69e0958611ac6e00bde95641f6699030ad235
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/deployment.xml b/.idea/deployment.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9e0c942a1170756bef834fd4ac6071f466d9ec56
--- /dev/null
+++ b/.idea/deployment.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="PublishConfigData" autoUpload="Always" serverName="root@146.124.106.179:22 password (4)" remoteFilesAllowedToDisappearOnAutoupload="false">
+    <serverData>
+      <paths name="root@146.124.106.179:22 password (4)">
+        <serverdata>
+          <mappings>
+            <mapping deploy="/root/NIKPSAROM_WORKDIR" local="$PROJECT_DIR$" />
+          </mappings>
+        </serverdata>
+      </paths>
+    </serverData>
+    <option name="myAutoUpload" value="ALWAYS" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/edge-implementation.iml b/.idea/edge-implementation.iml
new file mode 100644
index 0000000000000000000000000000000000000000..856ca00957e4e3dbeebad831a4c793348cb316e1
--- /dev/null
+++ b/.idea/edge-implementation.iml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="jdk" jdkName="Remote Python 3.5.2 (/usr/bin/python3.5) (2)" jdkType="Python SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..105ce2da2d6447d11dfe32bfb846c3d5b199fc99
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..512431b09ac7e71e08ced49dae931a2bfbe24677
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" project-jdk-name="Remote Python 3.5.2 (/usr/bin/python3.5) (2)" project-jdk-type="Python SDK" />
+</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000000000000000000000000000000000..26a7349d93ab97b9d21e1a71fe1c9a572ba78248
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/edge-implementation.iml" filepath="$PROJECT_DIR$/.idea/edge-implementation.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94a25f7f4cb416c083d265558da75d457237d671
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/ponse = piedge_encoder.deploy_service_function(body) b/ponse = piedge_encoder.deploy_service_function(body)
new file mode 100644
index 0000000000000000000000000000000000000000..4a1e28670fcd8cc1deb5047d3c18a89b1deebd46
--- /dev/null
+++ b/ponse = piedge_encoder.deploy_service_function(body)	
@@ -0,0 +1,7 @@
+* dev_new_version
+  main
+  remotes/origin/HEAD -> origin/main
+  remotes/origin/dev
+  remotes/origin/dev_new_version
+  remotes/origin/k8s-extension
+  remotes/origin/main
diff --git a/service-resource-manager-implementation/.dockerignore b/service-resource-manager-implementation/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..cdd823e64e7e91ae85da84f22410ecb7eb370ae2
--- /dev/null
+++ b/service-resource-manager-implementation/.dockerignore
@@ -0,0 +1,72 @@
+.travis.yaml
+.swagger-codegen-ignore
+README.md
+tox.ini
+git_push.sh
+test-requirements.txt
+setup.py
+
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+.hypothesis/
+venv/
+.python-version
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+#Ipython Notebook
+.ipynb_checkpoints
diff --git a/service-resource-manager-implementation/.gitignore b/service-resource-manager-implementation/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..a655050c2631466828b5b8bfc59ae27f9ac02dc5
--- /dev/null
+++ b/service-resource-manager-implementation/.gitignore
@@ -0,0 +1,64 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+.hypothesis/
+venv/
+.python-version
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+#Ipython Notebook
+.ipynb_checkpoints
diff --git a/service-resource-manager-implementation/.swagger-codegen-ignore b/service-resource-manager-implementation/.swagger-codegen-ignore
new file mode 100644
index 0000000000000000000000000000000000000000..c5fa491b4c557bf997d5dd21797de782545dc9e5
--- /dev/null
+++ b/service-resource-manager-implementation/.swagger-codegen-ignore
@@ -0,0 +1,23 @@
+# Swagger Codegen Ignore
+# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/service-resource-manager-implementation/.swagger-codegen/VERSION b/service-resource-manager-implementation/.swagger-codegen/VERSION
new file mode 100644
index 0000000000000000000000000000000000000000..10bbf276ee45aaec75c7b2ada3ff71d798f89fd9
--- /dev/null
+++ b/service-resource-manager-implementation/.swagger-codegen/VERSION
@@ -0,0 +1 @@
+3.0.34
\ No newline at end of file
diff --git a/service-resource-manager-implementation/.travis.yml b/service-resource-manager-implementation/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dd6c4450aa902ae68479c3d76d45145e18d6052e
--- /dev/null
+++ b/service-resource-manager-implementation/.travis.yml
@@ -0,0 +1,13 @@
+# ref: https://docs.travis-ci.com/user/languages/python
+language: python
+python:
+  - "3.2"
+  - "3.3"
+  - "3.4"
+  - "3.5"
+  #- "3.5-dev" # 3.5 development branch
+  #- "nightly" # points to the latest development branch e.g. 3.6-dev
+# command to install dependencies
+install: "pip install -r requirements.txt"
+# command to run tests
+script: nosetests
diff --git a/service-resource-manager-implementation/Dockerfile b/service-resource-manager-implementation/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..377711655adb7be4d82c46258d40e9ddf07bbe0f
--- /dev/null
+++ b/service-resource-manager-implementation/Dockerfile
@@ -0,0 +1,46 @@
+FROM python:3.9-alpine
+
+#RUN apk add git
+
+RUN mkdir -p /usr/src/app
+WORKDIR /usr/src/app
+
+#RUN apk add --no-cache --virtual .build-deps gcc musl-dev
+
+#RUN apk update && apk add python3-dev \
+#                        gcc \
+#                        libc-dev
+
+
+#THIS SOLVED THE ISSUE WITH CFFI: building wheel for cffi (setup.py) finished with status 'error'!
+RUN apk add --no-cache libffi-dev build-base
+#
+COPY requirements.txt /usr/src/app/
+#RUN pip3 install connexion
+
+#ENV EMP_STORAGE_DRIVER mongo
+#ENV EMP_STORAGE_URI mongodb://203.0.113.8:27017
+#
+#ENV PIP_ROOT_USER_ACTION=ignore
+#
+ENV PYTHONUNBUFFERED=1
+#RUN apk add --update --no-cache python3 && ln -sf python3 /usr/bin/python
+#RUN python3 -m ensurepip
+
+#RUN pip3 install --no-cache --upgrade pip setuptools
+
+RUN pip3 install --upgrade pip
+
+RUN pip3 install wheel
+
+#RUN pip3 install --no-cache --upgrade setuptools
+RUN pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org --no-cache-dir -r requirements.txt
+
+COPY . /usr/src/app
+
+EXPOSE 8080
+
+ENTRYPOINT ["python3"]
+
+CMD ["-m", "swagger_server"]
+
diff --git a/service-resource-manager-implementation/README.md b/service-resource-manager-implementation/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..c92482e9c0cf6603974ebafdea0f85f787637494
--- /dev/null
+++ b/service-resource-manager-implementation/README.md
@@ -0,0 +1,68 @@
+# Swagger generated server
+
+## Overview
+This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the
+[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub.  This
+is an example of building a swagger-enabled Flask server.
+
+This example uses the [Connexion](https://github.com/zalando/connexion) library on top of Flask.
+
+## Requirements
+Python 3.5.2+
+
+## Usage
+To run the server, please execute the following from the root directory:
+
+```
+pip3 install -r requirements.txt
+```
+then replace the values in export_env_par.txt (pi-edge requires mongodb and postgres instances)
+and execute:
+
+
+```
+source export_env_par.txt
+python3 -m swagger_server
+```
+
+and open your browser to here:
+
+```
+http://localhost:8080/piedge-connector/2.0.0
+```
+
+Your Swagger definition lives here:
+
+```
+http://localhost:8080/piedge-connector/2.0.0/swagger.json
+```
+
+To launch the integration tests, use tox:
+```
+sudo pip install tox
+tox
+```
+
+## Running with Docker
+
+To run the server on a Docker container, please execute the following from the root directory:
+
+```bash
+# building the image
+docker build -t swagger_server .
+
+# starting up a container
+docker run -p 8080:8080 swagger_server
+```
+
+
+## Running with K8S
+
+Go to deployment_files folder, replace ENV parameters in piedge_deploy_generic.yaml file and execute:
+```
+kubectl create namespace pi-edge-system
+kubectl apply -f piedge_deploy_tandem.yaml -n pi-edge-system
+```
+Note:
+Prometheus and Grafana should be available in monitoring namespace, if not please deploy them using the following url:
+https://devopscube.com/setup-prometheus-monitoring-on-kubernetes/
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/grafana-service.yaml b/service-resource-manager-implementation/deployment_files/grafana-service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..25056a713b4e6364e017cac10791f17a557611be
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/grafana-service.yaml
@@ -0,0 +1,76 @@
+apiVersion: v1
+kind: Service
+metadata:
+  creationTimestamp: "2022-10-14T09:17:41Z"
+  labels:
+    app.kubernetes.io/component: grafana
+    app.kubernetes.io/name: grafana
+    app.kubernetes.io/part-of: kube-prometheus
+    app.kubernetes.io/version: 8.1.3
+  managedFields:
+  - apiVersion: v1
+    fieldsType: FieldsV1
+    fieldsV1:
+      f:status:
+        f:loadBalancer:
+          f:ingress: {}
+    manager: controller
+    operation: Update
+    subresource: status
+    time: "2022-10-14T09:48:15Z"
+  - apiVersion: v1
+    fieldsType: FieldsV1
+    fieldsV1:
+      f:metadata:
+        f:labels:
+          .: {}
+          f:app.kubernetes.io/component: {}
+          f:app.kubernetes.io/name: {}
+          f:app.kubernetes.io/part-of: {}
+          f:app.kubernetes.io/version: {}
+      f:spec:
+        f:allocateLoadBalancerNodePorts: {}
+        f:externalTrafficPolicy: {}
+        f:internalTrafficPolicy: {}
+        f:ports:
+          .: {}
+          k:{"port":3000,"protocol":"TCP"}:
+            .: {}
+            f:name: {}
+            f:port: {}
+            f:protocol: {}
+            f:targetPort: {}
+        f:selector: {}
+        f:sessionAffinity: {}
+        f:type: {}
+    manager: kubectl
+    operation: Update
+    time: "2022-10-14T09:48:15Z"
+  name: grafana
+  namespace: monitoring
+  resourceVersion: "30269813"
+  selfLink: /api/v1/namespaces/monitoring/services/grafana
+  uid: 847f8077-58bb-45fa-8327-755fbf0a70c4
+spec:
+  allocateLoadBalancerNodePorts: true
+  externalTrafficPolicy: Cluster
+  internalTrafficPolicy: Cluster
+  ipFamilies:
+  - IPv4
+  ipFamilyPolicy: SingleStack
+  ports:
+  - name: http
+    nodePort: 30488
+    port: 3000
+    protocol: TCP
+    targetPort: http
+  selector:
+    app.kubernetes.io/component: grafana
+    app.kubernetes.io/name: grafana
+    app.kubernetes.io/part-of: kube-prometheus
+  sessionAffinity: None
+  type: LoadBalancer
+status:
+  loadBalancer:
+    ingress:
+    - ip: 203.0.113.172
diff --git a/service-resource-manager-implementation/deployment_files/piedge_deploy_generic.yaml b/service-resource-manager-implementation/deployment_files/piedge_deploy_generic.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e0f5ca67ba18de337322ca58421a2ff5f5ab3b8a
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/piedge_deploy_generic.yaml
@@ -0,0 +1,274 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: piedgecontroller
+  name: piedgecontroller
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: piedgecontroller
+  strategy: {}
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.0 (40646f47)
+      creationTimestamp: null
+      labels:
+        #io.kompose.network/netEMPkub: "true"
+        io.kompose.service: piedgecontroller
+    spec:
+      containers:
+        - env:
+            - name: KUBERNETES_MASTER_HOSTNAME
+              #example value
+              value: "tanmaster"
+            - name: KUBERNETES_MASTER_PASSWORD
+              #example value
+              value: "T@nd3m164"
+            - name: KUBERNETES_MASTER_IP
+              #example value
+              value: "146.124.106.209"
+            - name: KUBERNETES_MASTER_TOKEN
+               #example value
+              value: TVVGV1FJb3l0alNUOUdEeVRvbnZKdGhZS3FXUXg2aG5mMGVxekRqRnZhWT0K
+            - name: EMP_STORAGE_URI
+              value: mongodb://mongopiedge:27017
+              #value: mongodb://mongoemp:27017
+            - name: MONITORING_IP
+              value: "146.124.106.209"
+            - name: MONITORING_NODE_PORT
+              value: "443"
+            - name: SYSTEM_DATABASE_PASSWORD
+              value: "pslicom"
+            - name: SYSTEM_DATABASE_HOST
+              value: "postgres"
+            - name: MONITORING_SERVICE_PASSWORD
+              value: "tandem"
+            - name: MEC_PLATFORM_IP
+              value: "146.124.106.209"
+            - name: MEC_PLATFORM_PORT
+              value: "32500"
+            - name: MONITORING_IP_PROXY
+              value: "146.124.106.220"
+            - name: MONITORING_PORT_PROXY
+              value: "31000"
+
+          image: papadchar/pi_edge:3.1.20
+          name: piedgecontroller
+          ports:
+            - containerPort: 8080
+          resources: {}
+          imagePullPolicy: Always
+      restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: piedgecontroller
+  name: piedgecontroller
+spec:
+  type: NodePort
+  ports:
+    - name: "8080"
+      nodePort: 32415
+      port: 8080
+      targetPort: 8080
+  selector:
+    io.kompose.service: piedgecontroller
+status:
+  loadBalancer: {}
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  creationTimestamp: null
+  labels:
+    io.kompose.service: mongo-db
+  name: mongo-db
+spec:
+  accessModes:
+    - ReadWriteOnce
+  resources:
+    requests:
+      storage: 100Mi
+status: {}
+---
+
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: mongopiedge
+  name: mongopiedge
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: mongopiedge
+  strategy:
+    type: Recreate
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.0 (40646f47)
+      creationTimestamp: null
+      labels:
+        #io.kompose.network/netEMPkub: "true"
+        io.kompose.service: mongopiedge
+    spec:
+      containers:
+        - image: mongo
+          name: mongopiedge
+          ports:
+            - containerPort: 27017
+          resources: {}
+          volumeMounts:
+            - mountPath: /data/db
+              name: mongo-db
+      restartPolicy: Always
+      volumes:
+        - name: mongo-db
+          persistentVolumeClaim:
+            claimName: mongo-db
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: mongopiedge
+  name: mongopiedge
+spec:
+  type: NodePort
+  ports:
+    - name: "27017"
+      nodePort: 32411
+      port: 27017
+      targetPort: 27017
+  selector:
+    io.kompose.service: mongopiedge
+status:
+  loadBalancer: {}
+---
+# apiVersion: networking.k8s.io/v1
+# kind: NetworkPolicy
+# metadata:
+#   creationTimestamp: null
+#   name: netEMPkub
+# spec:
+#   ingress:
+#     - from:
+#         - podSelector:
+#             matchLabels:
+#               io.kompose.network/netEMPkub: "true"
+#   podSelector:
+#     matchLabels:
+#       io.kompose.network/netEMPkub: "true"
+#---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: postgres-config
+  labels:
+    app: postgres
+data:
+  POSTGRES_DB: postgresdb
+  POSTGRES_USER: admin
+  POSTGRES_PASSWORD: pslicom
+---
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+  name: postgres-pv-volume-pi-edge  # Sets PV's name
+  labels:
+    type: local  # Sets PV's type to local
+    app: postgres
+spec:
+  storageClassName: manual
+  capacity:
+    storage: 200Mi # Sets PV Volume
+  accessModes:
+    - ReadWriteMany
+  hostPath:
+    path: "/mnt/data/data"
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: postgres-pv-claim-pi-edge  # Sets name of PVC
+  labels:
+    app: postgres
+spec:
+  storageClassName: manual
+  accessModes:
+    - ReadWriteMany  # Sets read and write access
+  resources:
+    requests:
+      storage: 200Mi  # Sets volume size
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: postgres  # Sets Deployment name
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: postgres
+  template:
+    metadata:
+      labels:
+        app: postgres
+    spec:
+      containers:
+        - name: postgres
+          image: postgres:10.1 # Sets Image
+          imagePullPolicy: "IfNotPresent"
+          ports:
+            - containerPort: 5432  # Exposes container port
+          envFrom:
+            - configMapRef:
+                name: postgres-config
+          volumeMounts:
+            - mountPath: /var/lib/postgresql/data
+              name: postgredb
+      volumes:
+        - name: postgredb
+          persistentVolumeClaim:
+            claimName: postgres-pv-claim-pi-edge
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: postgres # Sets service name
+  labels:
+    app: postgres # Labels and Selectors
+spec:
+  type: NodePort # Sets service type
+  ports:
+    - port: 5432 # Sets port to run the postgres application
+  selector:
+    app: postgres
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/piedge_gui.yaml b/service-resource-manager-implementation/deployment_files/piedge_gui.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..826e2e4b3e34b019e22a6f87a5da428ca4c94a80
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/piedge_gui.yaml
@@ -0,0 +1,39 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: piedge-gui
+  namespace: pi-edge-system
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: piedge-gui
+  template:
+    metadata:
+      labels:
+        app: piedge-gui
+    spec:
+      containers:
+        - name: gui
+          image: piedge/gui:1.0.9
+          imagePullPolicy: Always
+          ports:
+            - containerPort: 5173
+      nodeSelector:
+        kubernetes.io/hostname: zorro-solutions
+
+---
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: gui-svc
+  namespace: pi-edge-system
+spec:
+  selector:
+    app: piedge-gui
+  ports:
+    - port: 80
+      protocol: TCP
+      targetPort: 5173
+  type: NodePort
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/piedge_simple_controller.yaml b/service-resource-manager-implementation/deployment_files/piedge_simple_controller.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c7d755c5c67786302cbcbf568ac539ce13efb968
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/piedge_simple_controller.yaml
@@ -0,0 +1,75 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: piedgecontroller
+  name: piedgecontroller
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: piedgecontroller
+  strategy: {}
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.0 (40646f47)
+      creationTimestamp: null
+      labels:
+        #io.kompose.network/netEMPkub: "true"
+        io.kompose.service: piedgecontroller
+    spec:
+      containers:
+        - env:
+            - name: KUBERNETES_MASTER_HOST
+              #example value
+              value: https://146.124.106.179:16443 
+            - name: KUBERNETES_MASTER_TOKEN
+               #example value
+              value: b3lIOWFQM3NUTWJpSUVBMDNGNmlmVG4wQkd5dXFmWTdFUlFWQVo3UnEycz0K 
+            - name: EMP_STORAGE_URI
+              #value: mongodb://mongopiedge:27017
+              value: mongodb://mongoemp:27017
+            - name: MONITORING_IP
+              value: "203.0.113.130"
+            - name: MONITORING_NODE_PORT
+              value: "3000"
+            - name: SYSTEM_DATABASE_PASSWORD
+              value: "pslicom"
+            - name: MONITORING_SERVICE_PASSWORD
+              value: "tandem"
+          image: nikospsar/pi_edge:3.0.2
+          name: piedgecontroller
+          ports:
+            - containerPort: 8080
+          resources: {}
+          imagePullPolicy: Always
+      restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: piedgecontroller
+  name: piedgecontroller
+spec:
+  type: NodePort
+  ports:
+    - name: "8080"
+      nodePort: 32415
+      port: 8080
+      targetPort: 8080
+  selector:
+    io.kompose.service: piedgecontroller
+status:
+  loadBalancer: {}
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/piedgek8s.yaml b/service-resource-manager-implementation/deployment_files/piedgek8s.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..14f21e89567f188558615267f89d2189b740a10f
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/piedgek8s.yaml
@@ -0,0 +1,253 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: piedgecontroller
+  name: piedgecontroller
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: piedgecontroller
+  strategy: {}
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.0 (40646f47)
+      creationTimestamp: null
+      labels:
+        #io.kompose.network/netEMPkub: "true"
+        io.kompose.service: piedgecontroller
+    spec:
+      containers:
+        - env:
+            - name: KUBERNETES_MASTER_HOST
+              #example value
+              value: https://146.124.106.179:16443
+            - name: KUBERNETES_MASTER_TOKEN
+               #example value
+              value: b3lIOWFQM3NUTWJpSUVBMDNGNmlmVG4wQkd5dXFmWTdFUlFWQVo3UnEycz0K
+            - name: EMP_STORAGE_URI
+              #value: mongodb://mongopiedge:27017
+              value: mongodb://mongoemp:27017
+            - name: MONITORING_IP
+              value: "203.0.113.130"
+            - name: MONITORING_NODE_PORT
+              value: "3000"
+            - name: SYSTEM_DATABASE_PASSWORD
+              value: "pslicom"
+          image: nikospsar/pi_edge:3.0.2
+          name: piedgecontroller
+          ports:
+            - containerPort: 8080
+          resources: {}
+          imagePullPolicy: Always
+      restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: piedgecontroller
+  name: piedgecontroller
+spec:
+  type: NodePort
+  ports:
+    - name: "8080"
+      nodePort: 32415
+      port: 8080
+      targetPort: 8080
+  selector:
+    io.kompose.service: piedgecontroller
+status:
+  loadBalancer: {}
+---
+#apiVersion: v1
+#kind: PersistentVolumeClaim
+#metadata:
+#  creationTimestamp: null
+#  labels:
+#    io.kompose.service: mongo-db
+#  name: mongo-db
+#spec:
+#  accessModes:
+#    - ReadWriteOnce
+#  resources:
+#    requests:
+#      storage: 100Mi
+#status: {}
+#---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: mongopiedge
+  name: mongopiedge
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: mongopiedge
+  strategy:
+    type: Recreate
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.0 (40646f47)
+      creationTimestamp: null
+      labels:
+        #io.kompose.network/netEMPkub: "true"
+        io.kompose.service: mongopiedge
+    spec:
+      containers:
+        - image: mongo
+          name: mongopiedge
+          ports:
+            - containerPort: 27017
+          resources: {}
+          volumeMounts:
+            - mountPath: /data/db
+              name: mongo-db
+      restartPolicy: Always
+      volumes:
+        - name: mongo-db
+          persistentVolumeClaim:
+            claimName: mongo-db
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: mongopiedge
+  name: mongopiedge
+spec:
+  type: NodePort
+  ports:
+    - name: "27017"
+      nodePort: 32411
+      port: 27017
+      targetPort: 27017
+  selector:
+    io.kompose.service: mongopiedge
+status:
+  loadBalancer: {}
+---
+ apiVersion: networking.k8s.io/v1
+ kind: NetworkPolicy
+ metadata:
+   creationTimestamp: null
+   name: netEMPkub
+ spec:
+   ingress:
+     - from:
+         - podSelector:
+             matchLabels:
+               io.kompose.network/netEMPkub: "true"
+   podSelector:
+     matchLabels:
+       io.kompose.network/netEMPkub: "true"
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: postgres-config
+  labels:
+    app: postgres
+data:
+  POSTGRES_DB: postgresdb
+  POSTGRES_USER: admin
+  POSTGRES_PASSWORD: pslicom
+---
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+  name: postgres-pv-volume-pi-edge  # Sets PV's name
+  labels:
+    type: local  # Sets PV's type to local
+    app: postgres
+spec:
+  storageClassName: manual
+  capacity:
+    storage: 200Mi # Sets PV Volume
+  accessModes:
+    - ReadWriteMany
+  hostPath:
+    path: "/mnt/data/data"
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: postgres-pv-claim-pi-edge  # Sets name of PVC
+  labels:
+    app: postgres
+spec:
+  storageClassName: manual
+  accessModes:
+    - ReadWriteMany  # Sets read and write access
+  resources:
+    requests:
+      storage: 200Mi  # Sets volume size
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: postgres  # Sets Deployment name
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: postgres
+  template:
+    metadata:
+      labels:
+        app: postgres
+    spec:
+      containers:
+        - name: postgres
+          image: postgres:10.1 # Sets Image
+          imagePullPolicy: "IfNotPresent"
+          ports:
+            - containerPort: 5432  # Exposes container port
+          envFrom:
+            - configMapRef:
+                name: postgres-config
+          volumeMounts:
+            - mountPath: /var/lib/postgresql/data
+              name: postgredb
+      volumes:
+        - name: postgredb
+          persistentVolumeClaim:
+            claimName: postgres-pv-claim-pi-edge
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: postgres # Sets service name
+  labels:
+    app: postgres # Labels and Selectors
+spec:
+  type: NodePort # Sets service type
+  ports:
+    - port: 5432 # Sets port to run the postgres application
+  selector:
+    app: postgres
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/piedgek8s_withoutmongo.yaml b/service-resource-manager-implementation/deployment_files/piedgek8s_withoutmongo.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..eca96f1f0024750916e8c8108c7b7dc45a6311f1
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/piedgek8s_withoutmongo.yaml
@@ -0,0 +1,159 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: piedgecontroller
+  name: piedgecontroller
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: piedgecontroller
+  strategy: {}
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.0 (40646f47)
+      creationTimestamp: null
+      labels:
+        #io.kompose.network/netEMPkub: "true"
+        io.kompose.service: piedgecontroller
+    spec:
+      containers:
+        - env:
+            - name: KUBERNETES_MASTER_HOST
+              value: https://146.124.106.179:16443
+            - name: KUBERNETES_MASTER_TOKEN
+              value: b3lIOWFQM3NUTWJpSUVBMDNGNmlmVG4wQkd5dXFmWTdFUlFWQVo3UnEycz0K
+            - name: EMP_STORAGE_URI
+              value: mongodb://146.124.106.179:32411
+          image: nikospsar/pi_edge_controller:1.1.0
+          name: piedgecontroller
+          ports:
+            - containerPort: 8082
+          resources: {}
+          imagePullPolicy: Always
+      restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: piedgecontroller
+  name: piedgecontroller
+spec:
+  type: NodePort
+  ports:
+    - name: "8080"
+      nodePort: 32415
+      port: 8080
+      targetPort: 8080
+  selector:
+    io.kompose.service: piedgecontroller
+status:
+  loadBalancer: {}
+---
+#apiVersion: v1
+#kind: PersistentVolumeClaim
+#metadata:
+#  creationTimestamp: null
+#  labels:
+#    io.kompose.service: mongo-db
+#  name: mongo-db
+#spec:
+#  accessModes:
+#    - ReadWriteOnce
+#  resources:
+#    requests:
+#      storage: 100Mi
+#status: {}
+#---
+#apiVersion: apps/v1
+#kind: Deployment
+#metadata:
+#  annotations:
+#    kompose.cmd: kompose convert
+#    kompose.version: 1.26.0 (40646f47)
+#  creationTimestamp: null
+#  labels:
+#    io.kompose.service: mongoemp
+#  name: mongoemp
+#spec:
+#  replicas: 1
+#  selector:
+#    matchLabels:
+#      io.kompose.service: mongoemp
+#  strategy:
+#    type: Recreate
+#  template:
+#    metadata:
+#      annotations:
+#        kompose.cmd: kompose convert
+#        kompose.version: 1.26.0 (40646f47)
+#      creationTimestamp: null
+#      labels:
+#        #io.kompose.network/netEMPkub: "true"
+#        io.kompose.service: mongoemp
+#    spec:
+#      containers:
+#        - image: mongo
+#          name: mongoemp
+#          ports:
+#            - containerPort: 27017
+#          resources: {}
+#          volumeMounts:
+#            - mountPath: /data/db
+#              name: mongo-db
+#      restartPolicy: Always
+#      volumes:
+#        - name: mongo-db
+#          persistentVolumeClaim:
+#            claimName: mongo-db
+#status: {}
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  annotations:
+#    kompose.cmd: kompose convert
+#    kompose.version: 1.26.0 (40646f47)
+#  creationTimestamp: null
+#  labels:
+#    io.kompose.service: mongoemp
+#  name: mongoemp
+#spec:
+#  type: NodePort
+#  ports:
+#    - name: "27017"
+#      nodePort: 32411
+#      port: 27017
+#      targetPort: 27017
+#  selector:
+#    io.kompose.service: mongoemp
+#status:
+#  loadBalancer: {}
+#---
+## apiVersion: networking.k8s.io/v1
+## kind: NetworkPolicy
+## metadata:
+##   creationTimestamp: null
+##   name: netEMPkub
+## spec:
+##   ingress:
+##     - from:
+##         - podSelector:
+##             matchLabels:
+##               io.kompose.network/netEMPkub: "true"
+##   podSelector:
+##     matchLabels:
+##       io.kompose.network/netEMPkub: "true"
diff --git a/service-resource-manager-implementation/deployment_files/policyk8s.yaml b/service-resource-manager-implementation/deployment_files/policyk8s.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ca86b81872231a4e07b5f6632865eedd74f4c99a
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/policyk8s.yaml
@@ -0,0 +1,73 @@
+#apiVersion: networking.k8s.io/v1
+#kind: NetworkPolicy
+#metadata:
+#  name: test-network-policy
+#  namespace: default
+#spec:
+#  podSelector:
+#    matchLabels:
+#      role: db
+#  policyTypes:
+#  - Ingress
+#  - Egress
+#  ingress:
+#  - from:
+#    - ipBlock:
+#        cidr: 172.17.0.0/16
+#        except:
+#        - 172.17.1.0/24
+#    - namespaceSelector:
+#        matchLabels:
+#          project: myproject
+#    - podSelector:
+#        matchLabels:
+#          role: frontend
+#    ports:
+#    - protocol: TCP
+#      port: 6379
+#  egress:
+#  - to:
+#    - ipBlock:
+#        cidr: 10.0.0.0/24
+#    ports:
+#    - protocol: TCP
+#      port: 5978
+
+#---
+#kind: NetworkPolicy
+#apiVersion: networking.k8s.io/v1
+#metadata:
+#  name: allow-same-namespace and localhost
+#  namespace: emp
+#spec:
+#  podSelector:
+#    matchLabels:
+#      emp: demoosmeco
+#  ingress:
+#  - from:
+#      - namespaceSelector:
+#         matchLabels:
+#           project: emp
+#      - podSelector:
+#         matchLabels:
+#           emp: demo
+#    ports:
+#      - port: 80
+---
+kind: NetworkPolicy
+apiVersion: networking.k8s.io/v1
+metadata:
+  name:  localhostandnamespace
+  namespace: piedge-system
+spec:
+  podSelector:
+    matchLabels:
+      io.kompose.service: kubempcontr
+  ingress:
+  - from:
+      - ipBlock: #windows_server
+          cidr: 203.0.113.90/24
+      - ipBlock: #localhost
+          cidr: 146.124.106.179/24
+
+
diff --git a/service-resource-manager-implementation/deployment_files/postgres_resources.yaml b/service-resource-manager-implementation/deployment_files/postgres_resources.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2812657ebfd7f511e9dff394fd1156454228c6b3
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/postgres_resources.yaml
@@ -0,0 +1,84 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: postgres-config
+  labels:
+    app: postgres
+data:
+  POSTGRES_DB: postgresdb
+  POSTGRES_USER: admin
+  POSTGRES_PASSWORD: pslicom
+---
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+  name: postgres-pv-volume-pi-edge  # Sets PV's name
+  labels:
+    type: local  # Sets PV's type to local
+    app: postgres
+spec:
+  storageClassName: manual
+  capacity:
+    storage: 200Mi # Sets PV Volume
+  accessModes:
+    - ReadWriteMany
+  hostPath:
+    path: "/mnt/data/data"
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: postgres-pv-claim-pi-edge  # Sets name of PVC
+  labels:
+    app: postgres
+spec:
+  storageClassName: manual
+  accessModes:
+    - ReadWriteMany  # Sets read and write access
+  resources:
+    requests:
+      storage: 200Mi  # Sets volume size
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: postgres  # Sets Deployment name
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: postgres
+  template:
+    metadata:
+      labels:
+        app: postgres
+    spec:
+      containers:
+        - name: postgres
+          image: postgres:10.1 # Sets Image
+          imagePullPolicy: "IfNotPresent"
+          ports:
+            - containerPort: 5432  # Exposes container port
+          envFrom:
+            - configMapRef:
+                name: postgres-config
+          volumeMounts:
+            - mountPath: /var/lib/postgresql/data
+              name: postgredb
+      volumes:
+        - name: postgredb
+          persistentVolumeClaim:
+            claimName: postgres-pv-claim-pi-edge
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: postgres # Sets service name
+  labels:
+    app: postgres # Labels and Selectors
+spec:
+  type: NodePort # Sets service type
+  ports:
+    - port: 5432 # Sets port to run the postgres application
+  selector:
+    app: postgres
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/prometheus-service.yaml b/service-resource-manager-implementation/deployment_files/prometheus-service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..03667f4c89da85c394f100433f7c60607c399cf5
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/prometheus-service.yaml
@@ -0,0 +1,102 @@
+apiVersion: v1
+kind: Service
+metadata:
+  creationTimestamp: "2022-10-14T09:17:57Z"
+  labels:
+    app.kubernetes.io/component: prometheus
+    app.kubernetes.io/name: prometheus
+    app.kubernetes.io/part-of: kube-prometheus
+    app.kubernetes.io/version: 2.30.0
+    prometheus: k8s
+  managedFields:
+  - apiVersion: v1
+    fieldsType: FieldsV1
+    fieldsV1:
+      f:status:
+        f:loadBalancer:
+          f:ingress: {}
+    manager: controller
+    operation: Update
+    subresource: status
+    time: "2022-10-14T09:48:08Z"
+  - apiVersion: v1
+    fieldsType: FieldsV1
+    fieldsV1:
+      f:metadata:
+        f:labels:
+          .: {}
+          f:app.kubernetes.io/component: {}
+          f:app.kubernetes.io/name: {}
+          f:app.kubernetes.io/part-of: {}
+          f:app.kubernetes.io/version: {}
+          f:prometheus: {}
+      f:spec:
+        f:allocateLoadBalancerNodePorts: {}
+        f:externalTrafficPolicy: {}
+        f:internalTrafficPolicy: {}
+        f:ports:
+          .: {}
+          k:{"port":8080,"protocol":"TCP"}:
+            .: {}
+            f:name: {}
+            f:port: {}
+            f:protocol: {}
+            f:targetPort: {}
+          k:{"port":9090,"protocol":"TCP"}:
+            .: {}
+            f:name: {}
+            f:port: {}
+            f:protocol: {}
+            f:targetPort: {}
+        f:selector: {}
+        f:sessionAffinity: {}
+        f:sessionAffinityConfig:
+          .: {}
+          f:clientIP:
+            .: {}
+            f:timeoutSeconds: {}
+        f:type: {}
+    manager: kubectl
+    operation: Update
+    time: "2022-10-14T09:48:08Z"
+  name: prometheus-k8s
+  namespace: monitoring
+  resourceVersion: "30269799"
+  selfLink: /api/v1/namespaces/monitoring/services/prometheus-k8s
+  uid: 1f3a5527-f254-4433-a3ee-6d9b4ee16329
+spec:
+  allocateLoadBalancerNodePorts: true
+  clusterIP: 10.152.183.155
+  clusterIPs:
+  - 10.152.183.155
+  externalTrafficPolicy: Cluster
+  internalTrafficPolicy: Cluster
+  ipFamilies:
+  - IPv4
+  ipFamilyPolicy: SingleStack
+  ports:
+  - name: web
+    nodePort: 31892
+    port: 9090
+    protocol: TCP
+    targetPort: web
+  - name: reloader-web
+    nodePort: 32281
+    port: 8080
+    protocol: TCP
+    targetPort: reloader-web
+  selector:
+    app: prometheus
+    app.kubernetes.io/component: prometheus
+    app.kubernetes.io/name: prometheus
+    app.kubernetes.io/part-of: kube-prometheus
+    prometheus: k8s
+  sessionAffinity: ClientIP
+  sessionAffinityConfig:
+    clientIP:
+      timeoutSeconds: 10800
+  type: LoadBalancer
+status:
+  loadBalancer:
+    ingress:
+    - ip: 203.0.113.171
diff --git a/service-resource-manager-implementation/export_env_par.txt b/service-resource-manager-implementation/export_env_par.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5ceecab43bc6ab3a6ccb7c7f3f6a6ab80d2d3997
--- /dev/null
+++ b/service-resource-manager-implementation/export_env_par.txt
@@ -0,0 +1,18 @@
+#Choose docker or k8s
+export DRIVER="kubernetes"
+
+#k8s
+export KUBERNETES_MASTER_HOSTNAME="gzorro"
+export KUBERNETES_MASTER_PASSWORD="5gz@rr0200"
+export KUBERNETES_MASTER_IP="146.124.106.200"
+export KUBERNETES_MASTER_TOKEN="T3FRNnNVK25FY3I5ZHlNYmxrSEFpd2VPcW5WTlliTnRVNVo3bitNY1B3az0K"
+
+export EMP_STORAGE_URI="mongodb://146.124.106.200:32411"
+export SYSTEM_DATABASE_PASSWORD="pslicom"
+export SYSTEM_DATABASE_HOST="10.152.183.200"
+
+#docker
+export DOCKER_HOST="146.124.106.177"
+export DOCKER_PORT="2377"
+export INTRA_NODE_PORT="2377"
+export DOCKER_MON_PORT="9323"
diff --git a/service-resource-manager-implementation/git_push.sh b/service-resource-manager-implementation/git_push.sh
new file mode 100644
index 0000000000000000000000000000000000000000..160f6f213999c7ae67839fbd6fc2ba0b72675832
--- /dev/null
+++ b/service-resource-manager-implementation/git_push.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+
+if [ "$git_user_id" = "" ]; then
+    git_user_id="GIT_USER_ID"
+    echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+    git_repo_id="GIT_REPO_ID"
+    echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+    release_note="Minor update"
+    echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository.
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=`git remote`
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+    if [ "$GIT_TOKEN" = "" ]; then
+        echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+        git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git
+    else
+        git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git
+    fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
+
diff --git a/service-resource-manager-implementation/postgres/postgres-config.yaml b/service-resource-manager-implementation/postgres/postgres-config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..562f326aff2ca85bef308cd3ae2e9ec7b6f1a289
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/postgres-config.yaml
@@ -0,0 +1,10 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: postgres-config
+  labels:
+    app: postgres
+data:
+  POSTGRES_DB: postgresdb
+  POSTGRES_USER: admin
+  POSTGRES_PASSWORD: pslicom
\ No newline at end of file
diff --git a/service-resource-manager-implementation/postgres/postgres-deployment.yaml b/service-resource-manager-implementation/postgres/postgres-deployment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3d3a13b0236c3a37d849aa3bcfe55797ecaf0365
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/postgres-deployment.yaml
@@ -0,0 +1,35 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: postgres  # Sets Deployment name
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: postgres
+  template:
+    metadata:
+      labels:
+        app: postgres
+    spec:
+      containers:
+        - name: postgres
+          image: postgres:10.1 # Sets Image
+          imagePullPolicy: "IfNotPresent"
+          lifecycle:
+            postStart:
+              exec:
+                command: [ "/bin/sh","-c","sleep 20 && PGPASSWORD=$POSTGRES_PASSWORD psql -w -d $POSTGRES_DB -U $POSTGRES_USER -c 'CREATE TABLE IF NOT EXISTS users( id SERIAL PRIMARY KEY, role TEXT NOT NULL, username TEXT NOT NULL UNIQUE, email TEXT UNIQUE, password TEXT NOT NULL, token TEXT, created_on TIMESTAMP);'" ]
+                #command: [ "/bin/sh","-c","sleep 20 && PGPASSWORD=$POSTGRES_PASSWORD psql -w -d $POSTGRES_DB -U $POSTGRES_USER -c 'CREATE TABLE IF NOT EXISTS users( id SERIAL PRIMARY KEY, role TEXT NOT NULL, username TEXT NOT NULL UNIQUE, email TEXT UNIQUE, password TEXT NOT NULL, created_on TIMESTAMP);'" ]
+          ports:
+            - containerPort: 5432  # Exposes container port
+          envFrom:
+            - configMapRef:
+                name: postgres-config
+          volumeMounts:
+            - mountPath: /var/lib/postgresql/data
+              name: postgredb
+      volumes:
+        - name: postgredb
+          persistentVolumeClaim:
+            claimName: postgres-pv-claim-pi-edge
\ No newline at end of file
diff --git a/service-resource-manager-implementation/postgres/postgres-pvc-pv.yaml b/service-resource-manager-implementation/postgres/postgres-pvc-pv.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d43a6a58c604a6f1fb24c245cb7d00d0933c24b2
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/postgres-pvc-pv.yaml
@@ -0,0 +1,29 @@
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+  name: postgres-pv-volume-pi-edge  # Sets PV's name
+  labels:
+    type: local  # Sets PV's type to local
+    app: postgres
+spec:
+  storageClassName: manual
+  capacity:
+    storage: 200Mi # Sets PV Volume
+  accessModes:
+    - ReadWriteMany
+  hostPath:
+    path: "/mnt/data/data"
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: postgres-pv-claim-pi-edge  # Sets name of PVC
+  labels:
+    app: postgres
+spec:
+  storageClassName: manual
+  accessModes:
+    - ReadWriteMany  # Sets read and write access
+  resources:
+    requests:
+      storage: 200Mi  # Sets volume size
\ No newline at end of file
diff --git a/service-resource-manager-implementation/postgres/postgres-service.yaml b/service-resource-manager-implementation/postgres/postgres-service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..edcca54d94b09c497af0267b982e14708719daa8
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/postgres-service.yaml
@@ -0,0 +1,12 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: postgres # Sets service name
+  labels:
+    app: postgres # Labels and Selectors
+spec:
+  type: NodePort # Sets service type
+  ports:
+    - port: 5432 # Sets port to run the postgres application
+  selector:
+    app: postgres
\ No newline at end of file
diff --git a/service-resource-manager-implementation/postgres/postgres_connector.py b/service-resource-manager-implementation/postgres/postgres_connector.py
new file mode 100644
index 0000000000000000000000000000000000000000..d342b9340718533376daf079341885265fb6ad7e
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/postgres_connector.py
@@ -0,0 +1,102 @@
+import psycopg2
+import bcrypt
+#!!!!!!!!!!!!!!!!!!!!
+#storage_url=environ.get("EMP_STORAGE_URI")
+
+def connect():
+    """ Connect to the PostgreSQL database server """
+    conn = None
+    try:
+        # read connection parameters
+       # params = config()
+
+        # connect to the PostgreSQL server
+        print('Connecting to the PostgreSQL database...')
+        conn = psycopg2.conn = psycopg2.connect(host="10.152.183.23",
+                                                database="postgresdb",
+                                                user="admin",
+                                                password="pslicom")
+
+        # create a cursor
+        cur = conn.cursor()
+
+        # execute a statement
+        #print('PostgreSQL database version:')
+
+        # sql = """INSERT INTO users (username, password, created_on )
+        #              VALUES(%s) RETURNING id;"""
+        # command= "INSERT INTO users (username, password, created_on ) VALUES ( 'icom_nikos2',  crypt('icom_nikos_!', gen_salt('bf')), current_timestamp);"
+        # cur.execute(command)
+        #
+        # id = cur.fetchone()[0]
+        # # commit the changes to the database
+        # conn.commit()
+        #
+
+
+        #query!!!
+        # postgreSQL_select_Query= "SELECT id FROM users  WHERE username = 'icom_nikos' AND password = crypt('icom_nikos_!', password);"
+        _username='###'
+        _password='####!'
+        postgreSQL_select_Query= "SELECT id FROM users  WHERE username = '" +_username + "' AND password = crypt('"+_password+"', password);"
+        cur.execute(postgreSQL_select_Query)
+        print("CHECK IF USER EXISTS")
+        users = cur.fetchall()
+        if not users:
+            print("User not authorized")
+        else:
+            print("User authorized")
+
+        # display the PostgreSQL database server version
+        # db_version = cur.fetchone()
+        # print(db_version)
+
+        # insert user
+        cur.execute('SELECT version()')
+        # close the communication with the PostgreSQL
+        cur.close()
+    except (Exception, psycopg2.DatabaseError) as error:
+        print(error)
+    finally:
+        if conn is not None:
+            conn.close()
+            print('Database connection closed.')
+
+
+# def insert_users(username, passowrd):
+#     try:
+#         print(a)
+#     except Exception as ce_:
+#         raise Exception("An exception occurred :", ce_)
+#
+
+
+if __name__ == '__main__':
+    connect()
+
+
+
+#how to create table
+#CREATE TABLE users( id SERIAL PRIMARY KEY, role TEXT NOT NULL, username TEXT NOT NULL UNIQUE, email TEXT UNIQUE, password TEXT NOT NULL, token TEXT, created_on TIMESTAMP);
+
+
+#how to insert user:
+# INSERT INTO users (username, password, created_on ) VALUES (
+#   'icom_nikos',
+#   crypt('testp@assword', gen_salt('bf'), current_timestamp)
+# );
+
+
+# INSERT INTO users (role, username, password, created_on ) VALUES ( 'user', 'icom_user', crypt('icom_user_!@', gen_salt('bf')), current_timestamp);
+
+
+#UPDATE
+
+#sql_update_query = """Update mobile set price = %s where id = %s"""
+#cursor.execute(sql_update_query, (price, mobileId))
+#how to check validate user
+# SELECT id FROM users  WHERE username = 'icom_nikos' AND password = crypt('icom_nikos_1', password);
+
+
+#how to connect (deployed using k8s)
+#kubectl exec -it postgres-7dd79fb55c-rkpd7 -n piedge-system --  psql -h localhost -U admin --password -p 5432 postgresdb
\ No newline at end of file
diff --git a/service-resource-manager-implementation/postgres/text b/service-resource-manager-implementation/postgres/text
new file mode 100644
index 0000000000000000000000000000000000000000..8c99b9000e896c108b4bda4ed7cbd84144011ada
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/text
@@ -0,0 +1,496 @@
+{'api_version': 'apps/v1',
+ 'items': [{'api_version': None,
+            'kind': None,
+            'metadata': {'annotations': {'deployment.kubernetes.io/revision': '1'},
+                         'cluster_name': None,
+                         'creation_timestamp': datetime.datetime(2022, 11, 16, 11, 6, 16, tzinfo=tzutc()),
+                         'deletion_grace_period_seconds': None,
+                         'deletion_timestamp': None,
+                         'finalizers': None,
+                         'generate_name': None,
+                         'generation': 1,
+                         'labels': None,
+                         'managed_fields': [{'api_version': 'apps/v1',
+                                             'fields_type': 'FieldsV1',
+                                             'fields_v1': {'f:spec': {'f:progressDeadlineSeconds': {},
+                                                                      'f:replicas': {},
+                                                                      'f:revisionHistoryLimit': {},
+                                                                      'f:selector': {},
+                                                                      'f:strategy': {'f:rollingUpdate': {'.': {},
+                                                                                                         'f:maxSurge': {},
+                                                                                                         'f:maxUnavailable': {}},
+                                                                                     'f:type': {}},
+                                                                      'f:template': {'f:metadata': {'f:labels': {'.': {},
+                                                                                                                 'f:pi-edge': {}}},
+                                                                                     'f:spec': {'f:containers': {'k:{"name":"newtest-demopaastwoportsthreeenv"}': {'.': {},
+                                                                                                                                                                   'f:env': {'.': {},
+                                                                                                                                                                             'k:{"name":"FIRST_ENV"}': {'.': {},
+                                                                                                                                                                                                        'f:name': {},
+                                                                                                                                                                                                        'f:value': {}},
+                                                                                                                                                                             'k:{"name":"SECOND_ENV"}': {'.': {},
+                                                                                                                                                                                                         'f:name': {},
+                                                                                                                                                                                                         'f:value': {}},
+                                                                                                                                                                             'k:{"name":"THIRD_ENV"}': {'.': {},
+                                                                                                                                                                                                        'f:name': {},
+                                                                                                                                                                                                        'f:value': {}}},
+                                                                                                                                                                   'f:image': {},
+                                                                                                                                                                   'f:imagePullPolicy': {},
+                                                                                                                                                                   'f:name': {},
+                                                                                                                                                                   'f:ports': {'.': {},
+                                                                                                                                                                               'k:{"containerPort":80,"protocol":"TCP"}': {'.': {},
+                                                                                                                                                                                                                           'f:containerPort': {},
+                                                                                                                                                                                                                           'f:protocol': {}},
+                                                                                                                                                                               'k:{"containerPort":81,"protocol":"TCP"}': {'.': {},
+                                                                                                                                                                                                                           'f:containerPort': {},
+                                                                                                                                                                                                                           'f:protocol': {}}},
+                                                                                                                                                                   'f:resources': {'.': {},
+                                                                                                                                                                                   'f:limits': {'.': {},
+                                                                                                                                                                                                'f:cpu': {}},
+                                                                                                                                                                                   'f:requests': {'.': {},
+                                                                                                                                                                                                  'f:cpu': {}}},
+                                                                                                                                                                   'f:terminationMessagePath': {},
+                                                                                                                                                                   'f:terminationMessagePolicy': {}}},
+                                                                                                'f:dnsPolicy': {},
+                                                                                                'f:hostname': {},
+                                                                                                'f:nodeSelector': {},
+                                                                                                'f:restartPolicy': {},
+                                                                                                'f:schedulerName': {},
+                                                                                                'f:securityContext': {},
+                                                                                                'f:terminationGracePeriodSeconds': {}}}}},
+                                             'manager': 'OpenAPI-Generator',
+                                             'operation': 'Update',
+                                             'time': datetime.datetime(2022, 11, 16, 11, 6, 16, tzinfo=tzutc())},
+                                            {'api_version': 'apps/v1',
+                                             'fields_type': 'FieldsV1',
+                                             'fields_v1': {'f:metadata': {'f:annotations': {'.': {},
+                                                                                            'f:deployment.kubernetes.io/revision': {}}},
+                                                           'f:status': {'f:availableReplicas': {},
+                                                                        'f:conditions': {'.': {},
+                                                                                         'k:{"type":"Available"}': {'.': {},
+                                                                                                                    'f:lastTransitionTime': {},
+                                                                                                                    'f:lastUpdateTime': {},
+                                                                                                                    'f:message': {},
+                                                                                                                    'f:reason': {},
+                                                                                                                    'f:status': {},
+                                                                                                                    'f:type': {}},
+                                                                                         'k:{"type":"Progressing"}': {'.': {},
+                                                                                                                      'f:lastTransitionTime': {},
+                                                                                                                      'f:lastUpdateTime': {},
+                                                                                                                      'f:message': {},
+                                                                                                                      'f:reason': {},
+                                                                                                                      'f:status': {},
+                                                                                                                      'f:type': {}}},
+                                                                        'f:observedGeneration': {},
+                                                                        'f:readyReplicas': {},
+                                                                        'f:replicas': {},
+                                                                        'f:updatedReplicas': {}}},
+                                             'manager': 'kubelite',
+                                             'operation': 'Update',
+                                             'time': datetime.datetime(2022, 11, 16, 11, 6, 21, tzinfo=tzutc())}],
+                         'name': 'newtest-demopaastwoportsthreeenv',
+                         'namespace': 'pi-edge',
+                         'owner_references': None,
+                         'resource_version': '33621659',
+                         'self_link': '/apis/apps/v1/namespaces/pi-edge/deployments/newtest-demopaastwoportsthreeenv',
+                         'uid': '31734ba0-05cf-4ed6-95a3-489ef6635879'},
+            'spec': {'min_ready_seconds': None,
+                     'paused': None,
+                     'progress_deadline_seconds': 600,
+                     'replicas': 1,
+                     'revision_history_limit': 10,
+                     'selector': {'match_expressions': None,
+                                  'match_labels': {'pi-edge': 'newtest-demopaastwoportsthreeenv'}},
+                     'strategy': {'rolling_update': {'max_surge': '25%',
+                                                     'max_unavailable': '25%'},
+                                  'type': 'RollingUpdate'},
+                     'template': {'metadata': {'annotations': None,
+                                               'cluster_name': None,
+                                               'creation_timestamp': None,
+                                               'deletion_grace_period_seconds': None,
+                                               'deletion_timestamp': None,
+                                               'finalizers': None,
+                                               'generate_name': None,
+                                               'generation': None,
+                                               'labels': {'pi-edge': 'newtest-demopaastwoportsthreeenv'},
+                                               'managed_fields': None,
+                                               'name': None,
+                                               'namespace': None,
+                                               'owner_references': None,
+                                               'resource_version': None,
+                                               'self_link': None,
+                                               'uid': None},
+                                  'spec': {'active_deadline_seconds': None,
+                                           'affinity': None,
+                                           'automount_service_account_token': None,
+                                           'containers': [{'args': None,
+                                                           'command': None,
+                                                           'env': [{'name': 'FIRST_ENV',
+                                                                    'value': 'newtest-demo-paastwovolumes',
+                                                                    'value_from': None},
+                                                                   {'name': 'SECOND_ENV',
+                                                                    'value': 'edgextest2',
+                                                                    'value_from': None},
+                                                                   {'name': 'THIRD_ENV',
+                                                                    'value': 'test3',
+                                                                    'value_from': None}],
+                                                           'env_from': None,
+                                                           'image': 'k8s.gcr.io/hpa-example',
+                                                           'image_pull_policy': 'Always',
+                                                           'lifecycle': None,
+                                                           'liveness_probe': None,
+                                                           'name': 'newtest-demopaastwoportsthreeenv',
+                                                           'ports': [{'container_port': 80,
+                                                                      'host_ip': None,
+                                                                      'host_port': None,
+                                                                      'name': None,
+                                                                      'protocol': 'TCP'},
+                                                                     {'container_port': 81,
+                                                                      'host_ip': None,
+                                                                      'host_port': None,
+                                                                      'name': None,
+                                                                      'protocol': 'TCP'}],
+                                                           'readiness_probe': None,
+                                                           'resources': {'limits': {'cpu': '500m'},
+                                                                         'requests': {'cpu': '150m'}},
+                                                           'security_context': None,
+                                                           'startup_probe': None,
+                                                           'stdin': None,
+                                                           'stdin_once': None,
+                                                           'termination_message_path': '/dev/termination-log',
+                                                           'termination_message_policy': 'File',
+                                                           'tty': None,
+                                                           'volume_devices': None,
+                                                           'volume_mounts': None,
+                                                           'working_dir': None}],
+                                           'dns_config': None,
+                                           'dns_policy': 'ClusterFirst',
+                                           'enable_service_links': None,
+                                           'ephemeral_containers': None,
+                                           'host_aliases': None,
+                                           'host_ipc': None,
+                                           'host_network': None,
+                                           'host_pid': None,
+                                           'hostname': 'newtest-demopaastwoportsthreeenv',
+                                           'image_pull_secrets': None,
+                                           'init_containers': None,
+                                           'node_name': None,
+                                           'node_selector': {'location': 'Peania_19002_Athens'},
+                                           'overhead': None,
+                                           'preemption_policy': None,
+                                           'priority': None,
+                                           'priority_class_name': None,
+                                           'readiness_gates': None,
+                                           'restart_policy': 'Always',
+                                           'runtime_class_name': None,
+                                           'scheduler_name': 'default-scheduler',
+                                           'security_context': {'fs_group': None,
+                                                                'run_as_group': None,
+                                                                'run_as_non_root': None,
+                                                                'run_as_user': None,
+                                                                'se_linux_options': None,
+                                                                'supplemental_groups': None,
+                                                                'sysctls': None,
+                                                                'windows_options': None},
+                                           'service_account': None,
+                                           'service_account_name': None,
+                                           'share_process_namespace': None,
+                                           'subdomain': None,
+                                           'termination_grace_period_seconds': 30,
+                                           'tolerations': None,
+                                           'topology_spread_constraints': None,
+                                           'volumes': None}}},
+            'status': {'available_replicas': 1,
+                       'collision_count': None,
+                       'conditions': [{'last_transition_time': datetime.datetime(2022, 11, 16, 11, 6, 21, tzinfo=tzutc()),
+                                       'last_update_time': datetime.datetime(2022, 11, 16, 11, 6, 21, tzinfo=tzutc()),
+                                       'message': 'Deployment has minimum '
+                                                  'availability.',
+                                       'reason': 'MinimumReplicasAvailable',
+                                       'status': 'True',
+                                       'type': 'Available'},
+                                      {'last_transition_time': datetime.datetime(2022, 11, 16, 11, 6, 16, tzinfo=tzutc()),
+                                       'last_update_time': datetime.datetime(2022, 11, 16, 11, 6, 21, tzinfo=tzutc()),
+                                       'message': 'ReplicaSet '
+                                                  '"newtest-demopaastwoportsthreeenv-5cdbfcfd86" '
+                                                  'has successfully '
+                                                  'progressed.',
+                                       'reason': 'NewReplicaSetAvailable',
+                                       'status': 'True',
+                                       'type': 'Progressing'}],
+                       'observed_generation': 1,
+                       'ready_replicas': 1,
+                       'replicas': 1,
+                       'unavailable_replicas': None,
+                       'updated_replicas': 1}},
+           {'api_version': None,
+            'kind': None,
+            'metadata': {'annotations': {'deployment.kubernetes.io/revision': '1'},
+                         'cluster_name': None,
+                         'creation_timestamp': datetime.datetime(2022, 11, 16, 11, 6, 17, tzinfo=tzutc()),
+                         'deletion_grace_period_seconds': None,
+                         'deletion_timestamp': None,
+                         'finalizers': None,
+                         'generate_name': None,
+                         'generation': 1,
+                         'labels': None,
+                         'managed_fields': [{'api_version': 'apps/v1',
+                                             'fields_type': 'FieldsV1',
+                                             'fields_v1': {'f:spec': {'f:progressDeadlineSeconds': {},
+                                                                      'f:replicas': {},
+                                                                      'f:revisionHistoryLimit': {},
+                                                                      'f:selector': {},
+                                                                      'f:strategy': {'f:rollingUpdate': {'.': {},
+                                                                                                         'f:maxSurge': {},
+                                                                                                         'f:maxUnavailable': {}},
+                                                                                     'f:type': {}},
+                                                                      'f:template': {'f:metadata': {'f:labels': {'.': {},
+                                                                                                                 'f:pi-edge': {}}},
+                                                                                     'f:spec': {'f:containers': {'k:{"name":"newtest-demo-paastwovolumes"}': {'.': {},
+                                                                                                                                                              'f:env': {'.': {},
+                                                                                                                                                                        'k:{"name":"MONDOD"}': {'.': {},
+                                                                                                                                                                                                'f:name': {},
+                                                                                                                                                                                                'f:value': {}},
+                                                                                                                                                                        'k:{"name":"TEST2"}': {'.': {},
+                                                                                                                                                                                               'f:name': {},
+                                                                                                                                                                                               'f:value': {}}},
+                                                                                                                                                              'f:image': {},
+                                                                                                                                                              'f:imagePullPolicy': {},
+                                                                                                                                                              'f:name': {},
+                                                                                                                                                              'f:ports': {'.': {},
+                                                                                                                                                                          'k:{"containerPort":80,"protocol":"TCP"}': {'.': {},
+                                                                                                                                                                                                                      'f:containerPort': {},
+                                                                                                                                                                                                                      'f:protocol': {}}},
+                                                                                                                                                              'f:resources': {'.': {},
+                                                                                                                                                                              'f:limits': {'.': {},
+                                                                                                                                                                                           'f:cpu': {}},
+                                                                                                                                                                              'f:requests': {'.': {},
+                                                                                                                                                                                             'f:cpu': {}}},
+                                                                                                                                                              'f:terminationMessagePath': {},
+                                                                                                                                                              'f:terminationMessagePolicy': {},
+                                                                                                                                                              'f:volumeMounts': {'.': {},
+                                                                                                                                                                                 'k:{"mountPath":"/opt/config"}': {'.': {},
+                                                                                                                                                                                                                   'f:mountPath': {},
+                                                                                                                                                                                                                   'f:name': {}},
+                                                                                                                                                                                 'k:{"mountPath":"/opt/data"}': {'.': {},
+                                                                                                                                                                                                                 'f:mountPath': {},
+                                                                                                                                                                                                                 'f:name': {}}}}},
+                                                                                                'f:dnsPolicy': {},
+                                                                                                'f:hostname': {},
+                                                                                                'f:nodeSelector': {},
+                                                                                                'f:restartPolicy': {},
+                                                                                                'f:schedulerName': {},
+                                                                                                'f:securityContext': {},
+                                                                                                'f:terminationGracePeriodSeconds': {},
+                                                                                                'f:volumes': {'.': {},
+                                                                                                              'k:{"name":"newtest-demo-paastwovolumes-volume1"}': {'.': {},
+                                                                                                                                                                   'f:name': {},
+                                                                                                                                                                   'f:persistentVolumeClaim': {'.': {},
+                                                                                                                                                                                               'f:claimName': {}}},
+                                                                                                              'k:{"name":"newtest-demo-paastwovolumes-volume2"}': {'.': {},
+                                                                                                                                                                   'f:name': {},
+                                                                                                                                                                   'f:persistentVolumeClaim': {'.': {},
+                                                                                                                                                                                               'f:claimName': {}}}}}}}},
+                                             'manager': 'OpenAPI-Generator',
+                                             'operation': 'Update',
+                                             'time': datetime.datetime(2022, 11, 16, 11, 6, 17, tzinfo=tzutc())},
+                                            {'api_version': 'apps/v1',
+                                             'fields_type': 'FieldsV1',
+                                             'fields_v1': {'f:metadata': {'f:annotations': {'.': {},
+                                                                                            'f:deployment.kubernetes.io/revision': {}}},
+                                                           'f:status': {'f:availableReplicas': {},
+                                                                        'f:conditions': {'.': {},
+                                                                                         'k:{"type":"Available"}': {'.': {},
+                                                                                                                    'f:lastTransitionTime': {},
+                                                                                                                    'f:lastUpdateTime': {},
+                                                                                                                    'f:message': {},
+                                                                                                                    'f:reason': {},
+                                                                                                                    'f:status': {},
+                                                                                                                    'f:type': {}},
+                                                                                         'k:{"type":"Progressing"}': {'.': {},
+                                                                                                                      'f:lastTransitionTime': {},
+                                                                                                                      'f:lastUpdateTime': {},
+                                                                                                                      'f:message': {},
+                                                                                                                      'f:reason': {},
+                                                                                                                      'f:status': {},
+                                                                                                                      'f:type': {}}},
+                                                                        'f:observedGeneration': {},
+                                                                        'f:readyReplicas': {},
+                                                                        'f:replicas': {},
+                                                                        'f:updatedReplicas': {}}},
+                                             'manager': 'kubelite',
+                                             'operation': 'Update',
+                                             'time': datetime.datetime(2022, 11, 16, 11, 6, 25, tzinfo=tzutc())}],
+                         'name': 'newtest-demo-paastwovolumes',
+                         'namespace': 'pi-edge',
+                         'owner_references': None,
+                         'resource_version': '33621686',
+                         'self_link': '/apis/apps/v1/namespaces/pi-edge/deployments/newtest-demo-paastwovolumes',
+                         'uid': '9eea69dc-d8da-405e-9fc6-72a16290c717'},
+            'spec': {'min_ready_seconds': None,
+                     'paused': None,
+                     'progress_deadline_seconds': 600,
+                     'replicas': 1,
+                     'revision_history_limit': 10,
+                     'selector': {'match_expressions': None,
+                                  'match_labels': {'pi-edge': 'newtest-demo-paastwovolumes'}},
+                     'strategy': {'rolling_update': {'max_surge': '25%',
+                                                     'max_unavailable': '25%'},
+                                  'type': 'RollingUpdate'},
+                     'template': {'metadata': {'annotations': None,
+                                               'cluster_name': None,
+                                               'creation_timestamp': None,
+                                               'deletion_grace_period_seconds': None,
+                                               'deletion_timestamp': None,
+                                               'finalizers': None,
+                                               'generate_name': None,
+                                               'generation': None,
+                                               'labels': {'pi-edge': 'newtest-demo-paastwovolumes'},
+                                               'managed_fields': None,
+                                               'name': None,
+                                               'namespace': None,
+                                               'owner_references': None,
+                                               'resource_version': None,
+                                               'self_link': None,
+                                               'uid': None},
+                                  'spec': {'active_deadline_seconds': None,
+                                           'affinity': None,
+                                           'automount_service_account_token': None,
+                                           'containers': [{'args': None,
+                                                           'command': None,
+                                                           'env': [{'name': 'MONDOD',
+                                                                    'value': '192.159.32.12:9019',
+                                                                    'value_from': None},
+                                                                   {'name': 'TEST2',
+                                                                    'value': 'test2',
+                                                                    'value_from': None}],
+                                                           'env_from': None,
+                                                           'image': 'k8s.gcr.io/hpa-example',
+                                                           'image_pull_policy': 'Always',
+                                                           'lifecycle': None,
+                                                           'liveness_probe': None,
+                                                           'name': 'newtest-demo-paastwovolumes',
+                                                           'ports': [{'container_port': 80,
+                                                                      'host_ip': None,
+                                                                      'host_port': None,
+                                                                      'name': None,
+                                                                      'protocol': 'TCP'}],
+                                                           'readiness_probe': None,
+                                                           'resources': {'limits': {'cpu': '500m'},
+                                                                         'requests': {'cpu': '150m'}},
+                                                           'security_context': None,
+                                                           'startup_probe': None,
+                                                           'stdin': None,
+                                                           'stdin_once': None,
+                                                           'termination_message_path': '/dev/termination-log',
+                                                           'termination_message_policy': 'File',
+                                                           'tty': None,
+                                                           'volume_devices': None,
+                                                           'volume_mounts': [{'mount_path': '/opt/data',
+                                                                              'mount_propagation': None,
+                                                                              'name': 'newtest-demo-paastwovolumes-volume1',
+                                                                              'read_only': None,
+                                                                              'sub_path': None,
+                                                                              'sub_path_expr': None},
+                                                                             {'mount_path': '/opt/config',
+                                                                              'mount_propagation': None,
+                                                                              'name': 'newtest-demo-paastwovolumes-volume2',
+                                                                              'read_only': None,
+                                                                              'sub_path': None,
+                                                                              'sub_path_expr': None}],
+                                                           'working_dir': None}],
+                                           'dns_config': None,
+                                           'dns_policy': 'ClusterFirst',
+                                           'enable_service_links': None,
+                                           'ephemeral_containers': None,
+                                           'host_aliases': None,
+                                           'host_ipc': None,
+                                           'host_network': None,
+                                           'host_pid': None,
+                                           'hostname': 'newtest-demo-paastwovolumes',
+                                           'image_pull_secrets': None,
+                                           'init_containers': None,
+                                           'node_name': None,
+                                           'node_selector': {'location': 'Peania_19002_Athens'},
+                                           'overhead': None,
+                                           'preemption_policy': None,
+                                           'priority': None,
+                                           'priority_class_name': None,
+                                           'readiness_gates': None,
+                                           'restart_policy': 'Always',
+                                           'runtime_class_name': None,
+                                           'scheduler_name': 'default-scheduler',
+                                           'security_context': {'fs_group': None,
+                                                                'run_as_group': None,
+                                                                'run_as_non_root': None,
+                                                                'run_as_user': None,
+                                                                'se_linux_options': None,
+                                                                'supplemental_groups': None,
+                                                                'sysctls': None,
+                                                                'windows_options': None},
+                                           'service_account': None,
+                                           'service_account_name': None,
+                                           'share_process_namespace': None,
+                                           'subdomain': None,
+                                           'termination_grace_period_seconds': 30,
+                                           'tolerations': None,
+                                           'topology_spread_constraints': None,
+                                           'volumes': [{'aws_elastic_block_store': None,
+                                                        'azure_disk': None,
+                                                        'azure_file': None,
+                                                        'cephfs': None,
+                                                        'cinder': None,
+                                                        'config_map': None,
+                                                        'csi': None,
+                                                        'downward_api': None,
+                                                        'empty_dir': None,
+                                                        'fc': None,
+                                                        'flex_volume': None,
+                                                        'flocker': None,
+                                                        'gce_persistent_disk': None,
+                                                        'git_repo': None,
+                                                        'glusterfs': None,
+                                                        'host_path': None,
+                                                        'iscsi': None,
+                                                        'name': 'newtest-demo-paastwovolumes-volume1',
+                                                        'nfs': None,
+                                                        'persistent_volume_claim': {'claim_name': 'newtest-demo-paastwovolumes-volume1',
+                                                                                    'read_only': None},
+                                                        'photon_persistent_disk': None,
+                                                        'portworx_volume': None,
+                                                        'projected': None,
+                                                        'quobyte': None,
+                                                        'rbd': None,
+                                                        'scale_io': None,
+                                                        'secret': None,
+                                                        'storageos': None,
+                                                        'vsphere_volume': None},
+                                                       {'aws_elastic_block_store': None,
+                                                        'azure_disk': None,
+                                                        'azure_file': None,
+                                                        'cephfs': None,
+                                                        'cinder': None,
+                                                        'config_map': None,
+                                                        'csi': None,
+                                                        'downward_api': None,
+                                                        'empty_dir': None,
+                                                        'fc': None,
+                                                        'flex_volume': None,
+                                                        'flocker': None,
+                                                        'gce_persistent_disk': None,
+                                                        'git_repo': None,
+                                                        'glusterfs': None,
+                                                        'host_path': None,
+                                                        'iscsi': None,
+                                                        'name': 'newtest-demo-paastwovolumes-volume2',
+                                                        'nfs': None,
+                                                        'persistent_volume_claim': {'claim_name': 'newtest-demo-paastwovolumes-volume2',
+                                                                                    'read_only': None},
+                                                        'photon_persistent_disk': None,
+                                                        'portworx_volume': None,
+                                                        'projected': None,
+                                                        'quobyte': None,
+                                                        'rbd': None,
+                                                        'scale_io': None,
+                                                        'secret': None,
+                                                        'storageos': None,
+                                                        'vsphere_volume': None}]}}},
diff --git a/service-resource-manager-implementation/requirements.txt b/service-resource-manager-implementation/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ea1354c7a31498a9f300b916e4e8310cee12b9c1
--- /dev/null
+++ b/service-resource-manager-implementation/requirements.txt
@@ -0,0 +1,13 @@
+#connexion >= 2.6.0
+connexion[swagger-ui]
+python_dateutil == 2.6.0
+setuptools >= 21.0.0
+swagger-ui-bundle >= 0.0.2
+python-dotenv == 1.0.1
+pymongo==3.12.0
+#git+https://github.com/kubernetes-client/python.git
+requests==2.25.1
+
+psycopg2-binary
+
+urllib3
diff --git a/service-resource-manager-implementation/setup.py b/service-resource-manager-implementation/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..93bcc073f5e15bded0f8b031d44d3d72d7472cec
--- /dev/null
+++ b/service-resource-manager-implementation/setup.py
@@ -0,0 +1,37 @@
+# coding: utf-8
+
+import sys
+from setuptools import setup, find_packages
+
+NAME = "swagger_server"
+VERSION = "1.0.0"
+# To install the library, run the following
+#
+# python setup.py install
+#
+# prerequisite: setuptools
+# http://pypi.python.org/pypi/setuptools
+
+REQUIRES = [
+    "connexion"
+    # "swagger-ui-bundle>=0.0.2",
+    # "requests"
+]
+
+setup(
+    name=NAME,
+    version=VERSION,
+    description="Service Resource Manager Controller API",
+    author_email="dlaskaratos@intracom-telecom.com",
+    url="",
+    keywords=["Swagger", "service resource manager API"],
+    install_requires=REQUIRES,
+    packages=find_packages(),
+    package_data={'': ['swagger/swagger.yaml']},
+    include_package_data=True,
+    entry_points={
+        'console_scripts': ['swagger_server=swagger_server.__main__:main']},
+    long_description="""\
+    API exposed by π-edge for \&quot;PaaS &amp; Service Function\&quot; - based interaction with NFV MANO. 
+    """
+)
diff --git a/service-resource-manager-implementation/swagger_server/__init__.py b/service-resource-manager-implementation/swagger_server/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/__main__.py b/service-resource-manager-implementation/swagger_server/__main__.py
new file mode 100644
index 0000000000000000000000000000000000000000..27c08e62f53c2b8d12d99dbbe9a1c79bb9cd3455
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/__main__.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python3
+
+import connexion
+
+import logging
+import sys
+import os
+
+from swagger_server import encoder
+
+import urllib3
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+
+def main():
+    global driver
+    logging.basicConfig(level=logging.INFO)
+    app = connexion.App(__name__, specification_dir='./swagger/')
+    app.app.json_encoder = encoder.JSONEncoder
+    app.add_api('swagger.yaml', strict_validation=True, arguments={'title': 'Service Resource Manager API'}, pythonic_params=True)
+    app.run(port=8080)
+    
+
+if __name__ == '__main__':
+    main()
diff --git a/service-resource-manager-implementation/swagger_server/adapters/artifact/clients/skopeo/.gitkeep b/service-resource-manager-implementation/swagger_server/adapters/artifact/clients/skopeo/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/artifact/clients/skopeo/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/artifact/clients/skopeo/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/artifact/core/.gitkeep b/service-resource-manager-implementation/swagger_server/adapters/artifact/core/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/.env b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/.env
new file mode 100644
index 0000000000000000000000000000000000000000..8bcda46a98889d9c56cfbeb8de896ae6adb29d58
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/.env
@@ -0,0 +1,7 @@
+# #### Logging ####
+# LOG_LEVEL="debug"
+# LOG_FILE="edgecloud.log"
+
+#### EdgeCloud ####
+# EDGE_CLOUD="i2edge"
+EDGE_CLOUD_URL=http://192.168.123.86:30769
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/client.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/client.py
new file mode 100644
index 0000000000000000000000000000000000000000..2d47c44f930b382336b694d4d85c1b9ba907fd4a
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/client.py
@@ -0,0 +1,29 @@
+# Mocked API for testing purposes
+from typing import Dict, List, Optional
+from edgecloud.core.edgecloud_interface import EdgeCloudManagementInterface
+
+class EdgeApplicationManager(EdgeCloudManagementInterface):
+    def onboard_app(self, app_manifest: Dict) -> Dict:
+        print(f"Submitting application: {app_manifest}")
+        return {"appId": "1234-5678"}
+
+    def get_all_onboarded_apps(self) -> List[Dict]:
+        return [{"appId": "1234-5678", "name": "TestApp"}]
+
+    def get_onboarded_app(self, app_id: str) -> Dict:
+        return {"appId": app_id, "name": "TestApp"}
+
+    def delete_onboarded_app(self, app_id: str) -> None:
+        print(f"Deleting application: {app_id}")
+
+    def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+        return {"appInstanceId": "abcd-efgh"}
+
+    def get_all_deployed_apps(self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None) -> List[Dict]:
+        return [{"appInstanceId": "abcd-efgh", "status": "ready"}]
+
+    def undeploy_app(self, app_instance_id: str) -> None:
+        print(f"Deleting app instance: {app_instance_id}")
+
+    def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+        return [{"edgeCloudZoneId": "zone-1", "status": "active"}]
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/client.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/client.py
new file mode 100644
index 0000000000000000000000000000000000000000..2d47c44f930b382336b694d4d85c1b9ba907fd4a
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/client.py
@@ -0,0 +1,29 @@
+# Mocked API for testing purposes
+from typing import Dict, List, Optional
+from edgecloud.core.edgecloud_interface import EdgeCloudManagementInterface
+
+class EdgeApplicationManager(EdgeCloudManagementInterface):
+    def onboard_app(self, app_manifest: Dict) -> Dict:
+        print(f"Submitting application: {app_manifest}")
+        return {"appId": "1234-5678"}
+
+    def get_all_onboarded_apps(self) -> List[Dict]:
+        return [{"appId": "1234-5678", "name": "TestApp"}]
+
+    def get_onboarded_app(self, app_id: str) -> Dict:
+        return {"appId": app_id, "name": "TestApp"}
+
+    def delete_onboarded_app(self, app_id: str) -> None:
+        print(f"Deleting application: {app_id}")
+
+    def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+        return {"appInstanceId": "abcd-efgh"}
+
+    def get_all_deployed_apps(self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None) -> List[Dict]:
+        return [{"appInstanceId": "abcd-efgh", "status": "ready"}]
+
+    def undeploy_app(self, app_instance_id: str) -> None:
+        print(f"Deleting app instance: {app_instance_id}")
+
+    def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+        return [{"edgeCloudZoneId": "zone-1", "status": "active"}]
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/client.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/client.py
new file mode 100644
index 0000000000000000000000000000000000000000..2d47c44f930b382336b694d4d85c1b9ba907fd4a
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/client.py
@@ -0,0 +1,29 @@
+# Mocked API for testing purposes
+from typing import Dict, List, Optional
+from edgecloud.core.edgecloud_interface import EdgeCloudManagementInterface
+
+class EdgeApplicationManager(EdgeCloudManagementInterface):
+    def onboard_app(self, app_manifest: Dict) -> Dict:
+        print(f"Submitting application: {app_manifest}")
+        return {"appId": "1234-5678"}
+
+    def get_all_onboarded_apps(self) -> List[Dict]:
+        return [{"appId": "1234-5678", "name": "TestApp"}]
+
+    def get_onboarded_app(self, app_id: str) -> Dict:
+        return {"appId": app_id, "name": "TestApp"}
+
+    def delete_onboarded_app(self, app_id: str) -> None:
+        print(f"Deleting application: {app_id}")
+
+    def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+        return {"appInstanceId": "abcd-efgh"}
+
+    def get_all_deployed_apps(self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None) -> List[Dict]:
+        return [{"appInstanceId": "abcd-efgh", "status": "ready"}]
+
+    def undeploy_app(self, app_instance_id: str) -> None:
+        print(f"Deleting app instance: {app_instance_id}")
+
+    def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+        return [{"edgeCloudZoneId": "zone-1", "status": "active"}]
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/client.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/client.py
new file mode 100644
index 0000000000000000000000000000000000000000..2d47c44f930b382336b694d4d85c1b9ba907fd4a
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/client.py
@@ -0,0 +1,29 @@
+# Mocked API for testing purposes
+from typing import Dict, List, Optional
+from edgecloud.core.edgecloud_interface import EdgeCloudManagementInterface
+
+class EdgeApplicationManager(EdgeCloudManagementInterface):
+    def onboard_app(self, app_manifest: Dict) -> Dict:
+        print(f"Submitting application: {app_manifest}")
+        return {"appId": "1234-5678"}
+
+    def get_all_onboarded_apps(self) -> List[Dict]:
+        return [{"appId": "1234-5678", "name": "TestApp"}]
+
+    def get_onboarded_app(self, app_id: str) -> Dict:
+        return {"appId": app_id, "name": "TestApp"}
+
+    def delete_onboarded_app(self, app_id: str) -> None:
+        print(f"Deleting application: {app_id}")
+
+    def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+        return {"appInstanceId": "abcd-efgh"}
+
+    def get_all_deployed_apps(self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None) -> List[Dict]:
+        return [{"appInstanceId": "abcd-efgh", "status": "ready"}]
+
+    def undeploy_app(self, app_instance_id: str) -> None:
+        print(f"Deleting app instance: {app_instance_id}")
+
+    def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+        return [{"edgeCloudZoneId": "zone-1", "status": "active"}]
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/client.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/client.py
new file mode 100644
index 0000000000000000000000000000000000000000..d0f26a561d435e7bc30bf3c9ba5b478f72750200
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/client.py
@@ -0,0 +1,47 @@
+# Mocked API for testing purposes
+from typing import Dict, List, Optional
+import os
+import logging
+import requests
+from edgecloud.core.edgecloud_interface import EdgeCloudManagementInterface
+
+piedge_ip = os.environ['EDGE_CLOUD_ADAPTER']
+edge_cloud_provider = os.environ['PLATFORM_PROVIDER']
+
+class EdgeApplicationManager(EdgeCloudManagementInterface):
+    def onboard_app(self, app_manifest: Dict) -> Dict:
+        print(f"Submitting application: {app_manifest}")
+        return {"appId": "1234-5678"}
+
+    def get_all_onboarded_apps(self) -> List[Dict]:
+        return [{"appId": "1234-5678", "name": "TestApp"}]
+
+    def get_onboarded_app(self, app_id: str) -> Dict:
+        return {"appId": app_id, "name": "TestApp"}
+
+    def delete_onboarded_app(self, app_id: str) -> None:
+        print(f"Deleting application: {app_id}")
+
+    def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+        return {"appInstanceId": "abcd-efgh"}
+
+    def get_all_deployed_apps(self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None) -> List[Dict]:
+        return [{"appInstanceId": "abcd-efgh", "status": "ready"}]
+
+    def undeploy_app(self, app_instance_id: str) -> None:
+        print(f"Deleting app instance: {app_instance_id}")
+
+    def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+        logging.info('Contacting π-Edge...')
+        nodes_response = requests.get('http://'+piedge_ip+'/piedge-connector/2.0.0/node')
+        zone_list =[]
+        if nodes_response.status_code==200:
+            for node in nodes_response.json().get('nodes'):
+                zone = {}
+                zone['edgeCloudZoneId'] = node.get('uid')
+                zone['edgeCloudZoneName'] = node.get('name')
+                zone['edgeCloudZoneStatus'] = node.get('status')
+                zone['edgeCloudProvider'] = edge_cloud_provider
+                zone['edgeCloudRegion'] = node.get('location')
+                zone_list.append(zone)
+        return zone_list
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/edgecloud_interface.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/edgecloud_interface.py
new file mode 100644
index 0000000000000000000000000000000000000000..9e53723515701d9c262574d1ea1cf1dc0b9c2460
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/edgecloud_interface.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+##
+# Copyright 2025-present by Software Networks Area, i2CAT.
+# All rights reserved.
+#
+# This file is part of the Federation SDK
+# Unauthorized copying of this file, via any medium is strictly prohibited.
+#
+# Contributors:
+#   - Adrián Pino (adrian.pino@i2cat.net)
+##
+
+from abc import ABC, abstractmethod
+from typing import List, Dict, Optional
+
+class EdgeCloudManagementInterface(ABC):
+    """
+    Abstract Base Class for Edge Application Management.
+    """
+
+    @abstractmethod
+    def onboard_app(self, app_manifest: Dict) -> Dict:
+        """
+        Onboards an app, submitting application metadata to the Edge Cloud Provider.
+        
+        :param app_manifest: Application metadata in dictionary format.
+        :return: Dictionary containing created application details.
+        """
+        pass
+
+    @abstractmethod
+    def get_all_onboarded_apps(self) -> List[Dict]:
+        """
+        Retrieves a list of onboarded applications.
+        
+        :return: List of application metadata dictionaries.
+        """
+        pass
+
+    @abstractmethod
+    def get_onboarded_app(self, app_id: str) -> Dict:
+        """
+        Retrieves information of a specific onboarded application.
+        
+        :param app_id: Unique identifier of the application.
+        :return: Dictionary with application details.
+        """
+        pass
+
+    @abstractmethod
+    def delete_onboarded_app(self, app_id: str) -> None:
+        """
+        Deletes an application onboarded from the Edge Cloud Provider.
+        
+        :param app_id: Unique identifier of the application.
+        """
+        pass
+
+    @abstractmethod
+    def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+        """
+        Requests the instantiation of an application instance.
+        
+        :param app_id: Unique identifier of the application.
+        :param app_zones: List of Edge Cloud Zones where the app should be instantiated.
+        :return: Dictionary with instance details.
+        """
+        pass
+
+    @abstractmethod
+    def get_all_deployed_apps(
+        self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None
+    ) -> List[Dict]:
+        """
+        Retrieves information of application instances.
+
+        :param app_id: Filter by application ID.
+        :param app_instance_id: Filter by instance ID.
+        :param region: Filter by Edge Cloud region.
+        :return: List of application instance details.
+        """
+        pass
+
+    @abstractmethod
+    def undeploy_app(self, app_instance_id: str) -> None:
+        """
+        Terminates a specific application instance.
+
+        :param app_instance_id: Unique identifier of the application instance.
+        """
+        pass
+
+    @abstractmethod
+    def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+        """
+        Retrieves a list of available Edge Cloud Zones.
+
+        :param region: Filter by geographical region.
+        :param status: Filter by status (active, inactive, unknown).
+        :return: List of Edge Cloud Zones.
+        """
+        pass
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/schemas.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/schemas.py
new file mode 100644
index 0000000000000000000000000000000000000000..f87f5c14cbbd7d462ab7c5ed4f7b4b822d3254a4
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/schemas.py
@@ -0,0 +1 @@
+# TODO
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/doc/workflows/get_av_zones.md b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/doc/workflows/get_av_zones.md
new file mode 100644
index 0000000000000000000000000000000000000000..68cd9f76be6745ffa384b0570680c41796ca5d6e
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/doc/workflows/get_av_zones.md
@@ -0,0 +1,20 @@
+```mermaid
+sequenceDiagram
+title Retrieve Edge Cloud Zones
+actor AP as App Vertical Provider
+participant CE as Capabilities Exposure
+box Service Resource Manager
+    participant API
+    participant SDK as EdgeCloudSDK
+end
+participant i2Edge
+participant PiEdge
+
+note over AP,CE: CAMARA EdgeCloud API
+AP ->> CE: GET /edge-cloud-zones
+CE ->> API: GET /av. zones
+API ->> SDK: sdk.i2edge.get_zones()
+SDK ->> i2Edge: GET /zones/list
+API ->> SDK: sdk.piedge.get_zones()
+SDK ->> PiEdge: GET /nodes
+```
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/adapters/network/clients/oai/.gitkeep b/service-resource-manager-implementation/swagger_server/adapters/network/clients/oai/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/network/clients/oai/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/network/clients/oai/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/network/clients/open5gs/.gitkeep b/service-resource-manager-implementation/swagger_server/adapters/network/clients/open5gs/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/network/clients/open5gs/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/network/clients/open5gs/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/adapters/network/core/.gitkeep b/service-resource-manager-implementation/swagger_server/adapters/network/core/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/config.py b/service-resource-manager-implementation/swagger_server/config.py
new file mode 100644
index 0000000000000000000000000000000000000000..95c4fb10ba37c54d4361568c9c87b6b03a910de8
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/config.py
@@ -0,0 +1,13 @@
+from configparser import ConfigParser
+
+class Config:
+    __conf = None
+
+    def load_configuration():
+        global __conf
+        __conf = ConfigParser()
+        __conf.read('properties.conf')
+
+    def get(key: str):
+        global __conf
+        return __conf[key]
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/__init__.py b/service-resource-manager-implementation/swagger_server/controllers/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..0791ded1ffe6f67bc0eccc2f30c6312a48363ad5
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/__init__.py
@@ -0,0 +1,2 @@
+import urllib3
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/app_instance_controller.py b/service-resource-manager-implementation/swagger_server/controllers/app_instance_controller.py
new file mode 100644
index 0000000000000000000000000000000000000000..62f27f269507aabebffe7e5dcf0da94f695c0cca
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/app_instance_controller.py
@@ -0,0 +1,44 @@
+from os import environ
+import logging
+from swagger_server.adapters.kubernetes_adapter import submit_helm_chart, app_deploy
+import connexion
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.DEBUG)
+
+def deploy_app(helm_request_body=None):
+    '''
+    Retrieves the nodes of the edge cloud platform supported by the testbed
+    '''
+    logger.info('Submitting request to edge cloud transformation function')
+    if connexion.request.is_json:
+        helm_request_body = connexion.request.get_json()
+    else:
+        return 'Wrong request schema', 400
+    try:
+        if helm_request_body.get('uri') is None:
+            return 'Helm chart uri is missing', 400
+        if helm_request_body.get('deployment_name') is None:
+            return 'Helm chart deployment name is missing', 400
+        
+        helm_submit_response = submit_helm_chart(helm_request_body)
+        return helm_submit_response
+    except Exception as e:
+        logger.info(e)
+        return 'Error submitting helm chart: '+e.__cause__
+    
+def get_app_instances(body):
+    '''
+    Instantiates app on the edge cloud platform
+    '''
+    logger.info('Deploying app instance')
+    if connexion.request.is_json:
+        helm_request_body = connexion.request.get_json()
+    else:
+        return 'Wrong request schema', 400
+    try:
+        app_response = app_deploy(body)
+    except Exception as e:
+        logger.info(e)
+        return 'Error instantiating app: '+e.__cause__
+    
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/app_registration_controller.py b/service-resource-manager-implementation/swagger_server/controllers/app_registration_controller.py
new file mode 100644
index 0000000000000000000000000000000000000000..3447b163a4b6dbef39915421d6bfcbe9175499b2
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/app_registration_controller.py
@@ -0,0 +1,5 @@
+from os import environ
+import logging
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.DEBUG)
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/artifact_controller.py b/service-resource-manager-implementation/swagger_server/controllers/artifact_controller.py
new file mode 100644
index 0000000000000000000000000000000000000000..9e860814167949b2ecf9f10b381cc14d216942b3
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/artifact_controller.py
@@ -0,0 +1,38 @@
+import logging
+import json
+import connexion
+from swagger_server.models.copy_artifact_model import CopyArtifactModel
+from swagger_server.models.artifact_exists_model import ArtifactExistsModel
+from swagger_server.services import artifact_service
+
+def artifact_exists(body):
+    if connexion.request.is_json:
+        try:
+            artifact = ArtifactExistsModel.from_dict(body)
+            if artifact.registry_url is None:
+                return 'The registyr url must be provided', 400
+            if artifact.image_name is None:
+                return 'Image name must be provided', 400
+            response = artifact_service.artifact_exists(artifact)
+            return response
+        except Exception as e:
+            logging.error(e.args)
+            return e.args, 500
+    else:
+        return 'Request format must be JSON', 400
+
+def copy_artifact(body):
+    if connexion.request.is_json:
+        try:
+            artifact = CopyArtifactModel.from_dict(body)
+            if artifact.dst_registry is None or artifact.src_registry is None:
+                return 'The source and destination registries must be provided', 400
+            if artifact.src_image_name is None:
+                return 'The image name must be provided', 400
+            response = artifact_service.copy_artifact(artifact)
+            return response
+        except Exception as e:
+            logging.error(e.args)
+            return e.args
+    else:
+        return 'Request format must be JSON', 400
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/network_functions_controller.py b/service-resource-manager-implementation/swagger_server/controllers/network_functions_controller.py
new file mode 100644
index 0000000000000000000000000000000000000000..3447b163a4b6dbef39915421d6bfcbe9175499b2
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/network_functions_controller.py
@@ -0,0 +1,5 @@
+from os import environ
+import logging
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.DEBUG)
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/nodes_controller.py b/service-resource-manager-implementation/swagger_server/controllers/nodes_controller.py
new file mode 100644
index 0000000000000000000000000000000000000000..41c7630dbad80d0fc61d61ee16f7f61b17daba62
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/nodes_controller.py
@@ -0,0 +1,18 @@
+import logging
+from swagger_server.services import kubernetes_adapter
+
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.DEBUG)
+
+def get_edge_platform_nodes():
+    '''
+    Retrieves the nodes of the edge cloud platform supported by the testbed
+    '''
+    logger.info('Acquiring testbed nodes')
+    try:
+        nodes_list = kubernetes_adapter.get_nodes()
+        return nodes_list
+    except Exception as e:
+        logger.info(e)
+        return 'Error getting node list: '+e.args
diff --git a/service-resource-manager-implementation/swagger_server/core/__init__.py b/service-resource-manager-implementation/swagger_server/core/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/encoder.py b/service-resource-manager-implementation/swagger_server/encoder.py
new file mode 100644
index 0000000000000000000000000000000000000000..61ba4721961a65d38af5d5ce2948b0abe9c7aa58
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/encoder.py
@@ -0,0 +1,20 @@
+from connexion.apps.flask_app import FlaskJSONEncoder
+import six
+
+from swagger_server.models.base_model_ import Model
+
+
+class JSONEncoder(FlaskJSONEncoder):
+    include_nulls = False
+
+    def default(self, o):
+        if isinstance(o, Model):
+            dikt = {}
+            for attr, _ in six.iteritems(o.swagger_types):
+                value = getattr(o, attr)
+                if value is None and not self.include_nulls:
+                    continue
+                attr = o.attribute_map[attr]
+                dikt[attr] = value
+            return dikt
+        return FlaskJSONEncoder.default(self, o)
diff --git a/service-resource-manager-implementation/swagger_server/models/__init__.py b/service-resource-manager-implementation/swagger_server/models/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..9bba2f8f6f9ef323f93f74aa89817c89136214e7
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/models/__init__.py
@@ -0,0 +1,4 @@
+# coding: utf-8
+
+# flake8: noqa
+from __future__ import absolute_import
diff --git a/service-resource-manager-implementation/swagger_server/models/artifact_exists_model.py b/service-resource-manager-implementation/swagger_server/models/artifact_exists_model.py
new file mode 100644
index 0000000000000000000000000000000000000000..2ba0a1d3b279eeb83d436c6a2e21c20548095158
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/models/artifact_exists_model.py
@@ -0,0 +1,139 @@
+from __future__ import absolute_import
+from datetime import date, datetime  # noqa: F401
+from typing import List, Dict
+
+from swagger_server.models.base_model_ import Model
+from swagger_server import util
+
+class ArtifactExistsModel(Model):
+
+    def __init__(self, registry_url : str, image_name: str, image_tag: str=None, username: str=None, password: str=None):
+
+        self.swagger_types = {
+            'registry_url': str,
+            'image_name': str,
+            'image_tag': str,
+            'username': str,
+            'password': str
+        }
+
+        self.attribute_map = {
+            'registry_url': 'registry_url',
+            'image_name': 'image_name',
+            'image_tag': 'image_tag',
+            'username': 'username',
+            'password': 'password'
+        }
+        self._registry_url = registry_url
+        self._image_name = image_name
+        self._image_tag = image_tag
+        self._username = username
+        self._password = password
+
+
+    @classmethod
+    def from_dict(cls, dikt) -> 'ArtifactExistsModel':
+        """Returns the dict as a model
+
+        :param dikt: A dict.
+        :type: dict
+        :return: The CopyArtifactModel.  # noqa: E501
+        :rtype: CopyArtifactModel
+        """
+        return util.deserialize_model(dikt, cls)
+    
+    @property
+    def registry_url(self) -> str:
+        """Gets the registry_url of this ArtifactExistsModel.
+
+        :return: The registry_url of this ArtifactExistsModel.
+        :rtype: str
+        """
+        return self._registry_url
+
+    @registry_url.setter
+    def registry_url(self, registry_url: str):
+        """Sets the registry_url of this ArtifactExistsModel.
+
+        :param name: The registry_url of this ArtifactExistsModel.
+        :type name: str
+        """
+
+        self._registry_url = registry_url
+
+
+    @property
+    def image_name(self) -> str:
+        """Gets the image_name of this ArtifactExistsModel.
+
+        :return: The image_name of this ArtifactExistsModel.
+        :rtype: str
+        """
+        return self._image_name
+
+    @image_name.setter
+    def image_name(self, image_name: str):
+        """Sets the image_name of this ArtifactExistsModel.
+
+        :param name: The image_name of this ArtifactExistsModel.
+        :type name: str
+        """
+
+        self._image_name = image_name
+
+    @property
+    def image_tag(self) -> str:
+        """Gets the image_tag of this ArtifactExistsModel.
+
+        :return: The image_tag of this ArtifactExistsModel.
+        :rtype: str
+        """
+        return self._image_tag
+
+    @image_tag.setter
+    def image_tag(self, image_tag: str):
+        """Sets the image_tag of this ArtifactExistsModel.
+
+        :param name: The image_tag of this ArtifactExistsModel.
+        :type name: str
+        """
+
+        self._image_tag = image_tag
+
+    @property
+    def username(self) -> str:
+        """Gets the username of this ArtifactExistsModel.
+
+        :return: The username of this ArtifactExistsModel.
+        :rtype: str
+        """
+        return self._username
+
+    @username.setter
+    def username(self, username: str):
+        """Sets the username of this ArtifactExistsModel.
+
+        :param name: The username of this ArtifactExistsModel.
+        :type name: str
+        """
+
+        self._username = username
+
+    @property
+    def password(self) -> str:
+        """Gets the password of this ArtifactExistsModel.
+
+        :return: The password of this ArtifactExistsModel.
+        :rtype: str
+        """
+        return self._password
+
+    @password.setter
+    def password(self, password: str):
+        """Sets the password of this ArtifactExistsModel.
+
+        :param name: The password of this ArtifactExistsModel.
+        :type name: str
+        """
+
+        self._password = password   
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/models/base_model_.py b/service-resource-manager-implementation/swagger_server/models/base_model_.py
new file mode 100644
index 0000000000000000000000000000000000000000..97999c3d3237c287013b2139acb9858a52b454e8
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/models/base_model_.py
@@ -0,0 +1,69 @@
+import pprint
+
+import six
+import typing
+
+from swagger_server import util
+
+T = typing.TypeVar('T')
+
+
+class Model(object):
+    # swaggerTypes: The key is attribute name and the
+    # value is attribute type.
+    swagger_types = {}
+
+    # attributeMap: The key is attribute name and the
+    # value is json key in definition.
+    attribute_map = {}
+
+    @classmethod
+    def from_dict(cls: typing.Type[T], dikt) -> T:
+        """Returns the dict as a model"""
+        return util.deserialize_model(dikt, cls)
+
+    def to_dict(self):
+        """Returns the model properties as a dict
+
+        :rtype: dict
+        """
+        result = {}
+
+        for attr, _ in six.iteritems(self.swagger_types):
+            value = getattr(self, attr)
+            if isinstance(value, list):
+                result[attr] = list(map(
+                    lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
+                    value
+                ))
+            elif hasattr(value, "to_dict"):
+                result[attr] = value.to_dict()
+            elif isinstance(value, dict):
+                result[attr] = dict(map(
+                    lambda item: (item[0], item[1].to_dict())
+                    if hasattr(item[1], "to_dict") else item,
+                    value.items()
+                ))
+            else:
+                result[attr] = value
+
+        return result
+
+    def to_str(self):
+        """Returns the string representation of the model
+
+        :rtype: str
+        """
+        return pprint.pformat(self.to_dict())
+
+    def __repr__(self):
+        """For `print` and `pprint`"""
+        return self.to_str()
+
+    def __eq__(self, other):
+        """Returns true if both objects are equal"""
+        return self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        """Returns true if both objects are not equal"""
+        return not self == other
diff --git a/service-resource-manager-implementation/swagger_server/models/copy_artifact_model.py b/service-resource-manager-implementation/swagger_server/models/copy_artifact_model.py
new file mode 100644
index 0000000000000000000000000000000000000000..df407084164f68eb7a364a1a52c0807b92a565f2
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/models/copy_artifact_model.py
@@ -0,0 +1,250 @@
+from __future__ import absolute_import
+from datetime import date, datetime  # noqa: F401
+from typing import List, Dict
+
+from swagger_server.models.base_model_ import Model
+from swagger_server import util
+
+class CopyArtifactModel(Model):
+
+    def __init__(self, src_registry: str, src_image_name: str, src_image_tag: str, dst_registry: str, dst_image_name: str=None, dst_image_tag: str=None, src_username: str=None, 
+                 src_password: str=None, dst_username:str=None, dst_password: str=None):
+
+        self.swagger_types = {
+            'src_registry': str,
+            'src_image_name': str,
+            'src_image_tag': str,
+            'dst_registry': str,
+            'dst_image_name': str,
+            'dst_image_tag': str,
+            'src_username': str,
+            'src_password': str,
+            'dst_username': str,
+            'dst_password': str
+        }
+
+        self.attribute_map = {
+            'src_registry': 'src_registry',
+            'src_image_name': 'src_image_name',
+            'src_image_tag': 'src_image_tag',
+            'dst_registry': 'dst_registry',
+            'dst_image_name': 'dst_image_name',
+            'dst_image_tag': 'dst_image_tag',
+            'src_username': 'src_username',
+            'src_password': 'src_password',
+            'dst_username': 'dst_username',
+            'dst_password': 'dst_password'
+        }
+        self._src_registry = src_registry
+        self._src_image_name = src_image_name
+        self._src_image_tag = src_image_tag
+        self._dst_registry = dst_registry
+        self._dst_image_name = dst_image_name
+        self._dst_image_tag = dst_image_tag
+        self._src_username=src_username
+        self._src_password=src_password
+        self._dst_username=dst_username
+        self._dst_password=dst_password
+
+    @classmethod
+    def from_dict(cls, dikt) -> 'CopyArtifactModel':
+        """Returns the dict as a model
+
+        :param dikt: A dict.
+        :type: dict
+        :return: The CopyArtifactModel.  # noqa: E501
+        :rtype: CopyArtifactModel
+        """
+        return util.deserialize_model(dikt, cls)
+    
+    @property
+    def src_registry(self) -> str:
+        """Gets the src_registry of this CopyArtifactModel.
+
+        :return: The src_registry of this CopyArtifactModel.
+        :rtype: str
+        """
+        return self._src_registry
+
+    @src_registry.setter
+    def src_registry(self, src_registry: str):
+        """Sets the src_registry of this CopyArtifactModel.
+
+        :param name: The src_registry of this CopyArtifactModel.
+        :type name: str
+        """
+
+        self._src_registry = src_registry
+
+
+    @property
+    def src_image_name(self) -> str:
+        """Gets the _src_image_name of this CopyArtifactModel.
+
+        :return: The _src_image_name of this CopyArtifactModel.
+        :rtype: str
+        """
+        return self._src_image_name
+
+    @src_image_name.setter
+    def src_image_name(self, src_image_name: str):
+        """Sets the src_image_name of this CopyArtifactModel.
+
+        :param name: The src_image_name of this CopyArtifactModel.
+        :type name: str
+        """
+
+        self._src_image_name = src_image_name
+
+    @property
+    def src_image_tag(self) -> str:
+        """Gets the src_image_tag of this CopyArtifactModel.
+
+        :return: The src_image_tag of this CopyArtifactModel.
+        :rtype: str
+        """
+        return self._src_image_tag
+
+    @src_image_tag.setter
+    def src_image_tag(self, src_image_tag: str):
+        """Sets the src_image_tag of this CopyArtifactModel.
+
+        :param name: The src_image_tag of this CopyArtifactModel.
+        :type name: str
+        """
+
+        self._src_image_tag = src_image_tag
+
+    @property
+    def dst_registry(self) -> str:
+        """Gets the dst_registry of this CopyArtifactModel.
+
+        :return: The dst_registry of this CopyArtifactModel.
+        :rtype: str
+        """
+        return self._dst_registry
+
+    @dst_registry.setter
+    def dst_registry(self, dst_registry: str):
+        """Sets the dst_registry of this CopyArtifactModel.
+
+        :param name: The dst_registry of this CopyArtifactModel.
+        :type name: str
+        """
+
+        self._dst_registry = dst_registry
+
+    @property
+    def dst_image_name(self) -> str:
+        """Gets the dst_image_name of this CopyArtifactModel.
+
+        :return: The dst_image_name of this CopyArtifactModel.
+        :rtype: str
+        """
+        return self._dst_image_name
+
+    @dst_image_name.setter
+    def dst_image_name(self, dst_image_name: str):
+        """Sets the dst_image_name of this CopyArtifactModel.
+
+        :param name: The dst_image_name of this CopyArtifactModel.
+        :type name: str
+        """
+
+        self._dst_image_name = dst_image_name
+
+
+    @property
+    def dst_image_tag(self) -> str:
+        """Gets the dst_image_tag of this CopyArtifactModel.
+
+        :return: The dst_image_tag of this CopyArtifactModel.
+        :rtype: str
+        """
+        return self._dst_image_tag
+
+    @dst_image_tag.setter
+    def dst_image_tag(self, dst_image_tag: str):
+        """Sets the dst_image_tag of this CopyArtifactModel.
+
+        :param name: The dst_image_tag of this CopyArtifactModel.
+        :type name: str
+        """
+
+        self._dst_image_tag = dst_image_tag
+
+    @property
+    def src_username(self) -> str:
+        """Gets the src_username of this CopyArtifactModel.
+
+        :return: The src_username of this CopyArtifactModel.
+        :rtype: str
+        """
+        return self._src_username
+
+    @src_username.setter
+    def src_username(self, src_username: str):
+        """Sets the src_username of this CopyArtifactModel.
+
+        :param name: The src_username of this CopyArtifactModel.
+        :type name: str
+        """
+
+        self._src_username = src_username
+
+    @property
+    def src_password(self) -> str:
+        """Gets the src_password of this CopyArtifactModel.
+
+        :return: The src_password of this CopyArtifactModel.
+        :rtype: str
+        """
+        return self._src_password
+
+    @src_password.setter
+    def src_password(self, src_password: str):
+        """Sets the src_password of this CopyArtifactModel.
+
+        :param name: The src_password of this CopyArtifactModel.
+        :type name: str
+        """
+
+        self._src_password = src_password
+
+    @property
+    def dst_username(self) -> str:
+        """Gets the dst_username of this CopyArtifactModel.
+
+        :return: The dst_username of this CopyArtifactModel.
+        :rtype: str
+        """
+        return self._dst_username
+
+    @dst_username.setter
+    def dst_username(self, dst_username: str):
+        """Sets the dst_username of this CopyArtifactModel.
+
+        :param name: The dst_username of this CopyArtifactModel.
+        :type name: str
+        """
+
+        self._dst_username = dst_username
+
+    @property
+    def dst_password(self) -> str:
+        """Gets the dst_password of this CopyArtifactModel.
+
+        :return: The dst_password of this CopyArtifactModel.
+        :rtype: str
+        """
+        return self._dst_password
+
+    @dst_password.setter
+    def dst_password(self, dst_password: str):
+        """Sets the dst_password of this CopyArtifactModel.
+
+        :param name: The dst_password of this CopyArtifactModel.
+        :type name: str
+        """
+
+        self._dst_password = dst_password    
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/properties.conf b/service-resource-manager-implementation/swagger_server/properties.conf
new file mode 100644
index 0000000000000000000000000000000000000000..cf9e4dc217f2010ee8def3a1d6775ec8081f6eaa
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/properties.conf
@@ -0,0 +1,5 @@
+driver=docker
+
+#docker
+DOCKER_HOST=146.124.106.177
+DOCKER_PORT=2377
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/services/artifact_service.py b/service-resource-manager-implementation/swagger_server/services/artifact_service.py
new file mode 100644
index 0000000000000000000000000000000000000000..406dbbff677f914c2ec5c184bff8f2a304c25ecc
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/services/artifact_service.py
@@ -0,0 +1,20 @@
+import logging
+import requests
+import os
+import json
+
+artifact_manager_ip = os.environ['ARTIFACT_MANAGER_ADDRESS']
+
+def artifact_exists(body):
+    logging.info('Contacting Artifact Manager')
+    body = json.dumps(body)
+    headers = {'Content-Type': 'application/json'}
+    response = requests.post('http://'+artifact_manager_ip+'/artefact-exists/', headers=headers, json=body)
+    return response
+
+def copy_artifact(body):
+    logging.info('Submitting artifact to Artifact Manager')
+    body = json.dumps(body)
+    headers = {'Content-Type': 'application/json'}
+    response = requests.post('http://'+artifact_manager_ip+'/copy-artefact', headers=headers, json=body)
+    return response
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/services/edge_cloud_service.py b/service-resource-manager-implementation/swagger_server/services/edge_cloud_service.py
new file mode 100644
index 0000000000000000000000000000000000000000..75d01cec1f4dcaec05846df4b5e48d514e16f0b3
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/services/edge_cloud_service.py
@@ -0,0 +1,58 @@
+from __future__ import absolute_import
+import logging
+from os import environ
+import requests
+import json
+from adapters.edgecloud.clients import aeros, i2edge, eurecom_platform, piedge, isi_platform
+
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.DEBUG)
+
+adapter_name = environ['ADAPTER_NAME']
+adapter_ip = environ['K8S_ADAPTER_ADDRESS']
+edge_cloud_provider = environ['PLATFORM_PROVIDER']
+adapter = None
+
+if adapter_name=='aeros':
+     from adapters.edgecloud.clients.aeros.client import EdgeApplicationManager
+     adapter = EdgeApplicationManager()
+elif adapter_name=='i2edge':
+     from adapters.edgecloud.clients.i2edge.client import EdgeApplicationManager
+     adapter = EdgeApplicationManager()
+elif adapter_name=='eurecom_platform':
+     from adapters.edgecloud.clients.eurecom_platform.client import EdgeApplicationManager
+     adapter = EdgeApplicationManager()
+elif adapter_name=='piedge':
+     from adapters.edgecloud.clients.piedge.client import EdgeApplicationManager
+     adapter = EdgeApplicationManager()
+
+
+def get_nodes():
+    zone_list = None
+    return zone_list
+
+def submit_helm_chart(body):
+     logger.info('Contacting Kubernetes adapter at '+adapter_ip)
+     headers = {'Content-type': 'application/json'}
+     data = json.dumps(body)
+     helm_response = requests.post('http://'+adapter_ip+'/piedge-connector/2.0.0/helm', data=data, headers=headers)
+     return helm_response
+
+# def app_instance_deploy(body):
+#      logger.info('Contacting Kubernetes adapter at '+adapter_ip)
+#      headers = {'Content-type': 'application/json'}
+#      data = json.dumps(body)
+#      app_response = requests.post('http://'+adapter_ip+'/piedge-connector/2.0.0/deployedServiceFunction', json=body)
+#      return app_response
+
+def app_instance_info(id: str):
+     logger.info('Contacting Kubernetes adapter at '+adapter_ip)
+     headers = {'Content-type': 'application/json'}
+     app_info_response = requests.get('http://'+adapter_ip+'/piedge-connector/2.0.0/deployedServiceFunction/'+id)
+     return app_info_response
+
+def delete_app_instance(id: str):
+     logger.info('Deleting app with instance id: ['+id+']')
+     delete_app_response = requests.delete('http://'+adapter_ip+'/piedge-connector/2.0.0/deployedServiceFunction/'+id)
+     return delete_app_response
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/services/network_function_service.py b/service-resource-manager-implementation/swagger_server/services/network_function_service.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/swagger/swagger.yaml b/service-resource-manager-implementation/swagger_server/swagger/swagger.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..cf3339401a67a1d211045f7d7d74ac6ead5ee3cc
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/swagger/swagger.yaml
@@ -0,0 +1,159 @@
+openapi: 3.0.0
+info:
+  title: Service Resource Manager
+  description: |
+    API exposed by SRM for testbed resource acquisition
+  termsOfService: http://swagger.io/terms/
+  contact:
+    email: dlaskaratos@intracom-telecom.com
+  license:
+    name: Apache 2.0
+    url: http://www.apache.org/licenses/LICENSE-2.0.html
+  version: 2.0.0
+externalDocs:
+  description: Find out more about Swagger
+  url: http://swagger.io
+servers:
+- url: http://virtualserver:8080/0.0.1
+paths:
+  /edge-nodes:
+    get:
+      tags:
+      - Availability zones
+      summary: Retrieve Edge Platform nodes
+      operationId: get_edge_platform_nodes
+      responses:
+        "200":
+          description: List of nodes
+      x-openapi-router-controller: swagger_server.controllers.nodes_controller
+  /appinstances:
+    post:
+       tags:
+       - App Instances
+       summary: Installs a helm chart on the edge cloud platform
+       operationId: deploy_app
+       requestBody:
+        description: Request to install a helm chart
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/HelmChartInstall'
+       responses:
+         "200":
+           description: Helm chart sucessfully installed
+         "400":
+           description: Necessary fields missing
+       x-openapi-router-controller: swagger_server.controllers.app_instance_controller
+    get:
+      tags:
+      - App Instances
+      summary: Instantiates an application specification
+      operationId: get_app_instances
+      responses:
+         "200":
+           description: App instances successfully retrieved
+      x-openapi-router-controller: swagger_server.controllers.app_instance_controller
+  /copy-artifact:
+    post:
+      tags:
+      - Artifact Management
+      summary: Copies artifact from source repository to destination repository
+      requestBody:
+        description: Artifact details including image name, tag, source repository username and password tec
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/CopyArtifactModel'
+      responses:
+        "200":
+          description: Artifact successfully copied
+        "400":
+          description: Mandatory fields missing
+      x-openapi-router-controller: swagger_server.controllers.artifact_controller
+  /artifact-exists:
+    post:
+      tags:
+      - Artifact Management
+      summary: Check if artifact exists in given repository
+      requestBody:
+        description: Artifact details including image name, tag, source repository username and password tec
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ArtifactExistsModel'
+      responses:
+        "200":
+          description: Artifact exists
+        "404":
+          description: Artifact does not exist
+        "400":
+          description: Mandatory fields missing        
+      x-openapi-router-controller: swagger_server.controllers.artifact_controller        
+components:
+  schemas:
+    HelmChartInstall:
+      type: object
+      properties:
+        uri:
+          type: string
+          example: http://helm.chart.net/helm.yaml
+        deployment_name:
+          type: string
+          example: test_helm
+        repo_username:
+          type: string
+          example: test1
+        repo_password:
+          type: string
+          example: test1
+    CopyArtifactModel:
+      type: object
+      properties:
+        src_registry:
+          type: string
+          example: http://dockerhub.io
+        src_image_name:
+          type: string
+          example: mongodb
+        src_image_tag:
+          type: string
+          example: latest
+        dst_registry:
+          type: string
+          example: http://dockerhub.io
+        dst_image_name:
+          type: string
+          example: mongodb
+        dst_image_tag:
+          type: string
+          example: latest
+        src_username:
+          type: string
+          example: user123
+        src_password:
+          type: string
+          example: 1234
+        dst_username:
+          type: string
+          example: user123 
+        dst_password:
+          type: string
+          example: 1234
+    ArtifactExistsModel:
+      type: object
+      properties:
+        registry_url:
+          type: string
+          example: http://dockerhub.io
+        image_name:
+          type: string
+          example: mongodb
+        image_tag:
+          type: string
+          example: latest
+        username:
+          type: string
+          example: user123
+        password:
+          type: string
+          example: 1234      
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/type_util.py b/service-resource-manager-implementation/swagger_server/type_util.py
new file mode 100644
index 0000000000000000000000000000000000000000..0563f81fd5345282a33705038dfa77fdcaa15872
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/type_util.py
@@ -0,0 +1,32 @@
+# coding: utf-8
+
+import sys
+
+if sys.version_info < (3, 7):
+    import typing
+
+    def is_generic(klass):
+        """ Determine whether klass is a generic class """
+        return type(klass) == typing.GenericMeta
+
+    def is_dict(klass):
+        """ Determine whether klass is a Dict """
+        return klass.__extra__ == dict
+
+    def is_list(klass):
+        """ Determine whether klass is a List """
+        return klass.__extra__ == list
+
+else:
+
+    def is_generic(klass):
+        """ Determine whether klass is a generic class """
+        return hasattr(klass, '__origin__')
+
+    def is_dict(klass):
+        """ Determine whether klass is a Dict """
+        return klass.__origin__ == dict
+
+    def is_list(klass):
+        """ Determine whether klass is a List """
+        return klass.__origin__ == list
diff --git a/service-resource-manager-implementation/swagger_server/util.py b/service-resource-manager-implementation/swagger_server/util.py
new file mode 100644
index 0000000000000000000000000000000000000000..812b2ad42f97ee1790ea2019c90710bc4dada114
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/util.py
@@ -0,0 +1,142 @@
+import datetime
+
+import six
+import typing
+from swagger_server import type_util
+
+
+def _deserialize(data, klass):
+    """Deserializes dict, list, str into an object.
+
+    :param data: dict, list or str.
+    :param klass: class literal, or string of class name.
+
+    :return: object.
+    """
+    if data is None:
+        return None
+
+    if klass in six.integer_types or klass in (float, str, bool, bytearray):
+        return _deserialize_primitive(data, klass)
+    elif klass == object:
+        return _deserialize_object(data)
+    elif klass == datetime.date:
+        return deserialize_date(data)
+    elif klass == datetime.datetime:
+        return deserialize_datetime(data)
+    elif type_util.is_generic(klass):
+        if type_util.is_list(klass):
+            return _deserialize_list(data, klass.__args__[0])
+        if type_util.is_dict(klass):
+            return _deserialize_dict(data, klass.__args__[1])
+    else:
+        return deserialize_model(data, klass)
+
+
+def _deserialize_primitive(data, klass):
+    """Deserializes to primitive type.
+
+    :param data: data to deserialize.
+    :param klass: class literal.
+
+    :return: int, long, float, str, bool.
+    :rtype: int | long | float | str | bool
+    """
+    try:
+        value = klass(data)
+    except UnicodeEncodeError:
+        value = six.u(data)
+    except TypeError:
+        value = data
+    return value
+
+
+def _deserialize_object(value):
+    """Return an original value.
+
+    :return: object.
+    """
+    return value
+
+
+def deserialize_date(string):
+    """Deserializes string to date.
+
+    :param string: str.
+    :type string: str
+    :return: date.
+    :rtype: date
+    """
+    try:
+        from dateutil.parser import parse
+        return parse(string).date()
+    except ImportError:
+        return string
+
+
+def deserialize_datetime(string):
+    """Deserializes string to datetime.
+
+    The string should be in iso8601 datetime format.
+
+    :param string: str.
+    :type string: str
+    :return: datetime.
+    :rtype: datetime
+    """
+    try:
+        from dateutil.parser import parse
+        return parse(string)
+    except ImportError:
+        return string
+
+
+def deserialize_model(data, klass):
+    """Deserializes list or dict to model.
+
+    :param data: dict, list.
+    :type data: dict | list
+    :param klass: class literal.
+    :return: model object.
+    """
+    instance = klass()
+
+    if not instance.swagger_types:
+        return data
+
+    for attr, attr_type in six.iteritems(instance.swagger_types):
+        if data is not None \
+                and instance.attribute_map[attr] in data \
+                and isinstance(data, (list, dict)):
+            value = data[instance.attribute_map[attr]]
+            setattr(instance, attr, _deserialize(value, attr_type))
+
+    return instance
+
+
+def _deserialize_list(data, boxed_type):
+    """Deserializes a list and its elements.
+
+    :param data: list to deserialize.
+    :type data: list
+    :param boxed_type: class literal.
+
+    :return: deserialized list.
+    :rtype: list
+    """
+    return [_deserialize(sub_data, boxed_type)
+            for sub_data in data]
+
+
+def _deserialize_dict(data, boxed_type):
+    """Deserializes a dict and its elements.
+
+    :param data: dict to deserialize.
+    :type data: dict
+    :param boxed_type: class literal.
+
+    :return: deserialized dict.
+    :rtype: dict
+    """
+    return {k: _deserialize(v, boxed_type)
+            for k, v in six.iteritems(data)}
diff --git a/service-resource-manager-implementation/swagger_server/utils/__init__.py b/service-resource-manager-implementation/swagger_server/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/swagger_server/utils/connector_db.py b/service-resource-manager-implementation/swagger_server/utils/connector_db.py
new file mode 100644
index 0000000000000000000000000000000000000000..a500a41a0095bd4f5e42c1abe7fb678af3f56c7c
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/utils/connector_db.py
@@ -0,0 +1,172 @@
+import json
+import string
+
+import yaml
+import pymongo
+import logging
+from bson import json_util
+from typing import List
+
+from os import environ
+
+storage_url=environ.get("EMP_STORAGE_URI").strip()
+
+mydb_mongo='pi-edge'
+
+def insert_document_k8s_platform(document=None, _id=None):
+    collection = "kubernetes_platforms"
+    myclient = pymongo.MongoClient(storage_url)
+    mydbmongo = myclient[mydb_mongo]
+    mycol = mydbmongo[collection]
+
+    myquery = {"name": document["kubernetes_platform_name"]}
+    mydoc = mycol.find_one(myquery)
+    # keeps the last record (contains registrationStatus)
+    if mydoc is not None:
+        raise Exception("Already Registered: Platform name", document["kubernetes_platform_name"])
+    try:
+        insert_doc={}
+        insert_doc["name"]=document["kubernetes_platform_name"]
+        insert_doc["auth_credentials"]=document["kubernetes_auth_credentials"]
+        mycol.insert_one(insert_doc)
+    except Exception as ce_:
+        raise Exception("An exception occurred :", ce_)
+
+def insert_document_deployed_service_function(document=None, _id=None):
+
+    collection = "deployed_service_functions"
+    myclient = pymongo.MongoClient(storage_url)
+    mydbmongo = myclient[mydb_mongo]
+    mycol = mydbmongo[collection]
+
+    myquery = {"name": document["service_function_name"], "location": document["location"], "instance_name":document["instance_name"]}
+    mydoc = mycol.find_one(myquery)
+    # keeps the last record (contains registrationStatus)
+    if mydoc is not None:
+        return "Requested service function (with this name) already deployed and exists in deployed_apps database"
+        #raise Exception("Already Registered: PaaS name", document["paas_name"])
+    try:
+        insert_doc = {}
+
+        insert_doc["name"] = document["service_function_name"]
+        #insert_doc["type"] = document["paas_type"]
+        insert_doc["location"] = document["location"]
+        insert_doc["instance_name"] = document["instance_name"]
+
+        # if "env_parameters" in document:
+        #     insert_doc["env_parameters"] = document["env_parameters"]
+
+        mycol.insert_one(insert_doc)
+        return "Deployed service function registered successfully"
+    except Exception as ce_:
+        raise Exception("An exception occurred :", ce_)
+
+
+def delete_document_deployed_service_functions(document=None, _id=None):
+    collection = "deployed_service_functions"
+    myclient = pymongo.MongoClient(storage_url)
+    mydbmongo = myclient[mydb_mongo]
+    mycol = mydbmongo[collection]
+
+    myquery = {"instance_name": document["instance_name"]}
+    mydoc = mycol.find_one(myquery)
+
+    # keeps the last record (contains registrationStatus)
+    if mydoc is None:
+        return "Deployed Service function not found in the database"
+        #raise Exception("Not found: PaaS name", document["paas_name"])
+    try:
+        delete_doc = {}
+        delete_doc["instance_name"] = document["instance_name"]
+        mycol.delete_one(delete_doc)
+        return "Deployed Service function deleted successfully"
+    except Exception as ce_:
+        raise Exception("An exception occurred :", ce_)
+
+
+def insert_document_service_function(document=None, _id=None):
+    #print(document)
+    collection = "service_functions"
+    myclient = pymongo.MongoClient(storage_url)
+    mydbmongo = myclient[mydb_mongo]
+    mycol = mydbmongo[collection]
+
+    myquery = {"name": document["service_function_name"]}
+    mydoc = mycol.find_one(myquery)
+
+    if mydoc is not None:
+        return "Service function already exists in the catalogue"
+ 
+    insert_doc = {}
+    insert_doc["name"] = document["service_function_name"]
+    insert_doc["type"] = document["service_function_type"]
+    insert_doc["image"] = document["service_function_image"]
+    insert_doc["application_ports"] = document["application_ports"]
+
+    if "required_volumes" in document:
+        insert_doc["required_volumes"] = document["required_volumes"]
+
+    insert_doc["required_env_parameters"] = document["required_env_parameters"]
+    mycol.insert_one(insert_doc)
+    return "Service function registered successfully"
+
+
+def insert_document_paas(document=None, _id=None):
+
+    collection = "paas_services"
+    myclient = pymongo.MongoClient(storage_url)
+    mydbmongo = myclient[mydb_mongo]
+    mycol = mydbmongo[collection]
+
+    myquery = {"name": document["name"]}
+    mydoc = mycol.find_one(myquery)
+
+    if mydoc is not None:
+        return "PaaS Service already exists in the catalogue"
+    try:
+        mycol.insert_one(document)
+        return "PaaS Service registered successfully"
+    except Exception as ce_:
+        raise Exception("An exception occurred :", ce_)
+
+def delete_document_service_function(service_function_input_name=None, _id=None):
+
+
+    collection = "service_functions"
+    myclient = pymongo.MongoClient(storage_url)
+    mydbmongo = myclient[mydb_mongo]
+    mycol = mydbmongo[collection]
+
+    myquery = {"name": service_function_input_name}
+    mydoc = mycol.find_one(myquery)
+
+    if mydoc is None:
+        return "Service function not found in the database"
+    try:
+        delete_doc = {}
+        delete_doc["name"] = service_function_input_name
+        mycol.delete_one(delete_doc)
+        return "Service function deregistered successfully"
+    except Exception as ce_:
+        raise Exception("An exception occurred :", ce_)
+
+def get_documents_from_collection(collection_input, input_type=None, input_value=None) -> List[dict]:
+    collection = collection_input
+    myclient = pymongo.MongoClient(storage_url)
+    mydbmongo = myclient[mydb_mongo]
+    mycol = mydbmongo[collection]
+
+    try:
+        mydoc_=[]
+        for x in mycol.find():
+            x['_id']=str(x['_id'])
+            if input_type is not None:
+                if input_value==x[input_type]:
+                    mydoc_.append(x)
+                    break
+            else:
+                mydoc_.append(x)
+
+        return mydoc_
+    except Exception as ce_:
+        raise Exception("An exception occurred :", ce_)
diff --git a/service-resource-manager-implementation/test b/service-resource-manager-implementation/test
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/service-resource-manager-implementation/tox.ini b/service-resource-manager-implementation/tox.ini
new file mode 100644
index 0000000000000000000000000000000000000000..41ab7b03711746e45f4066e37508db2418ac1e5f
--- /dev/null
+++ b/service-resource-manager-implementation/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = py35
+
+[testenv]
+deps=-r{toxinidir}/requirements.txt
+     -r{toxinidir}/test-requirements.txt
+changedir = tests
+
+;
+;commands=
+;   nosetests \
+;      []
+
+
+commands=
+    nosetests \
+    []
\ No newline at end of file
diff --git a/srm-deployment.yaml b/srm-deployment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d2c968226db5f2ff874ca451e31ca7cb69ef19cf
--- /dev/null
+++ b/srm-deployment.yaml
@@ -0,0 +1,181 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: piedgecontroller
+  name: piedgecontroller
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: piedgecontroller
+  strategy: {}
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.0 (40646f47)
+      creationTimestamp: null
+      labels:
+        #io.kompose.network/netEMPkub: "true"
+        io.kompose.service: piedgecontroller
+    spec:
+      containers:
+        - env:
+            - name: KUBERNETES_MASTER_HOSTNAME
+              value: "sunrise6gsrv"
+            - name: KUBERNETES_MASTER_PASSWORD
+              value: "dLask"
+            - name: KUBERNETES_MASTER_IP
+              value: "146.124.106.229"
+            - name: KUBERNETES_MASTER_PORT
+              value: "16443"  
+            - name: KUBE_CONFIG_PATH  
+              value: "kubeconfig/config.yaml"
+            - name: EMP_STORAGE_URI
+              value: mongodb://mongopiedge:27017
+            - name: KUBERNETES_MASTER_TOKEN
+              value: TVVGV1FJb3l0alNUOUdEeVRvbnZKdGhZS3FXUXg2aG5mMGVxekRqRnZhWT0K
+            - name: MONITORING_SERVICE_PASSWORD
+              value: "tandem"
+            - name: MEC_PLATFORM_IP
+              value: "146.124.106.209"
+            - name: MEC_PLATFORM_PORT
+              value: "32500"
+            - name: MONITORING_IP_PROXY
+              value: "146.124.106.220"
+            - name: MONITORING_PORT_PROXY
+              value: "31000"
+            - name: MONITORING_IP
+              value: "146.124.106.209"
+            - name: MONITORING_NODE_PORT
+              value: "443"
+            - name: DRIVER
+              value: "kubernetes"
+            - name: ARTIFACT_MANAGER_ADDRESS
+              value: "artifact-manager"            
+
+          image: piedge/pi_edge:ectf
+          name: piedgecontroller
+          ports:
+            - containerPort: 8080
+          resources: {}
+          imagePullPolicy: Always
+      restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: piedgecontroller
+  name: piedgecontroller
+spec:
+  type: NodePort
+  ports:
+    - name: "8080"
+      nodePort: 32415
+      port: 8080
+      targetPort: 8080
+  selector:
+    io.kompose.service: piedgecontroller
+status:
+  loadBalancer: {}
+
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: service-resource-manager
+  name: service-resource-manager
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: service-resource-manager
+  strategy: {}
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.0 (40646f47)
+      creationTimestamp: null
+      labels:
+        #io.kompose.network/netEMPkub: "true"
+        io.kompose.service: service-resource-manager
+    spec:
+      containers:
+        - env:
+            - name: K8S_ADAPTER_ADDRESS
+              value: "piedgecontroller:8080"
+            - name: PLATFORM_PROVIDER
+              value: "ICOM"
+
+          image: piedge/pi_edge:srm
+          name: service-resource-manager
+          ports:
+            - containerPort: 8080
+          resources: {}
+          imagePullPolicy: Always
+      restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.0 (40646f47)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: service-resource-manager
+  name: srm
+spec:
+  type: NodePort
+  ports:
+    - name: "8080"
+      nodePort: 32000
+      port: 8080
+      targetPort: 8080
+  selector:
+    io.kompose.service: service-resource-manager
+status:
+  loadBalancer: {}
+---
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: srm-ingress
+  namespace: sunrise
+  annotations:
+    #nginx.ingress.kubernetes.io/use-regex: "true"
+    nginx.ingress.kubernetes.io/rewrite-target: /$2
+  managedFields:
+      - manager: nginx-ingress-controller
+        operation: Update
+        apiVersion: networking.k8s.io/v1
+spec:
+    ingressClassName: nginx
+    rules:
+    - http:
+        paths:
+        - path: /srm(/|$)(.*)
+          pathType: Prefix
+          backend:
+            service:
+              name: srm
+              port:
+                number: 8080
\ No newline at end of file